@chelone/core 0.6.0 → 0.9.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.
Files changed (255) hide show
  1. package/dist/assistant/assistant-session.d.ts +6 -0
  2. package/dist/assistant/assistant-session.js +204 -181
  3. package/dist/assistant/echo-transport.js +26 -29
  4. package/dist/assistant/http-transport.d.ts +10 -0
  5. package/dist/assistant/http-transport.js +98 -0
  6. package/dist/assistant/types.d.ts +1 -7
  7. package/dist/auth/access-control.d.ts +13 -5
  8. package/dist/auth/access-control.js +25 -21
  9. package/dist/auth/auth-options.d.ts +23 -17
  10. package/dist/auth/auth-options.js +82 -48
  11. package/dist/auth/permission-matrix.d.ts +12 -0
  12. package/dist/auth/permission-matrix.js +67 -0
  13. package/dist/auth/types.d.ts +14 -4
  14. package/dist/block-editor/block-document.d.ts +64 -0
  15. package/dist/block-editor/block-document.js +147 -0
  16. package/dist/block-editor/data-blocks.d.ts +63 -0
  17. package/dist/block-editor/data-blocks.js +117 -0
  18. package/dist/chart/chart-data.js +46 -44
  19. package/dist/command-menu/hotkey.js +58 -47
  20. package/dist/command-menu/recents.d.ts +4 -0
  21. package/dist/command-menu/recents.js +12 -11
  22. package/dist/command-menu/registry.d.ts +9 -5
  23. package/dist/command-menu/registry.js +36 -46
  24. package/dist/controller/calendar-dates.d.ts +12 -0
  25. package/dist/controller/calendar-dates.js +94 -113
  26. package/dist/controller/calendar-events.js +93 -88
  27. package/dist/controller/client-list-controller.d.ts +2 -2
  28. package/dist/controller/client-list-controller.js +251 -254
  29. package/dist/controller/data-table-columns.d.ts +2 -0
  30. package/dist/controller/data-table-columns.js +50 -56
  31. package/dist/controller/deep-equal.d.ts +1 -0
  32. package/dist/controller/deep-equal.js +14 -0
  33. package/dist/controller/filter-toggle.js +36 -44
  34. package/dist/controller/in-place-editor.d.ts +43 -0
  35. package/dist/controller/in-place-editor.js +43 -0
  36. package/dist/controller/infinite-list-controller.js +219 -189
  37. package/dist/controller/inspector.d.ts +55 -0
  38. package/dist/controller/inspector.js +70 -0
  39. package/dist/controller/job-monitor.d.ts +10 -4
  40. package/dist/controller/job-monitor.js +46 -47
  41. package/dist/controller/kanban-board.js +45 -24
  42. package/dist/controller/list-controller.d.ts +8 -5
  43. package/dist/controller/list-controller.js +447 -400
  44. package/dist/controller/list-params.js +96 -87
  45. package/dist/controller/pivot-grid.d.ts +4 -4
  46. package/dist/controller/pivot-grid.js +89 -95
  47. package/dist/controller/prev-next.d.ts +2 -2
  48. package/dist/controller/prev-next.js +74 -54
  49. package/dist/controller/record-controllers.d.ts +14 -6
  50. package/dist/controller/record-controllers.js +288 -257
  51. package/dist/controller/record-diff.d.ts +21 -0
  52. package/dist/controller/record-diff.js +50 -0
  53. package/dist/controller/record-timeline.d.ts +5 -5
  54. package/dist/controller/record-timeline.js +42 -30
  55. package/dist/controller/record-tree.js +57 -47
  56. package/dist/controller/record-workflow.d.ts +38 -16
  57. package/dist/controller/record-workflow.js +85 -64
  58. package/dist/controller/reference-many-controller.d.ts +2 -0
  59. package/dist/controller/reference-many-controller.js +199 -192
  60. package/dist/controller/reference-one-controller.d.ts +1 -1
  61. package/dist/controller/reference-one-controller.js +63 -56
  62. package/dist/controller/saved-queries.js +104 -91
  63. package/dist/controller/translate-fallback.js +10 -6
  64. package/dist/csv/export.d.ts +4 -3
  65. package/dist/csv/export.js +43 -40
  66. package/dist/csv/import-controller.d.ts +4 -0
  67. package/dist/csv/import-controller.js +189 -169
  68. package/dist/csv/match-headers.js +29 -22
  69. package/dist/csv/parse-with.js +60 -54
  70. package/dist/csv/run-import.js +69 -72
  71. package/dist/csv/validate-rows.d.ts +1 -1
  72. package/dist/csv/validate-rows.js +65 -52
  73. package/dist/data/cache-ops.d.ts +5 -4
  74. package/dist/data/cache-ops.js +208 -188
  75. package/dist/data/combine-data-providers.js +25 -23
  76. package/dist/data/data-provider-log.d.ts +45 -0
  77. package/dist/data/data-provider-log.js +93 -0
  78. package/dist/data/errors.js +14 -10
  79. package/dist/data/fake-provider.d.ts +6 -3
  80. package/dist/data/fake-provider.js +135 -114
  81. package/dist/data/fetch-utils.js +61 -44
  82. package/dist/data/filter-branch.d.ts +5 -0
  83. package/dist/data/filter-branch.js +10 -0
  84. package/dist/data/get-many-aggregate.js +84 -76
  85. package/dist/data/http-error.js +17 -12
  86. package/dist/data/keys.js +50 -36
  87. package/dist/data/mutation-options.d.ts +14 -9
  88. package/dist/data/mutation-options.js +93 -109
  89. package/dist/data/query-options.js +73 -68
  90. package/dist/data/remove-empty.d.ts +3 -0
  91. package/dist/data/remove-empty.js +11 -0
  92. package/dist/data/undoable.d.ts +2 -2
  93. package/dist/data/undoable.js +190 -174
  94. package/dist/data/with-lifecycle-callbacks.d.ts +45 -17
  95. package/dist/data/with-lifecycle-callbacks.js +66 -52
  96. package/dist/environment/application-update-store.js +58 -55
  97. package/dist/environment/offline-store.js +21 -21
  98. package/dist/form/array-binding.d.ts +30 -11
  99. package/dist/form/array-binding.js +184 -166
  100. package/dist/form/choice-ids.d.ts +7 -0
  101. package/dist/form/choice-ids.js +11 -0
  102. package/dist/form/choices-controller.d.ts +22 -2
  103. package/dist/form/choices-controller.js +315 -275
  104. package/dist/form/date-format.d.ts +38 -0
  105. package/dist/form/date-format.js +89 -0
  106. package/dist/form/dirty-values.d.ts +2 -2
  107. package/dist/form/dirty-values.js +22 -11
  108. package/dist/form/duration.d.ts +22 -0
  109. package/dist/form/duration.js +49 -0
  110. package/dist/form/edit-create-form.d.ts +12 -5
  111. package/dist/form/edit-create-form.js +243 -188
  112. package/dist/form/event-value.d.ts +6 -0
  113. package/dist/form/event-value.js +17 -0
  114. package/dist/form/field-error.d.ts +14 -0
  115. package/dist/form/field-error.js +28 -0
  116. package/dist/form/field-name.d.ts +20 -0
  117. package/dist/form/field-name.js +6 -0
  118. package/dist/form/filter-form-values.js +63 -49
  119. package/dist/form/form-controller.d.ts +9 -1
  120. package/dist/form/form-controller.js +165 -160
  121. package/dist/form/form-groups.d.ts +4 -3
  122. package/dist/form/form-groups.js +79 -79
  123. package/dist/form/form-handle.d.ts +175 -0
  124. package/dist/form/form-handle.js +68 -0
  125. package/dist/form/input-binding.d.ts +56 -31
  126. package/dist/form/input-binding.js +171 -118
  127. package/dist/form/input-values.d.ts +140 -0
  128. package/dist/form/input-values.js +206 -0
  129. package/dist/form/json-text.d.ts +11 -0
  130. package/dist/form/json-text.js +62 -37
  131. package/dist/form/save-pipeline.d.ts +6 -8
  132. package/dist/form/save-pipeline.js +91 -82
  133. package/dist/form/set-form-values.d.ts +6 -0
  134. package/dist/form/set-form-values.js +10 -0
  135. package/dist/form/source.js +97 -65
  136. package/dist/form/text-of.d.ts +2 -0
  137. package/dist/form/text-of.js +7 -0
  138. package/dist/form/validators.d.ts +58 -19
  139. package/dist/form/validators.js +97 -71
  140. package/dist/geo/bbox.d.ts +5 -4
  141. package/dist/geo/bbox.js +69 -48
  142. package/dist/geo/bounds.d.ts +14 -3
  143. package/dist/geo/bounds.js +98 -68
  144. package/dist/geo/constraints.js +88 -93
  145. package/dist/geo/coordinates.d.ts +10 -0
  146. package/dist/geo/coordinates.js +44 -23
  147. package/dist/geo/editor.d.ts +13 -13
  148. package/dist/geo/editor.js +176 -153
  149. package/dist/geo/geocoding.d.ts +4 -4
  150. package/dist/geo/geocoding.js +38 -41
  151. package/dist/geo/geojson.d.ts +12 -74
  152. package/dist/geo/geojson.js +52 -40
  153. package/dist/geo/geometry-math.d.ts +4 -4
  154. package/dist/geo/geometry-math.js +100 -93
  155. package/dist/geo/index.d.ts +9 -8
  156. package/dist/geo/map-layers.d.ts +42 -7
  157. package/dist/geo/map-layers.js +88 -62
  158. package/dist/geo/map-style.d.ts +12 -0
  159. package/dist/geo/map-style.js +43 -32
  160. package/dist/geo/messages.js +48 -45
  161. package/dist/geo/nominatim.js +88 -80
  162. package/dist/geo/osm-presets.d.ts +4 -3
  163. package/dist/geo/osm-presets.js +108 -86
  164. package/dist/geo/osm-tags.js +14 -12
  165. package/dist/geo/overpass.d.ts +14 -2
  166. package/dist/geo/overpass.js +83 -90
  167. package/dist/geo/shape-value.d.ts +9 -5
  168. package/dist/geo/shape-value.js +169 -146
  169. package/dist/geo/snap-to-roads.d.ts +3 -3
  170. package/dist/geo/snap-to-roads.js +55 -50
  171. package/dist/geo/throttle.js +36 -39
  172. package/dist/guards.d.ts +44 -0
  173. package/dist/guards.js +77 -0
  174. package/dist/i18n/default-messages.js +34 -29
  175. package/dist/i18n/english-messages.d.ts +172 -0
  176. package/dist/i18n/english-messages.js +359 -189
  177. package/dist/i18n/i18n.d.ts +2 -2
  178. package/dist/i18n/i18n.js +47 -60
  179. package/dist/i18n/inflection.d.ts +34 -0
  180. package/dist/i18n/inflection.js +82 -0
  181. package/dist/i18n/messages.d.ts +10 -2
  182. package/dist/i18n/messages.js +17 -4
  183. package/dist/i18n/missing-keys.d.ts +4 -0
  184. package/dist/i18n/missing-keys.js +70 -62
  185. package/dist/i18n/translatable.d.ts +16 -1
  186. package/dist/i18n/translatable.js +40 -47
  187. package/dist/index.d.ts +87 -39
  188. package/dist/index.js +54 -301
  189. package/dist/json/deep-equal.d.ts +8 -0
  190. package/dist/json/deep-equal.js +24 -0
  191. package/dist/json/strip-json-comments.js +38 -42
  192. package/dist/noop.d.ts +2 -0
  193. package/dist/noop.js +4 -0
  194. package/dist/notification/error-message.d.ts +2 -0
  195. package/dist/notification/error-message.js +10 -0
  196. package/dist/notification/notification-store.d.ts +3 -2
  197. package/dist/notification/notification-store.js +41 -45
  198. package/dist/onboarding-tour/placement.d.ts +2 -0
  199. package/dist/onboarding-tour/placement.js +65 -78
  200. package/dist/onboarding-tour/tour-controller.js +46 -54
  201. package/dist/realtime/add-events-for-mutations.js +75 -81
  202. package/dist/realtime/announce-lock.js +16 -13
  203. package/dist/realtime/broadcast-channel-transport.js +65 -59
  204. package/dist/realtime/copy-members.js +22 -14
  205. package/dist/realtime/in-memory-lock-provider.js +40 -48
  206. package/dist/realtime/live.js +95 -101
  207. package/dist/realtime/lock-options.js +16 -16
  208. package/dist/realtime/lock-session.js +91 -78
  209. package/dist/realtime/memory-transport.js +25 -25
  210. package/dist/realtime/presence.js +120 -122
  211. package/dist/realtime/realtime-data-provider.d.ts +10 -0
  212. package/dist/realtime/realtime-data-provider.js +45 -42
  213. package/dist/realtime/reconnect-backoff.js +17 -0
  214. package/dist/realtime/sse-transport.d.ts +31 -0
  215. package/dist/realtime/sse-transport.js +235 -0
  216. package/dist/realtime/status-store.js +23 -28
  217. package/dist/realtime/topic-hub.js +62 -71
  218. package/dist/realtime/topics.js +10 -12
  219. package/dist/realtime/types.js +10 -12
  220. package/dist/realtime/unread-count.js +21 -21
  221. package/dist/realtime/websocket-transport.d.ts +32 -0
  222. package/dist/realtime/websocket-transport.js +306 -0
  223. package/dist/resource/describe-resource.d.ts +2 -0
  224. package/dist/resource/describe-resource.js +247 -219
  225. package/dist/resource/get-at-path.js +29 -14
  226. package/dist/resource/identifier.d.ts +18 -0
  227. package/dist/resource/identifier.js +27 -0
  228. package/dist/resource/record.d.ts +4 -0
  229. package/dist/resource/record.js +10 -0
  230. package/dist/resource/register.d.ts +7 -0
  231. package/dist/resource/registry-store.d.ts +45 -15
  232. package/dist/resource/registry-store.js +67 -60
  233. package/dist/resource/registry.d.ts +10 -0
  234. package/dist/resource/registry.js +8 -4
  235. package/dist/resource/source-path.d.ts +23 -2
  236. package/dist/rich-text/rich-text-extras.d.ts +134 -0
  237. package/dist/rich-text/rich-text-extras.js +181 -0
  238. package/dist/rich-text/rich-text-image.d.ts +124 -0
  239. package/dist/rich-text/rich-text-image.js +163 -0
  240. package/dist/rich-text/rich-text.d.ts +6 -0
  241. package/dist/rich-text/rich-text.js +125 -88
  242. package/dist/router/location.d.ts +24 -4
  243. package/dist/router/location.js +43 -18
  244. package/dist/router/match.js +47 -39
  245. package/dist/router/paths.js +40 -34
  246. package/dist/router/record-from-location.d.ts +1 -1
  247. package/dist/router/record-from-location.js +25 -17
  248. package/dist/store/adapters.js +51 -55
  249. package/dist/store/micro-store.js +57 -59
  250. package/dist/store/shallow-equal.d.ts +12 -0
  251. package/dist/store/shallow-equal.js +20 -0
  252. package/dist/store/store.js +54 -57
  253. package/dist/ui-defaults.d.ts +15 -0
  254. package/dist/ui-defaults.js +17 -0
  255. package/package.json +13 -11
