Skip to content

Commit

Permalink
Merge pull request #1048 from PrefectHQ/date-range-select
Browse files Browse the repository at this point in the history
Feature: PDateRangeSelect
  • Loading branch information
pleek91 authored Dec 12, 2023
2 parents 7c7023f + c85c433 commit 940128a
Show file tree
Hide file tree
Showing 14 changed files with 564 additions and 17 deletions.
44 changes: 44 additions & 0 deletions demo/sections/components/DateRangeSelect.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<template>
<ComponentPage title="Date Range Select" :demos="[{ title: 'Date Range Select' }]">
<template #description>
<DemoState v-model:state="exampleState" v-model:disabled="disabled" />
</template>

<template #date-range-select>
<p-content>
<p-date-range-select v-model="value" v-bind="{ min, max, clearable, disabled }" />
<p-code inline>
value: {{ JSON.stringify(value) }}
</p-code>
<div class="flex justify-start gap-4">
<p-checkbox v-model="clearable" :disabled="disabled" label="Clearable" />
</div>
<div class="flex gap-4 w-1/2">
<p-label label="Min Value" :message="min ? format(min, 'MMM do, yyyy h:mm a') : ''">
<p-native-date-input v-model="min" :disabled="disabled" :state="exampleState" />
</p-label>

<p-label label="Max Value" :message="max ? format(max, 'MMM do, yyyy h:mm a') : ''">
<p-native-date-input v-model="max" :disabled="disabled" :state="exampleState" />
</p-label>
</div>
</p-content>
</template>
</ComponentPage>
</template>

<script lang="ts" setup>
import { State } from '@/types'
import { format } from 'date-fns'
import { ref } from 'vue'
import ComponentPage from '@/demo/components/ComponentPage.vue'
import DemoState from '@/demo/components/DemoState.vue'
const exampleState = ref<State>()
const disabled = ref(false)
const value = ref()
const min = ref<Date>()
const max = ref<Date>()
const clearable = ref(true)
</script>
1 change: 1 addition & 0 deletions demo/sections/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export const components: Section = {
contextSidebar: () => import('./ContextSidebar.vue'),
dateInput: () => import('./DateInput.vue'),
dateRangeInput: () => import('./DateRangeInput.vue'),
dateRangeSelect: () => import('./DateRangeSelect.vue'),
dialog: () => import('./Dialog.vue'),
divider: () => import('./Divider.vue'),
drawer: () => import('./Drawer.vue'),
Expand Down
8 changes: 0 additions & 8 deletions src/components/DateInput/PDateInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
<PDatePicker
v-model="internalModelValue"
v-model:viewing-date="internalViewingDate"
class="p-date-input__date-picker"
v-bind="{ min, max, showTime }"
@close="close"
>
Expand Down Expand Up @@ -88,13 +87,6 @@
</script>

<style>
.p-date-input__date-picker { @apply
bg-floating
my-1
rounded-default
shadow-lg
}
.p-date-input--open { @apply
ring-spacing-focus-ring
ring-focus-ring
Expand Down
4 changes: 4 additions & 0 deletions src/components/DatePicker/PDatePicker.vue
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@

<style>
.p-date-picker { @apply
bg-floating
my-1
rounded-default
shadow-lg
flex
flex-col
p-2
Expand Down
1 change: 0 additions & 1 deletion src/components/DateRangeInput/PDateRangeInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
v-model:start-date="internalStartDate"
v-model:end-date="internalEndDate"
v-model:viewing-date="internalViewingDate"
class="p-date-input__date-picker"
v-bind="{ min, max, showTime }"
@close="close"
>
Expand Down
25 changes: 21 additions & 4 deletions src/components/DateRangePicker/PDateRangePicker.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
<template>
<PDatePicker v-model:viewingDate="viewingDate" :model-value="startDate ?? endDate" v-bind="{ min, max }" class="p-date-picker" @update:model-value="update">
<PDatePicker
v-model:viewingDate="viewingDate"
:model-value="startDate ?? endDate"
v-bind="{ min, max }"
class="p-date-range-picker"
@update:model-value="update"
@close="close"
>
<template #date="{ date, disabled: dateDisabled, today, inMonth }">
<div class="p-date-range-picker__date-wrapper" :class="classes.dateWrapper(date)">
<p-button
Expand All @@ -24,15 +31,15 @@

<template #controls>
<PContent>
<PDateTimeInputGroup v-model="selectedStartDate" :show-time="showTime" label="Start Date" />
<PDateTimeInputGroup v-model="selectedEndDate" :show-time="showTime" label="End Date" />
<PDateTimeInputGroup :model-value="selectedStartDate" :show-time="showTime" label="Start Date" @update:model-value="setStartDateAndTime" />
<PDateTimeInputGroup :model-value="selectedEndDate" :show-time="showTime" label="End Date" @update:model-value="setEndDateAndTime" />
</PContent>
</template>
</PDatePicker>
</template>

<script lang="ts" setup>
import { endOfDay, isSameDay, startOfDay } from 'date-fns'
import { endOfDay, endOfMinute, isSameDay, startOfDay, startOfMinute } from 'date-fns'
import { computed, ref } from 'vue'
import PButton from '@/components/Button/PButton.vue'
import PDatePicker from '@/components/DatePicker/PDatePicker.vue'
Expand All @@ -52,6 +59,7 @@
'update:startDate': [value: Date | null | undefined],
'update:endDate': [value: Date | null | undefined],
'update:viewingDate': [value: Date | null | undefined],
'apply': [],
'close': [],
}>()
Expand Down Expand Up @@ -128,9 +136,18 @@
selectedEndDate.value = value ? endOfDay(value) : value
}
function setStartDateAndTime(value: Date | null): void {
selectedStartDate.value = value ? startOfMinute(value) : value
}
function setEndDateAndTime(value: Date | null): void {
selectedEndDate.value = value ? endOfMinute(value) : value
}
function update(): void {
emit('update:startDate', selectedStartDate.value)
emit('update:endDate', selectedEndDate.value)
emit('apply')
close()
}
Expand Down
Loading

0 comments on commit 940128a

Please sign in to comment.