Skip to content

Commit a498763

Browse files
feat: add readonly state for date picker (#2982)
Co-authored-by: Akshat Patel <[email protected]>
1 parent 3be466f commit a498763

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

src/datepicker-input/datepicker-input.component.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import { NG_VALUE_ACCESSOR } from "@angular/forms";
5353
[placeholder]="placeholder"
5454
[id]= "id"
5555
[disabled]="disabled"
56+
[readonly]="readonly"
5657
(change)="onChange($event)"/>
5758
<svg
5859
*ngIf="type !== 'simple' && !warn && !invalid"
@@ -128,6 +129,8 @@ export class DatePickerInput {
128129
@Input() theme: "light" | "dark" = "dark";
129130

130131
@Input() disabled = false;
132+
133+
@Input() readonly = false;
131134
/**
132135
* Set to `true` for invalid state.
133136
*/

src/datepicker/datepicker.component.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ if (languages.default?.default["en"]?.weekdays) {
7474
[type]="(range ? 'range' : 'single')"
7575
[hasIcon]="(range ? false : true)"
7676
[disabled]="disabled"
77+
[readonly]="readonly"
7778
[invalid]="invalid"
7879
[invalidText]="invalidText"
7980
[warn]="warn"
@@ -96,6 +97,7 @@ if (languages.default?.default["en"]?.weekdays) {
9697
[type]="(range ? 'range' : 'single')"
9798
[hasIcon]="(range ? true : null)"
9899
[disabled]="disabled"
100+
[readonly]="readonly"
99101
[invalid]="rangeInvalid"
100102
[invalidText]="rangeInvalidText"
101103
[warn]="rangeWarn"
@@ -183,6 +185,8 @@ export class DatePicker implements
183185
@Input() theme: "light" | "dark" = "dark";
184186

185187
@Input() disabled = false;
188+
189+
@Input() readonly = false;
186190
/**
187191
* Set to `true` to display the invalid state.
188192
*/
@@ -235,7 +239,10 @@ export class DatePicker implements
235239
mode: this.range ? "range" : "single",
236240
plugins,
237241
dateFormat: this.dateFormat,
238-
locale: languages.default?.default[this.language] || languages.default[this.language]
242+
locale: languages.default?.default[this.language] || languages.default[this.language],
243+
// Little trick force "readonly mode" on datepicker input.
244+
// Docs: Whether clicking on the input should open the picker. You could disable this if you wish to open the calendar manually with.open().
245+
clickOpens: !this.readonly
239246
});
240247
}
241248

@@ -314,7 +321,8 @@ export class DatePicker implements
314321
"id",
315322
"value",
316323
"plugins",
317-
"flatpickrOptions"
324+
"flatpickrOptions",
325+
"readonly"
318326
];
319327
const changeKeys = Object.keys(changes);
320328
if (changeKeys.some(key => flatpickrChangeKeys.includes(key))) {
@@ -444,6 +452,10 @@ export class DatePicker implements
444452
* Handles opening the calendar "properly" when the calendar icon is clicked.
445453
*/
446454
openCalendar(datepickerInput: DatePickerInput) {
455+
if (this.readonly) {
456+
return;
457+
}
458+
447459
if (this.range) {
448460
datepickerInput.input.nativeElement.click();
449461

@@ -483,6 +495,10 @@ export class DatePicker implements
483495
// flatpickr calendar using a keyboard.
484496
const addFocusCalendarListener = (element: HTMLInputElement) => {
485497
element.addEventListener("keydown", (event: KeyboardEvent) => {
498+
// Listeners are added just once, so a check is needed here.
499+
if (this.readonly) {
500+
return;
501+
}
486502
if (event.key === "Escape") {
487503
this.flatpickrInstance.close();
488504
}

src/datepicker/datepicker.stories.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export default {
1818
warnText: "This is a warning",
1919
warn: false,
2020
disabled: false,
21+
readonly: false,
2122
language: "en",
2223
theme: "dark",
2324
size: "md"
@@ -46,6 +47,7 @@ const Template = (args) => ({
4647
[label]="label"
4748
[placeholder]="placeholder"
4849
[disabled]="disabled"
50+
[readonly]="readonly"
4951
[size]="size"
5052
[invalid]="invalid"
5153
[invalidText]="invalidText"
@@ -70,6 +72,7 @@ const SingleTemplate = (args) => ({
7072
[theme]="theme"
7173
[value]="value"
7274
[disabled]="disabled"
75+
[readonly]="readonly"
7376
[invalid]="invalid"
7477
[invalidText]="invalidText"
7578
[warn]="warn"
@@ -85,6 +88,7 @@ const SingleTemplate = (args) => ({
8588
[size]="size"
8689
[theme]="theme"
8790
[disabled]="disabled"
91+
[readonly]="readonly"
8892
[invalid]="invalid"
8993
[invalidText]="invalidText"
9094
[warn]="warn"
@@ -120,6 +124,7 @@ const RangeTemplate = (args) => ({
120124
[language]="language"
121125
[theme]="theme"
122126
[disabled]="disabled"
127+
[readonly]="readonly"
123128
[invalid]="invalid"
124129
[invalidText]="invalidText"
125130
[warn]="warn"
@@ -141,6 +146,7 @@ const RangeTemplate = (args) => ({
141146
[placeholder]="placeholder"
142147
[theme]="theme"
143148
[disabled]="disabled"
149+
[readonly]="readonly"
144150
[invalid]="invalid"
145151
[invalidText]="invalidText"
146152
[warn]="warn"

0 commit comments

Comments
 (0)