@apia/scheduler-controller 4.0.102 → 5.0.1

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.
@@ -0,0 +1,58 @@
1
+ import { TScheduleResult, TProcesses, TTskSchDay, TSchedulerState, IScheduleInitialProps, ISelectedDay, IStage } from './types.js';
2
+ import { TableController, CellState } from '@apia/table2-controller';
3
+
4
+ interface ISchedulerDataRetriever {
5
+ markDay(weekDay: string, hour: string, dayNumber: number): Promise<void>;
6
+ deleteDate(): Promise<boolean>;
7
+ loadWeek(weekDay: string, schId: string, proId: string, proVerId: string, tskId: string): Promise<TScheduleResult | null>;
8
+ loadInfo(schId: string, weekDay: string, dayNumber: number, hour: string): Promise<TProcesses | []>;
9
+ selectDayHandler(props: {
10
+ cellId: string;
11
+ weekDay: string;
12
+ dayNumber: number;
13
+ hour: string;
14
+ currentDayDefinition?: TTskSchDay;
15
+ controller?: Scheduler;
16
+ }): void;
17
+ }
18
+ declare class Scheduler {
19
+ retriever: ISchedulerDataRetriever;
20
+ type?: "RescheduleTskScheduler" | "Scheduler" | undefined;
21
+ window?: any | undefined;
22
+ state: TSchedulerState;
23
+ private inited;
24
+ protected readonly _tableController: TableController;
25
+ constructor(properties: IScheduleInitialProps, retriever: ISchedulerDataRetriever, type?: "RescheduleTskScheduler" | "Scheduler" | undefined, window?: any | undefined);
26
+ getState(): TSchedulerState;
27
+ setState(newState: Partial<TSchedulerState>): void;
28
+ get tableController(): TableController;
29
+ loadWeek(weekDay?: string): Promise<boolean>;
30
+ loadInfo(dayNumber: number, hour: string): Promise<{
31
+ id: number;
32
+ attributes: {
33
+ attribute: {
34
+ title: string;
35
+ value: string;
36
+ }[];
37
+ };
38
+ }[]>;
39
+ private parseRows;
40
+ private isMorningTime;
41
+ setDay(day: ISelectedDay): void;
42
+ setStage({ index, newStage }: {
43
+ index: number;
44
+ newStage: IStage;
45
+ }): void;
46
+ syncStage(day: TTskSchDay, hour: number): void;
47
+ makeDaysStage(data?: TScheduleResult): void;
48
+ private makeMorningOrAfternoonStage;
49
+ private makeHoursStage;
50
+ deleteDate(): Promise<void>;
51
+ goNextWeek(): Promise<void>;
52
+ goPreviousWeek(): Promise<void>;
53
+ parsedDateLabel: () => string;
54
+ getSchedulerColumns(data: TScheduleResult | null): CellState[];
55
+ }
56
+
57
+ export { type ISchedulerDataRetriever, Scheduler };
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,515 @@
1
+ import { TableController } from '@apia/table2-controller';
2
+ import { arrayOrArray, noNaN } from '@apia/util';
3
+ import dayjs from 'dayjs';
4
+ import { getLabel } from '@apia/util/src/labels';
5
+ import { dayFullWord, monthLabels } from './util.js';
6
+ import { makeObservable } from 'mobx';
7
+
8
+ var __defProp = Object.defineProperty;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __publicField = (obj, key, value) => {
11
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
12
+ return value;
13
+ };
14
+ const dateFormat = "DD/MM/YYYY";
15
+ function getCurrentDate() {
16
+ return dayjs().format(dateFormat);
17
+ }
18
+ const initState = {
19
+ isStageMounted: {},
20
+ stageData: [],
21
+ isLoading: "NotLoading",
22
+ initialProps: {
23
+ schId: "",
24
+ proId: "",
25
+ proVerId: "",
26
+ tskId: "",
27
+ showDisponibility: "false",
28
+ showAttributes: "false"
29
+ }
30
+ };
31
+ class Scheduler {
32
+ constructor(properties, retriever, type, window) {
33
+ this.retriever = retriever;
34
+ this.type = type;
35
+ this.window = window;
36
+ __publicField(this, "state");
37
+ __publicField(this, "inited", false);
38
+ __publicField(this, "_tableController");
39
+ __publicField(this, "parsedDateLabel", () => {
40
+ const mondayWeek = this.state?.data?.mondayWeek;
41
+ if (!mondayWeek) {
42
+ return "";
43
+ } else {
44
+ const monday = dayjs(mondayWeek, dateFormat);
45
+ const sunday = monday.add(6, "day");
46
+ const mondayDate = noNaN(monday.date());
47
+ const sundayDate = noNaN(sunday.date());
48
+ const mondayMonth = noNaN(monday.month());
49
+ const sundayMonth = noNaN(sunday.month());
50
+ const mondayYear = noNaN(monday.year());
51
+ const sundayYear = noNaN(sunday.year());
52
+ const getMonthLabel = (monthIndex) => monthLabels(this.window)[monthIndex];
53
+ if (mondayDate > sundayDate && mondayMonth < sundayMonth) {
54
+ return `${mondayDate} de ${getMonthLabel(mondayMonth)} - ${sundayDate} de ${getMonthLabel(sundayMonth)}, ${mondayYear}`;
55
+ }
56
+ if (mondayMonth > sundayMonth) {
57
+ return `${mondayDate} de ${getMonthLabel(mondayMonth)}, ${mondayYear} - ${sundayDate} de ${getMonthLabel(sundayMonth)}, ${sundayYear}`;
58
+ }
59
+ return `${mondayDate} - ${sundayDate} de ${getMonthLabel(mondayMonth)}, ${mondayYear}`;
60
+ }
61
+ });
62
+ this.state = initState;
63
+ this.state.initialProps = properties;
64
+ makeObservable(this, { state: true, getState: true });
65
+ this._tableController = new TableController(
66
+ { labels: window?.labels },
67
+ {
68
+ allowEdition: false,
69
+ allowSelection: false,
70
+ isSelectionMultiple: false,
71
+ allowResize: false
72
+ }
73
+ );
74
+ }
75
+ getState() {
76
+ return this.state;
77
+ }
78
+ setState(newState) {
79
+ Object.entries(newState).forEach(([key, value]) => {
80
+ this.state[key] = value;
81
+ });
82
+ }
83
+ get tableController() {
84
+ return this._tableController;
85
+ }
86
+ async loadWeek(weekDay = getCurrentDate()) {
87
+ const { schId, proId, proVerId, tskId } = this.state.initialProps;
88
+ const data = await this.retriever.loadWeek(
89
+ weekDay,
90
+ schId,
91
+ proId,
92
+ proVerId,
93
+ tskId
94
+ );
95
+ if (data) {
96
+ this.state.data = data;
97
+ this.makeDaysStage(data);
98
+ const rows = this.parseRows(data);
99
+ if (!this.inited) {
100
+ this.inited = true;
101
+ const tableJson = {
102
+ columns: this.getSchedulerColumns(data),
103
+ rows,
104
+ filters: []
105
+ };
106
+ this.tableController.build(tableJson);
107
+ } else {
108
+ this.tableController.head.getState("rows").forEach((r) => {
109
+ r.cells.forEach((cell, cellIndex) => {
110
+ const newCell = this.getSchedulerColumns(data)[cellIndex];
111
+ if (newCell) {
112
+ if (cellIndex !== 0) {
113
+ cell.setState((cellState) => {
114
+ return {
115
+ ...cellState,
116
+ content: newCell.content
117
+ };
118
+ });
119
+ }
120
+ }
121
+ });
122
+ });
123
+ this.tableController.body.getState("rows").forEach((r, i) => {
124
+ r.cells.forEach((cell, cellIndex) => {
125
+ const newCell = rows[i]?.cells?.[cellIndex];
126
+ if (newCell) {
127
+ cell.setState((cellState) => {
128
+ return {
129
+ ...cellState,
130
+ content: newCell.content,
131
+ properties: newCell.properties,
132
+ domProperties: newCell.domProperties
133
+ };
134
+ });
135
+ }
136
+ });
137
+ });
138
+ }
139
+ this.state.isLoading = "NotLoading";
140
+ return true;
141
+ } else {
142
+ this.state.isLoading = "NotLoading";
143
+ return false;
144
+ }
145
+ }
146
+ async loadInfo(dayNumber, hour) {
147
+ if (this.state.data?.tskSchId && this.state.data?.mondayWeek) {
148
+ const processes = await this.retriever.loadInfo(
149
+ this.state.data.tskSchId,
150
+ this.state.data.mondayWeek,
151
+ dayNumber,
152
+ hour
153
+ );
154
+ return arrayOrArray(processes);
155
+ }
156
+ return [];
157
+ }
158
+ parseRows(data) {
159
+ const retrievedDays = arrayOrArray(data?.tskSchDay);
160
+ const hourIndexes = arrayOrArray(
161
+ retrievedDays.find((c) => c?.tskSchHour)?.tskSchHour
162
+ );
163
+ const columnsWithOutHour = this.getSchedulerColumns(data).slice(1);
164
+ const newRows = hourIndexes.map((hour, rowIdx) => {
165
+ if (hour.disabled)
166
+ return null;
167
+ const currentDate = dayjs();
168
+ const currentHour = Number(dayjs().format("HHmm"));
169
+ const newRow = {
170
+ id: hour.hour,
171
+ cells: [
172
+ {
173
+ colName: "hour",
174
+ content: `${hour.hour.slice(0, -2)}:${hour.hour.slice(2)}`
175
+ },
176
+ ...columnsWithOutHour.map((_, colIdx) => {
177
+ const currentDayDefinition = retrievedDays[colIdx];
178
+ const currentHourDefinition = arrayOrArray(
179
+ currentDayDefinition?.tskSchHour
180
+ )[rowIdx];
181
+ const parsingDay = dayjs(currentDayDefinition?.day, dateFormat);
182
+ const parsingHour = Number(currentHourDefinition?.hour);
183
+ const isEnabled = !hour?.disabled && Number(currentHourDefinition?.value) + Number(this.state.data?.overassign) > 0 && (!(parsingDay.isSame(currentDate, "day") || parsingDay.isBefore(currentDate, "day")) || parsingDay.isSame(currentDate, "day") && currentHour <= parsingHour);
184
+ const isQueriedDisabled = hour?.disabled;
185
+ const returnCell = {
186
+ colName: columnsWithOutHour[colIdx].colName,
187
+ domProperties: {
188
+ className: isEnabled ? "" : "disabled"
189
+ },
190
+ properties: {
191
+ cellId: `${hour.hour}_${colIdx + 1}_${data?.mondayWeek ?? ""}`,
192
+ currentDayDefinition,
193
+ isEnabled,
194
+ isQueriedDisabled,
195
+ weekDay: data?.mondayWeek ?? "",
196
+ dayNumber: colIdx + 1,
197
+ hour: hour.hour,
198
+ value: Number(currentHourDefinition?.value),
199
+ valuePlusOverassign: Number(currentHourDefinition?.value) + Number(this.state.data?.overassign),
200
+ isOverassignClassName: !!(!Number(currentHourDefinition?.value) && Number(currentHourDefinition?.value) < Number(this.state.data?.overassign))
201
+ }
202
+ };
203
+ return returnCell;
204
+ }).filter((c) => c !== null)
205
+ ]
206
+ };
207
+ return newRow;
208
+ });
209
+ return newRows.filter((c) => c !== null);
210
+ }
211
+ isMorningTime(hour) {
212
+ if (Number(hour) < 1200)
213
+ return true;
214
+ return false;
215
+ }
216
+ setDay(day) {
217
+ if (!this.state.selectedDay)
218
+ this.state.selectedDay = {};
219
+ this.state.selectedDay = { ...this.state.selectedDay, ...day };
220
+ }
221
+ setStage({ index, newStage }) {
222
+ if (!this.state.stageData)
223
+ this.state.stageData = [];
224
+ this.state.stageData[index] = newStage;
225
+ this.state.stageData.splice(index + 1);
226
+ }
227
+ syncStage(day, hour) {
228
+ this.makeMorningOrAfternoonStage(day);
229
+ this.makeHoursStage(day, this.isMorningTime(hour));
230
+ }
231
+ makeDaysStage(data) {
232
+ const dayData = data ?? this.state.data;
233
+ const overassign = this.state.data?.overassign;
234
+ const availableDays = arrayOrArray(dayData?.tskSchDay).map((currentDay) => {
235
+ const isDisabled = !arrayOrArray(currentDay?.tskSchHour).find(
236
+ (hour) => {
237
+ const parsingDay = dayjs(currentDay.day, dateFormat);
238
+ const currentDate = dayjs();
239
+ const parsingHour = Number(hour.hour);
240
+ const currentHour = Number(dayjs().format("HHmm"));
241
+ if (hour.hour !== void 0 && noNaN(hour.value) + noNaN(overassign) >= 0 && !(parsingDay.isSame(currentDate, "day") || parsingDay.isBefore(currentDate, "day")) || parsingDay.isSame(currentDate, "day") && currentHour <= parsingHour && !hour.disabled) {
242
+ return true;
243
+ }
244
+ return false;
245
+ }
246
+ );
247
+ return { ...currentDay, isDisabled };
248
+ }) ?? [];
249
+ const availableDaysButtons = availableDays.map((c) => {
250
+ const parsingDay = dayjs(c.day, dateFormat);
251
+ const returnBtn = {
252
+ isDisabled: c.isDisabled,
253
+ "aria-label": dayFullWord(this.window)[dayjs(parsingDay).day()],
254
+ title: c.day,
255
+ label: `${dayFullWord(this.window)[dayjs(parsingDay).day()]},
256
+ ${dayjs(parsingDay).get("date")}`,
257
+ value: "",
258
+ isSelectedSelector: () => {
259
+ return this.state.selectedDay?.day === c.day;
260
+ },
261
+ action: () => {
262
+ const isLoading = this.state.isLoading;
263
+ if (isLoading !== "NotLoading")
264
+ return;
265
+ this.makeMorningOrAfternoonStage(c);
266
+ const monday = dayjs(dayData?.mondayWeek, dateFormat);
267
+ const current = dayjs(c.day, dateFormat);
268
+ const diffDays = current.diff(monday, "day");
269
+ const dayNumber = diffDays + 1;
270
+ this.setDay({
271
+ mondayWeek: dayData?.mondayWeek,
272
+ day: c.day,
273
+ dayNumber
274
+ });
275
+ }
276
+ };
277
+ return returnBtn;
278
+ });
279
+ this.setStage({
280
+ index: 0,
281
+ newStage: {
282
+ name: "daysList",
283
+ buttons: [...availableDaysButtons]
284
+ }
285
+ });
286
+ }
287
+ makeMorningOrAfternoonStage(day) {
288
+ const thisDate = day.day;
289
+ const hours = arrayOrArray(day.tskSchHour);
290
+ const isLoading = this.state.isLoading;
291
+ const overassign = this.state.data?.overassign;
292
+ const parsingDay = dayjs(thisDate, dateFormat);
293
+ const currentDate = dayjs();
294
+ const currentHour = Number(dayjs().format("HHmm"));
295
+ const morningHours = hours?.filter((hour) => {
296
+ return (parsingDay.isSame(currentDate, "day") && currentHour <= Number(hour.hour) || !parsingDay.isSame(currentDate, "day") && Number(hour.value) + Number(overassign) > 0) && Number(hour.hour) < 1200;
297
+ });
298
+ const afternoonHours = hours?.filter((hour) => {
299
+ return (parsingDay.isSame(currentDate, "day") && currentHour <= Number(hour.hour) || !parsingDay.isSame(currentDate, "day") && Number(hour.value) + Number(overassign) > 0) && Number(hour.hour) >= 1200;
300
+ });
301
+ const morningButton = {
302
+ isDisabled: (morningHours?.length ?? 0) === 0,
303
+ label: getLabel("lblSchedMorning").text,
304
+ title: getLabel("lblSchedMorning").text,
305
+ "aria-label": getLabel("lblSchedMorning").text,
306
+ value: "",
307
+ isSelectedSelector: () => {
308
+ return this.isMorningTime(
309
+ this.state.selectedDay?.morningOrAfternoonSelected
310
+ );
311
+ },
312
+ action: () => {
313
+ if (isLoading !== "NotLoading")
314
+ return;
315
+ this.setDay({
316
+ morningOrAfternoonSelected: 1100
317
+ });
318
+ const newStagesStringArray = [];
319
+ this.makeHoursStage(day, this.isMorningTime(1100));
320
+ this.setState({
321
+ stageList: newStagesStringArray
322
+ });
323
+ }
324
+ };
325
+ const afternoonButton = {
326
+ isDisabled: (afternoonHours?.length ?? 0) === 0,
327
+ label: getLabel("lblSchedAfternoon").text,
328
+ title: getLabel("lblSchedAfternoon").text,
329
+ "aria-label": getLabel("lblSchedAfternoon").text,
330
+ value: "",
331
+ isSelectedSelector: () => {
332
+ if (this.state.selectedDay?.morningOrAfternoonSelected) {
333
+ return !this.isMorningTime(
334
+ this.state.selectedDay?.morningOrAfternoonSelected
335
+ );
336
+ }
337
+ return false;
338
+ },
339
+ action: () => {
340
+ if (isLoading !== "NotLoading")
341
+ return;
342
+ this.setDay({
343
+ morningOrAfternoonSelected: 1300
344
+ });
345
+ this.makeHoursStage(day, this.isMorningTime(1300));
346
+ }
347
+ };
348
+ this.setStage({
349
+ index: 1,
350
+ newStage: {
351
+ name: "morningOrAfternoon",
352
+ buttons: [morningButton, afternoonButton].filter(
353
+ (current) => current !== null
354
+ )
355
+ }
356
+ });
357
+ }
358
+ makeHoursStage(day, isMorning) {
359
+ const thisDate = day.day;
360
+ const hours = arrayOrArray(day.tskSchHour);
361
+ const overassign = this.state.data?.overassign;
362
+ const parsingDay = dayjs(thisDate, dateFormat);
363
+ const currentDate = dayjs();
364
+ const currentHour = Number(dayjs().format("HHmm"));
365
+ const isLoading = this.state.isLoading;
366
+ let morningOrAfternoonHours;
367
+ if (isMorning) {
368
+ morningOrAfternoonHours = hours?.filter((hour) => {
369
+ return (parsingDay.isSame(currentDate, "day") && currentHour <= Number(hour.hour) || !parsingDay.isSame(currentDate, "day") && Number(hour.value) + Number(overassign) > 0) && Number(hour.hour) < 1200;
370
+ });
371
+ } else {
372
+ morningOrAfternoonHours = hours?.filter((hour) => {
373
+ return (parsingDay.isSame(currentDate, "day") && currentHour <= Number(hour.hour) || !parsingDay.isSame(currentDate, "day") && Number(hour.value) + Number(overassign) > 0) && Number(hour.hour) >= 1200;
374
+ });
375
+ }
376
+ const enableHours = morningOrAfternoonHours?.filter(
377
+ (hour) => !hour.disabled
378
+ );
379
+ this.setStage({
380
+ index: 2,
381
+ newStage: {
382
+ name: "daysHours",
383
+ buttons: enableHours?.map((hour) => {
384
+ const returnButton = {
385
+ title: hour.hour,
386
+ label: `${hour.hour.slice(0, -2)}:${hour.hour.slice(2)}`,
387
+ value: hour.value,
388
+ "aria-label": hour.hour,
389
+ isSelectedSelector: () => {
390
+ return this.state?.selectedDay?.hour === hour.hour;
391
+ },
392
+ action: () => {
393
+ if (isLoading !== "NotLoading")
394
+ return;
395
+ this.setState({
396
+ selectedCell: `${hour.hour} ${String(
397
+ this.state?.selectedDay?.dayNumber
398
+ )} ${this.state?.selectedDay?.mondayWeek}`
399
+ });
400
+ this.setDay({
401
+ hour: hour.hour,
402
+ mondayWeek: this.state?.selectedDay?.mondayWeek
403
+ });
404
+ if (this.state?.selectedDay?.dayNumber && this.state?.selectedDay?.mondayWeek && this.type !== "RescheduleTskScheduler") {
405
+ this.retriever.markDay(
406
+ this.state?.selectedDay?.mondayWeek,
407
+ hour.hour,
408
+ this.state?.selectedDay?.dayNumber
409
+ );
410
+ }
411
+ }
412
+ };
413
+ return returnButton;
414
+ })
415
+ }
416
+ });
417
+ }
418
+ async deleteDate() {
419
+ this.setState({ isLoading: "DeleteWeek" });
420
+ this.retriever.deleteDate().then((success) => {
421
+ if (success) {
422
+ this.setState({
423
+ selectedDay: {},
424
+ selectedCell: null,
425
+ isLoading: "NotLoading"
426
+ });
427
+ this.makeDaysStage();
428
+ }
429
+ }).catch(() => {
430
+ });
431
+ }
432
+ async goNextWeek() {
433
+ if (this.state.isLoading === "NotLoading") {
434
+ this.setState({ isLoading: "NextWeek" });
435
+ await this.loadWeek(
436
+ dayjs(this.state.data?.mondayWeek, dateFormat).add(7, "day").format(dateFormat)
437
+ );
438
+ this.makeDaysStage(this.state.data);
439
+ }
440
+ }
441
+ async goPreviousWeek() {
442
+ if (this.state.isLoading === "NotLoading") {
443
+ this.setState({ isLoading: "LastWeek" });
444
+ await this.loadWeek(
445
+ dayjs(this.state.data?.mondayWeek, dateFormat).subtract(7, "day").format(dateFormat)
446
+ );
447
+ this.makeDaysStage(this.state.data);
448
+ }
449
+ }
450
+ getSchedulerColumns(data) {
451
+ if (!data || !data.mondayWeek) {
452
+ return [];
453
+ }
454
+ const columns = [
455
+ {
456
+ content: getLabel("lblTime").text,
457
+ colName: "hour",
458
+ width: "75px"
459
+ },
460
+ {
461
+ content: `${getLabel("lblTskDayMon").text} ${dayjs(
462
+ data?.mondayWeek,
463
+ dateFormat
464
+ ).format("DD/MM")}`,
465
+ colName: "Monday"
466
+ },
467
+ {
468
+ content: `${getLabel("lblTskDayTue").text} ${dayjs(
469
+ data?.mondayWeek,
470
+ dateFormat
471
+ ).add(1, "day").format("DD/MM")}`,
472
+ colName: "Tuesday"
473
+ },
474
+ {
475
+ content: `${getLabel("lblTskDayWed").text} ${dayjs(
476
+ data?.mondayWeek,
477
+ dateFormat
478
+ ).add(2, "day").format("DD/MM")} `,
479
+ colName: "Wednesday"
480
+ },
481
+ {
482
+ content: `${getLabel("lblTskDayThu").text} ${dayjs(
483
+ data?.mondayWeek,
484
+ dateFormat
485
+ ).add(3, "day").format("DD/MM")}`,
486
+ colName: "Thursday"
487
+ },
488
+ {
489
+ content: `${getLabel("lblTskDayFri").text} ${dayjs(
490
+ data?.mondayWeek,
491
+ dateFormat
492
+ ).add(4, "day").format("DD/MM")}`,
493
+ colName: "Friday"
494
+ },
495
+ {
496
+ content: `${getLabel("lblTskDaySat").text} ${dayjs(
497
+ data?.mondayWeek,
498
+ dateFormat
499
+ ).add(5, "day").format("DD/MM")}`,
500
+ colName: "Saturday"
501
+ },
502
+ {
503
+ content: `${getLabel("lblTskDaySun").text} ${dayjs(
504
+ data?.mondayWeek,
505
+ dateFormat
506
+ ).add(6, "day").format("DD/MM")}`,
507
+ colName: "Sunday"
508
+ }
509
+ ];
510
+ return columns;
511
+ }
512
+ }
513
+
514
+ export { Scheduler, getCurrentDate };
515
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/Scheduler/index.ts"],"sourcesContent":["import {\r\n IScheduleInitialProps,\r\n ISelectedDay,\r\n IStage,\r\n IStageButton,\r\n TProcesses,\r\n TScheduleResult,\r\n TSchedulerState,\r\n TTskSchDay,\r\n} from './types';\r\nimport {\r\n CellState,\r\n TableController,\r\n TBuildRow,\r\n TBuildTable,\r\n} from '@apia/table2-controller';\r\n\r\nimport { arrayOrArray, noNaN, TDateFormat } from '@apia/util';\r\nimport dayjs from 'dayjs';\r\nimport { getLabel } from '@apia/util/src/labels';\r\nimport { dayFullWord, monthLabels } from './util';\r\nimport { makeObservable } from 'mobx';\r\n\r\nconst dateFormat: TDateFormat = 'DD/MM/YYYY';\r\nexport function getCurrentDate() {\r\n return dayjs().format(dateFormat);\r\n}\r\n\r\nexport interface ISchedulerDataRetriever {\r\n markDay(weekDay: string, hour: string, dayNumber: number): Promise<void>;\r\n deleteDate(): Promise<boolean>;\r\n loadWeek(\r\n weekDay: string,\r\n schId: string,\r\n proId: string,\r\n proVerId: string,\r\n tskId: string,\r\n ): Promise<TScheduleResult | null>;\r\n\r\n loadInfo(\r\n schId: string,\r\n weekDay: string,\r\n dayNumber: number,\r\n hour: string,\r\n ): Promise<TProcesses | []>;\r\n selectDayHandler(props: {\r\n cellId: string;\r\n weekDay: string;\r\n dayNumber: number;\r\n hour: string;\r\n currentDayDefinition?: TTskSchDay;\r\n controller?: Scheduler;\r\n }): void;\r\n}\r\n\r\nconst initState: TSchedulerState = {\r\n isStageMounted: {},\r\n stageData: [],\r\n isLoading: 'NotLoading',\r\n initialProps: {\r\n schId: '',\r\n proId: '',\r\n proVerId: '',\r\n tskId: '',\r\n showDisponibility: 'false',\r\n showAttributes: 'false',\r\n },\r\n};\r\n\r\nexport class Scheduler {\r\n public state: TSchedulerState;\r\n private inited = false;\r\n\r\n protected readonly _tableController: TableController;\r\n\r\n constructor(\r\n properties: IScheduleInitialProps,\r\n public retriever: ISchedulerDataRetriever,\r\n public type?: 'RescheduleTskScheduler' | 'Scheduler',\r\n public window?: any,\r\n ) {\r\n this.state = initState;\r\n this.state.initialProps = properties;\r\n makeObservable<Scheduler, 'state'>(this, { state: true, getState: true });\r\n\r\n this._tableController = new TableController(\r\n { labels: window?.labels },\r\n {\r\n allowEdition: false,\r\n allowSelection: false,\r\n isSelectionMultiple: false,\r\n allowResize: false,\r\n },\r\n );\r\n }\r\n getState(): TSchedulerState {\r\n return this.state;\r\n }\r\n public setState(newState: Partial<TSchedulerState>) {\r\n Object.entries(newState).forEach(([key, value]) => {\r\n (this.state[key as keyof TSchedulerState] as unknown) = value;\r\n });\r\n }\r\n\r\n public get tableController() {\r\n return this._tableController;\r\n }\r\n\r\n public async loadWeek(weekDay = getCurrentDate()): Promise<boolean> {\r\n const { schId, proId, proVerId, tskId } = this.state.initialProps;\r\n const data = await this.retriever.loadWeek(\r\n weekDay,\r\n schId,\r\n proId,\r\n proVerId,\r\n tskId,\r\n );\r\n\r\n if (data) {\r\n this.state.data = data;\r\n this.makeDaysStage(data);\r\n\r\n const rows = this.parseRows(data);\r\n\r\n if (!this.inited) {\r\n this.inited = true;\r\n const tableJson = {\r\n columns: this.getSchedulerColumns(data),\r\n rows,\r\n filters: [],\r\n } as TBuildTable;\r\n this.tableController.build(tableJson);\r\n } else {\r\n this.tableController.head.getState('rows').forEach((r) => {\r\n r.cells.forEach((cell, cellIndex) => {\r\n const newCell = this.getSchedulerColumns(data)[cellIndex];\r\n if (newCell) {\r\n if (cellIndex !== 0) {\r\n cell.setState((cellState) => {\r\n return {\r\n ...cellState,\r\n content: newCell.content,\r\n };\r\n });\r\n }\r\n }\r\n });\r\n });\r\n this.tableController.body.getState('rows').forEach((r, i) => {\r\n r.cells.forEach((cell, cellIndex) => {\r\n const newCell = rows[i]?.cells?.[cellIndex];\r\n if (newCell) {\r\n cell.setState((cellState) => {\r\n return {\r\n ...cellState,\r\n content: newCell.content,\r\n properties: newCell.properties,\r\n domProperties: newCell.domProperties,\r\n };\r\n });\r\n }\r\n });\r\n });\r\n }\r\n this.state.isLoading = 'NotLoading';\r\n return true;\r\n } else {\r\n this.state.isLoading = 'NotLoading';\r\n return false;\r\n }\r\n }\r\n\r\n public async loadInfo(dayNumber: number, hour: string) {\r\n if (this.state.data?.tskSchId && this.state.data?.mondayWeek) {\r\n const processes = await this.retriever.loadInfo(\r\n this.state.data.tskSchId,\r\n this.state.data.mondayWeek,\r\n dayNumber,\r\n hour,\r\n );\r\n\r\n return arrayOrArray(processes);\r\n }\r\n return [];\r\n }\r\n\r\n private parseRows(data: TScheduleResult): TBuildRow[] {\r\n const retrievedDays = arrayOrArray(data?.tskSchDay);\r\n const hourIndexes = arrayOrArray(\r\n retrievedDays.find((c) => c?.tskSchHour)?.tskSchHour,\r\n );\r\n const columnsWithOutHour = this.getSchedulerColumns(data).slice(1);\r\n\r\n const newRows = hourIndexes.map((hour, rowIdx) => {\r\n if (hour.disabled) return null;\r\n const currentDate = dayjs();\r\n const currentHour = Number(dayjs().format('HHmm'));\r\n const newRow: TBuildRow = {\r\n id: hour.hour,\r\n cells: [\r\n {\r\n colName: 'hour',\r\n content: `${hour.hour.slice(0, -2)}:${hour.hour.slice(2)}`,\r\n },\r\n ...columnsWithOutHour\r\n .map((_, colIdx) => {\r\n const currentDayDefinition = retrievedDays[colIdx];\r\n const currentHourDefinition = arrayOrArray(\r\n currentDayDefinition?.tskSchHour,\r\n )[rowIdx];\r\n\r\n const parsingDay = dayjs(currentDayDefinition?.day, dateFormat);\r\n const parsingHour = Number(currentHourDefinition?.hour);\r\n\r\n const isEnabled =\r\n !hour?.disabled &&\r\n Number(currentHourDefinition?.value) +\r\n Number(this.state.data?.overassign) >\r\n 0 &&\r\n (!(\r\n parsingDay.isSame(currentDate, 'day') ||\r\n parsingDay.isBefore(currentDate, 'day')\r\n ) ||\r\n (parsingDay.isSame(currentDate, 'day') &&\r\n currentHour <= parsingHour));\r\n\r\n const isQueriedDisabled = hour?.disabled;\r\n\r\n const returnCell: CellState = {\r\n colName: columnsWithOutHour[colIdx].colName,\r\n domProperties: {\r\n className: isEnabled ? '' : 'disabled',\r\n },\r\n properties: {\r\n cellId: `${hour.hour}_${colIdx + 1}_${\r\n data?.mondayWeek ?? ''\r\n }`,\r\n currentDayDefinition,\r\n isEnabled,\r\n isQueriedDisabled,\r\n weekDay: data?.mondayWeek ?? '',\r\n dayNumber: colIdx + 1,\r\n hour: hour.hour,\r\n value: Number(currentHourDefinition?.value),\r\n valuePlusOverassign:\r\n Number(currentHourDefinition?.value) +\r\n Number(this.state.data?.overassign),\r\n isOverassignClassName: !!(\r\n !Number(currentHourDefinition?.value) &&\r\n Number(currentHourDefinition?.value) <\r\n Number(this.state.data?.overassign)\r\n ),\r\n },\r\n };\r\n return returnCell;\r\n })\r\n .filter((c): c is CellState => c !== null),\r\n ],\r\n };\r\n\r\n return newRow;\r\n });\r\n\r\n return newRows.filter((c): c is TBuildRow => c !== null);\r\n }\r\n\r\n private isMorningTime(hour: number) {\r\n if (Number(hour) < 1200) return true;\r\n return false;\r\n }\r\n\r\n public setDay(day: ISelectedDay) {\r\n if (!this.state.selectedDay) this.state.selectedDay = {};\r\n this.state.selectedDay = { ...this.state.selectedDay, ...day };\r\n }\r\n\r\n public setStage({ index, newStage }: { index: number; newStage: IStage }) {\r\n if (!this.state.stageData) this.state.stageData = [];\r\n this.state.stageData[index] = newStage;\r\n this.state.stageData.splice(index + 1);\r\n }\r\n\r\n public syncStage(day: TTskSchDay, hour: number) {\r\n this.makeMorningOrAfternoonStage(day);\r\n this.makeHoursStage(day, this.isMorningTime(hour));\r\n }\r\n\r\n public makeDaysStage(data?: TScheduleResult) {\r\n const dayData = data ?? this.state.data;\r\n const overassign = this.state.data?.overassign;\r\n\r\n const availableDays =\r\n arrayOrArray(dayData?.tskSchDay).map((currentDay) => {\r\n const isDisabled = !arrayOrArray(currentDay?.tskSchHour).find(\r\n (hour) => {\r\n const parsingDay = dayjs(currentDay.day, dateFormat);\r\n const currentDate = dayjs();\r\n const parsingHour = Number(hour.hour);\r\n const currentHour = Number(dayjs().format('HHmm'));\r\n\r\n if (\r\n (hour.hour !== undefined &&\r\n noNaN(hour.value) + noNaN(overassign) >= 0 &&\r\n !(\r\n parsingDay.isSame(currentDate, 'day') ||\r\n parsingDay.isBefore(currentDate, 'day')\r\n )) ||\r\n (parsingDay.isSame(currentDate, 'day') &&\r\n currentHour <= parsingHour &&\r\n !hour.disabled)\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n },\r\n );\r\n\r\n return { ...currentDay, isDisabled };\r\n }) ?? [];\r\n\r\n const availableDaysButtons = availableDays.map((c) => {\r\n const parsingDay = dayjs(c.day, dateFormat);\r\n const returnBtn: IStageButton = {\r\n isDisabled: c.isDisabled,\r\n 'aria-label': dayFullWord(this.window)[dayjs(parsingDay).day()],\r\n title: c.day,\r\n label: `${dayFullWord(this.window)[dayjs(parsingDay).day()]}, \r\n ${dayjs(parsingDay).get('date')}`,\r\n value: '',\r\n isSelectedSelector: () => {\r\n return this.state.selectedDay?.day === c.day;\r\n },\r\n\r\n action: () => {\r\n const isLoading = this.state.isLoading;\r\n if (isLoading !== 'NotLoading') return;\r\n\r\n this.makeMorningOrAfternoonStage(c);\r\n const monday = dayjs(dayData?.mondayWeek, dateFormat);\r\n const current = dayjs(c.day, dateFormat);\r\n\r\n const diffDays = current.diff(monday, 'day');\r\n\r\n const dayNumber = diffDays + 1;\r\n\r\n this.setDay({\r\n mondayWeek: dayData?.mondayWeek,\r\n day: c.day,\r\n dayNumber,\r\n });\r\n },\r\n };\r\n\r\n return returnBtn;\r\n });\r\n\r\n this.setStage({\r\n index: 0,\r\n newStage: {\r\n name: 'daysList',\r\n buttons: [...availableDaysButtons],\r\n },\r\n });\r\n }\r\n\r\n private makeMorningOrAfternoonStage(day: TTskSchDay) {\r\n const thisDate = day.day;\r\n const hours = arrayOrArray(day.tskSchHour);\r\n const isLoading = this.state.isLoading;\r\n\r\n const overassign = this.state.data?.overassign;\r\n const parsingDay = dayjs(thisDate, dateFormat);\r\n const currentDate = dayjs();\r\n const currentHour = Number(dayjs().format('HHmm'));\r\n\r\n const morningHours = hours?.filter((hour) => {\r\n return (\r\n ((parsingDay.isSame(currentDate, 'day') &&\r\n currentHour <= Number(hour.hour)) ||\r\n (!parsingDay.isSame(currentDate, 'day') &&\r\n Number(hour.value) + Number(overassign) > 0)) &&\r\n Number(hour.hour) < 1200\r\n );\r\n });\r\n const afternoonHours = hours?.filter((hour) => {\r\n return (\r\n ((parsingDay.isSame(currentDate, 'day') &&\r\n currentHour <= Number(hour.hour)) ||\r\n (!parsingDay.isSame(currentDate, 'day') &&\r\n Number(hour.value) + Number(overassign) > 0)) &&\r\n Number(hour.hour) >= 1200\r\n );\r\n });\r\n\r\n const morningButton: IStageButton = {\r\n isDisabled: (morningHours?.length ?? 0) === 0,\r\n label: getLabel('lblSchedMorning').text,\r\n title: getLabel('lblSchedMorning').text,\r\n 'aria-label': getLabel('lblSchedMorning').text,\r\n value: '',\r\n isSelectedSelector: () => {\r\n return this.isMorningTime(\r\n this.state.selectedDay?.morningOrAfternoonSelected as number,\r\n );\r\n },\r\n action: () => {\r\n if (isLoading !== 'NotLoading') return;\r\n\r\n this.setDay({\r\n morningOrAfternoonSelected: 1100,\r\n });\r\n\r\n const newStagesStringArray: string[] = [];\r\n\r\n this.makeHoursStage(day, this.isMorningTime(1100));\r\n this.setState({\r\n stageList: newStagesStringArray,\r\n });\r\n },\r\n };\r\n\r\n const afternoonButton: IStageButton = {\r\n isDisabled: (afternoonHours?.length ?? 0) === 0,\r\n label: getLabel('lblSchedAfternoon').text,\r\n title: getLabel('lblSchedAfternoon').text,\r\n 'aria-label': getLabel('lblSchedAfternoon').text,\r\n value: '',\r\n isSelectedSelector: () => {\r\n if (this.state.selectedDay?.morningOrAfternoonSelected) {\r\n return !this.isMorningTime(\r\n this.state.selectedDay?.morningOrAfternoonSelected,\r\n );\r\n }\r\n return false;\r\n },\r\n action: () => {\r\n if (isLoading !== 'NotLoading') return;\r\n\r\n this.setDay({\r\n morningOrAfternoonSelected: 1300,\r\n });\r\n this.makeHoursStage(day, this.isMorningTime(1300));\r\n },\r\n };\r\n\r\n this.setStage({\r\n index: 1,\r\n newStage: {\r\n name: 'morningOrAfternoon',\r\n buttons: [morningButton, afternoonButton].filter(\r\n (current): current is IStageButton => current !== null,\r\n ),\r\n },\r\n });\r\n }\r\n\r\n private makeHoursStage(day: TTskSchDay, isMorning: boolean) {\r\n const thisDate = day.day;\r\n const hours = arrayOrArray(day.tskSchHour);\r\n const overassign = this.state.data?.overassign;\r\n const parsingDay = dayjs(thisDate, dateFormat);\r\n const currentDate = dayjs();\r\n const currentHour = Number(dayjs().format('HHmm'));\r\n const isLoading = this.state.isLoading;\r\n let morningOrAfternoonHours;\r\n\r\n if (isMorning) {\r\n morningOrAfternoonHours = hours?.filter((hour) => {\r\n return (\r\n ((parsingDay.isSame(currentDate, 'day') &&\r\n currentHour <= Number(hour.hour)) ||\r\n (!parsingDay.isSame(currentDate, 'day') &&\r\n Number(hour.value) + Number(overassign) > 0)) &&\r\n Number(hour.hour) < 1200\r\n );\r\n });\r\n } else {\r\n morningOrAfternoonHours = hours?.filter((hour) => {\r\n return (\r\n ((parsingDay.isSame(currentDate, 'day') &&\r\n currentHour <= Number(hour.hour)) ||\r\n (!parsingDay.isSame(currentDate, 'day') &&\r\n Number(hour.value) + Number(overassign) > 0)) &&\r\n Number(hour.hour) >= 1200\r\n );\r\n });\r\n }\r\n\r\n const enableHours = morningOrAfternoonHours?.filter(\r\n (hour) => !hour.disabled,\r\n );\r\n\r\n this.setStage({\r\n index: 2,\r\n newStage: {\r\n name: 'daysHours',\r\n buttons: enableHours?.map((hour) => {\r\n const returnButton: IStageButton = {\r\n title: hour.hour,\r\n label: `${hour.hour.slice(0, -2)}:${hour.hour.slice(2)}`,\r\n value: hour.value,\r\n 'aria-label': hour.hour,\r\n isSelectedSelector: () => {\r\n return this.state?.selectedDay?.hour === hour.hour;\r\n },\r\n action: () => {\r\n if (isLoading !== 'NotLoading') return;\r\n this.setState({\r\n selectedCell: `${hour.hour} ${String(\r\n this.state?.selectedDay?.dayNumber,\r\n )} ${this.state?.selectedDay?.mondayWeek as string}`,\r\n });\r\n this.setDay({\r\n hour: hour.hour,\r\n mondayWeek: this.state?.selectedDay?.mondayWeek,\r\n });\r\n if (\r\n this.state?.selectedDay?.dayNumber &&\r\n this.state?.selectedDay?.mondayWeek &&\r\n this.type !== 'RescheduleTskScheduler'\r\n ) {\r\n this.retriever.markDay(\r\n this.state?.selectedDay?.mondayWeek,\r\n hour.hour,\r\n this.state?.selectedDay?.dayNumber,\r\n );\r\n }\r\n },\r\n };\r\n\r\n return returnButton;\r\n }),\r\n },\r\n });\r\n }\r\n\r\n public async deleteDate() {\r\n this.setState({ isLoading: 'DeleteWeek' });\r\n\r\n this.retriever\r\n .deleteDate()\r\n .then((success) => {\r\n if (success) {\r\n this.setState({\r\n selectedDay: {},\r\n selectedCell: null,\r\n isLoading: 'NotLoading',\r\n });\r\n this.makeDaysStage();\r\n }\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n public async goNextWeek() {\r\n if (this.state.isLoading === 'NotLoading') {\r\n this.setState({ isLoading: 'NextWeek' });\r\n\r\n await this.loadWeek(\r\n dayjs(this.state.data?.mondayWeek, dateFormat)\r\n .add(7, 'day')\r\n .format(dateFormat),\r\n );\r\n this.makeDaysStage(this.state.data);\r\n }\r\n }\r\n\r\n public async goPreviousWeek() {\r\n if (this.state.isLoading === 'NotLoading') {\r\n this.setState({ isLoading: 'LastWeek' });\r\n await this.loadWeek(\r\n dayjs(this.state.data?.mondayWeek, dateFormat)\r\n .subtract(7, 'day')\r\n .format(dateFormat),\r\n );\r\n this.makeDaysStage(this.state.data);\r\n }\r\n }\r\n\r\n public parsedDateLabel = () => {\r\n const mondayWeek = this.state?.data?.mondayWeek;\r\n if (!mondayWeek) {\r\n return '';\r\n } else {\r\n const monday = dayjs(mondayWeek, dateFormat);\r\n const sunday = monday.add(6, 'day');\r\n\r\n const mondayDate = noNaN(monday.date());\r\n const sundayDate = noNaN(sunday.date());\r\n\r\n const mondayMonth = noNaN(monday.month());\r\n const sundayMonth = noNaN(sunday.month());\r\n\r\n const mondayYear = noNaN(monday.year());\r\n const sundayYear = noNaN(sunday.year());\r\n\r\n const getMonthLabel = (monthIndex: number) =>\r\n monthLabels(this.window)[monthIndex];\r\n\r\n if (mondayDate > sundayDate && mondayMonth < sundayMonth) {\r\n return `${mondayDate} de ${getMonthLabel(mondayMonth)} - ${sundayDate} de ${getMonthLabel(sundayMonth)}, ${mondayYear}`;\r\n }\r\n\r\n if (mondayMonth > sundayMonth) {\r\n return `${mondayDate} de ${getMonthLabel(mondayMonth)}, ${mondayYear} - ${sundayDate} de ${getMonthLabel(sundayMonth)}, ${sundayYear}`;\r\n }\r\n\r\n return `${mondayDate} - ${sundayDate} de ${getMonthLabel(mondayMonth)}, ${mondayYear}`;\r\n }\r\n };\r\n\r\n public getSchedulerColumns(data: TScheduleResult | null) {\r\n if (!data || !data.mondayWeek) {\r\n return [];\r\n }\r\n const columns = [\r\n {\r\n content: getLabel('lblTime').text,\r\n colName: 'hour',\r\n width: '75px',\r\n },\r\n {\r\n content: `${getLabel('lblTskDayMon').text} ${dayjs(\r\n data?.mondayWeek,\r\n dateFormat,\r\n ).format('DD/MM')}`,\r\n colName: 'Monday',\r\n },\r\n {\r\n content: `${getLabel('lblTskDayTue').text} ${dayjs(\r\n data?.mondayWeek,\r\n dateFormat,\r\n )\r\n .add(1, 'day')\r\n .format('DD/MM')}`,\r\n colName: 'Tuesday',\r\n },\r\n {\r\n content: `${getLabel('lblTskDayWed').text} ${dayjs(\r\n data?.mondayWeek,\r\n dateFormat,\r\n )\r\n .add(2, 'day')\r\n .format('DD/MM')} `,\r\n colName: 'Wednesday',\r\n },\r\n {\r\n content: `${getLabel('lblTskDayThu').text} ${dayjs(\r\n data?.mondayWeek,\r\n dateFormat,\r\n )\r\n .add(3, 'day')\r\n .format('DD/MM')}`,\r\n colName: 'Thursday',\r\n },\r\n {\r\n content: `${getLabel('lblTskDayFri').text} ${dayjs(\r\n data?.mondayWeek,\r\n dateFormat,\r\n )\r\n .add(4, 'day')\r\n .format('DD/MM')}`,\r\n colName: 'Friday',\r\n },\r\n {\r\n content: `${getLabel('lblTskDaySat').text} ${dayjs(\r\n data?.mondayWeek,\r\n dateFormat,\r\n )\r\n .add(5, 'day')\r\n .format('DD/MM')}`,\r\n colName: 'Saturday',\r\n },\r\n {\r\n content: `${getLabel('lblTskDaySun').text} ${dayjs(\r\n data?.mondayWeek,\r\n dateFormat,\r\n )\r\n .add(6, 'day')\r\n .format('DD/MM')}`,\r\n\r\n colName: 'Sunday',\r\n },\r\n ] as CellState[];\r\n return columns;\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}