diff --git a/docs/index.html b/docs/index.html index b88a4b7..52424c3 100644 --- a/docs/index.html +++ b/docs/index.html @@ -478,6 +478,22 @@

Options

months. + + show-day-descriptions + boolean + false + + Controls whether the day descriptions are shown in the calendar. + + + + addDateDescription + (date: Date) => string + Desc. + + A string to be used as the date description text. + + diff --git a/src/components.d.ts b/src/components.d.ts index d3c2c8e..2c1b940 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -8,11 +8,14 @@ import { HTMLStencilElement, JSXBase } from "@stencil/core/internal"; import { MonthChangedEventDetails, WCDatepickerLabels } from "./components/wc-datepicker/wc-datepicker"; export namespace Components { interface WcDatepicker { + "addDateDescription"?: (date: Date) => string; "clearButtonContent"?: string; "disableDate"?: (date: Date) => boolean; "disabled"?: boolean; "elementClassName"?: string; "firstDayOfWeek"?: number; + "getAllDayDescriptions": () => Promise>; + "getDescriptionForDay": (date: Date) => Promise; "goToRangeStartOnSelect"?: boolean; "labels"?: WCDatepickerLabels; "locale"?: string; @@ -23,6 +26,7 @@ export namespace Components { "previousYearButtonContent"?: string; "range"?: boolean; "showClearButton"?: boolean; + "showDayDescriptions"?: boolean; "showMonthStepper"?: boolean; "showTodayButton"?: boolean; "showYearStepper"?: boolean; @@ -48,6 +52,7 @@ declare global { } declare namespace LocalJSX { interface WcDatepicker { + "addDateDescription"?: (date: Date) => string; "clearButtonContent"?: string; "disableDate"?: (date: Date) => boolean; "disabled"?: boolean; @@ -65,6 +70,7 @@ declare namespace LocalJSX { "previousYearButtonContent"?: string; "range"?: boolean; "showClearButton"?: boolean; + "showDayDescriptions"?: boolean; "showMonthStepper"?: boolean; "showTodayButton"?: boolean; "showYearStepper"?: boolean; diff --git a/src/components/wc-datepicker/wc-datepicker.spec.tsx b/src/components/wc-datepicker/wc-datepicker.spec.tsx index 60c6cfa..786353e 100644 --- a/src/components/wc-datepicker/wc-datepicker.spec.tsx +++ b/src/components/wc-datepicker/wc-datepicker.spec.tsx @@ -183,7 +183,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('2'); @@ -191,7 +191,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('3'); @@ -199,7 +199,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('10'); @@ -207,7 +207,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('9'); @@ -215,7 +215,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('2'); @@ -223,7 +223,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('31'); @@ -231,7 +231,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('1'); @@ -239,7 +239,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('1'); @@ -247,7 +247,7 @@ describe('wc-datepicker', () => { await page.waitForChanges(); expect( - page.root.querySelector('.wc-datepicker__date--current').children[0] + page.root.querySelector('.wc-datepicker__date--current .wc-datepicker__date-content').children[0] .innerHTML ).toBe('1'); }); @@ -567,4 +567,33 @@ describe('wc-datepicker', () => { expect(component['hoveredDate']).toBeUndefined(); }); + + it('add date descriptions to date cells', async () => { + const page = await newSpecPage({ + components: [WCDatepicker], + html: ``, + language: 'en' + }); + + // Since months are zero based + const november = 11 - 1; + const dayThird = 3; + const descriptionText = 'Desc.'; + const currentDate = new Date('2025-11-03'); + const component = page.rootInstance as WCDatepicker; + page.root.startDate = currentDate; + component.showDayDescriptions = true; + + component.addDateDescription = (date: Date) => { + if (date.getMonth() === november && date.getDate() === dayThird) return descriptionText; + return ``; + }; + + await page.waitForChanges(); + + const getDayWithDescription = await component.getDescriptionForDay(currentDate); + + expect(component.showDayDescriptions).toBe(true); + expect(getDayWithDescription).toBe(descriptionText); + }); }); diff --git a/src/components/wc-datepicker/wc-datepicker.tsx b/src/components/wc-datepicker/wc-datepicker.tsx index 7622e66..12fff68 100644 --- a/src/components/wc-datepicker/wc-datepicker.tsx +++ b/src/components/wc-datepicker/wc-datepicker.tsx @@ -5,6 +5,7 @@ import { EventEmitter, h, Host, + Method, Prop, State, Watch @@ -92,14 +93,19 @@ export class WCDatepicker { @Prop() maxSearchDays?: number = 365; @Prop() goToRangeStartOnSelect?: boolean = true; + @Prop({ mutable: true }) showDayDescriptions?: boolean = false; + @Prop({ mutable: true }) addDateDescription?: (date: Date) => string; + @State() currentDate: Date; @State() hoveredDate: Date; @State() weekdays: string[][]; + @Event() selectDate: EventEmitter; @Event() changeMonth: EventEmitter; private moveFocusAfterMonthChanged: Boolean; + private dayDescriptions: Record = {}; componentWillLoad() { this.init(); @@ -154,6 +160,16 @@ export class WCDatepicker { } } + @Method() + async getDescriptionForDay(date: Date): Promise { + return this.dayDescriptions[getISODateString(date)] || ''; + } + + @Method() + async getAllDayDescriptions(): Promise> { + return { ...this.dayDescriptions }; + } + private init = () => { this.currentDate = this.startDate ? removeTimezoneOffset(new Date(this.startDate)) @@ -224,6 +240,18 @@ export class WCDatepicker { } } + private setDescriptionForDay(date: Date): string { + if (!this.showDayDescriptions || !this.addDateDescription) { + return ''; + } + + if (!this.dayDescriptions[getISODateString(date)]) { + this.dayDescriptions[getISODateString(date)] = this.addDateDescription(date) || ''; + } + + return this.dayDescriptions[getISODateString(date)] || ''; + } + private focusDate(date: Date) { this.el .querySelector( @@ -573,7 +601,8 @@ export class WCDatepicker { aria-label={this.labels.picker} class={{ [this.getClassName()]: true, - [`${this.getClassName()}--disabled`]: this.disabled + [`${this.getClassName()}--disabled`]: this.disabled, + [`${this.getClassName()}--with-descriptions`]: this.showDayDescriptions }} role="group" > @@ -777,6 +806,8 @@ export class WCDatepicker { const isDisabled = this.disableDate(day); const cellKey = `cell-${day.getMonth()}-${day.getDate()}`; + + const dayDescription = this.setDescriptionForDay(day); const className = { [this.getClassName('date')]: true, @@ -817,12 +848,20 @@ export class WCDatepicker { : -1 } > - +
+ + {this.showDayDescriptions && dayDescription && ( + + )} +
{Intl.DateTimeFormat(this.locale, { day: 'numeric', month: 'long' }).format(day)} + {this.showDayDescriptions && dayDescription && `, ${dayDescription}`} ); @@ -864,4 +903,4 @@ export class WCDatepicker { ); } -} +} \ No newline at end of file diff --git a/src/index.html b/src/index.html index 4e6059d..3926938 100644 --- a/src/index.html +++ b/src/index.html @@ -22,6 +22,16 @@