From e70a78923a69a9ec3f4e0d8c79bcbfa2c08c4012 Mon Sep 17 00:00:00 2001 From: idaho <664101+idaho@users.noreply.github.com> Date: Wed, 2 Oct 2024 10:44:26 +0200 Subject: [PATCH] implement option to filter events by location --- src/cards/trash-card/formSchemas.ts | 8 ++++++++ src/cards/trash-card/items/card.ts | 1 + src/cards/trash-card/trash-card-config.ts | 2 ++ src/translations/en.json | 4 ++++ src/utils/findActiveEvents.ts | 7 ++++++- src/utils/getCalendarData.ts | 5 +++++ 6 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/cards/trash-card/formSchemas.ts b/src/cards/trash-card/formSchemas.ts index c9cc096..3e14377 100644 --- a/src/cards/trash-card/formSchemas.ts +++ b/src/cards/trash-card/formSchemas.ts @@ -99,6 +99,14 @@ const getSchema = (customLocalize: LocalizeFunc, currentValues: TrashCardConfig, } } ] + }, + { + name: 'location', + label: customLocalize(`editor.form.location.title`), + helper: customLocalize(`editor.form.location.helper`), + selector: { + text: {} + } } ]; diff --git a/src/cards/trash-card/items/card.ts b/src/cards/trash-card/items/card.ts index c2bd7a1..d05930b 100644 --- a/src/cards/trash-card/items/card.ts +++ b/src/cards/trash-card/items/card.ts @@ -53,6 +53,7 @@ class ItemCard extends BaseItemElement { id="info" .primary=${with_label ? label : content} .secondary=${with_label ? content : undefined} + .multiline=${true} > diff --git a/src/cards/trash-card/trash-card-config.ts b/src/cards/trash-card/trash-card-config.ts index 74cce93..6d89cee 100644 --- a/src/cards/trash-card/trash-card-config.ts +++ b/src/cards/trash-card/trash-card-config.ts @@ -43,6 +43,7 @@ const COLORMODES = [ interface TrashCardConfig { entities: string[]; pattern?: ItemSettings[]; + location?: string; next_days?: number; items_per_row?: number; filter_events?: boolean; @@ -74,6 +75,7 @@ const entityCardConfigStruct = assign( object({ entities: optional(array(string())), name: optional(string()), + location: optional(string()), layout: optional(union([ literal(LAYOUTS[0]), literal(LAYOUTS[1]), literal(LAYOUTS[2]) ])), fill_container: optional(boolean()), filter_events: optional(boolean()), diff --git a/src/translations/en.json b/src/translations/en.json index 7fec55c..fd6afd3 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -58,6 +58,10 @@ "refresh_rate": { "title": "Update interval", "helper": "Check for changes in the calendar every x minutes" + }, + "location": { + "title": "Location", + "helper": "Filter events by given location, if none is given all are used." } }, "card": { diff --git a/src/utils/findActiveEvents.ts b/src/utils/findActiveEvents.ts index 8efb163..644cf58 100644 --- a/src/utils/findActiveEvents.ts +++ b/src/utils/findActiveEvents.ts @@ -12,6 +12,7 @@ interface Config { interface Options { config: Config; + location?: string; now: Date; dropAfter: boolean; filterFutureEventsDay: string; @@ -32,12 +33,16 @@ const isNotPastWholeDayEvent = (item: CalendarEvent, now: Date, dropAfter: boole (item.isWholeDayEvent && getDayFromDate(item.date.start) === getDayFromDate(now) && !dropAfter) || (item.isWholeDayEvent && getDayFromDate(item.date.start) !== getDayFromDate(now)); -const findActiveEvents = (items: CalendarEvent[], { config, now, dropAfter, filterFutureEventsDay }: Options): CalendarEvent[] => { +const findActiveEvents = (items: CalendarEvent[], { config, now, dropAfter, filterFutureEventsDay, location }: Options): CalendarEvent[] => { const dateString = `${filterFutureEventsDay}T00:00:00${getTimeZoneOffset()}`; const dateMaxStart = new Date(dateString); const activeItems = items. filter((item): boolean => { + if (location && !item.content.location?.toLowerCase().includes(location.toLowerCase())) { + return false; + } + if (item.date.start > dateMaxStart) { return false; } diff --git a/src/utils/getCalendarData.ts b/src/utils/getCalendarData.ts index d722670..5355821 100644 --- a/src/utils/getCalendarData.ts +++ b/src/utils/getCalendarData.ts @@ -50,6 +50,10 @@ const getCalendarData = async ( debuggerInstance.log(`dropAfter`, dropAfter); debuggerInstance.log(`now`, now); + if (config.location) { + debuggerInstance.log(`location filtering`, config.location); + } + const activeEvents = findActiveEvents(normalisedEvents, { config: { pattern: config.pattern!, @@ -58,6 +62,7 @@ const getCalendarData = async ( }, dropAfter, now, + location: config.location, filterFutureEventsDay: end });