Skip to content

Commit d508de4

Browse files
feat(datepicker): disabled datepicker clear icon should also be disab… (#1168)
…led. Undefined length error also fixed. --------- Co-authored-by: Buse Selvi <106681486+buseselvi@users.noreply.github.com>
1 parent 19fccce commit d508de4

File tree

7 files changed

+98
-8
lines changed

7 files changed

+98
-8
lines changed

src/components/calendar/bl-calendar.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,10 +383,10 @@ export default class BlCalendar extends DatepickerCalendarMixin {
383383
if (changedProperties.has("value")) {
384384
const dates = formatToDateArray(this._value);
385385

386-
if (!dates?.length) {
386+
if (!dates || !Array.isArray(dates) || dates.length === 0) {
387387
this.handleClearSelectedDates();
388388
} else {
389-
dates?.forEach(date => {
389+
dates.forEach(date => {
390390
this.handleDate(date);
391391
});
392392
}

src/components/datepicker/bl-datepicker.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
display: grid;
1414
}
1515

16+
:host([disabled]) .datepicker-content {
17+
pointer-events: none;
18+
}
19+
1620
.datepicker-input {
1721
width: var(--bl-datepicker-input-width, auto);
1822
white-space: nowrap;

src/components/datepicker/bl-datepicker.stories.mdx

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ export const DatepickerTemplate = (args) => html`
2828
locale=${ifDefined(args.locale)}
2929
value=${ifDefined(args.value)}
3030
style=${ifDefined(args.style)}
31-
disabled-dates=${ifDefined(args.disabledDates)}
31+
.disabledDates=${args.disabledDates}
32+
?disabled=${args.disabled}
3233
?month-year-only=${args.monthYearOnly}
3334
@bl-datepicker-change=${(e) => {
34-
action('bl-datepicker-change')(e)
35+
action('bl-datepicker-change')(e.detail)
3536
}}>${unsafeHTML(args.content)}
3637
</bl-datepicker>`
3738

@@ -116,8 +117,28 @@ You can set dates which you want to disable from Datepicker.
116117
<Story name="Disabled Dates" args={{
117118
type: 'multiple',
118119
label: 'Disabled Dates',
119-
placeholder: 'Set disabled dates',
120-
disabledDates: new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() + 2)
120+
placeholder: 'Select dates (some disabled)',
121+
disabledDates: [
122+
new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() + 2),
123+
new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() + 5),
124+
new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate() + 8)
125+
]
126+
}}>
127+
{Template.bind({})}
128+
</Story>
129+
</Canvas>
130+
131+
### Disabled Datepicker
132+
133+
You can disable the entire datepicker to prevent any interaction. The selected date will still be visible.
134+
135+
<Canvas>
136+
<Story name="Disabled Datepicker" args={{
137+
type: 'single',
138+
label: 'Disabled Datepicker',
139+
placeholder: 'Select a date',
140+
value: new Date(),
141+
disabled: true
121142
}}>
122143
{Template.bind({})}
123144
</Story>

src/components/datepicker/bl-datepicker.test.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,4 +404,47 @@ describe("BlDatepicker", () => {
404404
expect(element._calendarEl._dates).to.deep.equal([]);
405405
});
406406
});
407+
408+
describe("Disabled State Behavior", () => {
409+
beforeEach(async () => {
410+
element = await fixture<BlDatePicker>(html`
411+
<bl-datepicker type="single" locale="en" disabled></bl-datepicker>`);
412+
413+
element._calendarEl._dates = [new Date(2024, 0, 15)];
414+
element.setDatePickerInput();
415+
await element.updateComplete;
416+
});
417+
418+
it("should reflect disabled attribute on host", async () => {
419+
expect(element.hasAttribute("disabled")).to.be.true;
420+
});
421+
422+
it("should apply pointer-events none CSS when disabled", async () => {
423+
const datepickerContent = element.shadowRoot?.querySelector(".datepicker-content") as HTMLElement;
424+
const styles = window.getComputedStyle(datepickerContent);
425+
426+
expect(styles.pointerEvents).to.equal("none");
427+
});
428+
429+
it("should have disabled clear button when disabled", async () => {
430+
const clearButton = element.shadowRoot?.querySelector("bl-button") as BlButton;
431+
432+
expect(clearButton).to.exist;
433+
expect(clearButton.disabled).to.be.true;
434+
});
435+
436+
it("should have disabled input when disabled", async () => {
437+
expect(element._inputEl?.hasAttribute("disabled")).to.be.true;
438+
});
439+
440+
it("should not open popover on input click when disabled", async () => {
441+
element._popoverEl.hide();
442+
await element.updateComplete;
443+
444+
element._inputEl?.click();
445+
await element.updateComplete;
446+
447+
expect(element._popoverEl.visible).to.be.false;
448+
});
449+
});
407450
});

src/components/datepicker/bl-datepicker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default class BlDatepicker extends DatepickerCalendarMixin {
4747
/**
4848
* Sets datepicker to disabled
4949
*/
50-
@property({ type: Boolean })
50+
@property({ type: Boolean, reflect: true })
5151
disabled: boolean;
5252
/**
5353
* Defines help text to datepicker input for users

src/utilities/format-to-date-array.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,25 @@ describe("normalizeValue", () => {
3636

3737
expect(result).to.deep.equal([]);
3838
});
39+
40+
it("should return an empty array when string contains invalid dates", () => {
41+
const input = "invalid-date,not-a-date";
42+
const result = formatToDateArray(input);
43+
44+
expect(result).to.deep.equal([]);
45+
});
46+
47+
it("should filter out invalid dates and return valid ones from string", () => {
48+
const input = "2023-10-10,invalid-date,2023-10-11";
49+
const expected = [new Date("2023-10-10"), new Date("2023-10-11")];
50+
const result = formatToDateArray(input);
51+
52+
expect(result).to.deep.equal(expected);
53+
});
54+
55+
it("should return empty array for non-array, non-date, non-string values", () => {
56+
const result = formatToDateArray({} as never);
57+
58+
expect(result).to.deep.equal([]);
59+
});
3960
});

src/utilities/format-to-date-array.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ export function formatToDateArray(value: string | Date | Date[] | undefined): Da
88
return stringToDateArray(value);
99
} else if (value instanceof Date) {
1010
return [value];
11-
} else {
11+
} else if (Array.isArray(value)) {
1212
return value;
1313
}
14+
return [];
1415
}

0 commit comments

Comments
 (0)