Compare commits

36 Commits

Author SHA1 Message Date
5f5fb83e9a Merge pull request 'Update dependency jsonwebtoken to v9.0.3' (#3) from renovate/jsonwebtoken-9.x-lockfile into main
Reviewed-on: #3
2025-12-19 16:14:10 +01:00
f15598b2c1 Merge pull request 'Update dependency body-parser to v1.20.4' (#2) from renovate/body-parser-1.x-lockfile into main
Reviewed-on: #2
2025-12-19 16:14:02 +01:00
979732d545 Update dependency jsonwebtoken to v9.0.3 2025-12-19 16:12:32 +01:00
d9e0b07f0c Update dependency body-parser to v1.20.4 2025-12-19 16:12:24 +01:00
b5ac5df38d Merge pull request 'Configure Renovate' (#1) from renovate/configure into main
Reviewed-on: #1
2025-12-19 16:09:02 +01:00
c982f34823 Add renovate.json 2025-12-19 15:58:37 +01:00
Torsten Schulz (local)
c390228ed9 Update database configuration and improve WorshipRender component: Change database connection details to use 'miriamgemeinde' and 'localhost', and enhance conditional rendering in WorshipRender.vue for better handling of event place information. 2025-11-23 00:32:23 +01:00
Torsten Schulz (local)
9c924071f4 Update package-lock.json and configuration files: Upgrade lockfile version to 3, update @vue/cli-plugin-babel and @vue/cli-plugin-eslint to version 5.0.0, and change database connection details to use 'miriam_user' and host 'tsschulz.de' with the new password. 2025-11-23 00:24:05 +01:00
Torsten Schulz (local)
2d1ed43312 Refactor babel.config.js: Simplify Babel preset configuration by using the package name instead of a direct path for improved readability and maintainability. 2025-11-22 23:37:34 +01:00
Torsten Schulz (local)
11cf961ed8 Update package.json: Upgrade @vue/cli-plugin-babel and @vue/cli-plugin-eslint to version 5.0.0, removing the previous version 3.12.1 for better compatibility. 2025-11-22 23:33:04 +01:00
Torsten Schulz (local)
cd9e645941 Update babel.config.js: Use direct path for Babel preset to ensure reliable resolution across different Node/npm versions. 2025-11-22 23:29:40 +01:00
Torsten Schulz (local)
7bd236aa82 Update package.json: Re-add @vue/cli-plugin-babel dependency to version 3.12.1 in devDependencies. 2025-11-22 23:24:53 +01:00
Torsten Schulz (local)
f96e0a1f22 Update package dependencies: Downgrade @vue/cli and its plugins to version 4.2.2 and 3.12.1 respectively, and update various Babel packages to version 7.28.5. Remove unused Apollo packages and add new dependencies for vue-jscodeshift-adapter and vue-sfc-descriptor-to-string. 2025-11-22 23:17:23 +01:00
Torsten Schulz (local)
45190ed7a5 Füge eine Überprüfung hinzu, um endlose Wiederholungen beim Laden von Menü-Daten zu verhindern: Implementiere eine Flagge, die sicherstellt, dass die Menü-Daten nur einmal geladen werden, bevor die Routen generiert werden. 2025-11-22 22:47:51 +01:00
Torsten Schulz (local)
79f2ca8382 Füge eine Überprüfung hinzu, um endlose Wiederholungen beim Laden von Menü-Daten zu verhindern: Implementiere eine Flagge, die sicherstellt, dass die Menü-Daten nur einmal geladen werden, bevor die Routen generiert werden. 2025-11-22 22:31:28 +01:00
Torsten Schulz (local)
550ed97a11 Aktualisiere die Axios-Konfiguration: Setze die Basis-URL standardmäßig auf '/api' und ermögliche die Verwendung einer Umgebungsvariablen in Entwicklungsumgebungen. Verhindere Mixed-Content-Probleme durch Umstellung auf HTTPS. Ändere den Import von Axios im Store, um die neue Konfiguration zu nutzen. 2025-11-22 22:23:08 +01:00
Torsten Schulz (local)
718bcabea3 Verbessere die Axios-Konfiguration: Setze die Basis-URL dynamisch basierend auf der Umgebung und verhindere Mixed-Content-Probleme durch Umstellung auf HTTPS. Aktualisiere die Menü-Datenabfrage, um Axios für den API-Zugriff zu verwenden und füge Fehlerbehandlung hinzu. 2025-11-22 22:16:50 +01:00
Torsten Schulz (local)
44c978f21e Füge Import- und Exportfunktionen für Gottesdienste hinzu: Implementiere die Möglichkeit, Gottesdienste aus .doc und .docx-Dateien zu importieren und in verschiedenen Formaten zu exportieren. Verbessere die Benutzeroberfläche des Worship Management-Formulars mit neuen Schaltflächen für Import und Export sowie Dialogen zur Bearbeitung importierter Daten. Aktualisiere die Datenbankstruktur, um neue Felder für die Genehmigung und das Orgelspiel zu unterstützen. 2025-11-22 22:07:36 +01:00
Torsten Schulz (local)
6c54bc9d49 Aktualisiere die Datenschutzerklärung und die Nutzungsbedingungen: Präzisiere die rechtlichen Grundlagen für den Datenschutz, füge eine detaillierte Auflistung der Nutzerrechte hinzu und aktualisiere das Datum der Datenschutzerklärung auf Januar 2025. 2025-10-27 09:35:09 +01:00
Torsten Schulz (local)
d4fab1ceb3 Füge Ablaufdatum zu Kontaktpersonen hinzu: Implementiere die Möglichkeit, ein Ablaufdatum für Kontaktpersonen zu speichern und anzuzeigen. Aktualisiere die Filterlogik, um nur nicht abgelaufene Kontaktpersonen anzuzeigen, und passe die Benutzeroberfläche an, um das Ablaufdatum darzustellen. 2025-10-07 17:45:45 +02:00
Torsten Schulz (local)
ead4dbdd3f Ändere die Hintergrundfarbe aktiver Schaltflächen im EditPagesComponent von grün zu dunkelgrau, um die Sichtbarkeit zu verbessern und ein einheitlicheres Design zu gewährleisten. 2025-10-07 17:40:33 +02:00
Torsten Schulz (local)
b18c911500 Verbessere die Benutzeroberfläche des EditPagesComponent: Füge aktive Klassen zu Schaltflächen hinzu, um den aktuellen Status der Textformatierungen anzuzeigen. Aktualisiere die Stile für aktive Schaltflächen zur besseren Sichtbarkeit. 2025-10-07 17:37:16 +02:00
Torsten Schulz (local)
5e4471a936 Optimiere das Worship Management-Formular: Entferne redundante Codeabschnitte, verbessere die Benutzeroberfläche durch Anpassungen der Abstände und Padding-Werte, und vereinheitliche die Struktur der Eingabefelder. Füge eine neue Auswahl für das Jahr hinzu, um die liturgischen Daten zu laden. 2025-10-07 17:22:39 +02:00
Torsten Schulz (local)
459dd3168a Verbessere die Auswahl von liturgischen Tagen im Worship Management: Filtere nur zukünftige Tage, formatiere die Anzeige mit Datum und Namen und aktualisiere die Logik zur Auswahl und Speicherung des liturgischen Tages. Optimiere die Handhabung von Tags und deren Zuordnung im Formular. 2025-10-07 17:20:17 +02:00
Torsten Schulz (local)
3af7089e06 Verbessere das Layout des Worship Management-Formulars: Ändere das Layout von Flexbox zu Grid, optimiere die Stile für Labels, Eingabefelder und Schaltflächen, um eine bessere Benutzererfahrung zu gewährleisten. 2025-10-07 17:18:37 +02:00
Torsten Schulz (local)
156d89a45d Füge Logik zur Aktualisierung des Datums basierend auf dem ausgewählten liturgischen Tag hinzu: Implementiere einen Watcher für die Änderung des Tagesnamens und vermeide Endlosschleifen durch ein Flag. Protokolliere das gesetzte Datum und den entsprechenden liturgischen Tag in der Konsole. 2025-10-07 17:16:42 +02:00
Torsten Schulz (local)
bf0b7f1dad Verbessere die Logik zur Ermittlung des liturgischen Tages: Normalisiere das Datum und vergleiche nur das Datum ohne Zeitstempel. Füge Konsolenausgaben hinzu, um die Ergebnisse der Suche nach liturgischen Tagen zu protokollieren. 2025-10-07 17:14:24 +02:00
Torsten Schulz (local)
6de8cac0bc Optimiere die Funktion zum Abrufen von Worship-Optionen: Reduziere die Anzahl der Datenbankabfragen, indem Organizer und SacristanService in einer Abfrage zusammengefasst werden. Verbessere die Fehlerbehandlung durch detailliertere Fehlermeldungen. 2025-10-07 17:10:18 +02:00
Torsten Schulz (local)
ecd03d29f4 Verbessere das Worship Management: Implementiere die Auswahl von liturgischen Tagen mit Multiselect und aktualisiere das Formular zur dynamischen Anzeige basierend auf dem Datum. 2025-10-07 17:06:48 +02:00
Torsten Schulz (local)
0238fffd3d Füge Unterstützung für liturgische Tage im Worship Management hinzu: Implementiere Multiselect für die Auswahl von Tag-Namen und lade die verfügbaren liturgischen Tage. Aktualisiere das Formular zur Anzeige und Auswahl des liturgischen Tages basierend auf dem Datum. 2025-10-07 17:03:58 +02:00
Torsten Schulz (local)
fd84112cef Füge neue Funktionalität zum Abrufen von Worship-Optionen hinzu: Implementiere Endpunkt für eindeutige Gestalter und Küsterdienste. Aktualisiere das Worship Management-Formular zur Verwendung von Multiselect-Komponenten für die Auswahl und Eingabe von Gestaltern und Küstern. Integriere die Fetch-Funktion für Worship-Optionen im Vue-Komponenten-Lifecycle. 2025-10-07 16:52:52 +02:00
Torsten Schulz (local)
3303c749e2 Füge 'actualize.sh' zur .gitignore hinzu, um sicherzustellen, dass die Datei nicht ins Repository aufgenommen wird. 2025-10-07 16:46:05 +02:00
Torsten Schulz (local)
9cadaf3f51 Füge Such- und Filteroptionen für Gottesdienste hinzu: Ermögliche die Suche nach Datum und die Anzeige vergangener Gottesdienste im Worship Management-Bereich. Implementiere eine Funktion zum Zurücksetzen der Suche. 2025-10-07 16:42:11 +02:00
Torsten Schulz (local)
5d32c46e38 Füge Such- und Filterfunktionen für Veranstaltungen hinzu: Ermögliche die Suche nach Name, Typ und Beschreibung sowie die Anzeige vergangener Events im Event-Management-Bereich. 2025-10-07 16:37:30 +02:00
Torsten Schulz (local)
7e6128dec4 Füge Funktionalität zum Fokussieren des ersten Eingabefelds im Event-Formular hinzu und implementiere das Scrollen zum Formular bei der Erstellung und Bearbeitung von Veranstaltungen. 2025-10-07 16:06:17 +02:00
Torsten Schulz (local)
cff48550ae Changed 2025-10-07 16:00:49 +02:00
262 changed files with 11626 additions and 20231 deletions

2
.gitignore vendored
View File

@@ -27,3 +27,5 @@ server.key
server.cert server.cert
public/images/uploads/1ba24ea7-f52c-4179-896f-1909269cab58.jpg public/images/uploads/1ba24ea7-f52c-4179-896f-1909269cab58.jpg
actualize.sh
files/uploads/GD 24.08.2025-04.01.2026 Stand 12.08.2025.docx

View File

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

View File

@@ -1,21 +1,21 @@
{ {
"development": { "development": {
"username": "miriam_user", "username": "miriamgemeinde",
"password": "qTCTTWwpEwy3vPDU", "password": "hitomisan",
"database": "miriamgemeinde", "database": "miriamgemeinde",
"host": "tsschulz.de", "host": "localhost",
"dialect": "mysql" "dialect": "mysql"
}, },
"test": { "test": {
"username": "miriam_user", "username": "miriam_user",
"password": "qTCTTWwpEwy3vPDU", "password": "hitomisan",
"database": "miriamgemeinde", "database": "miriamgemeinde",
"host": "tsschulz.de", "host": "tsschulz.de",
"dialect": "mysql" "dialect": "mysql"
}, },
"production": { "production": {
"username": "miriam_user", "username": "miriam_user",
"password": "qTCTTWwpEwy3vPDU", "password": "hitomisan",
"database": "miriamgemeinde", "database": "miriamgemeinde",
"host": "tsschulz.de", "host": "tsschulz.de",
"dialect": "mysql" "dialect": "mysql"

View File

@@ -1,7 +1,7 @@
const { Sequelize } = require('sequelize'); const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('miriamgemeinde', 'miriam_user', 'qTCTTWwpEwy3vPDU', { const sequelize = new Sequelize('miriamgemeinde', 'miriamgemeinde', 'hitomisan', {
host: 'tsschulz.de', host: 'localhost',
dialect: 'mysql', dialect: 'mysql',
retry: { retry: {
match: [ match: [
@@ -26,7 +26,7 @@ const sequelize = new Sequelize('miriamgemeinde', 'miriam_user', 'qTCTTWwpEwy3vP
async function connectWithRetry() { async function connectWithRetry() {
try { try {
await sequelize.authenticate(); await sequelize.authenticate();
console.log('Connection has been established successfully.'); console.log(`Connection has been established successfully. Database server: ${sequelize.config.host}`);
} catch (error) { } catch (error) {
console.error('Unable to connect to the database:', error); console.error('Unable to connect to the database:', error);
setTimeout(connectWithRetry, 5000); setTimeout(connectWithRetry, 5000);

View File

@@ -1,59 +1,205 @@
const AuthService = require('../services/AuthService'); const bcrypt = require('bcryptjs');
const ErrorHandler = require('../utils/ErrorHandler'); const { User, PasswordResetToken } = require('../models');
const jwt = require('jsonwebtoken');
const { addTokenToBlacklist } = require('../utils/blacklist');
const { transporter, getPasswordResetEmailTemplate } = require('../config/email');
const crypto = require('crypto');
/** function delay(ms) {
* Controller für Authentifizierungsendpunkte return new Promise(resolve => setTimeout(resolve, ms));
*/
class AuthController {
/**
* Benutzerregistrierung
*/
static register = ErrorHandler.asyncHandler(async (req, res) => {
const result = await AuthService.register(req.body);
ErrorHandler.successResponse(res, result, result.message, 201);
});
/**
* Benutzeranmeldung
*/
static login = ErrorHandler.asyncHandler(async (req, res) => {
const { email, password } = req.body;
const result = await AuthService.login(email, password);
ErrorHandler.successResponse(res, result, result.message);
});
/**
* Passwort vergessen
*/
static forgotPassword = ErrorHandler.asyncHandler(async (req, res) => {
const result = await AuthService.forgotPassword(req.body.email);
ErrorHandler.successResponse(res, result, result.message);
});
/**
* Passwort zurücksetzen
*/
static resetPassword = ErrorHandler.asyncHandler(async (req, res) => {
const result = await AuthService.resetPassword(req.body.token, req.body.password);
ErrorHandler.successResponse(res, result, result.message);
});
/**
* Benutzerabmeldung
*/
static logout = ErrorHandler.asyncHandler(async (req, res) => {
const authHeader = req.header('Authorization');
const token = authHeader ? authHeader.replace('Bearer ', '') : null;
const result = await AuthService.logout(token);
ErrorHandler.successResponse(res, result, result.message);
});
} }
// Export der statischen Methoden für die Routen exports.register = async (req, res) => {
module.exports = { const { name, email, password } = req.body;
register: AuthController.register, if (!name || !email || !password) {
login: AuthController.login, return res.status(400).json({ message: 'Alle Felder sind erforderlich' });
forgotPassword: AuthController.forgotPassword, }
resetPassword: AuthController.resetPassword, try {
logout: AuthController.logout const hashedPassword = await bcrypt.hash(password, 10);
}; console.log('Register: creating user', { email });
const maxAttempts = 3;
let attempt = 0;
let createdUser = null;
let lastError = null;
while (attempt < maxAttempts && !createdUser) {
try {
createdUser = await User.create({ name, email, password: hashedPassword, active: false });
} catch (err) {
lastError = err;
// Spezifisch auf Lock-Timeout reagieren und erneut versuchen
if ((err.code === 'ER_LOCK_WAIT_TIMEOUT' || err?.parent?.code === 'ER_LOCK_WAIT_TIMEOUT') && attempt < maxAttempts - 1) {
const backoffMs = 300 * (attempt + 1);
console.warn(`Register: ER_LOCK_WAIT_TIMEOUT, retry in ${backoffMs}ms (attempt ${attempt + 1}/${maxAttempts})`);
await delay(backoffMs);
attempt++;
continue;
}
throw err;
}
}
if (!createdUser && lastError) {
console.error('Register error (after retries):', lastError);
return res.status(503).json({ message: 'Zeitüberschreitung beim Zugriff auf die Datenbank. Bitte erneut versuchen.' });
}
console.log('Register: user created', { id: createdUser.id });
const safeUser = {
id: createdUser.id,
name: createdUser.name,
email: createdUser.email,
active: createdUser.active,
created_at: createdUser.created_at
};
return res.status(201).json({ message: 'Benutzer erfolgreich registriert', user: safeUser });
} catch (error) {
if (error.name === 'SequelizeUniqueConstraintError') {
return res.status(400).json({ message: 'Email-Adresse bereits in Verwendung' });
}
console.error('Register error:', error);
return res.status(500).json({ message: 'Ein Fehler ist aufgetreten', error: error.message });
}
};
exports.login = async (req, res) => {
const { email, password } = req.body;
if (!email || !password) {
return res.status(400).json({ message: 'Email und Passwort sind erforderlich' });
}
try {
const user = await User.findOne({ where: { email } });
if (!user) {
return res.status(401).json({ message: 'Ungültige Anmeldedaten' });
}
const validPassword = await bcrypt.compare(password, user.password);
if (!validPassword) {
return res.status(401).json({ message: 'Ungültige Anmeldedaten' });
}
if (!user.active) {
return res.status(403).json({ message: 'Benutzerkonto ist nicht aktiv' });
}
const token = jwt.sign({ id: user.id, name: user.name, email: user.email }, 'zTxVgptmPl9!_dr%xxx9999(dd)', { expiresIn: '1h' });
return res.status(200).json({ message: 'Login erfolgreich', token, 'user': user });
} catch (error) {
return res.status(500).json({ message: 'Ein Fehler ist aufgetreten' });
}
};
exports.forgotPassword = async (req, res) => {
const { email } = req.body;
if (!email) {
return res.status(400).json({ message: 'E-Mail-Adresse ist erforderlich' });
}
try {
const user = await User.findOne({ where: { email } });
if (!user) {
// Aus Sicherheitsgründen immer Erfolg melden, auch wenn E-Mail nicht existiert
return res.status(200).json({ message: 'Falls die E-Mail-Adresse in unserem System registriert ist, erhalten Sie einen Link zum Zurücksetzen des Passworts.' });
}
// Alte Reset-Tokens für diesen User löschen
await PasswordResetToken.destroy({ where: { userId: user.id } });
// Neuen Reset-Token generieren
const token = crypto.randomBytes(32).toString('hex');
const expiresAt = new Date(Date.now() + 60 * 60 * 1000); // 1 Stunde
await PasswordResetToken.create({
userId: user.id,
token,
expiresAt
});
// Reset-URL generieren
const resetUrl = `${process.env.FRONTEND_URL || 'http://localhost:8080'}/reset-password?token=${token}`;
// E-Mail versenden
const emailTemplate = getPasswordResetEmailTemplate(resetUrl, user.name);
const mailOptions = {
from: process.env.SMTP_FROM || 'noreply@miriamgemeinde.de',
to: email,
subject: emailTemplate.subject,
html: emailTemplate.html,
text: emailTemplate.text
};
console.log('=== EMAIL SENDING DEBUG ===');
console.log('From:', mailOptions.from);
console.log('To:', mailOptions.to);
console.log('Subject:', mailOptions.subject);
console.log('Reset URL:', resetUrl);
console.log('===========================');
await transporter.sendMail(mailOptions);
console.log('Password reset email sent to:', email);
return res.status(200).json({ message: 'Falls die E-Mail-Adresse in unserem System registriert ist, erhalten Sie einen Link zum Zurücksetzen des Passworts.' });
} catch (error) {
console.error('Forgot password error:', error);
return res.status(500).json({ message: 'Ein Fehler ist aufgetreten' });
}
};
exports.resetPassword = async (req, res) => {
const { token, password } = req.body;
if (!token || !password) {
return res.status(400).json({ message: 'Token und neues Passwort sind erforderlich' });
}
if (password.length < 6) {
return res.status(400).json({ message: 'Passwort muss mindestens 6 Zeichen lang sein' });
}
try {
// Token validieren
const resetToken = await PasswordResetToken.findOne({
where: {
token,
used: false,
expiresAt: {
[require('sequelize').Op.gt]: new Date()
}
},
include: [{ model: User, as: 'user' }]
});
if (!resetToken) {
return res.status(400).json({ message: 'Ungültiger oder abgelaufener Token' });
}
// Passwort hashen und aktualisieren
const hashedPassword = await bcrypt.hash(password, 10);
await User.update(
{ password: hashedPassword },
{ where: { id: resetToken.userId } }
);
// Token als verwendet markieren
await resetToken.update({ used: true });
console.log('Password reset successful for user:', resetToken.userId);
return res.status(200).json({ message: 'Passwort erfolgreich zurückgesetzt' });
} catch (error) {
console.error('Reset password error:', error);
return res.status(500).json({ message: 'Ein Fehler ist aufgetreten' });
}
};
exports.logout = async (req, res) => {
const authHeader = req.header('Authorization');
if (!authHeader) {
return res.status(400).json({ message: 'Kein Token bereitgestellt' });
}
const token = authHeader.replace('Bearer ', '');
try {
addTokenToBlacklist(token);
return res.status(200).json({ message: 'Logout erfolgreich' });
} catch (error) {
console.log(error);
return res.status(500).json({ message: 'Ein Fehler ist beim Logout aufgetreten' });
}
};

View File

@@ -3,7 +3,16 @@ const { Op } = require('sequelize');
const getAllContactPersons = async (req, res) => { const getAllContactPersons = async (req, res) => {
try { try {
const today = new Date();
today.setHours(0, 0, 0, 0);
const contactPersons = await ContactPerson.findAll({ const contactPersons = await ContactPerson.findAll({
where: {
[Op.or]: [
{ expiryDate: null },
{ expiryDate: { [Op.gte]: today } }
]
},
include: [ include: [
{ {
model: Position, model: Position,
@@ -79,6 +88,14 @@ const filterContactPersons = async (req, res) => {
const where = {}; const where = {};
const having = []; const having = [];
// Filter für nicht abgelaufene Kontaktpersonen
const today = new Date();
today.setHours(0, 0, 0, 0);
where[Op.or] = [
{ expiryDate: null },
{ expiryDate: { [Op.gte]: today } }
];
if (config.selection.id && config.selection.id === 'all') { if (config.selection.id && config.selection.id === 'all') {
// No additional filter needed for "all" // No additional filter needed for "all"
} else if (config.selection.id) { } else if (config.selection.id) {

View File

@@ -1,32 +1,188 @@
const EventService = require('../services/EventService'); const { Event, Institution, EventPlace, ContactPerson, EventType } = require('../models');
const ErrorHandler = require('../utils/ErrorHandler'); const { Op } = require('sequelize');
const moment = require('moment'); // Import von Moment.js
exports.getAllEvents = ErrorHandler.asyncHandler(async (req, res) => { const getAllEvents = async (req, res) => {
const events = await EventService.getAllEvents(); try {
ErrorHandler.successResponse(res, events, 'Events erfolgreich abgerufen'); const events = await Event.findAll({
}); include: [
{ model: Institution, as: 'institution' },
{ model: EventPlace, as: 'eventPlace' },
{ model: EventType, as: 'eventType' },
{ model: ContactPerson, as: 'contactPersons', through: { attributes: [] } }
],
order: ['name', 'date', 'time']
});
res.json(events);
} catch (error) {
res.status(500).json({ error: 'Failed to fetch events' });
console.error(error);
}
};
exports.getEventById = ErrorHandler.asyncHandler(async (req, res) => { const filterEvents = async (req, res) => {
const event = await EventService.getEventById(req.params.id); try {
ErrorHandler.successResponse(res, event, 'Event erfolgreich abgerufen'); const request = req.body;
}); const where = {
[Op.or]: [
{
date: {
[Op.or]: [
{ [Op.gte]: moment().startOf('day').toDate() },
{ [Op.eq]: null }
]
}
},
{ dayOfWeek: { [Op.gte]: 0 } }
]
};
const order = [
['date', 'ASC'],
['time', 'ASC']
];
exports.filterEvents = ErrorHandler.asyncHandler(async (req, res) => { if (request.id === 'all') {
const result = await EventService.filterEvents(req.body); const events = await Event.findAll({
ErrorHandler.successResponse(res, result, 'Events erfolgreich gefiltert'); where,
}); include: [
{ model: Institution, as: 'institution' },
{ model: EventPlace, as: 'eventPlace' },
{ model: EventType, as: 'eventType' },
{ model: ContactPerson, as: 'contactPersons', through: { attributes: [] } }
],
order: order,
logging: console.log // Log the generated SQL query
});
return res.json({ events });
}
exports.createEvent = ErrorHandler.asyncHandler(async (req, res) => { if (request.id === 'home') {
const event = await EventService.createEvent(req.body); const events = await Event.findAll({
ErrorHandler.successResponse(res, event, 'Event erfolgreich erstellt', 201); where: {
}); alsoOnHomepage: 1,
date: { [Op.gte]: moment().startOf('day').toDate() }
},
include: [
{ model: Institution, as: 'institution' },
{ model: EventPlace, as: 'eventPlace' },
{ model: EventType, as: 'eventType' },
{ model: ContactPerson, as: 'contactPersons', through: { attributes: [] } },
],
order: order,
});
return res.json({ events });
}
exports.updateEvent = ErrorHandler.asyncHandler(async (req, res) => { if (!request.id && !request.places && !request.types) {
const event = await EventService.updateEvent(req.params.id, req.body); return res.json({ events: [], places: [], types: [], contactPersons: [] });
ErrorHandler.successResponse(res, event, 'Event erfolgreich aktualisiert'); }
});
exports.deleteEvent = ErrorHandler.asyncHandler(async (req, res) => { if (request.id) {
const result = await EventService.deleteEvent(req.params.id); where.id = request.id;
ErrorHandler.successResponse(res, result, result.message); }
});
if (request.places && request.places.length > 0) {
where.event_place_id = {
[Op.in]: request.places.map(id => parseInt(id))
};
}
if (request.types && request.types.length > 0) {
where.eventTypeId = {
[Op.in]: request.types.map(id => parseInt(id))
};
}
const events = await Event.findAll({
where,
include: [
{ model: Institution, as: 'institution' },
{ model: EventPlace, as: 'eventPlace' },
{ model: EventType, as: 'eventType' },
{ model: ContactPerson, as: 'contactPersons', through: { attributes: [] } }
],
order: order,
});
const displayFields = request.display ? request.display : [];
const filteredEvents = events.map(event => {
const filteredEvent = { ...event.toJSON() };
if (!displayFields.includes('name')) delete filteredEvent.name;
if (!displayFields.includes('type')) delete filteredEvent.eventType;
if (!displayFields.includes('place')) delete filteredEvent.eventPlace;
if (!displayFields.includes('description')) delete filteredEvent.description;
if (!displayFields.includes('time')) delete filteredEvent.time;
if (!displayFields.includes('time')) delete filteredEvent.endTime;
if (!displayFields.includes('contactPerson')) delete filteredEvent.contactPersons;
if (!displayFields.includes('day')) delete filteredEvent.dayOfWeek;
if (!displayFields.includes('institution')) delete filteredEvent.institution;
return filteredEvent;
});
res.json({ events: filteredEvents });
} catch (error) {
res.status(500).json({ error: 'Failed to filter events' });
console.error(error);
}
};
const createEvent = async (req, res) => {
try {
const { contactPersonIds, ...eventData } = req.body;
eventData.alsoOnHomepage = eventData.alsoOnHomepage ?? 0;
const event = await Event.create(eventData);
if (contactPersonIds) {
await event.setContactPersons(contactPersonIds);
}
res.status(201).json(event);
} catch (error) {
res.status(500).json({ error: 'Failed to create event' });
console.error(error);
}
};
const updateEvent = async (req, res) => {
try {
const { id } = req.params;
const { contactPersonIds, ...eventData } = req.body;
const event = await Event.findByPk(id);
if (!event) {
return res.status(404).json({ error: 'Event not found' });
}
await event.update(eventData);
if (contactPersonIds) {
await event.setContactPersons(contactPersonIds);
}
res.status(200).json(event);
} catch (error) {
res.status(500).json({ error: 'Failed to update event' });
console.error(error);
}
};
const deleteEvent = async (req, res) => {
try {
const { id } = req.params;
const deleted = await Event.destroy({
where: { id: id }
});
if (deleted) {
res.status(204).json();
} else {
res.status(404).json({ error: 'Event not found' });
}
} catch (error) {
res.status(500).json({ error: 'Failed to delete event' });
console.error(error);
}
};
module.exports = {
getAllEvents,
createEvent,
updateEvent,
deleteEvent,
filterEvents
};

View File

@@ -0,0 +1,154 @@
const { LiturgicalDay } = require('../models');
const { Op } = require('sequelize');
const axios = require('axios');
// Alle liturgischen Tage abrufen
const getAllLiturgicalDays = async (req, res) => {
try {
const days = await LiturgicalDay.findAll({
order: [['date', 'ASC']]
});
res.status(200).json(days);
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Fehler beim Abrufen der liturgischen Tage' });
}
};
// Eindeutige Namen für Multiselect abrufen
const getLiturgicalDayNames = async (req, res) => {
try {
const days = await LiturgicalDay.findAll({
attributes: ['dayName'],
group: ['dayName'],
order: [['dayName', 'ASC']]
});
const names = days.map(day => day.dayName);
res.status(200).json(names);
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Fehler beim Abrufen der Tag-Namen' });
}
};
// HTML von liturgischem Kalender parsen und in DB speichern
const loadLiturgicalYear = async (req, res) => {
const { year } = req.body;
if (!year) {
return res.status(400).json({ message: 'Jahr ist erforderlich' });
}
const currentYear = new Date().getFullYear();
if (year < currentYear || year > currentYear + 2) {
return res.status(400).json({ message: 'Jahr muss zwischen aktuellem Jahr und 2 Jahren in der Zukunft liegen' });
}
try {
const url = `https://www.eike-fleer.de/liturgischer-kalender/${year}.htm`;
const response = await axios.get(url, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
});
const html = response.data;
// Parse HTML - suche nach Tabellenzeilen mit Datum und Name
// Format: "DD.MM.YYYY &nbsp; &nbsp; &nbsp; DayName"
const regex = /(\d{2}\.\d{2}\.\d{4})\s*(?:&nbsp;|\s)+(.+?)(?:<\/|$)/gi;
const matches = [...html.matchAll(regex)];
const liturgicalDays = [];
for (const match of matches) {
const dateStr = match[1]; // DD.MM.YYYY
let dayName = match[2];
// Bereinige den Tag-Namen von HTML-Tags und Entities
dayName = dayName
.replace(/<[^>]*>/g, '') // Entferne HTML-Tags
.replace(/&nbsp;/g, ' ') // Ersetze &nbsp;
.replace(/&auml;/g, 'ä')
.replace(/&ouml;/g, 'ö')
.replace(/&uuml;/g, 'ü')
.replace(/&Auml;/g, 'Ä')
.replace(/&Ouml;/g, 'Ö')
.replace(/&Uuml;/g, 'Ü')
.replace(/&szlig;/g, 'ß')
.trim();
// Konvertiere Datum von DD.MM.YYYY zu YYYY-MM-DD
const [day, month, yearPart] = dateStr.split('.');
const isoDate = `${yearPart}-${month}-${day}`;
if (dayName && dayName.length > 0) {
liturgicalDays.push({
date: isoDate,
dayName: dayName
});
}
}
if (liturgicalDays.length === 0) {
return res.status(500).json({ message: 'Keine liturgischen Tage gefunden. Möglicherweise hat sich das HTML-Format geändert.' });
}
// Speichere oder aktualisiere die Einträge
for (const day of liturgicalDays) {
await LiturgicalDay.upsert({
date: day.date,
dayName: day.dayName
});
}
res.status(200).json({
message: `${liturgicalDays.length} liturgische Tage für ${year} erfolgreich geladen`,
count: liturgicalDays.length
});
} catch (error) {
console.error('Fehler beim Laden der liturgischen Tage:', error);
if (error.response && error.response.status === 404) {
return res.status(404).json({ message: `Liturgischer Kalender für ${year} nicht gefunden` });
}
res.status(500).json({ message: 'Fehler beim Laden der liturgischen Tage', error: error.message });
}
};
// Einzelnen Tag erstellen
const createLiturgicalDay = async (req, res) => {
try {
const day = await LiturgicalDay.create(req.body);
res.status(201).json(day);
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Fehler beim Erstellen des liturgischen Tags' });
}
};
// Tag löschen
const deleteLiturgicalDay = async (req, res) => {
try {
const { id } = req.params;
const deleted = await LiturgicalDay.destroy({
where: { id }
});
if (deleted) {
res.status(200).json({ message: 'Liturgischer Tag erfolgreich gelöscht' });
} else {
res.status(404).json({ message: 'Liturgischer Tag nicht gefunden' });
}
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Fehler beim Löschen des liturgischen Tags' });
}
};
module.exports = {
getAllLiturgicalDays,
getLiturgicalDayNames,
loadLiturgicalYear,
createLiturgicalDay,
deleteLiturgicalDay
};

View File

@@ -1,12 +1,30 @@
const MenuDataService = require('../services/MenuDataService'); const { MenuItem } = require('../models');
const ErrorHandler = require('../utils/ErrorHandler'); const fetchMenuData = require('../utils/fetchMenuData');
exports.getMenuData = ErrorHandler.asyncHandler(async (req, res) => { exports.getMenuData = async (req, res) => {
const menuData = await MenuDataService.getMenuData(); try {
ErrorHandler.successResponse(res, menuData, 'Menü-Daten erfolgreich abgerufen'); const menuData = await fetchMenuData();
}); res.json(menuData);
} catch (error) {
res.status(500).send('Error fetching menu data');
}
};
exports.saveMenuData = ErrorHandler.asyncHandler(async (req, res) => { exports.saveMenuData = async (req, res) => {
const result = await MenuDataService.saveMenuData(req.body); try {
ErrorHandler.successResponse(res, result, result.message); const menuData = req.body;
}); const adjustedMenuData = menuData.map(item => {
item.parent_id = item.parent_id < 0 ? null : item.parent_id;
return item;
})
.sort((a, b) => (a.parent_id === null ? -1 : 1) - (b.parent_id === null ? -1 : 1));
await MenuItem.destroy({ where: {} });
for (const item of adjustedMenuData) {
await MenuItem.create(item);
}
res.status(200).send('Menü-Daten erfolgreich gespeichert');
} catch (error) {
console.error('Fehler beim Speichern der Menü-Daten:', error);
res.status(500).send('Fehler beim Speichern der Menü-Daten');
}
};

View File

@@ -1,27 +1,48 @@
const PageService = require('../services/PageService'); // controllers/pageController.js
const ErrorHandler = require('../utils/ErrorHandler'); const { Page } = require('../models');
exports.getMenuData = ErrorHandler.asyncHandler(async (req, res) => { exports.getMenuData = async (req, res) => {
const pages = await PageService.getAllPages(); try {
ErrorHandler.successResponse(res, pages, 'Seiten erfolgreich abgerufen'); const pages = await Page.findAll({
}); attributes: ['link', 'name']
});
res.json(pages);
} catch (error) {
console.error('Fehler beim Abrufen der Seiten:', error);
res.status(500).json({ message: 'Fehler beim Abrufen der Seiten' });
}
};
exports.getPageContent = ErrorHandler.asyncHandler(async (req, res) => { exports.getPageContent = async (req, res) => {
const result = await PageService.getPageContent(req.query.link); try {
ErrorHandler.successResponse(res, result, 'Seiteninhalt erfolgreich abgerufen'); const page = await Page.findOne({
}); where: { link: req.query.link }
});
if (page) {
res.json({ content: page.content });
} else {
res.json({ content: "" });
}
} catch (error) {
console.error('Fehler beim Laden des Seiteninhalts:', error);
res.status(500).json({ message: 'Fehler beim Laden des Seiteninhalts' });
}
};
exports.savePageContent = ErrorHandler.asyncHandler(async (req, res) => { exports.savePageContent = async (req, res) => {
const result = await PageService.savePageContent(req.body); try {
ErrorHandler.successResponse(res, result, result.message); const { link, name, content } = req.body;
}); let page = await Page.findOne({ where: { link } });
if (page) {
exports.getPageById = ErrorHandler.asyncHandler(async (req, res) => { page.content = content;
const page = await PageService.getPageById(req.params.id); page.name = name;
ErrorHandler.successResponse(res, page, 'Seite erfolgreich abgerufen'); } else {
}); page = await Page.create({ link, name, content });
}
exports.deletePage = ErrorHandler.asyncHandler(async (req, res) => { await page.save();
const result = await PageService.deletePage(req.params.id); res.json({ message: 'Seiteninhalt gespeichert', page });
ErrorHandler.successResponse(res, result, result.message); } catch (error) {
}); console.error('Fehler beim Speichern des Seiteninhalts:', error);
res.status(500).json({ message: 'Fehler beim Speichern des Seiteninhalts' });
}
};

View File

@@ -1,42 +1,104 @@
const UserService = require('../services/UserService'); const { User } = require('../models');
const UserValidator = require('../validators/UserValidator');
const ErrorHandler = require('../utils/ErrorHandler');
exports.getAllUsers = ErrorHandler.asyncHandler(async (req, res) => { exports.getAllUsers = async (req, res) => {
const users = await UserService.getAllUsers(); try {
ErrorHandler.successResponse(res, users, 'Benutzer erfolgreich abgerufen'); const users = await User.findAll({
}); order: [['name', 'ASC']],
attributes: ['id', 'name', 'email', 'active', 'created_at'] // Passwort ausschließen
});
res.status(200).json(users);
} catch (error) {
console.error('Error fetching users:', error);
res.status(500).json({ message: 'Error fetching users' });
}
};
exports.getUserById = ErrorHandler.asyncHandler(async (req, res) => { exports.getUserById = async (req, res) => {
UserValidator.validateId(req.params.id); try {
const user = await UserService.getUserById(req.params.id); const user = await User.findByPk(req.params.id, {
ErrorHandler.successResponse(res, user, 'Benutzer erfolgreich abgerufen'); attributes: ['id', 'name', 'email', 'active', 'created_at'] // Passwort ausschließen
}); });
if (user) {
res.status(200).json(user);
} else {
res.status(404).json({ message: 'User not found' });
}
} catch (error) {
console.error('Error fetching user:', error);
res.status(500).json({ message: 'Error fetching user' });
}
};
exports.createUser = ErrorHandler.asyncHandler(async (req, res) => { exports.createUser = async (req, res) => {
UserValidator.validateCreateUser(req.body); try {
const user = await UserService.createUser(req.body); const user = await User.create(req.body);
ErrorHandler.successResponse(res, user, 'Benutzer erfolgreich erstellt', 201);
}); // Sichere User-Daten zurückgeben (ohne Passwort)
const safeUser = {
id: user.id,
name: user.name,
email: user.email,
active: user.active,
created_at: user.created_at
};
res.status(201).json(safeUser);
} catch (error) {
console.error('Error creating user:', error);
res.status(500).json({ message: 'Error creating user' });
}
};
exports.updateUser = ErrorHandler.asyncHandler(async (req, res) => { exports.updateUser = async (req, res) => {
UserValidator.validateId(req.params.id); try {
UserValidator.validateUpdateUser(req.body); const user = await User.findByPk(req.params.id);
const user = await UserService.updateUser(req.params.id, req.body); if (user) {
ErrorHandler.successResponse(res, user, 'Benutzer erfolgreich aktualisiert'); // Erstelle eine Kopie der Request-Daten ohne sensible Felder
}); const updateData = { ...req.body };
// Entferne sensible Felder, die niemals über diese Route geändert werden dürfen
delete updateData.password;
delete updateData.id;
delete updateData.created_at;
// Setze updated_at auf aktuelle Zeit
updateData.updated_at = new Date();
// Logging für Debugging
console.log('Updating user:', req.params.id, 'with data:', updateData);
await user.update(updateData);
// Sichere User-Daten zurückgeben (ohne Passwort)
const safeUser = {
id: user.id,
name: user.name,
email: user.email,
active: user.active,
created_at: user.created_at
};
res.status(200).json(safeUser);
} else {
res.status(404).json({ message: 'User not found' });
}
} catch (error) {
console.error('Error updating user:', error);
res.status(500).json({ message: 'Error updating user' });
}
};
exports.deleteUser = ErrorHandler.asyncHandler(async (req, res) => { exports.deleteUser = async (req, res) => {
UserValidator.validateId(req.params.id); try {
await UserService.deleteUser(req.params.id); const user = await User.findByPk(req.params.id);
ErrorHandler.successResponse(res, null, 'Benutzer erfolgreich gelöscht'); if (user) {
}); await user.destroy();
res.status(200).json({ message: 'User deleted successfully' });
// Neue Route für Passwort-Änderung } else {
exports.changePassword = ErrorHandler.asyncHandler(async (req, res) => { res.status(404).json({ message: 'User not found' });
const { currentPassword, newPassword } = req.body; }
UserValidator.validateId(req.params.id); } catch (error) {
UserValidator.validatePasswordChange(currentPassword, newPassword); console.error('Error deleting user:', error);
await UserService.changePassword(req.params.id, currentPassword, newPassword); res.status(500).json({ message: 'Error deleting user' });
ErrorHandler.successResponse(res, null, 'Passwort erfolgreich geändert'); }
}); };

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,28 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.createTable('liturgical_days', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
date: {
type: Sequelize.DATEONLY,
allowNull: false,
unique: true
},
dayName: {
type: Sequelize.STRING,
allowNull: false
}
});
},
async down (queryInterface, Sequelize) {
await queryInterface.dropTable('liturgical_days');
}
};

View File

@@ -0,0 +1,16 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.addColumn('worships', 'organ_playing', {
type: Sequelize.STRING,
allowNull: true
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.removeColumn('worships', 'organ_playing');
}
};

View File

@@ -0,0 +1,17 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.addColumn('worships', 'approved', {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.removeColumn('worships', 'approved');
}
};

View File

@@ -25,6 +25,10 @@ module.exports = (sequelize) => {
email: { email: {
type: DataTypes.STRING, type: DataTypes.STRING,
allowNull: true allowNull: true
},
expiryDate: {
type: DataTypes.DATEONLY,
allowNull: true
} }
}, { }, {
tableName: 'contact_persons', tableName: 'contact_persons',

24
models/LiturgicalDay.js Normal file
View File

@@ -0,0 +1,24 @@
module.exports = (sequelize, DataTypes) => {
const LiturgicalDay = sequelize.define('LiturgicalDay', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
date: {
type: DataTypes.DATEONLY,
allowNull: false,
unique: true
},
dayName: {
type: DataTypes.STRING,
allowNull: false
}
}, {
tableName: 'liturgical_days',
timestamps: false
});
return LiturgicalDay;
};

View File

@@ -61,6 +61,17 @@ module.exports = (sequelize) => {
allowNull: true, allowNull: true,
field: 'sacristan_service' field: 'sacristan_service'
}, },
organPlaying: {
type: DataTypes.STRING,
allowNull: true,
field: 'organ_playing'
},
approved: {
type: DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
field: 'approved'
},
}, { }, {
tableName: 'worships', tableName: 'worships',
timestamps: true timestamps: true

26043
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",
"build": "vue-cli-service build && npm run copy-dist", "build": "vue-cli-service build && npm run copy-dist",
"copy-dist": "rm -rf public/* && cp -r dist/* public/", "copy-dist": "cp -r dist/* public/",
"lint": "vue-cli-service lint" "lint": "vue-cli-service lint"
}, },
"dependencies": { "dependencies": {
@@ -26,7 +26,7 @@
"@tiptap/extension-underline": "^2.4.0", "@tiptap/extension-underline": "^2.4.0",
"@tiptap/starter-kit": "^2.4.0", "@tiptap/starter-kit": "^2.4.0",
"@tiptap/vue-3": "^2.4.0", "@tiptap/vue-3": "^2.4.0",
"@vue/cli": "^5.0.8", "@vue/cli": "^4.2.2",
"axios": "^1.7.2", "axios": "^1.7.2",
"bcryptjs": "^2.4.3", "bcryptjs": "^2.4.3",
"body-parser": "^1.20.2", "body-parser": "^1.20.2",
@@ -34,10 +34,12 @@
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto": "^1.0.1", "crypto": "^1.0.1",
"date-fns": "^3.6.0", "date-fns": "^3.6.0",
"docx": "^9.5.1",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"express": "^4.19.2", "express": "^4.19.2",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"mammoth": "^1.11.0",
"moment": "^2.30.1", "moment": "^2.30.1",
"multer": "^1.4.5-lts.1", "multer": "^1.4.5-lts.1",
"mysql2": "^3.10.1", "mysql2": "^3.10.1",

View File

@@ -1 +0,0 @@
.privacy-policy[data-v-91660a08]{max-width:800px;margin:auto;padding:20px}h1[data-v-91660a08],h2[data-v-91660a08],h3[data-v-91660a08],h4[data-v-91660a08],h5[data-v-91660a08]{margin-top:20px;color:#333}p[data-v-91660a08]{line-height:1.6}ul[data-v-91660a08]{margin:10px 0;padding-left:20px}ul li[data-v-91660a08]{list-style-type:disc}a[data-v-91660a08]{color:#007bff;text-decoration:none}a[data-v-91660a08]:hover{text-decoration:underline}

View File

@@ -1 +0,0 @@
table.worships[data-v-6bd31626]{border-collapse:collapse;width:100%}table.worships td[data-v-6bd31626]{border:1px solid #000;text-align:center}h3[data-v-6bd31626]{margin:0}table.worships td div[data-v-6bd31626]{margin:5px}.highlight-time[data-v-6bd31626]{text-decoration:underline}.neighborhood-invitation[data-v-6bd31626]{font-weight:700;color:#0020e0}a[data-v-6bd31626]{color:#0020e0}.internal-information[data-v-6bd31626]{color:#e45;font-style:italic}.image[data-v-9b711a1e]{max-width:400px;max-height:300px}.event-name[data-v-708e6f45]{font-weight:700}.event-table[data-v-708e6f45]{border-collapse:collapse}.event-table td[data-v-708e6f45]{border:1px solid #000}.homepage[data-v-708e6f45]{border:1px solid #9400ff;padding:.5em;text-align:center}.description[data-v-708e6f45]{padding:.5em 0}.event-image>img[data-v-708e6f45]{max-width:12em;max-height:12em}.contact-box p[data-v-0cc91918]{margin:0}.bottom-margin[data-v-0cc91918]{margin-bottom:1rem}span[data-v-2bbf7aa9]{cursor:pointer;color:blue;text-decoration:underline}.previewinfo[data-v-9a71cbf6]{background-color:#000;color:#d00000;position:absolute;top:93px;left:0;padding:2px 10px;font-weight:700}

View File

@@ -1 +0,0 @@
.user-administration[data-v-a495c756]{padding:20px}.user-administration h1[data-v-a495c756],.user-administration h2[data-v-a495c756]{margin-bottom:20px}.user-administration form[data-v-a495c756]{display:flex;flex-direction:column;margin-bottom:20px}.user-administration label[data-v-a495c756]{margin-top:10px}.user-administration input[type=email][data-v-a495c756],.user-administration input[type=password][data-v-a495c756],.user-administration input[type=text][data-v-a495c756]{padding:5px;font-size:16px}.user-administration ul[data-v-a495c756]{list-style-type:none;padding:0}.user-administration li[data-v-a495c756]{padding:10px;border-bottom:1px solid #ddd;cursor:pointer}.user-administration li[data-v-a495c756]:hover{background-color:#f0f0f0}

View File

@@ -1 +0,0 @@
.event-places-management[data-v-4e6631f7]{max-width:600px;margin:auto;padding:20px;border:1px solid #ccc;border-radius:5px}form[data-v-4e6631f7]{display:flex;flex-direction:column;margin-bottom:20px}label[data-v-4e6631f7]{margin-top:10px}input[data-v-4e6631f7]{margin-top:5px;margin-bottom:10px;padding:8px}button[data-v-4e6631f7]{margin-top:10px;padding:10px}table[data-v-4e6631f7]{width:100%;border-collapse:collapse;margin-top:20px}td[data-v-4e6631f7],th[data-v-4e6631f7]{border:1px solid #ccc;padding:10px;text-align:left}th[data-v-4e6631f7]{background-color:#f4f4f4}

View File

@@ -1 +0,0 @@
div[data-v-68b32234]{padding:20px}ul[data-v-68b32234]{list-style:none;padding:0;margin:0}li[data-v-68b32234]{padding:0;margin:0}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.dialog-overlay[data-v-64c2e06a]{top:calc(50% - 25em);left:5%;width:90%;height:50em;background:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;overflow:auto}.dialog[data-v-64c2e06a]{background:#fff;padding:20px;border-radius:5px;max-width:400px;width:100%;text-align:center}button[data-v-64c2e06a]{margin-top:20px}

View File

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

View File

@@ -1 +0,0 @@
.right-column h2[data-v-d1b58e08]{text-align:center;color:#000}.right-column img[data-v-d1b58e08]{display:block;margin:0 auto;max-width:100%;height:auto}

View File

@@ -1 +0,0 @@
.menu-management[data-v-0e6a0522]{width:100%;margin:auto}.button-container[data-v-0e6a0522]{display:inline-flex;gap:10px;margin-bottom:20px}.tree-view[data-v-0e6a0522]{margin-top:20px}.tree-view ul[data-v-0e6a0522]{list-style-type:none;padding:0}.tree-view li[data-v-0e6a0522]{margin-bottom:5px;padding-left:20px}.tree-view .menu-item[data-v-0e6a0522]{display:inline-flex;width:100%;justify-content:space-between;align-items:center}.tree-view span[data-v-0e6a0522]{cursor:pointer;color:#000}.tree-view button[data-v-0e6a0522]{border:none;height:1.6em;padding:0 .5em;margin:1px;border-radius:5px}.tree-view span[data-v-0e6a0522]:hover{text-decoration:underline}.edit-form[data-v-0e6a0522]{margin-top:20px}.edit-form label[data-v-0e6a0522]{display:block;margin-bottom:5px;font-weight:700}.edit-form input[data-v-0e6a0522]:not([type=checkbox]){display:block;margin-bottom:10px}.edit-form .checkbox-container[data-v-0e6a0522]{display:flex;flex-direction:column;margin-right:10px}.edit-form .order-id[data-v-0e6a0522]{width:50px}.edit-form button[data-v-0e6a0522]{margin-top:5px}

View File

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

View File

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

View File

@@ -1 +0,0 @@
.upload-files[data-v-f2694614]{width:100%;margin:auto}.upload-files div[data-v-f2694614]{margin-bottom:10px}.file-list[data-v-f2694614]{list-style-type:none;padding:0;margin-top:20px}.file-list li[data-v-f2694614]{border-bottom:1px solid #ddd;padding:10px 0}.file-info[data-v-f2694614]{display:flex;justify-content:space-between;cursor:pointer}.file-title[data-v-f2694614]{font-weight:700}.file-name[data-v-f2694614]{color:#555}.file-date[data-v-f2694614]{color:#888}

View File

@@ -1 +0,0 @@
.privacy-policy[data-v-91660a08]{max-width:800px;margin:auto;padding:20px}h1[data-v-91660a08],h2[data-v-91660a08],h3[data-v-91660a08],h4[data-v-91660a08],h5[data-v-91660a08]{margin-top:20px;color:#333}p[data-v-91660a08]{line-height:1.6}ul[data-v-91660a08]{margin:10px 0;padding-left:20px}ul li[data-v-91660a08]{list-style-type:disc}a[data-v-91660a08]{color:#007bff;text-decoration:none}a[data-v-91660a08]:hover{text-decoration:underline}

View File

@@ -1 +0,0 @@
.event-places-management[data-v-4e6631f7]{max-width:600px;margin:auto;padding:20px;border:1px solid #ccc;border-radius:5px}form[data-v-4e6631f7]{display:flex;flex-direction:column;margin-bottom:20px}label[data-v-4e6631f7]{margin-top:10px}input[data-v-4e6631f7]{margin-top:5px;margin-bottom:10px;padding:8px}button[data-v-4e6631f7]{margin-top:10px;padding:10px}table[data-v-4e6631f7]{width:100%;border-collapse:collapse;margin-top:20px}td[data-v-4e6631f7],th[data-v-4e6631f7]{border:1px solid #ccc;padding:10px;text-align:left}th[data-v-4e6631f7]{background-color:#f4f4f4}

View File

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

View File

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

View File

@@ -1 +0,0 @@
.institution-management[data-v-ff992c44]{max-width:600px;margin:auto;padding:20px;border:1px solid #ccc;border-radius:5px}form[data-v-ff992c44]{display:flex;flex-direction:column;margin-bottom:20px}label[data-v-ff992c44]{margin-top:10px}input[data-v-ff992c44]{margin-top:5px;margin-bottom:10px;padding:8px}button[data-v-ff992c44]{margin-top:10px;padding:10px}table[data-v-ff992c44]{width:100%;border-collapse:collapse;margin-top:20px}td[data-v-ff992c44],th[data-v-ff992c44]{border:1px solid #ccc;padding:10px;text-align:left}th[data-v-ff992c44]{background-color:#f4f4f4}

View File

@@ -1 +0,0 @@
.dialog-overlay[data-v-64c2e06a]{top:calc(50% - 25em);left:5%;width:90%;height:50em;background:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;overflow:auto}.dialog[data-v-64c2e06a]{background:#fff;padding:20px;border-radius:5px;max-width:400px;width:100%;text-align:center}button[data-v-64c2e06a]{margin-top:20px}

View File

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

View File

@@ -1 +0,0 @@
.position-management[data-v-1684a375]{max-width:600px;margin:auto;padding:20px;border:1px solid #ccc;border-radius:5px}form[data-v-1684a375]{display:flex;flex-direction:column;margin-bottom:20px}label[data-v-1684a375]{margin-top:10px}input[data-v-1684a375]{margin-top:5px;margin-bottom:10px;padding:8px}button[data-v-1684a375]{margin-top:10px;padding:10px}table[data-v-1684a375]{width:100%;border-collapse:collapse;margin-top:20px}td[data-v-1684a375],th[data-v-1684a375]{border:1px solid #ccc;padding:10px;text-align:left}th[data-v-1684a375]{background-color:#f4f4f4}

View File

@@ -1 +0,0 @@
.upload-files[data-v-f2694614]{width:100%;margin:auto}.upload-files div[data-v-f2694614]{margin-bottom:10px}.file-list[data-v-f2694614]{list-style-type:none;padding:0;margin-top:20px}.file-list li[data-v-f2694614]{border-bottom:1px solid #ddd;padding:10px 0}.file-info[data-v-f2694614]{display:flex;justify-content:space-between;cursor:pointer}.file-title[data-v-f2694614]{font-weight:700}.file-name[data-v-f2694614]{color:#555}.file-date[data-v-f2694614]{color:#888}

View File

@@ -1 +0,0 @@
.user-administration[data-v-a495c756]{padding:20px}.user-administration h1[data-v-a495c756],.user-administration h2[data-v-a495c756]{margin-bottom:20px}.user-administration form[data-v-a495c756]{display:flex;flex-direction:column;margin-bottom:20px}.user-administration label[data-v-a495c756]{margin-top:10px}.user-administration input[type=email][data-v-a495c756],.user-administration input[type=password][data-v-a495c756],.user-administration input[type=text][data-v-a495c756]{padding:5px;font-size:16px}.user-administration ul[data-v-a495c756]{list-style-type:none;padding:0}.user-administration li[data-v-a495c756]{padding:10px;border-bottom:1px solid #ddd;cursor:pointer}.user-administration li[data-v-a495c756]:hover{background-color:#f0f0f0}

View File

@@ -1 +0,0 @@
.dialog-overlay[data-v-64c2e06a]{top:calc(50% - 25em);left:5%;width:90%;height:50em;background:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;overflow:auto}.dialog[data-v-64c2e06a]{background:#fff;padding:20px;border-radius:5px;max-width:400px;width:100%;text-align:center}button[data-v-64c2e06a]{margin-top:20px}.login[data-v-40a158c0]{max-width:400px;margin:auto}form[data-v-40a158c0]{display:flex;flex-direction:column}label[data-v-40a158c0]{margin-top:10px}button[data-v-40a158c0]{margin-top:20px}

View File

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

View File

@@ -1 +0,0 @@
.impressum[data-v-612786fa]{max-width:800px;margin:auto;padding:20px}h1[data-v-612786fa],h2[data-v-612786fa],h3[data-v-612786fa],h4[data-v-612786fa]{margin-top:20px;color:#333}p[data-v-612786fa]{line-height:1.6}a[data-v-612786fa]{color:#007bff;text-decoration:none}a[data-v-612786fa]:hover{text-decoration:underline}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
form div[data-v-403a0e0b]{margin-bottom:10px}.uploaded-image[data-v-403a0e0b]{display:inline-block;margin:0 0 .5em .5em;border:1px solid #e0e0e0;padding:10px}.uploaded-image input[data-v-403a0e0b],.uploaded-image textarea[data-v-403a0e0b]{width:100%;margin:5px 0}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.dialog-overlay[data-v-64c2e06a]{top:calc(50% - 25em);left:5%;width:90%;height:50em;background:rgba(0,0,0,.5);display:flex;justify-content:center;align-items:center;overflow:auto}.dialog[data-v-64c2e06a]{background:#fff;padding:20px;border-radius:5px;max-width:400px;width:100%;text-align:center}button[data-v-64c2e06a]{margin-top:20px}.login[data-v-40a158c0]{max-width:400px;margin:auto}form[data-v-40a158c0]{display:flex;flex-direction:column}label[data-v-40a158c0]{margin-top:10px}button[data-v-40a158c0]{margin-top:20px}

View File

@@ -1 +0,0 @@
.menu-management[data-v-0e6a0522]{width:100%;margin:auto}.button-container[data-v-0e6a0522]{display:inline-flex;gap:10px;margin-bottom:20px}.tree-view[data-v-0e6a0522]{margin-top:20px}.tree-view ul[data-v-0e6a0522]{list-style-type:none;padding:0}.tree-view li[data-v-0e6a0522]{margin-bottom:5px;padding-left:20px}.tree-view .menu-item[data-v-0e6a0522]{display:inline-flex;width:100%;justify-content:space-between;align-items:center}.tree-view span[data-v-0e6a0522]{cursor:pointer;color:#000}.tree-view button[data-v-0e6a0522]{border:none;height:1.6em;padding:0 .5em;margin:1px;border-radius:5px}.tree-view span[data-v-0e6a0522]:hover{text-decoration:underline}.edit-form[data-v-0e6a0522]{margin-top:20px}.edit-form label[data-v-0e6a0522]{display:block;margin-bottom:5px;font-weight:700}.edit-form input[data-v-0e6a0522]:not([type=checkbox]){display:block;margin-bottom:10px}.edit-form .checkbox-container[data-v-0e6a0522]{display:flex;flex-direction:column;margin-right:10px}.edit-form .order-id[data-v-0e6a0522]{width:50px}.edit-form button[data-v-0e6a0522]{margin-top:5px}

View File

@@ -1 +0,0 @@
.position-management[data-v-1684a375]{max-width:600px;margin:auto;padding:20px;border:1px solid #ccc;border-radius:5px}form[data-v-1684a375]{display:flex;flex-direction:column;margin-bottom:20px}label[data-v-1684a375]{margin-top:10px}input[data-v-1684a375]{margin-top:5px;margin-bottom:10px;padding:8px}button[data-v-1684a375]{margin-top:10px;padding:10px}table[data-v-1684a375]{width:100%;border-collapse:collapse;margin-top:20px}td[data-v-1684a375],th[data-v-1684a375]{border:1px solid #ccc;padding:10px;text-align:left}th[data-v-1684a375]{background-color:#f4f4f4}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.institution-management[data-v-ff992c44]{max-width:600px;margin:auto;padding:20px;border:1px solid #ccc;border-radius:5px}form[data-v-ff992c44]{display:flex;flex-direction:column;margin-bottom:20px}label[data-v-ff992c44]{margin-top:10px}input[data-v-ff992c44]{margin-top:5px;margin-bottom:10px;padding:8px}button[data-v-ff992c44]{margin-top:10px;padding:10px}table[data-v-ff992c44]{width:100%;border-collapse:collapse;margin-top:20px}td[data-v-ff992c44],th[data-v-ff992c44]{border:1px solid #ccc;padding:10px;text-align:left}th[data-v-ff992c44]{background-color:#f4f4f4}

View File

@@ -1 +0,0 @@
table.worships[data-v-6bd31626]{border-collapse:collapse;width:100%}table.worships td[data-v-6bd31626]{border:1px solid #000;text-align:center}h3[data-v-6bd31626]{margin:0}table.worships td div[data-v-6bd31626]{margin:5px}.highlight-time[data-v-6bd31626]{text-decoration:underline}.neighborhood-invitation[data-v-6bd31626]{font-weight:700;color:#0020e0}a[data-v-6bd31626]{color:#0020e0}.internal-information[data-v-6bd31626]{color:#e45;font-style:italic}.image[data-v-9b711a1e]{max-width:400px;max-height:300px}.event-name[data-v-708e6f45]{font-weight:700}.event-table[data-v-708e6f45]{border-collapse:collapse}.event-table td[data-v-708e6f45]{border:1px solid #000}.homepage[data-v-708e6f45]{border:1px solid #9400ff;padding:.5em;text-align:center}.description[data-v-708e6f45]{padding:.5em 0}.event-image>img[data-v-708e6f45]{max-width:12em;max-height:12em}.contact-box p[data-v-0cc91918]{margin:0}.bottom-margin[data-v-0cc91918]{margin-bottom:1rem}span[data-v-2bbf7aa9]{cursor:pointer;color:blue;text-decoration:underline}.previewinfo[data-v-9a71cbf6]{background-color:#000;color:#d00000;position:absolute;top:93px;left:0;padding:2px 10px;font-weight:700}

View File

@@ -1 +0,0 @@
table.worships[data-v-6bd31626]{border-collapse:collapse;width:100%}table.worships td[data-v-6bd31626]{border:1px solid #000;text-align:center}h3[data-v-6bd31626]{margin:0}table.worships td div[data-v-6bd31626]{margin:5px}.highlight-time[data-v-6bd31626]{text-decoration:underline}.neighborhood-invitation[data-v-6bd31626]{font-weight:700;color:#0020e0}a[data-v-6bd31626]{color:#0020e0}.internal-information[data-v-6bd31626]{color:#e45;font-style:italic}.image[data-v-9b711a1e]{max-width:400px;max-height:300px}.event-name[data-v-708e6f45]{font-weight:700}.event-table[data-v-708e6f45]{border-collapse:collapse}.event-table td[data-v-708e6f45]{border:1px solid #000}.homepage[data-v-708e6f45]{border:1px solid #9400ff;padding:.5em;text-align:center}.description[data-v-708e6f45]{padding:.5em 0}.event-image>img[data-v-708e6f45]{max-width:12em;max-height:12em}.contact-box p[data-v-0cc91918]{margin:0}.bottom-margin[data-v-0cc91918]{margin-bottom:1rem}span[data-v-2bbf7aa9]{cursor:pointer;color:blue;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

@@ -1 +0,0 @@
form div[data-v-403a0e0b]{margin-bottom:10px}.uploaded-image[data-v-403a0e0b]{display:inline-block;margin:0 0 .5em .5em;border:1px solid #e0e0e0;padding:10px}.uploaded-image input[data-v-403a0e0b],.uploaded-image textarea[data-v-403a0e0b]{width:100%;margin:5px 0}

View File

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

View File

@@ -1 +0,0 @@
table.worships[data-v-6bd31626]{border-collapse:collapse;width:100%}table.worships td[data-v-6bd31626]{border:1px solid #000;text-align:center}h3[data-v-6bd31626]{margin:0}table.worships td div[data-v-6bd31626]{margin:5px}.highlight-time[data-v-6bd31626]{text-decoration:underline}.neighborhood-invitation[data-v-6bd31626]{font-weight:700;color:#0020e0}a[data-v-6bd31626]{color:#0020e0}.internal-information[data-v-6bd31626]{color:#e45;font-style:italic}.image[data-v-9b711a1e]{max-width:400px;max-height:300px}.event-name[data-v-708e6f45]{font-weight:700}.event-table[data-v-708e6f45]{border-collapse:collapse}.event-table td[data-v-708e6f45]{border:1px solid #000}.homepage[data-v-708e6f45]{border:1px solid #9400ff;padding:.5em;text-align:center}.description[data-v-708e6f45]{padding:.5em 0}.event-image>img[data-v-708e6f45]{max-width:12em;max-height:12em}.contact-box p[data-v-0cc91918]{margin:0}.bottom-margin[data-v-0cc91918]{margin-bottom:1rem}span[data-v-2bbf7aa9]{cursor:pointer;color:blue;text-decoration:underline}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.right-column h2[data-v-d1b58e08]{text-align:center;color:#000}.right-column img[data-v-d1b58e08]{display:block;margin:0 auto;max-width:100%;height:auto}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.navbar[data-v-3c558f6e]{background-color:#9400ff;overflow:visible;min-height:31px;display:inline-flex;flex-direction:column;width:auto;margin:.1em .75em 9px .75em;box-shadow:0 0 2px 5px #9400ff}.menu-toggle[data-v-3c558f6e]{background-color:#9400ff;color:#fff;border:none;padding:14px 20px;text-align:center;text-decoration:none;display:none;font-weight:700}.navbar ul[data-v-3c558f6e]{list-style-type:none;margin:0;padding:0;display:flex}.navbar li[data-v-3c558f6e]{position:relative}.navbar a[data-v-3c558f6e],.navbar li>span[data-v-3c558f6e]{display:block;color:#fff;text-align:center;padding:6px 20px;text-decoration:none;font-weight:700}.navbar a[data-v-3c558f6e]:hover{background-color:#7a00d1}.menu-icon[data-v-3c558f6e]{width:20px;height:20px;margin-right:5px}.dropdown-content[data-v-3c558f6e]{position:absolute;background-color:#9400ff;min-width:200px;z-index:1;top:100%;left:0;opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility .2s ease-in-out;box-shadow:2px 2px 4px #666}.dropdown-content a[data-v-3c558f6e]{color:#fff;padding:12px 16px;text-decoration:none;display:block;text-align:left}.dropdown-content a[data-v-3c558f6e]:hover{background-color:#7a00d1}.navbar li:hover .dropdown-content[data-v-3c558f6e]{opacity:1;visibility:visible}.fade-enter-active[data-v-3c558f6e],.fade-leave-active[data-v-3c558f6e]{transition:opacity .2s ease-in-out,visibility .2s ease-in-out}.fade-enter[data-v-3c558f6e],.fade-leave-to[data-v-3c558f6e]{opacity:0;visibility:hidden}@media (max-width:768px){.navbar ul[data-v-3c558f6e],.navbar[data-v-3c558f6e]{flex-direction:column}.navbar li[data-v-3c558f6e]{width:100%}.navbar a[data-v-3c558f6e],.navbar li>span[data-v-3c558f6e]{text-align:left;padding:14px 20px}.menu-toggle[data-v-3c558f6e]{display:block}.dropdown-content[data-v-3c558f6e]{position:static;box-shadow:none;opacity:1;visibility:visible;display:none;padding-left:1em}.navbar li:hover .dropdown-content[data-v-3c558f6e]{display:block}}.pointer[data-v-3c558f6e]{cursor:pointer}.facettenkreuz[data-v-3c558f6e]{max-width:30px;max-height:30px;position:fixed}.ekhnlogo[data-v-3c558f6e]{width:32px}header[data-v-4e068f05]{display:flex;flex-direction:column;width:100%;background-color:#fff}.header-title[data-v-4e068f05]{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.3em .5em}header h1[data-v-4e068f05]{margin:0;flex:1;text-align:center;text-shadow:2px 2px 1px #e0bfff;padding-bottom:4px}.reload-icon[data-v-4e068f05]{font-size:16px;cursor:pointer;margin-left:10px;background-color:#e0bfff;color:#fff;padding:5px;border-radius:50%}.reload-icon[data-v-4e068f05]:hover{color:#7a00d1}.footer[data-v-65c666da]{background-color:#0b1735;bottom:0;left:0;width:100%;padding:7px;justify-content:space-between}.footer[data-v-65c666da],.left-links[data-v-65c666da],.right-links[data-v-65c666da]{display:flex;align-items:center}.footer a[data-v-65c666da]{color:#fff;padding-right:20px;text-decoration:none}.footer a.login-link[data-v-65c666da]{color:#444}.footer a.logout-link[data-v-65c666da]{cursor:pointer}body,html{height:100%;margin:0;padding:0;background-color:#fff;font-family:Arial,sans-serif;width:100%;overflow-x:hidden}#app{display:flex;flex-direction:column;height:100%}.content-section{flex:1;display:flex;color:#000;overflow-y:hidden}.left-column{flex:1;min-width:1000px;margin:.5em 0 .5em .5em;padding-right:.5em;background-color:#fff;overflow-y:auto}.right-column{flex:1;background-color:#d9e2f3;overflow-y:auto;margin:0 7px 7px 0}.right-column h2{text-align:center;color:#000}.right-column img{display:block;margin:0 auto;max-width:100%;height:auto}.right-column-overlay{max-height:150px;overflow-y:hidden;margin-top:10px;background-color:#d9e2f3;display:flex;justify-content:center;align-items:center}.right-column-overlay img{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}@media (max-width:1200px){.content-section{flex-direction:column}.left-column{padding:10px}.right-column{display:none}.right-column-overlay{display:flex;max-height:150px;background-color:#fff}.right-column-overlay img{max-height:150px;max-width:100%;-o-object-fit:contain;object-fit:contain}}@media (max-width:767px){.content-section{flex-direction:column}.left-column,.right-column{padding:10px}.right-column{display:none}.right-column-overlay{display:flex}}.htmleditor{background-color:#fff;width:calc(100% - 26px);height:31em;border:1px solid #000;margin:7px;padding:5px;overflow:auto}.htmleditor table{border:1px solid #e0e0e0;border-collapse:collapse}.htmleditor td,.htmleditor th{border:1px solid #e0e0e0}

View File

@@ -1,19 +1 @@
<!doctype html> <!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>miriamgemeinde</title><script defer="defer" src="/js/chunk-vendors.a58901d9.js"></script><script defer="defer" src="/js/app.2b3ac443.js"></script><link href="/css/app.c2c4030a.css" rel="stylesheet"><script defer="defer" src="/js/chunk-vendors.a58901d9.js"></script><script defer="defer" src="/js/app.62331f73.js"></script><link href="/css/app.c2c4030a.css" rel="stylesheet"><script defer="defer" src="/js/chunk-vendors.a58901d9.js"></script><script defer="defer" src="/js/app.f7f58406.js"></script><link href="/css/app.c2c4030a.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but miriamgemeinde doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="/favicon.ico">
<title>miriamgemeinde</title>
<script defer="defer" src="/js/chunk-vendors.4be41350.js"></script>
<script defer="defer" src="/js/app.09342435.js"></script>
<link href="/css/app.d740bb01.css" rel="stylesheet">
</head>
<body>
<noscript>
<strong>We're sorry but miriamgemeinde doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
</html>

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

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[150],{3909:function(e,t,n){n.r(t),n.d(t,{default:function(){return f}});var a=n(641),s=n(33);const i=e=>((0,a.Qi)("data-v-9a71cbf6"),e=e(),(0,a.jt)(),e),u=i((()=>(0,a.Lk)("div",{class:"previewinfo"},"Dies ist eine Vorschau.",-1)));function o(e,t,n,i,o,r){const c=(0,a.g2)("RenderContentComponent");return(0,a.uX)(),(0,a.CE)("div",null,[u,(0,a.Lk)("h1",null,(0,s.v_)(i.title),1),(0,a.bF)(c,{content:i.content},null,8,["content"])])}var r=n(6278),c=n(1708),l={name:"PagePreview",components:{RenderContentComponent:c.A},setup(){const e=(0,r.Pj)(),t=(0,a.EW)((()=>e.state.pageContent)),n=(0,a.EW)((()=>e.state.selectedPage)),s=(0,a.EW)((()=>e.state.menuData)),i=(0,a.EW)((()=>e.state.pageTitle)),u=t=>{const n=(e,t)=>{for(const a of e){if(a.link===t)return a.pageTitle||a.name;if(a.submenu&&a.submenu.length>0){const e=n(a.submenu,t);if(e)return e}}return""};e.dispatch("setPageTitle",n(s.value,t))};return(0,a.nT)((()=>{u(n.value)})),{content:t,title:i}}},m=n(6262);const d=(0,m.A)(l,[["render",o],["__scopeId","data-v-9a71cbf6"]]);var f=d}}]);
//# sourceMappingURL=150.927ca906.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"js/150.927ca906.js","mappings":"mQAEIA,EAAAA,EAAAA,IAAsD,OAAjDC,MAAM,eAAc,2BAAuB,K,qFADlDC,EAAAA,EAAAA,IAIM,YAHJC,GACAH,EAAAA,EAAAA,IAAoB,WAAAI,EAAAA,EAAAA,IAAbC,EAAAC,OAAK,IACZC,EAAAA,EAAAA,IAA6CC,EAAA,CAApBC,QAASJ,EAAAI,SAAO,qB,yBAS7C,GACEC,KAAM,cACNC,WAAY,CACVC,uBAAsBA,EAAAA,GAExBC,KAAAA,GACE,MAAMC,GAAQC,EAAAA,EAAAA,MACRN,GAAUO,EAAAA,EAAAA,KAAS,IAAMF,EAAMG,MAAMC,cACrCC,GAAeH,EAAAA,EAAAA,KAAS,IAAMF,EAAMG,MAAME,eAC1CC,GAAWJ,EAAAA,EAAAA,KAAS,IAAMF,EAAMG,MAAMG,WACtCd,GAAQU,EAAAA,EAAAA,KAAS,IAAMF,EAAMG,MAAMI,YAEnCC,EAAYC,IAChB,MAAMC,EAAYA,CAACC,EAAWF,KAC5B,IAAK,MAAMG,KAAQD,EAAW,CAC5B,GAAIC,EAAKH,OAASA,EAChB,OAAOG,EAAKL,WAAaK,EAAKhB,KAEhC,GAAIgB,EAAKC,SAAWD,EAAKC,QAAQC,OAAS,EAAG,CAC3C,MAAMC,EAAQL,EAAUE,EAAKC,QAASJ,GACtC,GAAIM,EACF,OAAOA,CAEX,CACF,CACA,MAAO,EAAE,EAEXf,EAAMgB,SAAS,eAAgBN,EAAUJ,EAASW,MAAOR,GAAM,EAOjE,OAJAS,EAAAA,EAAAA,KAAY,KACVV,EAASH,EAAaY,MAAM,IAGvB,CACLtB,UACAH,QAEJ,G,UC5CF,MAAM2B,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O","sources":["webpack://miriamgemeinde/./src/content/admin/PagePreviewComponent.vue","webpack://miriamgemeinde/./src/content/admin/PagePreviewComponent.vue?4023"],"sourcesContent":["<template>\n <div>\n <div class=\"previewinfo\">Dies ist eine Vorschau.</div>\n <h1>{{ title }}</h1>\n <RenderContentComponent :content=\"content\" />\n </div>\n</template>\n\n<script>\nimport { computed, watchEffect } from 'vue';\nimport { useStore } from 'vuex';\nimport RenderContentComponent from '@/components/RenderContentComponent.vue';\n\nexport default {\n name: 'PagePreview',\n components: {\n RenderContentComponent\n },\n setup() {\n const store = useStore();\n const content = computed(() => store.state.pageContent);\n const selectedPage = computed(() => store.state.selectedPage);\n const menuData = computed(() => store.state.menuData);\n const title = computed(() => store.state.pageTitle);\n\n const setTitle = (link) => {\n const findTitle = (menuItems, link) => {\n for (const item of menuItems) {\n if (item.link === link) {\n return item.pageTitle || item.name;\n }\n if (item.submenu && item.submenu.length > 0) {\n const found = findTitle(item.submenu, link);\n if (found) {\n return found;\n }\n }\n }\n return '';\n };\n store.dispatch('setPageTitle', findTitle(menuData.value, link));\n };\n\n watchEffect(() => {\n setTitle(selectedPage.value);\n });\n\n return {\n content,\n title\n };\n }\n};\n</script>\n\n<style scoped>\n.previewinfo {\n background-color: black;\n color: #d00000;\n position: absolute;\n top: 93px;\n left: 0;\n padding: 2px 10px;\n font-weight: bold;\n}\n</style>\n","import { render } from \"./PagePreviewComponent.vue?vue&type=template&id=9a71cbf6&scoped=true\"\nimport script from \"./PagePreviewComponent.vue?vue&type=script&lang=js\"\nexport * from \"./PagePreviewComponent.vue?vue&type=script&lang=js\"\n\nimport \"./PagePreviewComponent.vue?vue&type=style&index=0&id=9a71cbf6&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-9a71cbf6\"]])\n\nexport default __exports__"],"names":["_createElementVNode","class","_createElementBlock","_hoisted_1","_toDisplayString","$setup","title","_createVNode","_component_RenderContentComponent","content","name","components","RenderContentComponent","setup","store","useStore","computed","state","pageContent","selectedPage","menuData","pageTitle","setTitle","link","findTitle","menuItems","item","submenu","length","found","dispatch","value","watchEffect","__exports__","render"],"sourceRoot":""}

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[183],{8183:function(e,r,t){t.r(r),t.d(r,{default:function(){return y}});var s=t(641),n=t(33),a=t(3751);const i=e=>((0,s.Qi)("data-v-a495c756"),e=e(),(0,s.jt)(),e),u={class:"user-administration"},l=i((()=>(0,s.Lk)("h1",null,"Benutzerverwaltung",-1))),o=i((()=>(0,s.Lk)("label",{for:"name"},"Name:",-1))),c=i((()=>(0,s.Lk)("label",{for:"email"},"Email:",-1))),d=i((()=>(0,s.Lk)("label",{for:"password"},"Passwort:",-1))),m=["required"],h=i((()=>(0,s.Lk)("label",{for:"active"},"Aktiv:",-1))),p={type:"submit"},U={key:1},k=i((()=>(0,s.Lk)("h2",null,"Vorhandene Benutzer",-1))),v=["onClick"];function b(e,r,t,i,b,C){return(0,s.uX)(),(0,s.CE)("div",u,[l,(0,s.Lk)("h2",null,(0,n.v_)(C.formTitle),1),(0,s.Lk)("form",{onSubmit:r[4]||(r[4]=(0,a.D$)(((...e)=>C.saveUser&&C.saveUser(...e)),["prevent"]))},[o,(0,s.bo)((0,s.Lk)("input",{id:"name","onUpdate:modelValue":r[0]||(r[0]=e=>b.currentUser.name=e),required:""},null,512),[[a.Jo,b.currentUser.name]]),c,(0,s.bo)((0,s.Lk)("input",{id:"email","onUpdate:modelValue":r[1]||(r[1]=e=>b.currentUser.email=e),type:"email",required:""},null,512),[[a.Jo,b.currentUser.email]]),d,(0,s.bo)((0,s.Lk)("input",{id:"password","onUpdate:modelValue":r[2]||(r[2]=e=>b.currentUser.password=e),type:"password",required:b.isCreating},null,8,m),[[a.Jo,b.currentUser.password]]),(0,s.Lk)("div",null,[h,(0,s.bo)((0,s.Lk)("input",{id:"active","onUpdate:modelValue":r[3]||(r[3]=e=>b.currentUser.active=e),type:"checkbox"},null,512),[[a.lH,b.currentUser.active]])]),(0,s.Lk)("button",p,(0,n.v_)(b.isCreating?"Erstellen":"Aktualisieren"),1)],32),b.isCreating?(0,s.Q3)("",!0):((0,s.uX)(),(0,s.CE)("button",{key:0,onClick:r[5]||(r[5]=(...e)=>C.resetForm&&C.resetForm(...e))},"Zurück zu Benutzer erstellen")),b.users.length?((0,s.uX)(),(0,s.CE)("div",U,[k,(0,s.Lk)("ul",null,[((0,s.uX)(!0),(0,s.CE)(s.FK,null,(0,s.pI)(b.users,(e=>((0,s.uX)(),(0,s.CE)("li",{key:e.id,onClick:r=>C.editUser(e)},(0,n.v_)(e.name)+" ("+(0,n.v_)(e.email)+") ",9,v)))),128))])])):(0,s.Q3)("",!0)])}var C=t(3173),f={name:"UserAdministration",data(){return{users:[],currentUser:{name:"",email:"",password:"",active:!1},isCreating:!0}},computed:{formTitle(){return this.isCreating?"Benutzer erstellen":"Benutzer bearbeiten"}},methods:{async fetchUsers(){try{const e=await C.A.get("/users");this.users=e.data}catch(e){console.error("Fehler beim Abrufen der Benutzer:",e)}},async saveUser(){this.isCreating?await this.createUser():await this.updateUser(),this.resetForm(),this.fetchUsers()},async createUser(){try{await C.A.post("/users",this.currentUser)}catch(e){console.error("Fehler beim Erstellen des Benutzers:",e)}},async updateUser(){try{await C.A.put(`/users/${this.currentUser.id}`,this.currentUser)}catch(e){console.error("Fehler beim Aktualisieren des Benutzers:",e)}},editUser(e){this.currentUser={...e,password:""},this.isCreating=!1},resetForm(){this.currentUser={name:"",email:"",password:"",active:!1},this.isCreating=!0}},mounted(){this.fetchUsers()}},w=t(6262);const L=(0,w.A)(f,[["render",b],["__scopeId","data-v-a495c756"]]);var y=L}}]);
//# sourceMappingURL=183.0b8efb45.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[187],{8187:function(e,t,n){n.r(t),n.d(t,{default:function(){return C}});var l=n(641),a=n(3751),i=n(33);const d=e=>((0,l.Qi)("data-v-4e6631f7"),e=e(),(0,l.jt)(),e),c={class:"event-places-management"},o=d((()=>(0,l.Lk)("h2",null,"Veranstaltungsorte verwalten",-1))),r=d((()=>(0,l.Lk)("label",{for:"name"},"Name:",-1))),s=d((()=>(0,l.Lk)("label",{for:"street"},"Straße:",-1))),u=d((()=>(0,l.Lk)("label",{for:"zipcode"},"PLZ:",-1))),p=d((()=>(0,l.Lk)("label",{for:"city"},"Stadt:",-1))),v=d((()=>(0,l.Lk)("label",{for:"city"},"Webseite:",-1))),k=d((()=>(0,l.Lk)("label",{for:"backgroundColor"},"Hintergrundfarbe:",-1))),h=d((()=>(0,l.Lk)("button",{type:"submit"},"Speichern",-1))),b=d((()=>(0,l.Lk)("thead",null,[(0,l.Lk)("tr",null,[(0,l.Lk)("th",null,"Name"),(0,l.Lk)("th",null,"Bearbeiten"),(0,l.Lk)("th",null,"Löschen")])],-1))),P=["onClick"],f=["onClick"];function E(e,t,n,d,E,m){return(0,l.uX)(),(0,l.CE)("div",c,[o,(0,l.Lk)("form",{onSubmit:t[7]||(t[7]=(0,a.D$)(((...e)=>m.addEventPlace&&m.addEventPlace(...e)),["prevent"]))},[r,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"name","onUpdate:modelValue":t[0]||(t[0]=e=>E.newEventPlace.name=e),placeholder:"Name",required:""},null,512),[[a.Jo,E.newEventPlace.name]]),s,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"street","onUpdate:modelValue":t[1]||(t[1]=e=>E.newEventPlace.street=e),placeholder:"Straße",required:""},null,512),[[a.Jo,E.newEventPlace.street]]),u,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"zipcode","onUpdate:modelValue":t[2]||(t[2]=e=>E.newEventPlace.zipcode=e),placeholder:"PLZ",required:""},null,512),[[a.Jo,E.newEventPlace.zipcode]]),p,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"city","onUpdate:modelValue":t[3]||(t[3]=e=>E.newEventPlace.city=e),placeholder:"Stadt",required:""},null,512),[[a.Jo,E.newEventPlace.city]]),v,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"website","onUpdate:modelValue":t[4]||(t[4]=e=>E.newEventPlace.website=e),placeholder:"Webseite",required:""},null,512),[[a.Jo,E.newEventPlace.website]]),k,(0,l.bo)((0,l.Lk)("input",{type:"color",id:"backgroundColor","onUpdate:modelValue":t[5]||(t[5]=e=>E.newEventPlace.backgroundColor=e)},null,512),[[a.Jo,E.newEventPlace.backgroundColor]]),h,E.editMode?((0,l.uX)(),(0,l.CE)("button",{key:0,type:"button",onClick:t[6]||(t[6]=(...e)=>m.resetForm&&m.resetForm(...e))},"Neuen Veranstaltungsort erstellen")):(0,l.Q3)("",!0)],32),(0,l.Lk)("table",null,[b,(0,l.Lk)("tbody",null,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(E.eventPlaces,(e=>((0,l.uX)(),(0,l.CE)("tr",{key:e.id},[(0,l.Lk)("td",null,(0,i.v_)(e.name),1),(0,l.Lk)("td",null,[(0,l.Lk)("button",{onClick:t=>m.editEventPlace(e)},"Bearbeiten",8,P)]),(0,l.Lk)("td",null,[(0,l.Lk)("button",{onClick:t=>m.deleteEventPlace(e.id)},"Löschen",8,f)])])))),128))])])])}n(4114);var m=n(4335),w={data(){return{eventPlaces:[],newEventPlace:{name:"",street:"",zipcode:"",city:"",backgroundColor:"#ffffff",website:""},editMode:!1,editId:null}},methods:{async fetchEventPlaces(){const e=await m.A.get("/event-places");this.eventPlaces=e.data},async addEventPlace(){if(this.editMode)await m.A.put(`/event-places/${this.editId}`,this.newEventPlace);else{const e=await m.A.post("/event-places",this.newEventPlace);this.eventPlaces.push(e.data)}this.resetForm(),await this.fetchEventPlaces()},async updateEventPlace(e){await m.A.put(`/event-places/${e.id}`,e),this.fetchEventPlaces()},async deleteEventPlace(e){await m.A.delete(`/event-places/${e}`),this.fetchEventPlaces()},editEventPlace(e){this.newEventPlace={...e},this.editMode=!0,this.editId=e.id},resetForm(){this.newEventPlace={name:"",street:"",zipcode:"",city:"",backgroundColor:"#ffffff",website:""},this.editMode=!1,this.editId=null}},created(){this.fetchEventPlaces()}},L=n(6262);const y=(0,L.A)(w,[["render",E],["__scopeId","data-v-4e6631f7"]]);var C=y}}]);
//# sourceMappingURL=187.7a1ca760.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[187],{8187:function(e,t,n){n.r(t),n.d(t,{default:function(){return C}});var l=n(641),a=n(3751),i=n(33);const d=e=>((0,l.Qi)("data-v-4e6631f7"),e=e(),(0,l.jt)(),e),c={class:"event-places-management"},o=d((()=>(0,l.Lk)("h2",null,"Veranstaltungsorte verwalten",-1))),r=d((()=>(0,l.Lk)("label",{for:"name"},"Name:",-1))),s=d((()=>(0,l.Lk)("label",{for:"street"},"Straße:",-1))),u=d((()=>(0,l.Lk)("label",{for:"zipcode"},"PLZ:",-1))),p=d((()=>(0,l.Lk)("label",{for:"city"},"Stadt:",-1))),v=d((()=>(0,l.Lk)("label",{for:"city"},"Webseite:",-1))),k=d((()=>(0,l.Lk)("label",{for:"backgroundColor"},"Hintergrundfarbe:",-1))),h=d((()=>(0,l.Lk)("button",{type:"submit"},"Speichern",-1))),b=d((()=>(0,l.Lk)("thead",null,[(0,l.Lk)("tr",null,[(0,l.Lk)("th",null,"Name"),(0,l.Lk)("th",null,"Bearbeiten"),(0,l.Lk)("th",null,"Löschen")])],-1))),P=["onClick"],f=["onClick"];function E(e,t,n,d,E,m){return(0,l.uX)(),(0,l.CE)("div",c,[o,(0,l.Lk)("form",{onSubmit:t[7]||(t[7]=(0,a.D$)(((...e)=>m.addEventPlace&&m.addEventPlace(...e)),["prevent"]))},[r,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"name","onUpdate:modelValue":t[0]||(t[0]=e=>E.newEventPlace.name=e),placeholder:"Name",required:""},null,512),[[a.Jo,E.newEventPlace.name]]),s,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"street","onUpdate:modelValue":t[1]||(t[1]=e=>E.newEventPlace.street=e),placeholder:"Straße",required:""},null,512),[[a.Jo,E.newEventPlace.street]]),u,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"zipcode","onUpdate:modelValue":t[2]||(t[2]=e=>E.newEventPlace.zipcode=e),placeholder:"PLZ",required:""},null,512),[[a.Jo,E.newEventPlace.zipcode]]),p,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"city","onUpdate:modelValue":t[3]||(t[3]=e=>E.newEventPlace.city=e),placeholder:"Stadt",required:""},null,512),[[a.Jo,E.newEventPlace.city]]),v,(0,l.bo)((0,l.Lk)("input",{type:"text",id:"website","onUpdate:modelValue":t[4]||(t[4]=e=>E.newEventPlace.website=e),placeholder:"Webseite",required:""},null,512),[[a.Jo,E.newEventPlace.website]]),k,(0,l.bo)((0,l.Lk)("input",{type:"color",id:"backgroundColor","onUpdate:modelValue":t[5]||(t[5]=e=>E.newEventPlace.backgroundColor=e)},null,512),[[a.Jo,E.newEventPlace.backgroundColor]]),h,E.editMode?((0,l.uX)(),(0,l.CE)("button",{key:0,type:"button",onClick:t[6]||(t[6]=(...e)=>m.resetForm&&m.resetForm(...e))},"Neuen Veranstaltungsort erstellen")):(0,l.Q3)("",!0)],32),(0,l.Lk)("table",null,[b,(0,l.Lk)("tbody",null,[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(E.eventPlaces,(e=>((0,l.uX)(),(0,l.CE)("tr",{key:e.id},[(0,l.Lk)("td",null,(0,i.v_)(e.name),1),(0,l.Lk)("td",null,[(0,l.Lk)("button",{onClick:t=>m.editEventPlace(e)},"Bearbeiten",8,P)]),(0,l.Lk)("td",null,[(0,l.Lk)("button",{onClick:t=>m.deleteEventPlace(e.id)},"Löschen",8,f)])])))),128))])])])}n(4114);var m=n(4335),w={data(){return{eventPlaces:[],newEventPlace:{name:"",street:"",zipcode:"",city:"",backgroundColor:"#ffffff",website:""},editMode:!1,editId:null}},methods:{async fetchEventPlaces(){const e=await m.A.get("/event-places");this.eventPlaces=e.data},async addEventPlace(){if(this.editMode)await m.A.put(`/event-places/${this.editId}`,this.newEventPlace);else{const e=await m.A.post("/event-places",this.newEventPlace);this.eventPlaces.push(e.data)}this.resetForm(),await this.fetchEventPlaces()},async updateEventPlace(e){await m.A.put(`/event-places/${e.id}`,e),this.fetchEventPlaces()},async deleteEventPlace(e){await m.A.delete(`/event-places/${e}`),this.fetchEventPlaces()},editEventPlace(e){this.newEventPlace={...e},this.editMode=!0,this.editId=e.id},resetForm(){this.newEventPlace={name:"",street:"",zipcode:"",city:"",backgroundColor:"#ffffff",website:""},this.editMode=!1,this.editId=null}},created(){this.fetchEventPlaces()}},L=n(6262);const y=(0,L.A)(w,[["render",E],["__scopeId","data-v-4e6631f7"]]);var C=y}}]);
//# sourceMappingURL=187.83b148e8.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[23],{2023:function(e,n,t){t.r(n),t.d(n,{default:function(){return k}});var u=t(641),r=t(33);const i=e=>((0,u.Qi)("data-v-68b32234"),e=e(),(0,u.jt)(),e),a=i((()=>(0,u.Lk)("h1",null,"Seitenpflege",-1))),l=i((()=>(0,u.Lk)("p",null,"Herzlich Willkommen. Auf diesen Seiten können Sie die Inhalte der Webseiten pflegen.",-1)));function o(e,n,t,i,o,d){const s=(0,u.g2)("router-link");return(0,u.uX)(),(0,u.CE)("div",null,[a,l,(0,u.Lk)("ul",null,[((0,u.uX)(!0),(0,u.CE)(u.FK,null,(0,u.pI)(i.adminSubmenu,(e=>((0,u.uX)(),(0,u.CE)("li",{key:e.id},[(0,u.bF)(s,{to:e.link},{default:(0,u.k6)((()=>[(0,u.eW)((0,r.v_)(e.name),1)])),_:2},1032,["to"])])))),128))])])}t(8992),t(2577);var d=t(6296),s=t(953),c={name:"DefaultComponent",setup(){const e=(0,s.KR)([]),n=async()=>{try{const n=await d.A.get("/menu-data"),t=n.data,u=t.find((e=>"Admin"===e.name));u&&(e.value=u.submenu)}catch(n){console.error("Fehler beim Abrufen der Menü-Daten:",n)}};return(0,u.sV)((()=>{n()})),{adminSubmenu:e}}},m=t(6262);const f=(0,m.A)(c,[["render",o],["__scopeId","data-v-68b32234"]]);var k=f},2577:function(e,n,t){var u=t(6518),r=t(2652),i=t(9306),a=t(8551),l=t(1767);u({target:"Iterator",proto:!0,real:!0},{find:function(e){a(this),i(e);var n=l(this),t=0;return r(n,(function(n,u){if(e(n,t++))return u(n)}),{IS_RECORD:!0,INTERRUPTED:!0}).result}})}}]);
//# sourceMappingURL=23.179aa174.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"js/23.179aa174.js","mappings":"kQAEIA,EAAAA,EAAAA,IAAqB,UAAjB,gBAAY,K,UAChBA,EAAAA,EAAAA,IAA2F,SAAxF,wFAAoF,K,0EAFzFC,EAAAA,EAAAA,IAQM,YAPJC,EACAC,GACAH,EAAAA,EAAAA,IAIK,a,aAHHC,EAAAA,EAAAA,IAEKG,EAAAA,GAAA,MAPXC,EAAAA,EAAAA,IAKyBC,EAAAC,cAARC,K,WAAXP,EAAAA,EAAAA,IAEK,MAF6BQ,IAAKD,EAAKE,I,EAC1CC,EAAAA,EAAAA,IAA0DC,EAAA,CAA5CC,GAAIL,EAAKM,M,CAN/BC,SAAAC,EAAAA,EAAAA,KAMqC,IAAe,EANpDC,EAAAA,EAAAA,KAAAC,EAAAA,EAAAA,IAMwCV,EAAKW,MAAI,MANjDC,EAAA,G,mEAgBA,GACED,KAAM,mBACNE,KAAAA,GACE,MAAMd,GAAee,EAAAA,EAAAA,IAAI,IAEnBC,EAAgBC,UACpB,IACE,MAAMC,QAAiBC,EAAAA,EAAMC,IAAI,cAC3BC,EAAWH,EAASI,KAGpBC,EAAYF,EAASG,MAAKvB,GAAsB,UAAdA,EAAKW,OACzCW,IACFvB,EAAayB,MAAQF,EAAUG,QAEnC,CAAE,MAAOC,GACPC,QAAQD,MAAM,sCAAuCA,EACvD,GAOF,OAJAE,EAAAA,EAAAA,KAAU,KACRb,GAAe,IAGV,CACLhB,eAEJ,G,UCpCF,MAAM8B,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O,uBCRA,IAAIC,EAAI,EAAQ,MACZC,EAAU,EAAQ,MAClBC,EAAY,EAAQ,MACpBC,EAAW,EAAQ,MACnBC,EAAoB,EAAQ,MAIhCJ,EAAE,CAAEK,OAAQ,WAAYC,OAAO,EAAMC,MAAM,GAAQ,CACjDf,KAAM,SAAcgB,GAClBL,EAASM,MACTP,EAAUM,GACV,IAAIE,EAASN,EAAkBK,MAC3BE,EAAU,EACd,OAAOV,EAAQS,GAAQ,SAAUjB,EAAOmB,GACtC,GAAIJ,EAAUf,EAAOkB,KAAY,OAAOC,EAAKnB,EAC/C,GAAG,CAAEoB,WAAW,EAAMC,aAAa,IAAQC,MAC7C,G","sources":["webpack://miriamgemeinde/./src/content/admin/IndexContent.vue","webpack://miriamgemeinde/./src/content/admin/IndexContent.vue?5c80","webpack://miriamgemeinde/./node_modules/core-js/modules/esnext.iterator.find.js"],"sourcesContent":["<template>\n <div>\n <h1>Seitenpflege</h1>\n <p>Herzlich Willkommen. Auf diesen Seiten können Sie die Inhalte der Webseiten pflegen.</p>\n <ul>\n <li v-for=\"item in adminSubmenu\" :key=\"item.id\">\n <router-link :to=\"item.link\">{{ item.name }}</router-link>\n </li>\n </ul>\n </div>\n</template>\n\n<script>\nimport axios from \"../../axios\";\nimport { ref, onMounted } from 'vue';\n\nexport default {\n name: 'DefaultComponent',\n setup() {\n const adminSubmenu = ref([]);\n\n const fetchMenuData = async () => {\n try {\n const response = await axios.get('/menu-data');\n const menuData = response.data;\n\n // Suche nach dem Admin-Submenü\n const adminMenu = menuData.find(item => item.name === 'Admin');\n if (adminMenu) {\n adminSubmenu.value = adminMenu.submenu;\n }\n } catch (error) {\n console.error('Fehler beim Abrufen der Menü-Daten:', error);\n }\n };\n\n onMounted(() => {\n fetchMenuData();\n });\n\n return {\n adminSubmenu\n };\n }\n};\n</script>\n\n<style scoped>\ndiv {\n padding: 20px;\n}\n\nul {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n\nli {\n padding: 0;\n margin: 0;\n}\n</style>\n","import { render } from \"./IndexContent.vue?vue&type=template&id=68b32234&scoped=true\"\nimport script from \"./IndexContent.vue?vue&type=script&lang=js\"\nexport * from \"./IndexContent.vue?vue&type=script&lang=js\"\n\nimport \"./IndexContent.vue?vue&type=style&index=0&id=68b32234&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-68b32234\"]])\n\nexport default __exports__","'use strict';\nvar $ = require('../internals/export');\nvar iterate = require('../internals/iterate');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\n\n// `Iterator.prototype.find` method\n// https://github.com/tc39/proposal-iterator-helpers\n$({ target: 'Iterator', proto: true, real: true }, {\n find: function find(predicate) {\n anObject(this);\n aCallable(predicate);\n var record = getIteratorDirect(this);\n var counter = 0;\n return iterate(record, function (value, stop) {\n if (predicate(value, counter++)) return stop(value);\n }, { IS_RECORD: true, INTERRUPTED: true }).result;\n }\n});\n"],"names":["_createElementVNode","_createElementBlock","_hoisted_1","_hoisted_2","_Fragment","_renderList","$setup","adminSubmenu","item","key","id","_createVNode","_component_router_link","to","link","default","_withCtx","_createTextVNode","_toDisplayString","name","_","setup","ref","fetchMenuData","async","response","axios","get","menuData","data","adminMenu","find","value","submenu","error","console","onMounted","__exports__","render","$","iterate","aCallable","anObject","getIteratorDirect","target","proto","real","predicate","this","record","counter","stop","IS_RECORD","INTERRUPTED","result"],"sourceRoot":""}

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[23],{2023:function(e,n,t){t.r(n),t.d(n,{default:function(){return k}});var u=t(641),r=t(33);const i=e=>((0,u.Qi)("data-v-68b32234"),e=e(),(0,u.jt)(),e),a=i((()=>(0,u.Lk)("h1",null,"Seitenpflege",-1))),l=i((()=>(0,u.Lk)("p",null,"Herzlich Willkommen. Auf diesen Seiten können Sie die Inhalte der Webseiten pflegen.",-1)));function o(e,n,t,i,o,d){const s=(0,u.g2)("router-link");return(0,u.uX)(),(0,u.CE)("div",null,[a,l,(0,u.Lk)("ul",null,[((0,u.uX)(!0),(0,u.CE)(u.FK,null,(0,u.pI)(i.adminSubmenu,(e=>((0,u.uX)(),(0,u.CE)("li",{key:e.id},[(0,u.bF)(s,{to:e.link},{default:(0,u.k6)((()=>[(0,u.eW)((0,r.v_)(e.name),1)])),_:2},1032,["to"])])))),128))])])}t(8992),t(2577);var d=t(6296),s=t(953),c={name:"DefaultComponent",setup(){const e=(0,s.KR)([]),n=async()=>{try{const n=await d.A.get("/menu-data"),t=n.data,u=t.find((e=>"Admin"===e.name));u&&(e.value=u.submenu)}catch(n){console.error("Fehler beim Abrufen der Menü-Daten:",n)}};return(0,u.sV)((()=>{n()})),{adminSubmenu:e}}},m=t(6262);const f=(0,m.A)(c,[["render",o],["__scopeId","data-v-68b32234"]]);var k=f},2577:function(e,n,t){var u=t(6518),r=t(2652),i=t(9306),a=t(8551),l=t(1767);u({target:"Iterator",proto:!0,real:!0},{find:function(e){a(this),i(e);var n=l(this),t=0;return r(n,(function(n,u){if(e(n,t++))return u(n)}),{IS_RECORD:!0,INTERRUPTED:!0}).result}})}}]);
//# sourceMappingURL=23.86dde413.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"js/23.86dde413.js","mappings":"kQAEIA,EAAAA,EAAAA,IAAqB,UAAjB,gBAAY,K,UAChBA,EAAAA,EAAAA,IAA2F,SAAxF,wFAAoF,K,0EAFzFC,EAAAA,EAAAA,IAQM,YAPJC,EACAC,GACAH,EAAAA,EAAAA,IAIK,a,aAHHC,EAAAA,EAAAA,IAEKG,EAAAA,GAAA,MAPXC,EAAAA,EAAAA,IAKyBC,EAAAC,cAARC,K,WAAXP,EAAAA,EAAAA,IAEK,MAF6BQ,IAAKD,EAAKE,I,EAC1CC,EAAAA,EAAAA,IAA0DC,EAAA,CAA5CC,GAAIL,EAAKM,M,CAN/BC,SAAAC,EAAAA,EAAAA,KAMqC,IAAe,EANpDC,EAAAA,EAAAA,KAAAC,EAAAA,EAAAA,IAMwCV,EAAKW,MAAI,MANjDC,EAAA,G,mEAgBA,GACED,KAAM,mBACNE,KAAAA,GACE,MAAMd,GAAee,EAAAA,EAAAA,IAAI,IAEnBC,EAAgBC,UACpB,IACE,MAAMC,QAAiBC,EAAAA,EAAMC,IAAI,cAC3BC,EAAWH,EAASI,KAGpBC,EAAYF,EAASG,MAAKvB,GAAsB,UAAdA,EAAKW,OACzCW,IACFvB,EAAayB,MAAQF,EAAUG,QAEnC,CAAE,MAAOC,GACPC,QAAQD,MAAM,sCAAuCA,EACvD,GAOF,OAJAE,EAAAA,EAAAA,KAAU,KACRb,GAAe,IAGV,CACLhB,eAEJ,G,UCpCF,MAAM8B,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O,uBCRA,IAAIC,EAAI,EAAQ,MACZC,EAAU,EAAQ,MAClBC,EAAY,EAAQ,MACpBC,EAAW,EAAQ,MACnBC,EAAoB,EAAQ,MAIhCJ,EAAE,CAAEK,OAAQ,WAAYC,OAAO,EAAMC,MAAM,GAAQ,CACjDf,KAAM,SAAcgB,GAClBL,EAASM,MACTP,EAAUM,GACV,IAAIE,EAASN,EAAkBK,MAC3BE,EAAU,EACd,OAAOV,EAAQS,GAAQ,SAAUjB,EAAOmB,GACtC,GAAIJ,EAAUf,EAAOkB,KAAY,OAAOC,EAAKnB,EAC/C,GAAG,CAAEoB,WAAW,EAAMC,aAAa,IAAQC,MAC7C,G","sources":["webpack://miriamgemeinde/./src/content/admin/IndexContent.vue","webpack://miriamgemeinde/./src/content/admin/IndexContent.vue?5c80","webpack://miriamgemeinde/./node_modules/core-js/modules/esnext.iterator.find.js"],"sourcesContent":["<template>\n <div>\n <h1>Seitenpflege</h1>\n <p>Herzlich Willkommen. Auf diesen Seiten können Sie die Inhalte der Webseiten pflegen.</p>\n <ul>\n <li v-for=\"item in adminSubmenu\" :key=\"item.id\">\n <router-link :to=\"item.link\">{{ item.name }}</router-link>\n </li>\n </ul>\n </div>\n</template>\n\n<script>\nimport axios from \"../../axios\";\nimport { ref, onMounted } from 'vue';\n\nexport default {\n name: 'DefaultComponent',\n setup() {\n const adminSubmenu = ref([]);\n\n const fetchMenuData = async () => {\n try {\n const response = await axios.get('/menu-data');\n const menuData = response.data;\n\n // Suche nach dem Admin-Submenü\n const adminMenu = menuData.find(item => item.name === 'Admin');\n if (adminMenu) {\n adminSubmenu.value = adminMenu.submenu;\n }\n } catch (error) {\n console.error('Fehler beim Abrufen der Menü-Daten:', error);\n }\n };\n\n onMounted(() => {\n fetchMenuData();\n });\n\n return {\n adminSubmenu\n };\n }\n};\n</script>\n\n<style scoped>\ndiv {\n padding: 20px;\n}\n\nul {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n\nli {\n padding: 0;\n margin: 0;\n}\n</style>\n","import { render } from \"./IndexContent.vue?vue&type=template&id=68b32234&scoped=true\"\nimport script from \"./IndexContent.vue?vue&type=script&lang=js\"\nexport * from \"./IndexContent.vue?vue&type=script&lang=js\"\n\nimport \"./IndexContent.vue?vue&type=style&index=0&id=68b32234&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-68b32234\"]])\n\nexport default __exports__","'use strict';\nvar $ = require('../internals/export');\nvar iterate = require('../internals/iterate');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar getIteratorDirect = require('../internals/get-iterator-direct');\n\n// `Iterator.prototype.find` method\n// https://github.com/tc39/proposal-iterator-helpers\n$({ target: 'Iterator', proto: true, real: true }, {\n find: function find(predicate) {\n anObject(this);\n aCallable(predicate);\n var record = getIteratorDirect(this);\n var counter = 0;\n return iterate(record, function (value, stop) {\n if (predicate(value, counter++)) return stop(value);\n }, { IS_RECORD: true, INTERRUPTED: true }).result;\n }\n});\n"],"names":["_createElementVNode","_createElementBlock","_hoisted_1","_hoisted_2","_Fragment","_renderList","$setup","adminSubmenu","item","key","id","_createVNode","_component_router_link","to","link","default","_withCtx","_createTextVNode","_toDisplayString","name","_","setup","ref","fetchMenuData","async","response","axios","get","menuData","data","adminMenu","find","value","submenu","error","console","onMounted","__exports__","render","$","iterate","aCallable","anObject","getIteratorDirect","target","proto","real","predicate","this","record","counter","stop","IS_RECORD","INTERRUPTED","result"],"sourceRoot":""}

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[246],{6246:function(e,t,n){n.r(t),n.d(t,{default:function(){return E}});var a=n(641),i=n(3751),s=n(33);const p=e=>((0,a.Qi)("data-v-60fe58a4"),e=e(),(0,a.jt)(),e),d={class:"event-types-management"},r=p((()=>(0,a.Lk)("h2",null,"Event-Typen Verwaltung",-1))),o=p((()=>(0,a.Lk)("label",{for:"newEventType"},"Event-Typ:",-1))),v={type:"submit"},y=["onClick"],l=["onClick"];function c(e,t,n,p,c,u){return(0,a.uX)(),(0,a.CE)("div",d,[r,(0,a.Lk)("form",{onSubmit:t[2]||(t[2]=(0,i.D$)(((...e)=>u.saveEventType&&u.saveEventType(...e)),["prevent"]))},[o,(0,a.bo)((0,a.Lk)("input",{type:"text",id:"newEventType","onUpdate:modelValue":t[0]||(t[0]=e=>c.eventTypeData.caption=e),placeholder:"Event-Typ",required:""},null,512),[[i.Jo,c.eventTypeData.caption]]),(0,a.Lk)("button",v,(0,s.v_)(c.editMode?"Aktualisieren":"Hinzufügen"),1),c.editMode?((0,a.uX)(),(0,a.CE)("button",{key:0,type:"button",onClick:t[1]||(t[1]=(...e)=>u.resetForm&&u.resetForm(...e))},"Abbrechen")):(0,a.Q3)("",!0)],32),(0,a.Lk)("table",null,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(c.eventTypes,(e=>((0,a.uX)(),(0,a.CE)("tr",{key:e.id},[(0,a.Lk)("td",null,(0,s.v_)(e.caption),1),(0,a.Lk)("td",null,[(0,a.Lk)("button",{onClick:t=>u.editEventType(e)},"Bearbeiten",8,y)]),(0,a.Lk)("td",null,[(0,a.Lk)("button",{onClick:t=>u.deleteEventType(e.id)},"Löschen",8,l)])])))),128))])])}n(4114);var u=n(4335),h={data(){return{eventTypes:[],eventTypeData:{caption:""},editMode:!1,editId:null}},methods:{async fetchEventTypes(){try{const e=await u.A.get("/event-types");this.eventTypes=e.data}catch(e){console.error("Fehler beim Abrufen der Event-Typen:",e)}},async saveEventType(){try{if(this.editMode)await u.A.put(`/event-types/${this.editId}`,this.eventTypeData);else{const e=await u.A.post("/event-types",this.eventTypeData);this.eventTypes.push(e.data)}this.resetForm(),await this.fetchEventTypes()}catch(e){console.error("Fehler beim Speichern des Event-Typs:",e)}},editEventType(e){this.eventTypeData={...e},this.editMode=!0,this.editId=e.id},async deleteEventType(e){try{await u.A.delete(`/event-types/${e}`),await this.fetchEventTypes()}catch(t){console.error("Fehler beim Löschen des Event-Typs:",t)}},resetForm(){this.eventTypeData={caption:""},this.editMode=!1,this.editId=null}},async created(){await this.fetchEventTypes()}},T=n(6262);const k=(0,T.A)(h,[["render",c],["__scopeId","data-v-60fe58a4"]]);var E=k}}]);
//# sourceMappingURL=246.760602fa.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[246],{6246:function(e,t,n){n.r(t),n.d(t,{default:function(){return E}});var a=n(641),i=n(3751),s=n(33);const p=e=>((0,a.Qi)("data-v-60fe58a4"),e=e(),(0,a.jt)(),e),d={class:"event-types-management"},r=p((()=>(0,a.Lk)("h2",null,"Event-Typen Verwaltung",-1))),o=p((()=>(0,a.Lk)("label",{for:"newEventType"},"Event-Typ:",-1))),v={type:"submit"},y=["onClick"],l=["onClick"];function c(e,t,n,p,c,u){return(0,a.uX)(),(0,a.CE)("div",d,[r,(0,a.Lk)("form",{onSubmit:t[2]||(t[2]=(0,i.D$)(((...e)=>u.saveEventType&&u.saveEventType(...e)),["prevent"]))},[o,(0,a.bo)((0,a.Lk)("input",{type:"text",id:"newEventType","onUpdate:modelValue":t[0]||(t[0]=e=>c.eventTypeData.caption=e),placeholder:"Event-Typ",required:""},null,512),[[i.Jo,c.eventTypeData.caption]]),(0,a.Lk)("button",v,(0,s.v_)(c.editMode?"Aktualisieren":"Hinzufügen"),1),c.editMode?((0,a.uX)(),(0,a.CE)("button",{key:0,type:"button",onClick:t[1]||(t[1]=(...e)=>u.resetForm&&u.resetForm(...e))},"Abbrechen")):(0,a.Q3)("",!0)],32),(0,a.Lk)("table",null,[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(c.eventTypes,(e=>((0,a.uX)(),(0,a.CE)("tr",{key:e.id},[(0,a.Lk)("td",null,(0,s.v_)(e.caption),1),(0,a.Lk)("td",null,[(0,a.Lk)("button",{onClick:t=>u.editEventType(e)},"Bearbeiten",8,y)]),(0,a.Lk)("td",null,[(0,a.Lk)("button",{onClick:t=>u.deleteEventType(e.id)},"Löschen",8,l)])])))),128))])])}n(4114);var u=n(4335),h={data(){return{eventTypes:[],eventTypeData:{caption:""},editMode:!1,editId:null}},methods:{async fetchEventTypes(){try{const e=await u.A.get("/event-types");this.eventTypes=e.data}catch(e){console.error("Fehler beim Abrufen der Event-Typen:",e)}},async saveEventType(){try{if(this.editMode)await u.A.put(`/event-types/${this.editId}`,this.eventTypeData);else{const e=await u.A.post("/event-types",this.eventTypeData);this.eventTypes.push(e.data)}this.resetForm(),await this.fetchEventTypes()}catch(e){console.error("Fehler beim Speichern des Event-Typs:",e)}},editEventType(e){this.eventTypeData={...e},this.editMode=!0,this.editId=e.id},async deleteEventType(e){try{await u.A.delete(`/event-types/${e}`),await this.fetchEventTypes()}catch(t){console.error("Fehler beim Löschen des Event-Typs:",t)}},resetForm(){this.eventTypeData={caption:""},this.editMode=!1,this.editId=null}},async created(){await this.fetchEventTypes()}},T=n(6262);const k=(0,T.A)(h,[["render",c],["__scopeId","data-v-60fe58a4"]]);var E=k}}]);
//# sourceMappingURL=246.bc7aeb2e.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[260],{4260:function(e,l,t){t.r(l),t.d(l,{default:function(){return c}});var a=t(641),i=t(33);const o={key:0,class:"dialog-overlay"},n={class:"dialog"};function s(e,l,t,s,r,u){return t.modelValue?((0,a.uX)(),(0,a.CE)("div",o,[(0,a.Lk)("div",n,[(0,a.Lk)("h2",null,(0,i.v_)(t.title),1),(0,a.Lk)("p",null,(0,i.v_)(t.message),1),(0,a.Lk)("button",{onClick:l[0]||(l[0]=(...e)=>u.closeDialog&&u.closeDialog(...e))},"OK")])])):(0,a.Q3)("",!0)}var r={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")}}},u=t(6262);const d=(0,u.A)(r,[["render",s],["__scopeId","data-v-64c2e06a"]]);var c=d}}]);
//# sourceMappingURL=260.a0d49da0.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"js/260.a0d49da0.js","mappings":"sMAAAA,IAAA,EACyBC,MAAM,kB,GACtBA,MAAM,U,+BADFC,EAAAC,a,WAAXC,EAAAA,EAAAA,IAMM,MANNC,EAMM,EALJC,EAAAA,EAAAA,IAIM,MAJNC,EAIM,EAHJD,EAAAA,EAAAA,IAAoB,WAAAE,EAAAA,EAAAA,IAAbN,EAAAO,OAAK,IACZH,EAAAA,EAAAA,IAAoB,UAAAE,EAAAA,EAAAA,IAAdN,EAAAQ,SAAO,IACbJ,EAAAA,EAAAA,IAAwC,UAA/BK,QAAKC,EAAA,KAAAA,EAAA,OAAAC,IAAEC,EAAAC,aAAAD,EAAAC,eAAAF,KAAa,YALnCG,EAAAA,EAAAA,IAAA,M,CAWA,OACEC,KAAM,kBACNC,MAAO,CACLT,MAAO,CACLU,KAAMC,OACNC,UAAU,GAEZX,QAAS,CACPS,KAAMC,OACNC,UAAU,GAEZlB,WAAY,CACVgB,KAAMG,QACNC,SAAS,IAGbC,QAAS,CACPT,WAAAA,GACEU,KAAKC,MAAM,qBAAqB,GAChCD,KAAKC,MAAM,QACb,I,UCxBJ,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O","sources":["webpack://miriamgemeinde/./src/common/components/DialogComponent.vue","webpack://miriamgemeinde/./src/common/components/DialogComponent.vue?92fc"],"sourcesContent":["<template>\n <div v-if=\"modelValue\" class=\"dialog-overlay\">\n <div class=\"dialog\">\n <h2>{{ title }}</h2>\n <p>{{ message }}</p>\n <button @click=\"closeDialog\">OK</button>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: 'DialogComponent',\n props: {\n title: {\n type: String,\n required: true\n },\n message: {\n type: String,\n required: true\n },\n modelValue: {\n type: Boolean,\n default: false\n }\n },\n methods: {\n closeDialog() {\n this.$emit('update:modelValue', false);\n this.$emit('close');\n }\n }\n};\n</script>\n\n<style scoped>\n.dialog-overlay {\n top: calc(50% - 25em);\n left: 5%;\n width: 90%;\n height: 50em;\n background: rgba(0, 0, 0, .5);\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: auto;\n}\n\n.dialog {\n background: white;\n padding: 20px;\n border-radius: 5px;\n max-width: 400px;\n width: 100%;\n text-align: center;\n}\n\nbutton {\n margin-top: 20px;\n}\n</style>","import { render } from \"./DialogComponent.vue?vue&type=template&id=64c2e06a&scoped=true\"\nimport script from \"./DialogComponent.vue?vue&type=script&lang=js\"\nexport * from \"./DialogComponent.vue?vue&type=script&lang=js\"\n\nimport \"./DialogComponent.vue?vue&type=style&index=0&id=64c2e06a&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-64c2e06a\"]])\n\nexport default __exports__"],"names":["key","class","$props","modelValue","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","title","message","onClick","_cache","args","$options","closeDialog","_createCommentVNode","name","props","type","String","required","Boolean","default","methods","this","$emit","__exports__","render"],"sourceRoot":""}

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[281],{7281:function(e,i,s){s.r(i),s.d(i,{default:function(){return f}});var a=s(641),t=s(3751),o=s(33);const l=e=>((0,a.Qi)("data-v-c694cf4e"),e=e(),(0,a.jt)(),e),n={class:"forgot-password"},r=l((()=>(0,a.Lk)("h2",null,"Passwort vergessen",-1))),d=l((()=>(0,a.Lk)("label",{for:"email"},"Email-Adresse:",-1))),g=l((()=>(0,a.Lk)("button",{type:"submit"},"Link zum Zurücksetzen senden",-1))),u={key:0,class:"dialog"},c={class:"dialog-content"};function m(e,i,s,l,m,k){const h=(0,a.g2)("router-link");return(0,a.uX)(),(0,a.CE)("div",n,[r,(0,a.Lk)("form",{onSubmit:i[1]||(i[1]=(0,t.D$)(((...e)=>k.submitForgotPassword&&k.submitForgotPassword(...e)),["prevent"]))},[d,(0,a.bo)((0,a.Lk)("input",{type:"email",id:"email","onUpdate:modelValue":i[0]||(i[0]=e=>m.email=e),required:""},null,512),[[t.Jo,m.email]]),g],32),(0,a.Lk)("p",null,[(0,a.bF)(h,{to:"/login"},{default:(0,a.k6)((()=>[(0,a.eW)("Login")])),_:1})]),(0,a.Lk)("p",null,[(0,a.bF)(h,{to:"/register"},{default:(0,a.k6)((()=>[(0,a.eW)("Registrieren")])),_:1})]),m.dialogVisible?((0,a.uX)(),(0,a.CE)("div",u,[(0,a.Lk)("div",c,[(0,a.Lk)("h3",null,(0,o.v_)(m.dialogTitle),1),(0,a.Lk)("p",null,(0,o.v_)(m.dialogMessage),1),(0,a.Lk)("button",{type:"button",onClick:i[2]||(i[2]=(...e)=>k.closeDialog&&k.closeDialog(...e))},"Schließen")])])):(0,a.Q3)("",!0)])}var k=s(3173),h={name:"ForgotPassword",data(){return{email:"",dialogTitle:"",dialogMessage:"",dialogVisible:!1}},methods:{async submitForgotPassword(){try{const e=await k.A.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){const i=e?.response?.data?.message||e?.message||"Ein unbekannter Fehler ist aufgetreten";this.showDialog("Fehler",i)}},showDialog(e,i){this.dialogTitle=e,this.dialogMessage=i,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},b=s(6262);const p=(0,b.A)(h,[["render",m],["__scopeId","data-v-c694cf4e"]]);var f=p}}]);
//# sourceMappingURL=281.46d980f9.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[289],{4289:function(e,t,a){a.r(t),a.d(t,{default:function(){return d}});var n=a(641);const u=["src"];function m(e,t,a,m,r,i){return(0,n.uX)(),(0,n.CE)("img",{src:r.currentImage},null,8,u)}var r=a(6278),i={name:"ImageContent",data(){return{defaultImage:"/images/homepage1.png",currentImage:"/images/homepage1.png"}},computed:{...(0,r.aH)(["menuData"])},watch:{$route:{immediate:!0,handler(){this.updateImage()}}},methods:{updateImage(){const e=this.$route.path,t=this.menuData,a=this.findMenuItemByPath(t,e);a&&a.image?this.currentImage=`/images/${a.image}`:this.currentImage=this.defaultImage},findMenuItemByPath(e,t){for(let a of e){if(a.link===t)return a;if(a.submenu){const e=this.findMenuItemByPath(a.submenu,t);if(e)return e}}return null}}},s=a(6262);const g=(0,s.A)(i,[["render",m],["__scopeId","data-v-d1b58e08"]]);var d=g}}]);
//# sourceMappingURL=289.442f0887.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"js/289.442f0887.js","mappings":"6LAAA,Q,0CACIA,EAAAA,EAAAA,IAA2B,OAArBC,IAAKC,EAAAC,cAAY,OAD3BC,E,eAOA,GACEC,KAAM,eACNC,IAAAA,GACE,MAAO,CACLC,aAAc,wBACdJ,aAAc,wBAElB,EACAK,SAAU,KACLC,EAAAA,EAAAA,IAAS,CAAC,cAEfC,MAAO,CACLC,OAAQ,CACNC,WAAW,EACXC,OAAAA,GACEC,KAAKC,aACP,IAGJC,QAAS,CACPD,WAAAA,GACE,MAAME,EAAYH,KAAKH,OAAOO,KACxBC,EAAWL,KAAKK,SAChBC,EAAWN,KAAKO,mBAAmBF,EAAUF,GAC/CG,GAAYA,EAASE,MACvBR,KAAKX,aAAe,WAAWiB,EAASE,QAExCR,KAAKX,aAAeW,KAAKP,YAE7B,EACAc,kBAAAA,CAAmBE,EAAML,GACvB,IAAK,IAAIM,KAAQD,EAAM,CACrB,GAAIC,EAAKC,OAASP,EAChB,OAAOM,EAET,GAAIA,EAAKE,QAAS,CAChB,MAAMC,EAAUb,KAAKO,mBAAmBG,EAAKE,QAASR,GACtD,GAAIS,EACF,OAAOA,CAEX,CACF,CACA,OAAO,IACT,I,UC3CJ,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O","sources":["webpack://miriamgemeinde/./src/content/ImageContent.vue","webpack://miriamgemeinde/./src/content/ImageContent.vue?ee30"],"sourcesContent":["<template>\n <img :src=\"currentImage\" />\n</template>\n\n<script>\nimport { mapState } from 'vuex';\n\nexport default {\n name: 'ImageContent',\n data() {\n return {\n defaultImage: '/images/homepage1.png',\n currentImage: '/images/homepage1.png'\n };\n },\n computed: {\n ...mapState(['menuData']),\n },\n watch: {\n $route: {\n immediate: true,\n handler() {\n this.updateImage();\n }\n }\n },\n methods: {\n updateImage() {\n const routePath = this.$route.path;\n const menuData = this.menuData;\n const menuItem = this.findMenuItemByPath(menuData, routePath);\n if (menuItem && menuItem.image) {\n this.currentImage = `/images/${menuItem.image}`;\n } else {\n this.currentImage = this.defaultImage;\n }\n },\n findMenuItemByPath(menu, path) {\n for (let item of menu) {\n if (item.link === path) {\n return item;\n }\n if (item.submenu) {\n const subItem = this.findMenuItemByPath(item.submenu, path);\n if (subItem) {\n return subItem;\n }\n }\n }\n return null;\n }\n }\n};\n</script>\n\n<style scoped>\n.right-column h2 {\n text-align: center;\n color: #000;\n}\n\n.right-column img {\n display: block;\n margin: 0 auto;\n max-width: 100%;\n height: auto;\n}\n</style>\n","import { render } from \"./ImageContent.vue?vue&type=template&id=d1b58e08&scoped=true\"\nimport script from \"./ImageContent.vue?vue&type=script&lang=js\"\nexport * from \"./ImageContent.vue?vue&type=script&lang=js\"\n\nimport \"./ImageContent.vue?vue&type=style&index=0&id=d1b58e08&scoped=true&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-d1b58e08\"]])\n\nexport default __exports__"],"names":["_createElementBlock","src","$data","currentImage","_hoisted_1","name","data","defaultImage","computed","mapState","watch","$route","immediate","handler","this","updateImage","methods","routePath","path","menuData","menuItem","findMenuItemByPath","image","menu","item","link","submenu","subItem","__exports__","render"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[324],{1324:function(e,i,s){s.r(i),s.d(i,{default:function(){return f}});var a=s(641),t=s(3751),o=s(33);const l=e=>((0,a.Qi)("data-v-c694cf4e"),e=e(),(0,a.jt)(),e),n={class:"forgot-password"},r=l((()=>(0,a.Lk)("h2",null,"Passwort vergessen",-1))),d=l((()=>(0,a.Lk)("label",{for:"email"},"Email-Adresse:",-1))),g=l((()=>(0,a.Lk)("button",{type:"submit"},"Link zum Zurücksetzen senden",-1))),u={key:0,class:"dialog"},c={class:"dialog-content"};function m(e,i,s,l,m,k){const h=(0,a.g2)("router-link");return(0,a.uX)(),(0,a.CE)("div",n,[r,(0,a.Lk)("form",{onSubmit:i[1]||(i[1]=(0,t.D$)(((...e)=>k.submitForgotPassword&&k.submitForgotPassword(...e)),["prevent"]))},[d,(0,a.bo)((0,a.Lk)("input",{type:"email",id:"email","onUpdate:modelValue":i[0]||(i[0]=e=>m.email=e),required:""},null,512),[[t.Jo,m.email]]),g],32),(0,a.Lk)("p",null,[(0,a.bF)(h,{to:"/login"},{default:(0,a.k6)((()=>[(0,a.eW)("Login")])),_:1})]),(0,a.Lk)("p",null,[(0,a.bF)(h,{to:"/register"},{default:(0,a.k6)((()=>[(0,a.eW)("Registrieren")])),_:1})]),m.dialogVisible?((0,a.uX)(),(0,a.CE)("div",u,[(0,a.Lk)("div",c,[(0,a.Lk)("h3",null,(0,o.v_)(m.dialogTitle),1),(0,a.Lk)("p",null,(0,o.v_)(m.dialogMessage),1),(0,a.Lk)("button",{type:"button",onClick:i[2]||(i[2]=(...e)=>k.closeDialog&&k.closeDialog(...e))},"Schließen")])])):(0,a.Q3)("",!0)])}var k=s(6296),h={name:"ForgotPassword",data(){return{email:"",dialogTitle:"",dialogMessage:"",dialogVisible:!1}},methods:{async submitForgotPassword(){try{const e=await k.A.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){const i=e?.response?.data?.message||e?.message||"Ein unbekannter Fehler ist aufgetreten";this.showDialog("Fehler",i)}},showDialog(e,i){this.dialogTitle=e,this.dialogMessage=i,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},b=s(6262);const p=(0,b.A)(h,[["render",m],["__scopeId","data-v-c694cf4e"]]);var f=p}}]);
//# sourceMappingURL=324.45a1757a.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
"use strict";(self["webpackChunkmiriamgemeinde"]=self["webpackChunkmiriamgemeinde"]||[]).push([[324],{1324:function(e,i,s){s.r(i),s.d(i,{default:function(){return f}});var a=s(641),t=s(3751),o=s(33);const l=e=>((0,a.Qi)("data-v-c694cf4e"),e=e(),(0,a.jt)(),e),n={class:"forgot-password"},r=l((()=>(0,a.Lk)("h2",null,"Passwort vergessen",-1))),d=l((()=>(0,a.Lk)("label",{for:"email"},"Email-Adresse:",-1))),g=l((()=>(0,a.Lk)("button",{type:"submit"},"Link zum Zurücksetzen senden",-1))),u={key:0,class:"dialog"},c={class:"dialog-content"};function m(e,i,s,l,m,k){const h=(0,a.g2)("router-link");return(0,a.uX)(),(0,a.CE)("div",n,[r,(0,a.Lk)("form",{onSubmit:i[1]||(i[1]=(0,t.D$)(((...e)=>k.submitForgotPassword&&k.submitForgotPassword(...e)),["prevent"]))},[d,(0,a.bo)((0,a.Lk)("input",{type:"email",id:"email","onUpdate:modelValue":i[0]||(i[0]=e=>m.email=e),required:""},null,512),[[t.Jo,m.email]]),g],32),(0,a.Lk)("p",null,[(0,a.bF)(h,{to:"/login"},{default:(0,a.k6)((()=>[(0,a.eW)("Login")])),_:1})]),(0,a.Lk)("p",null,[(0,a.bF)(h,{to:"/register"},{default:(0,a.k6)((()=>[(0,a.eW)("Registrieren")])),_:1})]),m.dialogVisible?((0,a.uX)(),(0,a.CE)("div",u,[(0,a.Lk)("div",c,[(0,a.Lk)("h3",null,(0,o.v_)(m.dialogTitle),1),(0,a.Lk)("p",null,(0,o.v_)(m.dialogMessage),1),(0,a.Lk)("button",{type:"button",onClick:i[2]||(i[2]=(...e)=>k.closeDialog&&k.closeDialog(...e))},"Schließen")])])):(0,a.Q3)("",!0)])}var k=s(6296),h={name:"ForgotPassword",data(){return{email:"",dialogTitle:"",dialogMessage:"",dialogVisible:!1}},methods:{async submitForgotPassword(){try{const e=await k.A.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){const i=e?.response?.data?.message||e?.message||"Ein unbekannter Fehler ist aufgetreten";this.showDialog("Fehler",i)}},showDialog(e,i){this.dialogTitle=e,this.dialogMessage=i,this.dialogVisible=!0},closeDialog(){this.dialogVisible=!1}}},b=s(6262);const p=(0,b.A)(h,[["render",m],["__scopeId","data-v-c694cf4e"]]);var f=p}}]);
//# sourceMappingURL=324.d5182513.js.map

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More