Add table view and split name into firstName/lastName fields

This commit is contained in:
Torsten Schulz (local)
2025-10-21 14:38:41 +02:00
parent b024bfe884
commit bd677c26ae
29 changed files with 865 additions and 168 deletions

View File

@@ -1,5 +1,5 @@
{
"date": "2025-10-21T12:32:03.239Z",
"date": "2025-10-21T12:35:57.372Z",
"preset": "node-server",
"framework": {
"name": "nuxt",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
import{e as a}from"#entry";/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const o=a("MailIcon",[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["path",{d:"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",key:"1ocrg3"}]]);/**
* @license lucide-vue-next v0.344.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const t=a("PhoneIcon",[["path",{d:"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z",key:"foiqr5"}]]);export{o as M,t as P};

View File

@@ -1 +1 @@
{"id":"f1db3745-a031-477c-933f-6868f5829384","timestamp":1761049916604}
{"id":"fce91ff8-40a0-4fdf-a058-a6b83ddf7c57","timestamp":1761050150660}

View File

@@ -1 +0,0 @@
{"id":"f1db3745-a031-477c-933f-6868f5829384","timestamp":1761049916604,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}

View File

@@ -0,0 +1 @@
{"id":"fce91ff8-40a0-4fdf-a058-a6b83ddf7c57","timestamp":1761050150660,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":[]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,73 @@
import { promises } from 'fs';
import path from 'path';
const getDataPath = (filename) => {
const cwd = process.cwd();
if (cwd.endsWith(".output")) {
return path.join(cwd, "../server/data", filename);
}
return path.join(cwd, "server/data", filename);
};
const MEMBERS_FILE = getDataPath("members.json");
const USERS_FILE = getDataPath("users.json");
async function readMembers() {
try {
const data = await promises.readFile(MEMBERS_FILE, "utf-8");
return JSON.parse(data);
} catch (error) {
if (error.code === "ENOENT") {
return [];
}
console.error("Fehler beim Lesen der Mitgliederdaten:", error);
return [];
}
}
async function writeMembers(members) {
try {
await promises.writeFile(MEMBERS_FILE, JSON.stringify(members, null, 2), "utf-8");
return true;
} catch (error) {
console.error("Fehler beim Schreiben der Mitgliederdaten:", error);
return false;
}
}
async function readUsers() {
try {
const data = await promises.readFile(USERS_FILE, "utf-8");
return JSON.parse(data);
} catch (error) {
if (error.code === "ENOENT") {
return [];
}
console.error("Fehler beim Lesen der Benutzerdaten:", error);
return [];
}
}
async function saveMember(memberData) {
const members = await readMembers();
if (memberData.id) {
const index = members.findIndex((m) => m.id === memberData.id);
if (index !== -1) {
members[index] = { ...members[index], ...memberData };
} else {
throw new Error("Mitglied nicht gefunden");
}
} else {
const newMember = {
id: `m${Date.now()}`,
...memberData
};
members.push(newMember);
}
await writeMembers(members);
return true;
}
async function deleteMember(id) {
const members = await readMembers();
const filtered = members.filter((m) => m.id !== id);
await writeMembers(filtered);
return true;
}
export { readUsers as a, deleteMember as d, readMembers as r, saveMember as s };
//# sourceMappingURL=members.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"members.mjs","sources":["../../../../server/utils/members.js"],"sourcesContent":null,"names":["fs"],"mappings":"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"}

View File

@@ -161,6 +161,17 @@ const client_manifest = {
"node_modules/nuxt/dist/app/entry.js"
]
},
"_SRZHqrjk.js": {
"resourceType": "script",
"module": true,
"prefetch": true,
"preload": true,
"file": "SRZHqrjk.js",
"name": "phone",
"imports": [
"node_modules/nuxt/dist/app/entry.js"
]
},
"_XZ6RV9KH.js": {
"resourceType": "script",
"module": true,
@@ -263,7 +274,7 @@ const client_manifest = {
"module": true,
"prefetch": true,
"preload": true,
"file": "DI2PgNgB.js",
"file": "DbEmVw1_.js",
"name": "entry",
"src": "node_modules/nuxt/dist/app/entry.js",
"isEntry": true,
@@ -273,14 +284,14 @@ const client_manifest = {
"node_modules/nuxt/dist/app/components/error-500.vue"
],
"css": [
"entry.ldOScqNk.css"
"entry.DO240tkB.css"
],
"assets": [
"Harheimer TC.CKfYAfp1.svg"
]
},
"entry.ldOScqNk.css": {
"file": "entry.ldOScqNk.css",
"entry.DO240tkB.css": {
"file": "entry.DO240tkB.css",
"resourceType": "style",
"prefetch": true,
"preload": true
@@ -412,13 +423,14 @@ const client_manifest = {
"module": true,
"prefetch": true,
"preload": true,
"file": "CFErkncy.js",
"file": "CN7ivzv2.js",
"name": "kontakt",
"src": "pages/kontakt.vue",
"isDynamicEntry": true,
"imports": [
"node_modules/nuxt/dist/app/entry.js",
"_C5SyyWEb.js",
"_SRZHqrjk.js",
"_C8kQt0fa.js",
"_Qy3ajxTk.js"
]
@@ -546,6 +558,25 @@ const client_manifest = {
"_DaSgy0Cl.js"
]
},
"pages/mitgliederbereich/mitglieder.vue": {
"resourceType": "script",
"module": true,
"prefetch": true,
"preload": true,
"file": "DLp4u09V.js",
"name": "mitglieder",
"src": "pages/mitgliederbereich/mitglieder.vue",
"isDynamicEntry": true,
"imports": [
"node_modules/nuxt/dist/app/entry.js",
"_Qy3ajxTk.js",
"_CUq_0rkE.js",
"_SRZHqrjk.js",
"_C5SyyWEb.js",
"_BteKZQ9T.js",
"_C8kQt0fa.js"
]
},
"pages/mitgliederbereich/profil.vue": {
"resourceType": "script",
"module": true,

View File

@@ -0,0 +1,200 @@
import { ref, computed, mergeProps, unref, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderComponent, ssrRenderList, ssrInterpolate, ssrRenderAttr, ssrIncludeBooleanAttr } from 'vue/server-renderer';
import { UserPlus, Loader2, Mail, Phone, MapPin, FileText, Clock, Edit, Trash2, AlertCircle } from 'lucide-vue-next';
import { u as useAuthStore } from './server.mjs';
import { u as useHead } from './composables-CK-Mp9jS.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'pinia';
import 'vue-router';
const _sfc_main = {
__name: "mitglieder",
__ssrInlineRender: true,
setup(__props) {
const authStore = useAuthStore();
const isLoading = ref(true);
const isSaving = ref(false);
const members = ref([]);
const showModal = ref(false);
const editingMember = ref(null);
const errorMessage = ref("");
const formData = ref({
name: "",
email: "",
phone: "",
address: "",
notes: ""
});
const canEdit = computed(() => {
return authStore.role === "admin" || authStore.role === "vorstand";
});
const formatDate = (dateString) => {
if (!dateString) return "";
const date = new Date(dateString);
return date.toLocaleDateString("de-DE", {
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit"
});
};
useHead({
title: "Mitgliederliste - Harheimer TC"
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(mergeProps({ class: "min-h-full py-16 bg-gray-50" }, _attrs))}><div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"><div class="flex justify-between items-center mb-6"><div><h1 class="text-4xl sm:text-5xl font-display font-bold text-gray-900 mb-2"> Mitgliederliste </h1><div class="w-24 h-1 bg-primary-600 mb-4"></div></div>`);
if (canEdit.value) {
_push(`<button class="flex items-center px-4 py-2 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-lg transition-colors">`);
_push(ssrRenderComponent(unref(UserPlus), {
size: 20,
class: "mr-2"
}, null, _parent));
_push(` Mitglied hinzufügen </button>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
if (isLoading.value) {
_push(`<div class="flex items-center justify-center py-12">`);
_push(ssrRenderComponent(unref(Loader2), {
size: 40,
class: "animate-spin text-primary-600"
}, null, _parent));
_push(`</div>`);
} else {
_push(`<div class="space-y-4"><!--[-->`);
ssrRenderList(members.value, (member) => {
_push(`<div class="bg-white p-6 rounded-xl shadow-lg border border-gray-100"><div class="flex justify-between items-start"><div class="flex-1"><div class="flex items-center mb-2"><h3 class="text-xl font-semibold text-gray-900">${ssrInterpolate(member.name)}</h3>`);
if (member.hasLogin) {
_push(`<span class="ml-3 px-2 py-1 bg-green-100 text-green-800 text-xs font-medium rounded-full"> Hat Login </span>`);
} else {
_push(`<!---->`);
}
if (member.source === "manual") {
_push(`<span class="ml-2 px-2 py-1 bg-blue-100 text-blue-800 text-xs font-medium rounded-full"> Manuell </span>`);
} else {
_push(`<span class="ml-2 px-2 py-1 bg-purple-100 text-purple-800 text-xs font-medium rounded-full"> Aus Login-System </span>`);
}
_push(`</div><div class="grid sm:grid-cols-2 gap-3 text-gray-600">`);
if (member.email) {
_push(`<div class="flex items-center">`);
_push(ssrRenderComponent(unref(Mail), {
size: 16,
class: "mr-2 text-primary-600"
}, null, _parent));
_push(`<a${ssrRenderAttr("href", `mailto:${member.email}`)} class="hover:text-primary-600">${ssrInterpolate(member.email)}</a></div>`);
} else {
_push(`<!---->`);
}
if (member.phone) {
_push(`<div class="flex items-center">`);
_push(ssrRenderComponent(unref(Phone), {
size: 16,
class: "mr-2 text-primary-600"
}, null, _parent));
_push(`<a${ssrRenderAttr("href", `tel:${member.phone}`)} class="hover:text-primary-600">${ssrInterpolate(member.phone)}</a></div>`);
} else {
_push(`<!---->`);
}
if (member.address) {
_push(`<div class="flex items-start col-span-2">`);
_push(ssrRenderComponent(unref(MapPin), {
size: 16,
class: "mr-2 text-primary-600 mt-0.5"
}, null, _parent));
_push(`<span>${ssrInterpolate(member.address)}</span></div>`);
} else {
_push(`<!---->`);
}
if (member.notes) {
_push(`<div class="flex items-start col-span-2">`);
_push(ssrRenderComponent(unref(FileText), {
size: 16,
class: "mr-2 text-primary-600 mt-0.5"
}, null, _parent));
_push(`<span>${ssrInterpolate(member.notes)}</span></div>`);
} else {
_push(`<!---->`);
}
if (member.lastLogin) {
_push(`<div class="flex items-center col-span-2 text-sm text-gray-500">`);
_push(ssrRenderComponent(unref(Clock), {
size: 16,
class: "mr-2"
}, null, _parent));
_push(` Letzter Login: ${ssrInterpolate(formatDate(member.lastLogin))}</div>`);
} else {
_push(`<!---->`);
}
_push(`</div></div>`);
if (canEdit.value && member.editable) {
_push(`<div class="flex space-x-2 ml-4"><button class="p-2 text-blue-600 hover:bg-blue-50 rounded-lg transition-colors" title="Bearbeiten">`);
_push(ssrRenderComponent(unref(Edit), { size: 20 }, null, _parent));
_push(`</button><button class="p-2 text-red-600 hover:bg-red-50 rounded-lg transition-colors" title="Löschen">`);
_push(ssrRenderComponent(unref(Trash2), { size: 20 }, null, _parent));
_push(`</button></div>`);
} else {
_push(`<!---->`);
}
_push(`</div></div>`);
});
_push(`<!--]-->`);
if (members.value.length === 0) {
_push(`<div class="text-center py-12 text-gray-500"> Keine Mitglieder gefunden. </div>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
}
if (showModal.value) {
_push(`<div class="fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4"><div class="bg-white rounded-xl shadow-2xl max-w-2xl w-full p-8"><h2 class="text-2xl font-display font-bold text-gray-900 mb-6">${ssrInterpolate(editingMember.value ? "Mitglied bearbeiten" : "Mitglied hinzufügen")}</h2><form class="space-y-4"><div><label class="block text-sm font-medium text-gray-700 mb-2">Name *</label><input${ssrRenderAttr("value", formData.value.name)} type="text" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500"${ssrIncludeBooleanAttr(isSaving.value) ? " disabled" : ""}></div><div><label class="block text-sm font-medium text-gray-700 mb-2">E-Mail</label><input${ssrRenderAttr("value", formData.value.email)} type="email" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500"${ssrIncludeBooleanAttr(isSaving.value) ? " disabled" : ""}></div><div><label class="block text-sm font-medium text-gray-700 mb-2">Telefon</label><input${ssrRenderAttr("value", formData.value.phone)} type="tel" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500"${ssrIncludeBooleanAttr(isSaving.value) ? " disabled" : ""}></div><div><label class="block text-sm font-medium text-gray-700 mb-2">Adresse</label><input${ssrRenderAttr("value", formData.value.address)} type="text" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500"${ssrIncludeBooleanAttr(isSaving.value) ? " disabled" : ""}></div><div><label class="block text-sm font-medium text-gray-700 mb-2">Notizen</label><textarea rows="3" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500"${ssrIncludeBooleanAttr(isSaving.value) ? " disabled" : ""}>${ssrInterpolate(formData.value.notes)}</textarea></div>`);
if (errorMessage.value) {
_push(`<div class="flex items-center p-3 rounded-md bg-red-50 text-red-700 text-sm">`);
_push(ssrRenderComponent(unref(AlertCircle), {
size: 20,
class: "mr-2"
}, null, _parent));
_push(` ${ssrInterpolate(errorMessage.value)}</div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="flex justify-end space-x-4 pt-4"><button type="button" class="px-6 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50 transition-colors"${ssrIncludeBooleanAttr(isSaving.value) ? " disabled" : ""}> Abbrechen </button><button type="submit" class="px-6 py-2 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-lg transition-colors flex items-center"${ssrIncludeBooleanAttr(isSaving.value) ? " disabled" : ""}>`);
if (isSaving.value) {
_push(ssrRenderComponent(unref(Loader2), {
size: 20,
class: "animate-spin mr-2"
}, null, _parent));
} else {
_push(`<!---->`);
}
_push(`<span>${ssrInterpolate(isSaving.value ? "Speichert..." : "Speichern")}</span></button></div></form></div></div>`);
} else {
_push(`<!---->`);
}
_push(`</div></div>`);
};
}
};
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/mitgliederbereich/mitglieder.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export { _sfc_main as default };
//# sourceMappingURL=mitglieder-Dh7s1xvF.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"mitglieder-Dh7s1xvF.mjs","sources":["../../../../pages/mitgliederbereich/mitglieder.vue"],"sourcesContent":null,"names":["_ssrRenderAttrs","_mergeProps","_ssrRenderList","_ssrInterpolate","_ssrRenderComponent","_unref","_ssrRenderAttr"],"mappings":"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"}

View File

@@ -397,6 +397,9 @@ const unhead_k2P3m_ZDyjlr2mMYnoDPwavjsDN8hBlk9cFai0bbopU = /* @__PURE__ */ defin
function toArray(value) {
return Array.isArray(value) ? value : [value];
}
const __nuxt_page_meta$3 = {
layout: "default"
};
const __nuxt_page_meta$2 = {
layout: "default"
};
@@ -415,7 +418,7 @@ const _routes = [
{
name: "login",
path: "/login",
meta: __nuxt_page_meta$2 || {},
meta: __nuxt_page_meta$3 || {},
component: () => import('./login-BdWGyHdA.mjs')
},
{
@@ -548,7 +551,7 @@ const _routes = [
{
name: "mitgliederbereich",
path: "/mitgliederbereich",
meta: { ...__nuxt_page_meta$1 || {}, ...{ "middleware": "auth" } },
meta: { ...__nuxt_page_meta$2 || {}, ...{ "middleware": "auth" } },
component: () => import('./index-D7JtbHaf.mjs')
},
{
@@ -559,8 +562,14 @@ const _routes = [
{
name: "mitgliederbereich-profil",
path: "/mitgliederbereich/profil",
meta: { ...__nuxt_page_meta || {}, ...{ "middleware": "auth" } },
meta: { ...__nuxt_page_meta$1 || {}, ...{ "middleware": "auth" } },
component: () => import('./profil-UUfhNGZ3.mjs')
},
{
name: "mitgliederbereich-mitglieder",
path: "/mitgliederbereich/mitglieder",
meta: { ...__nuxt_page_meta || {}, ...{ "middleware": "auth" } },
component: () => import('./mitglieder-Dh7s1xvF.mjs')
}
];
const ROUTE_KEY_PARENTHESES_RE = /(:\w+)\([^)]+\)/g;

View File

@@ -1 +1 @@
{"version":3,"file":"server.mjs","sources":["../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Ffetch.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fglobal-polyfills.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fnuxt.config.mjs","../../../../node_modules/nuxt/dist/app/nuxt.js","../../../../node_modules/nuxt/dist/app/components/injections.js","../../../../node_modules/nuxt/dist/app/utils.js","../../../../node_modules/nuxt/dist/app/composables/router.js","../../../../node_modules/nuxt/dist/app/composables/error.js","../../../../node_modules/nuxt/dist/app/composables/manifest.js","../../../../node_modules/nuxt/dist/app/composables/payload.js","../../../../node_modules/@pinia/nuxt/dist/runtime/payload-plugin.js","../../../../node_modules/nuxt/dist/head/runtime/plugins/unhead.js","../../../../node_modules/nuxt/dist/pages/runtime/utils.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Froutes.mjs","../../../../node_modules/nuxt/dist/app/components/utils.js","../../../../node_modules/nuxt/dist/pages/runtime/router.options.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Frouter.options.mjs","../../../../node_modules/nuxt/dist/pages/runtime/validate.js","../../../../stores/auth.js","../../../../middleware/auth.global.js","../../../../node_modules/nuxt/dist/app/middleware/manifest-route-rule.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fmiddleware.mjs","../../../../node_modules/nuxt/dist/pages/runtime/plugins/router.js","../../../../node_modules/nuxt/dist/app/plugins/revive-payload.server.js","../../../../node_modules/nuxt/dist/app/components/server-placeholder.js","../../../../node_modules/nuxt/dist/app/components/client-only.js","../../../../node_modules/nuxt/dist/app/components/nuxt-link.js","../../../../node_modules/@pinia/nuxt/dist/runtime/plugin.vue3.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fcomponents.plugin.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fplugins.server.mjs","../../../../node_modules/nuxt/dist/app/components/route-provider.js","../../../../node_modules/nuxt/dist/pages/runtime/page.js","../../../../assets/images/logos/Harheimer TC.svg","../../../../components/Navigation.vue","../../../../components/Footer.vue","../../../../app.vue","../../../../node_modules/nuxt/dist/app/components/nuxt-error-page.vue","../../../../node_modules/nuxt/dist/app/components/nuxt-root.vue","../../../../node_modules/nuxt/dist/app/entry.js"],"sourcesContent":null,"names":["$fetch","plugin","provide","plugins","createH3Error","createRadixRouter","login1RYyYL8mxx17qR_nmdKvywxx7lKOLXMFu8pTLfvTLYwMeta","indexqVbusfljIJ04j42RIA_KP4bSP7XytQIXdqcVfR3kPUAMeta","profilyVBy_UvZ8KvchY44_0SJbB0NHOad6MC_S9C8wfDdUWEMeta","__executeAsync","createRouter","entry","payload_plugin_1_bEQpMjikuQhbV8UJ0PxUqmSvPdmV1jDa5DURnKW4M","router_GNCWhvtYfLTYRZZ135CdFAEjxdMexN0ixiUYCAN_tpw","plugin_vue3_CQ_pO3THrTGIeYc0dvC91V75hY8qpo9B_8yZzOW5SFs","useRoute","_ssrRenderAttrs","_mergeProps","_push","_parent","_ssrRenderAttr","_imports_0","_createVNode","_ssrRenderClass","_unref","_ssrRenderList","_ssrInterpolate","_createTextVNode","_toDisplayString","useRouter","_ssrRenderComponent","ErrorComponent","RootComponent"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20,21,22,23,24,25,26,27,28,29,30,31,36,37,38]}
{"version":3,"file":"server.mjs","sources":["../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Ffetch.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fglobal-polyfills.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fnuxt.config.mjs","../../../../node_modules/nuxt/dist/app/nuxt.js","../../../../node_modules/nuxt/dist/app/components/injections.js","../../../../node_modules/nuxt/dist/app/utils.js","../../../../node_modules/nuxt/dist/app/composables/router.js","../../../../node_modules/nuxt/dist/app/composables/error.js","../../../../node_modules/nuxt/dist/app/composables/manifest.js","../../../../node_modules/nuxt/dist/app/composables/payload.js","../../../../node_modules/@pinia/nuxt/dist/runtime/payload-plugin.js","../../../../node_modules/nuxt/dist/head/runtime/plugins/unhead.js","../../../../node_modules/nuxt/dist/pages/runtime/utils.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Froutes.mjs","../../../../node_modules/nuxt/dist/app/components/utils.js","../../../../node_modules/nuxt/dist/pages/runtime/router.options.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Frouter.options.mjs","../../../../node_modules/nuxt/dist/pages/runtime/validate.js","../../../../stores/auth.js","../../../../middleware/auth.global.js","../../../../node_modules/nuxt/dist/app/middleware/manifest-route-rule.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fmiddleware.mjs","../../../../node_modules/nuxt/dist/pages/runtime/plugins/router.js","../../../../node_modules/nuxt/dist/app/plugins/revive-payload.server.js","../../../../node_modules/nuxt/dist/app/components/server-placeholder.js","../../../../node_modules/nuxt/dist/app/components/client-only.js","../../../../node_modules/nuxt/dist/app/components/nuxt-link.js","../../../../node_modules/@pinia/nuxt/dist/runtime/plugin.vue3.js","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fcomponents.plugin.mjs","../../../../virtual:nuxt:%2Fmnt%2Fshare%2Ftorsten%2FPrograms%2Fharheimertc%2Fnode_modules%2F.cache%2Fnuxt%2F.nuxt%2Fplugins.server.mjs","../../../../node_modules/nuxt/dist/app/components/route-provider.js","../../../../node_modules/nuxt/dist/pages/runtime/page.js","../../../../assets/images/logos/Harheimer TC.svg","../../../../components/Navigation.vue","../../../../components/Footer.vue","../../../../app.vue","../../../../node_modules/nuxt/dist/app/components/nuxt-error-page.vue","../../../../node_modules/nuxt/dist/app/components/nuxt-root.vue","../../../../node_modules/nuxt/dist/app/entry.js"],"sourcesContent":null,"names":["$fetch","plugin","provide","plugins","createH3Error","createRadixRouter","login1RYyYL8mxx17qR_nmdKvywxx7lKOLXMFu8pTLfvTLYwMeta","indexqVbusfljIJ04j42RIA_KP4bSP7XytQIXdqcVfR3kPUAMeta","profilyVBy_UvZ8KvchY44_0SJbB0NHOad6MC_S9C8wfDdUWEMeta","mitglieder9TWncRC_sSS_zPWzxBDlRiNjjFojXSJny_uernMe_tAMeta","__executeAsync","createRouter","entry","payload_plugin_1_bEQpMjikuQhbV8UJ0PxUqmSvPdmV1jDa5DURnKW4M","router_GNCWhvtYfLTYRZZ135CdFAEjxdMexN0ixiUYCAN_tpw","plugin_vue3_CQ_pO3THrTGIeYc0dvC91V75hY8qpo9B_8yZzOW5SFs","useRoute","_ssrRenderAttrs","_mergeProps","_push","_parent","_ssrRenderAttr","_imports_0","_createVNode","_ssrRenderClass","_unref","_ssrRenderList","_ssrInterpolate","_createTextVNode","_toDisplayString","useRouter","_ssrRenderComponent","ErrorComponent","RootComponent"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20,21,22,23,24,25,26,27,28,29,30,31,36,37,38]}

View File

@@ -4293,7 +4293,7 @@ function _expandFromEnv(value) {
const _inlineRuntimeConfig = {
"app": {
"baseURL": "/",
"buildId": "f1db3745-a031-477c-933f-6868f5829384",
"buildId": "fce91ff8-40a0-4fdf-a058-a6b83ddf7c57",
"buildAssetsDir": "/_nuxt/",
"cdnURL": ""
},
@@ -4738,509 +4738,523 @@ const plugins = [
];
const assets = {
"/images/club_about_us.png": {
"type": "image/png",
"etag": "\"202e56-s4fLsHEgoAgKJeBRuI1qxPmqHV0\"",
"mtime": "2025-10-21T12:32:00.851Z",
"size": 2109014,
"path": "../public/images/club_about_us.png"
},
"/data/mannschaften.csv": {
"type": "text/csv; charset=utf-8",
"etag": "\"858-l94GKn8Q0I5RQnhrM0ZPJsYUmcw\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 2136,
"path": "../public/data/mannschaften.csv"
},
"/data/spielsysteme.csv": {
"type": "text/csv; charset=utf-8",
"etag": "\"9bc-4npLrNHYClsD0TKV5vSifxitfV0\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 2492,
"path": "../public/data/spielsysteme.csv"
},
"/data/termine.csv": {
"type": "text/csv; charset=utf-8",
"etag": "\"2e8-sZtaHF6QRmOQHinTWOLAYRgo6xk\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 744,
"path": "../public/data/termine.csv"
},
"/data/vereinsmeisterschaften.csv": {
"type": "text/csv; charset=utf-8",
"etag": "\"989-X8AB+Zegy2xUbjDtbQcXhuuyBDQ\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 2441,
"path": "../public/data/vereinsmeisterschaften.csv"
},
"/documents/Tischtennisregeln light.pdf": {
"type": "application/pdf",
"etag": "\"5177b-y/88q2+Y3RRechJMqWhse21KRdQ\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 333691,
"path": "../public/documents/Tischtennisregeln light.pdf"
},
"/documents/satzung.pdf": {
"type": "application/pdf",
"etag": "\"5c7cf-L0A3nT8D24T9sD57FFbij3QRpzw\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 378831,
"path": "../public/documents/satzung.pdf"
},
"/images/club_about_us.png": {
"type": "image/png",
"etag": "\"202e56-s4fLsHEgoAgKJeBRuI1qxPmqHV0\"",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 2109014,
"path": "../public/images/club_about_us.png"
},
"/_nuxt/0xufrPn-.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"b10-/isfm3dyRIVsEjgvcmL/XPZzoKo\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 2832,
"path": "../public/_nuxt/0xufrPn-.js"
},
"/_nuxt/48ve60fm.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"557-e04q6bcr4Wja5BTiX/uCY9jcaOk\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 1367,
"path": "../public/_nuxt/48ve60fm.js"
},
"/_nuxt/B-ZRDHEi.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1744-1NcVDhC8iP9qzUGuLES4GLUFuNU\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 5956,
"path": "../public/_nuxt/B-ZRDHEi.js"
},
"/_nuxt/B4mSF5Ac.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"185-hHs3mU4qOcQAkGQaPrUYGaG0yao\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 389,
"path": "../public/_nuxt/B4mSF5Ac.js"
},
"/_nuxt/B8JkES4d.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1860-WvKC8RdCe6cXCpB1GzY85pS096Q\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 6240,
"path": "../public/_nuxt/B8JkES4d.js"
},
"/_nuxt/BJFIhPLo.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"16e9-yq0/LFZyeArARUVXQVCw9WWyEhs\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 5865,
"path": "../public/_nuxt/BJFIhPLo.js"
},
"/_nuxt/BLJfiAQ_.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1827-YlPmbtoIQqGYplyNk7VayRftNJ4\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 6183,
"path": "../public/_nuxt/BLJfiAQ_.js"
},
"/_nuxt/BQ1JAN-t.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"4d4-D2c9LzMtu3t/oTdiDqO210OhOq0\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 1236,
"path": "../public/_nuxt/BQ1JAN-t.js"
},
"/_nuxt/BTRcaDI_.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"e71-89mfqDG6lXCsNo8iythpikNOsNM\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 3697,
"path": "../public/_nuxt/BTRcaDI_.js"
},
"/_nuxt/BVRiFo7f.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"dbf-bs5Lp4co8JtdiCR4NBZg2xEEpZE\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 3519,
"path": "../public/_nuxt/BVRiFo7f.js"
},
"/_nuxt/BWWcyQAZ.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"685-pCeqOgBg8QXGBjOkvDQ5Miivcwk\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 1669,
"path": "../public/_nuxt/BWWcyQAZ.js"
},
"/_nuxt/Be7mAYpw.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"13f6-nhcH7PpHXr9KCHrhZOBaqzyCANs\"",
"mtime": "2025-10-21T12:32:00.847Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 5110,
"path": "../public/_nuxt/Be7mAYpw.js"
},
"/_nuxt/BkTrhdjg.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"81f-bXeZaccLlH7cSuSEhEG6Pk4vEzY\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 2079,
"path": "../public/_nuxt/BkTrhdjg.js"
},
"/_nuxt/BneZCqgq.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1a9f-Hr2fThSa8cJCoHMhFwvPAqgbLZg\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 6815,
"path": "../public/_nuxt/BneZCqgq.js"
},
"/_nuxt/BpG5pLwY.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"16e6-iqlwalhSHX6bpWAAiam6nLgiuVE\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 5862,
"path": "../public/_nuxt/BpG5pLwY.js"
},
"/_nuxt/BteKZQ9T.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1ea-kmrGdt5SPmt15EiBI7kR9gXMQM0\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 490,
"path": "../public/_nuxt/BteKZQ9T.js"
},
"/_nuxt/C0jrEzGC.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"5f0-uJRUZKhjlZl/nyiPAoO6Z/4LAHg\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 1520,
"path": "../public/_nuxt/C0jrEzGC.js"
},
"/_nuxt/C5SyyWEb.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"2a5-06iX+CL3i0ysaqW9nu7Eg2YzDhQ\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 677,
"path": "../public/_nuxt/C5SyyWEb.js"
},
"/_nuxt/C8kQt0fa.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"197-7X99z1xphxry8OnMwU7Ofs/uE0Q\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 407,
"path": "../public/_nuxt/C8kQt0fa.js"
},
"/_nuxt/CFErkncy.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"20d5-n8y27a5DG3vq+zV80w2HAXHUyAw\"",
"mtime": "2025-10-21T12:32:00.848Z",
"size": 8405,
"path": "../public/_nuxt/CFErkncy.js"
},
"/_nuxt/CHQH_CwJ.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1168-mBOIwVjM5LsxIx13Cs7oT3+LJ+k\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 4456,
"path": "../public/_nuxt/CHQH_CwJ.js"
},
"/_nuxt/CKjxMu8n.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"faa-TEO7v2i4TXlLpDUt7LGSNlcm+Ew\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 4010,
"path": "../public/_nuxt/CKjxMu8n.js"
},
"/_nuxt/CN7ivzv2.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1daf-KIlbDOIuT3G/zezUF5LO1f52Vtc\"",
"mtime": "2025-10-21T12:35:54.920Z",
"size": 7599,
"path": "../public/_nuxt/CN7ivzv2.js"
},
"/_nuxt/CNvcEwxd.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"11e7-FT5oxPyA+c2iUA/l/5Ieuxws3Pc\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 4583,
"path": "../public/_nuxt/CNvcEwxd.js"
},
"/_nuxt/CUVZhO0q.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"dfc-1G2To51pfChtkPrr4l+DG3FkOHk\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 3580,
"path": "../public/_nuxt/CUVZhO0q.js"
},
"/_nuxt/CUq_0rkE.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"12d-JV4KW1fgT85/V3Ap13X4q2h9U3g\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 301,
"path": "../public/_nuxt/CUq_0rkE.js"
},
"/_nuxt/CWEkTB1z.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"198-ej4DRqc3/5nSwWU3c6wbOD3Ib9w\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 408,
"path": "../public/_nuxt/CWEkTB1z.js"
},
"/_nuxt/Cb5SbJ0y.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1d90-K3fsAPMrslrofiGV21WL0Fu94+E\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 7568,
"path": "../public/_nuxt/Cb5SbJ0y.js"
},
"/_nuxt/CkzaQq3X.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"17d-+xKrHjeww4bpFFkkjUNLD/ebn5A\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 381,
"path": "../public/_nuxt/CkzaQq3X.js"
},
"/_nuxt/CrCcIvVp.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"274-9U7hEMtgHqdnQopnKeJsBKqKyKw\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 628,
"path": "../public/_nuxt/CrCcIvVp.js"
},
"/_nuxt/Cx4UcKGu.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"19d-5AMD0EnFEjOkM3qKDpC/NZZzwDI\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 413,
"path": "../public/_nuxt/Cx4UcKGu.js"
},
"/_nuxt/Czdc6-TI.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"165-EMJ/yP2qajGIw0CL3y+L/hvMM/8\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 357,
"path": "../public/_nuxt/Czdc6-TI.js"
},
"/_nuxt/D54FZQPM.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1556-GtYLKNALVpyOhSr1LrAIs5gIV7I\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 5462,
"path": "../public/_nuxt/D54FZQPM.js"
},
"/_nuxt/DAACT36i.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1f9-dVOk5jAwb0VlMLJevIcT+s2NTgM\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 505,
"path": "../public/_nuxt/DAACT36i.js"
},
"/_nuxt/DI2PgNgB.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"329ab-EjWl46ZcILHAjC+dZQ1H/9g0rQA\"",
"mtime": "2025-10-21T12:32:00.848Z",
"size": 207275,
"path": "../public/_nuxt/DI2PgNgB.js"
},
"/_nuxt/DIYnFFZd.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"3518-Z2dO9ejuo/PHmRggMKxl1caQ7yo\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 13592,
"path": "../public/_nuxt/DIYnFFZd.js"
},
"/_nuxt/DK8ar2Vw.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"bf0-gt2eLpxqF9V/T1JrusLBdWlTOB4\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 3056,
"path": "../public/_nuxt/DK8ar2Vw.js"
},
"/_nuxt/DLp4u09V.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"2373-a6SinD9M0hf9fJlneHMFeVHePYU\"",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 9075,
"path": "../public/_nuxt/DLp4u09V.js"
},
"/_nuxt/DQ89_Lrx.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1bdb-FX6FWYmVTmAWWkO9E2O91ImJoTI\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 7131,
"path": "../public/_nuxt/DQ89_Lrx.js"
},
"/_nuxt/DaSgy0Cl.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"11f-soKnh1qfNJj5nvt+IcgQXYvg/z4\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 287,
"path": "../public/_nuxt/DaSgy0Cl.js"
},
"/_nuxt/DaUHoOti.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"177f-xSuV2n3wrsWDBysy5o9XsakrXDw\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 6015,
"path": "../public/_nuxt/DaUHoOti.js"
},
"/_nuxt/DbEmVw1_.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"32ab5-GBJvJfvbN3wGTaRplCzBmuFRQyk\"",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 207541,
"path": "../public/_nuxt/DbEmVw1_.js"
},
"/_nuxt/DkeYb0_S.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1ce-xiaAbRvqQ+zffTXF3Gc7rq14R0U\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 462,
"path": "../public/_nuxt/DkeYb0_S.js"
},
"/_nuxt/DlAUqK2U.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"5b-eFCz/UrraTh721pgAl0VxBNR1es\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 91,
"path": "../public/_nuxt/DlAUqK2U.js"
},
"/_nuxt/DuCL6zMI.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"16a2-gJGadr4jKYMWO0Im01z6CSn+n1E\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 5794,
"path": "../public/_nuxt/DuCL6zMI.js"
},
"/_nuxt/H0vOWBHN.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"2029-KNpFGDGtz8iRFY43F+s7ByzEpkM\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 8233,
"path": "../public/_nuxt/H0vOWBHN.js"
},
"/_nuxt/Harheimer TC.CKfYAfp1.svg": {
"type": "image/svg+xml",
"etag": "\"1d2535-Tx2lTuuFn2hBqGZOnDan3/OdRU0\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 1910069,
"path": "../public/_nuxt/Harheimer TC.CKfYAfp1.svg"
},
"/_nuxt/Qy3ajxTk.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"13f-LgrH17St2xFg+RPGvT3uJRaRfFw\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 319,
"path": "../public/_nuxt/Qy3ajxTk.js"
},
"/_nuxt/RGsuuLA3.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"10bb-640PtonCPMgqRn3wO6U3UtHYmDM\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 4283,
"path": "../public/_nuxt/RGsuuLA3.js"
},
"/_nuxt/SRZHqrjk.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"383-+7H4gpbdqNaMFlhjcQOVxgmex04\"",
"mtime": "2025-10-21T12:35:54.921Z",
"size": 899,
"path": "../public/_nuxt/SRZHqrjk.js"
},
"/_nuxt/XZ6RV9KH.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"175-xr1poEaGS4yjOp907AsRAr6XHLI\"",
"mtime": "2025-10-21T12:32:00.848Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 373,
"path": "../public/_nuxt/XZ6RV9KH.js"
},
"/_nuxt/YJHbYJtA.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"19f-nQw578pUen9o8yYaMA8Bwag6xho\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 415,
"path": "../public/_nuxt/YJHbYJtA.js"
},
"/_nuxt/ZrOCUSmD.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"ee2-knvq//8tl4tcmRjFy6nWAy0dRBk\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 3810,
"path": "../public/_nuxt/ZrOCUSmD.js"
},
"/_nuxt/entry.ldOScqNk.css": {
"/_nuxt/entry.DO240tkB.css": {
"type": "text/css; charset=utf-8",
"etag": "\"b1a7-jTLcC6A4rNtCcMPUi8YvMGaTmxU\"",
"mtime": "2025-10-21T12:32:00.849Z",
"size": 45479,
"path": "../public/_nuxt/entry.ldOScqNk.css"
"etag": "\"b35f-gCEaBCdtBrnK3yH5288e0HxU0e8\"",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 45919,
"path": "../public/_nuxt/entry.DO240tkB.css"
},
"/_nuxt/error-404.CbXQcqJW.css": {
"type": "text/css; charset=utf-8",
"etag": "\"97e-Ty5bTTSEudJkO/DsGUoIf37xYxc\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 2430,
"path": "../public/_nuxt/error-404.CbXQcqJW.css"
},
"/_nuxt/error-500.L485xXhD.css": {
"type": "text/css; charset=utf-8",
"etag": "\"773-jNt1QdCa+iqaSZb1mv/IQWC5p6w\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 1907,
"path": "../public/_nuxt/error-500.L485xXhD.css"
},
"/_nuxt/index.BYYJS8tV.css": {
"type": "text/css; charset=utf-8",
"etag": "\"167-3j4dZVXlcTPVZDB5pP2uXGX7/QQ\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 359,
"path": "../public/_nuxt/index.BYYJS8tV.css"
},
"/_nuxt/jVj3QaoK.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"196-xWXv220Sy3kJeouwzrQ/gnXllWQ\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 406,
"path": "../public/_nuxt/jVj3QaoK.js"
},
"/_nuxt/rZgF5GAr.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"2163-F4ycM3bgzLo6kVIU09LeGUWE8SI\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 8547,
"path": "../public/_nuxt/rZgF5GAr.js"
},
"/_nuxt/tnJjxGC6.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"abb-4G3/6bCNUQzUVLLE5tcXv6Rh+gc\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 2747,
"path": "../public/_nuxt/tnJjxGC6.js"
},
"/_nuxt/y9BE7jdd.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"d8b-/UzKIx4Kl1VnbQibGZzrIbVIyG4\"",
"mtime": "2025-10-21T12:32:00.849Z",
"mtime": "2025-10-21T12:35:54.922Z",
"size": 3467,
"path": "../public/_nuxt/y9BE7jdd.js"
},
"/spielplaene/1. Mannschaft 20252026.pdf": {
"type": "application/pdf",
"etag": "\"64c6-+477M+gD/spwpWR9NO/tMJ/inCc\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 25798,
"path": "../public/spielplaene/1. Mannschaft 20252026.pdf"
},
"/spielplaene/2. Mannschaft 20252026.pdf": {
"type": "application/pdf",
"etag": "\"5bfa-DRJMHLV15iss67lEISoGqSYmZjE\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 23546,
"path": "../public/spielplaene/2. Mannschaft 20252026.pdf"
},
"/spielplaene/3. Mannschaft 20252026.pdf": {
"type": "application/pdf",
"etag": "\"7447-w933CPQdXhkWJ2AZOVdY0UgJnPo\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 29767,
"path": "../public/spielplaene/3. Mannschaft 20252026.pdf"
},
"/spielplaene/4. Mannschaft 20252026.pdf": {
"type": "application/pdf",
"etag": "\"6a9b-4TPGn1yQlFUMRj7oB43SN//Np9o\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 27291,
"path": "../public/spielplaene/4. Mannschaft 20252026.pdf"
},
"/spielplaene/5. Mannschaft 20252026.pdf": {
"type": "application/pdf",
"etag": "\"6523-5VUfCMaoiNhcwHhptHHTVJ3lSwQ\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 25891,
"path": "../public/spielplaene/5. Mannschaft 20252026.pdf"
},
"/spielplaene/Jugend 11 20252026.pdf": {
"type": "application/pdf",
"etag": "\"52e9-3Rrk9UKUxPh80pBJ0w9oLVbe5dA\"",
"mtime": "2025-10-21T12:32:00.851Z",
"mtime": "2025-10-21T12:35:54.924Z",
"size": 21225,
"path": "../public/spielplaene/Jugend 11 20252026.pdf"
},
"/_nuxt/builds/latest.json": {
"type": "application/json",
"etag": "\"47-snXZQE0Fy3MUjZbnKAJCA6GyUDA\"",
"mtime": "2025-10-21T12:32:00.839Z",
"etag": "\"47-aVOE6xW+/CP0oWaTEr2HYwBdke4\"",
"mtime": "2025-10-21T12:35:54.912Z",
"size": 71,
"path": "../public/_nuxt/builds/latest.json"
},
"/_nuxt/builds/meta/f1db3745-a031-477c-933f-6868f5829384.json": {
"/_nuxt/builds/meta/fce91ff8-40a0-4fdf-a058-a6b83ddf7c57.json": {
"type": "application/json",
"etag": "\"8b-q+3bmAVJHURMkPuvxOuUzhycQ4Q\"",
"mtime": "2025-10-21T12:32:00.836Z",
"etag": "\"8b-b1XoCxbXohOLCWsLiZpM6sONkT0\"",
"mtime": "2025-10-21T12:35:54.909Z",
"size": 139,
"path": "../public/_nuxt/builds/meta/f1db3745-a031-477c-933f-6868f5829384.json"
"path": "../public/_nuxt/builds/meta/fce91ff8-40a0-4fdf-a058-a6b83ddf7c57.json"
}
};
@@ -5465,6 +5479,9 @@ const _lazy_zyEkIc = () => import('../routes/api/cms/users/reject.post.mjs');
const _lazy_hmwxQi = () => import('../routes/api/cms/users/update-role.post.mjs');
const _lazy_Ho2nl4 = () => import('../routes/api/contact.post.mjs');
const _lazy_EK_x5_ = () => import('../routes/api/galerie.get.mjs');
const _lazy_jYLuY1 = () => import('../routes/api/members.delete.mjs');
const _lazy_HGAbG3 = () => import('../routes/api/members.get.mjs');
const _lazy_XNetVh = () => import('../routes/api/members.post.mjs');
const _lazy_FqQY6L = () => import('../routes/api/profile.get.mjs');
const _lazy_m5wCSG = () => import('../routes/api/profile.put.mjs');
const _lazy_JX4TVI = () => import('../routes/api/spielplaene.get.mjs');
@@ -5484,6 +5501,9 @@ const handlers = [
{ route: '/api/cms/users/update-role', handler: _lazy_hmwxQi, lazy: true, middleware: false, method: "post" },
{ route: '/api/contact', handler: _lazy_Ho2nl4, lazy: true, middleware: false, method: "post" },
{ route: '/api/galerie', handler: _lazy_EK_x5_, lazy: true, middleware: false, method: "get" },
{ route: '/api/members', handler: _lazy_jYLuY1, lazy: true, middleware: false, method: "delete" },
{ route: '/api/members', handler: _lazy_HGAbG3, lazy: true, middleware: false, method: "get" },
{ route: '/api/members', handler: _lazy_XNetVh, lazy: true, middleware: false, method: "post" },
{ route: '/api/profile', handler: _lazy_FqQY6L, lazy: true, middleware: false, method: "get" },
{ route: '/api/profile', handler: _lazy_m5wCSG, lazy: true, middleware: false, method: "put" },
{ route: '/api/spielplaene', handler: _lazy_JX4TVI, lazy: true, middleware: false, method: "get" },

View File

@@ -0,0 +1,60 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { d as deleteMember } from '../../_/members.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
const members_delete = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum L\xF6schen von Mitgliedern."
});
}
const body = await readBody(event);
const { id } = body;
if (!id) {
throw createError({
statusCode: 400,
message: "Mitglieds-ID ist erforderlich."
});
}
await deleteMember(id);
return {
success: true,
message: "Mitglied erfolgreich gel\xF6scht."
};
} catch (error) {
console.error("Fehler beim L\xF6schen des Mitglieds:", error);
throw error;
}
});
export { members_delete as default };
//# sourceMappingURL=members.delete.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"members.delete.mjs","sources":["../../../../../server/api/members.delete.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,uBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,SAAA,OAAA,IAAA,IAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,EAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,aAAA,EAAA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,yCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -0,0 +1,109 @@
import { d as defineEventHandler, g as getCookie, c as createError } from '../../nitro/nitro.mjs';
import { b as verifyToken } from '../../_/auth.mjs';
import { r as readMembers, a as readUsers } from '../../_/members.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
const members_get = defineEventHandler(async (event) => {
var _a, _b, _c, _d;
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const manualMembers = await readMembers();
const registeredUsers = await readUsers();
const mergedMembers = [];
const processedEmails = /* @__PURE__ */ new Set();
const processedNames = /* @__PURE__ */ new Set();
for (const member of manualMembers) {
const normalizedEmail = ((_a = member.email) == null ? void 0 : _a.toLowerCase().trim()) || "";
const normalizedName = ((_b = member.name) == null ? void 0 : _b.toLowerCase().trim()) || "";
mergedMembers.push({
...member,
source: "manual",
editable: true,
hasLogin: false
});
if (normalizedEmail) processedEmails.add(normalizedEmail);
if (normalizedName) processedNames.add(normalizedName);
}
for (const user of registeredUsers) {
if (!user.active) continue;
const normalizedEmail = ((_c = user.email) == null ? void 0 : _c.toLowerCase().trim()) || "";
const normalizedName = ((_d = user.name) == null ? void 0 : _d.toLowerCase().trim()) || "";
let matchedManualIndex = -1;
if (normalizedEmail) {
matchedManualIndex = mergedMembers.findIndex(
(m) => {
var _a2;
return m.source === "manual" && ((_a2 = m.email) == null ? void 0 : _a2.toLowerCase().trim()) === normalizedEmail;
}
);
}
if (matchedManualIndex === -1 && normalizedName) {
matchedManualIndex = mergedMembers.findIndex(
(m) => {
var _a2;
return m.source === "manual" && ((_a2 = m.name) == null ? void 0 : _a2.toLowerCase().trim()) === normalizedName;
}
);
}
if (matchedManualIndex !== -1) {
mergedMembers[matchedManualIndex] = {
...mergedMembers[matchedManualIndex],
hasLogin: true,
loginEmail: user.email,
loginRole: user.role,
lastLogin: user.lastLogin
};
} else {
mergedMembers.push({
id: user.id,
name: user.name,
email: user.email,
phone: user.phone || "",
address: "",
notes: `Rolle: ${user.role}`,
source: "login",
editable: false,
hasLogin: true,
loginEmail: user.email,
loginRole: user.role,
lastLogin: user.lastLogin
});
}
}
mergedMembers.sort((a, b) => a.name.localeCompare(b.name));
return {
success: true,
members: mergedMembers
};
} catch (error) {
console.error("Fehler beim Abrufen der Mitgliederliste:", error);
throw error;
}
});
export { members_get as default };
//# sourceMappingURL=members.get.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"members.get.mjs","sources":["../../../../../server/api/members.get.js"],"sourcesContent":null,"names":["_a"],"mappings":"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"}

