-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpopup.js
More file actions
125 lines (107 loc) · 5.11 KB
/
popup.js
File metadata and controls
125 lines (107 loc) · 5.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
let viewDate = new Date();
let currentDay = new Date().getDate();
let timerInterval;
function getLocalDay(dateObj) {
const offset = dateObj.getTimezoneOffset() * 60000;
return new Date(dateObj - offset).toISOString().split('T')[0];
}
function makeDateStr(y, m, d) {
return `${y}-${String(m + 1).padStart(2, '0')}-${String(d).padStart(2, '0')}`;
}
function formatToHHMM(totalHours) {
const totalMinutes = Math.round(totalHours * 60);
const h = Math.floor(totalMinutes / 60);
const m = totalMinutes % 60;
return h === 0 ? `${m}m` : `${h}:${String(m).padStart(2, '0')}`;
}
function filterLogs(logs) {
const now = new Date();
const oneYearAgo = new Date().setFullYear(now.getFullYear() - 1);
const oneYearLater = new Date().setFullYear(now.getFullYear() + 1);
return logs.filter(log => {
const logDate = new Date(log.date).getTime();
return logDate >= oneYearAgo && logDate <= oneYearLater;
});
}
function updateDisplay() {
chrome.storage.local.get(["startTime", "isRunning"], (data) => {
if (data.isRunning && data.startTime) {
const diff = Date.now() - data.startTime;
const h = Math.floor(diff / 3600000);
const m = Math.floor((diff % 3600000) / 60000);
const s = Math.floor((diff % 60000) / 1000);
document.getElementById('timerDisplay').innerText =
`${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;
}
});
}
document.getElementById('startBtn').onclick = () => {
chrome.storage.local.set({ startTime: Date.now(), isRunning: true }, () => {
clearInterval(timerInterval);
timerInterval = setInterval(updateDisplay, 1000);
});
};
document.getElementById('stopBtn').onclick = () => {
chrome.storage.local.get(["startTime", "isRunning"], (data) => {
if (data.isRunning && data.startTime) {
clearInterval(timerInterval);
const hours = (Date.now() - data.startTime) / 3600000;
const todayStr = getLocalDay(new Date());
chrome.storage.local.get({ logs: [] }, (storage) => {
let logs = storage.logs || [];
logs.push({ id: Date.now(), date: todayStr, hours: hours });
chrome.storage.local.set({ logs: filterLogs(logs), isRunning: false, startTime: null }, () => {
document.getElementById('timerDisplay').innerText = "00:00:00";
render();
});
});
}
});
};
document.getElementById('manualSaveBtn').onclick = () => {
const val = parseFloat(document.getElementById('manualHours').value);
const targetDate = makeDateStr(viewDate.getFullYear(), viewDate.getMonth(), currentDay);
chrome.storage.local.get({ logs: [] }, (data) => {
let logs = data.logs.filter(l => l.date !== targetDate);
if (val > 0) logs.push({ id: Date.now(), date: targetDate, hours: val });
chrome.storage.local.set({ logs: filterLogs(logs) }, () => render());
});
};
function render() {
chrome.storage.local.get({ logs: [] }, (data) => {
const logs = data.logs || [];
const year = viewDate.getFullYear();
const month = viewDate.getMonth();
let monthlyTotal = 0;
document.getElementById('currentMonthLabel').innerText = `${String(month + 1).padStart(2, '0')}. ${year}`;
document.getElementById('selectedDateLabel').innerText = makeDateStr(year, month, currentDay);
const grid = document.getElementById('calendarGrid');
grid.innerHTML = '';
['S','M','T','W','T','F','S'].forEach(d => {
const el = document.createElement('div');
el.className = 'day-header'; el.innerText = d; grid.appendChild(el);
});
const firstDay = new Date(year, month, 1).getDay();
const lastDate = new Date(year, month + 1, 0).getDate();
if (currentDay > lastDate) currentDay = lastDate;
for (let i = 0; i < firstDay; i++) grid.appendChild(document.createElement('div'));
for (let i = 1; i <= lastDate; i++) {
const dateStr = makeDateStr(year, month, i);
const daySum = logs.filter(l => l.date === dateStr).reduce((s, r) => s + r.hours, 0);
monthlyTotal += daySum;
const dayEl = document.createElement('div');
dayEl.className = `calendar-day ${daySum > 0.008 ? 'active' : ''} ${i === currentDay ? 'selected' : ''}`;
dayEl.innerHTML = `<span class="day-num">${i}</span>${daySum > 0.008 ? `<span class="day-hours">${formatToHHMM(daySum)}</span>` : ''}`;
dayEl.onclick = () => { currentDay = i; render(); };
grid.appendChild(dayEl);
}
document.getElementById('monthlyTotal').innerText = formatToHHMM(monthlyTotal);
});
}
document.getElementById('prevMonth').onclick = () => { viewDate.setMonth(viewDate.getMonth() - 1); render(); };
document.getElementById('nextMonth').onclick = () => { viewDate.setMonth(viewDate.getMonth() + 1); render(); };
document.addEventListener('DOMContentLoaded', () => {
render();
updateDisplay();
setInterval(updateDisplay, 1000);
});