@ngxsmk/cdk 1.3.2 → 3.0.0
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 +1 -1
- package/cva-base/cva-base.d.ts +34 -0
- package/cva-base/cva-base.d.ts.map +1 -0
- package/cva-base/index.d.ts +2 -0
- package/cva-base/index.d.ts.map +1 -0
- package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
- package/esm2022/cva-base/cva-base.mjs +45 -0
- package/esm2022/cva-base/index.mjs +2 -0
- package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
- package/esm2022/input-group/index.mjs +3 -0
- package/esm2022/input-group/input-group-engine.mjs +219 -0
- package/esm2022/input-group/models/index.mjs +2 -0
- package/esm2022/input-group/models/input-group.model.mjs +2 -0
- package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
- package/esm2022/listbox-keyboard/index.mjs +2 -0
- package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
- package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
- package/esm2022/public-api.mjs +10 -1
- package/esm2022/roving-focus/index.mjs +2 -0
- package/esm2022/roving-focus/ngxsmk-cdk-roving-focus.mjs +5 -0
- package/esm2022/roving-focus/roving-focus.mjs +176 -0
- package/esm2022/scheduler/index.mjs +5 -0
- package/esm2022/scheduler/models/date-range.mjs +2 -0
- package/esm2022/scheduler/models/event.model.mjs +2 -0
- package/esm2022/scheduler/models/index.mjs +6 -0
- package/esm2022/scheduler/models/resource.model.mjs +5 -0
- package/esm2022/scheduler/models/selection.model.mjs +7 -0
- package/esm2022/scheduler/models/view.model.mjs +7 -0
- package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
- package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
- package/esm2022/scheduler/plugin/index.mjs +8 -0
- package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
- package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
- package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
- package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
- package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
- package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
- package/esm2022/scheduler/scheduler-engine.mjs +316 -0
- package/esm2022/scheduler/utils/date-utils.mjs +131 -0
- package/esm2022/scheduler/utils/index.mjs +3 -0
- package/esm2022/scheduler/utils/snap.mjs +24 -0
- package/esm2022/scroll-lock/scroll-lock.mjs +22 -5
- package/esm2022/skip-link/index.mjs +2 -0
- package/esm2022/skip-link/ngxsmk-cdk-skip-link.mjs +5 -0
- package/esm2022/skip-link/skip-link.mjs +33 -0
- package/esm2022/spreadsheet/index.mjs +5 -0
- package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
- package/esm2022/spreadsheet/models/column.model.mjs +2 -0
- package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
- package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
- package/esm2022/spreadsheet/models/index.mjs +8 -0
- package/esm2022/spreadsheet/models/row.model.mjs +2 -0
- package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
- package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
- package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
- package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
- package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
- package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
- package/esm2022/spreadsheet/plugin/index.mjs +10 -0
- package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
- package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
- package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
- package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
- package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
- package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
- package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
- package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
- package/esm2022/spreadsheet/utils/index.mjs +2 -0
- package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
- package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-roving-focus.mjs +183 -0
- package/fesm2022/ngxsmk-cdk-roving-focus.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-scroll-lock.mjs +21 -4
- package/fesm2022/ngxsmk-cdk-scroll-lock.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk-skip-link.mjs +40 -0
- package/fesm2022/ngxsmk-cdk-skip-link.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk.mjs +5 -0
- package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
- package/input-group/index.d.ts +3 -0
- package/input-group/index.d.ts.map +1 -0
- package/input-group/input-group-engine.d.ts +88 -0
- package/input-group/input-group-engine.d.ts.map +1 -0
- package/input-group/models/index.d.ts +2 -0
- package/input-group/models/index.d.ts.map +1 -0
- package/input-group/models/input-group.model.d.ts +114 -0
- package/input-group/models/input-group.model.d.ts.map +1 -0
- package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
- package/listbox-keyboard/index.d.ts +2 -0
- package/listbox-keyboard/index.d.ts.map +1 -0
- package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
- package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
- package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
- package/package.json +59 -17
- package/public-api.d.ts +8 -0
- package/public-api.d.ts.map +1 -1
- package/roving-focus/index.d.ts +2 -0
- package/roving-focus/index.d.ts.map +1 -0
- package/roving-focus/ngxsmk-cdk-roving-focus.d.ts.map +1 -0
- package/roving-focus/roving-focus.d.ts +61 -0
- package/roving-focus/roving-focus.d.ts.map +1 -0
- package/scheduler/index.d.ts +5 -0
- package/scheduler/index.d.ts.map +1 -0
- package/scheduler/models/date-range.d.ts +6 -0
- package/scheduler/models/date-range.d.ts.map +1 -0
- package/scheduler/models/event.model.d.ts +50 -0
- package/scheduler/models/event.model.d.ts.map +1 -0
- package/scheduler/models/index.d.ts +6 -0
- package/scheduler/models/index.d.ts.map +1 -0
- package/scheduler/models/resource.model.d.ts +16 -0
- package/scheduler/models/resource.model.d.ts.map +1 -0
- package/scheduler/models/selection.model.d.ts +12 -0
- package/scheduler/models/selection.model.d.ts.map +1 -0
- package/scheduler/models/view.model.d.ts +21 -0
- package/scheduler/models/view.model.d.ts.map +1 -0
- package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
- package/scheduler/plugin/drag-plugin.d.ts +28 -0
- package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
- package/scheduler/plugin/index.d.ts +8 -0
- package/scheduler/plugin/index.d.ts.map +1 -0
- package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
- package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
- package/scheduler/plugin/plugin-host.d.ts +16 -0
- package/scheduler/plugin/plugin-host.d.ts.map +1 -0
- package/scheduler/plugin/plugin.types.d.ts +9 -0
- package/scheduler/plugin/plugin.types.d.ts.map +1 -0
- package/scheduler/plugin/resize-plugin.d.ts +26 -0
- package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
- package/scheduler/plugin/selection-plugin.d.ts +40 -0
- package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
- package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
- package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
- package/scheduler/scheduler-engine.d.ts +95 -0
- package/scheduler/scheduler-engine.d.ts.map +1 -0
- package/scheduler/utils/date-utils.d.ts +26 -0
- package/scheduler/utils/date-utils.d.ts.map +1 -0
- package/scheduler/utils/index.d.ts +3 -0
- package/scheduler/utils/index.d.ts.map +1 -0
- package/scheduler/utils/snap.d.ts +7 -0
- package/scheduler/utils/snap.d.ts.map +1 -0
- package/scroll-lock/scroll-lock.d.ts +2 -0
- package/scroll-lock/scroll-lock.d.ts.map +1 -1
- package/skip-link/index.d.ts +2 -0
- package/skip-link/index.d.ts.map +1 -0
- package/skip-link/ngxsmk-cdk-skip-link.d.ts.map +1 -0
- package/skip-link/skip-link.d.ts +18 -0
- package/skip-link/skip-link.d.ts.map +1 -0
- package/spreadsheet/index.d.ts +5 -0
- package/spreadsheet/index.d.ts.map +1 -0
- package/spreadsheet/models/cell.model.d.ts +44 -0
- package/spreadsheet/models/cell.model.d.ts.map +1 -0
- package/spreadsheet/models/column.model.d.ts +77 -0
- package/spreadsheet/models/column.model.d.ts.map +1 -0
- package/spreadsheet/models/filter.model.d.ts +15 -0
- package/spreadsheet/models/filter.model.d.ts.map +1 -0
- package/spreadsheet/models/formula.model.d.ts +65 -0
- package/spreadsheet/models/formula.model.d.ts.map +1 -0
- package/spreadsheet/models/index.d.ts +8 -0
- package/spreadsheet/models/index.d.ts.map +1 -0
- package/spreadsheet/models/row.model.d.ts +33 -0
- package/spreadsheet/models/row.model.d.ts.map +1 -0
- package/spreadsheet/models/selection.model.d.ts +18 -0
- package/spreadsheet/models/selection.model.d.ts.map +1 -0
- package/spreadsheet/models/sort.model.d.ts +14 -0
- package/spreadsheet/models/sort.model.d.ts.map +1 -0
- package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
- package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
- package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/index.d.ts +10 -0
- package/spreadsheet/plugin/index.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin-host.d.ts +66 -0
- package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin.types.d.ts +58 -0
- package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
- package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
- package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
- package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
- package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
- package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
- package/spreadsheet/spreadsheet-engine.d.ts +194 -0
- package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
- package/spreadsheet/utils/cell-utils.d.ts +26 -0
- package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
- package/spreadsheet/utils/index.d.ts +2 -0
- package/spreadsheet/utils/index.d.ts.map +1 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
|
+
import { startOfDay, startOfWeek, endOfWeek, startOfMonth, endOfMonth, addDays, diffMinutes, isSameDay, dateRangeOverlaps, } from './utils/date-utils';
|
|
3
|
+
const HOUR_HEIGHT_MAP = {
|
|
4
|
+
compact: 48,
|
|
5
|
+
comfortable: 60,
|
|
6
|
+
dense: 36,
|
|
7
|
+
};
|
|
8
|
+
function computeRange(type, date, firstDayOfWeek) {
|
|
9
|
+
switch (type) {
|
|
10
|
+
case 'timeGridDay':
|
|
11
|
+
case 'dayGridDay':
|
|
12
|
+
case 'agenda':
|
|
13
|
+
return { start: startOfDay(date), end: addDays(startOfDay(date), 1) };
|
|
14
|
+
case 'timeGridWeek':
|
|
15
|
+
case 'dayGridWeek':
|
|
16
|
+
return { start: startOfWeek(date, firstDayOfWeek), end: endOfWeek(date, firstDayOfWeek) };
|
|
17
|
+
case 'timeGridWorkWeek': {
|
|
18
|
+
const weekStart = startOfWeek(date, firstDayOfWeek);
|
|
19
|
+
return { start: addDays(weekStart, 1), end: addDays(weekStart, 5) };
|
|
20
|
+
}
|
|
21
|
+
case 'timeGrid3Day':
|
|
22
|
+
return { start: startOfDay(date), end: addDays(startOfDay(date), 3) };
|
|
23
|
+
case 'dayGridMonth':
|
|
24
|
+
return { start: startOfMonth(date), end: endOfMonth(date) };
|
|
25
|
+
case 'timeline':
|
|
26
|
+
return { start: startOfWeek(date, firstDayOfWeek), end: endOfWeek(date, firstDayOfWeek) };
|
|
27
|
+
default:
|
|
28
|
+
return { start: startOfWeek(date, firstDayOfWeek), end: endOfWeek(date, firstDayOfWeek) };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class SchedulerEngine {
|
|
32
|
+
constructor(config = {}) {
|
|
33
|
+
this.now = signal(new Date());
|
|
34
|
+
this._config = config;
|
|
35
|
+
const firstDay = config.firstDayOfWeek ?? 1;
|
|
36
|
+
const date = config.date ?? new Date();
|
|
37
|
+
const view = config.defaultView ?? 'timeGridWeek';
|
|
38
|
+
const range = computeRange(view, date, firstDay);
|
|
39
|
+
this._lifecycle = {
|
|
40
|
+
beforeRender: signal(() => true),
|
|
41
|
+
afterRender: signal(() => {
|
|
42
|
+
/* noop */
|
|
43
|
+
}),
|
|
44
|
+
beforeCreate: signal(() => true),
|
|
45
|
+
afterCreate: signal(() => {
|
|
46
|
+
/* noop */
|
|
47
|
+
}),
|
|
48
|
+
beforeUpdate: signal(() => true),
|
|
49
|
+
afterUpdate: signal(() => {
|
|
50
|
+
/* noop */
|
|
51
|
+
}),
|
|
52
|
+
beforeDelete: signal(() => true),
|
|
53
|
+
afterDelete: signal(() => {
|
|
54
|
+
/* noop */
|
|
55
|
+
}),
|
|
56
|
+
beforeDrag: signal(() => true),
|
|
57
|
+
afterDrag: signal(() => {
|
|
58
|
+
/* noop */
|
|
59
|
+
}),
|
|
60
|
+
beforeResize: signal(() => true),
|
|
61
|
+
afterResize: signal(() => {
|
|
62
|
+
/* noop */
|
|
63
|
+
}),
|
|
64
|
+
};
|
|
65
|
+
this.events = signal(config.initialEvents ?? []);
|
|
66
|
+
this.resources = signal(config.initialResources ?? []);
|
|
67
|
+
this.plugins = signal(config.plugins ?? []);
|
|
68
|
+
this.viewState = signal({
|
|
69
|
+
type: view,
|
|
70
|
+
date: new Date(date),
|
|
71
|
+
rangeStart: range.start,
|
|
72
|
+
rangeEnd: range.end,
|
|
73
|
+
slotDuration: config.slotDuration ?? 30,
|
|
74
|
+
snapDuration: config.snapDuration ?? 15,
|
|
75
|
+
visibleHours: config.visibleHours ?? [0, 24],
|
|
76
|
+
firstDayOfWeek: firstDay,
|
|
77
|
+
locale: config.locale ?? 'en-US',
|
|
78
|
+
rtl: config.rtl ?? false,
|
|
79
|
+
density: config.density ?? 'comfortable',
|
|
80
|
+
showAllDay: config.showAllDay ?? true,
|
|
81
|
+
showWeekends: config.showWeekends ?? true,
|
|
82
|
+
showCurrentTime: config.showCurrentTime ?? true,
|
|
83
|
+
});
|
|
84
|
+
this.selection = signal({
|
|
85
|
+
selectedEventIds: new Set(),
|
|
86
|
+
selectedRange: null,
|
|
87
|
+
multiSelect: false,
|
|
88
|
+
focusedCell: null,
|
|
89
|
+
});
|
|
90
|
+
this.hourHeight = computed(() => HOUR_HEIGHT_MAP[this.viewState().density] ?? 60);
|
|
91
|
+
this.visibleEvents = computed(() => {
|
|
92
|
+
const vs = this.viewState();
|
|
93
|
+
const events = this.events();
|
|
94
|
+
return events.filter((e) => !e.allDay && dateRangeOverlaps(e.start, e.end, vs.rangeStart, vs.rangeEnd));
|
|
95
|
+
});
|
|
96
|
+
this.allDayEvents = computed(() => {
|
|
97
|
+
const vs = this.viewState();
|
|
98
|
+
const events = this.events();
|
|
99
|
+
return events.filter((e) => e.allDay && dateRangeOverlaps(e.start, e.end, vs.rangeStart, vs.rangeEnd));
|
|
100
|
+
});
|
|
101
|
+
this.timedEvents = computed(() => this.visibleEvents());
|
|
102
|
+
this.weekDates = computed(() => {
|
|
103
|
+
const vs = this.viewState();
|
|
104
|
+
const start = vs.rangeStart;
|
|
105
|
+
const dates = [];
|
|
106
|
+
let current = new Date(start);
|
|
107
|
+
while (current < vs.rangeEnd) {
|
|
108
|
+
dates.push(new Date(current));
|
|
109
|
+
current = addDays(current, 1);
|
|
110
|
+
}
|
|
111
|
+
return dates;
|
|
112
|
+
});
|
|
113
|
+
this.dayNames = computed(() => {
|
|
114
|
+
const locale = this.viewState().locale;
|
|
115
|
+
return Array.from({ length: 7 }, (_, i) => {
|
|
116
|
+
const d = startOfWeek(new Date(), this.viewState().firstDayOfWeek);
|
|
117
|
+
d.setDate(d.getDate() + i);
|
|
118
|
+
return d.toLocaleDateString(locale, { weekday: 'short' });
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
this.weekLabel = computed(() => {
|
|
122
|
+
const vs = this.viewState();
|
|
123
|
+
return (vs.rangeStart.toLocaleDateString(vs.locale, {
|
|
124
|
+
month: 'short',
|
|
125
|
+
day: 'numeric',
|
|
126
|
+
}) +
|
|
127
|
+
' – ' +
|
|
128
|
+
vs.rangeEnd.toLocaleDateString(vs.locale, {
|
|
129
|
+
month: 'short',
|
|
130
|
+
day: 'numeric',
|
|
131
|
+
year: 'numeric',
|
|
132
|
+
}));
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
get lifecycle() {
|
|
136
|
+
return this._lifecycle;
|
|
137
|
+
}
|
|
138
|
+
// ── Navigation ──
|
|
139
|
+
next() {
|
|
140
|
+
const vs = this.viewState();
|
|
141
|
+
const date = addDays(vs.date, this._viewSpan(vs.type));
|
|
142
|
+
this._navigateTo(date);
|
|
143
|
+
}
|
|
144
|
+
previous() {
|
|
145
|
+
const vs = this.viewState();
|
|
146
|
+
const date = addDays(vs.date, -this._viewSpan(vs.type));
|
|
147
|
+
this._navigateTo(date);
|
|
148
|
+
}
|
|
149
|
+
today() {
|
|
150
|
+
this._navigateTo(new Date());
|
|
151
|
+
}
|
|
152
|
+
goto(date) {
|
|
153
|
+
this._navigateTo(date);
|
|
154
|
+
}
|
|
155
|
+
setView(type, date) {
|
|
156
|
+
const vs = this.viewState();
|
|
157
|
+
const refDate = date ?? vs.date;
|
|
158
|
+
const range = computeRange(type, refDate, vs.firstDayOfWeek);
|
|
159
|
+
this.viewState.update((s) => ({
|
|
160
|
+
...s,
|
|
161
|
+
type,
|
|
162
|
+
date: new Date(refDate),
|
|
163
|
+
rangeStart: range.start,
|
|
164
|
+
rangeEnd: range.end,
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
// ── Event Mutations ──
|
|
168
|
+
addEvent(event) {
|
|
169
|
+
if (!this._runHook(this._lifecycle.beforeCreate, event))
|
|
170
|
+
return;
|
|
171
|
+
this.events.update((evts) => [...evts, event]);
|
|
172
|
+
this._lifecycle.afterCreate()(event);
|
|
173
|
+
}
|
|
174
|
+
updateEvent(id, patch) {
|
|
175
|
+
const existing = this.events().find((e) => e.id === id);
|
|
176
|
+
if (!existing)
|
|
177
|
+
return;
|
|
178
|
+
const updated = { ...existing, ...patch };
|
|
179
|
+
if (!this._runHook(this._lifecycle.beforeUpdate, updated))
|
|
180
|
+
return;
|
|
181
|
+
this.events.update((evts) => evts.map((e) => (e.id === id ? updated : e)));
|
|
182
|
+
this._lifecycle.afterUpdate()(updated);
|
|
183
|
+
}
|
|
184
|
+
removeEvent(id) {
|
|
185
|
+
const existing = this.events().find((e) => e.id === id);
|
|
186
|
+
if (!existing)
|
|
187
|
+
return;
|
|
188
|
+
if (!this._runHook(this._lifecycle.beforeDelete, existing))
|
|
189
|
+
return;
|
|
190
|
+
this.events.update((evts) => evts.filter((e) => e.id !== id));
|
|
191
|
+
this._lifecycle.afterDelete()(existing);
|
|
192
|
+
}
|
|
193
|
+
moveEvent(id, newStart, newEnd, resourceId) {
|
|
194
|
+
const existing = this.events().find((e) => e.id === id);
|
|
195
|
+
if (!existing)
|
|
196
|
+
return;
|
|
197
|
+
const move = {
|
|
198
|
+
event: existing,
|
|
199
|
+
from: existing.start,
|
|
200
|
+
to: newStart,
|
|
201
|
+
newStart,
|
|
202
|
+
newEnd,
|
|
203
|
+
resourceId,
|
|
204
|
+
};
|
|
205
|
+
if (!this._runHook(this._lifecycle.beforeDrag, existing))
|
|
206
|
+
return;
|
|
207
|
+
this.events.update((evts) => evts.map((e) => e.id === id
|
|
208
|
+
? { ...e, start: newStart, end: newEnd, resourceId: resourceId ?? e.resourceId }
|
|
209
|
+
: e));
|
|
210
|
+
this._lifecycle.afterDrag()(move);
|
|
211
|
+
}
|
|
212
|
+
resizeEvent(id, newEnd) {
|
|
213
|
+
const existing = this.events().find((e) => e.id === id);
|
|
214
|
+
if (!existing)
|
|
215
|
+
return;
|
|
216
|
+
const resize = {
|
|
217
|
+
event: existing,
|
|
218
|
+
oldEnd: existing.end,
|
|
219
|
+
newEnd,
|
|
220
|
+
};
|
|
221
|
+
if (!this._runHook(this._lifecycle.beforeResize, existing))
|
|
222
|
+
return;
|
|
223
|
+
this.events.update((evts) => evts.map((e) => (e.id === id ? { ...e, end: newEnd } : e)));
|
|
224
|
+
this._lifecycle.afterResize()(resize);
|
|
225
|
+
}
|
|
226
|
+
// ── Selection ──
|
|
227
|
+
selectEvent(id, multi = false) {
|
|
228
|
+
this.selection.update((s) => {
|
|
229
|
+
const ids = new Set(multi ? s.selectedEventIds : []);
|
|
230
|
+
if (ids.has(id)) {
|
|
231
|
+
ids.delete(id);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
ids.add(id);
|
|
235
|
+
}
|
|
236
|
+
return { ...s, selectedEventIds: ids };
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
selectRange(start, end, resourceId) {
|
|
240
|
+
this.selection.update((s) => ({
|
|
241
|
+
...s,
|
|
242
|
+
selectedRange: { start, end, resourceId },
|
|
243
|
+
}));
|
|
244
|
+
}
|
|
245
|
+
clearSelection() {
|
|
246
|
+
this.selection.update((s) => ({
|
|
247
|
+
...s,
|
|
248
|
+
selectedEventIds: new Set(),
|
|
249
|
+
selectedRange: null,
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
252
|
+
isEventSelected(id) {
|
|
253
|
+
return this.selection().selectedEventIds.has(id);
|
|
254
|
+
}
|
|
255
|
+
// ── Queries ──
|
|
256
|
+
eventsForDay(day) {
|
|
257
|
+
return this.visibleEvents().filter((e) => isSameDay(e.start, day));
|
|
258
|
+
}
|
|
259
|
+
allDayEventsForDay(day) {
|
|
260
|
+
return this.allDayEvents().filter((e) => e.start.getTime() <= day.getTime() + 86_400_000 && e.end.getTime() >= day.getTime());
|
|
261
|
+
}
|
|
262
|
+
getEventsInRange(start, end) {
|
|
263
|
+
return this.events().filter((e) => dateRangeOverlaps(e.start, e.end, start, end));
|
|
264
|
+
}
|
|
265
|
+
eventTop(event) {
|
|
266
|
+
const hh = this.hourHeight();
|
|
267
|
+
return ((event.start.getHours() * 60 + event.start.getMinutes()) / 60) * hh;
|
|
268
|
+
}
|
|
269
|
+
eventHeight(event) {
|
|
270
|
+
const hh = this.hourHeight();
|
|
271
|
+
const durationMin = diffMinutes(event.start, event.end);
|
|
272
|
+
return Math.max((durationMin / 60) * hh, 18);
|
|
273
|
+
}
|
|
274
|
+
currentTimeY() {
|
|
275
|
+
const hh = this.hourHeight();
|
|
276
|
+
const now = this.now();
|
|
277
|
+
return ((now.getHours() * 60 + now.getMinutes()) / 60) * hh;
|
|
278
|
+
}
|
|
279
|
+
// ── Private ──
|
|
280
|
+
_navigateTo(date) {
|
|
281
|
+
const vs = this.viewState();
|
|
282
|
+
const range = computeRange(vs.type, date, vs.firstDayOfWeek);
|
|
283
|
+
this.viewState.update((s) => ({
|
|
284
|
+
...s,
|
|
285
|
+
date: new Date(date),
|
|
286
|
+
rangeStart: range.start,
|
|
287
|
+
rangeEnd: range.end,
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
_viewSpan(type) {
|
|
291
|
+
switch (type) {
|
|
292
|
+
case 'timeGridDay':
|
|
293
|
+
case 'dayGridDay':
|
|
294
|
+
case 'agenda':
|
|
295
|
+
return 1;
|
|
296
|
+
case 'timeGrid3Day':
|
|
297
|
+
return 3;
|
|
298
|
+
case 'timeGridWorkWeek':
|
|
299
|
+
case 'timeGridWeek':
|
|
300
|
+
case 'dayGridWeek':
|
|
301
|
+
return 7;
|
|
302
|
+
case 'dayGridMonth':
|
|
303
|
+
return 30;
|
|
304
|
+
case 'timeline':
|
|
305
|
+
return 7;
|
|
306
|
+
default:
|
|
307
|
+
return 7;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
_runHook(hook, arg) {
|
|
311
|
+
const fn = hook();
|
|
312
|
+
const result = fn(arg);
|
|
313
|
+
return result === false ? false : true;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLWVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay9zY2hlZHVsZXIvc2NoZWR1bGVyLWVuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFhbkYsT0FBTyxFQUNMLFVBQVUsRUFDVixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsT0FBTyxFQUNQLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sb0JBQW9CLENBQUM7QUFrQzVCLE1BQU0sZUFBZSxHQUE0QjtJQUMvQyxPQUFPLEVBQUUsRUFBRTtJQUNYLFdBQVcsRUFBRSxFQUFFO0lBQ2YsS0FBSyxFQUFFLEVBQUU7Q0FDVixDQUFDO0FBRUYsU0FBUyxZQUFZLENBQ25CLElBQWMsRUFDZCxJQUFVLEVBQ1YsY0FBc0I7SUFFdEIsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssYUFBYSxDQUFDO1FBQ25CLEtBQUssWUFBWSxDQUFDO1FBQ2xCLEtBQUssUUFBUTtZQUNYLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsS0FBSyxjQUFjLENBQUM7UUFDcEIsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQzVGLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFD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LEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIHNpZ25hbCwgdHlwZSBXcml0YWJsZVNpZ25hbCwgdHlwZSBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgU2NoZWR1bGVyRXZlbnQsXG4gIFNjaGVkdWxlclJlc291cmNlLFxuICBTY2hlZHVsZXJNb3ZlLFxuICBTY2hlZHVsZXJSZXNpemUsXG4gIFZpZXdTdGF0ZSxcbiAgVmlld1R5cGUsXG4gIFNlbGVjdGlvblN0YXRlLFxuICBXb3JraW5nSG91cnMsXG4gIERlbnNpdHksXG59IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB0eXBlIHsgU2NoZWR1bGVyUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLnR5cGVzJztcbmltcG9ydCB7XG4gIHN0YXJ0T2ZEYXksXG4gIHN0YXJ0T2ZXZWVrLFxuICBlbmRPZldlZWssXG4gIHN0YXJ0T2ZNb250aCxcbiAgZW5kT2ZNb250aCxcbiAgYWRkRGF5cyxcbiAgZGlmZk1pbnV0ZXMsXG4gIGlzU2FtZURheSxcbiAgZGF0ZVJhbmdlT3ZlcmxhcHMsXG59IGZyb20gJy4vdXRpbHMvZGF0ZS11dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyQ29uZmlnIHtcbiAgZGVmYXVsdFZpZXc/OiBWaWV3VHlwZTtcbiAgc2xvdER1cmF0aW9uPzogbnVtYmVyO1xuICBzbmFwRHVyYXRpb24/OiBudW1iZXI7XG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIHJ0bD86IGJvb2xlYW47XG4gIGRlbnNpdHk/OiBEZW5zaXR5O1xuICBzaG93QWxsRGF5PzogYm9vbGVhbjtcbiAgc2hvd1dlZWtlbmRzPzogYm9vbGVhbjtcbiAgc2hvd0N1cnJlbnRUaW1lPzogYm9vbGVhbjtcbiAgYnVzaW5lc3NIb3Vycz86IFdvcmtpbmdIb3VycztcbiAgdmlzaWJsZUhvdXJzPzogW251bWJlciwgbnVtYmVyXTtcbiAgcGx1Z2lucz86IFNjaGVkdWxlclBsdWdpbltdO1xuICBtYXhFdmVudHNQZXJDZWxsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZUhvb2tzIHtcbiAgYmVmb3JlUmVuZGVyOiBTaWduYWw8KHN0YXRlOiBWaWV3U3RhdGUpID0+IHZvaWQ+O1xuICBhZnRlclJlbmRlcjogU2lnbmFsPChzdGF0ZTogVmlld1N0YXRlKSA9PiB2b2lkPjtcbiAgYmVmb3JlQ3JlYXRlOiBTaWduYWw8KGV2ZW50OiBTY2hlZHVsZXJFdmVudCkgPT4gYm9vbGVhbj47XG4gIGFmdGVyQ3JlYXRlOiBTaWduYWw8KGV2ZW50OiBTY2hlZHVsZXJFdmVudCkgPT4gdm9pZD47XG4gIGJlZm9yZVVwZGF0ZTogU2lnbmFsPChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IGJvb2xlYW4+O1xuICBhZnRlclVwZGF0ZTogU2lnbmFsPChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IHZvaWQ+O1xuICBiZWZvcmVEZWxldGU6IFNpZ25hbDwoZXZlbnQ6IFNjaGVkdWxlckV2ZW50KSA9PiBib29sZWFuPjtcbiAgYWZ0ZXJEZWxldGU6IFNpZ25hbDwoZXZlbnQ6IFNjaGVkdWxlckV2ZW50KSA9PiB2b2lkPjtcbiAgYmVmb3JlRHJhZzogU2lnbmFsPChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IGJvb2xlYW4+O1xuICBhZnRlckRyYWc6IFNpZ25hbDwobW92ZTogU2NoZWR1bGVyTW92ZSkgPT4gdm9pZD47XG4gIGJlZm9yZVJlc2l6ZTogU2lnbmFsPChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IGJvb2xlYW4+O1xuICBhZnRlclJlc2l6ZTogU2lnbmFsPChyZXNpemU6IFNjaGVkdWxlclJlc2l6ZSkgPT4gdm9pZD47XG59XG5cbmNvbnN0IEhPVVJfSEVJR0hUX01BUDogUmVjb3JkPERlbnNpdHksIG51bWJlcj4gPSB7XG4gIGNvbXBhY3Q6IDQ4LFxuICBjb21mb3J0YWJsZTogNjAsXG4gIGRlbnNlOiAzNixcbn07XG5cbmZ1bmN0aW9uIGNvbXB1dGVSYW5nZShcbiAgdHlwZTogVmlld1R5cGUsXG4gIGRhdGU6IERhdGUsXG4gIGZpcnN0RGF5T2ZXZWVrOiBudW1iZXIsXG4pOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3RpbWVHcmlkRGF5JzpcbiAgICBjYXNlICdkYXlHcmlkRGF5JzpcbiAgICBjYXNlICdhZ2VuZGEnOlxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZEYXkoZGF0ZSksIGVuZDogYWRkRGF5cyhzdGFydE9mRGF5KGRhdGUpLCAxKSB9O1xuICAgIGNhc2UgJ3RpbWVHcmlkV2Vlayc6XG4gICAgY2FzZSAnZGF5R3JpZFdlZWsnOlxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKGRhdGUsIGZpcnN0RGF5T2ZXZWVrKSwgZW5kOiBlbmRPZldlZWsoZGF0ZSwgZmlyc3REYXlPZldlZWspIH07XG4gICAgY2FzZSAndGltZUdyaWRXb3JrV2Vlayc6IHtcbiAgICAgIGNvbnN0IHdlZWtTdGFydCA9IHN0YXJ0T2ZXZWVrKGRhdGUsIGZpcnN0RGF5T2ZXZWVrKTtcbiAgICAgIHJldHVybiB7IHN0YXJ0OiBhZGREYXlzKHdlZWtTdGFydCwgMSksIGVuZDogYWRkRGF5cyh3ZWVrU3RhcnQsIDUpIH07XG4gICAgfVxuICAgIGNhc2UgJ3RpbWVHcmlkM0RheSc6XG4gICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZkRheShkYXRlKSwgZW5kOiBhZGREYXlzKHN0YXJ0T2ZEYXkoZGF0ZSksIDMpIH07XG4gICAgY2FzZSAnZGF5R3JpZE1vbnRoJzpcbiAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mTW9udGgoZGF0ZSksIGVuZDogZW5kT2ZNb250aChkYXRlKSB9O1xuICAgIGNhc2UgJ3RpbWVsaW5lJzpcbiAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mV2VlayhkYXRlLCBmaXJzdERheU9mV2VlayksIGVuZDogZW5kT2ZXZWVrKGRhdGUsIGZpcnN0RGF5T2ZXZWVrKSB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZldlZWsoZGF0ZSwgZmlyc3REYXlPZldlZWspLCBlbmQ6IGVuZE9mV2VlayhkYXRlLCBmaXJzdERheU9mV2VlaykgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVyRW5naW5lIHtcbiAgcmVhZG9ubHkgZXZlbnRzOiBXcml0YWJsZVNpZ25hbDxTY2hlZHVsZXJFdmVudFtdPjtcbiAgcmVhZG9ubHkgcmVzb3VyY2VzOiBXcml0YWJsZVNpZ25hbDxTY2hlZHVsZXJSZXNvdXJjZVtdPjtcbiAgcmVhZG9ubHkgdmlld1N0YXRlOiBXcml0YWJsZVNpZ25hbDxWaWV3U3RhdGU+O1xuICByZWFkb25seSBzZWxlY3Rpb246IFdyaXRhYmxlU2lnbmFsPFNlbGVjdGlvblN0YXRlPjtcbiAgcmVhZG9ubHkgcGx1Z2luczogV3JpdGFibGVTaWduYWw8U2NoZWR1bGVyUGx1Z2luW10+O1xuICByZWFkb25seSBub3cgPSBzaWduYWwobmV3IERhdGUoKSk7XG5cbiAgcmVhZG9ubHkgaG91ckhlaWdodDogU2lnbmFsPG51bWJlcj47XG5cbiAgcmVhZG9ubHkgdmlzaWJsZUV2ZW50czogU2lnbmFsPFNjaGVkdWxlckV2ZW50W10+O1xuICByZWFkb25seSBhbGxEYXlFdmVudHM6IFNpZ25hbDxTY2hlZHVsZXJFdmVudFtdPjtcbiAgcmVhZG9ubHkgdGltZWRFdmVudHM6IFNpZ25hbDxTY2hlZHVsZXJFdmVudFtdPjtcbiAgcmVhZG9ubHkgd2Vla0RhdGVzOiBTaWduYWw8RGF0ZVtdPjtcbiAgcmVhZG9ubHkgZGF5TmFtZXM6IFNpZ25hbDxzdHJpbmdbXT47XG4gIHJlYWRvbmx5IHdlZWtMYWJlbDogU2lnbmFsPHN0cmluZz47XG5cbiAgcHJpdmF0ZSBfbGlmZWN5Y2xlOiBMaWZlY3ljbGVIb29rcztcbiAgcHJpdmF0ZSBfY29uZmlnOiBTY2hlZHVsZXJDb25maWc7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTY2hlZHVsZXJDb25maWcgPSB7fSkge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICBjb25zdCBmaXJzdERheSA9IGNvbmZpZy5maXJzdERheU9mV2VlayA/PyAxO1xuICAgIGNvbnN0IGRhdGUgPSBjb25maWcuZGF0ZSA/PyBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHZpZXcgPSBjb25maWcuZGVmYXVsdFZpZXcgPz8gJ3RpbWVHcmlkV2Vlayc7XG4gICAgY29uc3QgcmFuZ2UgPSBjb21wdXRlUmFuZ2UodmlldywgZGF0ZSwgZmlyc3REYXkpO1xuXG4gICAgdGhpcy5fbGlmZWN5Y2xlID0ge1xuICAgICAgYmVmb3JlUmVuZGVyOiBzaWduYWwoKCkgPT4gdHJ1ZSksXG4gICAgICBhZnRlclJlbmRlcjogc2lnbmFsKCgpID0+IHtcbiAgICAgICAgLyogbm9vcCAqL1xuICAgICAgfSksXG4gICAgICBiZWZvcmVDcmVhdGU6IHNpZ25hbCgoKSA9PiB0cnVlKSxcbiAgICAgIGFmdGVyQ3JlYXRlOiBzaWduYWwoKCkgPT4ge1xuICAgICAgICAvKiBub29wICovXG4gICAgICB9KSxcbiAgICAgIGJlZm9yZVVwZGF0ZTogc2lnbmFsKCgpID0+IHRydWUpLFxuICAgICAgYWZ0ZXJVcGRhdGU6IHNpZ25hbCgoKSA9PiB7XG4gICAgICAgIC8qIG5vb3AgKi9cbiAgICAgIH0pLFxuICAgICAgYmVmb3JlRGVsZXRlOiBzaWduYWwoKCkgPT4gdHJ1ZSksXG4gICAgICBhZnRlckRlbGV0ZTogc2lnbmFsKCgpID0+IHtcbiAgICAgICAgLyogbm9vcCAqL1xuICAgICAgfSksXG4gICAgICBiZWZvcmVEcmFnOiBzaWduYWwoKCkgPT4gdHJ1ZSksXG4gICAgICBhZnRlckRyYWc6IHNpZ25hbCgoKSA9PiB7XG4gICAgICAgIC8qIG5vb3AgKi9cbiAgICAgIH0pLFxuICAgICAgYmVmb3JlUmVzaXplOiBzaWduYWwoKCkgPT4gdHJ1ZSksXG4gICAgICBhZnRlclJlc2l6ZTogc2lnbmFsKCgpID0+IHtcbiAgICAgICAgLyogbm9vcCAqL1xuICAgICAgfSksXG4gICAgfTtcblxuICAgIHRoaXMuZXZlbnRzID0gc2lnbmFsKGNvbmZpZy5pbml0aWFsRXZlbnRzID8/IFtdKTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHNpZ25hbChjb25maWcuaW5pdGlhbFJlc291cmNlcyA/PyBbXSk7XG4gICAgdGhpcy5wbHVnaW5zID0gc2lnbmFsKGNvbmZpZy5wbHVnaW5zID8/IFtdKTtcblxuICAgIHRoaXMudmlld1N0YXRlID0gc2lnbmFsPFZpZXdTdGF0ZT4oe1xuICAgICAgdHlwZTogdmlldyxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGUpLFxuICAgICAgcmFuZ2VTdGFydDogcmFuZ2Uuc3RhcnQsXG4gICAgICByYW5nZUVuZDogcmFuZ2UuZW5kLFxuICAgICAgc2xvdER1cmF0aW9uOiBjb25maWcuc2xvdER1cmF0aW9uID8/IDMwLFxuICAgICAgc25hcER1cmF0aW9uOiBjb25maWcuc25hcER1cmF0aW9uID8/IDE1LFxuICAgICAgdmlzaWJsZUhvdXJzOiBjb25maWcudmlzaWJsZUhvdXJzID8/IFswLCAyNF0sXG4gICAgICBmaXJzdERheU9mV2VlazogZmlyc3REYXksXG4gICAgICBsb2NhbGU6IGNvbmZpZy5sb2NhbGUgPz8gJ2VuLVVTJyxcbiAgICAgIHJ0bDogY29uZmlnLnJ0bCA/PyBmYWxzZSxcbiAgICAgIGRlbnNpdHk6IGNvbmZpZy5kZW5zaXR5ID8/ICdjb21mb3J0YWJsZScsXG4gICAgICBzaG93QWxsRGF5OiBjb25maWcuc2hvd0FsbERheSA/PyB0cnVlLFxuICAgICAgc2hvd1dlZWtlbmRzOiBjb25maWcuc2hvd1dlZWtlbmRzID8/IHRydWUsXG4gICAgICBzaG93Q3VycmVudFRpbWU6IGNvbmZpZy5zaG93Q3VycmVudFRpbWUgPz8gdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uID0gc2lnbmFsPFNlbGVjdGlvblN0YXRlPih7XG4gICAgICBzZWxlY3RlZEV2ZW50SWRzOiBuZXcgU2V0KCksXG4gICAgICBzZWxlY3RlZFJhbmdlOiBudWxsLFxuICAgICAgbXVsdGlTZWxlY3Q6IGZhbHNlLFxuICAgICAgZm9jdXNlZENlbGw6IG51bGwsXG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdXJIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiBIT1VSX0hFSUdIVF9NQVBbdGhpcy52aWV3U3RhdGUoKS5kZW5zaXR5XSA/PyA2MCk7XG5cbiAgICB0aGlzLnZpc2libGVFdmVudHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCB2cyA9IHRoaXMudmlld1N0YXRlKCk7XG4gICAgICBjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cygpO1xuICAgICAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoXG4gICAgICAgIChlKSA9PiAhZS5hbGxEYXkgJiYgZGF0ZVJhbmdlT3ZlcmxhcHMoZS5zdGFydCwgZS5lbmQsIHZzLnJhbmdlU3RhcnQsIHZzLnJhbmdlRW5kKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFsbERheUV2ZW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHZzID0gdGhpcy52aWV3U3RhdGUoKTtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzKCk7XG4gICAgICByZXR1cm4gZXZlbnRzLmZpbHRlcihcbiAgICAgICAgKGUpID0+IGUuYWxsRGF5ICYmIGRhdGVSYW5nZU92ZXJsYXBzKGUuc3RhcnQsIGUuZW5kLCB2cy5yYW5nZVN0YXJ0LCB2cy5yYW5nZUVuZCksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy50aW1lZEV2ZW50cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlzaWJsZUV2ZW50cygpKTtcblxuICAgIHRoaXMud2Vla0RhdGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgdnMgPSB0aGlzLnZpZXdTdGF0ZSgpO1xuICAgICAgY29uc3Qgc3RhcnQgPSB2cy5yYW5nZVN0YXJ0O1xuICAgICAgY29uc3QgZGF0ZXM6IERhdGVbXSA9IFtdO1xuICAgICAgbGV0IGN1cnJlbnQgPSBuZXcgRGF0ZShzdGFydCk7XG4gICAgICB3aGlsZSAoY3VycmVudCA8IHZzLnJhbmdlRW5kKSB7XG4gICAgICAgIGRhdGVzLnB1c2gobmV3IERhdGUoY3VycmVudCkpO1xuICAgICAgICBjdXJyZW50ID0gYWRkRGF5cyhjdXJyZW50LCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRlcztcbiAgICB9KTtcblxuICAgIHRoaXMuZGF5TmFtZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLnZpZXdTdGF0ZSgpLmxvY2FsZTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgpLCB0aGlzLnZpZXdTdGF0ZSgpLmZpcnN0RGF5T2ZXZWVrKTtcbiAgICAgICAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgaSk7XG4gICAgICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ3Nob3J0JyB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy53ZWVrTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCB2cyA9IHRoaXMudmlld1N0YXRlKCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB2cy5yYW5nZVN0YXJ0LnRvTG9jYWxlRGF0ZVN0cmluZyh2cy5sb2NhbGUsIHtcbiAgICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgfSkgK1xuICAgICAgICAnIOKAkyAnICtcbiAgICAgICAgdnMucmFuZ2VFbmQudG9Mb2NhbGVEYXRlU3RyaW5nKHZzLmxvY2FsZSwge1xuICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGlmZWN5Y2xlKCk6IExpZmVjeWNsZUhvb2tzIHtcbiAgICByZXR1cm4gdGhpcy5fbGlmZWN5Y2xlO1xuICB9XG5cbiAgLy8g4pSA4pSAIE5hdmlnYXRpb24g4pSA4pSAXG5cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCB2cyA9IHRoaXMudmlld1N0YXRlKCk7XG4gICAgY29uc3QgZGF0ZSA9IGFkZERheXModnMuZGF0ZSwgdGhpcy5fdmlld1NwYW4odnMudHlwZSkpO1xuICAgIHRoaXMuX25hdmlnYXRlVG8oZGF0ZSk7XG4gIH1cblxuICBwcmV2aW91cygpOiB2b2lkIHtcbiAgICBjb25zdCB2cyA9IHRoaXMudmlld1N0YXRlKCk7XG4gICAgY29uc3QgZGF0ZSA9IGFkZERheXModnMuZGF0ZSwgLXRoaXMuX3ZpZXdTcGFuKHZzLnR5cGUpKTtcbiAgICB0aGlzLl9uYXZpZ2F0ZVRvKGRhdGUpO1xuICB9XG5cbiAgdG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5fbmF2aWdhdGVUbyhuZXcgRGF0ZSgpKTtcbiAgfVxuXG4gIGdvdG8oZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX25hdmlnYXRlVG8oZGF0ZSk7XG4gIH1cblxuICBzZXRWaWV3KHR5cGU6IFZpZXdUeXBlLCBkYXRlPzogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHZzID0gdGhpcy52aWV3U3RhdGUoKTtcbiAgICBjb25zdCByZWZEYXRlID0gZGF0ZSA/PyB2cy5kYXRlO1xuICAgIGNvbnN0IHJhbmdlID0gY29tcHV0ZVJhbmdlKHR5cGUsIHJlZkRhdGUsIHZzLmZpcnN0RGF5T2ZXZWVrKTtcbiAgICB0aGlzLnZpZXdTdGF0ZS51cGRhdGUoKHMpID0+ICh7XG4gICAgICAuLi5zLFxuICAgICAgdHlwZSxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKHJlZkRhdGUpLFxuICAgICAgcmFuZ2VTdGFydDogcmFuZ2Uuc3RhcnQsXG4gICAgICByYW5nZUVuZDogcmFuZ2UuZW5kLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFdmVudCBNdXRhdGlvbnMg4pSA4pSAXG5cbiAgYWRkRXZlbnQoZXZlbnQ6IFNjaGVkdWxlckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9ydW5Ib29rKHRoaXMuX2xpZmVjeWNsZS5iZWZvcmVDcmVhdGUsIGV2ZW50KSkgcmV0dXJuO1xuICAgIHRoaXMuZXZlbnRzLnVwZGF0ZSgoZXZ0cykgPT4gWy4uLmV2dHMsIGV2ZW50XSk7XG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyQ3JlYXRlKCkoZXZlbnQpO1xuICB9XG5cbiAgdXBkYXRlRXZlbnQoaWQ6IHN0cmluZywgcGF0Y2g6IFBhcnRpYWw8U2NoZWR1bGVyRXZlbnQ+KTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmV2ZW50cygpLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZCA9IHsgLi4uZXhpc3RpbmcsIC4uLnBhdGNoIH07XG4gICAgaWYgKCF0aGlzLl9ydW5Ib29rKHRoaXMuX2xpZmVjeWNsZS5iZWZvcmVVcGRhdGUsIHVwZGF0ZWQpKSByZXR1cm47XG4gICAgdGhpcy5ldmVudHMudXBkYXRlKChldnRzKSA9PiBldnRzLm1hcCgoZSkgPT4gKGUuaWQgPT09IGlkID8gdXBkYXRlZCA6IGUpKSk7XG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyVXBkYXRlKCkodXBkYXRlZCk7XG4gIH1cblxuICByZW1vdmVFdmVudChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmV2ZW50cygpLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLl9ydW5Ib29rKHRoaXMuX2xpZmVjeWNsZS5iZWZvcmVEZWxldGUsIGV4aXN0aW5nKSkgcmV0dXJuO1xuICAgIHRoaXMuZXZlbnRzLnVwZGF0ZSgoZXZ0cykgPT4gZXZ0cy5maWx0ZXIoKGUpID0+IGUuaWQgIT09IGlkKSk7XG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyRGVsZXRlKCkoZXhpc3RpbmcpO1xuICB9XG5cbiAgbW92ZUV2ZW50KGlkOiBzdHJpbmcsIG5ld1N0YXJ0OiBEYXRlLCBuZXdFbmQ6IERhdGUsIHJlc291cmNlSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZXZlbnRzKCkuZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybjtcblxuICAgIGNvbnN0IG1vdmU6IFNjaGVkdWxlck1vdmUgPSB7XG4gICAgICBldmVudDogZXhpc3RpbmcsXG4gICAgICBmcm9tOiBleGlzdGluZy5zdGFydCxcbiAgICAgIHRvOiBuZXdTdGFydCxcbiAgICAgIG5ld1N0YXJ0LFxuICAgICAgbmV3RW5kLFxuICAgICAgcmVzb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLl9ydW5Ib29rKHRoaXMuX2xpZmVjeWNsZS5iZWZvcmVEcmFnLCBleGlzdGluZykpIHJldHVybjtcblxuICAgIHRoaXMuZXZlbnRzLnVwZGF0ZSgoZXZ0cykgPT5cbiAgICAgIGV2dHMubWFwKChlKSA9PlxuICAgICAgICBlLmlkID09PSBpZFxuICAgICAgICAgID8geyAuLi5lLCBzdGFydDogbmV3U3RhcnQsIGVuZDogbmV3RW5kLCByZXNvdXJjZUlkOiByZXNvdXJjZUlkID8/IGUucmVzb3VyY2VJZCB9XG4gICAgICAgICAgOiBlLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyRHJhZygpKG1vdmUpO1xuICB9XG5cbiAgcmVzaXplRXZlbnQoaWQ6IHN0cmluZywgbmV3RW5kOiBEYXRlKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmV2ZW50cygpLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG5cbiAgICBjb25zdCByZXNpemU6IFNjaGVkdWxlclJlc2l6ZSA9IHtcbiAgICAgIGV2ZW50OiBleGlzdGluZyxcbiAgICAgIG9sZEVuZDogZXhpc3RpbmcuZW5kLFxuICAgICAgbmV3RW5kLFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuX3J1bkhvb2sodGhpcy5fbGlmZWN5Y2xlLmJlZm9yZVJlc2l6ZSwgZXhpc3RpbmcpKSByZXR1cm47XG5cbiAgICB0aGlzLmV2ZW50cy51cGRhdGUoKGV2dHMpID0+IGV2dHMubWFwKChlKSA9PiAoZS5pZCA9PT0gaWQgPyB7IC4uLmUsIGVuZDogbmV3RW5kIH0gOiBlKSkpO1xuXG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyUmVzaXplKCkocmVzaXplKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTZWxlY3Rpb24g4pSA4pSAXG5cbiAgc2VsZWN0RXZlbnQoaWQ6IHN0cmluZywgbXVsdGkgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZSgocykgPT4ge1xuICAgICAgY29uc3QgaWRzID0gbmV3IFNldChtdWx0aSA/IHMuc2VsZWN0ZWRFdmVudElkcyA6IFtdKTtcbiAgICAgIGlmIChpZHMuaGFzKGlkKSkge1xuICAgICAgICBpZHMuZGVsZXRlKGlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkcy5hZGQoaWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4ucywgc2VsZWN0ZWRFdmVudElkczogaWRzIH07XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RSYW5nZShzdGFydDogRGF0ZSwgZW5kOiBEYXRlLCByZXNvdXJjZUlkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlKChzKSA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIHNlbGVjdGVkUmFuZ2U6IHsgc3RhcnQsIGVuZCwgcmVzb3VyY2VJZCB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZSgocykgPT4gKHtcbiAgICAgIC4uLnMsXG4gICAgICBzZWxlY3RlZEV2ZW50SWRzOiBuZXcgU2V0KCksXG4gICAgICBzZWxlY3RlZFJhbmdlOiBudWxsLFxuICAgIH0pKTtcbiAgfVxuXG4gIGlzRXZlbnRTZWxlY3RlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uKCkuc2VsZWN0ZWRFdmVudElkcy5oYXMoaWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSAXG5cbiAgZXZlbnRzRm9yRGF5KGRheTogRGF0ZSk6IFNjaGVkdWxlckV2ZW50W10ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVFdmVudHMoKS5maWx0ZXIoKGUpID0+IGlzU2FtZURheShlLnN0YXJ0LCBkYXkpKTtcbiAgfVxuXG4gIGFsbERheUV2ZW50c0ZvckRheShkYXk6IERhdGUpOiBTY2hlZHVsZXJFdmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5hbGxEYXlFdmVudHMoKS5maWx0ZXIoXG4gICAgICAoZSkgPT4gZS5zdGFydC5nZXRUaW1lKCkgPD0gZGF5LmdldFRpbWUoKSArIDg2XzQwMF8wMDAgJiYgZS5lbmQuZ2V0VGltZSgpID49IGRheS5nZXRUaW1lKCksXG4gICAgKTtcbiAgfVxuXG4gIGdldEV2ZW50c0luUmFuZ2Uoc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSk6IFNjaGVkdWxlckV2ZW50W10ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cygpLmZpbHRlcigoZSkgPT4gZGF0ZVJhbmdlT3ZlcmxhcHMoZS5zdGFydCwgZS5lbmQsIHN0YXJ0LCBlbmQpKTtcbiAgfVxuXG4gIGV2ZW50VG9wKGV2ZW50OiBTY2hlZHVsZXJFdmVudCk6IG51bWJlciB7XG4gICAgY29uc3QgaGggPSB0aGlzLmhvdXJIZWlnaHQoKTtcbiAgICByZXR1cm4gKChldmVudC5zdGFydC5nZXRIb3VycygpICogNjAgKyBldmVudC5zdGFydC5nZXRNaW51dGVzKCkpIC8gNjApICogaGg7XG4gIH1cblxuICBldmVudEhlaWdodChldmVudDogU2NoZWR1bGVyRXZlbnQpOiBudW1iZXIge1xuICAgIGNvbnN0IGhoID0gdGhpcy5ob3VySGVpZ2h0KCk7XG4gICAgY29uc3QgZHVyYXRpb25NaW4gPSBkaWZmTWludXRlcyhldmVudC5zdGFydCwgZXZlbnQuZW5kKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoKGR1cmF0aW9uTWluIC8gNjApICogaGgsIDE4KTtcbiAgfVxuXG4gIGN1cnJlbnRUaW1lWSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGhoID0gdGhpcy5ob3VySGVpZ2h0KCk7XG4gICAgY29uc3Qgbm93ID0gdGhpcy5ub3coKTtcbiAgICByZXR1cm4gKChub3cuZ2V0SG91cnMoKSAqIDYwICsgbm93LmdldE1pbnV0ZXMoKSkgLyA2MCkgKiBoaDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIOKUgOKUgFxuXG4gIHByaXZhdGUgX25hdmlnYXRlVG8oZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHZzID0gdGhpcy52aWV3U3RhdGUoKTtcbiAgICBjb25zdCByYW5nZSA9IGNvbXB1dGVSYW5nZSh2cy50eXBlLCBkYXRlLCB2cy5maXJzdERheU9mV2Vlayk7XG4gICAgdGhpcy52aWV3U3RhdGUudXBkYXRlKChzKSA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGUpLFxuICAgICAgcmFuZ2VTdGFydDogcmFuZ2Uuc3RhcnQsXG4gICAgICByYW5nZUVuZDogcmFuZ2UuZW5kLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZpZXdTcGFuKHR5cGU6IFZpZXdUeXBlKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3RpbWVHcmlkRGF5JzpcbiAgICAgIGNhc2UgJ2RheUdyaWREYXknOlxuICAgICAgY2FzZSAnYWdlbmRhJzpcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBjYXNlICd0aW1lR3JpZDNEYXknOlxuICAgICAgICByZXR1cm4gMztcbiAgICAgIGNhc2UgJ3RpbWVHcmlkV29ya1dlZWsnOlxuICAgICAgY2FzZSAndGltZUdyaWRXZWVrJzpcbiAgICAgIGNhc2UgJ2RheUdyaWRXZWVrJzpcbiAgICAgICAgcmV0dXJuIDc7XG4gICAgICBjYXNlICdkYXlHcmlkTW9udGgnOlxuICAgICAgICByZXR1cm4gMzA7XG4gICAgICBjYXNlICd0aW1lbGluZSc6XG4gICAgICAgIHJldHVybiA3O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcnVuSG9vazxUPihob29rOiBTaWduYWw8KGFyZzogVCkgPT4gYm9vbGVhbiB8IHZvaWQ+LCBhcmc6IFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBmbiA9IGhvb2soKTtcbiAgICBjb25zdCByZXN1bHQgPSBmbihhcmcpO1xuICAgIHJldHVybiByZXN1bHQgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyQ29uZmlnIHtcbiAgZGVmYXVsdFZpZXc/OiBWaWV3VHlwZTtcbiAgc2xvdER1cmF0aW9uPzogbnVtYmVyO1xuICBzbmFwRHVyYXRpb24/OiBudW1iZXI7XG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIHJ0bD86IGJvb2xlYW47XG4gIGRlbnNpdHk/OiBEZW5zaXR5O1xuICBzaG93QWxsRGF5PzogYm9vbGVhbjtcbiAgc2hvd1dlZWtlbmRzPzogYm9vbGVhbjtcbiAgc2hvd0N1cnJlbnRUaW1lPzogYm9vbGVhbjtcbiAgYnVzaW5lc3NIb3Vycz86IFdvcmtpbmdIb3VycztcbiAgdmlzaWJsZUhvdXJzPzogW251bWJlciwgbnVtYmVyXTtcbiAgcGx1Z2lucz86IFNjaGVkdWxlclBsdWdpbltdO1xuICBtYXhFdmVudHNQZXJDZWxsPzogbnVtYmVyO1xuICBkYXRlPzogRGF0ZTtcbiAgaW5pdGlhbEV2ZW50cz86IFNjaGVkdWxlckV2ZW50W107XG4gIGluaXRpYWxSZXNvdXJjZXM/OiBTY2hlZHVsZXJSZXNvdXJjZVtdO1xufVxuIl19
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
export function startOfDay(date) {
|
|
2
|
+
const d = new Date(date);
|
|
3
|
+
d.setHours(0, 0, 0, 0);
|
|
4
|
+
return d;
|
|
5
|
+
}
|
|
6
|
+
export function startOfWeek(date, firstDayOfWeek) {
|
|
7
|
+
const d = startOfDay(date);
|
|
8
|
+
const day = d.getDay();
|
|
9
|
+
const diff = (day - firstDayOfWeek + 7) % 7;
|
|
10
|
+
d.setDate(d.getDate() - diff);
|
|
11
|
+
return d;
|
|
12
|
+
}
|
|
13
|
+
export function endOfWeek(date, firstDayOfWeek) {
|
|
14
|
+
const start = startOfWeek(date, firstDayOfWeek);
|
|
15
|
+
const end = new Date(start);
|
|
16
|
+
end.setDate(end.getDate() + 7);
|
|
17
|
+
end.setMilliseconds(-1);
|
|
18
|
+
return end;
|
|
19
|
+
}
|
|
20
|
+
export function startOfMonth(date) {
|
|
21
|
+
const d = new Date(date.getFullYear(), date.getMonth(), 1);
|
|
22
|
+
d.setHours(0, 0, 0, 0);
|
|
23
|
+
return d;
|
|
24
|
+
}
|
|
25
|
+
export function endOfMonth(date) {
|
|
26
|
+
const d = new Date(date.getFullYear(), date.getMonth() + 1, 0);
|
|
27
|
+
d.setHours(23, 59, 59, 999);
|
|
28
|
+
return d;
|
|
29
|
+
}
|
|
30
|
+
export function addDays(date, days) {
|
|
31
|
+
const d = new Date(date);
|
|
32
|
+
d.setDate(d.getDate() + days);
|
|
33
|
+
return d;
|
|
34
|
+
}
|
|
35
|
+
export function addMinutes(date, minutes) {
|
|
36
|
+
return new Date(date.getTime() + minutes * 60_000);
|
|
37
|
+
}
|
|
38
|
+
export function addWeeks(date, weeks) {
|
|
39
|
+
return addDays(date, weeks * 7);
|
|
40
|
+
}
|
|
41
|
+
export function diffMinutes(start, end) {
|
|
42
|
+
return (end.getTime() - start.getTime()) / 60_000;
|
|
43
|
+
}
|
|
44
|
+
export function diffDays(start, end) {
|
|
45
|
+
const s = startOfDay(start);
|
|
46
|
+
const e = startOfDay(end);
|
|
47
|
+
return Math.round((e.getTime() - s.getTime()) / 86_400_000);
|
|
48
|
+
}
|
|
49
|
+
export function isSameDay(a, b) {
|
|
50
|
+
return (a.getFullYear() === b.getFullYear() &&
|
|
51
|
+
a.getMonth() === b.getMonth() &&
|
|
52
|
+
a.getDate() === b.getDate());
|
|
53
|
+
}
|
|
54
|
+
export function isSameWeek(a, b, firstDayOfWeek) {
|
|
55
|
+
return isSameDay(startOfWeek(a, firstDayOfWeek), startOfWeek(b, firstDayOfWeek));
|
|
56
|
+
}
|
|
57
|
+
export function isToday(date) {
|
|
58
|
+
return isSameDay(date, new Date());
|
|
59
|
+
}
|
|
60
|
+
export function isWeekend(date) {
|
|
61
|
+
const day = date.getDay();
|
|
62
|
+
return day === 0 || day === 6;
|
|
63
|
+
}
|
|
64
|
+
export function isPast(date) {
|
|
65
|
+
return date.getTime() < Date.now();
|
|
66
|
+
}
|
|
67
|
+
export function dateRangeOverlaps(aStart, aEnd, bStart, bEnd) {
|
|
68
|
+
return aStart.getTime() < bEnd.getTime() && aEnd.getTime() > bStart.getTime();
|
|
69
|
+
}
|
|
70
|
+
export function clampDate(date, min, max) {
|
|
71
|
+
const t = date.getTime();
|
|
72
|
+
if (t < min.getTime())
|
|
73
|
+
return new Date(min);
|
|
74
|
+
if (t > max.getTime())
|
|
75
|
+
return new Date(max);
|
|
76
|
+
return new Date(date);
|
|
77
|
+
}
|
|
78
|
+
export function getHoursInRange(start, end) {
|
|
79
|
+
const hours = [];
|
|
80
|
+
const d = new Date(start);
|
|
81
|
+
while (d < end) {
|
|
82
|
+
hours.push(d.getHours());
|
|
83
|
+
d.setHours(d.getHours() + 1, 0, 0, 0);
|
|
84
|
+
}
|
|
85
|
+
return hours;
|
|
86
|
+
}
|
|
87
|
+
export function formatHour(h, locale = 'en-US') {
|
|
88
|
+
const d = new Date();
|
|
89
|
+
d.setHours(h, 0, 0, 0);
|
|
90
|
+
return d.toLocaleTimeString(locale, { hour: 'numeric', minute: undefined });
|
|
91
|
+
}
|
|
92
|
+
export function formatDateRange(start, end, locale = 'en-US') {
|
|
93
|
+
const opts = { month: 'short', day: 'numeric' };
|
|
94
|
+
const yearOpts = { month: 'short', day: 'numeric', year: 'numeric' };
|
|
95
|
+
const sameYear = start.getFullYear() === end.getFullYear();
|
|
96
|
+
const fmt = new Intl.DateTimeFormat(locale, sameYear ? opts : yearOpts);
|
|
97
|
+
return `${fmt.format(start)} – ${fmt.format(end)}${sameYear ? `, ${start.getFullYear()}` : ''}`;
|
|
98
|
+
}
|
|
99
|
+
export function getWeekDates(date, firstDayOfWeek) {
|
|
100
|
+
const start = startOfWeek(date, firstDayOfWeek);
|
|
101
|
+
return Array.from({ length: 7 }, (_, i) => addDays(start, i));
|
|
102
|
+
}
|
|
103
|
+
export function getWorkWeekDates(date, firstDayOfWeek) {
|
|
104
|
+
const weekDates = getWeekDates(date, firstDayOfWeek);
|
|
105
|
+
return weekDates.filter((d) => !isWeekend(d));
|
|
106
|
+
}
|
|
107
|
+
export function getMonthGrid(date, firstDayOfWeek) {
|
|
108
|
+
const monthStart = startOfMonth(date);
|
|
109
|
+
const gridStart = startOfWeek(monthStart, firstDayOfWeek);
|
|
110
|
+
const gridEnd = addDays(gridStart, 42);
|
|
111
|
+
const weeks = [];
|
|
112
|
+
let current = new Date(gridStart);
|
|
113
|
+
while (current < gridEnd) {
|
|
114
|
+
weeks.push(Array.from({ length: 7 }, (_, i) => addDays(current, i)));
|
|
115
|
+
current = addDays(current, 7);
|
|
116
|
+
}
|
|
117
|
+
return weeks;
|
|
118
|
+
}
|
|
119
|
+
export function getDayNames(locale = 'en-US', format = 'short') {
|
|
120
|
+
return Array.from({ length: 7 }, (_, i) => {
|
|
121
|
+
const d = new Date(2026, 0, 4 + i);
|
|
122
|
+
return d.toLocaleDateString(locale, { weekday: format });
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
export function getMonthNames(locale = 'en-US', format = 'long') {
|
|
126
|
+
return Array.from({ length: 12 }, (_, i) => {
|
|
127
|
+
const d = new Date(2026, i, 1);
|
|
128
|
+
return d.toLocaleDateString(locale, { month: format });
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay9zY2hlZHVsZXIvdXRpbHMvZGF0ZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVU7SUFDbkMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVUsRUFBRSxjQUFzQjtJQUM1RCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDOUIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFVLEVBQUUsY0FBc0I7SUFDMUQsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNoRCxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvQixHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIs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b3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gc3RhcnRPZkRheShkYXRlOiBEYXRlKTogRGF0ZSB7XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgZC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlOiBEYXRlLCBmaXJzdERheU9mV2VlazogbnVtYmVyKTogRGF0ZSB7XG4gIGNvbnN0IGQgPSBzdGFydE9mRGF5KGRhdGUpO1xuICBjb25zdCBkYXkgPSBkLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSAtIGZpcnN0RGF5T2ZXZWVrICsgNykgJSA3O1xuICBkLnNldERhdGUoZC5nZXREYXRlKCkgLSBkaWZmKTtcbiAgcmV0dXJuIGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmRPZldlZWsoZGF0ZTogRGF0ZSwgZmlyc3REYXlPZldlZWs6IG51bWJlcik6IERhdGUge1xuICBjb25zdCBzdGFydCA9IHN0YXJ0T2ZXZWVrKGRhdGUsIGZpcnN0RGF5T2ZXZWVrKTtcbiAgY29uc3QgZW5kID0gbmV3IERhdGUoc3RhcnQpO1xuICBlbmQuc2V0RGF0ZShlbmQuZ2V0RGF0ZSgpICsgNyk7XG4gIGVuZC5zZXRNaWxsaXNlY29uZHMoLTEpO1xuICByZXR1cm4gZW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRPZk1vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKTtcbiAgZC5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmRPZk1vbnRoKGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgMCk7XG4gIGQuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KTtcbiAgcmV0dXJuIGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGREYXlzKGRhdGU6IERhdGUsIGRheXM6IG51bWJlcik6IERhdGUge1xuICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZSk7XG4gIGQuc2V0RGF0ZShkLmdldERhdGUoKSArIGRheXMpO1xuICByZXR1cm4gZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZE1pbnV0ZXMoZGF0ZTogRGF0ZSwgbWludXRlczogbnVtYmVyKTogRGF0ZSB7XG4gIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSArIG1pbnV0ZXMgKiA2MF8wMDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkV2Vla3MoZGF0ZTogRGF0ZSwgd2Vla3M6IG51bWJlcik6IERhdGUge1xuICByZXR1cm4gYWRkRGF5cyhkYXRlLCB3ZWVrcyAqIDcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlmZk1pbnV0ZXMoc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSk6IG51bWJlciB7XG4gIHJldHVybiAoZW5kLmdldFRpbWUoKSAtIHN0YXJ0LmdldFRpbWUoKSkgLyA2MF8wMDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmRGF5cyhzdGFydDogRGF0ZSwgZW5kOiBEYXRlKTogbnVtYmVyIHtcbiAgY29uc3QgcyA9IHN0YXJ0T2ZEYXkoc3RhcnQpO1xuICBjb25zdCBlID0gc3RhcnRPZkRheShlbmQpO1xuICByZXR1cm4gTWF0aC5yb3VuZCgoZS5nZXRUaW1lKCkgLSBzLmdldFRpbWUoKSkgLyA4Nl80MDBfMDAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZURheShhOiBEYXRlLCBiOiBEYXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiZcbiAgICBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKSAmJlxuICAgIGEuZ2V0RGF0ZSgpID09PSBiLmdldERhdGUoKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lV2VlayhhOiBEYXRlLCBiOiBEYXRlLCBmaXJzdERheU9mV2VlazogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1NhbWVEYXkoc3RhcnRPZldlZWsoYSwgZmlyc3REYXlPZldlZWspLCBzdGFydE9mV2VlayhiLCBmaXJzdERheU9mV2VlaykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUb2RheShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1NhbWVEYXkoZGF0ZSwgbmV3IERhdGUoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dlZWtlbmQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICBjb25zdCBkYXkgPSBkYXRlLmdldERheSgpO1xuICByZXR1cm4gZGF5ID09PSAwIHx8IGRheSA9PT0gNjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGFzdChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiBkYXRlLmdldFRpbWUoKSA8IERhdGUubm93KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlUmFuZ2VPdmVybGFwcyhhU3RhcnQ6IERhdGUsIGFFbmQ6IERhdGUsIGJTdGFydDogRGF0ZSwgYkVuZDogRGF0ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYVN0YXJ0LmdldFRpbWUoKSA8IGJFbmQuZ2V0VGltZSgpICYmIGFFbmQuZ2V0VGltZSgpID4gYlN0YXJ0LmdldFRpbWUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wRGF0ZShkYXRlOiBEYXRlLCBtaW46IERhdGUsIG1heDogRGF0ZSk6IERhdGUge1xuICBjb25zdCB0ID0gZGF0ZS5nZXRUaW1lKCk7XG4gIGlmICh0IDwgbWluLmdldFRpbWUoKSkgcmV0dXJuIG5ldyBEYXRlKG1pbik7XG4gIGlmICh0ID4gbWF4LmdldFRpbWUoKSkgcmV0dXJuIG5ldyBEYXRlKG1heCk7XG4gIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhvdXJzSW5SYW5nZShzdGFydDogRGF0ZSwgZW5kOiBEYXRlKTogbnVtYmVyW10ge1xuICBjb25zdCBob3VyczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgZCA9IG5ldyBEYXRlKHN0YXJ0KTtcbiAgd2hpbGUgKGQgPCBlbmQpIHtcbiAgICBob3Vycy5wdXNoKGQuZ2V0SG91cnMoKSk7XG4gICAgZC5zZXRIb3VycyhkLmdldEhvdXJzKCkgKyAxLCAwLCAwLCAwKTtcbiAgfVxuICByZXR1cm4gaG91cnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRIb3VyKGg6IG51bWJlciwgbG9jYWxlID0gJ2VuLVVTJyk6IHN0cmluZyB7XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSgpO1xuICBkLnNldEhvdXJzKGgsIDAsIDAsIDApO1xuICByZXR1cm4gZC50b0xvY2FsZVRpbWVTdHJpbmcobG9jYWxlLCB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiB1bmRlZmluZWQgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlUmFuZ2Uoc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSwgbG9jYWxlID0gJ2VuLVVTJyk6IHN0cmluZyB7XG4gIGNvbnN0IG9wdHM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfTtcbiAgY29uc3QgeWVhck9wdHM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIHllYXI6ICdudW1lcmljJyB9O1xuICBjb25zdCBzYW1lWWVhciA9IHN0YXJ0LmdldEZ1bGxZZWFyKCkgPT09IGVuZC5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBmbXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIHNhbWVZZWFyID8gb3B0cyA6IHllYXJPcHRzKTtcbiAgcmV0dXJuIGAke2ZtdC5mb3JtYXQoc3RhcnQpfSDigJMgJHtmbXQuZm9ybWF0KGVuZCl9JHtzYW1lWWVhciA/IGAsICR7c3RhcnQuZ2V0RnVsbFllYXIoKX1gIDogJyd9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtEYXRlcyhkYXRlOiBEYXRlLCBmaXJzdERheU9mV2VlazogbnVtYmVyKTogRGF0ZVtdIHtcbiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mV2VlayhkYXRlLCBmaXJzdERheU9mV2Vlayk7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PiBhZGREYXlzKHN0YXJ0LCBpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrV2Vla0RhdGVzKGRhdGU6IERhdGUsIGZpcnN0RGF5T2ZXZWVrOiBudW1iZXIpOiBEYXRlW10ge1xuICBjb25zdCB3ZWVrRGF0ZXMgPSBnZXRXZWVrRGF0ZXMoZGF0ZSwgZmlyc3REYXlPZldlZWspO1xuICByZXR1cm4gd2Vla0RhdGVzLmZpbHRlcigoZCkgPT4gIWlzV2Vla2VuZChkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb250aEdyaWQoZGF0ZTogRGF0ZSwgZmlyc3REYXlPZldlZWs6IG51bWJlcik6IERhdGVbXVtdIHtcbiAgY29uc3QgbW9udGhTdGFydCA9IHN0YXJ0T2ZNb250aChkYXRlKTtcbiAgY29uc3QgZ3JpZFN0YXJ0ID0gc3RhcnRPZldlZWsobW9udGhTdGFydCwgZmlyc3REYXlPZldlZWspO1xuICBjb25zdCBncmlkRW5kID0gYWRkRGF5cyhncmlkU3RhcnQsIDQyKTtcbiAgY29uc3Qgd2Vla3M6IERhdGVbXVtdID0gW107XG4gIGxldCBjdXJyZW50ID0gbmV3IERhdGUoZ3JpZFN0YXJ0KTtcbiAgd2hpbGUgKGN1cnJlbnQgPCBncmlkRW5kKSB7XG4gICAgd2Vla3MucHVzaChBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PiBhZGREYXlzKGN1cnJlbnQsIGkpKSk7XG4gICAgY3VycmVudCA9IGFkZERheXMoY3VycmVudCwgNyk7XG4gIH1cbiAgcmV0dXJuIHdlZWtzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5TmFtZXMoXG4gIGxvY2FsZSA9ICdlbi1VUycsXG4gIGZvcm1hdDogJ2xvbmcnIHwgJ3Nob3J0JyB8ICduYXJyb3cnID0gJ3Nob3J0Jyxcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDcgfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoMjAyNiwgMCwgNCArIGkpO1xuICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogZm9ybWF0IH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vbnRoTmFtZXMobG9jYWxlID0gJ2VuLVVTJywgZm9ybWF0OiAnbG9uZycgfCAnc2hvcnQnID0gJ2xvbmcnKTogc3RyaW5nW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoMjAyNiwgaSwgMSk7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogZm9ybWF0IH0pO1xuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './date-utils';
|
|
2
|
+
export * from './snap';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc2NoZWR1bGVyL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kYXRlLXV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vc25hcCc7XG4iXX0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function snapToSlot(value, snapDuration) {
|
|
2
|
+
return Math.round(value / snapDuration) * snapDuration;
|
|
3
|
+
}
|
|
4
|
+
export function snapDateToSlot(date, snapDuration) {
|
|
5
|
+
const ms = date.getTime();
|
|
6
|
+
const snapMs = snapDuration * 60_000;
|
|
7
|
+
return new Date(Math.round(ms / snapMs) * snapMs);
|
|
8
|
+
}
|
|
9
|
+
export function minutesToPixels(minutes, hourHeight) {
|
|
10
|
+
return (minutes / 60) * hourHeight;
|
|
11
|
+
}
|
|
12
|
+
export function pixelsToMinutes(pixels, hourHeight) {
|
|
13
|
+
return (pixels / hourHeight) * 60;
|
|
14
|
+
}
|
|
15
|
+
export function timeToMinutes(date) {
|
|
16
|
+
return date.getHours() * 60 + date.getMinutes();
|
|
17
|
+
}
|
|
18
|
+
export function minutesToTime(baseDate, minutes) {
|
|
19
|
+
const d = new Date(baseDate);
|
|
20
|
+
d.setHours(0, 0, 0, 0);
|
|
21
|
+
d.setMinutes(minutes);
|
|
22
|
+
return d;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay9zY2hlZHVsZXIvdXRpbHMvc25hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWEsRUFBRSxZQUFvQjtJQUM1RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUN6RCxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFVLEVBQUUsWUFBb0I7SUFDN0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFCLE1BQU0sTUFBTSxHQUFHLFlBQVksR0FBRyxNQUFNLENBQUM7SUFDckMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUFlLEVBQUUsVUFBa0I7SUFDakUsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYyxFQUFFLFVBQWtCO0lBQ2hFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQVU7SUFDdEMsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxRQUFjLEVBQUUsT0FBZTtJQUMzRCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHNuYXBUb1Nsb3QodmFsdWU6IG51bWJlciwgc25hcER1cmF0aW9uOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAvIHNuYXBEdXJhdGlvbikgKiBzbmFwRHVyYXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbmFwRGF0ZVRvU2xvdChkYXRlOiBEYXRlLCBzbmFwRHVyYXRpb246IG51bWJlcik6IERhdGUge1xuICBjb25zdCBtcyA9IGRhdGUuZ2V0VGltZSgpO1xuICBjb25zdCBzbmFwTXMgPSBzbmFwRHVyYXRpb24gKiA2MF8wMDA7XG4gIHJldHVybiBuZXcgRGF0ZShNYXRoLnJvdW5kKG1zIC8gc25hcE1zKSAqIHNuYXBNcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaW51dGVzVG9QaXhlbHMobWludXRlczogbnVtYmVyLCBob3VySGVpZ2h0OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gKG1pbnV0ZXMgLyA2MCkgKiBob3VySGVpZ2h0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxzVG9NaW51dGVzKHBpeGVsczogbnVtYmVyLCBob3VySGVpZ2h0OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gKHBpeGVscyAvIGhvdXJIZWlnaHQpICogNjA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lVG9NaW51dGVzKGRhdGU6IERhdGUpOiBudW1iZXIge1xuICByZXR1cm4gZGF0ZS5nZXRIb3VycygpICogNjAgKyBkYXRlLmdldE1pbnV0ZXMoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbnV0ZXNUb1RpbWUoYmFzZURhdGU6IERhdGUsIG1pbnV0ZXM6IG51bWJlcik6IERhdGUge1xuICBjb25zdCBkID0gbmV3IERhdGUoYmFzZURhdGUpO1xuICBkLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBkLnNldE1pbnV0ZXMobWludXRlcyk7XG4gIHJldHVybiBkO1xufVxuIl19
|