View File

@@ -0,0 +1,67 @@
import { d as defineEventHandler, g as getCookie, c as createError, r as readBody } from '../../nitro/nitro.mjs';
import { b as verifyToken, e as getUserById } from '../../_/auth.mjs';
import { s as saveMember } from '../../_/members.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import 'bcryptjs';
import 'jsonwebtoken';
import 'fs';
import 'path';
const members_post = defineEventHandler(async (event) => {
try {
const token = getCookie(event, "auth_token");
if (!token) {
throw createError({
statusCode: 401,
message: "Nicht authentifiziert."
});
}
const decoded = verifyToken(token);
if (!decoded) {
throw createError({
statusCode: 401,
message: "Ung\xFCltiges Token."
});
}
const user = await getUserById(decoded.id);
if (!user || user.role !== "admin" && user.role !== "vorstand") {
throw createError({
statusCode: 403,
message: "Keine Berechtigung zum Bearbeiten von Mitgliedern."
});
}
const body = await readBody(event);
const { id, name, email, phone, address, notes } = body;
if (!name) {
throw createError({
statusCode: 400,
message: "Name ist erforderlich."
});
}
await saveMember({
id: id || void 0,
name,
email: email || "",
phone: phone || "",
address: address || "",
notes: notes || ""
});
return {
success: true,
message: "Mitglied erfolgreich gespeichert."
};
} catch (error) {
console.error("Fehler beim Speichern des Mitglieds:", error);
throw error;
}
});
export { members_post as default };
//# sourceMappingURL=members.post.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"members.post.mjs","sources":["../../../../../server/api/members.post.js"],"sourcesContent":null,"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,qBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,IAAA;AACA,IAAA,MAAA,KAAA,GAAA,SAAA,CAAA,KAAA,EAAA,YAAA,CAAA;AAEA,IAAA,IAAA,CAAA,KAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,OAAA,GAAA,YAAA,KAAA,CAAA;AAEA,IAAA,IAAA,CAAA,OAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,OAAA,CAAA,EAAA,CAAA;AAGA,IAAA,IAAA,CAAA,IAAA,IAAA,IAAA,CAAA,SAAA,OAAA,IAAA,IAAA,CAAA,SAAA,UAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,IAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA;AACA,IAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,OAAA,KAAA,EAAA,OAAA,EAAA,OAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,IAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,OAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,UAAA,CAAA;AAAA,MACA,IAAA,EAAA,IAAA,KAAA,CAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,KAAA,IAAA,EAAA;AAAA,MACA,OAAA,KAAA,IAAA,EAAA;AAAA,MACA,SAAA,OAAA,IAAA,EAAA;AAAA,MACA,OAAA,KAAA,IAAA;AAAA,KACA,CAAA;AAEA,IAAA,OAAA;AAAA,MACA,OAAA,EAAA,IAAA;AAAA,MACA,OAAA,EAAA;AAAA,KACA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,OAAA,CAAA,KAAA,CAAA,wCAAA,KAAA,CAAA;AACA,IAAA,MAAA,KAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}

