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
}
>
- {day.getDate()}
+
+ {day.getDate()}
+ {this.showDayDescriptions && dayDescription && (
+
+ {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 @@