react-weekly-planning 1.0.30 → 1.0.32

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/lib/utils.ts CHANGED
@@ -31,7 +31,7 @@ endDate.setDate(endDate.getDate() + (6 - currentDayOfWeek));
31
31
  endDate.setHours(23, 59, 59, 999);
32
32
  export const endDateMilliseconds = endDate.getTime();
33
33
 
34
- export function getDayHourly(weekOffset: number) {
34
+ export function getDayHourly(weekOffset: number, timeZone?: TimeZone) {
35
35
  const dailyHours: {
36
36
  positionDay: number;
37
37
  day: Date;
@@ -40,15 +40,16 @@ export function getDayHourly(weekOffset: number) {
40
40
  }[] = [];
41
41
  let dayOffset = weekOffset;
42
42
 
43
- // Adjust the offset if the current day is Sunday
44
- if (currentDate.getDay() === 0) {
45
- dayOffset = dayOffset - 7;
46
- }
43
+ const resolvedCurrentDate = timeZone ? getDateObjectInTimeZone(timeZone) : new Date();
44
+ const currentDayOfWeek = resolvedCurrentDate.getDay();
45
+ const resolvedStartDate = new Date(resolvedCurrentDate);
46
+ resolvedStartDate.setDate(resolvedStartDate.getDate() - currentDayOfWeek);
47
+ resolvedStartDate.setHours(0, 0, 0, 0);
47
48
 
48
49
  // Loop to calculate the start and end hours for each day of the week
49
50
  for (let i = 0; i < 7; i++) {
50
- const dayDate = new Date(startDate);
51
- dayDate.setDate(startDate.getDate() + i);
51
+ const dayDate = new Date(resolvedStartDate);
52
+ dayDate.setDate(resolvedStartDate.getDate() + i);
52
53
  const dayStart = new Date(dayDate);
53
54
  dayStart.setHours(1, 0, 0, 0);
54
55
  const dayEnd = new Date(dayDate);
@@ -56,9 +57,9 @@ export function getDayHourly(weekOffset: number) {
56
57
 
57
58
  dailyHours.push({
58
59
  positionDay: i,
59
- day: new Date(dayStart.getTime() + dayOffset * DAY_IN_MILLISECONDS),
60
- start: dayStart.getTime() + dayOffset * DAY_IN_MILLISECONDS,
61
- end: dayEnd.getTime() + dayOffset * DAY_IN_MILLISECONDS,
60
+ day: new Date(dayStart.getTime() + (dayOffset * DAY_IN_MILLISECONDS)),
61
+ start: dayStart.getTime() + (dayOffset * DAY_IN_MILLISECONDS),
62
+ end: dayEnd.getTime() + (dayOffset * DAY_IN_MILLISECONDS),
62
63
  });
63
64
  }
64
65
  return dailyHours;
@@ -114,7 +115,7 @@ export function millisecondsToInt(milliseconds: number) {
114
115
  }
115
116
 
116
117
  // Get days of the week with a jump offset
117
- export function getWeekDays(jump: number) {
118
+ export function getWeekDays(jump: number, timeZone?: TimeZone) {
118
119
  const days = ["Sun", "Mon", "Tues", "Wed", "Thur", "Frid", "Sat"];
119
120
  const month = [
120
121
  "Jan",
@@ -130,21 +131,20 @@ export function getWeekDays(jump: number) {
130
131
  "Nov",
131
132
  "Dec",
132
133
  ];
133
- const currentDate = new Date();
134
+ const currentDate = timeZone ? getDateObjectInTimeZone(timeZone) : new Date();
134
135
  const currentDayOfWeek = currentDate.getDay();
135
136
  let weekDays = [];
136
137
 
137
138
  for (let i = 0; i < 7; i++) {
138
- const day = new Date();
139
+ const day = timeZone ? getDateObjectInTimeZone(timeZone) : new Date();
139
140
  const diff = i - currentDayOfWeek;
140
141
  if (currentDayOfWeek === 0) {
141
142
  day.setDate(currentDate.getDate() + diff + jump - 7);
142
143
  } else {
143
144
  day.setDate(currentDate.getDate() + diff + jump);
144
145
  }
145
- const formattedDay = `${days[day.getDay()]}. ${day.getDate()}, ${
146
- month[day.getMonth()]
147
- } ${day.getFullYear()}`;
146
+ const formattedDay = `${days[day.getDay()]}. ${day.getDate()}, ${month[day.getMonth()]
147
+ } ${day.getFullYear()}`;
148
148
  weekDays.push({
149
149
  day: days[day.getDay()],
150
150
  dayMonth: month[day.getMonth()],
@@ -192,25 +192,16 @@ function updateSelectedDateForEcartSemaine(dateSelectionnee: Date): Date {
192
192
  * @param dateSelectionnee - The selected date.
193
193
  * @returns The week difference in days.
194
194
  */
195
- export function calculerEcartSemaine(dateSelectionnee: Date): number {
196
- if (!dateSelectionnee) {
197
- return 0;
198
- }
199
- const selectedDateUpdated =
200
- updateSelectedDateForEcartSemaine(dateSelectionnee);
195
+ export function calculerEcartSemaine(dateSelectionnee: Date, timeZone?: TimeZone): number {
196
+ const dateActuelle = timeZone ? getDateObjectInTimeZone(timeZone) : new Date()
197
+ const recupDate = new Date(dateSelectionnee)
201
198
 
202
- const dateActuelle = new Date();
203
- const anneeActuelle = dateActuelle.getFullYear();
204
- const numeroSemaineActuelle = getWeekNumber(dateActuelle);
205
199
 
206
- const anneeSelectionnee = selectedDateUpdated.getFullYear();
207
- const numeroSemaineSelectionnee = getWeekNumber(selectedDateUpdated);
200
+ recupDate.setUTCDate(recupDate.getUTCDate() + 4 - (recupDate.getUTCDay() || 7));
201
+ dateActuelle.setUTCDate(dateActuelle.getUTCDate() + 4 - (dateActuelle.getUTCDay() || 7));
208
202
 
209
- const ecartSemaine =
210
- semainesDepuisOrigine(anneeSelectionnee, numeroSemaineSelectionnee) -
211
- semainesDepuisOrigine(anneeActuelle, numeroSemaineActuelle);
212
203
 
213
- return ecartSemaine * 7;
204
+ return Math.ceil((recupDate.getTime() - dateActuelle.getTime()) / 86400000)
214
205
  }
215
206
 
216
207
  /**
@@ -281,33 +272,43 @@ export function getSessionStorageRecordForDragAndDrop(
281
272
  export function compareWeekOffset(
282
273
  calendarDate: Date,
283
274
  weekOffset: number,
284
- taskDate: Date
275
+ taskDate: Date,
276
+ timeZone?: TimeZone
285
277
  ) {
286
278
  // if (taskDate.getDay() === 0 && calculerEcartSemaine(taskDate) === -7) {
287
279
  // return true;
288
280
  // }
289
- if (calendarDate)
290
- return (
291
- calculerEcartSemaine(calendarDate) === calculerEcartSemaine(taskDate)
292
- );
293
- return weekOffset === calculerEcartSemaine(taskDate);
281
+
282
+
283
+ console.log(weekOffset, "WEEKOFFSET", calculerEcartSemaine(taskDate, timeZone) + 7);
284
+ console.log(calendarDate, "CALENDAR DATE");
285
+ const localTaskDate = getArbitraryDateInTimeZone(taskDate, timeZone);
286
+ console.log(localTaskDate.getDay(), "TASK DATE", localTaskDate);
287
+
288
+ // if (calendarDate)
289
+ // return (calculerEcartSemaine(calendarDate) === calculerEcartSemaine(taskDate));
290
+
291
+ const ecartTask = calculerEcartSemaine(taskDate, timeZone) + (localTaskDate.getDay() === 0 ? 7 : 0)
292
+ return weekOffset === ecartTask;
294
293
  }
295
294
 
296
295
  export const sumHoursByGroups = (
297
296
  groupId: string,
298
297
  tasks: TasksType | any,
299
298
  weekOffset: number,
300
- calendarDate: Date
299
+ calendarDate: Date,
300
+ timeZone?: TimeZone
301
301
  ) => {
302
302
  let sum: number = 0;
303
- tasks?.forEach((task: TaskType | any) => {
304
- if (
305
- task.groupId === groupId &&
306
- compareWeekOffset(calendarDate, weekOffset, task.taskDate) === true
307
- ) {
308
- sum += (task.taskEnd - task.taskStart) / 3600000;
309
- }
310
- });
303
+ if (tasks)
304
+ tasks.forEach((task: TaskType | any) => {
305
+ if (
306
+ task.groupId === groupId &&
307
+ compareWeekOffset(calendarDate, weekOffset, task.taskDate, timeZone) === true
308
+ ) {
309
+ sum += task.taskEnd - task.taskStart;
310
+ }
311
+ });
311
312
  return sum;
312
313
  };
313
314
 
@@ -341,8 +342,8 @@ export const updateCalendarDateWithOffset = (
341
342
  return newDate;
342
343
  };
343
344
 
344
- export const updateOffsetWithDateCalendar = (calendarDate: Date) => {
345
- return calculerEcartSemaine(calendarDate);
345
+ export const updateOffsetWithDateCalendar = (calendarDate: Date, timeZone?: TimeZone) => {
346
+ return calculerEcartSemaine(calendarDate, timeZone);
346
347
  };
347
348
 
348
349
  export const millisecondsToHours = (milliseconds: number) => {
@@ -378,6 +379,9 @@ export const getSavedTasks = () => {
378
379
 
379
380
  const savedTasks: TasksType | any = tasksTable.map((task) => {
380
381
  const { taskDate, taskExpiryDate, ...rest } = task;
382
+
383
+ console.log("SAVED", taskDate);
384
+
381
385
  if (taskExpiryDate) {
382
386
  return {
383
387
  taskDate: new Date(taskDate),
@@ -469,7 +473,18 @@ export function getDateObjectInTimeZone(timeZone: string) {
469
473
  }
470
474
  }
471
475
 
472
- function recurring(ecartDay: number, task: TaskFeildsType) {
476
+ export function getArbitraryDateInTimeZone(date: Date, timeZone?: string) {
477
+ if (!timeZone) return date;
478
+ try {
479
+ return new Date(
480
+ date.toLocaleString("en-US", { timeZone: timeZone })
481
+ );
482
+ } catch (error) {
483
+ return date;
484
+ }
485
+ }
486
+
487
+ function recurring(ecartDay: number, task: TaskFeildsType, timeZone?: TimeZone) {
473
488
  const newTask = { ...task };
474
489
 
475
490
  newTask.taskStart = newTask.taskStart + ecartDay;
@@ -482,7 +497,7 @@ function recurring(ecartDay: number, task: TaskFeildsType) {
482
497
 
483
498
  newTask.taskDate = new Date(newTask.taskStart);
484
499
 
485
- newTask.dayIndex = newTask.taskDate.getDay();
500
+ newTask.dayIndex = getArbitraryDateInTimeZone(newTask.taskDate, timeZone).getDay();
486
501
 
487
502
  newTask.taskId = getUnqueId();
488
503
  return newTask;
@@ -492,14 +507,15 @@ export function recurringTasks(
492
507
  allTasks: TasksType,
493
508
  task: TaskFeildsType,
494
509
  recurrenceType: "daily" | "weekly" | "monthly",
495
- occurrences: number
510
+ occurrences: number,
511
+ timeZone?: TimeZone
496
512
  ): TaskFeildsType[] {
497
513
  const tasks: TaskFeildsType[] = [];
498
514
 
499
515
  function daily() {
500
516
  for (let i = 0; i < occurrences; i++) {
501
517
  // Create a copy of the task with updated taskDate for each day
502
- const newTask = recurring(i * DAY_IN_MILLISECONDS, task);
518
+ const newTask = recurring(i * DAY_IN_MILLISECONDS, task, timeZone);
503
519
 
504
520
  if (
505
521
  !checkDuplicates(
@@ -517,7 +533,7 @@ export function recurringTasks(
517
533
  function weekly() {
518
534
  for (let i = 0; i < occurrences; i++) {
519
535
  // Create a copy of the task with updated taskDate for each week
520
- const newTask = recurring(i * WEEK_IN_MILLISECONDS, task);
536
+ const newTask = recurring(i * WEEK_IN_MILLISECONDS, task, timeZone);
521
537
  if (
522
538
  !checkDuplicates(
523
539
  allTasks,
@@ -536,7 +552,8 @@ export function recurringTasks(
536
552
  // Create a copy of the task with updated taskDate for each week
537
553
  const newTask = recurring(
538
554
  dayjs(task.taskDate).daysInMonth() * i * DAY_IN_MILLISECONDS,
539
- task
555
+ task,
556
+ timeZone
540
557
  );
541
558
 
542
559
  if (
@@ -570,12 +587,13 @@ export function recurringTasks(
570
587
  export function getHoursByday(
571
588
  tasks: TaskFeildsType[],
572
589
  dayIndex: 0 | 1 | 2 | 3 | 4 | 5 | 6,
573
- weekOffset?: number
590
+ weekOffset?: number,
591
+ timeZone?: TimeZone
574
592
  ) {
575
593
  const sum = tasks.reduce((currentSum: number, task: TaskFeildsType) => {
576
594
  if (
577
595
  task.dayIndex === dayIndex &&
578
- weekOffset === updateOffsetWithDateCalendar(task.taskDate)
596
+ weekOffset === updateOffsetWithDateCalendar(task.taskDate, timeZone)
579
597
  )
580
598
  return (
581
599
  currentSum +
@@ -589,12 +607,13 @@ export function getHoursByday(
589
607
  export function getHoursByGroup(
590
608
  tasks: TaskFeildsType[],
591
609
  groupId: string,
592
- weekOffset?: number
610
+ weekOffset?: number,
611
+ timeZone?: TimeZone
593
612
  ) {
594
613
  const sum = tasks.reduce((currentSum: number, task: TaskFeildsType) => {
595
614
  if (
596
615
  task.groupId === groupId &&
597
- weekOffset === updateOffsetWithDateCalendar(task.taskDate)
616
+ weekOffset === updateOffsetWithDateCalendar(task.taskDate, timeZone)
598
617
  )
599
618
  return (
600
619
  currentSum +
@@ -717,12 +736,13 @@ function updateTaskStartTimeAnEndTime(
717
736
  end: number,
718
737
  calendarOffset: number,
719
738
  dayIndex: number,
720
- taskPosition: number
739
+ taskPosition: number,
740
+ timeZone?: TimeZone
721
741
  ) {
722
742
  const diffDay =
723
743
  dayIndex +
724
744
  calendarOffset -
725
- (taskPosition + updateOffsetWithDateCalendar(new Date(start)));
745
+ (taskPosition + updateOffsetWithDateCalendar(new Date(start), timeZone));
726
746
 
727
747
  const startTime = start + diffDay * DAY_IN_MILLISECONDS;
728
748
  const endTime = end + diffDay * DAY_IN_MILLISECONDS;
@@ -737,7 +757,8 @@ export function pastTasks(
737
757
  dayInfo: dayInfoType,
738
758
  groupId: string,
739
759
  tasks: TaskFeildsType[],
740
- taskExpiryDate?: Date
760
+ taskExpiryDate?: Date,
761
+ timeZone?: TimeZone
741
762
  ) {
742
763
  if (typeof window !== "undefined") {
743
764
  const copiedTasks: TaskFeildsType[] = JSON.parse(
@@ -761,9 +782,10 @@ export function pastTasks(
761
782
  const newTaskStartAndEnd = updateTaskStartTimeAnEndTime(
762
783
  copiedTasktaskStart,
763
784
  copiedTasktaskEnd,
764
- updateOffsetWithDateCalendar(dayInfo.day),
785
+ updateOffsetWithDateCalendar(dayInfo.day, timeZone),
765
786
  dayInfo.positionDay,
766
- copiedTaskDayIndex
787
+ copiedTaskDayIndex,
788
+ timeZone
767
789
  );
768
790
 
769
791
  if (
@@ -796,7 +818,7 @@ export function pastTasks(
796
818
  window.sessionStorage.removeItem("copiedTasks");
797
819
 
798
820
  return [...tasks, ...newTasks];
799
- } else throw new Error("Sorry there are no tasks to select");
821
+ } else throw new Error("no past task(s)");
800
822
  }
801
823
  }
802
824
 
@@ -946,3 +968,24 @@ export const GetTimeRangeByDay = (start: number, end: number) => {
946
968
  }
947
969
  return range;
948
970
  };
971
+
972
+ export function totalLabel(milliseconds: number) {
973
+ let label = "";
974
+ const hourConv = milliseconds / 3600000;
975
+
976
+ const truncHour = Math.trunc(hourConv);
977
+
978
+ if (hourConv !== truncHour) {
979
+ const deciHour = hourConv - truncHour;
980
+ const minConv = deciHour * 60;
981
+ const truncMin = Math.trunc(minConv);
982
+
983
+ if (truncMin !== minConv) {
984
+ const deciMin = minConv - truncMin;
985
+ const secConv = deciMin * 60;
986
+ label = `${truncHour}:${truncMin}:${Math.trunc(secConv)}`;
987
+ } else label = `${truncHour}:${minConv}:0`;
988
+ } else label = `${hourConv}:0:0`;
989
+
990
+ return label;
991
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-weekly-planning",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "test": "jest --env=jsdom",
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "repository": {
12
12
  "type": "git",
13
- "url": "https://github.com/Yvesmorel/react-pweekly-planning.git"
13
+ "url": "git+https://github.com/Yvesmorel/react-pweekly-planning.git"
14
14
  },
15
15
  "homepage": "https://github.com/Yvesmorel/react-pweekly-planning.git#readme",
16
16
  "bugs": {
@@ -39,43 +39,40 @@
39
39
  "license": "MIT",
40
40
  "description": "react-weekly-planning provides a React component for weekly planning. Easily set up and manage a weekly schedule with customizable tasks, groups and views.",
41
41
  "dependencies": {
42
- "@babel/types": "^7.24.5",
43
- "@types/babel__generator": "^7.6.8",
44
- "axios": "^1.7.9",
45
- "dayjs": "^1.11.13",
42
+ "@babel/types": "^7.29.0",
43
+ "@types/babel__generator": "^7.27.0",
44
+ "axios": "^1.13.6",
45
+ "dayjs": "^1.11.19",
46
46
  "ical": "^0.8.0",
47
47
  "ics-to-json": "^2.0.2",
48
48
  "moment": "^2.30.1",
49
- "react": "^18.3.1",
50
- "react-dom": "^18.3.1",
51
- "react-use-search": "^0.3.2",
52
- "react-window": "^1.8.11",
53
- "sass": "^1.77.2",
49
+ "react-window": "^2.2.7",
50
+ "sass": "^1.97.3",
54
51
  "ts-node": "^10.9.2",
55
- "uuid": "^11.0.5"
52
+ "uuid": "^13.0.0"
56
53
  },
57
54
  "devDependencies": {
58
- "@babel/core": "^7.24.5",
59
- "@babel/preset-env": "^7.24.5",
60
- "@babel/preset-react": "^7.24.1",
61
- "@babel/preset-typescript": "^7.24.1",
62
- "@testing-library/dom": "^10.4.0",
63
- "@testing-library/jest-dom": "^6.4.5",
64
- "@testing-library/react": "^15.0.7",
55
+ "@babel/core": "^7.29.0",
56
+ "@babel/preset-env": "^7.29.0",
57
+ "@babel/preset-react": "^7.28.5",
58
+ "@babel/preset-typescript": "^7.28.5",
59
+ "@testing-library/dom": "^10.4.1",
60
+ "@testing-library/jest-dom": "^6.9.1",
61
+ "@testing-library/react": "^16.3.2",
65
62
  "@types/babel__core": "^7.20.5",
66
63
  "@types/ical": "^0.8.3",
67
- "@types/jest": "^29.5.12",
68
- "@types/react": "^18.3.18",
69
- "@types/react-dom": "^18.3.5",
70
- "@types/react-window": "^1.8.8",
71
- "babel-jest": "^29.7.0",
72
- "better-docs": "^2.7.3",
64
+ "@types/jest": "^30.0.0",
65
+ "@types/react": "^19.2.14",
66
+ "@types/react-window": "^2.0.0",
67
+ "babel-jest": "^30.2.0",
73
68
  "docdash": "^2.0.2",
74
- "jest": "^29.7.0",
75
- "jest-environment-jsdom": "^29.7.0",
76
- "react-test-renderer": "^18.3.1",
77
- "tailwindcss": "^3.4.3",
78
- "ts-jest": "^29.1.3",
79
- "typescript": "^5.4.5"
69
+ "jest": "^30.2.0",
70
+ "jest-environment-jsdom": "^30.2.0",
71
+ "react": "^19.2.4",
72
+ "react-dom": "^19.2.4",
73
+ "react-test-renderer": "^19.2.4",
74
+ "tailwindcss": "^4.2.1",
75
+ "ts-jest": "^29.4.6",
76
+ "typescript": "^5.9.3"
80
77
  }
81
78
  }