From edefd6429b962205c1c9483f373f136868535245 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Thu, 8 Jul 2021 16:33:03 -0700 Subject: [PATCH] DatePicker rework (#737) * fix(date-picker): append calendar to date picker element #345 Fixes #345 * fix(date-picker): do not import rangePlugin from esm folder * fix(date-picker): correctly type change event for single/range types * feat(date-picker): add valueFrom, valueTo for range datepicker * docs(date-picker): add range type example * docs(date-picker): extract range example to iframe * docs(date-picker): extract single type to iframe --- COMPONENT_INDEX.md | 39 +++++------ docs/src/COMPONENT_API.json | 27 ++++++-- docs/src/pages/components/DatePicker.svx | 8 ++- .../framed/DatePicker/DatePickerRange.svelte | 8 +++ .../framed/DatePicker/DatePickerSingle.svelte | 7 ++ docs/vite.config.js | 2 +- src/DatePicker/DatePicker.svelte | 64 +++++++++++++------ src/DatePicker/DatePickerInput.svelte | 9 ++- src/DatePicker/createCalendar.js | 2 +- tests/DatePicker.test.svelte | 8 ++- types/DatePicker/DatePicker.d.ts | 21 +++++- 11 files changed, 139 insertions(+), 56 deletions(-) create mode 100644 docs/src/pages/framed/DatePicker/DatePickerRange.svelte create mode 100644 docs/src/pages/framed/DatePicker/DatePickerSingle.svelte diff --git a/COMPONENT_INDEX.md b/COMPONENT_INDEX.md index 81510a5d..377e5622 100644 --- a/COMPONENT_INDEX.md +++ b/COMPONENT_INDEX.md @@ -1047,18 +1047,19 @@ None. ### Props -| Prop name | Kind | Reactive | Type | Default value | Description | -| :------------- | :--------------- | :------- | :--------------------------------------------------- | ------------------------------------------------ | --------------------------------------------- | -| value | let | Yes | number | string | "" | Specify the date picker input value | -| datePickerType | let | No | "simple" | "single" | "range" | "simple" | Specify the date picker type | -| appendTo | let | No | HTMLElement | -- | Specify the element to append the calendar to | -| dateFormat | let | No | string | "m/d/Y" | Specify the date format | -| maxDate | let | No | null | string | Date | null | Specify the maximum date | -| minDate | let | No | null | string | Date | null | Specify the minimum date | -| locale | let | No | string | "en" | Specify the locale | -| short | let | No | boolean | false | Set to `true` to use the short variant | -| light | let | No | boolean | false | Set to `true` to enable the light variant | -| id | let | No | string | "ccs-" + Math.random().toString(36) | Set an id for the date picker element | +| Prop name | Kind | Reactive | Type | Default value | Description | +| :------------- | :--------------- | :------- | :--------------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------- | +| valueTo | let | Yes | string | "" | Specify the date picker end date value (to)
Only works with the "range" date picker type | +| valueFrom | let | Yes | string | "" | Specify the date picker start date value (from)
Only works with the "range" date picker type | +| value | let | Yes | number | string | "" | Specify the date picker input value | +| datePickerType | let | No | "simple" | "single" | "range" | "simple" | Specify the date picker type | +| dateFormat | let | No | string | "m/d/Y" | Specify the date format | +| maxDate | let | No | null | string | Date | null | Specify the maximum date | +| minDate | let | No | null | string | Date | null | Specify the minimum date | +| locale | let | No | string | "en" | Specify the locale | +| short | let | No | boolean | false | Set to `true` to use the short variant | +| light | let | No | boolean | false | Set to `true` to enable the light variant | +| id | let | No | string | "ccs-" + Math.random().toString(36) | Set an id for the date picker element | ### Slots @@ -1068,13 +1069,13 @@ None. ### Events -| Event name | Type | Detail | -| :--------- | :--------- | :----- | -| click | forwarded | -- | -| mouseover | forwarded | -- | -| mouseenter | forwarded | -- | -| mouseleave | forwarded | -- | -| change | dispatched | -- | +| Event name | Type | Detail | +| :--------- | :--------- | :---------------------------------------------------------------------------------------------------------------------------------- | +| change | dispatched | string | { selectedDates: [dateFrom: Date, dateTo?: Date]; dateStr: string | { from: string; to: string; } } | +| click | forwarded | -- | +| mouseover | forwarded | -- | +| mouseenter | forwarded | -- | +| mouseleave | forwarded | -- | ## `DatePickerInput` diff --git a/docs/src/COMPONENT_API.json b/docs/src/COMPONENT_API.json index b94c4636..b0f47135 100644 --- a/docs/src/COMPONENT_API.json +++ b/docs/src/COMPONENT_API.json @@ -2393,13 +2393,24 @@ "reactive": true }, { - "name": "appendTo", + "name": "valueFrom", "kind": "let", - "description": "Specify the element to append the calendar to", - "type": "HTMLElement", + "description": "Specify the date picker start date value (from)\nOnly works with the \"range\" date picker type", + "type": "string", + "value": "\"\"", "isFunction": false, "constant": false, - "reactive": false + "reactive": true + }, + { + "name": "valueTo", + "kind": "let", + "description": "Specify the date picker end date value (to)\nOnly works with the \"range\" date picker type", + "type": "string", + "value": "\"\"", + "isFunction": false, + "constant": false, + "reactive": true }, { "name": "dateFormat", @@ -2474,11 +2485,15 @@ ], "slots": [{ "name": "__default__", "default": true, "slot_props": "{}" }], "events": [ + { + "type": "dispatched", + "name": "change", + "detail": "string | { selectedDates: [dateFrom: Date, dateTo?: Date]; dateStr: string | { from: string; to: string; } }" + }, { "type": "forwarded", "name": "click", "element": "div" }, { "type": "forwarded", "name": "mouseover", "element": "div" }, { "type": "forwarded", "name": "mouseenter", "element": "div" }, - { "type": "forwarded", "name": "mouseleave", "element": "div" }, - { "type": "dispatched", "name": "change" } + { "type": "forwarded", "name": "mouseleave", "element": "div" } ], "typedefs": [], "rest_props": { "type": "Element", "name": "div" } diff --git a/docs/src/pages/components/DatePicker.svx b/docs/src/pages/components/DatePicker.svx index 3ac83e15..6ea1ea8c 100644 --- a/docs/src/pages/components/DatePicker.svx +++ b/docs/src/pages/components/DatePicker.svx @@ -57,9 +57,11 @@ components: ["DatePicker", "DatePickerInput", "DatePickerSkeleton"] ### Single - - - + + +### Range + + ### Skeleton diff --git a/docs/src/pages/framed/DatePicker/DatePickerRange.svelte b/docs/src/pages/framed/DatePicker/DatePickerRange.svelte new file mode 100644 index 00000000..6bbc2f55 --- /dev/null +++ b/docs/src/pages/framed/DatePicker/DatePickerRange.svelte @@ -0,0 +1,8 @@ + + + + + + diff --git a/docs/src/pages/framed/DatePicker/DatePickerSingle.svelte b/docs/src/pages/framed/DatePicker/DatePickerSingle.svelte new file mode 100644 index 00000000..36b8f60a --- /dev/null +++ b/docs/src/pages/framed/DatePicker/DatePickerSingle.svelte @@ -0,0 +1,7 @@ + + + + + diff --git a/docs/vite.config.js b/docs/vite.config.js index e3503c41..08b20aef 100644 --- a/docs/vite.config.js +++ b/docs/vite.config.js @@ -1,6 +1,6 @@ module.exports = { optimizeDeps: { - include: ["clipboard-copy"], + include: ["clipboard-copy", "flatpickr/dist/plugins/rangePlugin"], exclude: ["@sveltech/routify"], }, }; diff --git a/src/DatePicker/DatePicker.svelte b/src/DatePicker/DatePicker.svelte index ab6d42af..c9b75c16 100644 --- a/src/DatePicker/DatePicker.svelte +++ b/src/DatePicker/DatePicker.svelte @@ -1,6 +1,6 @@
- + @@ -51,7 +55,7 @@ /> - + diff --git a/types/DatePicker/DatePicker.d.ts b/types/DatePicker/DatePicker.d.ts index 1ea59415..f1843648 100644 --- a/types/DatePicker/DatePicker.d.ts +++ b/types/DatePicker/DatePicker.d.ts @@ -16,9 +16,18 @@ export interface DatePickerProps value?: number | string; /** - * Specify the element to append the calendar to + * Specify the date picker start date value (from) + * Only works with the "range" date picker type + * @default "" */ - appendTo?: HTMLElement; + valueFrom?: string; + + /** + * Specify the date picker end date value (to) + * Only works with the "range" date picker type + * @default "" + */ + valueTo?: string; /** * Specify the date format @@ -66,11 +75,17 @@ export interface DatePickerProps export default class DatePicker extends SvelteComponentTyped< DatePickerProps, { + change: CustomEvent< + | string + | { + selectedDates: [dateFrom: Date, dateTo?: Date]; + dateStr: string | { from: string; to: string }; + } + >; click: WindowEventMap["click"]; mouseover: WindowEventMap["mouseover"]; mouseenter: WindowEventMap["mouseenter"]; mouseleave: WindowEventMap["mouseleave"]; - change: CustomEvent; }, { default: {} } > {}