@3mo/date-time-fields 0.13.0 → 0.14.1

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.
@@ -8,6 +8,9 @@ export declare class Calendar extends Component {
8
8
  value?: DateTimeRange;
9
9
  precision: FieldDateTimePrecision;
10
10
  includeWeek: boolean;
11
+ min?: DateTime;
12
+ max?: DateTime;
13
+ dateDisabled?: (date: DateTime) => boolean;
11
14
  private readonly datesController;
12
15
  view: FieldDateTimePrecision;
13
16
  setView(view: FieldDateTimePrecision, navigationDate?: import("@3mo/date-time/DateTime.js").DateTime): void;
@@ -24,6 +27,7 @@ export declare class Calendar extends Component {
24
27
  protected getWeekTemplate(date: DateTime, month: ReadonlyArray<DateTime>): import("lit-html").HTMLTemplateResult;
25
28
  private getDayTemplate;
26
29
  private handleItemClick;
30
+ private isDisabled;
27
31
  private isNavigating;
28
32
  private isNow;
29
33
  private isStart;
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../selection/Calendar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmE,MAAM,WAAW,CAAA;AAEtG,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAErE;;GAEG;AACH,qBACa,QAAS,SAAQ,SAAS;IAC7B,QAAQ,CAAC,SAAS,EAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IAE3B,KAAK,CAAC,EAAE,aAAa,CAAA;IACqC,SAAS,EAAG,sBAAsB,CAAA;IAC5E,WAAW,UAAQ;IAE/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IAE3D,IAAI,yBAA6B;IAC1C,OAAO,CAAC,IAAI,EAAE,sBAAsB,EAAE,cAAc,gDAAsC;IAK1F,IAAI,cAAc,kDAAiD;IAC7D,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAE,SAAS,GAAG,QAAoB;IAWnF,WAAoB,MAAM,kCAmKzB;IAED,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,KAAK,OAAO,GAKlB;IAED,OAAO,CAAC,aAAa;IAIrB,cAAuB,QAAQ,0CAM9B;IAED,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,MAAM,KAAK,gBAAgB,GAiBlC;IAED,OAAO,CAAC,gBAAgB;IAyBxB,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC;IAyBxE,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,eAAe,CAgBtB;IAED,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,SAAS;CAKjB;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,aAAa,EAAE,QAAQ,CAAA;KACvB;CACD"}
1
+ {"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../selection/Calendar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmE,MAAM,WAAW,CAAA;AAGtG,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAErE;;GAEG;AACH,qBACa,QAAS,SAAQ,SAAS;IAC7B,QAAQ,CAAC,SAAS,EAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IAE3B,KAAK,CAAC,EAAE,aAAa,CAAA;IACqC,SAAS,EAAG,sBAAsB,CAAA;IAC5E,WAAW,UAAQ;IACnC,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,GAAG,CAAC,EAAE,QAAQ,CAAA;IACF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAA;IAElF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IAE3D,IAAI,yBAA6B;IAC1C,OAAO,CAAC,IAAI,EAAE,sBAAsB,EAAE,cAAc,gDAAsC;IAK1F,IAAI,cAAc,kDAAiD;IAC7D,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAE,SAAS,GAAG,QAAoB;IAWnF,WAAoB,MAAM,kCAwKzB;IAED,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,KAAK,OAAO,GAKlB;IAED,OAAO,CAAC,aAAa;IAIrB,cAAuB,QAAQ,0CAM9B;IAED,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,MAAM,KAAK,gBAAgB,GAiBlC;IAED,OAAO,CAAC,gBAAgB;IA0BxB,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC;IA0BxE,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,eAAe,CAmBtB;IAED,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,SAAS;CAKjB;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,aAAa,EAAE,QAAQ,CAAA;KACvB;CACD"}
@@ -1,6 +1,7 @@
1
1
  var Calendar_1;
2
2
  import { __decorate } from "tslib";
3
3
  import { Component, css, component, html, property, event, repeat, state, unsafeCSS } from '@a11d/lit';
4
+ import { hasChanged } from '@a11d/equals';
4
5
  import { CalendarDatesController } from './CalendarDatesController.js';
5
6
  import { FieldDateTimePrecision } from '../FieldDateTimePrecision.js';
6
7
  /**
@@ -15,6 +16,9 @@ let Calendar = Calendar_1 = class Calendar extends Component {
15
16
  this.handleItemClick = (date, precision) => {
16
17
  return () => {
17
18
  if (this.precision === precision) {
19
+ if (this.isDisabled(date, precision)) {
20
+ return;
21
+ }
18
22
  this.dateClick.dispatch(date);
19
23
  this.setNavigatingValue(date, 'smooth');
20
24
  }
@@ -51,163 +55,168 @@ let Calendar = Calendar_1 = class Calendar extends Component {
51
55
  const month = unsafeCSS(FieldDateTimePrecision.Month.key);
52
56
  const week = unsafeCSS(FieldDateTimePrecision.Week.key);
53
57
  const day = unsafeCSS(FieldDateTimePrecision.Day.key);
54
- return css `
55
- :host {
56
- --mo-calendar-item-size: 2.25rem;
57
- flex: 1;
58
- }
59
-
60
- .scroller {
61
- height: min(450px, 100vh);
62
-
63
- display: grid;
64
- position: relative;
65
- scrollbar-width: none;
66
- overflow-x: hidden;
67
- scroll-behavior: smooth;
68
-
69
- &[data-view=${week}], &[data-view=${day}] {
70
- grid-template-columns: repeat(1, 1fr);
71
- }
72
-
73
- &[data-view=${month}] {
74
- grid-template-columns: repeat(3, 1fr);
75
- }
76
-
77
- &[data-view=${year}] {
78
- grid-template-columns: repeat(5, 1fr);
79
- }
80
- }
81
-
82
- .year, .month, .day {
83
- display: flex;
84
- align-items: center;
85
- justify-content: center;
86
- text-align: center;
87
- font-weight: 500;
88
- user-select: none;
89
- }
90
-
91
- .year, .month, .week[data-view=${week}], .day:not([data-view=${week}]) {
92
- transition: 0.2s;
93
- border-radius: var(--mo-border-radius);
94
-
95
- &:hover {
96
- background: var(--mo-color-transparent-gray-3);
97
- }
98
-
99
- &[data-now] {
100
- outline: 2px dashed var(--mo-color-gray-transparent);
101
- }
102
-
103
- &[data-start], &[data-end] {
104
- background: var(--mo-color-accent-transparent);
105
- opacity: 1;
106
- color: color-mix(in srgb, var(--mo-color-accent), var(--mo-color-foreground)) !important;
107
- }
108
-
109
- &[data-in-range] {
110
- background: color-mix(in srgb, var(--mo-color-accent), transparent 92%);
111
- }
112
- }
113
-
114
- /* Headings */
115
- .year[data-view=${month}], .month[data-view=${week}], .month[data-view=${day}] {
116
- font-size: 1.125rem;
117
- font-weight: 500;
118
- height: 2rem;
119
- padding: 0.5rem;
120
- }
121
-
122
- /* Selection */
123
- .year[data-view=${year}], .month[data-view=${month}], .week[data-view=${week}], .day[data-view=${day}] {
124
- opacity: 0.875;
125
- font-size: 0.94rem;
126
- cursor: pointer;
127
- height: var(--mo-calendar-item-size);
128
- }
129
-
130
- .year {
131
- &[data-view=${week}], &[data-view=${day}] {
132
- display: none;
133
- }
134
- &:not([data-view=${year}]) {
135
- grid-column: -1 / 1;
136
- border-block-start: 1px solid var(--mo-color-transparent-gray-3);
137
- }
138
- padding-inline: 0.5rem;
139
- }
140
-
141
- .month-container {
142
- width: 100%;
143
- position: relative;
144
- &[data-view=${week}], &[data-view=${day}] {
145
- &::before {
146
- content: ' ';
147
- position: absolute;
148
- display: inline-block;
149
- width: 1px;
150
- height: 100%;
151
- inset-block: 0;
152
- background: var(--mo-color-transparent-gray-3);
153
- }
154
- &::after {
155
- content: ' ';
156
- position: absolute;
157
- display: inline-block;
158
- height: 1px;
159
- width: 100%;
160
- inset-inline: 0;
161
- background: var(--mo-color-transparent-gray-3);
162
- }
163
- }
164
-
165
- & > mo-grid {
166
- padding-inline: 0.5rem;
167
- padding-block-end: 0.5rem;
168
- margin-block-start: -0.375rem;
169
- }
170
-
171
- &[data-view=${month}] {
172
- & > mo-grid {
173
- display: none;
174
- }
175
- }
176
- }
177
-
178
- .weekdays {
179
- text-align: center;
180
- opacity: 0.5;
181
- font-size: 0.75rem;
182
- font-weight: 500;
183
- grid-column: -1 / 1;
184
- user-select: none;
185
- span {
186
- display: flex;
187
- align-items: center;
188
- justify-content: center;
189
- }
190
- }
191
-
192
- .month {
193
- padding-inline: 0.5rem;
194
- }
195
-
196
- .week {
197
- grid-column: 1 / -1;
198
- }
199
-
200
- .week-number {
201
- opacity: 0.5;
202
- display: flex;
203
- align-items: center;
204
- justify-content: center;
205
- }
206
-
207
- .day {
208
- width: var(--mo-calendar-item-size);
209
- height: var(--mo-calendar-item-size);
210
- }
58
+ return css `
59
+ :host {
60
+ --mo-calendar-item-size: 2.25rem;
61
+ flex: 1;
62
+ }
63
+
64
+ .scroller {
65
+ height: min(450px, 100vh);
66
+
67
+ display: grid;
68
+ position: relative;
69
+ scrollbar-width: none;
70
+ overflow-x: hidden;
71
+ scroll-behavior: smooth;
72
+
73
+ &[data-view=${week}], &[data-view=${day}] {
74
+ grid-template-columns: repeat(1, 1fr);
75
+ }
76
+
77
+ &[data-view=${month}] {
78
+ grid-template-columns: repeat(3, 1fr);
79
+ }
80
+
81
+ &[data-view=${year}] {
82
+ grid-template-columns: repeat(5, 1fr);
83
+ }
84
+ }
85
+
86
+ .year, .month, .day {
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ text-align: center;
91
+ font-weight: 500;
92
+ user-select: none;
93
+ }
94
+
95
+ .year, .month, .week[data-view=${week}], .day:not([data-view=${week}]) {
96
+ transition: 0.2s;
97
+ border-radius: var(--mo-border-radius);
98
+
99
+ &:hover {
100
+ background: var(--mo-color-transparent-gray-3);
101
+ }
102
+
103
+ &[data-now] {
104
+ outline: 2px dashed var(--mo-color-gray-transparent);
105
+ }
106
+
107
+ &[data-start], &[data-end] {
108
+ background: var(--mo-color-accent-transparent);
109
+ opacity: 1;
110
+ color: color-mix(in srgb, var(--mo-color-accent), var(--mo-color-foreground)) !important;
111
+ }
112
+
113
+ &[data-in-range] {
114
+ background: color-mix(in srgb, var(--mo-color-accent), transparent 92%);
115
+ }
116
+
117
+ &[data-disabled] {
118
+ opacity: 0.38;
119
+ pointer-events: none;
120
+ }
121
+ }
122
+
123
+ /* Headings */
124
+ .year[data-view=${month}], .month[data-view=${week}], .month[data-view=${day}] {
125
+ font-size: 1.125rem;
126
+ font-weight: 500;
127
+ height: 2rem;
128
+ padding: 0.5rem;
129
+ }
130
+
131
+ /* Selection */
132
+ .year[data-view=${year}], .month[data-view=${month}], .week[data-view=${week}], .day[data-view=${day}] {
133
+ opacity: 0.875;
134
+ font-size: 0.94rem;
135
+ cursor: pointer;
136
+ height: var(--mo-calendar-item-size);
137
+ }
138
+
139
+ .year {
140
+ &[data-view=${week}], &[data-view=${day}] {
141
+ display: none;
142
+ }
143
+ &:not([data-view=${year}]) {
144
+ grid-column: -1 / 1;
145
+ border-block-start: 1px solid var(--mo-color-transparent-gray-3);
146
+ }
147
+ padding-inline: 0.5rem;
148
+ }
149
+
150
+ .month-container {
151
+ width: 100%;
152
+ position: relative;
153
+ &[data-view=${week}], &[data-view=${day}] {
154
+ &::before {
155
+ content: ' ';
156
+ position: absolute;
157
+ display: inline-block;
158
+ width: 1px;
159
+ height: 100%;
160
+ inset-block: 0;
161
+ background: var(--mo-color-transparent-gray-3);
162
+ }
163
+ &::after {
164
+ content: ' ';
165
+ position: absolute;
166
+ display: inline-block;
167
+ height: 1px;
168
+ width: 100%;
169
+ inset-inline: 0;
170
+ background: var(--mo-color-transparent-gray-3);
171
+ }
172
+ }
173
+
174
+ & > mo-grid {
175
+ padding-inline: 0.5rem;
176
+ padding-block-end: 0.5rem;
177
+ margin-block-start: -0.375rem;
178
+ }
179
+
180
+ &[data-view=${month}] {
181
+ & > mo-grid {
182
+ display: none;
183
+ }
184
+ }
185
+ }
186
+
187
+ .weekdays {
188
+ text-align: center;
189
+ opacity: 0.5;
190
+ font-size: 0.75rem;
191
+ font-weight: 500;
192
+ grid-column: -1 / 1;
193
+ user-select: none;
194
+ span {
195
+ display: flex;
196
+ align-items: center;
197
+ justify-content: center;
198
+ }
199
+ }
200
+
201
+ .month {
202
+ padding-inline: 0.5rem;
203
+ }
204
+
205
+ .week {
206
+ grid-column: 1 / -1;
207
+ }
208
+
209
+ .week-number {
210
+ opacity: 0.5;
211
+ display: flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ }
215
+
216
+ .day {
217
+ width: var(--mo-calendar-item-size);
218
+ height: var(--mo-calendar-item-size);
219
+ }
211
220
  `;
212
221
  }
213
222
  get includeWeekNumber() {
@@ -223,72 +232,74 @@ let Calendar = Calendar_1 = class Calendar extends Component {
223
232
  return `day-${date.dayOfWeek}`;
224
233
  }
225
234
  get template() {
226
- return html `
227
- <div class='scroller' data-view=${this.view.key}>
228
- ${repeat(this.datesController.data, d => d.toString(), d => this.getYearTemplate(d))}
229
- </div>
235
+ return html `
236
+ <div class='scroller' data-view=${this.view.key}>
237
+ ${repeat(this.datesController.data, d => d.toString(), d => this.getYearTemplate(d))}
238
+ </div>
230
239
  `;
231
240
  }
232
241
  getYearTemplate(date) {
233
- return html `
234
- ${date.dayOfYear !== 1 ? html.nothing : html `
235
- <div class='year' role='button'
236
- data-view=${this.view.key}
237
- ?data-navigating=${this.isNavigating(date, FieldDateTimePrecision.Year)}
238
- ?data-now=${this.isNow(date, FieldDateTimePrecision.Year)}
239
- ?data-start=${this.isStart(date, FieldDateTimePrecision.Year)}
240
- ?data-end=${this.isEnd(date, FieldDateTimePrecision.Year)}
241
- ?data-in-range=${this.isInRange(date, FieldDateTimePrecision.Year)}
242
- @click=${this.handleItemClick(date, FieldDateTimePrecision.Year)}
243
- ${this.datesController.observerIntersectionNavigation(date, FieldDateTimePrecision.Month, FieldDateTimePrecision.Year)}
244
- >
245
- ${date.format({ year: 'numeric' })}
246
- </div>
247
- `}
248
-
249
- ${this.view < FieldDateTimePrecision.Month || date.day !== 1 ? html.nothing : this.getMonthTemplate(date)}
242
+ return html `
243
+ ${date.dayOfYear !== 1 ? html.nothing : html `
244
+ <div class='year' role='button'
245
+ data-view=${this.view.key}
246
+ ?data-navigating=${this.isNavigating(date, FieldDateTimePrecision.Year)}
247
+ ?data-now=${this.isNow(date, FieldDateTimePrecision.Year)}
248
+ ?data-start=${this.isStart(date, FieldDateTimePrecision.Year)}
249
+ ?data-end=${this.isEnd(date, FieldDateTimePrecision.Year)}
250
+ ?data-in-range=${this.isInRange(date, FieldDateTimePrecision.Year)}
251
+ ?data-disabled=${this.isDisabled(date, FieldDateTimePrecision.Year)}
252
+ @click=${this.handleItemClick(date, FieldDateTimePrecision.Year)}
253
+ ${this.datesController.observerIntersectionNavigation(date, FieldDateTimePrecision.Month, FieldDateTimePrecision.Year)}
254
+ >
255
+ ${date.format({ year: 'numeric' })}
256
+ </div>
257
+ `}
258
+
259
+ ${this.view < FieldDateTimePrecision.Month || date.day !== 1 ? html.nothing : this.getMonthTemplate(date)}
250
260
  `;
251
261
  }
252
262
  static get weekDaysTemplate() {
253
- return html `
254
- <mo-grid class='weekdays' columns='subgrid'>
263
+ return html `
264
+ <mo-grid class='weekdays' columns='subgrid'>
255
265
  ${CalendarDatesController.sampleWeek.map((day, index) => {
256
266
  const { narrow, short, long } = {
257
267
  narrow: day.format({ weekday: 'narrow' }),
258
268
  short: day.format({ weekday: 'short' }),
259
269
  long: day.format({ weekday: 'long' }),
260
270
  };
261
- return html `
262
- <span style='grid-column: day-${index + 1}' title=${long}>
263
- ${long === short ? narrow : short}
264
- </span>
271
+ return html `
272
+ <span style='grid-column: day-${index + 1}' title=${long}>
273
+ ${long === short ? narrow : short}
274
+ </span>
265
275
  `;
266
- })}
267
- </mo-grid>
276
+ })}
277
+ </mo-grid>
268
278
  `;
269
279
  }
270
280
  getMonthTemplate(date) {
271
- return html `
272
- <mo-flex class='month-container' data-view=${this.view.key}>
273
- <div class='month' role='button'
274
- data-view=${this.view.key}
275
- ?data-navigating=${this.isNavigating(date, FieldDateTimePrecision.Month)}
276
- ?data-now=${this.isNow(date, FieldDateTimePrecision.Month)}
277
- ?data-start=${this.isStart(date, FieldDateTimePrecision.Month)}
278
- ?data-end=${this.isEnd(date, FieldDateTimePrecision.Month)}
279
- ?data-in-range=${this.isInRange(date, FieldDateTimePrecision.Month)}
280
- @click=${this.handleItemClick(date, FieldDateTimePrecision.Month)}
281
- ${this.datesController.observerIntersectionNavigation(date, FieldDateTimePrecision.Day)}
282
- >
283
- ${date.format(this.view > FieldDateTimePrecision.Month ? { year: 'numeric', month: 'long' } : { month: 'long' })}
284
- </div>
285
- ${this.view < FieldDateTimePrecision.Week ? html.nothing : html `
286
- <mo-grid justifyContent='center' autoRows='var(--mo-calendar-item-size)' columns=${this.view > FieldDateTimePrecision.Month ? this.columns : 'auto'}>
287
- ${Calendar_1.weekDaysTemplate}
288
- ${this.datesController.data.filter(d => d.year === date.year && d.month === date.month).map((day, _, month) => this.getWeekTemplate(day, month))}
289
- </mo-grid>
290
- `}
291
- </mo-flex>
281
+ return html `
282
+ <mo-flex class='month-container' data-view=${this.view.key}>
283
+ <div class='month' role='button'
284
+ data-view=${this.view.key}
285
+ ?data-navigating=${this.isNavigating(date, FieldDateTimePrecision.Month)}
286
+ ?data-now=${this.isNow(date, FieldDateTimePrecision.Month)}
287
+ ?data-start=${this.isStart(date, FieldDateTimePrecision.Month)}
288
+ ?data-end=${this.isEnd(date, FieldDateTimePrecision.Month)}
289
+ ?data-in-range=${this.isInRange(date, FieldDateTimePrecision.Month)}
290
+ ?data-disabled=${this.isDisabled(date, FieldDateTimePrecision.Month)}
291
+ @click=${this.handleItemClick(date, FieldDateTimePrecision.Month)}
292
+ ${this.datesController.observerIntersectionNavigation(date, FieldDateTimePrecision.Day)}
293
+ >
294
+ ${date.format(this.view > FieldDateTimePrecision.Month ? { year: 'numeric', month: 'long' } : { month: 'long' })}
295
+ </div>
296
+ ${this.view < FieldDateTimePrecision.Week ? html.nothing : html `
297
+ <mo-grid justifyContent='center' autoRows='var(--mo-calendar-item-size)' columns=${this.view > FieldDateTimePrecision.Month ? this.columns : 'auto'}>
298
+ ${Calendar_1.weekDaysTemplate}
299
+ ${this.datesController.data.filter(d => d.year === date.year && d.month === date.month).map((day, _, month) => this.getWeekTemplate(day, month))}
300
+ </mo-grid>
301
+ `}
302
+ </mo-flex>
292
303
  `;
293
304
  }
294
305
  getWeekTemplate(date, month) {
@@ -298,40 +309,48 @@ let Calendar = Calendar_1 = class Calendar extends Component {
298
309
  if (date !== month.find(d => d.weekOfYear === date.weekOfYear && d.yearOfWeek === date.yearOfWeek)) {
299
310
  return html.nothing;
300
311
  }
301
- return html `
302
- <mo-grid class='week' columns='subgrid'
303
- data-view=${this.view.key}
304
- ?data-navigating=${this.isNavigating(date, FieldDateTimePrecision.Week)}
305
- ?data-now=${this.isNow(date, FieldDateTimePrecision.Week)}
306
- ?data-start=${this.isStart(date, FieldDateTimePrecision.Week)}
307
- ?data-end=${this.isEnd(date, FieldDateTimePrecision.Week)}
308
- ?data-in-range=${this.isInRange(date, FieldDateTimePrecision.Week)}
309
- @click=${this.precision === FieldDateTimePrecision.Day ? html.nothing : this.handleItemClick(date, FieldDateTimePrecision.Week)}
310
- ${this.datesController.observerIntersectionNavigation(date, FieldDateTimePrecision.Week)}
311
- >
312
- ${month.filter(d => d.weekOfYear === date.weekOfYear && d.yearOfWeek === date.yearOfWeek).map(day => this.getDayTemplate(day))}
313
- </mo-grid>
312
+ return html `
313
+ <mo-grid class='week' columns='subgrid'
314
+ data-view=${this.view.key}
315
+ ?data-navigating=${this.isNavigating(date, FieldDateTimePrecision.Week)}
316
+ ?data-now=${this.isNow(date, FieldDateTimePrecision.Week)}
317
+ ?data-start=${this.isStart(date, FieldDateTimePrecision.Week)}
318
+ ?data-end=${this.isEnd(date, FieldDateTimePrecision.Week)}
319
+ ?data-in-range=${this.isInRange(date, FieldDateTimePrecision.Week)}
320
+ ?data-disabled=${this.isDisabled(date, FieldDateTimePrecision.Week)}
321
+ @click=${this.precision === FieldDateTimePrecision.Day ? html.nothing : this.handleItemClick(date, FieldDateTimePrecision.Week)}
322
+ ${this.datesController.observerIntersectionNavigation(date, FieldDateTimePrecision.Week)}
323
+ >
324
+ ${month.filter(d => d.weekOfYear === date.weekOfYear && d.yearOfWeek === date.yearOfWeek).map(day => this.getDayTemplate(day))}
325
+ </mo-grid>
314
326
  `;
315
327
  }
316
328
  getDayTemplate(day) {
317
- return html `
318
- ${this.includeWeekNumber === false || day.dayOfWeek !== 1 ? html.nothing : html `
319
- <div class='week-number' style='grid-column: week-number'>${day.weekOfYear?.format()}</div>
320
- `}
321
- <div tabindex='0' role='button' class='day'
322
- style='grid-column: ${this.getColumnName(day)}'
323
- data-view=${this.view.key}
324
- ?data-navigating=${this.isNavigating(day, FieldDateTimePrecision.Day)}
325
- ?data-now=${this.isNow(day, FieldDateTimePrecision.Day)}
326
- ?data-start=${this.isStart(day, FieldDateTimePrecision.Day)}
327
- ?data-end=${this.isEnd(day, FieldDateTimePrecision.Day)}
328
- ?data-in-range=${this.isInRange(day, FieldDateTimePrecision.Day)}
329
- @click=${this.precision === FieldDateTimePrecision.Week ? html.nothing : this.handleItemClick(day, FieldDateTimePrecision.Day)}
330
- >
331
- ${day.format({ day: 'numeric' })}
332
- </div>
329
+ return html `
330
+ ${this.includeWeekNumber === false || day.dayOfWeek !== 1 ? html.nothing : html `
331
+ <div class='week-number' style='grid-column: week-number'>${day.weekOfYear?.format()}</div>
332
+ `}
333
+ <div tabindex='0' role='button' class='day'
334
+ style='grid-column: ${this.getColumnName(day)}'
335
+ data-view=${this.view.key}
336
+ ?data-navigating=${this.isNavigating(day, FieldDateTimePrecision.Day)}
337
+ ?data-now=${this.isNow(day, FieldDateTimePrecision.Day)}
338
+ ?data-start=${this.isStart(day, FieldDateTimePrecision.Day)}
339
+ ?data-end=${this.isEnd(day, FieldDateTimePrecision.Day)}
340
+ ?data-in-range=${this.isInRange(day, FieldDateTimePrecision.Day)}
341
+ ?data-disabled=${this.isDisabled(day, FieldDateTimePrecision.Day)}
342
+ @click=${this.precision === FieldDateTimePrecision.Week ? html.nothing : this.handleItemClick(day, FieldDateTimePrecision.Day)}
343
+ >
344
+ ${day.format({ day: 'numeric' })}
345
+ </div>
333
346
  `;
334
347
  }
348
+ isDisabled(date, precision) {
349
+ return false
350
+ || (!!this.min && precision.isSmallerThan(date, this.min) && !precision.equals(date, this.min))
351
+ || (!!this.max && precision.isSmallerThan(this.max, date) && !precision.equals(this.max, date))
352
+ || (this.dateDisabled?.(date) ?? false);
353
+ }
335
354
  isNavigating(date, precision) {
336
355
  if (this.view !== precision) {
337
356
  return false;
@@ -371,6 +390,15 @@ __decorate([
371
390
  __decorate([
372
391
  property({ type: Boolean, reflect: true })
373
392
  ], Calendar.prototype, "includeWeek", void 0);
393
+ __decorate([
394
+ property({ type: Object })
395
+ ], Calendar.prototype, "min", void 0);
396
+ __decorate([
397
+ property({ type: Object })
398
+ ], Calendar.prototype, "max", void 0);
399
+ __decorate([
400
+ property({ type: Object, hasChanged })
401
+ ], Calendar.prototype, "dateDisabled", void 0);
374
402
  __decorate([
375
403
  state()
376
404
  ], Calendar.prototype, "view", void 0);