From 39b56d8bd0d88fa62490ddbdee6c2c8e8ab870f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn-Michael=20Miehe?= Date: Sun, 7 Dec 2025 03:28:00 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20wip=20on=20ui:=20rework=20for=20?= =?UTF-8?q?vue=203=20composition=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/App.vue | 4 +- ui/src/components/AdminButton.vue | 17 ++++--- ui/src/components/Calendar.vue | 8 +-- ui/src/components/CountDown.vue | 49 +++++++++---------- ui/src/components/LoginModal.vue | 1 - ui/src/components/UserView.vue | 4 +- ui/src/components/admin/CalendarAssistant.vue | 13 ++--- ui/src/components/admin/ConfigView.vue | 21 ++++---- ui/src/components/admin/DoorMapEditor.vue | 35 +++++++------ ui/src/components/bulma/Breadcrumbs.vue | 7 ++- ui/src/components/bulma/Toast.vue | 8 +-- ui/src/components/calendar/CalendarDoor.vue | 6 +-- ui/src/components/calendar/SVGRect.vue | 4 +- ui/src/components/editor/DoorCanvas.vue | 37 +++++++------- ui/src/components/editor/PreviewDoor.vue | 8 +-- ui/src/lib/helpers.ts | 5 -- ui/src/lib/rects/door.ts | 3 ++ ui/src/lib/rects/rectangle.ts | 3 ++ 18 files changed, 118 insertions(+), 115 deletions(-) diff --git a/ui/src/App.vue b/ui/src/App.vue index 75419b3..629d510 100644 --- a/ui/src/App.vue +++ b/ui/src/App.vue @@ -33,10 +33,10 @@
- +
- +
diff --git a/ui/src/components/AdminButton.vue b/ui/src/components/AdminButton.vue index e98f4bd..68a97d7 100644 --- a/ui/src/components/AdminButton.vue +++ b/ui/src/components/AdminButton.vue @@ -14,12 +14,13 @@ import { APIError } from "@/lib/api_error"; import { Credentials } from "@/lib/model"; import { advent22Store } from "@/lib/store"; +import { ref } from "vue"; import BulmaButton from "./bulma/Button.vue"; import LoginModal from "./LoginModal.vue"; -let modal_visible = false; -let is_busy = false; +const modal_visible = ref(false); +const is_busy = ref(false); const store = advent22Store(); function on_click() { @@ -27,22 +28,22 @@ function on_click() { store.logout(); } else { // show login modal - is_busy = true; - modal_visible = true; + is_busy.value = true; + modal_visible.value = true; } } function on_submit(creds: Credentials) { - modal_visible = false; + modal_visible.value = false; store .login(creds) .catch((error) => APIError.alert(error)) - .finally(() => (is_busy = false)); + .finally(() => (is_busy.value = false)); } function on_cancel() { - modal_visible = false; - is_busy = false; + modal_visible.value = false; + is_busy.value = false; } diff --git a/ui/src/components/Calendar.vue b/ui/src/components/Calendar.vue index ab9e913..c5e93af 100644 --- a/ui/src/components/Calendar.vue +++ b/ui/src/components/Calendar.vue @@ -51,7 +51,7 @@ import { API } from "@/lib/api"; import { APIError } from "@/lib/api_error"; import { ensure_loaded, name_door } from "@/lib/helpers"; import { ImageData } from "@/lib/model"; -import { Door } from "@/lib/rects/door"; +import { VueDoor } from "@/lib/rects/door"; import { advent22Store } from "@/lib/store"; import { onBeforeUnmount } from "vue"; @@ -62,7 +62,7 @@ import CalendarDoor from "./calendar/CalendarDoor.vue"; import ThouCanvas from "./calendar/ThouCanvas.vue"; defineProps<{ - doors: Door[]; + doors: VueDoor[]; }>(); const store = advent22Store(); @@ -81,7 +81,7 @@ function on_toast_handle(handle: HBulmaToast) { if (store.is_touch_device) return; store.when_initialized(() => { - toast_timeout = setTimeout(() => { + toast_timeout = window.setTimeout(() => { if (store.user_doors.length === 0) return; if (store.is_touch_device) return; @@ -91,7 +91,7 @@ function on_toast_handle(handle: HBulmaToast) { } async function door_click(day: number) { - if (toast_timeout !== undefined) clearTimeout(toast_timeout); + window.clearTimeout(toast_timeout); toast?.hide(); if (modal === undefined) return; diff --git a/ui/src/components/CountDown.vue b/ui/src/components/CountDown.vue index 34ef699..e4503e9 100644 --- a/ui/src/components/CountDown.vue +++ b/ui/src/components/CountDown.vue @@ -4,46 +4,45 @@ diff --git a/ui/src/components/LoginModal.vue b/ui/src/components/LoginModal.vue index 044b1e7..f6bc73a 100644 --- a/ui/src/components/LoginModal.vue +++ b/ui/src/components/LoginModal.vue @@ -52,7 +52,6 @@ import { Credentials } from "@/lib/model"; import { nextTick, onBeforeUnmount, onMounted, ref, useTemplateRef } from "vue"; import BulmaButton from "./bulma/Button.vue"; -defineProps<{ visible: boolean }>(); const username_input = useTemplateRef("username_input"); const emit = defineEmits<{ diff --git a/ui/src/components/UserView.vue b/ui/src/components/UserView.vue index 4f5b867..fe931b8 100644 --- a/ui/src/components/UserView.vue +++ b/ui/src/components/UserView.vue @@ -1,5 +1,5 @@ diff --git a/ui/src/components/admin/CalendarAssistant.vue b/ui/src/components/admin/CalendarAssistant.vue index aa16652..9e23f09 100644 --- a/ui/src/components/admin/CalendarAssistant.vue +++ b/ui/src/components/admin/CalendarAssistant.vue @@ -49,17 +49,18 @@ import { API } from "@/lib/api"; import { name_door, objForEach } from "@/lib/helpers"; import { ImageData, NumStrDict } from "@/lib/model"; +import { ref } from "vue"; import MultiModal, { HMultiModal } from "../MultiModal.vue"; import BulmaButton from "../bulma/Button.vue"; import BulmaDrawer from "../bulma/Drawer.vue"; -const day_data: { +const day_data = ref<{ [day: number]: { part: string; image_name: string; }; -} = {}; +}>({}); let modal: HMultiModal | undefined; @@ -74,19 +75,19 @@ function on_open(ready: () => void, fail: () => void) { ]) .then(([day_parts, day_image_names]) => { const _ensure_day_in_data = (day: number) => { - if (!(day in day_data)) { - day_data[day] = { part: "", image_name: "" }; + if (!(day in day_data.value)) { + day_data.value[day] = { part: "", image_name: "" }; } }; objForEach(day_parts, (day, part) => { _ensure_day_in_data(day); - day_data[day].part = part; + day_data.value[day].part = part; }); objForEach(day_image_names, (day, image_name) => { _ensure_day_in_data(day); - day_data[day].image_name = image_name; + day_data.value[day].image_name = image_name; }); ready(); diff --git a/ui/src/components/admin/ConfigView.vue b/ui/src/components/admin/ConfigView.vue index 50f91c3..9f32ad0 100644 --- a/ui/src/components/admin/ConfigView.vue +++ b/ui/src/components/admin/ConfigView.vue @@ -188,6 +188,7 @@ import { API } from "@/lib/api"; import { AdminConfigModel, Credentials, DoorSaved } from "@/lib/model"; import { advent22Store } from "@/lib/store"; import { DateTime } from "luxon"; +import { ref } from "vue"; import BulmaDrawer from "../bulma/Drawer.vue"; import BulmaSecret from "../bulma/Secret.vue"; @@ -195,7 +196,7 @@ import CountDown from "../CountDown.vue"; const store = advent22Store(); -let admin_config_model: AdminConfigModel = { +const admin_config_model = ref({ solution: { value: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", whitespace: "KEEP", @@ -233,14 +234,14 @@ let admin_config_model: AdminConfigModel = { cache_ttl: 0, config_file: "sed diam nonumy", }, -}; +}); -let doors: DoorSaved[] = []; -let dav_credentials: Credentials = ["", ""]; -let ui_credentials: Credentials = ["", ""]; +const doors = ref([]); +const dav_credentials = ref(["", ""]); +const ui_credentials = ref(["", ""]); function fmt_puzzle_date(name: keyof AdminConfigModel["puzzle"]): string { - const iso_date = admin_config_model.puzzle[name]; + const iso_date = admin_config_model.value.puzzle[name]; if (!(typeof iso_date === "string")) return "-"; return DateTime.fromISO(iso_date).toLocaleString(DateTime.DATE_SHORT); @@ -255,8 +256,8 @@ function on_open(ready: () => void, fail: () => void): void { .then(([store_update, new_admin_config_model, new_doors]) => { store_update; // discard value - admin_config_model = new_admin_config_model; - doors = new_doors; + admin_config_model.value = new_admin_config_model; + doors.value = new_doors; ready(); }) @@ -265,13 +266,13 @@ function on_open(ready: () => void, fail: () => void): void { function load_dav_credentials(): void { API.request("admin/dav_credentials") - .then((creds) => (dav_credentials = creds)) + .then((creds) => (dav_credentials.value = creds)) .catch(() => {}); } function load_ui_credentials(): void { API.request("admin/ui_credentials") - .then((creds) => (ui_credentials = creds)) + .then((creds) => (ui_credentials.value = creds)) .catch(() => {}); } diff --git a/ui/src/components/admin/DoorMapEditor.vue b/ui/src/components/admin/DoorMapEditor.vue index 799fce5..df071ca 100644 --- a/ui/src/components/admin/DoorMapEditor.vue +++ b/ui/src/components/admin/DoorMapEditor.vue @@ -37,10 +37,10 @@ - - + +
- +