Skip to content

Commit 5896ec9

Browse files
committed
Date(Time)-Box, -Picker and -Calendar can dynamically be disabled now
1 parent d3d81d5 commit 5896ec9

File tree

4 files changed

+63
-39
lines changed

4 files changed

+63
-39
lines changed

client/django-formset/Calendar.scss

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
@import "colors";
22

3+
@mixin disabled {
4+
opacity: 0.5;
5+
pointer-events: none;
6+
}
7+
38
.dj-calendar {
49
background-color: var(--django-formset-background-color);
510
border: var(--border-width) var(--border-style) var(--border-color);
@@ -189,7 +194,7 @@
189194
}
190195

191196
&[disabled] {
192-
opacity: 0.5;
197+
@include disabled;
193198
}
194199

195200
&:not([disabled]):hover {
@@ -224,11 +229,20 @@
224229
[is="django-daterangecalendar"], [is="django-datetimerangecalendar"] {
225230
& + .dj-calendar {
226231
.sheet-body ul.monthdays {
227-
grid-template-rows: repeat(6, 1fr);
232+
grid-template-rows: repeat(6, 1fr); // keeps height consistent across months
228233
}
229234
}
230235
}
231236

237+
[is="django-datecalendar"], [is="django-datetimecalendar"],
238+
[is="django-daterangecalendar"], [is="django-datetimerangecalendar"],
239+
[is="django-datepicker"], [is="django-datetimepicker"],
240+
[is="django-daterangepicker"], [is="django-datetimerangepicker"] {
241+
&[disabled] ~ .dj-calendar .sheet-body ul > li {
242+
@include disabled;
243+
}
244+
}
245+
232246
// Calendar popup dialog
233247
[aria-haspopup="dialog"] + .dj-calendar {
234248
width: max-content;

client/django-formset/Calendar.ts

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -202,19 +202,17 @@ export class CalendarSheet extends Widget {
202202
if (this.minDate && date < this.minDate || this.maxDate && date > this.maxDate) {
203203
elem.toggleAttribute('disabled', true);
204204
}
205-
if (!elem.hasAttribute('disabled')) {
206-
elem.addEventListener('click', (event: Event) => {
207-
if (event.target instanceof HTMLLIElement) {
208-
this.setDate(event.target);
209-
this.markSelectedDates();
210-
if (!this.settings.withRange || this.dateRange[0] && this.dateRange[1]) {
211-
this.settings.close();
212-
}
205+
elem.addEventListener('click', (event: Event) => {
206+
if (event.target instanceof HTMLLIElement) {
207+
this.setDate(event.target);
208+
this.markSelectedDates();
209+
if (!this.settings.withRange || this.dateRange[0] && this.dateRange[1]) {
210+
this.settings.close();
213211
}
214-
}, {once: true});
215-
if (this.settings.withRange) {
216-
elem.addEventListener('mouseenter', this.hoverDateItem);
217212
}
213+
}, {once: true});
214+
if (this.settings.withRange) {
215+
elem.addEventListener('mouseenter', this.hoverDateItem);
218216
}
219217
});
220218

@@ -234,15 +232,13 @@ export class CalendarSheet extends Widget {
234232
if (this.element.querySelectorAll(`${selector} > li[data-date]:not([disabled])`).length === 0) {
235233
elem.toggleAttribute('disabled', true);
236234
}
237-
if (!elem.hasAttribute('disabled')) {
238-
elem.addEventListener('click', (event: Event) => {
239-
if (event.target instanceof HTMLLIElement) {
240-
this.selectHour(event.target);
241-
}
242-
});
243-
if (this.settings.withRange) {
244-
elem.addEventListener('mouseenter', this.hoverDateItem);
235+
elem.addEventListener('click', (event: Event) => {
236+
if (event.target instanceof HTMLLIElement) {
237+
this.selectHour(event.target);
245238
}
239+
});
240+
if (this.settings.withRange) {
241+
elem.addEventListener('mouseenter', this.hoverDateItem);
246242
}
247243
});
248244

@@ -258,11 +254,9 @@ export class CalendarSheet extends Widget {
258254
if (this.minWeekDate && date < this.minWeekDate || this.maxWeekDate && date > this.maxWeekDate) {
259255
elem.toggleAttribute('disabled', true);
260256
}
261-
if (!elem.hasAttribute('disabled')) {
262-
elem.addEventListener('click', this.selectDay);
263-
if (this.settings.withRange) {
264-
elem.addEventListener('mouseenter', this.hoverDateItem);
265-
}
257+
elem.addEventListener('click', this.selectDay);
258+
if (this.settings.withRange) {
259+
elem.addEventListener('mouseenter', this.hoverDateItem);
266260
}
267261
});
268262
}
@@ -275,11 +269,9 @@ export class CalendarSheet extends Widget {
275269
if (this.minMonthDate && date < this.minMonthDate || this.maxMonthDate && date > this.maxMonthDate) {
276270
elem.toggleAttribute('disabled', true);
277271
}
278-
if (!elem.hasAttribute('disabled')) {
279-
elem.addEventListener('click', this.selectMonth);
280-
if (this.settings.withRange) {
281-
elem.addEventListener('mouseenter', this.hoverDateItem);
282-
}
272+
elem.addEventListener('click', this.selectMonth);
273+
if (this.settings.withRange) {
274+
elem.addEventListener('mouseenter', this.hoverDateItem);
283275
}
284276
});
285277
}
@@ -292,11 +284,9 @@ export class CalendarSheet extends Widget {
292284
if (this.minYearDate && date < this.minYearDate || this.maxYearDate && date > this.maxYearDate) {
293285
elem.toggleAttribute('disabled', true);
294286
}
295-
if (!elem.hasAttribute('disabled')) {
296-
elem.addEventListener('click', this.selectYear);
297-
if (this.settings.withRange) {
298-
elem.addEventListener('mouseenter', this.hoverDateItem);
299-
}
287+
elem.addEventListener('click', this.selectYear);
288+
if (this.settings.withRange) {
289+
elem.addEventListener('mouseenter', this.hoverDateItem);
300290
}
301291
});
302292
}
@@ -711,7 +701,7 @@ export class CalendarSheet extends Widget {
711701
await this.fetchCalendar(new Date(), ViewMode.weeks);
712702
todayElem = this.element.querySelector(`li[data-date="${todayDateString}"]`);
713703
}
714-
if (todayElem && !todayElem.hasAttribute('disabled')) {
704+
if (!this.settings.inputElement.disabled && todayElem && !todayElem.hasAttribute('disabled')) {
715705
this.setDate(todayElem);
716706
this.markSelectedDates();
717707
}
@@ -891,7 +881,8 @@ export class CalendarSheet extends Widget {
891881
}
892882
}
893883
inputElement.style.transition = '';
894-
StyleHelpers.pushMediaQueryStyles(
884+
StyleHelpers.replaceMediaQueryStyles(
885+
-1,
895886
sheet,
896887
this.baseSelector,
897888
{

client/django-formset/DateTime.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
flex-direction: row-reverse;
1111
flex-wrap: nowrap;
1212
justify-content: flex-end;
13+
background-color: var(--background-color);
1314
border: var(--border-width) var(--border-style) var(--border-color);
1415
border-radius: var(--border-radius);
1516

client/django-formset/DateTime.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class DateTimeField extends Widget {
3838
private hasFocus: HTMLElement|null = null;
3939
private cleanup?: Function;
4040
private isOpen: boolean = false;
41+
private mediaStylesIndex: number = -1;
4142
private static readonly simpleComponents = ['django-datefield', 'django-datepicker', 'django-daterangefield', 'django-daterangepicker']
4243
private static readonly rangeComponents = ['django-daterangefield', 'django-daterangepicker', 'django-datetimerangefield', 'django-datetimerangepicker'];
4344

@@ -218,7 +219,24 @@ class DateTimeField extends Widget {
218219
});
219220
document.addEventListener('click', this.handleClick);
220221
document.addEventListener('keydown', this.handleKeypress);
221-
}
222+
const observer = new MutationObserver(this.attributesChanged);
223+
observer.observe(this.inputElement, {attributes: true});
224+
}
225+
226+
private attributesChanged = (mutations: MutationRecord[]) => {
227+
if (mutations.find(m => m.attributeName === 'disabled')) {
228+
this.inputFields.forEach(inputField => inputField.contentEditable = this.inputElement.disabled ? 'false' : 'true');
229+
this.mediaStylesIndex = StyleHelpers.replaceMediaQueryStyles(
230+
this.mediaStylesIndex,
231+
this.styleSheet,
232+
`${this.baseSelector} + [role="textbox"]`,
233+
{
234+
'--background-color': 'background-color',
235+
},
236+
this.inputElement,
237+
);
238+
}
239+
};
222240

223241
private openCalendar() {
224242
if (!this.calendarOpener)

0 commit comments

Comments
 (0)