From 2f732de96ce8112193c2472291e3fd5ea519800e Mon Sep 17 00:00:00 2001 From: David Ethell Date: Thu, 5 Jan 2023 11:55:31 -0500 Subject: [PATCH 1/4] Add isDateAvailable property --- .../src/vaadin-date-picker-helper.d.ts | 2 +- .../src/vaadin-date-picker-mixin.d.ts | 5 +++ .../src/vaadin-date-picker-mixin.js | 19 +++++++++--- .../date-picker/src/vaadin-month-calendar.js | 31 +++++++++++++------ 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/packages/date-picker/src/vaadin-date-picker-helper.d.ts b/packages/date-picker/src/vaadin-date-picker-helper.d.ts index c42d79cdf46..38212e42cd0 100644 --- a/packages/date-picker/src/vaadin-date-picker-helper.d.ts +++ b/packages/date-picker/src/vaadin-date-picker-helper.d.ts @@ -17,7 +17,7 @@ declare function dateEquals(date1: Date | null, date2: Date | null): boolean; * * @returns True if the date is in the range */ -declare function dateAllowed(date: Date, min: Date | null, max: Date | null): boolean; +declare function dateAllowed(date: Date, min: Date | null, max: Date | null, isDateAvailable: Function | null): boolean; /** * Get closest date from array of dates. diff --git a/packages/date-picker/src/vaadin-date-picker-mixin.d.ts b/packages/date-picker/src/vaadin-date-picker-mixin.d.ts index 03813a71122..95d40cb6063 100644 --- a/packages/date-picker/src/vaadin-date-picker-mixin.d.ts +++ b/packages/date-picker/src/vaadin-date-picker-mixin.d.ts @@ -237,6 +237,11 @@ export declare class DatePickerMixinClass { */ max: string | undefined; + /** + * Function to override the default function for determining if a date is available. + */ + isDateAvailable: (date: Date) => boolean; + /** * Opens the dropdown. */ diff --git a/packages/date-picker/src/vaadin-date-picker-mixin.js b/packages/date-picker/src/vaadin-date-picker-mixin.js index af3721541d7..9535ce607a2 100644 --- a/packages/date-picker/src/vaadin-date-picker-mixin.js +++ b/packages/date-picker/src/vaadin-date-picker-mixin.js @@ -18,7 +18,7 @@ import { extractDateParts, getAdjustedYear, getClosestDate, - parseDate, + parseDate } from './vaadin-date-picker-helper.js'; /** @@ -302,6 +302,15 @@ export const DatePickerMixin = (subclass) => sync: true, }, + /** + * A function that is used to determine if a date should be disabled. + * + * @type {function(Date): boolean | undefined} + */ + isDateAvailable: { + type: Function, + }, + /** * The earliest date that can be selected. All earlier dates will be disabled. * @type {Date | undefined} @@ -365,7 +374,7 @@ export const DatePickerMixin = (subclass) => return [ '_selectedDateChanged(_selectedDate, i18n)', '_focusedDateChanged(_focusedDate, i18n)', - '__updateOverlayContent(_overlayContent, i18n, label, _minDate, _maxDate, _focusedDate, _selectedDate, showWeekNumbers)', + '__updateOverlayContent(_overlayContent, i18n, label, _minDate, _maxDate, _focusedDate, _selectedDate, showWeekNumbers, isDateAvailable)', '__updateOverlayContentTheme(_overlayContent, _theme)', '__updateOverlayContentFullScreen(_overlayContent, _fullscreen)', ]; @@ -591,6 +600,7 @@ export const DatePickerMixin = (subclass) => const inputValue = this._inputElementValue; const inputValid = !inputValue || (!!this._selectedDate && inputValue === this.__formatDate(this._selectedDate)); const minMaxValid = !this._selectedDate || dateAllowed(this._selectedDate, this._minDate, this._maxDate); + const isDateAvailableValid = this.isDateAvailable ? this.isDateAvailable(this._selectedDate) : true; let inputValidity = true; if (this.inputElement) { @@ -602,7 +612,7 @@ export const DatePickerMixin = (subclass) => } } - return inputValid && minMaxValid && inputValidity; + return inputValid && minMaxValid && inputValidity && isDateAvailableValid; } /** @@ -812,7 +822,7 @@ export const DatePickerMixin = (subclass) => /** @private */ // eslint-disable-next-line max-params - __updateOverlayContent(overlayContent, i18n, label, minDate, maxDate, focusedDate, selectedDate, showWeekNumbers) { + __updateOverlayContent(overlayContent, i18n, label, minDate, maxDate, focusedDate, selectedDate, showWeekNumbers, isDateAvailable) { if (overlayContent) { overlayContent.i18n = i18n; overlayContent.label = label; @@ -821,6 +831,7 @@ export const DatePickerMixin = (subclass) => overlayContent.focusedDate = focusedDate; overlayContent.selectedDate = selectedDate; overlayContent.showWeekNumbers = showWeekNumbers; + overlayContent.isDateAvailable = isDateAvailable; } } diff --git a/packages/date-picker/src/vaadin-month-calendar.js b/packages/date-picker/src/vaadin-month-calendar.js index 1f8930c1811..eda0ebe6b21 100644 --- a/packages/date-picker/src/vaadin-month-calendar.js +++ b/packages/date-picker/src/vaadin-month-calendar.js @@ -48,12 +48,12 @@ class MonthCalendar extends MonthCalendarMixin(ThemableMixin(PolymerElement)) {