1 Commits

Author SHA1 Message Date
Sebastian 3cd3146190 chore(deps): update dependency vite to v8.2.0
JS Unit Tests / test (pull_request) Successful in 1m9s
Build Test / test (pull_request) Successful in 1m13s
2026-08-04 03:05:34 +00:00
10 changed files with 169 additions and 279 deletions
+75 -75
View File
@@ -438,9 +438,9 @@
"license": "MIT"
},
"node_modules/@oxc-project/types": {
"version": "0.143.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz",
"integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==",
"version": "0.142.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz",
"integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==",
"devOptional": true,
"license": "MIT",
"funding": {
@@ -459,9 +459,9 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz",
"integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.2.tgz",
"integrity": "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==",
"cpu": [
"arm64"
],
@@ -475,9 +475,9 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz",
"integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.2.tgz",
"integrity": "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==",
"cpu": [
"arm64"
],
@@ -491,9 +491,9 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz",
"integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.2.tgz",
"integrity": "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==",
"cpu": [
"x64"
],
@@ -507,9 +507,9 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz",
"integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.2.tgz",
"integrity": "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==",
"cpu": [
"x64"
],
@@ -523,9 +523,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz",
"integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.2.tgz",
"integrity": "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==",
"cpu": [
"arm"
],
@@ -539,9 +539,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz",
"integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.2.tgz",
"integrity": "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==",
"cpu": [
"arm64"
],
@@ -555,9 +555,9 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz",
"integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.2.tgz",
"integrity": "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==",
"cpu": [
"arm64"
],
@@ -571,9 +571,9 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz",
"integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.2.tgz",
"integrity": "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==",
"cpu": [
"ppc64"
],
@@ -587,9 +587,9 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz",
"integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.2.tgz",
"integrity": "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==",
"cpu": [
"s390x"
],
@@ -603,9 +603,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz",
"integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.2.tgz",
"integrity": "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==",
"cpu": [
"x64"
],
@@ -619,9 +619,9 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz",
"integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.2.tgz",
"integrity": "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==",
"cpu": [
"x64"
],
@@ -635,9 +635,9 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz",
"integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.2.tgz",
"integrity": "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==",
"cpu": [
"arm64"
],
@@ -651,9 +651,9 @@
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz",
"integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.2.tgz",
"integrity": "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==",
"cpu": [
"arm64"
],
@@ -667,9 +667,9 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz",
"integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.2.tgz",
"integrity": "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==",
"cpu": [
"x64"
],
@@ -2201,9 +2201,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.18",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
"integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
"version": "3.3.16",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
"integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
"funding": [
{
"type": "github",
@@ -2395,9 +2395,9 @@
}
},
"node_modules/postcss": {
"version": "8.5.26",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
"integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
"version": "8.5.25",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz",
"integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==",
"funding": [
{
"type": "opencollective",
@@ -2414,7 +2414,7 @@
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.17",
"nanoid": "^3.3.16",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -2479,13 +2479,13 @@
}
},
"node_modules/rolldown": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz",
"integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.2.tgz",
"integrity": "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==",
"devOptional": true,
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.143.0",
"@oxc-project/types": "=0.142.0",
"@rolldown/pluginutils": "^1.0.0"
},
"bin": {
@@ -2495,20 +2495,20 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.2.3",
"@rolldown/binding-darwin-arm64": "1.2.3",
"@rolldown/binding-darwin-x64": "1.2.3",
"@rolldown/binding-freebsd-x64": "1.2.3",
"@rolldown/binding-linux-arm-gnueabihf": "1.2.3",
"@rolldown/binding-linux-arm64-gnu": "1.2.3",
"@rolldown/binding-linux-arm64-musl": "1.2.3",
"@rolldown/binding-linux-ppc64-gnu": "1.2.3",
"@rolldown/binding-linux-s390x-gnu": "1.2.3",
"@rolldown/binding-linux-x64-gnu": "1.2.3",
"@rolldown/binding-linux-x64-musl": "1.2.3",
"@rolldown/binding-openharmony-arm64": "1.2.3",
"@rolldown/binding-win32-arm64-msvc": "1.2.3",
"@rolldown/binding-win32-x64-msvc": "1.2.3"
"@rolldown/binding-android-arm64": "1.2.2",
"@rolldown/binding-darwin-arm64": "1.2.2",
"@rolldown/binding-darwin-x64": "1.2.2",
"@rolldown/binding-freebsd-x64": "1.2.2",
"@rolldown/binding-linux-arm-gnueabihf": "1.2.2",
"@rolldown/binding-linux-arm64-gnu": "1.2.2",
"@rolldown/binding-linux-arm64-musl": "1.2.2",
"@rolldown/binding-linux-ppc64-gnu": "1.2.2",
"@rolldown/binding-linux-s390x-gnu": "1.2.2",
"@rolldown/binding-linux-x64-gnu": "1.2.2",
"@rolldown/binding-linux-x64-musl": "1.2.2",
"@rolldown/binding-openharmony-arm64": "1.2.2",
"@rolldown/binding-win32-arm64-msvc": "1.2.2",
"@rolldown/binding-win32-x64-msvc": "1.2.2"
}
},
"node_modules/saxes": {
@@ -2923,16 +2923,16 @@
}
},
"node_modules/vite": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz",
"integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==",
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz",
"integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.33.0",
"picomatch": "^4.0.5",
"postcss": "^8.5.25",
"rolldown": "~1.2.1",
"postcss": "^8.5.23",
"rolldown": "~1.2.0",
"tinyglobby": "^0.2.17"
},
"bin": {
+11 -25
View File
@@ -148,8 +148,8 @@ watch(
</script>
<template>
<v-sheet class="text-start overflow-auto" color="surface" min-height="84vh" max-height="84vh">
<v-sheet class="event-editor-header d-flex justify-space-between pa-4" color="surface">
<v-sheet class="pa-2 text-start overflow-auto" min-height="84vh" max-height="84vh">
<div class="event-editor-header d-flex justify-space-between pa-4">
<div>
<v-icon :icon="entityIcon" class="mr-2" />
{{ entityObject?.label || 'Nothing Selected' }}
@@ -180,7 +180,7 @@ watch(
@click="$emit('close')"
/>
</div>
</v-sheet>
</div>
<div class="event-editor-fields">
<v-divider />
@@ -215,12 +215,6 @@ watch(
@update:description="entityObject!.description = $event"
/>
<EventEditorTags
:mode="mode"
:tags="entityObject!.tags"
@update:tags="entityObject!.tags = $event"
/>
<EventEditorDates
:mode="mode"
:starts-on="entityObject!.startsOn"
@@ -266,6 +260,12 @@ watch(
@remove-notification="removeNotification"
/>
<EventEditorTags
:mode="mode"
:tags="entityObject!.tags"
@update:tags="entityObject!.tags = $event"
/>
<!-- Metadata for view mode -->
<div v-if="mode === 'view' && entityObject!.created" class="event-editor-section">
<v-divider class="mb-4"></v-divider>
@@ -285,7 +285,7 @@ watch(
<v-divider/>
</div>
<v-sheet class="event-editor-footer d-flex text-end justify-space-between pa-4" color="surface">
<div class="event-editor-footer d-flex text-end justify-space-between pa-4">
<v-btn v-if="mode === 'edit'"
variant="text"
@click="cancelEdit"
@@ -301,7 +301,7 @@ watch(
:loading="saving">
Save
</v-btn>
</v-sheet>
</div>
</v-sheet>
</template>
@@ -309,18 +309,4 @@ watch(
.event-editor-section {
margin-bottom: 1.5rem;
}
.event-editor-header,
.event-editor-footer {
position: sticky;
z-index: 2;
}
.event-editor-header {
top: 0;
}
.event-editor-footer {
bottom: 0;
}
</style>
@@ -1,96 +0,0 @@
<script setup lang="ts">
import { ref, watch } from 'vue'
import { formatDisplayDate, formatDisplayTime, formatLocalIsoDate, formatLocalIsoTime } from '@/utils/format'
interface Props {
modelValue?: string | null
}
const props = defineProps<Props>()
const emit = defineEmits<{
'update:modelValue': [value: string | null]
}>()
const dateValue = ref('')
const timeValue = ref('')
const dateMenu = ref(false)
const timeMenu = ref(false)
watch(() => props.modelValue, (value) => {
const date = value ? new Date(value) : new Date()
dateValue.value = formatLocalIsoDate(date)
timeValue.value = formatLocalIsoTime(date)
}, { immediate: true })
const emitValue = () => {
if (!dateValue.value || !timeValue.value) return
emit('update:modelValue', new Date(`${dateValue.value}T${timeValue.value}`).toISOString())
}
const pickerDate = (value: string): Date | null => value ? new Date(`${value}T00:00:00`) : null
const normalizePickerDate = (value: unknown): string => {
const selected = Array.isArray(value) ? value[0] : value
const date = selected instanceof Date ? selected : new Date(String(selected))
return Number.isNaN(date.getTime()) ? '' : formatLocalIsoDate(date)
}
const selectDate = (value: unknown) => {
const date = normalizePickerDate(value)
if (date) dateValue.value = date
dateMenu.value = false
emitValue()
}
watch(timeValue, () => emitValue())
</script>
<template>
<v-row dense>
<v-col cols="6">
<v-menu v-model="dateMenu" :close-on-content-click="false" location="bottom start">
<template #activator="{ props: activatorProps }">
<v-text-field
v-bind="activatorProps"
:model-value="formatDisplayDate(dateValue)"
label="Date"
prepend-inner-icon="mdi-calendar"
variant="outlined"
density="compact"
hide-details
readonly
/>
</template>
<v-date-picker
:model-value="pickerDate(dateValue)"
color="primary"
show-adjacent-months
@update:model-value="selectDate"
/>
</v-menu>
</v-col>
<v-col cols="6">
<v-menu v-model="timeMenu" :close-on-content-click="false" location="bottom start">
<template #activator="{ props: activatorProps }">
<v-text-field
v-bind="activatorProps"
:model-value="formatDisplayTime(timeValue)"
label="Time"
prepend-inner-icon="mdi-clock-outline"
variant="outlined"
density="compact"
hide-details
readonly
/>
</template>
<v-card>
<v-time-picker v-model="timeValue" color="primary" format="ampm" />
<v-card-actions class="justify-end">
<v-btn variant="text" @click="timeMenu = false">Done</v-btn>
</v-card-actions>
</v-card>
</v-menu>
</v-col>
</v-row>
</template>
@@ -137,6 +137,8 @@ watch([startDate, startTime, endDate, endTime, timelessValue], () => {
<template>
<div class="event-editor-section">
<div class="text-subtitle-1 mb-2">Date & Time</div>
<!-- Read-only view -->
<div v-if="mode === 'view'">
<div class="mb-2 pa-2">
@@ -162,6 +164,7 @@ watch([startDate, startTime, endDate, endTime, timelessValue], () => {
/>
<div class="mb-3">
<div class="text-subtitle-2 mb-2">Start</div>
<v-row dense>
<v-col cols="12" md="6">
<v-menu v-model="startDateMenu" :close-on-content-click="false" location="bottom start">
@@ -209,6 +212,7 @@ watch([startDate, startTime, endDate, endTime, timelessValue], () => {
</div>
<div class="mb-3">
<div class="text-subtitle-2 mb-2">End</div>
<v-row dense>
<v-col cols="12" md="6">
<v-menu v-model="endDateMenu" :close-on-content-click="false" location="bottom start">
@@ -20,6 +20,7 @@ const descriptionValue = computed({
<template>
<div v-if="descriptionValue || mode === 'edit'" class="event-editor-section">
<div class="text-subtitle-1 mb-2">Description</div>
<!-- Read-only view -->
<div v-if="mode === 'view'" class="mb-4">
<div class="mb-2 pa-2 white-space-pre-wrap">{{ descriptionValue || 'No description' }}</div>
@@ -20,6 +20,7 @@ const labelValue = computed({
<template>
<div class="event-editor-section">
<div class="text-subtitle-1 mb-2">Title</div>
<!-- Read-only view -->
<div v-if="mode === 'view'" class="mb-4">
<div class="mb-2 pa-2">{{ labelValue || 'Untitled Event' }}</div>
@@ -27,7 +27,7 @@ const hasLocations = () => {
<!-- Physical Locations -->
<div v-if="Object.keys(locationsPhysical || {}).length > 0 || mode === 'edit'" class="mb-4">
<div class="d-flex align-center justify-space-between mb-2">
<div class="text-subtitle-2">Physical</div>
<div class="text-subtitle-2">Physical Locations</div>
<v-btn v-if="mode === 'edit'"
size="small"
variant="outlined"
@@ -49,7 +49,8 @@ const hasLocations = () => {
<!-- Edit view -->
<div v-else>
<div v-for="(location, key) in locationsPhysical" :key="key" class="mb-3 pa-3 border rounded">
<div class="d-flex justify-end mb-2">
<div class="d-flex align-center justify-space-between mb-2">
<strong>{{ location.label || 'Physical Location' }}</strong>
<v-btn
icon="mdi-delete"
size="small"
@@ -101,7 +102,7 @@ const hasLocations = () => {
<!-- Virtual Locations -->
<div v-if="Object.keys(locationsVirtual || {}).length > 0 || mode === 'edit'">
<div class="d-flex align-center justify-space-between mb-2">
<div class="text-subtitle-2">Virtual</div>
<div class="text-subtitle-2">Virtual Locations</div>
<v-btn v-if="mode === 'edit'"
size="small"
variant="outlined"
@@ -125,7 +126,8 @@ const hasLocations = () => {
<!-- Edit view -->
<div v-else>
<div v-for="(location, key) in locationsVirtual" :key="key" class="mb-3 pa-3 border rounded">
<div class="d-flex justify-end mb-2">
<div class="d-flex align-center justify-space-between mb-2">
<strong>{{ location.label || 'Virtual Location' }}</strong>
<v-btn
icon="mdi-delete"
size="small"
@@ -1,6 +1,4 @@
<script setup lang="ts">
import EventEditorDateTimeField from './EventEditorDateTimeField.vue'
interface Props {
mode: 'edit' | 'view'
notifications: Record<string, any>
@@ -15,12 +13,14 @@ const emit = defineEmits<{
const typeOptions = [
{ title: 'Email', value: 'email' },
{ title: 'Display', value: 'visual' }
{ title: 'Visual (Display)', value: 'visual' },
{ title: 'Audible (Sound)', value: 'audible' }
]
const patternOptions = [
{ title: 'Relative', value: 'relative' },
{ title: 'Absolute', value: 'absolute' },
{ title: 'Absolute (Specific Time)', value: 'absolute' },
{ title: 'Relative (Before Event)', value: 'relative' },
{ title: 'Unknown', value: 'unknown' }
]
const anchorOptions = [
@@ -28,18 +28,6 @@ const anchorOptions = [
{ title: 'End Time', value: 'end' }
]
const offsetPresets = [
{ title: '5 minutes before', value: 'PT5M' },
{ title: '10 minutes before', value: 'PT10M' },
{ title: '15 minutes before', value: 'PT15M' },
{ title: '30 minutes before', value: 'PT30M' },
{ title: '1 hour before', value: 'PT1H' },
{ title: '2 hours before', value: 'PT2H' },
{ title: '1 day before', value: 'P1D' },
{ title: '2 days before', value: 'P2D' },
{ title: '1 week before', value: 'P1W' },
]
const formatNotification = (notification: any) => {
if (notification.pattern === 'absolute' && notification.when) {
return `At ${new Date(notification.when).toLocaleString()}`
@@ -60,7 +48,7 @@ const formatNotification = (notification: any) => {
variant="outlined"
@click="$emit('add-notification')">
<v-icon left>mdi-plus</v-icon>
Add
Add Notification
</v-btn>
</div>
@@ -81,65 +69,9 @@ const formatNotification = (notification: any) => {
<!-- Edit view -->
<div v-else>
<div v-for="(notification, key) in notifications" :key="key" class="mb-2 pa-2 border rounded">
<div class="d-flex align-center ga-2">
<v-row dense class="flex-grow-1">
<v-col cols="6" sm="3">
<v-select
v-model="notification.type"
:items="typeOptions"
label="Type"
variant="outlined"
density="compact"
hide-details
:rules="[v => !!v || 'Type is required']"
/>
</v-col>
<v-col cols="6" sm="3">
<v-select
v-model="notification.pattern"
:items="patternOptions"
label="Pattern"
variant="outlined"
density="compact"
hide-details
:rules="[v => !!v || 'Pattern is required']"
/>
</v-col>
<v-col v-if="notification.pattern === 'absolute'" cols="12" sm="6">
<EventEditorDateTimeField
:model-value="notification.when"
@update:model-value="notification.when = $event"
/>
</v-col>
<template v-else-if="notification.pattern === 'relative'">
<v-col cols="6" sm="3">
<v-select
v-model="notification.anchor"
:items="anchorOptions"
label="Anchor"
variant="outlined"
density="compact"
hide-details
/>
</v-col>
<v-col cols="6" sm="3">
<v-combobox
v-model="notification.offset"
:items="offsetPresets"
item-title="title"
item-value="value"
label="Offset"
variant="outlined"
density="compact"
hide-details
/>
</v-col>
</template>
</v-row>
<div v-for="(notification, key) in notifications" :key="key" class="mb-3 pa-3 border rounded">
<div class="d-flex align-center justify-space-between mb-2">
<strong>Notification</strong>
<v-btn
icon="mdi-delete"
size="small"
@@ -148,6 +80,63 @@ const formatNotification = (notification: any) => {
@click="$emit('remove-notification', key)">
</v-btn>
</div>
<v-row dense class="mb-2">
<v-col cols="12" md="6">
<v-select
v-model="notification.type"
:items="typeOptions"
label="Type"
variant="outlined"
density="compact"
:rules="[v => !!v || 'Type is required']"
/>
</v-col>
<v-col cols="12" md="6">
<v-select
v-model="notification.pattern"
:items="patternOptions"
label="Pattern"
variant="outlined"
density="compact"
:rules="[v => !!v || 'Pattern is required']"
/>
</v-col>
</v-row>
<div v-if="notification.pattern === 'absolute'">
<v-text-field
v-model="notification.when"
label="When (ISO Date)"
type="datetime-local"
variant="outlined"
density="compact"
hint="Specific date and time for notification"
/>
</div>
<div v-else-if="notification.pattern === 'relative'">
<v-row dense>
<v-col cols="12" md="6">
<v-text-field
v-model="notification.offset"
label="Offset (e.g., PT15M)"
variant="outlined"
density="compact"
hint="ISO 8601 duration before event"
/>
</v-col>
<v-col cols="12" md="6">
<v-select
v-model="notification.anchor"
:items="anchorOptions"
label="Anchor"
variant="outlined"
density="compact"
/>
</v-col>
</v-row>
</div>
</div>
</div>
</div>
@@ -90,7 +90,7 @@ const hasParticipants = () => {
variant="outlined"
@click="$emit('add-participant')">
<v-icon left>mdi-plus</v-icon>
Add
Add Participant
</v-btn>
</div>
@@ -131,7 +131,8 @@ const hasParticipants = () => {
<!-- Edit view -->
<div v-else>
<div v-for="(participant, key) in participants" :key="key" class="mb-3 pa-3 border rounded">
<div class="d-flex justify-end mb-2">
<div class="d-flex align-center justify-space-between mb-2">
<strong>{{ participant.name || 'Participant' }}</strong>
<v-btn
icon="mdi-delete"
size="small"
@@ -20,6 +20,8 @@ const tagsValue = computed({
<template>
<div v-if="tagsValue.length > 0 || mode === 'edit'" class="event-editor-section">
<div class="text-subtitle-1 mb-2">Tags</div>
<!-- Read-only view -->
<div v-if="mode === 'view'" class="mb-4">
<div v-if="tagsValue.length > 0" class="pa-2">