diff --git a/packages/demo/src/App.svelte b/packages/demo/src/App.svelte index d5fad75b..2be1b371 100644 --- a/packages/demo/src/App.svelte +++ b/packages/demo/src/App.svelte @@ -11,15 +11,16 @@ import AutocompleteDemo from './FormFieldDemos/AutocompleteDemo.svelte'; import CheckboxDemo from './FormFieldDemos/CheckboxDemo.svelte'; import ChipsDemo from './FormFieldDemos/ChipsDemo.svelte'; - import CkEditorDemo from './FormFieldDemos/CkEditorDemo.svelte'; - import DateRangeDemo from './FormFieldDemos/DateRangeDemo.svelte'; + import CkEditorDemo from './FormFieldDemos/CkEditorDemo.svelte'; */ + import DateRangeDemo from './FormFieldDemos/DateRangeDemo.svelte'; /* import DatepickerDemo from './FormFieldDemos/DatepickerDemo.svelte'; import FileListDemo from './FormFieldDemos/FileListDemo.svelte'; import MultiSearchDemo from './FormFieldDemos/MultiSearchDemo.svelte'; import QuillDemo from './FormFieldDemos/QuillDemo.svelte'; import RadioDemo from './FormFieldDemos/RadioDemo.svelte'; - import RangeDemo from './FormFieldDemos/RangeDemo.svelte'; - import SliderDemo from './FormFieldDemos/SliderDemo.svelte'; + import RangeDemo from './FormFieldDemos/RangeDemo.svelte'; + import SelectDemo from './FormFieldDemos/SelectDemo.svelte'; + import SliderDemo from './FormFieldDemos/SliderDemo.svelte'; import TextareaDemo from './FormFieldDemos/TextareaDemo.svelte'; import ToggleDemo from './FormFieldDemos/ToggleDemo.svelte'; //EDITORS @@ -91,7 +92,7 @@ - + diff --git a/packages/demo/src/FormFieldDemos/DateRangeDemo.svelte b/packages/demo/src/FormFieldDemos/DateRangeDemo.svelte index 8482e952..91b8c569 100644 --- a/packages/demo/src/FormFieldDemos/DateRangeDemo.svelte +++ b/packages/demo/src/FormFieldDemos/DateRangeDemo.svelte @@ -28,9 +28,9 @@ - + - + --> diff --git a/packages/lib/src/form-fields/date-range/date-range.pcss b/packages/lib/src/form-fields/date-range/date-range.pcss index c39a468d..df2391f4 100644 --- a/packages/lib/src/form-fields/date-range/date-range.pcss +++ b/packages/lib/src/form-fields/date-range/date-range.pcss @@ -93,11 +93,58 @@ left: 0; right: 0; bottom: 0; + + &-content { + position: absolute; + display: flex; + flex-direction: row; + box-shadow: 0 6px 9px rgba(0, 0, 0, 0.16); + background-color: var(--background-primary); + } } + &-presets { + z-index: 100; + display: flex; + flex-direction: column; + justify-content: center; + max-width: calc(280px + 2rem); + max-height: 395px; + padding: 1rem; + overflow-y: auto; + border-bottom-right-radius: 0.25rem; + background-color: var(--background-primary); + box-sizing: border-box; + + > button { + display: flex; + justify-content: space-between; + align-items: center; + border: none; + gap: 0.75rem; + padding: 0.75rem; + text-align: left; + outline: none; + background-color: var(--background-primary); + border-radius: 0.25rem; + + &:hover { + background-color: var(--background-secondary); + } + + &:focus{ + background-color: var(--primary-color); + color: var(--text-on-primary); + } + } + &-active { + background-color: var(--primary-color) !important; + color: var(--text-on-primary); + } + } + &-menu { z-index: 100; - position: absolute; display: flex; flex-direction: column; max-width: calc(280px + 2rem); @@ -105,8 +152,6 @@ padding: 1rem; overflow-y: auto; border-bottom-left-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; - box-shadow: 0 6px 9px rgba(0, 0, 0, 0.16); background-color: var(--background-primary); box-sizing: border-box; @@ -181,19 +226,20 @@ &-cell { & button { flex: 1 1 0; - padding: 0.25rem 1rem; + padding: 0.75rem 1rem; width: 100%; border: 0; - border-radius: 50%; + border-radius: 999px; + background-color: transparent; &:not(:disabled):hover { background-color: var(--primary-color); color: var(--text-on-primary); } } - + &-active { - background-color: var(--primary-color); + background-color: var(--primary-color) !important; color: var(--text-on-primary); } diff --git a/packages/lib/src/form-fields/date-range/date-range.wc.svelte b/packages/lib/src/form-fields/date-range/date-range.wc.svelte index cf539f9e..1aa201ef 100644 --- a/packages/lib/src/form-fields/date-range/date-range.wc.svelte +++ b/packages/lib/src/form-fields/date-range/date-range.wc.svelte @@ -56,7 +56,7 @@ export let minSelectableDays: number; export let maxDateSelectable: Date; export let minDateSelectable: Date; - + export let enablePreset: boolean = true; let firstSelectedDateObject = new Date(); let secondSelectedDateObject = new Date(); let displayedDateString = ''; @@ -92,6 +92,83 @@ 'Dec' ]; let yearPickerIndex = 0; + + const date = new Date(); + const createRelativeDate = (days = 0, months = 0, years = 0) => { + const newDate = new Date(date); + if (days) newDate.setDate(date.getDate() + days); + if (months) newDate.setMonth(date.getMonth() + months); + if (years) newDate.setFullYear(date.getFullYear() + years); + return newDate; + }; + const yesterday = createRelativeDate(-1); + const sevenDaysAgo = createRelativeDate(-7); + const thirtyDaysAgo = createRelativeDate(-30); + const nintyDaysAgo = createRelativeDate(-90); + const twelveMonthsAgo = createRelativeDate(0, -12); + const firstDayOfLastYear = new Date(date.getFullYear() - 1, 0, 1); + const lastDayOfLastYear = new Date(date.getFullYear() - 1, 11, 31); + const firstDayOfThisYear = new Date(date.getFullYear(), 0, 1); + + function handlePresets(label: string) { + const setDates = (start: Date, end: Date) => { + firstDateSelected = start.getDate(); + firstMonthSelected = start.getMonth(); + firstYearSelected = start.getFullYear(); + secondDateSelected = end.getDate(); + secondMonthSelected = end.getMonth(); + secondYearSelected = end.getFullYear(); + pickerMonth = start.getMonth(); + pickerYear = start.getFullYear(); + }; + const updatePreset = (index: number) => { + presets = presets.map((preset, i) => ({ + ...preset, + active: i === index, + })); + }; + if (label === 'Today') { + setDates(date, date); + updatePreset(0); + } else if (label === 'Yesterday') { + const yesterday = new Date(date); + yesterday.setDate(date.getDate() - 1); + setDates(yesterday, yesterday); + updatePreset(1); + } else if (label === 'Last 7 days') { + const sevenDaysAgo = new Date(date); + sevenDaysAgo.setDate(date.getDate() - 7); + setDates(sevenDaysAgo, date); + updatePreset(2); + } else if (label === 'Last 30 days') { + const thirtyDaysAgo = new Date(date); + thirtyDaysAgo.setDate(date.getDate() - 30); + setDates(thirtyDaysAgo, date); + updatePreset(3); + } else if (label === 'Last 90 days') { + const ninetyDaysAgo = new Date(date); + ninetyDaysAgo.setDate(date.getDate() - 90); + setDates(ninetyDaysAgo, date); + updatePreset(4); + } else if (label === 'Last 12 months') { + const twelveMonthsAgo = new Date(date); + twelveMonthsAgo.setMonth(date.getMonth() - 12); + setDates(twelveMonthsAgo, date); + updatePreset(5); + } else if (label === 'Last year') { + const firstDayOfLastYear = new Date(date.getFullYear() - 1, 0, 1); + const lastDayOfLastYear = new Date(firstDayOfLastYear.getFullYear(), 12, 0); + setDates(firstDayOfLastYear, lastDayOfLastYear); + updatePreset(6); + } else if (label === 'This year') { + const firstDayOfThisYear = new Date(date.getFullYear(), 0, 1); + const internalMaxDate = maxDate ? (maxDate instanceof Date ? maxDate : new Date(maxDate)) : null; + const isOutOfBounds = isOutOfMaxBounds(internalMaxDate, date.getFullYear(), date.getMonth(), date.getDate()); + setDates(firstDayOfThisYear, isOutOfBounds ? internalMaxDate : date); + updatePreset(7); + } + } + function handleYearSelected(event: { detail: { year: any } }) { const { year } = event.detail; @@ -421,6 +498,17 @@ } } $: displayLabel = required ? `${label} *` : label; + + $: presets = [ + {label: 'Today', disabled: isOutOfMaxBounds(internalMaxDate, date.getFullYear(), date.getMonth(), date.getDate()) || isOutOfMinBounds(internalMinDate, date.getFullYear(), date.getMonth(), date.getDate()), active: false}, + {label: 'Yesterday', disabled: isOutOfMaxBounds(internalMaxDate, yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate()) || isOutOfMinBounds(internalMinDate, yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate()), active: false}, + {label: 'Last 7 days', disabled: isOutOfMinBounds(internalMinDate, sevenDaysAgo.getFullYear(), sevenDaysAgo.getMonth(), sevenDaysAgo.getDate()) || isOutOfMaxBounds(internalMaxDate, date.getFullYear(), date.getMonth(), date.getDate()), active: false}, + {label: 'Last 30 days', disabled: isOutOfMinBounds(internalMinDate, thirtyDaysAgo.getFullYear(), thirtyDaysAgo.getMonth(), thirtyDaysAgo.getDate()) || isOutOfMaxBounds(internalMaxDate, date.getFullYear(), date.getMonth(), date.getDate()), active: false}, + {label: 'Last 90 days', disabled: isOutOfMinBounds(internalMinDate, nintyDaysAgo.getFullYear(), nintyDaysAgo.getMonth(), nintyDaysAgo.getDate()) || isOutOfMaxBounds(internalMaxDate, date.getFullYear(), date.getMonth(), date.getDate()), active: false}, + {label: 'Last 12 months', disabled: isOutOfMinBounds(internalMinDate, twelveMonthsAgo.getFullYear(), twelveMonthsAgo.getMonth(), twelveMonthsAgo.getDate()) || isOutOfMaxBounds(internalMaxDate, date.getFullYear(), date.getMonth(), date.getDate()), active: false}, + {label: 'Last year', disabled: isOutOfMinBounds(internalMinDate, firstDayOfLastYear.getFullYear(), firstDayOfLastYear.getMonth(), firstDayOfLastYear.getDate()) || isOutOfMaxBounds(internalMaxDate, lastDayOfLastYear.getFullYear(), lastDayOfLastYear.getMonth(), lastDayOfLastYear.getDate()), active: false}, + {label: 'This year', disabled: isOutOfMaxBounds(internalMaxDate, firstDayOfThisYear.getFullYear(), firstDayOfThisYear.getMonth(), firstDayOfThisYear.getDate()) || isOutOfMinBounds(internalMinDate, firstDayOfThisYear.getFullYear(), firstDayOfThisYear.getMonth(), firstDayOfThisYear.getDate()), active: false} + ]; {#if label && labelType == 'outside'} @@ -462,195 +550,218 @@ {#if openPicker}