From 132f5de5bee13082ea23b1c0a70a645dc7ffe3e4 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Fri, 21 Mar 2025 10:49:23 +0100 Subject: [PATCH 01/10] 1.3.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 58c2a95..3f31d5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ff-admin", - "version": "1.3.2", + "version": "1.3.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ff-admin", - "version": "1.3.2", + "version": "1.3.3", "license": "AGPL-3.0-only", "dependencies": { "@fullcalendar/core": "^6.1.15", diff --git a/package.json b/package.json index bb37882..17462a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ff-admin", - "version": "1.3.2", + "version": "1.3.3", "description": "Feuerwehr/Verein Mitgliederverwaltung UI", "type": "module", "scripts": { From fe9d80e5d56ed13a0baf2d21befb38d8adf97136 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Mon, 24 Mar 2025 09:19:32 +0100 Subject: [PATCH 02/10] fix: auto sync of protocol after sort --- src/stores/admin/club/protocol/protocolAgenda.ts | 5 ++++- src/stores/admin/club/protocol/protocolDecision.ts | 5 ++++- src/stores/admin/club/protocol/protocolVoting.ts | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/stores/admin/club/protocol/protocolAgenda.ts b/src/stores/admin/club/protocol/protocolAgenda.ts index b032a3a..1341b84 100644 --- a/src/stores/admin/club/protocol/protocolAgenda.ts +++ b/src/stores/admin/club/protocol/protocolAgenda.ts @@ -21,7 +21,10 @@ export const useProtocolAgendaStore = defineStore("protocolAgenda", { }, getters: { detectedChangeProtocolAgenda: (state) => - !isEqual(state.origin, state.agenda) && state.syncingProtocolAgenda != "syncing", + !isEqual( + state.origin.sort((a, b) => a.id - b.id), + state.agenda.sort((a, b) => a.id - b.id) + ) && state.syncingProtocolAgenda != "syncing", }, actions: { setProtocolAgendaSyncingState(state: "synced" | "syncing" | "detectedChanges" | "failed") { diff --git a/src/stores/admin/club/protocol/protocolDecision.ts b/src/stores/admin/club/protocol/protocolDecision.ts index ade8210..33b4da9 100644 --- a/src/stores/admin/club/protocol/protocolDecision.ts +++ b/src/stores/admin/club/protocol/protocolDecision.ts @@ -22,7 +22,10 @@ export const useProtocolDecisionStore = defineStore("protocolDecision", { }, getters: { detectedChangeProtocolDecision: (state) => - !isEqual(state.origin, state.decision) && state.syncingProtocolDecision != "syncing", + !isEqual( + state.origin.sort((a, b) => a.id - b.id), + state.decision.sort((a, b) => a.id - b.id) + ) && state.syncingProtocolDecision != "syncing", }, actions: { setProtocolDecisionSyncingState(state: "synced" | "syncing" | "detectedChanges" | "failed") { diff --git a/src/stores/admin/club/protocol/protocolVoting.ts b/src/stores/admin/club/protocol/protocolVoting.ts index dd2c5fb..6b75c04 100644 --- a/src/stores/admin/club/protocol/protocolVoting.ts +++ b/src/stores/admin/club/protocol/protocolVoting.ts @@ -22,7 +22,10 @@ export const useProtocolVotingStore = defineStore("protocolVoting", { }, getters: { detectedChangeProtocolVoting: (state) => - !isEqual(state.origin, state.voting) && state.syncingProtocolVoting != "syncing", + !isEqual( + state.origin.sort((a, b) => a.id - b.id), + state.voting.sort((a, b) => a.id - b.id) + ) && state.syncingProtocolVoting != "syncing", }, actions: { setProtocolVotingSyncingState(state: "synced" | "syncing" | "detectedChanges" | "failed") { From 4ed58443ca4ca9fc2e01fdc62a41fe36c95c4975 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Mon, 24 Mar 2025 09:22:52 +0100 Subject: [PATCH 03/10] 1.3.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f31d5e..ffc5179 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ff-admin", - "version": "1.3.3", + "version": "1.3.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ff-admin", - "version": "1.3.3", + "version": "1.3.4", "license": "AGPL-3.0-only", "dependencies": { "@fullcalendar/core": "^6.1.15", diff --git a/package.json b/package.json index 17462a9..7d2603d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ff-admin", - "version": "1.3.3", + "version": "1.3.4", "description": "Feuerwehr/Verein Mitgliederverwaltung UI", "type": "module", "scripts": { From b1daa7e64fcaa2759820f29749bbf69cea8ad925 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Wed, 26 Mar 2025 11:11:42 +0100 Subject: [PATCH 04/10] change: make query id to uuid --- src/stores/admin/club/queryBuilder.ts | 3 +-- src/stores/admin/configuration/queryStore.ts | 2 +- .../admin/club/newsletter/newsletter.models.ts | 4 ++-- src/viewmodels/admin/configuration/query.models.ts | 4 ++-- .../admin/club/newsletter/NewsletterRecipients.vue | 10 +++++----- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/stores/admin/club/queryBuilder.ts b/src/stores/admin/club/queryBuilder.ts index d70cd66..2aad8af 100644 --- a/src/stores/admin/club/queryBuilder.ts +++ b/src/stores/admin/club/queryBuilder.ts @@ -13,8 +13,7 @@ export const useQueryBuilderStore = defineStore("queryBuilder", { loadingData: "fetched" as "loading" | "fetched" | "failed", queryError: "" as string | { sql: string; code: string; msg: string }, query: undefined as undefined | DynamicQueryStructure | string, - activeQueryId: undefined as undefined | number, - isLoadedQuery: undefined as undefined | number, + activeQueryId: undefined as undefined | string, }; }, actions: { diff --git a/src/stores/admin/configuration/queryStore.ts b/src/stores/admin/configuration/queryStore.ts index 772117e..451cbca 100644 --- a/src/stores/admin/configuration/queryStore.ts +++ b/src/stores/admin/configuration/queryStore.ts @@ -31,7 +31,7 @@ export const useQueryStoreStore = defineStore("queryStore", { this.loading = "failed"; }); }, - fetchQueryById(id: number): Promise> { + fetchQueryById(id: string): Promise> { return http.get(`/admin/querystore/${id}`); }, triggerSave() { diff --git a/src/viewmodels/admin/club/newsletter/newsletter.models.ts b/src/viewmodels/admin/club/newsletter/newsletter.models.ts index 5a85299..31926bc 100644 --- a/src/viewmodels/admin/club/newsletter/newsletter.models.ts +++ b/src/viewmodels/admin/club/newsletter/newsletter.models.ts @@ -8,7 +8,7 @@ export interface NewsletterViewModel { newsletterText: string; newsletterSignatur: string; isSent: boolean; - recipientsByQueryId?: number | null; + recipientsByQueryId?: string | null; recipientsByQuery?: QueryViewModel | null; } @@ -23,7 +23,7 @@ export interface SyncNewsletterViewModel { newsletterTitle: string; newsletterText: string; newsletterSignatur: string; - recipientsByQueryId?: number; + recipientsByQueryId?: string; } export interface SendNewsletterViewModel { diff --git a/src/viewmodels/admin/configuration/query.models.ts b/src/viewmodels/admin/configuration/query.models.ts index c6d1c84..4640630 100644 --- a/src/viewmodels/admin/configuration/query.models.ts +++ b/src/viewmodels/admin/configuration/query.models.ts @@ -7,7 +7,7 @@ export interface TableMeta { } export interface QueryViewModel { - id: number; + id: string; title: string; query: string | DynamicQueryStructure; } @@ -18,6 +18,6 @@ export interface CreateQueryViewModel { } export interface UpdateQueryViewModel { - id: number; + id: string; query: string | DynamicQueryStructure; } diff --git a/src/views/admin/club/newsletter/NewsletterRecipients.vue b/src/views/admin/club/newsletter/NewsletterRecipients.vue index a6f2b5c..568dd0f 100644 --- a/src/views/admin/club/newsletter/NewsletterRecipients.vue +++ b/src/views/admin/club/newsletter/NewsletterRecipients.vue @@ -134,10 +134,10 @@ export default defineComponent({ if (val == "def") { this.activeNewsletterObj.recipientsByQueryId = null; this.activeNewsletterObj.recipientsByQuery = null; - } else if (this.queries.find((q) => q.id == parseInt(val))) { - this.activeNewsletterObj.recipientsByQueryId = parseInt(val); - this.activeNewsletterObj.recipientsByQuery = cloneDeep(this.queries.find((q) => q.id == parseInt(val))); - this.sendQuery(0, 1000, this.recipientsByQuery?.query); + } else if (this.queries.find((q) => q.id == val)) { + this.activeNewsletterObj.recipientsByQueryId = val; + this.activeNewsletterObj.recipientsByQuery = cloneDeep(this.queries.find((q) => q.id == val)); + this.sendQuery(0, 0, this.recipientsByQuery?.query, true); } }, }, @@ -171,7 +171,7 @@ export default defineComponent({ }, loadQuery() { if (this.recipientsByQuery) { - this.sendQuery(0, 1000, this.recipientsByQuery.query); + this.sendQuery(0, 0, this.recipientsByQuery.query, true); } }, }, From 8ec3b048241e4dbbad637db21ef5a28208570ab6 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Mon, 31 Mar 2025 09:58:54 +0200 Subject: [PATCH 05/10] change: sw caching --- vite.config.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vite.config.ts b/vite.config.ts index a967155..222a50f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -58,6 +58,14 @@ export default defineConfig({ }, ], }, + workbox: { + runtimeCaching: [ + { + urlPattern: /^\/api\//, + handler: "NetworkFirst", + }, + ], + }, }), ], resolve: { From d04dde688ffe8c9518c47f7d63a5f922351a3cc6 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Mon, 7 Apr 2025 15:30:12 +0200 Subject: [PATCH 06/10] fix: query builder query select --- src/components/queryBuilder/BuilderHost.vue | 38 ++++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/components/queryBuilder/BuilderHost.vue b/src/components/queryBuilder/BuilderHost.vue index 55938a4..cbe420e 100644 --- a/src/components/queryBuilder/BuilderHost.vue +++ b/src/components/queryBuilder/BuilderHost.vue @@ -32,7 +32,7 @@ > @@ -54,7 +54,7 @@ class="p-1" :class="typeof value == 'object' ? 'bg-gray-200' : ''" title="Visual Builder" - @click="queryMode = 'builder'" + @click="changeMode('builder')" > @@ -62,7 +62,7 @@ class="p-1" :class="typeof value == 'string' ? 'bg-gray-200' : ''" title="SQL Editor" - @click="queryMode = 'editor'" + @click="changeMode('editor')" > @@ -116,21 +116,9 @@ export default defineComponent({ }, emits: ["update:model-value", "query:run", "query:save", "results:export", "results:clear"], watch: { - queryMode() { - if (this.queryMode == "builder") { - this.value = { - select: "*", - table: "", - where: [], - join: [], - orderBy: [], - }; - } else { - this.value = ""; - } - this.activeQueryId = undefined; - }, activeQueryId() { + if (this.activeQueryId == undefined) return; + let query = this.queries.find((t) => t.id == this.activeQueryId)?.query; if (query != undefined) { if (typeof query == "string") { @@ -188,6 +176,22 @@ export default defineComponent({ showStructure() { this.openModal(markRaw(defineAsyncComponent(() => import("@/components/queryBuilder/StructureModal.vue")))); }, + changeMode(mode: "editor" | "builder") { + this.queryMode = mode; + + this.activeQueryId = undefined; + if (this.queryMode == "builder") { + this.value = { + select: "*", + table: "", + where: [], + join: [], + orderBy: [], + }; + } else { + this.value = ""; + } + }, }, }); From 517527258a5d22bd2f3691c739080226489556a9 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Mon, 7 Apr 2025 15:34:46 +0200 Subject: [PATCH 07/10] 1.3.5 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ffc5179..51951fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ff-admin", - "version": "1.3.4", + "version": "1.3.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ff-admin", - "version": "1.3.4", + "version": "1.3.5", "license": "AGPL-3.0-only", "dependencies": { "@fullcalendar/core": "^6.1.15", diff --git a/package.json b/package.json index 7d2603d..11d9293 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ff-admin", - "version": "1.3.4", + "version": "1.3.5", "description": "Feuerwehr/Verein Mitgliederverwaltung UI", "type": "module", "scripts": { From fdbf9e7f0a4cb5895032e6da393ace4948057f16 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Thu, 10 Apr 2025 08:29:13 +0200 Subject: [PATCH 08/10] enhance: show newsletter recipients --- .../NewsletterMailRecipientsModal.vue | 67 +++++++++++++++++++ .../NewsletterPrintingRecipientsModal.vue | 67 +++++++++++++++++++ .../club/newsletter/newsletterPrintout.ts | 8 +++ 3 files changed, 142 insertions(+) create mode 100644 src/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue create mode 100644 src/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue diff --git a/src/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue b/src/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue new file mode 100644 index 0000000..d51435a --- /dev/null +++ b/src/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue b/src/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue new file mode 100644 index 0000000..079d42c --- /dev/null +++ b/src/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/stores/admin/club/newsletter/newsletterPrintout.ts b/src/stores/admin/club/newsletter/newsletterPrintout.ts index 945ac24..0c7b17a 100644 --- a/src/stores/admin/club/newsletter/newsletterPrintout.ts +++ b/src/stores/admin/club/newsletter/newsletterPrintout.ts @@ -45,6 +45,14 @@ export const useNewsletterPrintoutStore = defineStore("newsletterPrintout", { responseType: "blob", }); }, + fetchNewsletterPrintReceivers(): Promise> { + const newsletterId = useNewsletterStore().activeNewsletter; + return http.get(`/admin/newsletter/${newsletterId}/printrecipients`); + }, + fetchNewsletterMailReceivers(): Promise> { + const newsletterId = useNewsletterStore().activeNewsletter; + return http.get(`/admin/newsletter/${newsletterId}/mailrecipients`); + }, createNewsletterMailPreview() { this.sendingPreview = "loading"; const newsletterId = useNewsletterStore().activeNewsletter; From 7aa0db3684b90689fecd1b9d3370d7f3777ac6f0 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Thu, 10 Apr 2025 08:29:25 +0200 Subject: [PATCH 09/10] enhance: prevent accidental newsletter job start --- .../NewsletterMailProgressModal.vue | 2 +- .../NewsletterPrintingProgressModal.vue | 2 +- .../club/newsletter/newsletterPrintout.ts | 4 ++-- .../club/newsletter/NewsletterPrintout.vue | 20 +++++++++++++++---- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/components/admin/club/newsletter/NewsletterMailProgressModal.vue b/src/components/admin/club/newsletter/NewsletterMailProgressModal.vue index 27f1690..9f5250a 100644 --- a/src/components/admin/club/newsletter/NewsletterMailProgressModal.vue +++ b/src/components/admin/club/newsletter/NewsletterMailProgressModal.vue @@ -19,7 +19,7 @@
- +
diff --git a/src/components/admin/club/newsletter/NewsletterPrintingProgressModal.vue b/src/components/admin/club/newsletter/NewsletterPrintingProgressModal.vue index 416c1e1..8e0b57f 100644 --- a/src/components/admin/club/newsletter/NewsletterPrintingProgressModal.vue +++ b/src/components/admin/club/newsletter/NewsletterPrintingProgressModal.vue @@ -19,7 +19,7 @@
- +
diff --git a/src/stores/admin/club/newsletter/newsletterPrintout.ts b/src/stores/admin/club/newsletter/newsletterPrintout.ts index 0c7b17a..97bc4f3 100644 --- a/src/stores/admin/club/newsletter/newsletterPrintout.ts +++ b/src/stores/admin/club/newsletter/newsletterPrintout.ts @@ -124,7 +124,7 @@ export const useNewsletterPrintoutStore = defineStore("newsletterPrintout", { chunk.split("//").forEach((r) => { if (r.trim() != "") { let data = JSON.parse(r); - this.pdfSourceMessages.push(data); + this.pdfSourceMessages.unshift(data); let type: NotificationType = "info"; let timeout = undefined; if (data.factor == "failed") { @@ -146,7 +146,7 @@ export const useNewsletterPrintoutStore = defineStore("newsletterPrintout", { chunk.split("//").forEach((r) => { if (r.trim() != "") { let data = JSON.parse(r); - this.mailSourceMessages.push(data); + this.mailSourceMessages.unshift(data); let type: NotificationType = "info"; let timeout = undefined; if (data.factor == "failed") { diff --git a/src/views/admin/club/newsletter/NewsletterPrintout.vue b/src/views/admin/club/newsletter/NewsletterPrintout.vue index 0580400..3fd49ef 100644 --- a/src/views/admin/club/newsletter/NewsletterPrintout.vue +++ b/src/views/admin/club/newsletter/NewsletterPrintout.vue @@ -27,7 +27,7 @@ primary class="!w-fit whitespace-nowrap flex flex-row gap-2" :disabled="printing != undefined" - @click="createNewsletterPrintout" + @click="openPdfCommit" > Newsletter drucken @@ -39,7 +39,7 @@ primary class="!w-fit whitespace-nowrap flex flex-row gap-2" :disabled="sending != undefined" - @click="createNewsletterSend" + @click="openMailCommit" > Mails versenden @@ -108,10 +108,8 @@ export default defineComponent({ ...mapActions(useModalStore, ["openModal"]), ...mapActions(useNewsletterPrintoutStore, [ "fetchNewsletterPrintout", - "createNewsletterPrintout", "fetchNewsletterPrintoutById", "createNewsletterMailPreview", - "createNewsletterSend", ]), openPdfShow(filename?: string) { this.openModal( @@ -132,6 +130,20 @@ export default defineComponent({ }) .catch(() => {}); }, + openPdfCommit() { + this.openModal( + markRaw( + defineAsyncComponent(() => import("@/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue")) + ) + ); + }, + openMailCommit() { + this.openModal( + markRaw( + defineAsyncComponent(() => import("@/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue")) + ) + ); + }, openPdfLogs() { this.openModal( markRaw( From 552b6f643865959d4fa3dc4078ca5ebf68ace77a Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Thu, 10 Apr 2025 11:01:29 +0200 Subject: [PATCH 10/10] enhance: count of receivers in modal --- .../admin/club/newsletter/NewsletterMailRecipientsModal.vue | 3 ++- .../club/newsletter/NewsletterPrintingRecipientsModal.vue | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue b/src/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue index d51435a..fbc1ed3 100644 --- a/src/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue +++ b/src/components/admin/club/newsletter/NewsletterMailRecipientsModal.vue @@ -5,6 +5,8 @@
+

keine Empfänger gefunden

+

{{ receivers.length }} Empfänger gefunden

{{ rec.lastname }}, {{ rec.firstname }}

-

keine Empfänger gefunden

diff --git a/src/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue b/src/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue index 079d42c..444ea27 100644 --- a/src/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue +++ b/src/components/admin/club/newsletter/NewsletterPrintingRecipientsModal.vue @@ -5,6 +5,8 @@

+

keine Empfänger gefunden

+

{{ receivers.length }} Empfänger gefunden

{{ rec.lastname }}, {{ rec.firstname }}

-

keine Empfänger gefunden