From 00576fd5497a79a166f41f263f1c968bcf32b357 Mon Sep 17 00:00:00 2001 From: firu11 Date: Tue, 23 Jun 2026 12:57:24 +0200 Subject: [PATCH 01/24] read-only --- src/assets/locales/cs.json | 3 +- src/assets/locales/en.json | 3 +- src/components/modals/CalendarModal.vue | 65 +++++++++++++++---------- src/types/core.ts | 7 +-- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/src/assets/locales/cs.json b/src/assets/locales/cs.json index f202942..f8b28d9 100644 --- a/src/assets/locales/cs.json +++ b/src/assets/locales/cs.json @@ -41,7 +41,8 @@ "username": "Uživatelské jméno", "password": "Heslo/Token", "encrypted": "Šifrování", - "decryptionKey": "Šifrovací heslo" + "encryptionKey": "Šifrovací heslo", + "readonly": "Pouze čtení" }, "views": { "4days": "4 dny", diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index d2350c1..55a3960 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -41,7 +41,8 @@ "username": "Username", "password": "Password/Token", "encrypted": "Encrypted", - "decryptionKey": "Encryption key/password" + "encryptionKey": "Encryption key/password", + "readonly": "Read-only" }, "views": { "4days": "4 days", diff --git a/src/components/modals/CalendarModal.vue b/src/components/modals/CalendarModal.vue index 7f62f57..a82938c 100644 --- a/src/components/modals/CalendarModal.vue +++ b/src/components/modals/CalendarModal.vue @@ -22,11 +22,12 @@ const howOptions = ['Init', 'Clone']; const form = reactive({ how: 'Init', name: '', - url: '', + remoteURL: '', username: '', password: '', encrypted: false, - decryptionKey: '', + encryptionKey: '', + readonly: false, }); const errors = reactive({ missingName: false, @@ -58,11 +59,12 @@ function updateFormFromCalendar(calendar: Calendar) { form.how = ''; form.name = calendar.name ?? ''; form.encrypted = calendar.encrypted; - form.decryptionKey = ''; // secret + form.encryptionKey = ''; // secret + form.readonly = calendar.readonly; if (calendar.remoteUrl) { const remoteUrl = authFromUrl(calendar.remoteUrl); - form.url = remoteUrl.url; + form.remoteURL = remoteUrl.url; form.username = remoteUrl.username; form.password = remoteUrl.password; } @@ -94,20 +96,25 @@ async function saveCalendar(e: Event) { } async function createCalendar() { - console.log('creating calendar', form.name, form.url); + console.log('creating calendar', form.name, form.remoteURL); switch (form.how) { case 'Init': - const name = form.name.trim(); - await CalendarCore.createCalendar(name, form.encrypted ? form.decryptionKey : ''); - if (form.url !== '') - await CalendarCore.updateRemote(name, urlWithAuth(form.url.trim(), form.username, form.password)); + await CalendarCore.createCalendar(form.name.trim(), form.encrypted ? form.encryptionKey : ''); + if (form.remoteURL !== '') { + await CalendarCore.updateRemote( + form.name.trim(), + urlWithAuth(form.remoteURL.trim(), form.username, form.password), + form.readonly, + ); + } break; case 'Clone': await CalendarCore.cloneCalendar( - urlWithAuth(form.url.trim(), form.username, form.password), - form.encrypted ? form.decryptionKey : '', + urlWithAuth(form.remoteURL.trim(), form.username, form.password), + form.encrypted ? form.encryptionKey : '', + form.readonly, ); break; } @@ -127,11 +134,11 @@ async function updateCalendar() { calendarName = form.name; } - const rawUrl = form.url.trim(); + const rawUrl = form.remoteURL.trim(); if (rawUrl !== '') { const newRemoteUrl = urlWithAuth(rawUrl, form.username, form.password); - if (calendar.remoteUrl !== newRemoteUrl) { - await CalendarCore.updateRemote(calendarName, newRemoteUrl); + if (calendar.remoteUrl !== newRemoteUrl || originalCalendar.value?.readonly !== form.readonly) { + await CalendarCore.updateRemote(calendarName, newRemoteUrl, form.readonly); await syncAllWrapper(); // merge/pull or whatever } } @@ -172,19 +179,19 @@ function validate(): boolean { return false; } - form.url = form.url.trim(); - if (needsURL && form.url === '') { + form.remoteURL = form.remoteURL.trim(); + if (needsURL && form.remoteURL === '') { errors.badURL = true; return false; } - if (form.url !== '') { - if (!isValidUrl(form.url)) { + if (form.remoteURL !== '') { + if (!isValidUrl(form.remoteURL)) { errors.badURL = true; return false; } - if (!form.url.endsWith('.git')) { + if (!form.remoteURL.endsWith('.git')) { errors.badURL = true; alert(t('message.errorRemoteUrlEndDotGit')); return false; @@ -206,11 +213,12 @@ function isValidUrl(value: string): boolean { function resetForm() { form.how = howOptions[0]; form.name = ''; - form.url = ''; + form.remoteURL = ''; form.username = ''; form.password = ''; form.encrypted = false; - form.decryptionKey = ''; + form.encryptionKey = ''; + form.readonly = false; resetErrors(); } @@ -289,7 +297,7 @@ onMounted(() => { name="url" :placeholder="`Remote URL ${form.how == 'Init' ? '(' + $t('optionalText') + ')' : ''}`" autocomplete="none" - v-model="form.url" + v-model="form.remoteURL" :class="{ red: errors.badURL }" @input="errors.badURL = false" /> @@ -314,20 +322,25 @@ onMounted(() => { + +
diff --git a/src/types/core.ts b/src/types/core.ts index 8c63ec9..0f1df6c 100644 --- a/src/types/core.ts +++ b/src/types/core.ts @@ -25,12 +25,12 @@ export interface Repetition { // The response types are all made async (Promise) using Asyncify type. export interface CalendarApi { createCalendar(name: string, password: string): void; - cloneCalendar(url: string, password: string): void; + cloneCalendar(url: string, password: string, readonly: boolean): void; removeCalendar(name: string): void; renameCalendar(oldName: string, newName: string): void; listCalendars(): Calendar[]; loadCalendars(): void; - updateRemote(calendar: string, remoteUrl: string): void; + updateRemote(calendar: string, remoteUrl: string, readonly: boolean): void; createEvent(event: CalendarEvent): CalendarEvent; updateEvent(event: CalendarEvent): CalendarEvent; @@ -62,8 +62,9 @@ export enum UpdateStrategy { export interface Calendar { name: string; tags: Tag[]; - encrypted: boolean; remoteUrl: string; + encrypted: boolean; + readonly: boolean; } export interface Tag { From 4e4179633ca0187e1333eae1e1c7ea1859732362 Mon Sep 17 00:00:00 2001 From: firu11 Date: Wed, 24 Jun 2026 17:26:29 +0200 Subject: [PATCH 02/24] tag edit --- src/components/modals/EventModal.vue | 71 +++++++++++++++------------- src/views/CalendarView.vue | 4 +- 2 files changed, 41 insertions(+), 34 deletions(-) diff --git a/src/components/modals/EventModal.vue b/src/components/modals/EventModal.vue index 0b16ec0..929acb7 100644 --- a/src/components/modals/EventModal.vue +++ b/src/components/modals/EventModal.vue @@ -1,6 +1,6 @@