Browse Source

Allow events to span on multiple days

Arnaud Vergnet 4 years ago
parent
commit
40d7985bbd

+ 43
- 4
screens/Planning/PlanningScreen.js View File

@@ -59,7 +59,7 @@ export default class PlanningScreen extends React.Component<Props, State> {
59 59
     onAgendaRef: Function;
60 60
     onCalendarToggled: Function;
61 61
     onBackButtonPressAndroid: Function;
62
-    currentDate = PlanningEventManager.getCurrentDateString();
62
+    currentDate = PlanningEventManager.getDateOnlyString(PlanningEventManager.getCurrentDateString());
63 63
 
64 64
     constructor(props: any) {
65 65
         super(props);
@@ -108,12 +108,14 @@ export default class PlanningScreen extends React.Component<Props, State> {
108 108
     };
109 109
 
110 110
 
111
-
112 111
     generateEmptyCalendar() {
113 112
         let end = new Date(new Date().setMonth(new Date().getMonth() + AGENDA_MONTH_SPAN + 1));
114 113
         let daysOfYear = {};
115 114
         for (let d = new Date(); d <= end; d.setDate(d.getDate() + 1)) {
116
-            daysOfYear[PlanningEventManager.dateToString(new Date(d))] = []
115
+            daysOfYear[
116
+                PlanningEventManager.getDateOnlyString(
117
+                    PlanningEventManager.dateToString(new Date(d))
118
+                )] = []
117 119
         }
118 120
         return daysOfYear;
119 121
     }
@@ -192,16 +194,53 @@ export default class PlanningScreen extends React.Component<Props, State> {
192 194
         }
193 195
     };
194 196
 
197
+    getClonedEventArray(event: Object, times: number) {
198
+        let cloneArray = [];
199
+        if (times > 1) {
200
+            for (let i = 0; i < times; i++) {
201
+                let clone = JSON.parse(JSON.stringify(event));
202
+                let startDate = PlanningEventManager.stringToDate(clone["date_begin"]);
203
+                let endDate = new Date();
204
+                if (i !== 0) {
205
+                    startDate.setHours(0, 0, 0);
206
+                    startDate.setDate(startDate.getDate() + i);
207
+                    clone["date_begin"] = PlanningEventManager.dateToString(startDate);
208
+                }
209
+                if (i !== (times - 1)) {
210
+                    endDate = PlanningEventManager.stringToDate(clone["date_end"]);
211
+                    endDate.setHours(23, 59, 0);
212
+                    endDate.setFullYear(startDate.getFullYear(),
213
+                        startDate.getMonth(),
214
+                        startDate.getDate() + i);
215
+                    clone["date_end"] = PlanningEventManager.dateToString(endDate);
216
+                }
217
+                cloneArray.push(clone)
218
+            }
219
+        } else
220
+            cloneArray = [event];
221
+        return cloneArray;
222
+    }
223
+
195 224
     generateEventAgenda(eventList: Array<Object>) {
196 225
         let agendaItems = this.generateEmptyCalendar();
197 226
         for (let i = 0; i < eventList.length; i++) {
198 227
             if (PlanningEventManager.getDateOnlyString(eventList[i]["date_begin"]) !== undefined) {
199
-                this.pushEventInOrder(agendaItems, eventList[i], PlanningEventManager.getDateOnlyString(eventList[i]["date_begin"]));
228
+                const clonedEventArray = this.getClonedEventArray(
229
+                    eventList[i],
230
+                    PlanningEventManager.getEventDaysNumber(eventList[i]["date_begin"], eventList[i]["date_end"])
231
+                );
232
+                this.pushEvents(agendaItems, clonedEventArray);
200 233
             }
201 234
         }
202 235
         this.setState({agendaItems: agendaItems})
203 236
     }
204 237
 
238
+    pushEvents(agendaItems: Object, eventList: Array<Object>) {
239
+        for (let i = 0; i < eventList.length; i++) {
240
+            this.pushEventInOrder(agendaItems, eventList[i], PlanningEventManager.getDateOnlyString(eventList[i]["date_begin"]));
241
+        }
242
+    }
243
+
205 244
     pushEventInOrder(agendaItems: Object, event: Object, startDate: string) {
206 245
         if (agendaItems[startDate].length === 0)
207 246
             agendaItems[startDate].push(event);

+ 2
- 2
utils/DateManager.js View File

@@ -8,13 +8,13 @@ export default class DateManager {
8 8
     monthsOfYear = [];
9 9
 
10 10
     constructor() {
11
+        this.daysOfWeek.push(i18n.t("date.daysOfWeek.sunday")); // 0 represents sunday
11 12
         this.daysOfWeek.push(i18n.t("date.daysOfWeek.monday"));
12 13
         this.daysOfWeek.push(i18n.t("date.daysOfWeek.tuesday"));
13 14
         this.daysOfWeek.push(i18n.t("date.daysOfWeek.wednesday"));
14 15
         this.daysOfWeek.push(i18n.t("date.daysOfWeek.thursday"));
15 16
         this.daysOfWeek.push(i18n.t("date.daysOfWeek.friday"));
16 17
         this.daysOfWeek.push(i18n.t("date.daysOfWeek.saturday"));
17
-        this.daysOfWeek.push(i18n.t("date.daysOfWeek.sunday"));
18 18
 
19 19
         this.monthsOfYear.push(i18n.t("date.monthsOfYear.january"));
20 20
         this.monthsOfYear.push(i18n.t("date.monthsOfYear.february"));
@@ -44,7 +44,7 @@ export default class DateManager {
44 44
         let dateArray = dateString.split('-');
45 45
         let date = new Date();
46 46
         date.setFullYear(parseInt(dateArray[0]), parseInt(dateArray[1]) - 1, parseInt(dateArray[2]));
47
-        return this.daysOfWeek[date.getDay() - 1] + " " + date.getDate() + " " + this.monthsOfYear[date.getMonth()] + " " + date.getFullYear();
47
+        return this.daysOfWeek[date.getDay()] + " " + date.getDate() + " " + this.monthsOfYear[date.getMonth()] + " " + date.getFullYear();
48 48
     }
49 49
 
50 50
 }

+ 40
- 24
utils/PlanningEventManager.js View File

@@ -9,10 +9,33 @@ export default class PlanningEventManager {
9 9
      *
10 10
      * @return {string} The string representation
11 11
      */
12
-    static getCurrentDateString() {
12
+    static getCurrentDateString(): string {
13 13
         return PlanningEventManager.dateToString(new Date());
14 14
     }
15 15
 
16
+    /**
17
+     * Gets how many days the event lasts. If no end date is specified, defaults to 1.
18
+     *
19
+     *
20
+     * @param start The start date string in format YYYY-MM-DD HH:MM:SS
21
+     * @param end The end date string in format YYYY-MM-DD HH:MM:SS
22
+     * @return {number} The number of days, 0 on error
23
+     */
24
+    static getEventDaysNumber(start: string, end: string): number {
25
+        let startDate = PlanningEventManager.stringToDate(start);
26
+        let endDate = PlanningEventManager.stringToDate(end);
27
+        if (startDate !== undefined && endDate !== undefined) {
28
+            if (startDate.getTime() !== endDate.getTime()) {
29
+                const diffTime = endDate - startDate;
30
+                return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
31
+            } else
32
+                return 1;
33
+        } else if (startDate !== undefined)
34
+            return 1;
35
+        else
36
+            return 0;
37
+    }
38
+
16 39
 
17 40
     /**
18 41
      * Checks if the given date is before the other.
@@ -89,26 +112,19 @@ export default class PlanningEventManager {
89 112
 
90 113
     /**
91 114
      * Converts a date object to a string in the format
92
-     * YYYY-MM-DD
115
+     * YYYY-MM-DD HH-MM-SS
93 116
      *
94 117
      * @param date The date object to convert
95 118
      * @return {string} The converted string
96 119
      */
97 120
     static dateToString(date: Date) {
98
-        let dd = String(date.getDate()).padStart(2, '0');
99
-        let mm = String(date.getMonth() + 1).padStart(2, '0'); //January is 0!
100
-        let yyyy = date.getFullYear();
101
-        return yyyy + '-' + mm + '-' + dd;
102
-    }
103
-
104
-    /**
105
-     * Returns a padded string for the given number if it is lower than 10
106
-     *
107
-     * @param i The string to be converted
108
-     * @return {string}
109
-     */
110
-    static toPaddedString(i: number): string {
111
-        return (i < 10 && i >= 0) ? "0" + i.toString(10) : i.toString(10);
121
+        const day = String(date.getDate()).padStart(2, '0');
122
+        const month = String(date.getMonth() + 1).padStart(2, '0'); //January is 0!
123
+        const year = date.getFullYear();
124
+        const hours = String(date.getHours()).padStart(2, '0');
125
+        const minutes = String(date.getMinutes()).padStart(2, '0');
126
+        const seconds = String(date.getSeconds()).padStart(2, '0');
127
+        return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
112 128
     }
113 129
 
114 130
     /**
@@ -118,7 +134,7 @@ export default class PlanningEventManager {
118 134
      *
119 135
      * If the end date is not specified or is equal to start time, only start time will be shown.
120 136
      *
121
-     * If the end date is not on the same day, 00:00 will be shown as end time
137
+     * If the end date is not on the same day, 23:59 will be shown as end time
122 138
      *
123 139
      * @param start Start time in YYYY-MM-DD HH:MM:SS format
124 140
      * @param end End time in YYYY-MM-DD HH:MM:SS format
@@ -130,19 +146,19 @@ export default class PlanningEventManager {
130 146
         let endDate = PlanningEventManager.stringToDate(end);
131 147
 
132 148
         if (startDate !== undefined && endDate !== undefined && startDate.getTime() !== endDate.getTime()) {
133
-            formattedStr = PlanningEventManager.toPaddedString(startDate.getHours()) + ':'
134
-                + PlanningEventManager.toPaddedString(startDate.getMinutes()) + ' - ';
149
+            formattedStr = String(startDate.getHours()).padStart(2, '0') + ':'
150
+                + String(startDate.getMinutes()).padStart(2, '0') + ' - ';
135 151
             if (endDate.getFullYear() > startDate.getFullYear()
136 152
                 || endDate.getMonth() > startDate.getMonth()
137 153
                 || endDate.getDate() > startDate.getDate())
138
-                formattedStr += '00:00';
154
+                formattedStr += '23:59';
139 155
             else
140
-                formattedStr += PlanningEventManager.toPaddedString(endDate.getHours()) + ':'
141
-                    + PlanningEventManager.toPaddedString(endDate.getMinutes());
156
+                formattedStr += String(endDate.getHours()).padStart(2, '0') + ':'
157
+                    + String(endDate.getMinutes()).padStart(2, '0');
142 158
         } else if (startDate !== undefined)
143 159
             formattedStr =
144
-                PlanningEventManager.toPaddedString(startDate.getHours()) + ':'
145
-                + PlanningEventManager.toPaddedString(startDate.getMinutes());
160
+                String(startDate.getHours()).padStart(2, '0') + ':'
161
+                + String(startDate.getMinutes()).padStart(2, '0');
146 162
 
147 163
         return formattedStr
148 164
     }

+ 15
- 14
utils/__test__/PlanningEventManager.test.js View File

@@ -17,16 +17,6 @@ test('isDescriptionEmpty', () => {
17 17
     expect(PlanningEventManager.isDescriptionEmpty("<p>coucou</p>")).toBeFalse();
18 18
 });
19 19
 
20
-test('toPaddedString', () => {
21
-    expect(PlanningEventManager.toPaddedString(-1)).toBe("-1");
22
-    expect(PlanningEventManager.toPaddedString(0)).toBe("00");
23
-    expect(PlanningEventManager.toPaddedString(1)).toBe("01");
24
-    expect(PlanningEventManager.toPaddedString(2)).toBe("02");
25
-    expect(PlanningEventManager.toPaddedString(10)).toBe("10");
26
-    expect(PlanningEventManager.toPaddedString(53)).toBe("53");
27
-    expect(PlanningEventManager.toPaddedString(100)).toBe("100");
28
-});
29
-
30 20
 test('isEventDateStringFormatValid', () => {
31 21
     expect(PlanningEventManager.isEventDateStringFormatValid("2020-03-21 09:00:00")).toBeTrue();
32 22
     expect(PlanningEventManager.isEventDateStringFormatValid("3214-64-12 01:16:65")).toBeTrue();
@@ -77,7 +67,7 @@ test('getFormattedEventTime', () => {
77 67
     expect(PlanningEventManager.getFormattedEventTime("2020-03-21 09:00:00", "2020-03-21 09:00:00"))
78 68
         .toBe('09:00');
79 69
     expect(PlanningEventManager.getFormattedEventTime("2020-03-21 09:00:00", "2020-03-22 17:00:00"))
80
-        .toBe('09:00 - 00:00');
70
+        .toBe('09:00 - 23:59');
81 71
     expect(PlanningEventManager.getFormattedEventTime("2020-03-30 20:30:00", "2020-03-30 23:00:00"))
82 72
         .toBe('20:30 - 23:00');
83 73
 });
@@ -127,10 +117,21 @@ test('isEventBefore', () => {
127 117
 test('dateToString', () => {
128 118
     let testDate = new Date();
129 119
     testDate.setFullYear(2020, 2, 21);
130
-    expect(PlanningEventManager.dateToString(testDate)).toBe("2020-03-21");
120
+    testDate.setHours(9, 0, 0, 0);
121
+    expect(PlanningEventManager.dateToString(testDate)).toBe("2020-03-21 09:00:00");
131 122
     testDate.setFullYear(2021, 0, 12);
132
-    expect(PlanningEventManager.dateToString(testDate)).toBe("2021-01-12");
123
+    testDate.setHours(9, 10, 0, 0);
124
+    expect(PlanningEventManager.dateToString(testDate)).toBe("2021-01-12 09:10:00");
133 125
     testDate.setFullYear(2022, 11, 31);
134
-    expect(PlanningEventManager.dateToString(testDate)).toBe("2022-12-31");
126
+    testDate.setHours(9, 10, 15, 0);
127
+    expect(PlanningEventManager.dateToString(testDate)).toBe("2022-12-31 09:10:15");
135 128
 });
136 129
 
130
+test('getEventDaysNumber', () => {
131
+    expect(PlanningEventManager.getEventDaysNumber('2020-03-21 09:00:00', '2020-03-22 17:00:00')).toBe(2);
132
+    expect(PlanningEventManager.getEventDaysNumber('2020-03-21 09:00:00', '2020-03-21 17:00:00')).toBe(1);
133
+    expect(PlanningEventManager.getEventDaysNumber('2020-03-21 09:00:00', '2020-03-21 09:00:00')).toBe(1);
134
+    expect(PlanningEventManager.getEventDaysNumber('2020-03-21 09:gg:00', '2020-03-21 17:00:00')).toBe(0);
135
+    expect(PlanningEventManager.getEventDaysNumber('2020-03-21 09:00:00', undefined)).toBe(1);
136
+    expect(PlanningEventManager.getEventDaysNumber('2020-03-21 09:00:00', '2020-04-05 20:00:00')).toBe(16);
137
+});

Loading…
Cancel
Save