@3mo/date-time-fields 0.15.0 → 0.16.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/FieldDateTime.js +13 -13
- package/dist/FieldDateTimeBase.d.ts +1 -0
- package/dist/FieldDateTimeBase.d.ts.map +1 -1
- package/dist/FieldDateTimeBase.js +141 -141
- package/dist/FieldDateTimeRange.js +46 -46
- package/dist/FieldTime.d.ts +49 -4
- package/dist/FieldTime.d.ts.map +1 -1
- package/dist/FieldTime.js +201 -9
- package/dist/custom-elements.json +153 -97
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/segments/DateTimeSegment.d.ts +20 -0
- package/dist/segments/DateTimeSegment.d.ts.map +1 -0
- package/dist/segments/DateTimeSegment.js +4 -0
- package/dist/segments/DateTimeSegmenter.d.ts +68 -0
- package/dist/segments/DateTimeSegmenter.d.ts.map +1 -0
- package/dist/segments/DateTimeSegmenter.js +247 -0
- package/dist/segments/DateTimeSegmentsController.d.ts +90 -0
- package/dist/segments/DateTimeSegmentsController.d.ts.map +1 -0
- package/dist/segments/DateTimeSegmentsController.js +235 -0
- package/dist/segments/index.d.ts +5 -0
- package/dist/segments/index.d.ts.map +1 -0
- package/dist/segments/index.js +4 -0
- package/dist/segments/segmentsStyles.d.ts +3 -0
- package/dist/segments/segmentsStyles.d.ts.map +1 -0
- package/dist/segments/segmentsStyles.js +46 -0
- package/dist/selection/Calendar.d.ts.map +1 -1
- package/dist/selection/Calendar.js +248 -245
- package/dist/selection/CalendarDatesController.d.ts +8 -2
- package/dist/selection/CalendarDatesController.d.ts.map +1 -1
- package/dist/selection/CalendarDatesController.js +35 -6
- package/dist/selection/HourList.d.ts +4 -0
- package/dist/selection/HourList.d.ts.map +1 -1
- package/dist/selection/HourList.js +24 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +51 -49
|
@@ -1,25 +1,54 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { Controller, html } from '@a11d/lit';
|
|
3
3
|
import { observeIntersection } from '@3mo/intersection-observer';
|
|
4
|
-
import {
|
|
4
|
+
import { Memoize as memoize, clear } from 'typescript-memoize';
|
|
5
|
+
import { Localizer } from '@3mo/localization';
|
|
5
6
|
import { FieldDateTimePrecision } from '../FieldDateTimePrecision.js';
|
|
6
7
|
export class CalendarDatesController extends Controller {
|
|
8
|
+
static { this.cacheKey = 'CalendarDatesController'; }
|
|
7
9
|
static get today() { return new DateTime().dayStart; }
|
|
8
10
|
static *generate(start, count, step) {
|
|
9
11
|
for (let i = 0; i < count; i++) {
|
|
10
12
|
yield start.add({ [step]: i });
|
|
11
13
|
}
|
|
12
14
|
}
|
|
13
|
-
static {
|
|
14
|
-
static get sampleWeek() { return this._sampleWeek; }
|
|
15
|
+
static get sampleWeek() { return CalendarDatesController._sampleWeek ??= CalendarDatesController.generateWeek(); }
|
|
15
16
|
static generateWeek() {
|
|
16
17
|
const sample = [...CalendarDatesController.generate(CalendarDatesController.today, CalendarDatesController.today.daysInWeek * 2, 'days')];
|
|
17
18
|
const indexOfFirstWeekStart = sample.findIndex(d => d.dayOfWeek === 1);
|
|
18
19
|
const daysInWeek = sample[0].daysInWeek;
|
|
19
|
-
|
|
20
|
+
return sample.slice(indexOfFirstWeekStart, indexOfFirstWeekStart + daysInWeek).map(d => d.dayStart);
|
|
20
21
|
}
|
|
22
|
+
static { this.connectedControllers = new Set(); }
|
|
21
23
|
static {
|
|
22
|
-
|
|
24
|
+
// `DateTime` freezes its calendar and time zone at construction, so every date which has already
|
|
25
|
+
// been generated still belongs to the previous language's calendar. Without discarding them,
|
|
26
|
+
// switching language only re-formats the existing Gregorian grid instead of rebuilding it.
|
|
27
|
+
Localizer.languages.change.subscribe(() => {
|
|
28
|
+
// Deferred so that every other subscriber has run first — in particular `DateTime`, which
|
|
29
|
+
// clears its own memoized calendar and time zone on the very same event. Regenerating any
|
|
30
|
+
// date before that happens would just reproduce the outgoing calendar.
|
|
31
|
+
queueMicrotask(() => {
|
|
32
|
+
clear([CalendarDatesController.cacheKey]);
|
|
33
|
+
CalendarDatesController._sampleWeek = undefined;
|
|
34
|
+
for (const controller of CalendarDatesController.connectedControllers) {
|
|
35
|
+
controller.invalidate();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
hostConnected() {
|
|
41
|
+
CalendarDatesController.connectedControllers.add(this);
|
|
42
|
+
}
|
|
43
|
+
hostDisconnected() {
|
|
44
|
+
CalendarDatesController.connectedControllers.delete(this);
|
|
45
|
+
}
|
|
46
|
+
/** Discards every generated date and regenerates them for the current calendar. */
|
|
47
|
+
invalidate() {
|
|
48
|
+
this.days = [];
|
|
49
|
+
this.months = [];
|
|
50
|
+
this.years = [];
|
|
51
|
+
this.navigationDate = DateTime.from(this._navigationDate.valueOf());
|
|
23
52
|
}
|
|
24
53
|
observerIntersectionNavigation(date, ...views) {
|
|
25
54
|
return !views.includes(this.host.view) ? html.nothing : observeIntersection(data => {
|
|
@@ -72,5 +101,5 @@ export class CalendarDatesController extends Controller {
|
|
|
72
101
|
}
|
|
73
102
|
}
|
|
74
103
|
__decorate([
|
|
75
|
-
|
|
104
|
+
memoize({ expiring: 60_000, tags: [CalendarDatesController.cacheKey] })
|
|
76
105
|
], CalendarDatesController, "today", null);
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { DateList } from './DateList.js';
|
|
2
2
|
export declare class HourList extends DateList {
|
|
3
|
+
/** Defaults to the language's convention, so English lists "02 PM" where German lists "14". */
|
|
4
|
+
hourCycle?: 'h11' | 'h12' | 'h23' | 'h24';
|
|
5
|
+
private labelTemplate;
|
|
6
|
+
static get styles(): import("@a11d/lit").CSSResult;
|
|
3
7
|
protected get listItemsTemplate(): import("lit-html").HTMLTemplateResult;
|
|
4
8
|
}
|
|
5
9
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HourList.d.ts","sourceRoot":"","sources":["../../selection/HourList.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,qBACa,QAAS,SAAQ,QAAQ;IACrC,cAAuB,iBAAiB,0CAWvC;CACD;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,cAAc,EAAE,QAAQ,CAAA;KACxB;CACD"}
|
|
1
|
+
{"version":3,"file":"HourList.d.ts","sourceRoot":"","sources":["../../selection/HourList.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,qBACa,QAAS,SAAQ,QAAQ;IACrC,+FAA+F;IACnF,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;IAErD,OAAO,CAAC,aAAa;IAMrB,WAAoB,MAAM,kCAazB;IAED,cAAuB,iBAAiB,0CAWvC;CACD;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,cAAc,EAAE,QAAQ,CAAA;KACxB;CACD"}
|
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { component, html, range } from '@a11d/lit';
|
|
2
|
+
import { component, css, html, property, range } from '@a11d/lit';
|
|
3
3
|
import { DateList } from './DateList.js';
|
|
4
4
|
let HourList = class HourList extends DateList {
|
|
5
|
+
labelTemplate(hour) {
|
|
6
|
+
const parts = this.navigationDate.with({ hour }).formatToParts({ hour: '2-digit', hourCycle: this.hourCycle });
|
|
7
|
+
const dayPeriod = parts.find(part => part.type === 'dayPeriod')?.value;
|
|
8
|
+
return html `${parts.find(part => part.type === 'hour')?.value}${!dayPeriod ? html.nothing : html ` <small>${dayPeriod}</small>`}`;
|
|
9
|
+
}
|
|
10
|
+
static get styles() {
|
|
11
|
+
return css `
|
|
12
|
+
${super.styles}
|
|
13
|
+
|
|
14
|
+
mo-selectable-list-item {
|
|
15
|
+
white-space: nowrap;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
small {
|
|
19
|
+
font-size: 0.65em;
|
|
20
|
+
opacity: 0.7;
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
}
|
|
5
24
|
get listItemsTemplate() {
|
|
6
25
|
return html `
|
|
7
26
|
${[...range(0, this.navigationDate.hoursInDay)].map(hour => html `
|
|
@@ -10,11 +29,14 @@ let HourList = class HourList extends DateList {
|
|
|
10
29
|
?data-navigating=${this.navigationDate.hour === hour}
|
|
11
30
|
@navigate=${() => this.navigate.dispatch(this.navigationDate.with({ hour }))}
|
|
12
31
|
@change=${(e) => !e.selected ? void 0 : this.change.dispatch((this.value ?? new DateTime).with({ hour }))}
|
|
13
|
-
>${
|
|
32
|
+
>${this.labelTemplate(hour)}</mo-selectable-list-item>
|
|
14
33
|
`)}
|
|
15
34
|
`;
|
|
16
35
|
}
|
|
17
36
|
};
|
|
37
|
+
__decorate([
|
|
38
|
+
property()
|
|
39
|
+
], HourList.prototype, "hourCycle", void 0);
|
|
18
40
|
HourList = __decorate([
|
|
19
41
|
component('mo-hour-list')
|
|
20
42
|
], HourList);
|