Refactor project to use Vite: Remove Vue CLI configuration files and update package.json to integrate Vite for development and build processes. Adjust HTML structure for improved asset loading and streamline dependencies in package-lock.json.

This commit is contained in:
Torsten Schulz (local)
2026-04-08 09:03:33 +02:00
parent 99ec18c8f7
commit 597c8ceffe
56 changed files with 2282 additions and 13363 deletions

4
.eslintignore Normal file
View File

@@ -0,0 +1,4 @@
dist/
public/
node_modules/

View File

@@ -1,5 +0,0 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
};

20
index.html Normal file
View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
<title>Miriamgemeinde</title>
</head>
<body>
<noscript>
<strong>
Diese Website funktioniert leider nicht richtig, wenn JavaScript deaktiviert ist. Bitte aktivieren Sie
JavaScript, um fortzufahren.
</strong>
</noscript>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

15405
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,10 +3,12 @@
"version": "1.1.0", "version": "1.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "dev": "vite",
"build": "vue-cli-service build", "build": "vite build && npm run copy-dist",
"preview": "vite preview",
"copy-dist": "cp -r dist/* public/", "copy-dist": "cp -r dist/* public/",
"lint": "vue-cli-service lint" "lint": "eslint src --ext .js,.vue",
"lint:all": "eslint . --ext .js,.vue"
}, },
"dependencies": { "dependencies": {
"@iconoir/vue": "^7.7.0", "@iconoir/vue": "^7.7.0",
@@ -51,32 +53,28 @@
"vuex": "^4.0.2" "vuex": "^4.0.2"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.12.16", "@vitejs/plugin-vue": "^6.0.5",
"@babel/eslint-parser": "^7.12.16",
"@vue/cli": "~5.0.0",
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"crypto-browserify": "^3.12.0",
"eslint": "^8.57.0", "eslint": "^8.57.0",
"eslint-plugin-vue": "^9.23.0", "eslint-plugin-vue": "^9.23.0",
"nodemon": "^3.1.3", "nodemon": "^3.1.3",
"os-browserify": "^0.3.0", "vue-eslint-parser": "^9.4.3",
"path-browserify": "^1.0.1", "vite": "^8.0.7"
"stream-browserify": "^3.0.0",
"webpack": "^5.92.0"
}, },
"eslintConfig": { "eslintConfig": {
"root": true, "root": true,
"env": { "env": {
"browser": true,
"es2021": true,
"node": true "node": true
}, },
"extends": [ "extends": [
"plugin:vue/vue3-essential", "plugin:vue/vue3-essential",
"eslint:recommended" "eslint:recommended"
], ],
"parser": "vue-eslint-parser",
"parserOptions": { "parserOptions": {
"parser": "@babel/eslint-parser" "ecmaVersion": 2022,
"sourceType": "module"
}, },
"rules": {} "rules": {}
}, },

View File

@@ -0,0 +1 @@
import{n as e}from"./index-8qzlau4y.js";export{e as default};

View File

@@ -0,0 +1 @@
import{n as e}from"./index-CZPBEIA6.js";export{e as default};

View File

@@ -0,0 +1,2 @@
import{b as e,s as t,t as n,u as r}from"./_plugin-vue_export-helper-C3WbSyGy.js";var i={name:`DefaultComponent`};function a(n,i,a,o,s,c){return e(),r(`div`,null,[...i[0]||=[t(`h1`,null,`Seite existiert nicht`,-1),t(`p`,null,`Leider existiert die aufgerufene Seite nicht.`,-1)]])}var o=n(i,[[`render`,a],[`__scopeId`,`data-v-61f805f0`]]);export{o as default};
//# sourceMappingURL=DefaultComponent-Lxp_moRA.js.map

View File

@@ -0,0 +1 @@
div[data-v-61f805f0]{padding:20px}

View File

@@ -0,0 +1,2 @@
import{b as e,s as t,t as n,u as r}from"./_plugin-vue_export-helper-CfRVXrSo.js";var i={name:`DefaultComponent`};function a(n,i,a,o,s,c){return e(),r(`div`,null,[...i[0]||=[t(`h1`,null,`Seite existiert nicht`,-1),t(`p`,null,`Leider existiert die aufgerufene Seite nicht.`,-1)]])}var o=n(i,[[`render`,a],[`__scopeId`,`data-v-61f805f0`]]);export{o as default};
//# sourceMappingURL=DefaultComponent-u_HCtDBb.js.map

View File

