diff --git a/components/event/DateRange.vue b/components/event/DateRange.vue
index 148f6de1..216d81b2 100644
--- a/components/event/DateRange.vue
+++ b/components/event/DateRange.vue
@@ -4,7 +4,7 @@ import { format, parseISO, isSameDay, isSameMonth, isSameYear } from 'date-fns'
const props = defineProps<{
start: string | Date
- end: string | Date
+ end?: string | Date | null
formatString?: string
}>()
@@ -12,12 +12,21 @@ const parse = (date: string | Date) =>
typeof date === 'string' ? parseISO(date) : date
const startDate = computed(() => parse(props.start))
-const endDate = computed(() => parse(props.end))
+const endDate = computed(() =>
+ props.end != null && props.end !== ''
+ ? parse(props.end as string | Date)
+ : null
+)
+
+const isOpenEnd = computed(() => endDate.value === null)
const formattedRange = computed(() => {
const s = startDate.value
const e = endDate.value
+ if (e == null) {
+ return format(s, props.formatString || 'MMM d, yyyy')
+ }
if (isSameDay(s, e)) {
return format(s, props.formatString || 'MMM d, yyyy')
} else if (isSameMonth(s, e)) {
@@ -31,5 +40,8 @@ const formattedRange = computed(() => {
- {{ formattedRange }}
+
+ {{ formattedRange }}
+ (open end)
+
diff --git a/components/event/EventView.vue b/components/event/EventView.vue
index 8dc68524..f4bb544e 100644
--- a/components/event/EventView.vue
+++ b/components/event/EventView.vue
@@ -299,9 +299,11 @@ const navigation = computed(() => [
- {{ getDateTime(event.endDate) }}
+ {{ event.endDate ? getDateTime(event.endDate) : 'Open end' }}
+
+
+ {{ event.endDate ? 'End' : 'No end time' }}
-
End
diff --git a/components/event/edit/EventAboutEditor.vue b/components/event/edit/EventAboutEditor.vue
index 4e567876..c2d22720 100644
--- a/components/event/edit/EventAboutEditor.vue
+++ b/components/event/edit/EventAboutEditor.vue
@@ -28,7 +28,7 @@ const schema = z.object({
cover: z.string().optional().default(''),
status: statusSchema,
startDate: z.string().optional(),
- endDate: z.string().optional(),
+ endDate: z.string().optional().nullable(),
type: z.string().optional().default('Party'),
venue: z
.object({
@@ -186,7 +186,7 @@ const askToDelete = () => {
- Start
+ Start Date
@@ -194,12 +194,31 @@ const askToDelete = () => {
-
-
- End
-
-
-
+
+
+
+ setEndDate(checked ? null : undefined)"
+ />
+
+ Open end party (no end date/time)
+
+
+
+ End date
+
+
+
+
diff --git a/server/trpc/routers/events.ts b/server/trpc/routers/events.ts
index 015a8d0d..7e266773 100644
--- a/server/trpc/routers/events.ts
+++ b/server/trpc/routers/events.ts
@@ -278,7 +278,7 @@ export const eventsRouter = router({
cover: z.string().optional(),
status: z.string().optional(),
startDate: z.string().optional(),
- endDate: z.string().optional(),
+ endDate: z.string().optional().nullable(),
type: z.string().optional(),
venue: z
.object({
@@ -311,7 +311,12 @@ export const eventsRouter = router({
data: {
...data,
startDate: data.startDate ? new Date(data.startDate) : undefined,
- endDate: data.endDate ? new Date(data.endDate) : undefined,
+ endDate:
+ data.endDate === null || data.endDate === ''
+ ? null
+ : data.endDate
+ ? new Date(data.endDate)
+ : undefined,
venueId: venue?.id,
organizerId: organizer?.id,
styles: stylesData,