@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.
Files changed (37) hide show
  1. package/dist/FieldDateTime.js +13 -13
  2. package/dist/FieldDateTimeBase.d.ts +1 -0
  3. package/dist/FieldDateTimeBase.d.ts.map +1 -1
  4. package/dist/FieldDateTimeBase.js +141 -141
  5. package/dist/FieldDateTimeRange.js +46 -46
  6. package/dist/FieldTime.d.ts +49 -4
  7. package/dist/FieldTime.d.ts.map +1 -1
  8. package/dist/FieldTime.js +201 -9
  9. package/dist/custom-elements.json +153 -97
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -0
  13. package/dist/segments/DateTimeSegment.d.ts +20 -0
  14. package/dist/segments/DateTimeSegment.d.ts.map +1 -0
  15. package/dist/segments/DateTimeSegment.js +4 -0
  16. package/dist/segments/DateTimeSegmenter.d.ts +68 -0
  17. package/dist/segments/DateTimeSegmenter.d.ts.map +1 -0
  18. package/dist/segments/DateTimeSegmenter.js +247 -0
  19. package/dist/segments/DateTimeSegmentsController.d.ts +90 -0
  20. package/dist/segments/DateTimeSegmentsController.d.ts.map +1 -0
  21. package/dist/segments/DateTimeSegmentsController.js +235 -0
  22. package/dist/segments/index.d.ts +5 -0
  23. package/dist/segments/index.d.ts.map +1 -0
  24. package/dist/segments/index.js +4 -0
  25. package/dist/segments/segmentsStyles.d.ts +3 -0
  26. package/dist/segments/segmentsStyles.d.ts.map +1 -0
  27. package/dist/segments/segmentsStyles.js +46 -0
  28. package/dist/selection/Calendar.d.ts.map +1 -1
  29. package/dist/selection/Calendar.js +248 -245
  30. package/dist/selection/CalendarDatesController.d.ts +8 -2
  31. package/dist/selection/CalendarDatesController.d.ts.map +1 -1
  32. package/dist/selection/CalendarDatesController.js +35 -6
  33. package/dist/selection/HourList.d.ts +4 -0
  34. package/dist/selection/HourList.d.ts.map +1 -1
  35. package/dist/selection/HourList.js +24 -2
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. 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 { MemoizeExpiring as memoizeExpiring } from 'typescript-memoize';
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 { this._sampleWeek = new Array(); }
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
- CalendarDatesController._sampleWeek = sample.slice(indexOfFirstWeekStart, indexOfFirstWeekStart + daysInWeek).map(d => d.dayStart);
20
+ return sample.slice(indexOfFirstWeekStart, indexOfFirstWeekStart + daysInWeek).map(d => d.dayStart);
20
21
  }
22
+ static { this.connectedControllers = new Set(); }
21
23
  static {
22
- CalendarDatesController.generateWeek();
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
- memoizeExpiring(60_000)
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
- >${hour.format().padStart(2, this.zero.format())}</mo-selectable-list-item>
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);