react-weekly-planning 1.0.17 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/definition.txt +1 -0
- package/definitions/index.ts +2 -0
- package/index.js +51 -29
- package/index.tsx +57 -41
- package/lib/utils.js +25 -5
- package/lib/utils.ts +24 -12
- package/package.json +1 -1
- package/style.css +29 -2
package/README.md
CHANGED
|
@@ -11,6 +11,10 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
11
11
|
|
|
12
12
|

|
|
13
13
|
|
|
14
|
+
[See the demo](https://react-weekly-planning-demo.vercel.app)
|
|
15
|
+
|
|
16
|
+
[Demo repository](https://github.com/Yvesmorel/react-weekly-planning-demo.git)
|
|
17
|
+
|
|
14
18
|
#### `weekOffset`
|
|
15
19
|
|
|
16
20
|
- **Description**: This prop sets the offset for the week being displayed in the calendar.
|
package/definition.txt
CHANGED
package/definitions/index.ts
CHANGED
package/index.js
CHANGED
|
@@ -1,41 +1,27 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
1
12
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
13
|
import "./style.css";
|
|
3
|
-
import { getWeekDays, getDayHourly, calculerEcartSemaine, getSessionStorageRecordForDragAndDrop, sumHoursByGroups, millisecondsToDate, compareWeekOffset, } from "./lib/utils";
|
|
4
|
-
const
|
|
5
|
-
width: "100%",
|
|
6
|
-
height: "150px",
|
|
7
|
-
borderRadius: "0.5rem",
|
|
8
|
-
zIndex: 10,
|
|
9
|
-
};
|
|
10
|
-
const trStyle = {
|
|
14
|
+
import { getWeekDays, getDayHourly, calculerEcartSemaine, getSessionStorageRecordForDragAndDrop, sumHoursByGroups, millisecondsToDate, compareWeekOffset, saveTasksToLocalStorage, } from "./lib/utils";
|
|
15
|
+
const theadTrStyle = {
|
|
11
16
|
color: "#0f5173",
|
|
12
17
|
fontWeight: "300",
|
|
13
18
|
position: "sticky",
|
|
14
19
|
top: 0,
|
|
15
20
|
};
|
|
16
|
-
const
|
|
17
|
-
color: "#0f5173",
|
|
18
|
-
paddingLeft: "5px",
|
|
19
|
-
};
|
|
20
|
-
const weekDayThStyle = {};
|
|
21
|
-
const totalThStyle = {
|
|
22
|
-
width: "40px",
|
|
23
|
-
textAlign: "right",
|
|
24
|
-
paddingRight: "2px",
|
|
25
|
-
};
|
|
26
|
-
const tdStyle = {
|
|
21
|
+
const groupTdStyle = {
|
|
27
22
|
height: "auto",
|
|
28
23
|
width: "150px",
|
|
29
24
|
};
|
|
30
|
-
const tableTrStyle = {
|
|
31
|
-
borderBottom: "1.5px solid #0f52737e",
|
|
32
|
-
// backgroundColor: "#f2f8fb",
|
|
33
|
-
padding: "2px",
|
|
34
|
-
};
|
|
35
|
-
const tableTdStyle = {
|
|
36
|
-
borderLeft: "0.74px solid rgba(198, 219, 225, 0.68)",
|
|
37
|
-
borderRight: "0.74px solid rgba(198, 219, 225, 0.68)",
|
|
38
|
-
};
|
|
39
25
|
const groupContainerStyle = {
|
|
40
26
|
width: "100%",
|
|
41
27
|
height: "100%",
|
|
@@ -99,7 +85,8 @@ const Calendar = ({ style, className, groups, weekOffset, date, groupRender, day
|
|
|
99
85
|
const handleDragOver = (event) => {
|
|
100
86
|
event.preventDefault();
|
|
101
87
|
};
|
|
102
|
-
|
|
88
|
+
saveTasksToLocalStorage(tasks);
|
|
89
|
+
return (_jsxs("table", { className: `planningCalendar ${className}`, style: Object.assign({}, style), children: [_jsx("thead", { children: _jsxs("tr", { className: `${rowsClassName}`, style: Object.assign(Object.assign({}, theadTrStyle), rowsStyle), children: [_jsx("th", { className: "dayTh", children: _jsx(GroupsHeadContainer, { className: `${groupHeadContainerClassName}`, style: groupHeadContainerStyle, groupsHeadRender: groupsHeadRender }) }), weekDays.map((day, i) => (_jsx("th", { className: `${daysColsClassName}`, style: Object.assign({}, daysColsStyle), children: _jsx(DayContainer, { style: dayStyle, className: dayClassName, dayIndex: i, dayRender: dayRender, day: day.day, dayOfTheMonth: day.dayOfTheMonth, dayMonth: day.dayMonth, dayYear: day.dayYear }) }, i))), _jsx("th", { className: "totalTh", children: _jsx(SumHoursHead, { className: sumHoursHeadClassName, style: sumHoursHeadStyle, sumHoursHeadRender: sumHoursHeadRender }) })] }, "") }), _jsx("tbody", { children: groups === null || groups === void 0 ? void 0 : groups.map((group, i) => (_jsxs("tr", { className: `${rowsClassName}`, style: Object.assign({}, rowsStyle), children: [_jsx("td", { className: `${groupsColsClassName}`, style: Object.assign(Object.assign({}, groupTdStyle), groupsColsStyle), children: _jsx(GroupContainer, { style: groupStyle, className: groupClassName, groupRender: groupRender, currentGroup: group, handleClickGroup: handleClickGroup }) }, i), dailyHours.map((_, positionDay) => (_jsx("td", { onDragOver: handleDragOver, onDrop: (event) => {
|
|
103
90
|
if (!handleDropTask || !tasks)
|
|
104
91
|
return;
|
|
105
92
|
const dropInfo = getSessionStorageRecordForDragAndDrop(tasks, positionDay, group.id);
|
|
@@ -230,4 +217,39 @@ export const checkDuplicates = (tasks, taskStart, taskEnd, groupId) => {
|
|
|
230
217
|
taskStart <= task.taskEnd)).filter((task) => task.groupId === groupId);
|
|
231
218
|
return findDuplicates.length > 0;
|
|
232
219
|
};
|
|
220
|
+
export const getTasksSaved = () => {
|
|
221
|
+
const taskSavedString = window.localStorage.getItem("CalendarTaskSaved");
|
|
222
|
+
if (!taskSavedString) {
|
|
223
|
+
return [];
|
|
224
|
+
}
|
|
225
|
+
const tasksTable = JSON.parse(taskSavedString);
|
|
226
|
+
const validTasks = tasksTable
|
|
227
|
+
.filter((task) => {
|
|
228
|
+
if (task === null || task === void 0 ? void 0 : task.taskExpiryDate) {
|
|
229
|
+
const taskDate = new Date(task === null || task === void 0 ? void 0 : task.taskExpiryDate);
|
|
230
|
+
return taskDate.getTime() >= Date.now();
|
|
231
|
+
}
|
|
232
|
+
})
|
|
233
|
+
.map((task) => {
|
|
234
|
+
const { taskDate, taskExpiryDate } = task, rest = __rest(task, ["taskDate", "taskExpiryDate"]);
|
|
235
|
+
if (taskExpiryDate) {
|
|
236
|
+
return Object.assign({ taskDate: new Date(taskDate), taskExpiryDate: new Date(taskExpiryDate) }, rest);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
return validTasks;
|
|
240
|
+
};
|
|
241
|
+
export const deleteTaskSaved = (taskId) => {
|
|
242
|
+
const tasksSavedString = window.localStorage.getItem("CalendarTaskSaved");
|
|
243
|
+
if (!tasksSavedString)
|
|
244
|
+
return;
|
|
245
|
+
const tasksSavedTable = JSON.parse(tasksSavedString);
|
|
246
|
+
const taskIndex = tasksSavedTable.findIndex((task) => task.taskId === taskId);
|
|
247
|
+
if (taskIndex) {
|
|
248
|
+
tasksSavedTable.splice(taskIndex, 1);
|
|
249
|
+
window.localStorage.setItem("CalendarTaskSaved", JSON.stringify(tasksSavedTable));
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
export const deleteTasksSaved = () => {
|
|
253
|
+
window.localStorage.removeItem("CalendarTaskSaved");
|
|
254
|
+
};
|
|
233
255
|
export default Calendar;
|
package/index.tsx
CHANGED
|
@@ -9,8 +9,6 @@ import {
|
|
|
9
9
|
GroupsHeadContainerPropsType,
|
|
10
10
|
SumHoursContainerPropsType,
|
|
11
11
|
SumHoursHeadContainerPropsType,
|
|
12
|
-
TaskType,
|
|
13
|
-
TaskFeildsType,
|
|
14
12
|
TasksType,
|
|
15
13
|
} from "./definitions";
|
|
16
14
|
import {
|
|
@@ -21,48 +19,20 @@ import {
|
|
|
21
19
|
sumHoursByGroups,
|
|
22
20
|
millisecondsToDate,
|
|
23
21
|
compareWeekOffset,
|
|
22
|
+
saveTasksToLocalStorage,
|
|
24
23
|
} from "./lib/utils";
|
|
25
24
|
|
|
26
|
-
const
|
|
27
|
-
width: "100%",
|
|
28
|
-
height: "150px",
|
|
29
|
-
borderRadius: "0.5rem",
|
|
30
|
-
zIndex: 10,
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const trStyle: StyleType = {
|
|
25
|
+
const theadTrStyle: StyleType = {
|
|
34
26
|
color: "#0f5173",
|
|
35
27
|
fontWeight: "300",
|
|
36
28
|
position: "sticky",
|
|
37
29
|
top: 0,
|
|
38
30
|
};
|
|
39
31
|
|
|
40
|
-
const
|
|
41
|
-
color: "#0f5173",
|
|
42
|
-
paddingLeft: "5px",
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const weekDayThStyle: StyleType = {};
|
|
46
|
-
|
|
47
|
-
const totalThStyle: StyleType = {
|
|
48
|
-
width: "40px",
|
|
49
|
-
textAlign: "right",
|
|
50
|
-
paddingRight: "2px",
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
const tdStyle: StyleType = {
|
|
32
|
+
const groupTdStyle: StyleType = {
|
|
54
33
|
height: "auto",
|
|
55
34
|
width: "150px",
|
|
56
35
|
};
|
|
57
|
-
const tableTrStyle: StyleType = {
|
|
58
|
-
borderBottom: "1.5px solid #0f52737e",
|
|
59
|
-
// backgroundColor: "#f2f8fb",
|
|
60
|
-
padding: "2px",
|
|
61
|
-
};
|
|
62
|
-
const tableTdStyle: StyleType = {
|
|
63
|
-
borderLeft: "0.74px solid rgba(198, 219, 225, 0.68)",
|
|
64
|
-
borderRight: "0.74px solid rgba(198, 219, 225, 0.68)",
|
|
65
|
-
};
|
|
66
36
|
|
|
67
37
|
const groupContainerStyle: StyleType = {
|
|
68
38
|
width: "100%",
|
|
@@ -169,15 +139,17 @@ const Calendar = ({
|
|
|
169
139
|
const handleDragOver = (event: React.DragEvent<HTMLTableDataCellElement>) => {
|
|
170
140
|
event.preventDefault();
|
|
171
141
|
};
|
|
142
|
+
|
|
143
|
+
saveTasksToLocalStorage(tasks);
|
|
172
144
|
return (
|
|
173
|
-
<table className={
|
|
145
|
+
<table className={`planningCalendar ${className}`} style={{ ...style }}>
|
|
174
146
|
<thead>
|
|
175
147
|
<tr
|
|
176
148
|
className={`${rowsClassName}`}
|
|
177
|
-
style={{ ...
|
|
149
|
+
style={{ ...theadTrStyle, ...rowsStyle }}
|
|
178
150
|
key=""
|
|
179
151
|
>
|
|
180
|
-
<th
|
|
152
|
+
<th className="dayTh">
|
|
181
153
|
<GroupsHeadContainer
|
|
182
154
|
className={`${groupHeadContainerClassName}`}
|
|
183
155
|
style={groupHeadContainerStyle}
|
|
@@ -188,7 +160,7 @@ const Calendar = ({
|
|
|
188
160
|
<th
|
|
189
161
|
key={i}
|
|
190
162
|
className={`${daysColsClassName}`}
|
|
191
|
-
style={{ ...
|
|
163
|
+
style={{ ...daysColsStyle }}
|
|
192
164
|
>
|
|
193
165
|
<DayContainer
|
|
194
166
|
style={dayStyle}
|
|
@@ -202,7 +174,7 @@ const Calendar = ({
|
|
|
202
174
|
/>
|
|
203
175
|
</th>
|
|
204
176
|
))}
|
|
205
|
-
<th
|
|
177
|
+
<th className="totalTh">
|
|
206
178
|
<SumHoursHead
|
|
207
179
|
className={sumHoursHeadClassName}
|
|
208
180
|
style={sumHoursHeadStyle}
|
|
@@ -216,12 +188,12 @@ const Calendar = ({
|
|
|
216
188
|
<tr
|
|
217
189
|
key={`${i} tr`}
|
|
218
190
|
className={`${rowsClassName}`}
|
|
219
|
-
style={{ ...
|
|
191
|
+
style={{ ...rowsStyle }}
|
|
220
192
|
>
|
|
221
193
|
<td
|
|
222
194
|
className={`${groupsColsClassName}`}
|
|
223
195
|
key={i}
|
|
224
|
-
style={{ ...
|
|
196
|
+
style={{ ...groupTdStyle, ...groupsColsStyle }}
|
|
225
197
|
>
|
|
226
198
|
<GroupContainer
|
|
227
199
|
style={groupStyle}
|
|
@@ -233,7 +205,6 @@ const Calendar = ({
|
|
|
233
205
|
</td>
|
|
234
206
|
{dailyHours.map((_, positionDay) => (
|
|
235
207
|
<td
|
|
236
|
-
style={{ width: "8vw", ...tableTdStyle }}
|
|
237
208
|
key={`td-${group.id}day-i${positionDay}`}
|
|
238
209
|
onDragOver={handleDragOver}
|
|
239
210
|
onDrop={(event) => {
|
|
@@ -610,4 +581,49 @@ export const checkDuplicates = (
|
|
|
610
581
|
.filter((task) => task.groupId === groupId);
|
|
611
582
|
return findDuplicates.length > 0;
|
|
612
583
|
};
|
|
584
|
+
|
|
585
|
+
export const getTasksSaved = () => {
|
|
586
|
+
const taskSavedString = window.localStorage.getItem("CalendarTaskSaved");
|
|
587
|
+
if (!taskSavedString) {
|
|
588
|
+
return [];
|
|
589
|
+
}
|
|
590
|
+
const tasksTable: TasksType = JSON.parse(taskSavedString);
|
|
591
|
+
const validTasks = tasksTable
|
|
592
|
+
.filter((task) => {
|
|
593
|
+
if (task?.taskExpiryDate) {
|
|
594
|
+
const taskDate = new Date(task?.taskExpiryDate);
|
|
595
|
+
return taskDate.getTime() >= Date.now();
|
|
596
|
+
}
|
|
597
|
+
})
|
|
598
|
+
.map((task) => {
|
|
599
|
+
const { taskDate, taskExpiryDate, ...rest } = task;
|
|
600
|
+
if (taskExpiryDate) {
|
|
601
|
+
return {
|
|
602
|
+
taskDate: new Date(taskDate),
|
|
603
|
+
taskExpiryDate: new Date(taskExpiryDate),
|
|
604
|
+
...rest,
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
});
|
|
608
|
+
return validTasks;
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
export const deleteTaskSaved = (taskId: string) => {
|
|
612
|
+
const tasksSavedString = window.localStorage.getItem("CalendarTaskSaved");
|
|
613
|
+
if (!tasksSavedString) return;
|
|
614
|
+
const tasksSavedTable: TasksType = JSON.parse(tasksSavedString);
|
|
615
|
+
const taskIndex = tasksSavedTable.findIndex((task) => task.taskId === taskId);
|
|
616
|
+
if (taskIndex) {
|
|
617
|
+
tasksSavedTable.splice(taskIndex, 1);
|
|
618
|
+
window.localStorage.setItem(
|
|
619
|
+
"CalendarTaskSaved",
|
|
620
|
+
JSON.stringify(tasksSavedTable)
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
};
|
|
624
|
+
|
|
625
|
+
export const deleteTasksSaved = () => {
|
|
626
|
+
window.localStorage.removeItem("CalendarTaskSaved");
|
|
627
|
+
};
|
|
628
|
+
|
|
613
629
|
export default Calendar;
|
package/lib/utils.js
CHANGED
|
@@ -26,6 +26,10 @@ endDate.setHours(23, 59, 59, 999);
|
|
|
26
26
|
const endDateMilliseconds = endDate.getTime();
|
|
27
27
|
function getDayHourly(weekOffset) {
|
|
28
28
|
const dailyHours = [];
|
|
29
|
+
let dayOffset = weekOffset;
|
|
30
|
+
if (currentDate.getDay() === 0) {
|
|
31
|
+
dayOffset = dayOffset - 7;
|
|
32
|
+
}
|
|
29
33
|
// Boucle pour calculer les heures de début et de fin de chaque jour de la semaine
|
|
30
34
|
for (let i = 0; i < 7; i++) {
|
|
31
35
|
const dayDate = new Date(startDate);
|
|
@@ -36,9 +40,9 @@ function getDayHourly(weekOffset) {
|
|
|
36
40
|
dayEnd.setHours(23, 59, 59, 59);
|
|
37
41
|
dailyHours.push({
|
|
38
42
|
positionDay: i,
|
|
39
|
-
day: new Date(dayStart.getTime() +
|
|
40
|
-
start: dayStart.getTime() +
|
|
41
|
-
end: dayEnd.getTime() +
|
|
43
|
+
day: new Date(dayStart.getTime() + dayOffset * 86400000),
|
|
44
|
+
start: dayStart.getTime() + dayOffset * 86400000,
|
|
45
|
+
end: dayEnd.getTime() + dayOffset * 86400000,
|
|
42
46
|
});
|
|
43
47
|
}
|
|
44
48
|
return dailyHours;
|
|
@@ -125,7 +129,12 @@ function getWeekDays(jump) {
|
|
|
125
129
|
for (let i = 0; i < 7; i++) {
|
|
126
130
|
const day = new Date();
|
|
127
131
|
const diff = i - currentDayOfWeek;
|
|
128
|
-
|
|
132
|
+
if (currentDayOfWeek === 0) {
|
|
133
|
+
day.setDate(currentDate.getDate() + diff + jump - 7);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
day.setDate(currentDate.getDate() + diff + jump);
|
|
137
|
+
}
|
|
129
138
|
const formattedDay = `${days[day.getDay()]}. ${day.getDate()}, ${month[day.getMonth()]} ${day.getFullYear()}`;
|
|
130
139
|
weekDays.push({
|
|
131
140
|
day: days[day.getDay()],
|
|
@@ -400,6 +409,7 @@ function calculerEcartSemaine(dateSelectionnee) {
|
|
|
400
409
|
function semainesDepuisOrigine(annee, numeroSemaine) {
|
|
401
410
|
const dateActuelle = new Date();
|
|
402
411
|
const dateOrigine = new Date(dateActuelle.getFullYear() - 2, 0, 1);
|
|
412
|
+
console.log(dateOrigine);
|
|
403
413
|
const anneeOrigine = dateOrigine.getFullYear();
|
|
404
414
|
const numeroSemaineOrigine = getWeekNumber(dateOrigine);
|
|
405
415
|
let nombreSemaines = 0;
|
|
@@ -456,4 +466,14 @@ const sumHoursByGroups = (groupId, tasks, weekOffset, calendarDate) => {
|
|
|
456
466
|
});
|
|
457
467
|
return sum;
|
|
458
468
|
};
|
|
459
|
-
|
|
469
|
+
function saveTasksToLocalStorage(tasks) {
|
|
470
|
+
const tasksSavedString = window.localStorage.getItem("CalendarTaskSaved");
|
|
471
|
+
const tasksString = JSON.stringify(tasks);
|
|
472
|
+
if (tasksSavedString === tasksString)
|
|
473
|
+
return;
|
|
474
|
+
if (tasksString === "[]")
|
|
475
|
+
return;
|
|
476
|
+
const backup = [...tasks.filter((task) => task.taskExpiryDate)];
|
|
477
|
+
window.localStorage.setItem("CalendarTaskSaved", JSON.stringify(backup));
|
|
478
|
+
}
|
|
479
|
+
export { getWeeksListUpdate, saveTasksToLocalStorage, clickedDate, getCalandarDays, startDateMilliseconds, endDateMilliseconds, getDayHourly, millisecondsToDate, getWeekDays, formatDateToCustomFormat, displayDayOnModalLeft, millisecondsToInt, getWeekMonthAndYear, getWeeksList, getDoubleWeeksList, calculerEcartSemaine, calculateTimeOfDayRange, getSessionStorageRecordForDragAndDrop, compareWeekOffset, sumHoursByGroups, };
|
package/lib/utils.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import moment from "moment";
|
|
2
|
-
import {
|
|
3
|
-
TasksType,
|
|
4
|
-
TaskType,
|
|
5
|
-
TaskFeildsType,
|
|
6
|
-
GroupFeildsType,
|
|
7
|
-
} from "../definitions";
|
|
2
|
+
import { TasksType, TaskType, TaskFeildsType } from "../definitions";
|
|
8
3
|
// Obtenir la date actuelle
|
|
9
4
|
const currentDate = new Date();
|
|
10
5
|
// Obtenir le jour de la semaine (dimanche = 0, lundi = 1, ..., samedi = 6)
|
|
@@ -28,7 +23,10 @@ function getDayHourly(weekOffset: number) {
|
|
|
28
23
|
start: number;
|
|
29
24
|
end: number;
|
|
30
25
|
}[] = [];
|
|
31
|
-
|
|
26
|
+
let dayOffset = weekOffset;
|
|
27
|
+
if (currentDate.getDay() === 0) {
|
|
28
|
+
dayOffset = dayOffset - 7;
|
|
29
|
+
}
|
|
32
30
|
// Boucle pour calculer les heures de début et de fin de chaque jour de la semaine
|
|
33
31
|
for (let i = 0; i < 7; i++) {
|
|
34
32
|
const dayDate = new Date(startDate);
|
|
@@ -40,9 +38,9 @@ function getDayHourly(weekOffset: number) {
|
|
|
40
38
|
|
|
41
39
|
dailyHours.push({
|
|
42
40
|
positionDay: i,
|
|
43
|
-
day: new Date(dayStart.getTime() +
|
|
44
|
-
start: dayStart.getTime() +
|
|
45
|
-
end: dayEnd.getTime() +
|
|
41
|
+
day: new Date(dayStart.getTime() + dayOffset * 86400000),
|
|
42
|
+
start: dayStart.getTime() + dayOffset * 86400000,
|
|
43
|
+
end: dayEnd.getTime() + dayOffset * 86400000,
|
|
46
44
|
});
|
|
47
45
|
}
|
|
48
46
|
return dailyHours;
|
|
@@ -144,8 +142,11 @@ function getWeekDays(jump: number) {
|
|
|
144
142
|
for (let i = 0; i < 7; i++) {
|
|
145
143
|
const day = new Date();
|
|
146
144
|
const diff = i - currentDayOfWeek;
|
|
147
|
-
|
|
148
|
-
|
|
145
|
+
if (currentDayOfWeek === 0) {
|
|
146
|
+
day.setDate(currentDate.getDate() + diff + jump - 7);
|
|
147
|
+
} else {
|
|
148
|
+
day.setDate(currentDate.getDate() + diff + jump);
|
|
149
|
+
}
|
|
149
150
|
|
|
150
151
|
const formattedDay = `${days[day.getDay()]}. ${day.getDate()}, ${
|
|
151
152
|
month[day.getMonth()]
|
|
@@ -597,8 +598,19 @@ const sumHoursByGroups = (
|
|
|
597
598
|
});
|
|
598
599
|
return sum;
|
|
599
600
|
};
|
|
601
|
+
|
|
602
|
+
function saveTasksToLocalStorage(tasks: TasksType) {
|
|
603
|
+
const tasksSavedString = window.localStorage.getItem("CalendarTaskSaved");
|
|
604
|
+
const tasksString = JSON.stringify(tasks);
|
|
605
|
+
if (tasksSavedString === tasksString) return;
|
|
606
|
+
if (tasksString === "[]") return;
|
|
607
|
+
const backup = [...tasks.filter((task) => task.taskExpiryDate)];
|
|
608
|
+
window.localStorage.setItem("CalendarTaskSaved", JSON.stringify(backup));
|
|
609
|
+
}
|
|
610
|
+
|
|
600
611
|
export {
|
|
601
612
|
getWeeksListUpdate,
|
|
613
|
+
saveTasksToLocalStorage,
|
|
602
614
|
clickedDate,
|
|
603
615
|
getCalandarDays,
|
|
604
616
|
startDateMilliseconds,
|
package/package.json
CHANGED
package/style.css
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
display: flex;
|
|
4
4
|
align-items: center;
|
|
5
5
|
justify-content: center;
|
|
6
|
-
|
|
6
|
+
flex: 1;
|
|
7
7
|
background-color: #f2f8fb;
|
|
8
8
|
opacity: 0;
|
|
9
9
|
border-radius: 5px;
|
|
@@ -48,4 +48,31 @@
|
|
|
48
48
|
font-weight: 600;
|
|
49
49
|
margin-left: 5px;
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
|
|
52
|
+
.planningCalendar{
|
|
53
|
+
width: 100%;
|
|
54
|
+
height: 150px;
|
|
55
|
+
border-radius: 0.5rem;
|
|
56
|
+
z-index: 10;
|
|
57
|
+
}
|
|
58
|
+
.planningCalendar .dayTh{
|
|
59
|
+
color: #0f5173;
|
|
60
|
+
padding-left: 5px
|
|
61
|
+
}
|
|
62
|
+
.planningCalendar .totalTh {
|
|
63
|
+
color: #0f5173;
|
|
64
|
+
width: 40px;
|
|
65
|
+
text-align: right;
|
|
66
|
+
padding-right: 2px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.planningCalendar td {
|
|
70
|
+
-moz-box-sizing: border-box;
|
|
71
|
+
border-left: 0.74px solid rgba(198, 219, 225, 0.68);
|
|
72
|
+
border-right: 0.74px solid rgba(198, 219, 225, 0.68);
|
|
73
|
+
width: 8vw;
|
|
74
|
+
}
|
|
75
|
+
.planningCalendar tr {
|
|
76
|
+
border-bottom: 1.5px solid #0f52737e;
|
|
77
|
+
padding: 2px;
|
|
78
|
+
}
|