@@ -0,0 +1 @@
.worship-card[data-v-1fe1f289]{gap:var(--space-4);grid-template-columns:180px 1fr;align-items:start;display:grid}@media (width<=640px){.worship-card[data-v-1fe1f289]{gap:var(--space-3);grid-template-columns:1fr}}.worship-card__left[data-v-1fe1f289]{padding:var(--space-3);color:var(--color-text);background:var(--color-bg-subtle);border:1px solid #00000014;border-radius:6px}.worship-card__date[data-v-1fe1f289]{font-weight:600}.worship-card__day[data-v-1fe1f289],.worship-card__place[data-v-1fe1f289]{margin-top:var(--space-1);color:#000000bf}.worship-card__right[data-v-1fe1f289]{min-width:0}.highlight-time[data-v-1fe1f289]{text-decoration:underline}.neighborhood-invitation[data-v-1fe1f289]{font-weight:600}a[data-v-1fe1f289]{color:var(--color-brand-primary-hover)}.internal-information[data-v-1fe1f289]{color:#a01935;font-style:italic}.stack-tight[data-v-1fe1f289]{gap:var(--space-2)}.image[data-v-f81373cb]{max-width:400px;max-height:300px}.mg-title[data-v-d13976fb]{margin-top:0}.expiry-date[data-v-124908c6]{color:var(--color-text-muted);font-size:.9em;font-style:italic}.stack-tight[data-v-124908c6]{gap:var(--space-2)}.float-list[data-v-124908c6]{gap:var(--space-3);display:grid}.float-item[data-v-124908c6]{margin:0}span[data-v-bfbab2d9]{cursor:pointer;color:#00f;text-decoration:underline}

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,2 @@
import{X as e,b as t,l as n,s as r,t as i,u as a}from"./_plugin-vue_export-helper-C3WbSyGy.js";var o={name:`DialogComponent`,props:{title:{type:String,required:!0},message:{type:String,required:!0},modelValue:{type:Boolean,default:!1}},methods:{closeDialog(){this.$emit(`update:modelValue`,!1),this.$emit(`close`)}}},s={key:0,class:`dialog-overlay`},c={class:`dialog`};function l(i,o,l,u,d,f){return l.modelValue?(t(),a(`div`,s,[r(`div`,c,[r(`h2`,null,e(l.title),1),r(`p`,null,e(l.message),1),r(`button`,{onClick:o[0]||=(...e)=>f.closeDialog&&f.closeDialog(...e)},`OK`)])])):n(``,!0)}var u=i(o,[[`render`,l],[`__scopeId`,`data-v-7743bdb5`]]);export{u as default};
//# sourceMappingURL=DialogComponent-B4C5yzRq.js.map

View File

@@ -0,0 +1 @@
.dialog-overlay[data-v-7743bdb5]{z-index:1000;background:#00000080;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:fixed;top:0;left:0}.dialog[data-v-7743bdb5]{text-align:center;background:#fff;border-radius:8px;width:90%;max-width:400px;padding:30px;box-shadow:0 4px 6px #0000001a}.dialog h2[data-v-7743bdb5]{color:#333;margin-top:0;margin-bottom:15px;font-size:20px}.dialog p[data-v-7743bdb5]{color:#666;margin:15px 0;line-height:1.5}.dialog button[data-v-7743bdb5]{color:#fff;cursor:pointer;background-color:#007bff;border:none;border-radius:4px;margin-top:20px;padding:10px 20px;font-size:16px}.dialog button[data-v-7743bdb5]:hover{background-color:#0056b3}

View File

@@ -0,0 +1,2 @@
import{X as e,b as t,l as n,s as r,t as i,u as a}from"./_plugin-vue_export-helper-CfRVXrSo.js";var o={name:`DialogComponent`,props:{title:{type:String,required:!0},message:{type:String,required:!0},modelValue:{type:Boolean,default:!1}},methods:{closeDialog(){this.$emit(`update:modelValue`,!1),this.$emit(`close`)}}},s={key:0,class:`dialog-overlay`},c={class:`dialog`};function l(i,o,l,u,d,f){return l.modelValue?(t(),a(`div`,s,[r(`div`,c,[r(`h2`,null,e(l.title),1),r(`p`,null,e(l.message),1),r(`button`,{onClick:o[0]||=(...e)=>f.closeDialog&&f.closeDialog(...e)},`OK`)])])):n(``,!0)}var u=i(o,[[`render`,l],[`__scopeId`,`data-v-7743bdb5`]]);export{u as default};
//# sourceMappingURL=DialogComponent-DSA7g7uq.js.map

View File

@@ -0,0 +1 @@
import{t as e}from"./index-8qzlau4y.js";export{e as default};

View File

@@ -0,0 +1 @@
import{t as e}from"./index-CZPBEIA6.js";export{e as default};

View File

@@ -0,0 +1 @@
.forgot-password[data-v-021070f7]{max-width:400px;margin:auto}form[data-v-021070f7]{flex-direction:column;display:flex}label[data-v-021070f7]{margin-top:10px}button[data-v-021070f7]{margin-top:20px}.dialog[data-v-021070f7]{background:#0006;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog-content[data-v-021070f7]{background:#fff;border-radius:4px;width:90%;max-width:420px;padding:16px}

View File

@@ -0,0 +1,2 @@
import{C as e,E as t,T as n,X as r,b as i,f as a,l as o,p as s,s as c,t as l,u}from"./_plugin-vue_export-helper-CfRVXrSo.js";import{a as d,r as f}from"./runtime-dom.esm-bundler-DdqN-WFI.js";import{i as p}from"./router-PO6YAHA1.js";var m={name:`ForgotPassword`,data(){return{email:``,dialogTitle:``,dialogMessage:``,dialogVisible:!1}},methods:{async submitForgotPassword(){try{let e=await p.post(`/auth/forgot-password`,{email:this.email});this.showDialog(`E-Mail gesendet`,e.data?.message||`Ein Link zum Zurücksetzen wurde an Ihre E-Mail-Adresse gesendet.`),this.email=``}catch(e){let t=e?.response?.data?.message||e?.message||`Ein unbekannter Fehler ist aufgetreten`;this.showDialog(`Fehler`,t)}},showDialog(e,t){this.dialogTitle=e,this.dialogMessage=t,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},h={class:`forgot-password`},g={key:0,class:`dialog`},_={class:`dialog-content`};function v(l,p,m,v,y,b){let x=e(`router-link`);return i(),u(`div`,h,[p[7]||=c(`h2`,null,`Passwort vergessen`,-1),c(`form`,{onSubmit:p[1]||=d((...e)=>b.submitForgotPassword&&b.submitForgotPassword(...e),[`prevent`])},[p[3]||=c(`label`,{for:`email`},`Email-Adresse:`,-1),t(c(`input`,{type:`email`,id:`email`,"onUpdate:modelValue":p[0]||=e=>y.email=e,required:``},null,512),[[f,y.email]]),p[4]||=c(`button`,{type:`submit`},`Link zum Zurücksetzen senden`,-1)],32),c(`p`,null,[s(x,{to:`/login`},{default:n(()=>[...p[5]||=[a(`Login`,-1)]]),_:1})]),c(`p`,null,[s(x,{to:`/register`},{default:n(()=>[...p[6]||=[a(`Registrieren`,-1)]]),_:1})]),y.dialogVisible?(i(),u(`div`,g,[c(`div`,_,[c(`h3`,null,r(y.dialogTitle),1),c(`p`,null,r(y.dialogMessage),1),c(`button`,{type:`button`,onClick:p[2]||=(...e)=>b.closeDialog&&b.closeDialog(...e)},`Schließen`)])])):o(``,!0)])}var y=l(m,[[`render`,v],[`__scopeId`,`data-v-021070f7`]]);export{y as default};
//# sourceMappingURL=ForgotPasswordContent-B_sOIGBk.js.map

View File

@@ -0,0 +1,2 @@
import{C as e,E as t,T as n,X as r,b as i,f as a,l as o,p as s,s as c,t as l,u}from"./_plugin-vue_export-helper-C3WbSyGy.js";import{a as d,r as f}from"./runtime-dom.esm-bundler-1ANOfYkS.js";import{i as p}from"./router-BTERIw9L.js";var m={name:`ForgotPassword`,data(){return{email:``,dialogTitle:``,dialogMessage:``,dialogVisible:!1}},methods:{async submitForgotPassword(){try{let e=await p.post(`/auth/forgot-password`,{email:this.email});this.showDialog(`E-Mail gesendet`,e.data?.message||`Ein Link zum Zurücksetzen wurde an Ihre E-Mail-Adresse gesendet.`),this.email=``}catch(e){let t=e?.response?.data?.message||e?.message||`Ein unbekannter Fehler ist aufgetreten`;this.showDialog(`Fehler`,t)}},showDialog(e,t){this.dialogTitle=e,this.dialogMessage=t,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},h={class:`forgot-password`},g={key:0,class:`dialog`},_={class:`dialog-content`};function v(l,p,m,v,y,b){let x=e(`router-link`);return i(),u(`div`,h,[p[7]||=c(`h2`,null,`Passwort vergessen`,-1),c(`form`,{onSubmit:p[1]||=d((...e)=>b.submitForgotPassword&&b.submitForgotPassword(...e),[`prevent`])},[p[3]||=c(`label`,{for:`email`},`Email-Adresse:`,-1),t(c(`input`,{type:`email`,id:`email`,"onUpdate:modelValue":p[0]||=e=>y.email=e,required:``},null,512),[[f,y.email]]),p[4]||=c(`button`,{type:`submit`},`Link zum Zurücksetzen senden`,-1)],32),c(`p`,null,[s(x,{to:`/login`},{default:n(()=>[...p[5]||=[a(`Login`,-1)]]),_:1})]),c(`p`,null,[s(x,{to:`/register`},{default:n(()=>[...p[6]||=[a(`Registrieren`,-1)]]),_:1})]),y.dialogVisible?(i(),u(`div`,g,[c(`div`,_,[c(`h3`,null,r(y.dialogTitle),1),c(`p`,null,r(y.dialogMessage),1),c(`button`,{type:`button`,onClick:p[2]||=(...e)=>b.closeDialog&&b.closeDialog(...e)},`Schließen`)])])):o(``,!0)])}var y=l(m,[[`render`,v],[`__scopeId`,`data-v-021070f7`]]);export{y as default};
//# sourceMappingURL=ForgotPasswordContent-CrBybA-U.js.map

View File

@@ -0,0 +1,2 @@
import{b as e,s as t,t as n,u as r}from"./_plugin-vue_export-helper-CfRVXrSo.js";import{i}from"./vuex.esm-bundler-DEh690_n.js";var a={name:`ImageContent`,data(){return{defaultImage:`/images/homepage1.png`,currentImage:`/images/homepage1.png`}},computed:{...i([`menuData`])},watch:{$route:{immediate:!0,handler(){this.updateImage()}}},methods:{updateImage(){let e=this.$route.path,t=this.menuData,n=this.findMenuItemByPath(t,e);n&&n.image?this.currentImage=`/images/${n.image}`:this.currentImage=this.defaultImage},findMenuItemByPath(e,t){for(let n of e){if(n.link===t)return n;if(n.submenu){let e=this.findMenuItemByPath(n.submenu,t);if(e)return e}}return null}}},o={class:`side-image`},s=[`src`];function c(n,i,a,c,l,u){return e(),r(`div`,o,[t(`img`,{src:l.currentImage,alt:``},null,8,s)])}var l=n(a,[[`render`,c],[`__scopeId`,`data-v-08127df6`]]);export{l as default};
//# sourceMappingURL=ImageContent-BU6p-f2y.js.map

View File

@@ -0,0 +1,2 @@
import{b as e,s as t,t as n,u as r}from"./_plugin-vue_export-helper-C3WbSyGy.js";import{i}from"./vuex.esm-bundler-6KYrHs9b.js";var a={name:`ImageContent`,data(){return{defaultImage:`/images/homepage1.png`,currentImage:`/images/homepage1.png`}},computed:{...i([`menuData`])},watch:{$route:{immediate:!0,handler(){this.updateImage()}}},methods:{updateImage(){let e=this.$route.path,t=this.menuData,n=this.findMenuItemByPath(t,e);n&&n.image?this.currentImage=`/images/${n.image}`:this.currentImage=this.defaultImage},findMenuItemByPath(e,t){for(let n of e){if(n.link===t)return n;if(n.submenu){let e=this.findMenuItemByPath(n.submenu,t);if(e)return e}}return null}}},o={class:`side-image`},s=[`src`];function c(n,i,a,c,l,u){return e(),r(`div`,o,[t(`img`,{src:l.currentImage,alt:``},null,8,s)])}var l=n(a,[[`render`,c],[`__scopeId`,`data-v-08127df6`]]);export{l as default};
//# sourceMappingURL=ImageContent-CvUcQfvK.js.map

View File

@@ -0,0 +1 @@
.side-image[data-v-08127df6]{aspect-ratio:4/3;background:var(--color-bg-subtle);width:100%;overflow:hidden}.side-image img[data-v-08127df6]{object-fit:cover;width:100%;height:100%;display:block}

View File

@@ -0,0 +1,2 @@
import{t as e}from"./axios-BolLiDn6.js";import{C as t,E as n,T as r,b as i,f as a,p as o,s,t as c,u as l}from"./_plugin-vue_export-helper-C3WbSyGy.js";import{a as u,r as d}from"./runtime-dom.esm-bundler-1ANOfYkS.js";import{n as f}from"./vuex.esm-bundler-6KYrHs9b.js";import p from"./DialogComponent-B4C5yzRq.js";var m={name:`LoginComponent`,components:{DialogComponent:p},data(){return{email:``,password:``,dialogTitle:``,dialogMessage:``,dialogVisible:!1}},methods:{...f([`login`]),async runLogin(){try{let t=await e.post(`/auth/login`,{email:this.email,password:this.password}),n=t.data.token,r=t.data;localStorage.setItem(`token`,n),this.login(r.user),e.defaults.headers.common.Authorization=`Bearer ${n}`,this.$router.push(`/admin/index`)}catch(e){e.response?this.showDialog(`Fehler`,e.response.data.message):this.showDialog(`Ein Fehler ist aufgetreten`,e.message)}},showDialog(e,t){this.dialogTitle=e,this.dialogMessage=t,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},h={class:`login`};function g(e,c,f,p,m,g){let _=t(`router-link`),v=t(`DialogComponent`);return i(),l(`div`,h,[c[9]||=s(`h2`,null,`Login`,-1),s(`form`,{onSubmit:c[2]||=u((...e)=>g.runLogin&&g.runLogin(...e),[`prevent`])},[c[4]||=s(`label`,{for:`email`},`Email-Adresse:`,-1),n(s(`input`,{type:`email`,id:`email`,"onUpdate:modelValue":c[0]||=e=>m.email=e,required:``},null,512),[[d,m.email]]),c[5]||=s(`label`,{for:`password`},`Passwort:`,-1),n(s(`input`,{type:`password`,id:`password`,"onUpdate:modelValue":c[1]||=e=>m.password=e,required:``},null,512),[[d,m.password]]),c[6]||=s(`button`,{type:`submit`},`Login`,-1)],32),s(`p`,null,[o(_,{to:`/register`},{default:r(()=>[...c[7]||=[a(`Registrieren`,-1)]]),_:1})]),s(`p`,null,[o(_,{to:`/forgot-password`},{default:r(()=>[...c[8]||=[a(`Passwort vergessen?`,-1)]]),_:1})]),o(v,{title:m.dialogTitle,message:m.dialogMessage,modelValue:m.dialogVisible,"onUpdate:modelValue":c[3]||=e=>m.dialogVisible=e,onClose:g.closeDialog},null,8,[`title`,`message`,`modelValue`,`onClose`])])}var _=c(m,[[`render`,g],[`__scopeId`,`data-v-5eeff340`]]);export{_ as default};
//# sourceMappingURL=LoginContent-A0o_QTnr.js.map

View File

@@ -0,0 +1,2 @@
import{t as e}from"./axios-DHQprbt3.js";import{C as t,E as n,T as r,b as i,f as a,p as o,s,t as c,u as l}from"./_plugin-vue_export-helper-CfRVXrSo.js";import{a as u,r as d}from"./runtime-dom.esm-bundler-DdqN-WFI.js";import{n as f}from"./vuex.esm-bundler-DEh690_n.js";import p from"./DialogComponent-DSA7g7uq.js";var m={name:`LoginComponent`,components:{DialogComponent:p},data(){return{email:``,password:``,dialogTitle:``,dialogMessage:``,dialogVisible:!1}},methods:{...f([`login`]),async runLogin(){try{let t=await e.post(`/auth/login`,{email:this.email,password:this.password}),n=t.data.token,r=t.data;localStorage.setItem(`token`,n),this.login(r.user),e.defaults.headers.common.Authorization=`Bearer ${n}`,this.$router.push(`/admin/index`)}catch(e){e.response?this.showDialog(`Fehler`,e.response.data.message):this.showDialog(`Ein Fehler ist aufgetreten`,e.message)}},showDialog(e,t){this.dialogTitle=e,this.dialogMessage=t,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},h={class:`login`};function g(e,c,f,p,m,g){let _=t(`router-link`),v=t(`DialogComponent`);return i(),l(`div`,h,[c[9]||=s(`h2`,null,`Login`,-1),s(`form`,{onSubmit:c[2]||=u((...e)=>g.runLogin&&g.runLogin(...e),[`prevent`])},[c[4]||=s(`label`,{for:`email`},`Email-Adresse:`,-1),n(s(`input`,{type:`email`,id:`email`,"onUpdate:modelValue":c[0]||=e=>m.email=e,required:``},null,512),[[d,m.email]]),c[5]||=s(`label`,{for:`password`},`Passwort:`,-1),n(s(`input`,{type:`password`,id:`password`,"onUpdate:modelValue":c[1]||=e=>m.password=e,required:``},null,512),[[d,m.password]]),c[6]||=s(`button`,{type:`submit`},`Login`,-1)],32),s(`p`,null,[o(_,{to:`/register`},{default:r(()=>[...c[7]||=[a(`Registrieren`,-1)]]),_:1})]),s(`p`,null,[o(_,{to:`/forgot-password`},{default:r(()=>[...c[8]||=[a(`Passwort vergessen?`,-1)]]),_:1})]),o(v,{title:m.dialogTitle,message:m.dialogMessage,modelValue:m.dialogVisible,"onUpdate:modelValue":c[3]||=e=>m.dialogVisible=e,onClose:g.closeDialog},null,8,[`title`,`message`,`modelValue`,`onClose`])])}var _=c(m,[[`render`,g],[`__scopeId`,`data-v-5eeff340`]]);export{_ as default};
//# sourceMappingURL=LoginContent-CbnUGy_P.js.map

View File

@@ -0,0 +1 @@
.login[data-v-5eeff340]{max-width:400px;margin:auto}form[data-v-5eeff340]{flex-direction:column;display:flex}label[data-v-5eeff340]{margin-top:10px}button[data-v-5eeff340]{margin-top:20px}

View File

@@ -0,0 +1 @@
import{r as e}from"./index-8qzlau4y.js";export{e as default};

View File

@@ -0,0 +1 @@
import{r as e}from"./index-CZPBEIA6.js";export{e as default};

View File

@@ -0,0 +1 @@
.register[data-v-70d90412]{max-width:400px;margin:auto}form[data-v-70d90412]{flex-direction:column;display:flex}label[data-v-70d90412]{margin-top:10px}button[data-v-70d90412]{margin-top:20px}.dialog[data-v-70d90412]{background:#0006;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog-content[data-v-70d90412]{background:#fff;border-radius:4px;width:90%;max-width:420px;padding:16px}

View File

@@ -0,0 +1,2 @@
import{C as e,E as t,T as n,X as r,b as i,f as a,l as o,p as s,s as c,t as l,u}from"./_plugin-vue_export-helper-CfRVXrSo.js";import{a as d,r as f}from"./runtime-dom.esm-bundler-DdqN-WFI.js";import{i as p}from"./router-PO6YAHA1.js";var m={name:`RegisterComponent`,components:{},data(){return{name:``,email:``,password:``,dialogTitle:``,dialogMessage:``,dialogVisible:!1}},methods:{async register(){try{let e=await p.post(`/auth/register`,{name:this.name,email:this.email,password:this.password});this.showDialog(`Registrierung erfolgreich`,e.data?.message||`Ihr Konto wurde erfolgreich erstellt.`),this.name=``,this.email=``,this.password=``}catch(e){let t=e?.response?.data?.message||e?.message||`Ein unbekannter Fehler ist aufgetreten`;this.showDialog(`Fehler`,t)}},showDialog(e,t){this.dialogTitle=e,this.dialogMessage=t,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},h={class:`register`},g={key:0,class:`dialog`},_={class:`dialog-content`};function v(l,p,m,v,y,b){let x=e(`router-link`);return i(),u(`div`,h,[p[11]||=c(`h2`,null,`Registrieren`,-1),c(`form`,{onSubmit:p[3]||=d((...e)=>b.register&&b.register(...e),[`prevent`])},[p[5]||=c(`label`,{for:`name`},`Name:`,-1),t(c(`input`,{type:`text`,id:`name`,"onUpdate:modelValue":p[0]||=e=>y.name=e,required:``},null,512),[[f,y.name]]),p[6]||=c(`label`,{for:`email`},`Email-Adresse:`,-1),t(c(`input`,{type:`email`,id:`email`,"onUpdate:modelValue":p[1]||=e=>y.email=e,required:``},null,512),[[f,y.email]]),p[7]||=c(`label`,{for:`password`},`Passwort:`,-1),t(c(`input`,{type:`password`,id:`password`,"onUpdate:modelValue":p[2]||=e=>y.password=e,required:``},null,512),[[f,y.password]]),p[8]||=c(`button`,{type:`submit`},`Registrieren`,-1)],32),c(`p`,null,[s(x,{to:`/login`},{default:n(()=>[...p[9]||=[a(`Login`,-1)]]),_:1})]),c(`p`,null,[s(x,{to:`/forgot-password`},{default:n(()=>[...p[10]||=[a(`Passwort vergessen?`,-1)]]),_:1})]),y.dialogVisible?(i(),u(`div`,g,[c(`div`,_,[c(`h3`,null,r(y.dialogTitle),1),c(`p`,null,r(y.dialogMessage),1),c(`button`,{type:`button`,onClick:p[4]||=(...e)=>b.closeDialog&&b.closeDialog(...e)},`Schließen`)])])):o(``,!0)])}var y=l(m,[[`render`,v],[`__scopeId`,`data-v-70d90412`]]);export{y as default};
//# sourceMappingURL=RegisterContent-DVTkRNap.js.map

View File

@@ -0,0 +1,2 @@
import{C as e,E as t,T as n,X as r,b as i,f as a,l as o,p as s,s as c,t as l,u}from"./_plugin-vue_export-helper-C3WbSyGy.js";import{a as d,r as f}from"./runtime-dom.esm-bundler-1ANOfYkS.js";import{i as p}from"./router-BTERIw9L.js";var m={name:`RegisterComponent`,components:{},data(){return{name:``,email:``,password:``,dialogTitle:``,dialogMessage:``,dialogVisible:!1}},methods:{async register(){try{let e=await p.post(`/auth/register`,{name:this.name,email:this.email,password:this.password});this.showDialog(`Registrierung erfolgreich`,e.data?.message||`Ihr Konto wurde erfolgreich erstellt.`),this.name=``,this.email=``,this.password=``}catch(e){let t=e?.response?.data?.message||e?.message||`Ein unbekannter Fehler ist aufgetreten`;this.showDialog(`Fehler`,t)}},showDialog(e,t){this.dialogTitle=e,this.dialogMessage=t,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},h={class:`register`},g={key:0,class:`dialog`},_={class:`dialog-content`};function v(l,p,m,v,y,b){let x=e(`router-link`);return i(),u(`div`,h,[p[11]||=c(`h2`,null,`Registrieren`,-1),c(`form`,{onSubmit:p[3]||=d((...e)=>b.register&&b.register(...e),[`prevent`])},[p[5]||=c(`label`,{for:`name`},`Name:`,-1),t(c(`input`,{type:`text`,id:`name`,"onUpdate:modelValue":p[0]||=e=>y.name=e,required:``},null,512),[[f,y.name]]),p[6]||=c(`label`,{for:`email`},`Email-Adresse:`,-1),t(c(`input`,{type:`email`,id:`email`,"onUpdate:modelValue":p[1]||=e=>y.email=e,required:``},null,512),[[f,y.email]]),p[7]||=c(`label`,{for:`password`},`Passwort:`,-1),t(c(`input`,{type:`password`,id:`password`,"onUpdate:modelValue":p[2]||=e=>y.password=e,required:``},null,512),[[f,y.password]]),p[8]||=c(`button`,{type:`submit`},`Registrieren`,-1)],32),c(`p`,null,[s(x,{to:`/login`},{default:n(()=>[...p[9]||=[a(`Login`,-1)]]),_:1})]),c(`p`,null,[s(x,{to:`/forgot-password`},{default:n(()=>[...p[10]||=[a(`Passwort vergessen?`,-1)]]),_:1})]),y.dialogVisible?(i(),u(`div`,g,[c(`div`,_,[c(`h3`,null,r(y.dialogTitle),1),c(`p`,null,r(y.dialogMessage),1),c(`button`,{type:`button`,onClick:p[4]||=(...e)=>b.closeDialog&&b.closeDialog(...e)},`Schließen`)])])):o(``,!0)])}var y=l(m,[[`render`,v],[`__scopeId`,`data-v-70d90412`]]);export{y as default};
//# sourceMappingURL=RegisterContent-sqCLJsFP.js.map

View File

@@ -0,0 +1,2 @@
import{C as e,E as t,T as n,X as r,b as i,f as a,l as o,p as s,s as c,t as l,u}from"./_plugin-vue_export-helper-CfRVXrSo.js";import{a as d,r as f}from"./runtime-dom.esm-bundler-DdqN-WFI.js";import{i as p}from"./router-PO6YAHA1.js";var m={name:`ResetPasswordComponent`,data(){return{password:``,confirmPassword:``,token:``,dialogTitle:``,dialogMessage:``,dialogVisible:!1}},computed:{isFormValid(){return this.password.length>=6&&this.password===this.confirmPassword&&this.token}},mounted(){this.token=new URLSearchParams(window.location.search).get(`token`),this.token||this.showDialog(`Fehler`,`Ungültiger Reset-Link. Bitte fordern Sie einen neuen Link an.`)},methods:{async submitResetPassword(){if(this.password!==this.confirmPassword){this.showDialog(`Fehler`,`Die Passwörter stimmen nicht überein.`);return}try{let e=await p.post(`/auth/reset-password`,{token:this.token,password:this.password});this.showDialog(`Erfolg`,e.data?.message||`Passwort erfolgreich zurückgesetzt. Sie können sich jetzt anmelden.`),this.password=``,this.confirmPassword=``,setTimeout(()=>{this.$router.push(`/auth/login`)},3e3)}catch(e){let t=e?.response?.data?.message||e?.message||`Ein unbekannter Fehler ist aufgetreten`;this.showDialog(`Fehler`,t)}},showDialog(e,t){this.dialogTitle=e,this.dialogMessage=t,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},h={class:`reset-password`},g=[`disabled`],_={key:0,class:`dialog`},v={class:`dialog-content`};function y(l,p,m,y,b,x){let S=e(`router-link`);return i(),u(`div`,h,[p[7]||=c(`h2`,null,`Neues Passwort setzen`,-1),c(`form`,{onSubmit:p[2]||=d((...e)=>x.submitResetPassword&&x.submitResetPassword(...e),[`prevent`])},[p[4]||=c(`label`,{for:`password`},`Neues Passwort:`,-1),t(c(`input`,{type:`password`,id:`password`,"onUpdate:modelValue":p[0]||=e=>b.password=e,required:``,minlength:`6`},null,512),[[f,b.password]]),p[5]||=c(`label`,{for:`confirmPassword`},`Passwort bestätigen:`,-1),t(c(`input`,{type:`password`,id:`confirmPassword`,"onUpdate:modelValue":p[1]||=e=>b.confirmPassword=e,required:``,minlength:`6`},null,512),[[f,b.confirmPassword]]),c(`button`,{type:`submit`,disabled:!x.isFormValid},`Passwort zurücksetzen`,8,g)],32),c(`p`,null,[s(S,{to:`/login`},{default:n(()=>[...p[6]||=[a(`Zurück zum Login`,-1)]]),_:1})]),b.dialogVisible?(i(),u(`div`,_,[c(`div`,v,[c(`h3`,null,r(b.dialogTitle),1),c(`p`,null,r(b.dialogMessage),1),c(`button`,{type:`button`,onClick:p[3]||=(...e)=>x.closeDialog&&x.closeDialog(...e)},`Schließen`)])])):o(``,!0)])}var b=l(m,[[`render`,y],[`__scopeId`,`data-v-3a4e9538`]]);export{b as default};
//# sourceMappingURL=ResetPasswordContent-CP3VIRUx.js.map

View File

@@ -0,0 +1,2 @@
import{C as e,E as t,T as n,X as r,b as i,f as a,l as o,p as s,s as c,t as l,u}from"./_plugin-vue_export-helper-C3WbSyGy.js";import{a as d,r as f}from"./runtime-dom.esm-bundler-1ANOfYkS.js";import{i as p}from"./router-BTERIw9L.js";var m={name:`ResetPasswordComponent`,data(){return{password:``,confirmPassword:``,token:``,dialogTitle:``,dialogMessage:``,dialogVisible:!1}},computed:{isFormValid(){return this.password.length>=6&&this.password===this.confirmPassword&&this.token}},mounted(){this.token=new URLSearchParams(window.location.search).get(`token`),this.token||this.showDialog(`Fehler`,`Ungültiger Reset-Link. Bitte fordern Sie einen neuen Link an.`)},methods:{async submitResetPassword(){if(this.password!==this.confirmPassword){this.showDialog(`Fehler`,`Die Passwörter stimmen nicht überein.`);return}try{let e=await p.post(`/auth/reset-password`,{token:this.token,password:this.password});this.showDialog(`Erfolg`,e.data?.message||`Passwort erfolgreich zurückgesetzt. Sie können sich jetzt anmelden.`),this.password=``,this.confirmPassword=``,setTimeout(()=>{this.$router.push(`/auth/login`)},3e3)}catch(e){let t=e?.response?.data?.message||e?.message||`Ein unbekannter Fehler ist aufgetreten`;this.showDialog(`Fehler`,t)}},showDialog(e,t){this.dialogTitle=e,this.dialogMessage=t,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},h={class:`reset-password`},g=[`disabled`],_={key:0,class:`dialog`},v={class:`dialog-content`};function y(l,p,m,y,b,x){let S=e(`router-link`);return i(),u(`div`,h,[p[7]||=c(`h2`,null,`Neues Passwort setzen`,-1),c(`form`,{onSubmit:p[2]||=d((...e)=>x.submitResetPassword&&x.submitResetPassword(...e),[`prevent`])},[p[4]||=c(`label`,{for:`password`},`Neues Passwort:`,-1),t(c(`input`,{type:`password`,id:`password`,"onUpdate:modelValue":p[0]||=e=>b.password=e,required:``,minlength:`6`},null,512),[[f,b.password]]),p[5]||=c(`label`,{for:`confirmPassword`},`Passwort bestätigen:`,-1),t(c(`input`,{type:`password`,id:`confirmPassword`,"onUpdate:modelValue":p[1]||=e=>b.confirmPassword=e,required:``,minlength:`6`},null,512),[[f,b.confirmPassword]]),c(`button`,{type:`submit`,disabled:!x.isFormValid},`Passwort zurücksetzen`,8,g)],32),c(`p`,null,[s(S,{to:`/login`},{default:n(()=>[...p[6]||=[a(`Zurück zum Login`,-1)]]),_:1})]),b.dialogVisible?(i(),u(`div`,_,[c(`div`,v,[c(`h3`,null,r(b.dialogTitle),1),c(`p`,null,r(b.dialogMessage),1),c(`button`,{type:`button`,onClick:p[3]||=(...e)=>x.closeDialog&&x.closeDialog(...e)},`Schließen`)])])):o(``,!0)])}var b=l(m,[[`render`,y],[`__scopeId`,`data-v-3a4e9538`]]);export{b as default};
//# sourceMappingURL=ResetPasswordContent-DY9ojRNh.js.map

View File

@@ -0,0 +1 @@
.reset-password[data-v-3a4e9538]{max-width:400px;margin:auto}form[data-v-3a4e9538]{flex-direction:column;display:flex}label[data-v-3a4e9538]{margin-top:10px}input[data-v-3a4e9538]{border:1px solid #ddd;border-radius:4px;margin-top:5px;padding:8px}button[data-v-3a4e9538]{color:#fff;cursor:pointer;background-color:#007bff;border:none;border-radius:4px;margin-top:20px;padding:10px}button[data-v-3a4e9538]:disabled{cursor:not-allowed;background-color:#ccc}.dialog[data-v-3a4e9538]{background:#0006;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog-content[data-v-3a4e9538]{background:#fff;border-radius:4px;width:90%;max-width:420px;padding:16px}

View File

@@ -0,0 +1 @@
.service-unavailable[data-v-73264a8d]{padding:20px}.hint[data-v-73264a8d]{color:#444;margin-top:1rem}

View File

@@ -0,0 +1,2 @@
import{X as e,b as t,s as n,t as r,u as i}from"./_plugin-vue_export-helper-C3WbSyGy.js";import{r as a}from"./vuex.esm-bundler-6KYrHs9b.js";var o={name:`ServiceUnavailableComponent`,computed:{...a([`menuLoadError`]),message(){return this.menuLoadError||`Die Website ist vorübergehend nicht vollständig erreichbar.`}}},s={class:`service-unavailable`};function c(r,a,o,c,l,u){return t(),i(`div`,s,[a[0]||=n(`h1`,null,`Vorübergehend nicht erreichbar`,-1),n(`p`,null,e(u.message),1),a[1]||=n(`p`,{class:`hint`},` Es liegt vermutlich ein technisches Problem vor (z.\xA0B. die Datenbank). Bitte laden Sie die Seite in einigen Minuten erneut. `,-1)])}var l=r(o,[[`render`,c],[`__scopeId`,`data-v-73264a8d`]]);export{l as default};
//# sourceMappingURL=ServiceUnavailableComponent-BYKXQilo.js.map

View File

@@ -0,0 +1,2 @@
import{X as e,b as t,s as n,t as r,u as i}from"./_plugin-vue_export-helper-CfRVXrSo.js";import{r as a}from"./vuex.esm-bundler-DEh690_n.js";var o={name:`ServiceUnavailableComponent`,computed:{...a([`menuLoadError`]),message(){return this.menuLoadError||`Die Website ist vorübergehend nicht vollständig erreichbar.`}}},s={class:`service-unavailable`};function c(r,a,o,c,l,u){return t(),i(`div`,s,[a[0]||=n(`h1`,null,`Vorübergehend nicht erreichbar`,-1),n(`p`,null,e(u.message),1),a[1]||=n(`p`,{class:`hint`},` Es liegt vermutlich ein technisches Problem vor (z.\xA0B. die Datenbank). Bitte laden Sie die Seite in einigen Minuten erneut. `,-1)])}var l=r(o,[[`render`,c],[`__scopeId`,`data-v-73264a8d`]]);export{l as default};
//# sourceMappingURL=ServiceUnavailableComponent-Ce7AklUd.js.map

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

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

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

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

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

@@ -2,10 +2,17 @@
<html lang="de"> <html lang="de">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1" /> <meta name="viewport" content="width=device-width,initial-scale=1" />
<link rel="icon" href="<%= BASE_URL %>favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<title><%= htmlWebpackPlugin.options.title %></title> <title>Miriamgemeinde</title>
<script type="module" crossorigin src="/assets/index-8qzlau4y.js"></script>
<link rel="modulepreload" crossorigin href="/assets/_plugin-vue_export-helper-CfRVXrSo.js">
<link rel="modulepreload" crossorigin href="/assets/axios-DHQprbt3.js">
<link rel="modulepreload" crossorigin href="/assets/vuex.esm-bundler-DEh690_n.js">
<link rel="modulepreload" crossorigin href="/assets/vue-router-qDNOCMCn.js">
<link rel="modulepreload" crossorigin href="/assets/router-PO6YAHA1.js">
<link rel="modulepreload" crossorigin href="/assets/runtime-dom.esm-bundler-DdqN-WFI.js">
<link rel="stylesheet" crossorigin href="/assets/index-DoqdRJqa.css">
</head> </head>
<body> <body>
<noscript> <noscript>
@@ -17,3 +24,4 @@
<div id="app"></div> <div id="app"></div>
</body> </body>
</html> </html>

35
vite.config.js Normal file
View File

@@ -0,0 +1,35 @@
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { fileURLToPath, URL } from 'node:url';
// Vite: wir halten es erstmal möglichst nah an der bisherigen Vue-CLI-Dev-Experience.
// - Dev-Proxy /api -> Backend
// - Build nach dist/ (wie gewohnt), danach copy-dist -> public/ (bestehender Deploy-Flow)
export default defineConfig(({ mode }) => {
const backendTarget = process.env.VITE_BACKEND_PROXY || 'http://torstens:3010';
return {
plugins: [vue()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
server: {
host: 'localhost',
port: Number(process.env.VITE_FRONTEND_PORT || process.env.FRONTEND_PORT || 8080),
proxy: {
'/api': {
target: backendTarget,
changeOrigin: true,
secure: false,
},
},
},
build: {
outDir: 'dist',
sourcemap: true,
},
};
});

View File

@@ -1,60 +0,0 @@
const { defineConfig } = require('@vue/cli-service');
const webpack = require('webpack');
module.exports = defineConfig({
transpileDependencies: [],
devServer: {
host: 'localhost',
// Port kann über VUE_APP_FRONTEND_PORT oder FRONTEND_PORT in .env gesetzt werden
port: parseInt(process.env.VUE_APP_FRONTEND_PORT || process.env.FRONTEND_PORT || '8080', 10),
// Proxy für API-Requests zum Backend-Server
// Backend sollte auf einem anderen Port laufen (z.B. 3010)
proxy: {
'/api': {
target: process.env.VUE_APP_BACKEND_PROXY || 'http://torstens:3010',
changeOrigin: true,
secure: false,
logLevel: 'debug',
// Erhöhe Header-Limits für Proxy
headers: {
'Connection': 'keep-alive'
},
// Erhöhe Timeout für große Requests
timeout: 60000
}
}
},
configureWebpack: {
output: { clean: true },
cache: false,
resolve: {
fallback: {
"path": require.resolve("path-browserify"),
"os": require.resolve("os-browserify/browser"),
"crypto": require.resolve("crypto-browserify"),
"stream": require.resolve("stream-browserify"),
"vm": require.resolve("vm-browserify"),
}
},
plugins: [
new webpack.DefinePlugin({
'process.env.CUSTOM_VAR': JSON.stringify(process.env.CUSTOM_VAR)
})
],
},
chainWebpack: config => {
const rules = ['vue','js','ts','tsx','css','scss','sass','less','stylus'];
rules.forEach(rule => {
try {
config.module.rule(rule).uses.delete('cache-loader');
} catch {
/* Regel existiert nicht in dieser Konfiguration */
}
try {
config.module.rule(rule).uses.delete('thread-loader');
} catch {
/* s. o. */
}
});
}
});