@chelone/core 0.6.0 → 0.7.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/dist/assistant/assistant-session.d.ts +6 -0
- package/dist/assistant/assistant-session.js +204 -181
- package/dist/assistant/echo-transport.js +26 -29
- package/dist/assistant/http-transport.d.ts +10 -0
- package/dist/assistant/http-transport.js +98 -0
- package/dist/assistant/types.d.ts +1 -7
- package/dist/auth/access-control.d.ts +13 -5
- package/dist/auth/access-control.js +25 -21
- package/dist/auth/auth-options.d.ts +21 -17
- package/dist/auth/auth-options.js +80 -48
- package/dist/auth/permission-matrix.d.ts +12 -0
- package/dist/auth/permission-matrix.js +67 -0
- package/dist/auth/types.d.ts +14 -4
- package/dist/block-editor/block-document.d.ts +60 -0
- package/dist/block-editor/block-document.js +143 -0
- package/dist/block-editor/data-blocks.d.ts +63 -0
- package/dist/block-editor/data-blocks.js +117 -0
- package/dist/chart/chart-data.js +46 -44
- package/dist/command-menu/hotkey.js +58 -47
- package/dist/command-menu/recents.js +8 -11
- package/dist/command-menu/registry.d.ts +9 -5
- package/dist/command-menu/registry.js +36 -46
- package/dist/controller/calendar-dates.js +82 -113
- package/dist/controller/calendar-events.js +93 -88
- package/dist/controller/client-list-controller.d.ts +2 -2
- package/dist/controller/client-list-controller.js +251 -254
- package/dist/controller/data-table-columns.d.ts +2 -0
- package/dist/controller/data-table-columns.js +50 -56
- package/dist/controller/deep-equal.d.ts +1 -0
- package/dist/controller/deep-equal.js +14 -0
- package/dist/controller/filter-toggle.js +36 -44
- package/dist/controller/in-place-editor.d.ts +42 -0
- package/dist/controller/in-place-editor.js +42 -0
- package/dist/controller/infinite-list-controller.js +219 -189
- package/dist/controller/inspector.d.ts +49 -0
- package/dist/controller/inspector.js +64 -0
- package/dist/controller/job-monitor.d.ts +3 -4
- package/dist/controller/job-monitor.js +37 -47
- package/dist/controller/kanban-board.d.ts +2 -3
- package/dist/controller/kanban-board.js +43 -24
- package/dist/controller/list-controller.d.ts +5 -5
- package/dist/controller/list-controller.js +444 -400
- package/dist/controller/list-params.js +96 -87
- package/dist/controller/pivot-grid.js +89 -95
- package/dist/controller/prev-next.d.ts +2 -2
- package/dist/controller/prev-next.js +74 -54
- package/dist/controller/record-controllers.d.ts +14 -6
- package/dist/controller/record-controllers.js +288 -257
- package/dist/controller/record-diff.d.ts +21 -0
- package/dist/controller/record-diff.js +50 -0
- package/dist/controller/record-timeline.js +42 -30
- package/dist/controller/record-tree.js +57 -47
- package/dist/controller/record-workflow.d.ts +38 -16
- package/dist/controller/record-workflow.js +85 -64
- package/dist/controller/reference-many-controller.js +198 -192
- package/dist/controller/reference-one-controller.d.ts +1 -1
- package/dist/controller/reference-one-controller.js +63 -56
- package/dist/controller/saved-queries.js +104 -91
- package/dist/controller/translate-fallback.js +10 -6
- package/dist/csv/export.d.ts +2 -1
- package/dist/csv/export.js +43 -40
- package/dist/csv/import-controller.js +185 -169
- package/dist/csv/match-headers.js +29 -22
- package/dist/csv/parse-with.js +60 -54
- package/dist/csv/run-import.js +69 -72
- package/dist/csv/validate-rows.d.ts +1 -1
- package/dist/csv/validate-rows.js +65 -52
- package/dist/data/cache-ops.d.ts +5 -4
- package/dist/data/cache-ops.js +208 -188
- package/dist/data/combine-data-providers.js +25 -23
- package/dist/data/data-provider-log.d.ts +45 -0
- package/dist/data/data-provider-log.js +93 -0
- package/dist/data/errors.js +14 -10
- package/dist/data/fake-provider.d.ts +6 -3
- package/dist/data/fake-provider.js +129 -114
- package/dist/data/fetch-utils.js +61 -44
- package/dist/data/filter-branch.d.ts +5 -0
- package/dist/data/filter-branch.js +10 -0
- package/dist/data/get-many-aggregate.js +84 -76
- package/dist/data/http-error.js +17 -12
- package/dist/data/keys.js +50 -36
- package/dist/data/mutation-options.d.ts +14 -9
- package/dist/data/mutation-options.js +93 -109
- package/dist/data/query-options.js +73 -68
- package/dist/data/remove-empty.d.ts +3 -0
- package/dist/data/remove-empty.js +11 -0
- package/dist/data/undoable.d.ts +2 -2
- package/dist/data/undoable.js +190 -174
- package/dist/data/with-lifecycle-callbacks.d.ts +45 -17
- package/dist/data/with-lifecycle-callbacks.js +66 -52
- package/dist/environment/application-update-store.js +58 -55
- package/dist/environment/offline-store.js +21 -21
- package/dist/form/array-binding.d.ts +30 -11
- package/dist/form/array-binding.js +184 -166
- package/dist/form/choice-ids.d.ts +7 -0
- package/dist/form/choice-ids.js +11 -0
- package/dist/form/choices-controller.d.ts +3 -2
- package/dist/form/choices-controller.js +302 -275
- package/dist/form/date-format.d.ts +38 -0
- package/dist/form/date-format.js +89 -0
- package/dist/form/dirty-values.d.ts +2 -2
- package/dist/form/dirty-values.js +22 -11
- package/dist/form/duration.d.ts +22 -0
- package/dist/form/duration.js +49 -0
- package/dist/form/edit-create-form.d.ts +12 -5
- package/dist/form/edit-create-form.js +243 -188
- package/dist/form/event-value.d.ts +6 -0
- package/dist/form/event-value.js +17 -0
- package/dist/form/field-error.d.ts +14 -0
- package/dist/form/field-error.js +28 -0
- package/dist/form/field-name.d.ts +20 -0
- package/dist/form/field-name.js +6 -0
- package/dist/form/filter-form-values.js +63 -49
- package/dist/form/form-controller.d.ts +9 -1
- package/dist/form/form-controller.js +165 -160
- package/dist/form/form-groups.d.ts +4 -3
- package/dist/form/form-groups.js +79 -79
- package/dist/form/form-handle.d.ts +175 -0
- package/dist/form/form-handle.js +68 -0
- package/dist/form/input-binding.d.ts +56 -31
- package/dist/form/input-binding.js +169 -118
- package/dist/form/input-values.d.ts +130 -0
- package/dist/form/input-values.js +177 -0
- package/dist/form/json-text.js +51 -37
- package/dist/form/save-pipeline.d.ts +6 -8
- package/dist/form/save-pipeline.js +91 -82
- package/dist/form/set-form-values.d.ts +6 -0
- package/dist/form/set-form-values.js +10 -0
- package/dist/form/source.js +97 -65
- package/dist/form/text-of.d.ts +2 -0
- package/dist/form/text-of.js +7 -0
- package/dist/form/validators.d.ts +58 -19
- package/dist/form/validators.js +97 -71
- package/dist/geo/bbox.d.ts +5 -4
- package/dist/geo/bbox.js +69 -48
- package/dist/geo/bounds.d.ts +14 -3
- package/dist/geo/bounds.js +98 -68
- package/dist/geo/constraints.js +88 -93
- package/dist/geo/coordinates.js +31 -23
- package/dist/geo/editor.d.ts +13 -13
- package/dist/geo/editor.js +176 -153
- package/dist/geo/geocoding.d.ts +4 -4
- package/dist/geo/geocoding.js +38 -41
- package/dist/geo/geojson.d.ts +12 -74
- package/dist/geo/geojson.js +52 -40
- package/dist/geo/geometry-math.d.ts +4 -4
- package/dist/geo/geometry-math.js +100 -93
- package/dist/geo/index.d.ts +7 -6
- package/dist/geo/map-layers.d.ts +42 -7
- package/dist/geo/map-layers.js +88 -62
- package/dist/geo/map-style.js +31 -32
- package/dist/geo/messages.js +48 -45
- package/dist/geo/nominatim.js +88 -80
- package/dist/geo/osm-presets.d.ts +4 -3
- package/dist/geo/osm-presets.js +108 -86
- package/dist/geo/osm-tags.js +14 -12
- package/dist/geo/overpass.d.ts +14 -2
- package/dist/geo/overpass.js +83 -90
- package/dist/geo/shape-value.d.ts +9 -5
- package/dist/geo/shape-value.js +169 -146
- package/dist/geo/snap-to-roads.d.ts +3 -3
- package/dist/geo/snap-to-roads.js +55 -50
- package/dist/geo/throttle.js +36 -39
- package/dist/guards.d.ts +37 -0
- package/dist/guards.js +62 -0
- package/dist/i18n/default-messages.js +34 -29
- package/dist/i18n/english-messages.js +187 -189
- package/dist/i18n/i18n.d.ts +2 -2
- package/dist/i18n/i18n.js +47 -60
- package/dist/i18n/inflection.d.ts +34 -0
- package/dist/i18n/inflection.js +82 -0
- package/dist/i18n/messages.d.ts +10 -2
- package/dist/i18n/messages.js +17 -4
- package/dist/i18n/missing-keys.js +66 -62
- package/dist/i18n/translatable.d.ts +16 -1
- package/dist/i18n/translatable.js +40 -47
- package/dist/index.d.ts +71 -24
- package/dist/index.js +40 -288
- package/dist/json/deep-equal.d.ts +8 -0
- package/dist/json/deep-equal.js +24 -0
- package/dist/json/strip-json-comments.js +38 -42
- package/dist/noop.d.ts +2 -0
- package/dist/noop.js +4 -0
- package/dist/notification/error-message.d.ts +2 -0
- package/dist/notification/error-message.js +10 -0
- package/dist/notification/notification-store.d.ts +3 -2
- package/dist/notification/notification-store.js +41 -45
- package/dist/onboarding-tour/placement.js +63 -78
- package/dist/onboarding-tour/tour-controller.js +46 -54
- package/dist/realtime/add-events-for-mutations.js +75 -81
- package/dist/realtime/announce-lock.js +16 -13
- package/dist/realtime/broadcast-channel-transport.js +65 -59
- package/dist/realtime/copy-members.js +22 -14
- package/dist/realtime/in-memory-lock-provider.js +40 -48
- package/dist/realtime/live.js +95 -101
- package/dist/realtime/lock-options.js +16 -16
- package/dist/realtime/lock-session.js +91 -78
- package/dist/realtime/memory-transport.js +25 -25
- package/dist/realtime/presence.js +120 -122
- package/dist/realtime/realtime-data-provider.d.ts +10 -0
- package/dist/realtime/realtime-data-provider.js +45 -42
- package/dist/realtime/reconnect-backoff.js +17 -0
- package/dist/realtime/sse-transport.d.ts +31 -0
- package/dist/realtime/sse-transport.js +235 -0
- package/dist/realtime/status-store.js +23 -28
- package/dist/realtime/topic-hub.js +62 -71
- package/dist/realtime/topics.js +10 -12
- package/dist/realtime/types.js +10 -12
- package/dist/realtime/unread-count.js +21 -21
- package/dist/realtime/websocket-transport.d.ts +32 -0
- package/dist/realtime/websocket-transport.js +306 -0
- package/dist/resource/describe-resource.d.ts +2 -0
- package/dist/resource/describe-resource.js +232 -219
- package/dist/resource/get-at-path.js +29 -14
- package/dist/resource/identifier.d.ts +18 -0
- package/dist/resource/identifier.js +27 -0
- package/dist/resource/record.d.ts +4 -0
- package/dist/resource/record.js +10 -0
- package/dist/resource/register.d.ts +7 -0
- package/dist/resource/registry-store.d.ts +45 -15
- package/dist/resource/registry-store.js +67 -60
- package/dist/resource/registry.d.ts +10 -0
- package/dist/resource/registry.js +8 -4
- package/dist/resource/source-path.d.ts +16 -1
- package/dist/rich-text/rich-text-extras.d.ts +132 -0
- package/dist/rich-text/rich-text-extras.js +179 -0
- package/dist/rich-text/rich-text-image.d.ts +124 -0
- package/dist/rich-text/rich-text-image.js +163 -0
- package/dist/rich-text/rich-text.d.ts +6 -0
- package/dist/rich-text/rich-text.js +125 -88
- package/dist/router/location.d.ts +22 -4
- package/dist/router/location.js +41 -18
- package/dist/router/match.js +47 -39
- package/dist/router/paths.js +40 -34
- package/dist/router/record-from-location.d.ts +1 -1
- package/dist/router/record-from-location.js +25 -17
- package/dist/store/adapters.js +51 -55
- package/dist/store/micro-store.js +57 -59
- package/dist/store/shallow-equal.d.ts +12 -0
- package/dist/store/shallow-equal.js +20 -0
- package/dist/store/store.js +54 -57
- package/package.json +13 -11
|
@@ -1,123 +1,92 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
999
|
|
12
|
-
);
|
|
13
|
-
const daysFromWeekStart = (date, weekStartsOn) => (date.getDay() - weekStartsOn + 7) % 7;
|
|
1
|
+
// src/controller/calendar-dates.ts
|
|
2
|
+
var DATE_ONLY = /^(\d{4})-(\d{2})-(\d{2})$/;
|
|
3
|
+
var AGENDA_DAYS = 14;
|
|
4
|
+
var atMidnight = (date, dayOffset = 0) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + dayOffset);
|
|
5
|
+
var atEndOfDay = (date, dayOffset = 0) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + dayOffset, 23, 59, 59, 999);
|
|
6
|
+
var daysFromWeekStart = (date, weekStartsOn) => (date.getDay() - weekStartsOn + 7) % 7;
|
|
7
|
+
/**
|
|
8
|
+
* A date-only string is local midnight: `new Date("2026-05-01")` reads it as
|
|
9
|
+
* UTC, which is the previous day west of Greenwich.
|
|
10
|
+
*/
|
|
14
11
|
function parseCalendarDate(value) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
} else {
|
|
34
|
-
date = new Date(value);
|
|
35
|
-
}
|
|
36
|
-
} else {
|
|
37
|
-
return void 0;
|
|
38
|
-
}
|
|
39
|
-
return Number.isNaN(date.getTime()) ? void 0 : date;
|
|
12
|
+
let date;
|
|
13
|
+
if (value instanceof Date) date = new Date(value.getTime());
|
|
14
|
+
else if (typeof value === "number") date = new Date(value);
|
|
15
|
+
else if (typeof value === "string") {
|
|
16
|
+
const dateOnly = DATE_ONLY.exec(value);
|
|
17
|
+
if (dateOnly) {
|
|
18
|
+
const [year, month, day] = [
|
|
19
|
+
Number(dateOnly[1]),
|
|
20
|
+
Number(dateOnly[2]),
|
|
21
|
+
Number(dateOnly[3])
|
|
22
|
+
];
|
|
23
|
+
date = new Date(2e3, 0, 1);
|
|
24
|
+
date.setFullYear(year, month - 1, day);
|
|
25
|
+
if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) return;
|
|
26
|
+
} else date = new Date(value);
|
|
27
|
+
} else return;
|
|
28
|
+
return Number.isNaN(date.getTime()) ? void 0 : date;
|
|
40
29
|
}
|
|
41
30
|
function calendarRange(view, anchor, weekStartsOn) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
end: atEndOfDay(last, 6 - daysFromWeekStart(last, weekStartsOn))
|
|
53
|
-
};
|
|
31
|
+
if (view === "agenda") return {
|
|
32
|
+
start: atMidnight(anchor, -14),
|
|
33
|
+
end: atEndOfDay(anchor, AGENDA_DAYS)
|
|
34
|
+
};
|
|
35
|
+
const first = view === "month" ? new Date(anchor.getFullYear(), anchor.getMonth(), 1) : anchor;
|
|
36
|
+
const last = view === "month" ? new Date(anchor.getFullYear(), anchor.getMonth() + 1, 0) : anchor;
|
|
37
|
+
return {
|
|
38
|
+
start: atMidnight(first, -daysFromWeekStart(first, weekStartsOn)),
|
|
39
|
+
end: atEndOfDay(last, 6 - daysFromWeekStart(last, weekStartsOn))
|
|
40
|
+
};
|
|
54
41
|
}
|
|
42
|
+
/** One local midnight per day: adding to the day of the month never skips or repeats a day when the clocks change. */
|
|
55
43
|
function calendarDays(range) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
return days;
|
|
44
|
+
const days = [];
|
|
45
|
+
const first = atMidnight(range.start);
|
|
46
|
+
for (let day = first; day.getTime() <= range.end.getTime(); day = atMidnight(first, days.length)) days.push(day);
|
|
47
|
+
return days;
|
|
62
48
|
}
|
|
63
49
|
function shiftCalendarAnchor(view, anchor, direction) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
...time
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
const step = view === "week" ? 7 : AGENDA_DAYS;
|
|
81
|
-
return new Date(
|
|
82
|
-
anchor.getFullYear(),
|
|
83
|
-
anchor.getMonth(),
|
|
84
|
-
anchor.getDate() + direction * step,
|
|
85
|
-
...time
|
|
86
|
-
);
|
|
50
|
+
const time = [
|
|
51
|
+
anchor.getHours(),
|
|
52
|
+
anchor.getMinutes(),
|
|
53
|
+
anchor.getSeconds(),
|
|
54
|
+
anchor.getMilliseconds()
|
|
55
|
+
];
|
|
56
|
+
if (view === "month") {
|
|
57
|
+
const month = anchor.getMonth() + direction;
|
|
58
|
+
const lastDay = new Date(anchor.getFullYear(), month + 1, 0).getDate();
|
|
59
|
+
return new Date(anchor.getFullYear(), month, Math.min(anchor.getDate(), lastDay), ...time);
|
|
60
|
+
}
|
|
61
|
+
const step = view === "week" ? 7 : AGENDA_DAYS;
|
|
62
|
+
return new Date(anchor.getFullYear(), anchor.getMonth(), anchor.getDate() + direction * step, ...time);
|
|
87
63
|
}
|
|
88
|
-
|
|
89
|
-
|
|
64
|
+
var pad = (value) => String(value).padStart(2, "0");
|
|
65
|
+
var calendarDayKey = (date) => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
90
66
|
function calendarLabels(locale) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
67
|
+
const month = new Intl.DateTimeFormat(locale, {
|
|
68
|
+
month: "long",
|
|
69
|
+
year: "numeric"
|
|
70
|
+
});
|
|
71
|
+
const span = new Intl.DateTimeFormat(locale, {
|
|
72
|
+
month: "short",
|
|
73
|
+
day: "numeric",
|
|
74
|
+
year: "numeric"
|
|
75
|
+
});
|
|
76
|
+
const weekday = new Intl.DateTimeFormat(locale, { weekday: "short" });
|
|
77
|
+
const dayNumber = new Intl.DateTimeFormat(locale, { day: "numeric" });
|
|
78
|
+
const hour = new Intl.DateTimeFormat(locale, { hour: "numeric" });
|
|
79
|
+
const agendaDay = new Intl.DateTimeFormat(locale, {
|
|
80
|
+
weekday: "long",
|
|
81
|
+
month: "long",
|
|
82
|
+
day: "numeric"
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
title: (view, anchor, range) => view === "month" ? month.format(anchor) : span.formatRange(range.start, range.end),
|
|
86
|
+
weekday: (date) => weekday.format(date),
|
|
87
|
+
dayNumber: (date) => dayNumber.format(date),
|
|
88
|
+
hour: (value) => hour.format(new Date(2e3, 0, 1, value)),
|
|
89
|
+
agendaDay: (date) => agendaDay.format(date)
|
|
90
|
+
};
|
|
115
91
|
}
|
|
116
|
-
export {
|
|
117
|
-
calendarDayKey,
|
|
118
|
-
calendarDays,
|
|
119
|
-
calendarLabels,
|
|
120
|
-
calendarRange,
|
|
121
|
-
parseCalendarDate,
|
|
122
|
-
shiftCalendarAnchor
|
|
123
|
-
};
|
|
92
|
+
export { calendarDayKey, calendarDays, calendarLabels, calendarRange, parseCalendarDate, shiftCalendarAnchor };
|
|
@@ -1,106 +1,111 @@
|
|
|
1
1
|
import { getAtPath } from "../resource/get-at-path.js";
|
|
2
2
|
import { calendarDayKey, parseCalendarDate } from "./calendar-dates.js";
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
// src/controller/calendar-events.ts
|
|
4
|
+
var midnight = (date, dayOffset = 0) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + dayOffset);
|
|
5
|
+
var isMidnight = (date) => date.getTime() === midnight(date).getTime();
|
|
6
|
+
/** Records with no usable start are skipped, and an end before the start is dropped. */
|
|
5
7
|
function toCalendarEvents(records, options) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
const events = [];
|
|
9
|
+
for (const record of records) {
|
|
10
|
+
const start = parseCalendarDate(getAtPath(record, options.startSource));
|
|
11
|
+
if (!start) continue;
|
|
12
|
+
const parsedEnd = options.endSource ? parseCalendarDate(getAtPath(record, options.endSource)) : void 0;
|
|
13
|
+
const end = parsedEnd && parsedEnd.getTime() >= start.getTime() ? parsedEnd : void 0;
|
|
14
|
+
const titleValue = options.titleSource ? getAtPath(record, options.titleSource) : void 0;
|
|
15
|
+
const title = (typeof titleValue === "string" || typeof titleValue === "number") && titleValue !== "" ? String(titleValue) : options.getTitle(record);
|
|
16
|
+
const colorValue = options.colorSource ? getAtPath(record, options.colorSource) : void 0;
|
|
17
|
+
const color = colorValue == null ? void 0 : options.colorMap?.[String(colorValue)];
|
|
18
|
+
const event = {
|
|
19
|
+
record,
|
|
20
|
+
start,
|
|
21
|
+
title
|
|
22
|
+
};
|
|
23
|
+
if (end) event.end = end;
|
|
24
|
+
if (color !== void 0) event.color = color;
|
|
25
|
+
events.push(event);
|
|
26
|
+
}
|
|
27
|
+
return events;
|
|
22
28
|
}
|
|
29
|
+
/** An event runs from its start day to its end day; an end at midnight leaves its own day out. */
|
|
23
30
|
function calendarEventsOnDay(events, day) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return dayTime >= firstDay && dayTime <= lastDay;
|
|
32
|
-
});
|
|
31
|
+
const dayTime = midnight(day).getTime();
|
|
32
|
+
return events.filter(({ start, end }) => {
|
|
33
|
+
const firstDay = midnight(start).getTime();
|
|
34
|
+
let lastDay = firstDay;
|
|
35
|
+
if (end && end.getTime() > start.getTime()) lastDay = midnight(end, isMidnight(end) ? -1 : 0).getTime();
|
|
36
|
+
return dayTime >= firstDay && dayTime <= lastDay;
|
|
37
|
+
});
|
|
33
38
|
}
|
|
34
39
|
function calendarEventsInHour(events, day, hour) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
({ start }) => calendarDayKey(start) === key && start.getHours() === hour
|
|
38
|
-
);
|
|
40
|
+
const key = calendarDayKey(day);
|
|
41
|
+
return events.filter(({ start }) => calendarDayKey(start) === key && start.getHours() === hour);
|
|
39
42
|
}
|
|
43
|
+
/** Equal starts keep list order. */
|
|
40
44
|
function groupCalendarAgenda(events, range) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
const inRange = events.filter(({ start }) => start.getTime() >= range.start.getTime() && start.getTime() <= range.end.getTime()).sort((a, b) => a.start.getTime() - b.start.getTime());
|
|
46
|
+
const groups = [];
|
|
47
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
48
|
+
for (const event of inRange) {
|
|
49
|
+
const key = calendarDayKey(event.start);
|
|
50
|
+
let group = byKey.get(key);
|
|
51
|
+
if (!group) {
|
|
52
|
+
group = {
|
|
53
|
+
day: midnight(event.start),
|
|
54
|
+
key,
|
|
55
|
+
events: []
|
|
56
|
+
};
|
|
57
|
+
byKey.set(key, group);
|
|
58
|
+
groups.push(group);
|
|
59
|
+
}
|
|
60
|
+
group.events.push(event);
|
|
61
|
+
}
|
|
62
|
+
return groups;
|
|
57
63
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
date.getMinutes(),
|
|
67
|
-
date.getSeconds(),
|
|
68
|
-
date.getMilliseconds()
|
|
69
|
-
);
|
|
64
|
+
var wholeDaysBetween = (from, to) => Math.round((Date.UTC(to.getFullYear(), to.getMonth(), to.getDate()) - Date.UTC(from.getFullYear(), from.getMonth(), from.getDate())) / 864e5);
|
|
65
|
+
var addDays = (date, days) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + days, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
|
|
66
|
+
/**
|
|
67
|
+
* Shifts the start and the end by the whole days between the two days, each
|
|
68
|
+
* keeping its time of day. Adding the duration in milliseconds instead would
|
|
69
|
+
* move an all-day event's end off midnight when the move crosses a daylight
|
|
70
|
+
* saving change.
|
|
71
|
+
*/
|
|
70
72
|
function moveCalendarEvent(event, fromDay, toDay) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
73
|
+
const days = wholeDaysBetween(fromDay, toDay);
|
|
74
|
+
const start = addDays(event.start, days);
|
|
75
|
+
return event.end ? {
|
|
76
|
+
start,
|
|
77
|
+
end: addDays(event.end, days)
|
|
78
|
+
} : { start };
|
|
74
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* The list filter that asks for a range. With an `endSource`, an event is kept
|
|
82
|
+
* when it starts before the range ends and ends after it starts, so one that
|
|
83
|
+
* began earlier and runs into the range is fetched; a record with an empty end
|
|
84
|
+
* is then left out. Without one, only the start is bounded, on both sides.
|
|
85
|
+
*/
|
|
75
86
|
function calendarRangeFilter(startSource, range, endSource) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
[`${startSource}_lte`]: range.end.toISOString()
|
|
85
|
-
};
|
|
87
|
+
if (endSource) return {
|
|
88
|
+
[`${startSource}_lte`]: range.end.toISOString(),
|
|
89
|
+
[`${endSource}_gte`]: range.start.toISOString()
|
|
90
|
+
};
|
|
91
|
+
return {
|
|
92
|
+
[`${startSource}_gte`]: range.start.toISOString(),
|
|
93
|
+
[`${startSource}_lte`]: range.end.toISOString()
|
|
94
|
+
};
|
|
86
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Keys an earlier default filter wrote that the current one no longer does: a
|
|
98
|
+
* list URL or store can still hold the start's lower bound, which would hide
|
|
99
|
+
* the event that starts before the range.
|
|
100
|
+
*/
|
|
87
101
|
function staleCalendarRangeKeys(startSource, endSource) {
|
|
88
|
-
|
|
102
|
+
return endSource ? [`${startSource}_gte`] : [];
|
|
89
103
|
}
|
|
90
104
|
function omitCalendarRangeFilter(filter, startSource, endSource) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
105
|
+
const rest = { ...filter };
|
|
106
|
+
delete rest[`${startSource}_gte`];
|
|
107
|
+
delete rest[`${startSource}_lte`];
|
|
108
|
+
if (endSource) delete rest[`${endSource}_gte`];
|
|
109
|
+
return rest;
|
|
96
110
|
}
|
|
97
|
-
export {
|
|
98
|
-
calendarEventsInHour,
|
|
99
|
-
calendarEventsOnDay,
|
|
100
|
-
calendarRangeFilter,
|
|
101
|
-
groupCalendarAgenda,
|
|
102
|
-
moveCalendarEvent,
|
|
103
|
-
omitCalendarRangeFilter,
|
|
104
|
-
staleCalendarRangeKeys,
|
|
105
|
-
toCalendarEvents
|
|
106
|
-
};
|
|
111
|
+
export { calendarEventsInHour, calendarEventsOnDay, calendarRangeFilter, groupCalendarAgenda, moveCalendarEvent, omitCalendarRangeFilter, staleCalendarRangeKeys, toCalendarEvents };
|
|
@@ -22,7 +22,7 @@ export interface ClientListControllerOptions<TRecord> {
|
|
|
22
22
|
isPending?: boolean;
|
|
23
23
|
isFetching?: boolean;
|
|
24
24
|
/** Pass-through error. Default `null`. */
|
|
25
|
-
error?:
|
|
25
|
+
error?: Error | null;
|
|
26
26
|
/** Extra predicate applied AFTER the field filters (ra-core `filterCallback`). */
|
|
27
27
|
filterCallback?: (record: TRecord) => boolean;
|
|
28
28
|
}
|
|
@@ -39,7 +39,7 @@ export interface ClientListControllerOptions<TRecord> {
|
|
|
39
39
|
export interface ClientListLoadingState {
|
|
40
40
|
isPending?: boolean;
|
|
41
41
|
isFetching?: boolean;
|
|
42
|
-
error?:
|
|
42
|
+
error?: Error | null;
|
|
43
43
|
}
|
|
44
44
|
export interface ClientListController<TRecord> extends ListController<TRecord> {
|
|
45
45
|
/** Replace the source records (external `data` prop change) and recompute. */
|