From 56791609f47fe0df901438a4834fe2471530c330 Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Fri, 12 Sep 2025 19:23:34 +0200 Subject: [PATCH 1/2] Add override for the event name in timetable Add timetableName field to events that override which name is shown in the timetable in order to allow using a custom condensed title in the timetable for short events. --- components/DiffScheduleEvent.vue | 6 ++++++ components/TableScheduleEvents.vue | 18 ++++++++++++++++++ components/Timetable.vue | 2 +- shared/types/api.ts | 1 + utils/client-schedule.nuxt.test.ts | 4 ++-- utils/client-schedule.ts | 10 ++++++++++ 6 files changed, 38 insertions(+), 3 deletions(-) diff --git a/components/DiffScheduleEvent.vue b/components/DiffScheduleEvent.vue index 57fc857..ee30c2e 100644 --- a/components/DiffScheduleEvent.vue +++ b/components/DiffScheduleEvent.vue @@ -11,6 +11,12 @@ :after="event.name" :state /> + id name + timetableName host notice description @@ -32,6 +33,13 @@ v-model="event.name" > + + + + + + {{ event.id }} {{ event.name }} + {{ event.timetableName }} {{ event.host }} {{ event.notice }} {{ event.description }} @@ -157,6 +172,7 @@ function canEdit(event: ClientScheduleEvent) { } const newEventName = ref(""); +const newEventShortName = ref(""); const newEventHost = ref(""); const newEventNotice = ref(""); const newEventDescription = ref(""); @@ -178,6 +194,7 @@ function newEvent() { schedule.value, schedule.value.nextClientId--, newEventName.value, + newEventShortName.value, !newEventPublic.value, newEventHost.value, false, @@ -189,6 +206,7 @@ function newEvent() { ); schedule.value.events.add(event); newEventName.value = ""; + newEventShortName.value = ""; newEventHost.value = ""; newEventNotice.value = ""; newEventDescription.value = ""; diff --git a/components/Timetable.vue b/components/Timetable.vue index 403c77b..86e4af9 100644 --- a/components/Timetable.vue +++ b/components/Timetable.vue @@ -106,7 +106,7 @@ :title="cell.event?.name" > {{ cell.event?.notice ? "⚠️" : undefined }} - {{ cell.event?.name }} + {{ cell.event?.timetableName || cell.event?.name }} diff --git a/shared/types/api.ts b/shared/types/api.ts index eb192a4..b72ccb6 100644 --- a/shared/types/api.ts +++ b/shared/types/api.ts @@ -89,6 +89,7 @@ export type ApiScheduleEventSlot = z.infer; export const apiScheduleEventSchema = defineApiEntity({ name: z.string(), + timetableName: z.optional(z.string()), crew: z.optional(z.boolean()), host: z.optional(z.string()), cancelled: z.optional(z.boolean()), diff --git a/utils/client-schedule.nuxt.test.ts b/utils/client-schedule.nuxt.test.ts index 9222301..ae86fc4 100644 --- a/utils/client-schedule.nuxt.test.ts +++ b/utils/client-schedule.nuxt.test.ts @@ -21,10 +21,10 @@ function fixtureClientSchedule(multiSlot = false) { const events = [ new ClientScheduleEvent( - 1, now, false, "Up", false, "", false, "", "What's Up?", 0, new Set(multiSlot ? [1, 2] : [1]), + 1, now, false, "Up", "", false, "", false, "", "What's Up?", 0, new Set(multiSlot ? [1, 2] : [1]), ), new ClientScheduleEvent( - 2, now, false, "Down", false, "", false, "", "", 0, new Set(multiSlot ? [] : [2]), + 2, now, false, "Down", "", false, "", false, "", "", 0, new Set(multiSlot ? [] : [2]), ), ]; const eventSlots = idMap([ diff --git a/utils/client-schedule.ts b/utils/client-schedule.ts index 17db51b..89aa041 100644 --- a/utils/client-schedule.ts +++ b/utils/client-schedule.ts @@ -133,6 +133,7 @@ export class ClientScheduleLocation extends ClientEntity { export class ClientScheduleEvent extends ClientEntity { schedule!: ClientSchedule; serverName: string; + serverTimetableName: string; serverCrew: boolean; serverHost: string; serverCancelled: boolean; @@ -146,6 +147,7 @@ export class ClientScheduleEvent extends ClientEntity { updatedAt: DateTime, deleted: boolean, public name: string, + public timetableName: string, public crew: boolean, public host: string, public cancelled: boolean, @@ -156,6 +158,7 @@ export class ClientScheduleEvent extends ClientEntity { ) { super(id, updatedAt, deleted); this.serverName = name; + this.serverTimetableName = timetableName; this.serverCrew = crew; this.serverHost = host; this.serverCancelled = cancelled; @@ -173,6 +176,7 @@ export class ClientScheduleEvent extends ClientEntity { return ( super.isModified() || this.name !== this.serverName + || this.timetableName !== this.serverTimetableName || this.crew !== this.serverCrew || this.host !== this.serverHost || this.cancelled !== this.serverCancelled @@ -191,6 +195,7 @@ export class ClientScheduleEvent extends ClientEntity { this.updatedAt = this.serverUpdatedAt;; this.deleted = this.serverDeleted;; this.name = this.serverName; + this.timetableName = this.serverTimetableName; this.crew = this.serverCrew; this.host = this.serverHost; this.cancelled = this.serverCancelled; @@ -210,6 +215,7 @@ export class ClientScheduleEvent extends ClientEntity { schedule: ClientSchedule, id: Id, name: string, + timetableName: string, crew: boolean, host: string, cancelled: boolean, @@ -224,6 +230,7 @@ export class ClientScheduleEvent extends ClientEntity { DateTime.fromMillis(ClientEntity.newEntityMillis, opts), false, name, + timetableName, crew, host, cancelled, @@ -245,6 +252,7 @@ export class ClientScheduleEvent extends ClientEntity { DateTime.fromISO(api.updatedAt, opts), api.deleted ?? false, api.name, + api.timetableName ?? "", api.crew ?? false, api.host ?? "", api.cancelled ?? false, @@ -263,6 +271,7 @@ export class ClientScheduleEvent extends ClientEntity { this.serverUpdatedAt = DateTime.fromISO(api.updatedAt, opts); this.serverDeleted = false; this.serverName = api.name; + this.serverTimetableName = api.timetableName ?? ""; this.serverCrew = api.crew ?? false; this.serverHost = api.host ?? ""; this.serverCancelled = api.cancelled ?? false; @@ -287,6 +296,7 @@ export class ClientScheduleEvent extends ClientEntity { id: this.id, updatedAt: toIso(this.updatedAt), name: this.name, + timetableName: this.timetableName || undefined, crew: this.crew || undefined, host: this.host || undefined, cancelled: this.cancelled || undefined, From a932cccfc007859f8ffcce3ae9126681c87d7dcf Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Fri, 12 Sep 2025 19:34:34 +0200 Subject: [PATCH 2/2] Add hook to script edit schedules in the client Expose the schedules in the schedules store as the window global owltideSchedules so that mass changes can easily be scripted by a programmer. --- stores/schedules.ts | 4 ++++ utils/client-schedule.nuxt.test.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/stores/schedules.ts b/stores/schedules.ts index 9f120e6..9d0a097 100644 --- a/stores/schedules.ts +++ b/stores/schedules.ts @@ -19,6 +19,10 @@ export const useSchedulesStore = defineStore("schedules", () => { pendingSyncs: ref>(new Map()), }; + /* Expose schedules to the console on the client to make it easy to inspect and do scripted modifications. */ + if (import.meta.client) + (window as any).owltideSchedules = state.schedules; + const getters = { activeSchedule: computed(() => { if (state.activeScheduleId.value === undefined) diff --git a/utils/client-schedule.nuxt.test.ts b/utils/client-schedule.nuxt.test.ts index ae86fc4..d132636 100644 --- a/utils/client-schedule.nuxt.test.ts +++ b/utils/client-schedule.nuxt.test.ts @@ -174,7 +174,7 @@ describe("class ClientSchedule", () => { ], [ "event", - (schedule) => ClientScheduleEvent.create(schedule, 3, "New location", false, "", false, "", "", 0, new Set(), { zone, locale }) + (schedule) => ClientScheduleEvent.create(schedule, 3, "New location", "", false, "", false, "", "", 0, new Set(), { zone, locale }) ], [ "role",