From 895d635fa43148a7b0d2d5098984a118733aa3e7 Mon Sep 17 00:00:00 2001 From: TLock Date: Tue, 4 Apr 2023 13:44:52 +0900 Subject: [PATCH 01/13] Implement default range for Range Picker --- src/components/DatePicker.svelte | 4 +++- src/components/lib/sanitization.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/DatePicker.svelte b/src/components/DatePicker.svelte index 43a34ea..24ca061 100644 --- a/src/components/DatePicker.svelte +++ b/src/components/DatePicker.svelte @@ -9,6 +9,7 @@ import View from './view/View.svelte' export let range = false + export let defaultRange = [1, "month"] export let placeholder = 'Choose Date' export let format = 'DD / MM / YYYY' export let start = dayjs().subtract(1, 'year') @@ -33,6 +34,7 @@ start: dayjs(start), end: dayjs(end), isRangePicker: range, + defaultRange, isTimePicker: time, closeOnFocusLoss, format, @@ -66,7 +68,7 @@ highlighted.set($selectedStartDate) dispatch('open') } - + function setRangeValue () { selected = [ $selectedStartDate, $selectedEndDate ] dispatch('range-selected', { diff --git a/src/components/lib/sanitization.js b/src/components/lib/sanitization.js index f6152eb..188c1b2 100644 --- a/src/components/lib/sanitization.js +++ b/src/components/lib/sanitization.js @@ -21,7 +21,7 @@ function sanitizeInitialValue (value, config) { if (config.isRangePicker) { const [ from, to ] = value || [] isDateChosen = Boolean(from).valueOf() && Boolean(to).valueOf() - chosen = isDateChosen ? value.map(dayjs) : [ dayjs.max(dayjs(), config.start), dayjs.min(dayjs().add(1, 'month'), config.end) ] + chosen = isDateChosen ? value.map(dayjs) : [ dayjs.max(dayjs(), config.start), dayjs.min(dayjs().add(...config.defaultRange), config.end) ] } else { isDateChosen = Boolean(value).valueOf() chosen = [ isDateChosen ? dayjs(value) : dayjs.max(dayjs(), config.start) ] From 58920377b3d39cf9614b9ef91bceb51215443bda Mon Sep 17 00:00:00 2001 From: Antony Jones Date: Mon, 10 Apr 2023 08:41:31 +0100 Subject: [PATCH 02/13] Update src/components/DatePicker.svelte --- src/components/DatePicker.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DatePicker.svelte b/src/components/DatePicker.svelte index 24ca061..a3fb854 100644 --- a/src/components/DatePicker.svelte +++ b/src/components/DatePicker.svelte @@ -9,7 +9,7 @@ import View from './view/View.svelte' export let range = false - export let defaultRange = [1, "month"] + export let defaultRange = [ 1, 'month' ] export let placeholder = 'Choose Date' export let format = 'DD / MM / YYYY' export let start = dayjs().subtract(1, 'year') From 6585cd449060be104ea4996170d97af26652baa0 Mon Sep 17 00:00:00 2001 From: TLock Date: Thu, 31 Aug 2023 13:49:17 +0900 Subject: [PATCH 03/13] Allow external components to udpate dates In the parent component, bind to the selected prop, and update with a tuple of JS date objects --- src/components/DatePicker.svelte | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/components/DatePicker.svelte b/src/components/DatePicker.svelte index a3fb854..79491c0 100644 --- a/src/components/DatePicker.svelte +++ b/src/components/DatePicker.svelte @@ -116,6 +116,21 @@ dispatch('change') } } + + /** + * Allow external sources to update dates by binding to selected prop + * and updating with JS Date objects + */ + $: { + if (config.isRangePicker) { + if (selected[0] instanceof Date) { + selectedStartDate.set(dayjs(selected[0])) + } + if (selected[1] instanceof Date) { + selectedEndDate.set(dayjs(selected[1])) + } + } + } - -
- dispatch('close')}> -
- - {#if !trigger} - - {/if} - -
-
-
- - {#if config.isRangePicker} - - {/if} -
- -
-
-
+{#if ready} + {#if $$slots.default} + + + + {:else} + + {/if} +{/if} diff --git a/src/components/DatePickerInner.svelte b/src/components/DatePickerInner.svelte new file mode 100644 index 0000000..ebf0502 --- /dev/null +++ b/src/components/DatePickerInner.svelte @@ -0,0 +1,235 @@ + + + + +
+ dispatch('close')}> +
+ + {#if !trigger} + + {/if} + +
+
+
+ + {#if config.isRangePicker} + + {/if} +
+ +
+
+
diff --git a/src/components/lib/context.js b/src/components/lib/context.js index 56a6a2c..b3116f8 100644 --- a/src/components/lib/context.js +++ b/src/components/lib/context.js @@ -7,6 +7,27 @@ import { ensureFutureMonth } from './date-manipulation.js' const contextKey = {} +async function setLoadingCursor () { + const loadingStyle = document.createElement('style') + + loadingStyle.dataset.styleName = 'loading-style' + + loadingStyle.innerHTML = '* { cursor: wait !important; }' + + document.head.appendChild(loadingStyle) + + await new Promise((resolve) => setTimeout(resolve, 20)) +} + +function clearLoadingCursor () { + const loadingStyles = document.querySelectorAll('[data-style-name="loading-style"]') + if (loadingStyles.length) { + setTimeout(() => { + loadingStyles.forEach(styletag => styletag.remove()) + }, 20) + } +} + function setup (given, config) { const today = dayjs().startOf('day') @@ -21,7 +42,7 @@ function setup (given, config) { ).startOf('month') const rightDate = config.isRangePicker ? ensureFutureMonth(leftDate, preSelectedEnd).startOf('month') : null - return { + const setupObj = { months: getMonths(config), component, today, @@ -41,9 +62,15 @@ function setup (given, config) { }, isSelectingFirstDate: writable(true) } + + clearLoadingCursor() + + return setupObj } export { contextKey, - setup + setup, + setLoadingCursor, + clearLoadingCursor } From b6b7d653d5a3b4635ff27d9317d3ff56fc30fde4 Mon Sep 17 00:00:00 2001 From: Tim Wheelock Date: Tue, 20 Aug 2024 17:29:10 +0900 Subject: [PATCH 07/13] Fix event forwarding --- src/App.svelte | 9 +++++---- src/components/DatePicker.svelte | 32 +++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/App.svelte b/src/App.svelte index b5c89b3..17f8793 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -59,13 +59,13 @@
@@ -273,6 +273,7 @@ range={true} time={true} on:range-selected={e => { + console.log(e) firedEvents = [ ...firedEvents, `Picked range ${e.detail.from} to ${e.detail.to}` @@ -314,7 +315,7 @@
- +
@@ -446,4 +447,4 @@ background-position: 100%; } } - \ No newline at end of file + diff --git a/src/components/DatePicker.svelte b/src/components/DatePicker.svelte index d4f9d2c..96c8f8d 100644 --- a/src/components/DatePicker.svelte +++ b/src/components/DatePicker.svelte @@ -1,5 +1,5 @@ {#if ready} {#if $$slots.default} - + {:else} - + {/if} {/if} From fccdd4434a4a1cd4ea2de1865ace5edd8a01e5fa Mon Sep 17 00:00:00 2001 From: Tim Wheelock Date: Tue, 20 Aug 2024 21:18:20 +0900 Subject: [PATCH 08/13] Move to slot props --- src/components/DatePicker.svelte | 40 ++++++++++----------------- src/components/DatePickerInner.svelte | 16 +++++++++-- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/components/DatePicker.svelte b/src/components/DatePicker.svelte index 96c8f8d..e5c0f88 100644 --- a/src/components/DatePicker.svelte +++ b/src/components/DatePicker.svelte @@ -1,5 +1,5 @@ {#if ready} {#if $$slots.default} - + {:else} {/if} {/if} diff --git a/src/components/DatePickerInner.svelte b/src/components/DatePickerInner.svelte index ebf0502..2b05301 100644 --- a/src/components/DatePickerInner.svelte +++ b/src/components/DatePickerInner.svelte @@ -135,11 +135,21 @@ /** * Allow external sources to react to internal selections via event forwarding */ + let selectedStart = null $: { - if ($selectedStartDate) dispatch('updateStart', $selectedStartDate.toDate()) + if ($selectedStartDate) { + selectedStart = $selectedStartDate.toDate() + } else { + selectedStart = null + } } + let selectedEnd = null $: { - if ($selectedEndDate) dispatch('updateEnd', $selectedEndDate.toDate()) + if ($selectedEndDate) { + selectedEnd = $selectedEndDate.toDate() + } else { + selectedEnd = null + } } @@ -204,7 +214,7 @@ on:opened={initialisePicker} on:closed={() => dispatch('close')}>
- + {#if !trigger}
    {#each firedEvents as fired} diff --git a/src/components/DatePicker.svelte b/src/components/DatePicker.svelte index e5c0f88..b251f74 100644 --- a/src/components/DatePicker.svelte +++ b/src/components/DatePicker.svelte @@ -23,6 +23,9 @@ let:selectedEnd > +
    + +
    {:else}
+
+ +
-
- + +
From a11c3510a01b7a7d783fcdb5babf1922a893926a Mon Sep 17 00:00:00 2001 From: Tim Wheelock Date: Tue, 20 Aug 2024 23:28:01 +0900 Subject: [PATCH 10/13] Re-do file structure --- src/components/DatePicker.svelte | 275 ++++++++++++++++--- src/components/DatePickerAsyncWrapper.svelte | 39 +++ src/components/DatePickerInner.svelte | 248 ----------------- src/main.js | 2 +- 4 files changed, 282 insertions(+), 282 deletions(-) create mode 100644 src/components/DatePickerAsyncWrapper.svelte delete mode 100644 src/components/DatePickerInner.svelte diff --git a/src/components/DatePicker.svelte b/src/components/DatePicker.svelte index b251f74..69fa8e8 100644 --- a/src/components/DatePicker.svelte +++ b/src/components/DatePicker.svelte @@ -1,39 +1,248 @@ -{#if ready} - {#if $$slots.default} - - -
- + + +
+ dispatch('close')}> +
+ + {#if !trigger} + + {/if} + +
+
+ +
+
+
+ + {#if config.isRangePicker} + + {/if}
- - {:else} - - {/if} -{/if} + +
+
+
diff --git a/src/components/DatePickerAsyncWrapper.svelte b/src/components/DatePickerAsyncWrapper.svelte new file mode 100644 index 0000000..46d7926 --- /dev/null +++ b/src/components/DatePickerAsyncWrapper.svelte @@ -0,0 +1,39 @@ + + +{#if ready} + {#if $$slots.default} + + +
+ +
+
+ {:else} + + {/if} +{/if} diff --git a/src/components/DatePickerInner.svelte b/src/components/DatePickerInner.svelte deleted file mode 100644 index cd54cd7..0000000 --- a/src/components/DatePickerInner.svelte +++ /dev/null @@ -1,248 +0,0 @@ - - - - -
- dispatch('close')}> -
- - {#if !trigger} - - {/if} - -
-
- -
-
-
- - {#if config.isRangePicker} - - {/if} -
- -
-
-
diff --git a/src/main.js b/src/main.js index 0bc801c..e18c282 100644 --- a/src/main.js +++ b/src/main.js @@ -1,6 +1,6 @@ import { polyfill } from 'es6-object-assign' import { CalendarStyle } from './calendar-style.js' -import DatePicker from './components/DatePicker.svelte' +import DatePicker from './components/DatePickerAsyncWrapper.svelte' polyfill() export { From 7c4b919a45754f605bc5ab1c9488ca905700a3b5 Mon Sep 17 00:00:00 2001 From: Tim Wheelock Date: Wed, 21 Aug 2024 00:12:45 +0900 Subject: [PATCH 11/13] Implement external force close --- src/App.svelte | 14 +++++++++++++- src/components/DatePicker.svelte | 10 ++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/App.svelte b/src/App.svelte index 215f359..876264f 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -272,6 +272,7 @@ format='ddd, DD MMM YYYY' range={true} time={true} + closeOnFocusLoss={false} on:range-selected={e => { console.log(e) firedEvents = [ @@ -287,13 +288,14 @@ }} let:selectedStart let:selectedEnd + forceClose={forcedClose} >

{selectedStart}

{selectedEnd}

-

hell yeah!

+

Before Contents Slot

@@ -304,6 +306,9 @@
  • Pick date to see events
  • {/each} +
    + +
    @@ -346,6 +351,13 @@ let firedEvents = [] let firedEventsValue = null let customSelected = null + + let forcedClose = false + async function forceClose () { + forcedClose = true + await new Promise((resolve) => setTimeout(resolve, 100)) + forcedClose = false + }