View File

@@ -272,7 +272,7 @@ async function renderInlineStyles(usedModules) {
const renderSSRHeadOptions = {"omitLineBreaks":true};
const entryFileName = "DI2PgNgB.js";
const entryFileName = "DbEmVw1_.js";
globalThis.__buildAssetsURL = buildAssetsURL;
globalThis.__publicAssetsURL = publicAssetsURL;

View File

@@ -8,14 +8,23 @@
</h1>
<div class="w-24 h-1 bg-primary-600 mb-4" />
</div>
<button
v-if="canEdit"
@click="openAddModal"
class="flex items-center px-4 py-2 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-lg transition-colors"
>
<UserPlus :size="20" class="mr-2" />
Mitglied hinzufügen
</button>
<div class="flex items-center space-x-3">
<button
@click="viewMode = viewMode === 'cards' ? 'table' : 'cards'"
class="flex items-center px-4 py-2 bg-gray-100 hover:bg-gray-200 text-gray-700 font-semibold rounded-lg transition-colors"
>
<component :is="viewMode === 'cards' ? Table2 : Grid3x3" :size="20" class="mr-2" />
{{ viewMode === 'cards' ? 'Tabelle' : 'Karten' }}
</button>
<button
v-if="canEdit"
@click="openAddModal"
class="flex items-center px-4 py-2 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-lg transition-colors"
>
<UserPlus :size="20" class="mr-2" />
Mitglied hinzufügen
</button>
</div>
</div>
<!-- Loading State -->
@@ -23,7 +32,83 @@
<Loader2 :size="40" class="animate-spin text-primary-600" />
</div>
<!-- Members List -->
<!-- Table View -->
<div v-else-if="viewMode === 'table'" class="bg-white rounded-xl shadow-lg overflow-hidden">
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Name</th>
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">E-Mail</th>
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Telefon</th>
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
<th v-if="canEdit" class="px-4 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">Aktionen</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<tr v-for="member in members" :key="member.id" class="hover:bg-gray-50">
<td class="px-4 py-3 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900">{{ member.name }}</div>
<div v-if="member.notes" class="text-xs text-gray-500">{{ member.notes }}</div>
</td>
<td class="px-4 py-3 whitespace-nowrap">
<a v-if="member.email" :href="`mailto:${member.email}`" class="text-sm text-primary-600 hover:text-primary-800">
{{ member.email }}
</a>
<span v-else class="text-sm text-gray-400">-</span>
</td>
<td class="px-4 py-3 whitespace-nowrap">
<a v-if="member.phone" :href="`tel:${member.phone}`" class="text-sm text-primary-600 hover:text-primary-800">
{{ member.phone }}
</a>
<span v-else class="text-sm text-gray-400">-</span>
</td>
<td class="px-4 py-3 whitespace-nowrap">
<div class="flex items-center space-x-2">
<span
v-if="member.hasLogin"
class="px-2 py-1 bg-green-100 text-green-800 text-xs font-medium rounded-full"
>
Login
</span>
<span
:class="member.source === 'manual' ? 'bg-blue-100 text-blue-800' : 'bg-purple-100 text-purple-800'"
class="px-2 py-1 text-xs font-medium rounded-full"
>
{{ member.source === 'manual' ? 'Manuell' : 'System' }}
</span>
</div>
</td>
<td v-if="canEdit" class="px-4 py-3 whitespace-nowrap text-right text-sm font-medium">
<div v-if="member.editable" class="flex justify-end space-x-2">
<button
@click="openEditModal(member)"
class="text-blue-600 hover:text-blue-900"
title="Bearbeiten"
>
<Edit :size="18" />
</button>
<button
@click="confirmDelete(member)"
class="text-red-600 hover:text-red-900"
title="Löschen"
>
<Trash2 :size="18" />
</button>
</div>
<span v-else class="text-gray-400 text-xs">Nicht editierbar</span>
</td>
</tr>
</tbody>
</table>
</div>
<div v-if="members.length === 0" class="text-center py-12 text-gray-500">
Keine Mitglieder gefunden.
</div>
</div>
<!-- Cards View -->
<div v-else class="space-y-4">
<div
v-for="member in members"
@@ -114,15 +199,27 @@
</h2>
<form @submit.prevent="saveMember" class="space-y-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Name *</label>
<input
v-model="formData.name"
type="text"
required
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500"
:disabled="isSaving"
/>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Vorname *</label>
<input
v-model="formData.firstName"
type="text"
required
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500"
:disabled="isSaving"
/>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Nachname *</label>
<input
v-model="formData.lastName"
type="text"
required
class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500"
:disabled="isSaving"
/>
</div>
</div>
<div>
@@ -197,7 +294,7 @@
<script setup>
import { ref, computed, onMounted } from 'vue'
import { Users, UserPlus, Mail, Phone, MapPin, FileText, Clock, Edit, Trash2, Loader2, AlertCircle } from 'lucide-vue-next'
import { Users, UserPlus, Mail, Phone, MapPin, FileText, Clock, Edit, Trash2, Loader2, AlertCircle, Table2, Grid3x3 } from 'lucide-vue-next'
const authStore = useAuthStore()
@@ -207,9 +304,11 @@ const members = ref([])
const showModal = ref(false)
const editingMember = ref(null)
const errorMessage = ref('')
const viewMode = ref('table') // 'table' or 'cards'
const formData = ref({
name: '',
firstName: '',
lastName: '',
email: '',
phone: '',
address: '',
@@ -235,7 +334,8 @@ const loadMembers = async () => {
const openAddModal = () => {
editingMember.value = null
formData.value = {
name: '',
firstName: '',
lastName: '',
email: '',
phone: '',
address: '',
@@ -248,7 +348,8 @@ const openAddModal = () => {
const openEditModal = (member) => {
editingMember.value = member
formData.value = {
name: member.name,
firstName: member.firstName || '',
lastName: member.lastName || '',
email: member.email || '',
phone: member.phone || '',
address: member.address || '',

View File

@@ -33,10 +33,12 @@ export default defineEventHandler(async (event) => {
// First, add all manual members
for (const member of manualMembers) {
const normalizedEmail = member.email?.toLowerCase().trim() || ''
const normalizedName = member.name?.toLowerCase().trim() || ''
const fullName = `${member.firstName || ''} ${member.lastName || ''}`.trim()
const normalizedName = fullName.toLowerCase()
mergedMembers.push({
...member,
name: fullName, // Computed for display
source: 'manual',
editable: true,
hasLogin: false

View File

@@ -32,18 +32,19 @@ export default defineEventHandler(async (event) => {
}
const body = await readBody(event)
const { id, name, email, phone, address, notes } = body
const { id, firstName, lastName, email, phone, address, notes } = body
if (!name) {
if (!firstName || !lastName) {
throw createError({
statusCode: 400,
message: 'Name ist erforderlich.'
message: 'Vorname und Nachname sind erforderlich.'
})
}
await saveMember({
id: id || undefined,
name,
firstName,
lastName,
email: email || '',
phone: phone || '',
address: address || '',

View File

@@ -1,7 +1,8 @@
[
{
"id": "m1",
"name": "Max Mustermann",
"firstName": "Max",
"lastName": "Mustermann",
"email": "max@example.com",
"phone": "069 123456",
"address": "Musterstraße 1, 60437 Frankfurt",
@@ -9,7 +10,8 @@
},
{
"id": "m2",
"name": "Anna Schmidt",
"firstName": "Anna",
"lastName": "Schmidt",
"email": "",
"phone": "069 234567",
"address": "Hauptstraße 5, 60437 Frankfurt",