@k2b/ui 0.29.0 → 0.30.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/dist/base.css +2 -2
- package/dist/browser/actions/Dropdown.js +6 -3
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +137 -7
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/SegmentedControl.js +5 -9
- package/dist/browser/actions/SegmentedControl.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +6 -3
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Tabs.js +5 -2
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/ViewTabs.js +294 -0
- package/dist/browser/actions/ViewTabs.js.map +1 -0
- package/dist/browser/actions/filter-messages.js +6 -2
- package/dist/browser/actions/filter-messages.js.map +1 -1
- package/dist/browser/actions/index.js +2 -1
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +1108 -604
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatDecision.js +120 -84
- package/dist/browser/chat/ChatDecision.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js +292 -159
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +8 -0
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/command-search.js +26 -15
- package/dist/browser/chat/command-search.js.map +1 -1
- package/dist/browser/chat/index.js +4 -2
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/content/Calendar.js +143 -116
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarWeekView.js +291 -266
- package/dist/browser/content/CalendarWeekView.js.map +1 -1
- package/dist/browser/content/DataTable.js +224 -155
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/data-table-messages.js +4 -2
- package/dist/browser/content/data-table-messages.js.map +1 -1
- package/dist/browser/feedback/MovedHint.js +197 -0
- package/dist/browser/feedback/MovedHint.js.map +1 -0
- package/dist/browser/feedback/dialog-core.js +66 -9
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/index.js +1 -0
- package/dist/browser/feedback/index.js.map +1 -1
- package/dist/browser/feedback/prompts.js +6 -1
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +337 -212
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +59 -5
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/intl/messages.js +12 -0
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/intl/weekend.js +39 -0
- package/dist/browser/intl/weekend.js.map +1 -0
- package/dist/browser/layout/AppOverview.js +0 -1
- package/dist/browser/layout/AppOverview.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +688 -471
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +3 -2
- package/dist/browser/layout/PageTitle.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +2 -2
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/SidebarSwitcher.js +13 -12
- package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
- package/dist/browser/layout/TabBar.js +1 -1
- package/dist/browser/layout/TabBar.js.map +1 -1
- package/dist/browser/layout/app-host-width.js +44 -0
- package/dist/browser/layout/app-host-width.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +219 -39
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/index.js +1 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/Placeholder.js +36 -13
- package/dist/browser/surfaces/Placeholder.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +5 -2
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +59 -7
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/SegmentedControl.js +1 -2
- package/dist/ssr/actions/SegmentedControl.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +2 -2
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +2 -2
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/ViewTabs.js +211 -0
- package/dist/ssr/actions/ViewTabs.js.map +1 -0
- package/dist/ssr/actions/filter-messages.js +6 -2
- package/dist/ssr/actions/filter-messages.js.map +1 -1
- package/dist/ssr/actions/index.js +2 -1
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +546 -131
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatDecision.js +33 -19
- package/dist/ssr/chat/ChatDecision.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +95 -24
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +8 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/command-search.js +26 -15
- package/dist/ssr/chat/command-search.js.map +1 -1
- package/dist/ssr/chat/index.js +4 -2
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/content/Calendar.js +109 -100
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarWeekView.js +42 -28
- package/dist/ssr/content/CalendarWeekView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +78 -31
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/data-table-messages.js +4 -2
- package/dist/ssr/content/data-table-messages.js.map +1 -1
- package/dist/ssr/feedback/MovedHint.js +166 -0
- package/dist/ssr/feedback/MovedHint.js.map +1 -0
- package/dist/ssr/feedback/dialog-core.js +66 -9
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/index.js +1 -0
- package/dist/ssr/feedback/index.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +6 -1
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +138 -69
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +59 -5
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/intl/messages.js +12 -0
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/intl/weekend.js +39 -0
- package/dist/ssr/intl/weekend.js.map +1 -0
- package/dist/ssr/layout/AppOverview.js +0 -1
- package/dist/ssr/layout/AppOverview.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +203 -39
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +3 -2
- package/dist/ssr/layout/PageTitle.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +2 -2
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/SidebarSwitcher.js +13 -12
- package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
- package/dist/ssr/layout/TabBar.js +1 -1
- package/dist/ssr/layout/TabBar.js.map +1 -1
- package/dist/ssr/layout/app-host-width.js +44 -0
- package/dist/ssr/layout/app-host-width.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +219 -39
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/index.js +1 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/Placeholder.js +24 -7
- package/dist/ssr/surfaces/Placeholder.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Dropdown.d.ts +4 -0
- package/dist/types/actions/FilterChip.d.ts +22 -0
- package/dist/types/actions/ViewTabs.d.ts +30 -0
- package/dist/types/actions/filter-messages.d.ts +2 -0
- package/dist/types/actions/index.d.ts +4 -2
- package/dist/types/chat/ChatComposer.d.ts +52 -0
- package/dist/types/chat/ChatDecision.d.ts +18 -2
- package/dist/types/chat/ChatPrimitives.d.ts +10 -0
- package/dist/types/chat/chat-messages.d.ts +4 -0
- package/dist/types/chat/command-search.d.ts +2 -0
- package/dist/types/chat/index.d.ts +9 -8
- package/dist/types/content/DataTable.d.ts +3 -0
- package/dist/types/content/data-table-messages.d.ts +1 -0
- package/dist/types/feedback/MovedHint.d.ts +25 -0
- package/dist/types/feedback/dialog-core.d.ts +5 -2
- package/dist/types/feedback/index.d.ts +2 -0
- package/dist/types/feedback/prompts.d.ts +2 -0
- package/dist/types/inputs/DatePicker.d.ts +7 -0
- package/dist/types/inputs/date-picker.d.ts +25 -1
- package/dist/types/intl/messages.d.ts +6 -0
- package/dist/types/intl/weekend.d.ts +12 -0
- package/dist/types/layout/AppWorkspace.d.ts +43 -7
- package/dist/types/layout/app-host-width.d.ts +6 -0
- package/dist/types/layout/index.d.ts +2 -1
- package/dist/types/surfaces/Placeholder.d.ts +2 -1
- package/package.json +4 -4
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
|
|
1
2
|
import { ssrElement as _$ssrElement } from "solid-js/web";
|
|
2
3
|
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
3
4
|
import { createComponent as _$createComponent } from "solid-js/web";
|
|
@@ -15,28 +16,35 @@ var _tmpl$ = ["<i class=\"", "\" aria-hidden=\"true\"></i>"],
|
|
|
15
16
|
_tmpl$8 = ["<div class=\"k2b-date-picker\"", ">", "", "<div id=\"", "\" class=\"k2b-date-popover\" popover=\"auto\" role=\"dialog\"", ">", "", "</div></div>"],
|
|
16
17
|
_tmpl$9 = ["<aside class=\"k2b-date-presets\"", ">", "</aside>"],
|
|
17
18
|
_tmpl$0 = ["<button type=\"button\">", "</button>"],
|
|
18
|
-
_tmpl$1 = ["<div class=\"k2b-date-weekdays\" aria-hidden=\"true\">", "</div>"],
|
|
19
|
-
_tmpl$10 = ["<div class=\"k2b-date-grid\" role=\"grid\">", "</div>"],
|
|
19
|
+
_tmpl$1 = ["<div class=\"k2b-date-weekdays\" aria-hidden=\"true\">", "", "</div>"],
|
|
20
|
+
_tmpl$10 = ["<div class=\"k2b-date-grid\" role=\"grid\">", "", "</div>"],
|
|
20
21
|
_tmpl$11 = ["<section class=\"k2b-date-calendar\"", "><header class=\"k2b-date-calendar__header\"><button type=\"button\" class=\"k2b-date-calendar__nav\"", "><i class=\"ti ti-chevron-left\" aria-hidden=\"true\"></i></button><button type=\"button\" class=\"k2b-date-calendar__title\">", "</button><button type=\"button\" class=\"k2b-date-calendar__nav\"", "><i class=\"ti ti-chevron-right\" aria-hidden=\"true\"></i></button></header>", "</section>"],
|
|
21
22
|
_tmpl$12 = ["<div class=\"k2b-date-months\" role=\"group\" aria-label=\"", "\">", "</div>"],
|
|
22
23
|
_tmpl$13 = ["<button type=\"button\"", ">", "</button>"],
|
|
23
|
-
_tmpl$14 = ["<span
|
|
24
|
-
_tmpl$15 = ["<
|
|
25
|
-
_tmpl$16 = ["<
|
|
26
|
-
_tmpl$17 = ["<
|
|
27
|
-
_tmpl$18 = ["<
|
|
28
|
-
_tmpl$19 = ["<
|
|
29
|
-
_tmpl$20 = ["<
|
|
30
|
-
_tmpl$21 = ["<
|
|
31
|
-
_tmpl$22 = ["<
|
|
32
|
-
_tmpl$23 = ["<div class=\"k2b-date-
|
|
24
|
+
_tmpl$14 = ["<span class=\"k2b-date-weekend\" style=\"", "\"></span>"],
|
|
25
|
+
_tmpl$15 = ["<span", ">", "</span>"],
|
|
26
|
+
_tmpl$16 = ["<span class=\"k2b-date-weekend\" aria-hidden=\"true\" style=\"", "\"></span>"],
|
|
27
|
+
_tmpl$17 = ["<div class=\"k2b-date-week\" role=\"row\">", "</div>"],
|
|
28
|
+
_tmpl$18 = ["<button type=\"button\" role=\"gridcell\"", ">", "</button>"],
|
|
29
|
+
_tmpl$19 = ["<span>", "</span>"],
|
|
30
|
+
_tmpl$20 = ["<label class=\"k2b-date-time\">", "<span class=\"k2b-date-time__control\"><input type=\"text\" inputmode=\"numeric\"", " placeholder=\"09:00\"", "><i class=\"ti ti-clock\" aria-hidden=\"true\"></i></span></label>"],
|
|
31
|
+
_tmpl$21 = ["<div class=\"k2b-date-popover__body\">", "", "</div>"],
|
|
32
|
+
_tmpl$22 = ["<button type=\"button\" class=\"k2b-date-optional-time__remove\"", "><i class=\"ti ti-x\" aria-hidden=\"true\"></i></button>"],
|
|
33
|
+
_tmpl$23 = ["<div class=\"k2b-date-optional-time\"", ">", "</div>"],
|
|
34
|
+
_tmpl$24 = ["<div class=\"k2b-date-actions\">", "<button type=\"button\" class=\"k2b-date-apply\"", ">", "</button></div>"],
|
|
35
|
+
_tmpl$25 = ["<button type=\"button\" class=\"k2b-date-optional-time__add\"><i class=\"ti ti-clock-plus\" aria-hidden=\"true\"></i>", "</button>"],
|
|
36
|
+
_tmpl$26 = ["<span class=\"k2b-date-range-value\"><span>", "</span><i class=\"ti ti-arrow-narrow-right\" aria-hidden=\"true\"></i><span>", "</span></span>"],
|
|
37
|
+
_tmpl$27 = ["<span class=\"k2b-date-duration\"><i class=\"ti ti-hourglass-low\" aria-hidden=\"true\"></i>", "</span>"],
|
|
38
|
+
_tmpl$28 = ["<div class=\"k2b-date-range-times\">", "", "</div>"],
|
|
39
|
+
_tmpl$29 = ["<div class=\"k2b-date-durations\" role=\"group\"", ">", "</div>"];
|
|
33
40
|
import { dates } from "@k2b/stdlib";
|
|
34
41
|
import { createEffect, createMemo, createSignal, For, onCleanup, onMount, Show } from "solid-js";
|
|
35
42
|
import { createFieldMeta, Field, fieldControlAria, fieldDescribedBy } from "../internal/field";
|
|
36
43
|
import { returnFocus, ringOnReturn } from "../internal/focus-return";
|
|
37
44
|
import { useDateConfigLocale } from "../intl/locale";
|
|
38
45
|
import { resolveUiMessages, useUiMessages } from "../intl/messages";
|
|
39
|
-
import {
|
|
46
|
+
import { isWeekendKey } from "../intl/weekend";
|
|
47
|
+
import { dateKey, displayDate, filterTimeInput, formatDateOnlyRangeDuration, formatDateTimeValue, inRange, isCompleteTime, isDateKey, isRangeEdge, monthDate, monthNames, msUntilNextDay, normalizeTimeInput, parseDateValue, pickerContext, pickRangeDay, previewRange, rangeAnchor, resolveFocusDay, splitDateTime, toDateTimeValue, weekendBands, yearMonth } from "./date-picker";
|
|
40
48
|
import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
|
|
41
49
|
const popoverIsOpen = popover => {
|
|
42
50
|
if (!popover) return false;
|
|
@@ -277,6 +285,9 @@ function DatePickerPanel(props) {
|
|
|
277
285
|
document.addEventListener("visibilitychange", refresh);
|
|
278
286
|
onCleanup(() => document.removeEventListener("visibilitychange", refresh));
|
|
279
287
|
});
|
|
288
|
+
// The weekend columns of the locale, read from the first week so they follow the grid's first day of the week.
|
|
289
|
+
const weekendColumns = createMemo(() => (dayRows()[0] ?? []).map(cell => isWeekendKey(cell.key, context().locale)));
|
|
290
|
+
const bands = createMemo(() => weekendBands(weekendColumns()));
|
|
280
291
|
let calendar;
|
|
281
292
|
// Days that belong to the visible month; the roving tabindex must land on one
|
|
282
293
|
// of them or the grid becomes unreachable by keyboard after month navigation.
|
|
@@ -343,17 +354,27 @@ function DatePickerPanel(props) {
|
|
|
343
354
|
},
|
|
344
355
|
get children() {
|
|
345
356
|
return [_$ssr(_tmpl$1, _$escape(_$createComponent(For, {
|
|
357
|
+
get each() {
|
|
358
|
+
return bands();
|
|
359
|
+
},
|
|
360
|
+
children: band => _$ssr(_tmpl$14, _$ssrStyleProperty("grid-column:", `${_$escape(band.start, true) + 1} / span ${_$escape(band.span, true)}`))
|
|
361
|
+
})), _$escape(_$createComponent(For, {
|
|
346
362
|
get each() {
|
|
347
363
|
return weekdays();
|
|
348
364
|
},
|
|
349
|
-
children: day => _$ssr(_tmpl$
|
|
365
|
+
children: (day, index) => _$ssr(_tmpl$15, _$ssrAttribute("data-weekend", weekendColumns()[index()] ? "true" : _$escape(undefined, true), false), _$escape(day))
|
|
350
366
|
}))), _$ssr(_tmpl$10, _$escape(_$createComponent(For, {
|
|
367
|
+
get each() {
|
|
368
|
+
return bands();
|
|
369
|
+
},
|
|
370
|
+
children: band => _$ssr(_tmpl$16, _$ssrStyleProperty("grid-column:", `${_$escape(band.start, true) + 1} / span ${_$escape(band.span, true)}`) + _$ssrStyleProperty(";grid-row:", `1 / span ${_$escape(dayRows().length, true)}`))
|
|
371
|
+
})), _$escape(_$createComponent(For, {
|
|
351
372
|
get each() {
|
|
352
373
|
return dayRows();
|
|
353
374
|
},
|
|
354
|
-
children: week => _$ssr(_tmpl$
|
|
375
|
+
children: week => _$ssr(_tmpl$17, _$escape(_$createComponent(For, {
|
|
355
376
|
each: week,
|
|
356
|
-
children: cell => {
|
|
377
|
+
children: (cell, cellIndex) => {
|
|
357
378
|
const selected = () => props.selected?.() === cell.key;
|
|
358
379
|
const range = () => props.range?.() ?? {
|
|
359
380
|
start: null,
|
|
@@ -362,7 +383,7 @@ function DatePickerPanel(props) {
|
|
|
362
383
|
const active = () => selected() || isRangeEdge(cell.key, range());
|
|
363
384
|
const focusable = () => cell.key === defaultFocus();
|
|
364
385
|
const today = () => cell.key === todayKey();
|
|
365
|
-
return _$ssr(_tmpl$
|
|
386
|
+
return _$ssr(_tmpl$18, _$ssrAttribute("data-date-day", _$escape(cell.key, true), false) + _$ssrAttribute("data-date-focus", focusable() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-outside", cell.outside ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-weekend", weekendColumns()[cellIndex()] ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-in-range", inRange(cell.key, range()) && !active() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-today", today() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("aria-current", today() ? "date" : _$escape(undefined, true), false) + _$ssrAttribute("aria-label", today() ? _$escape(todayLabel(cell.label), true) : _$escape(cell.label, true), false) + _$ssrAttribute("aria-selected", _$escape(active(), true), false) + _$ssrAttribute("tabindex", focusable() ? 0 : -1, false), _$escape(cell.number));
|
|
366
387
|
}
|
|
367
388
|
})))
|
|
368
389
|
})))];
|
|
@@ -371,12 +392,12 @@ function DatePickerPanel(props) {
|
|
|
371
392
|
}
|
|
372
393
|
function TimeInput(props) {
|
|
373
394
|
const messages = useUiMessages();
|
|
374
|
-
return _$ssr(_tmpl$
|
|
395
|
+
return _$ssr(_tmpl$20, _$escape(_$createComponent(Show, {
|
|
375
396
|
get when() {
|
|
376
397
|
return props.label;
|
|
377
398
|
},
|
|
378
399
|
get children() {
|
|
379
|
-
return _$ssr(_tmpl$
|
|
400
|
+
return _$ssr(_tmpl$19, _$escape(props.label));
|
|
380
401
|
}
|
|
381
402
|
})), _$ssrAttribute("value", _$escape(props.time, true), false), _$ssrAttribute("aria-label", props.label ? _$escape(messages().timeLabel({
|
|
382
403
|
label: props.label
|
|
@@ -399,7 +420,7 @@ export function DatePicker(props) {
|
|
|
399
420
|
get wide() {
|
|
400
421
|
return Boolean(props.presets?.length);
|
|
401
422
|
},
|
|
402
|
-
children: close => _$ssr(_tmpl$
|
|
423
|
+
children: close => _$ssr(_tmpl$21, _$escape(_$createComponent(PresetRail, {
|
|
403
424
|
get presets() {
|
|
404
425
|
return props.presets;
|
|
405
426
|
},
|
|
@@ -427,19 +448,38 @@ export function DateTimePicker(props) {
|
|
|
427
448
|
const value = () => resolveMaybeAccessor(props.value);
|
|
428
449
|
const dateConfig = useDateConfigLocale(() => props.dateConfig);
|
|
429
450
|
const parts = () => splitDateTime(value(), dateConfig());
|
|
451
|
+
const defaultTime = () => props.defaultTime ?? "09:00";
|
|
452
|
+
// Without `optionalTime` every value has a time; with it a date key has none.
|
|
453
|
+
const valueHasTime = () => !props.optionalTime || Boolean(value()) && !isDateKey(value());
|
|
430
454
|
const [visibleMonth, setVisibleMonth] = createSignal(parseDateValue(parts().date, dateConfig()));
|
|
431
455
|
const [draftDate, setDraftDate] = createSignal(parts().date);
|
|
432
|
-
const [draftTime, setDraftTime] = createSignal(parts().time ||
|
|
433
|
-
const
|
|
456
|
+
const [draftTime, setDraftTime] = createSignal(parts().time || defaultTime());
|
|
457
|
+
const [withTime, setWithTime] = createSignal(valueHasTime());
|
|
458
|
+
const valueLabel = () => valueHasTime() ? formatDateTimeValue(value(), dateConfig()) : displayDate(value(), dateConfig());
|
|
459
|
+
let addTimeButton;
|
|
460
|
+
let timeField;
|
|
434
461
|
const syncDraft = () => {
|
|
435
462
|
const next = parts();
|
|
436
463
|
setDraftDate(next.date);
|
|
437
|
-
setDraftTime(next.time ||
|
|
464
|
+
setDraftTime(next.time || defaultTime());
|
|
465
|
+
setWithTime(valueHasTime());
|
|
438
466
|
setVisibleMonth(parseDateValue(next.date, dateConfig()));
|
|
439
467
|
};
|
|
468
|
+
const canApply = () => Boolean(draftDate()) && (!withTime() || isCompleteTime(draftTime()));
|
|
469
|
+
const draftValue = () => withTime() ? toDateTimeValue(draftDate(), draftTime(), dateConfig()) : draftDate() || null;
|
|
470
|
+
const addTime = () => {
|
|
471
|
+
setWithTime(true);
|
|
472
|
+
queueMicrotask(() => timeField?.querySelector("input")?.focus());
|
|
473
|
+
};
|
|
474
|
+
const removeTime = () => {
|
|
475
|
+
setWithTime(false);
|
|
476
|
+
queueMicrotask(() => addTimeButton?.focus());
|
|
477
|
+
};
|
|
440
478
|
return _$createComponent(PickerShell, {
|
|
441
479
|
owner: props,
|
|
442
|
-
icon
|
|
480
|
+
get icon() {
|
|
481
|
+
return props.optionalTime && !valueHasTime() ? "ti ti-calendar" : "ti ti-calendar-time";
|
|
482
|
+
},
|
|
443
483
|
valueLabel: valueLabel,
|
|
444
484
|
get valueContent() {
|
|
445
485
|
return props.renderValue ? () => props.renderValue(value()) : undefined;
|
|
@@ -452,32 +492,67 @@ export function DateTimePicker(props) {
|
|
|
452
492
|
get wide() {
|
|
453
493
|
return Boolean(props.presets?.length);
|
|
454
494
|
},
|
|
455
|
-
children: close =>
|
|
456
|
-
|
|
457
|
-
return
|
|
458
|
-
|
|
459
|
-
onSelect: value => {
|
|
495
|
+
children: close => {
|
|
496
|
+
const apply = () => {
|
|
497
|
+
if (!canApply()) return;
|
|
498
|
+
const next = draftValue();
|
|
460
499
|
close();
|
|
461
|
-
commitFieldValue(props,
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
},
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
500
|
+
commitFieldValue(props, next);
|
|
501
|
+
};
|
|
502
|
+
return [_$ssr(_tmpl$21, _$escape(_$createComponent(PresetRail, {
|
|
503
|
+
get presets() {
|
|
504
|
+
return props.presets;
|
|
505
|
+
},
|
|
506
|
+
onSelect: value => {
|
|
507
|
+
close();
|
|
508
|
+
commitFieldValue(props, value);
|
|
509
|
+
}
|
|
510
|
+
})), _$escape(_$createComponent(DatePickerPanel, {
|
|
511
|
+
visibleMonth: visibleMonth,
|
|
512
|
+
setVisibleMonth: setVisibleMonth,
|
|
513
|
+
selected: draftDate,
|
|
514
|
+
focusDate: draftDate,
|
|
515
|
+
onSelect: value => {
|
|
516
|
+
setDraftDate(value);
|
|
517
|
+
setVisibleMonth(parseDateValue(value, dateConfig()));
|
|
518
|
+
// A date without a time is complete with the day, as in the date picker.
|
|
519
|
+
if (props.optionalTime && !withTime()) apply();
|
|
520
|
+
},
|
|
521
|
+
get dateConfig() {
|
|
522
|
+
return dateConfig();
|
|
523
|
+
}
|
|
524
|
+
}))), _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
|
|
525
|
+
get when() {
|
|
526
|
+
return props.optionalTime;
|
|
527
|
+
},
|
|
528
|
+
get fallback() {
|
|
529
|
+
return _$createComponent(TimeInput, {
|
|
530
|
+
get time() {
|
|
531
|
+
return draftTime();
|
|
532
|
+
},
|
|
533
|
+
onChange: setDraftTime
|
|
534
|
+
});
|
|
535
|
+
},
|
|
536
|
+
get children() {
|
|
537
|
+
return _$ssr(_tmpl$23, _$ssrAttribute("data-with-time", withTime() ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
538
|
+
get when() {
|
|
539
|
+
return withTime();
|
|
540
|
+
},
|
|
541
|
+
get fallback() {
|
|
542
|
+
return _$ssr(_tmpl$25, _$escape(messages().addTime));
|
|
543
|
+
},
|
|
544
|
+
get children() {
|
|
545
|
+
return [_$createComponent(TimeInput, {
|
|
546
|
+
get time() {
|
|
547
|
+
return draftTime();
|
|
548
|
+
},
|
|
549
|
+
onChange: setDraftTime
|
|
550
|
+
}), _$ssr(_tmpl$22, _$ssrAttribute("aria-label", _$escape(messages().removeTime, true), false) + _$ssrAttribute("title", _$escape(messages().removeTime, true), false))];
|
|
551
|
+
}
|
|
552
|
+
})));
|
|
553
|
+
}
|
|
554
|
+
})), _$ssrAttribute("disabled", !canApply(), true), _$escape(messages().apply))];
|
|
555
|
+
}
|
|
481
556
|
});
|
|
482
557
|
}
|
|
483
558
|
export function DateRangePicker(props) {
|
|
@@ -500,16 +575,19 @@ export function DateRangePicker(props) {
|
|
|
500
575
|
start: parts().start.date || null,
|
|
501
576
|
end: parts().end.date || null
|
|
502
577
|
});
|
|
578
|
+
// The day of the last click that started a one-day range; the next click on another day extends from it.
|
|
579
|
+
const [anchor, setAnchor] = createSignal(null);
|
|
503
580
|
const [previewDate, setPreviewDate] = createSignal(null);
|
|
504
581
|
const [startTime, setStartTime] = createSignal(parts().start.time || "09:00");
|
|
505
582
|
const [endTime, setEndTime] = createSignal(parts().end.time || "10:00");
|
|
506
|
-
const displayRange = createMemo(() => previewRange(draftRange(), previewDate()));
|
|
583
|
+
const displayRange = createMemo(() => previewRange(draftRange(), anchor(), previewDate()));
|
|
507
584
|
const syncDraft = () => {
|
|
508
585
|
const next = parts();
|
|
509
586
|
setDraftRange({
|
|
510
587
|
start: next.start.date || null,
|
|
511
588
|
end: next.end.date || null
|
|
512
589
|
});
|
|
590
|
+
setAnchor(null);
|
|
513
591
|
setPreviewDate(null);
|
|
514
592
|
setStartTime(next.start.time || "09:00");
|
|
515
593
|
setEndTime(next.end.time || "10:00");
|
|
@@ -522,18 +600,12 @@ export function DateRangePicker(props) {
|
|
|
522
600
|
};
|
|
523
601
|
const valueContent = () => {
|
|
524
602
|
const format = withTime() ? formatDateTimeValue : displayDate;
|
|
525
|
-
return _$ssr(_tmpl$
|
|
603
|
+
return _$ssr(_tmpl$26, value().start ? _$escape(format(value().start, dateConfig())) : _$escape(messages().start), value().end ? _$escape(format(value().end, dateConfig())) : "End");
|
|
526
604
|
};
|
|
527
605
|
const selectDate = value => {
|
|
528
|
-
const
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
start: value,
|
|
532
|
-
end: null
|
|
533
|
-
});
|
|
534
|
-
} else {
|
|
535
|
-
setDraftRange(orderedRange(current.start, value));
|
|
536
|
-
}
|
|
606
|
+
const next = pickRangeDay(draftRange(), anchor(), value);
|
|
607
|
+
setDraftRange(next.range);
|
|
608
|
+
setAnchor(next.anchor);
|
|
537
609
|
setPreviewDate(null);
|
|
538
610
|
};
|
|
539
611
|
const applyDuration = minutes => {
|
|
@@ -598,14 +670,14 @@ export function DateRangePicker(props) {
|
|
|
598
670
|
return durationLabel();
|
|
599
671
|
},
|
|
600
672
|
get children() {
|
|
601
|
-
return _$ssr(_tmpl$
|
|
673
|
+
return _$ssr(_tmpl$27, _$escape(durationLabel()));
|
|
602
674
|
}
|
|
603
675
|
}),
|
|
604
676
|
onOpen: syncDraft,
|
|
605
677
|
get wide() {
|
|
606
678
|
return Boolean(props.datePresets?.length || props.presets?.length);
|
|
607
679
|
},
|
|
608
|
-
children: close => [_$ssr(_tmpl$
|
|
680
|
+
children: close => [_$ssr(_tmpl$21, _$escape(_$createComponent(Show, {
|
|
609
681
|
get when() {
|
|
610
682
|
return props.datePresets?.length;
|
|
611
683
|
},
|
|
@@ -643,10 +715,7 @@ export function DateRangePicker(props) {
|
|
|
643
715
|
range: displayRange,
|
|
644
716
|
focusDate: () => draftRange().start,
|
|
645
717
|
onSelect: selectDate,
|
|
646
|
-
onDayPreview: value =>
|
|
647
|
-
const current = draftRange();
|
|
648
|
-
setPreviewDate(current.start && !current.end ? value : null);
|
|
649
|
-
},
|
|
718
|
+
onDayPreview: value => setPreviewDate(rangeAnchor(draftRange(), anchor()) ? value : null),
|
|
650
719
|
get dateConfig() {
|
|
651
720
|
return dateConfig();
|
|
652
721
|
}
|
|
@@ -655,7 +724,7 @@ export function DateRangePicker(props) {
|
|
|
655
724
|
return withTime();
|
|
656
725
|
},
|
|
657
726
|
get children() {
|
|
658
|
-
return _$ssr(_tmpl$
|
|
727
|
+
return _$ssr(_tmpl$28, _$escape(_$createComponent(TimeInput, {
|
|
659
728
|
get label() {
|
|
660
729
|
return messages().start;
|
|
661
730
|
},
|
|
@@ -673,12 +742,12 @@ export function DateRangePicker(props) {
|
|
|
673
742
|
onChange: setEndTime
|
|
674
743
|
})));
|
|
675
744
|
}
|
|
676
|
-
}), _$ssr(_tmpl$
|
|
745
|
+
}), _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
|
|
677
746
|
get when() {
|
|
678
747
|
return _$memo(() => !!withTime())() && props.durationPresets?.length;
|
|
679
748
|
},
|
|
680
749
|
get children() {
|
|
681
|
-
return _$ssr(_tmpl$
|
|
750
|
+
return _$ssr(_tmpl$29, _$ssrAttribute("aria-label", _$escape(messages().durationPresets, true), false), _$escape(_$createComponent(For, {
|
|
682
751
|
get each() {
|
|
683
752
|
return props.durationPresets;
|
|
684
753
|
},
|