@@ -1,123 +1,104 @@
1
- const DATE_ONLY = /^(\d{4})-(\d{2})-(\d{2})$/;
2
- const AGENDA_DAYS = 14;
3
- const atMidnight = (date, dayOffset = 0) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + dayOffset);
4
- const atEndOfDay = (date, dayOffset = 0) => new Date(
5
- date.getFullYear(),
6
- date.getMonth(),
7
- date.getDate() + dayOffset,
8
- 23,
9
- 59,
10
- 59,
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
- let date;
16
- if (value instanceof Date) {
17
- date = new Date(value.getTime());
18
- } else if (typeof value === "number") {
19
- date = new Date(value);
20
- } else if (typeof value === "string") {
21
- const dateOnly = DATE_ONLY.exec(value);
22
- if (dateOnly) {
23
- const [year, month, day] = [
24
- Number(dateOnly[1]),
25
- Number(dateOnly[2]),
26
- Number(dateOnly[3])
27
- ];
28
- date = new Date(2e3, 0, 1);
29
- date.setFullYear(year, month - 1, day);
30
- if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) {
31
- return void 0;
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
- if (view === "agenda") {
43
- return {
44
- start: atMidnight(anchor, -AGENDA_DAYS),
45
- end: atEndOfDay(anchor, AGENDA_DAYS)
46
- };
47
- }
48
- const first = view === "month" ? new Date(anchor.getFullYear(), anchor.getMonth(), 1) : anchor;
49
- const last = view === "month" ? new Date(anchor.getFullYear(), anchor.getMonth() + 1, 0) : anchor;
50
- return {
51
- start: atMidnight(first, -daysFromWeekStart(first, weekStartsOn)),
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
- const days = [];
57
- const first = atMidnight(range.start);
58
- for (let day = first; day.getTime() <= range.end.getTime(); day = atMidnight(first, days.length)) {
59
- days.push(day);
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;
48
+ }
49
+ /**
50
+ * The slot a whole day is: its local midnight to its last millisecond, the same
51
+ * inclusive end {@link calendarRange} gives a range. A day carrying a time is
52
+ * read as its day, not that instant.
53
+ */
54
+ function calendarDaySlot(day) {
55
+ return {
56
+ startISO: atMidnight(day).toISOString(),
57
+ endISO: atEndOfDay(day).toISOString(),
58
+ allDay: true
59
+ };
62
60
  }
63
61
  function shiftCalendarAnchor(view, anchor, direction) {
64
- const time = [
65
- anchor.getHours(),
66
- anchor.getMinutes(),
67
- anchor.getSeconds(),
68
- anchor.getMilliseconds()
69
- ];
70
- if (view === "month") {
71
- const month = anchor.getMonth() + direction;
72
- const lastDay = new Date(anchor.getFullYear(), month + 1, 0).getDate();
73
- return new Date(
74
- anchor.getFullYear(),
75
- month,
76
- Math.min(anchor.getDate(), lastDay),
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
- );
62
+ const time = [
63
+ anchor.getHours(),
64
+ anchor.getMinutes(),
65
+ anchor.getSeconds(),
66
+ anchor.getMilliseconds()
67
+ ];
68
+ if (view === "month") {
69
+ const month = anchor.getMonth() + direction;
70
+ const lastDay = new Date(anchor.getFullYear(), month + 1, 0).getDate();
71
+ return new Date(anchor.getFullYear(), month, Math.min(anchor.getDate(), lastDay), ...time);
72
+ }
73
+ const step = view === "week" ? 7 : AGENDA_DAYS;
74
+ return new Date(anchor.getFullYear(), anchor.getMonth(), anchor.getDate() + direction * step, ...time);
87
75
  }
88
- const pad = (value) => String(value).padStart(2, "0");
89
- const calendarDayKey = (date) => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
76
+ var pad = (value) => String(value).padStart(2, "0");
77
+ var calendarDayKey = (date) => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
90
78
  function calendarLabels(locale) {
91
- const month = new Intl.DateTimeFormat(locale, {
92
- month: "long",
93
- year: "numeric"
94
- });
95
- const span = new Intl.DateTimeFormat(locale, {
96
- month: "short",
97
- day: "numeric",
98
- year: "numeric"
99
- });
100
- const weekday = new Intl.DateTimeFormat(locale, { weekday: "short" });
101
- const dayNumber = new Intl.DateTimeFormat(locale, { day: "numeric" });
102
- const hour = new Intl.DateTimeFormat(locale, { hour: "numeric" });
103
- const agendaDay = new Intl.DateTimeFormat(locale, {
104
- weekday: "long",
105
- month: "long",
106
- day: "numeric"
107
- });
108
- return {
109
- title: (view, anchor, range) => view === "month" ? month.format(anchor) : span.formatRange(range.start, range.end),
110
- weekday: (date) => weekday.format(date),
111
- dayNumber: (date) => dayNumber.format(date),
112
- hour: (value) => hour.format(new Date(2e3, 0, 1, value)),
113
- agendaDay: (date) => agendaDay.format(date)
114
- };
79
+ const month = new Intl.DateTimeFormat(locale, {
80
+ month: "long",
81
+ year: "numeric"
82
+ });
83
+ const span = new Intl.DateTimeFormat(locale, {
84
+ month: "short",
85
+ day: "numeric",
86
+ year: "numeric"
87
+ });
88
+ const weekday = new Intl.DateTimeFormat(locale, { weekday: "short" });
89
+ const dayNumber = new Intl.DateTimeFormat(locale, { day: "numeric" });
90
+ const hour = new Intl.DateTimeFormat(locale, { hour: "numeric" });
91
+ const agendaDay = new Intl.DateTimeFormat(locale, {
92
+ weekday: "long",
93
+ month: "long",
94
+ day: "numeric"
95
+ });
96
+ return {
97
+ title: (view, anchor, range) => view === "month" ? month.format(anchor) : span.formatRange(range.start, range.end),
98
+ weekday: (date) => weekday.format(date),
99
+ dayNumber: (date) => dayNumber.format(date),
100
+ hour: (value) => hour.format(new Date(2e3, 0, 1, value)),
101
+ agendaDay: (date) => agendaDay.format(date)
102
+ };
115
103
  }
116
- export {
117
- calendarDayKey,
118
- calendarDays,
119
- calendarLabels,
120
- calendarRange,
121
- parseCalendarDate,
122
- shiftCalendarAnchor
123
- };
104
+ export { calendarDayKey, calendarDaySlot, 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
- const midnight = (date, dayOffset = 0) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + dayOffset);
4
- const isMidnight = (date) => date.getTime() === midnight(date).getTime();
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
- const events = [];
7
- for (const record of records) {
8
- const start = parseCalendarDate(getAtPath(record, options.startSource));
9
- if (!start) continue;
10
- const parsedEnd = options.endSource ? parseCalendarDate(getAtPath(record, options.endSource)) : void 0;
11
- const end = parsedEnd && parsedEnd.getTime() >= start.getTime() ? parsedEnd : void 0;
12
- const titleValue = options.titleSource ? getAtPath(record, options.titleSource) : void 0;
13
- const title = (typeof titleValue === "string" || typeof titleValue === "number") && titleValue !== "" ? String(titleValue) : options.getTitle(record);
14
- const colorValue = options.colorSource ? getAtPath(record, options.colorSource) : void 0;
15
- const color = colorValue == null ? void 0 : options.colorMap?.[String(colorValue)];
16
- const event = { record, start, title };
17
- if (end) event.end = end;
18
- if (color !== void 0) event.color = color;
19
- events.push(event);
20
- }
21
- return events;
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
- const dayTime = midnight(day).getTime();
25
- return events.filter(({ start, end }) => {
26
- const firstDay = midnight(start).getTime();
27
- let lastDay = firstDay;
28
- if (end && end.getTime() > start.getTime()) {
29
- lastDay = midnight(end, isMidnight(end) ? -1 : 0).getTime();
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
- const key = calendarDayKey(day);
36
- return events.filter(
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
- const inRange = events.filter(
42
- ({ start }) => start.getTime() >= range.start.getTime() && start.getTime() <= range.end.getTime()
43
- ).sort((a, b) => a.start.getTime() - b.start.getTime());
44
- const groups = [];
45
- const byKey = /* @__PURE__ */ new Map();
46
- for (const event of inRange) {
47
- const key = calendarDayKey(event.start);
48
- let group = byKey.get(key);
49
- if (!group) {
50
- group = { day: midnight(event.start), key, events: [] };
51
- byKey.set(key, group);
52
- groups.push(group);
53
- }
54
- group.events.push(event);
55
- }
56
- return groups;
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
- const wholeDaysBetween = (from, to) => Math.round(
59
- (Date.UTC(to.getFullYear(), to.getMonth(), to.getDate()) - Date.UTC(from.getFullYear(), from.getMonth(), from.getDate())) / 864e5
60
- );
61
- const addDays = (date, days) => new Date(
62
- date.getFullYear(),
63
- date.getMonth(),
64
- date.getDate() + days,
65
- date.getHours(),
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
- const days = wholeDaysBetween(fromDay, toDay);
72
- const start = addDays(event.start, days);
73
- return event.end ? { start, end: addDays(event.end, days) } : { start };
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
- if (endSource) {
77
- return {
78
- [`${startSource}_lte`]: range.end.toISOString(),
79
- [`${endSource}_gte`]: range.start.toISOString()
80
- };
81
- }
82
- return {
83
- [`${startSource}_gte`]: range.start.toISOString(),
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
- return endSource ? [`${startSource}_gte`] : [];
102
+ return endSource ? [`${startSource}_gte`] : [];
89
103
  }
90
104
  function omitCalendarRangeFilter(filter, startSource, endSource) {
91
- const rest = { ...filter };
92
- delete rest[`${startSource}_gte`];
93
- delete rest[`${startSource}_lte`];
94
- if (endSource) delete rest[`${endSource}_gte`];
95
- return rest;
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?: unknown;
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?: unknown;
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. */