Compare commits

3 Commits

262 changed files with 20223 additions and 11618 deletions

2
.gitignore vendored
View File

@@ -27,5 +27,3 @@ 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": "miriamgemeinde", "username": "miriam_user",
"password": "hitomisan", "password": "qTCTTWwpEwy3vPDU",
"database": "miriamgemeinde", "database": "miriamgemeinde",
"host": "localhost", "host": "tsschulz.de",
"dialect": "mysql" "dialect": "mysql"
}, },
"test": { "test": {
"username": "miriam_user", "username": "miriam_user",
"password": "hitomisan", "password": "qTCTTWwpEwy3vPDU",
"database": "miriamgemeinde", "database": "miriamgemeinde",
"host": "tsschulz.de", "host": "tsschulz.de",
"dialect": "mysql" "dialect": "mysql"
}, },
"production": { "production": {
"username": "miriam_user", "username": "miriam_user",
"password": "hitomisan", "password": "qTCTTWwpEwy3vPDU",
"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', 'miriamgemeinde', 'hitomisan', { const sequelize = new Sequelize('miriamgemeinde', 'miriam_user', 'qTCTTWwpEwy3vPDU', {
host: 'localhost', host: 'tsschulz.de',
dialect: 'mysql', dialect: 'mysql',
retry: { retry: {
match: [ match: [
@@ -26,7 +26,7 @@ const sequelize = new Sequelize('miriamgemeinde', 'miriamgemeinde', 'hitomisan',
async function connectWithRetry() { async function connectWithRetry() {
try { try {
await sequelize.authenticate(); await sequelize.authenticate();
console.log(`Connection has been established successfully. Database server: ${sequelize.config.host}`); console.log('Connection has been established successfully.');
} 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,205 +1,59 @@
const bcrypt = require('bcryptjs'); const AuthService = require('../services/AuthService');
const { User, PasswordResetToken } = require('../models'); const ErrorHandler = require('../utils/ErrorHandler');
const jwt = require('jsonwebtoken');
const { addTokenToBlacklist } = require('../utils/blacklist');
const { transporter, getPasswordResetEmailTemplate } = require('../config/email');
const crypto = require('crypto');
function delay(ms) { /**
return new Promise(resolve => setTimeout(resolve, ms)); * Controller für Authentifizierungsendpunkte
*/
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);
});
} }
exports.register = async (req, res) => { // Export der statischen Methoden für die Routen
const { name, email, password } = req.body; module.exports = {
if (!name || !email || !password) { register: AuthController.register,
return res.status(400).json({ message: 'Alle Felder sind erforderlich' }); login: AuthController.login,
} forgotPassword: AuthController.forgotPassword,
try { resetPassword: AuthController.resetPassword,
const hashedPassword = await bcrypt.hash(password, 10); logout: AuthController.logout
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,16 +3,7 @@ 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,
@@ -88,14 +79,6 @@ 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,188 +1,32 @@
const { Event, Institution, EventPlace, ContactPerson, EventType } = require('../models'); const EventService = require('../services/EventService');
const { Op } = require('sequelize'); const ErrorHandler = require('../utils/ErrorHandler');
const moment = require('moment'); // Import von Moment.js
const getAllEvents = async (req, res) => { exports.getAllEvents = ErrorHandler.asyncHandler(async (req, res) => {
try { const events = await EventService.getAllEvents();
const events = await Event.findAll({ ErrorHandler.successResponse(res, events, 'Events erfolgreich abgerufen');
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);
}
};
const filterEvents = async (req, res) => { exports.getEventById = ErrorHandler.asyncHandler(async (req, res) => {
try { const event = await EventService.getEventById(req.params.id);
const request = req.body; ErrorHandler.successResponse(res, event, 'Event erfolgreich abgerufen');
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']
];
if (request.id === 'all') { exports.filterEvents = ErrorHandler.asyncHandler(async (req, res) => {
const events = await Event.findAll({ const result = await EventService.filterEvents(req.body);
where, ErrorHandler.successResponse(res, result, 'Events erfolgreich gefiltert');
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 });
}
if (request.id === 'home') { exports.createEvent = ErrorHandler.asyncHandler(async (req, res) => {
const events = await Event.findAll({ const event = await EventService.createEvent(req.body);
where: { ErrorHandler.successResponse(res, event, 'Event erfolgreich erstellt', 201);
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 });
}
if (!request.id && !request.places && !request.types) { exports.updateEvent = ErrorHandler.asyncHandler(async (req, res) => {
return res.json({ events: [], places: [], types: [], contactPersons: [] }); const event = await EventService.updateEvent(req.params.id, req.body);
} ErrorHandler.successResponse(res, event, 'Event erfolgreich aktualisiert');
});
if (request.id) { exports.deleteEvent = ErrorHandler.asyncHandler(async (req, res) => {
where.id = request.id; const result = await EventService.deleteEvent(req.params.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

@@ -1,154 +0,0 @@
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,30 +1,12 @@
const { MenuItem } = require('../models'); const MenuDataService = require('../services/MenuDataService');
const fetchMenuData = require('../utils/fetchMenuData'); const ErrorHandler = require('../utils/ErrorHandler');
exports.getMenuData = async (req, res) => { exports.getMenuData = ErrorHandler.asyncHandler(async (req, res) => {
try { const menuData = await MenuDataService.getMenuData();
const menuData = await fetchMenuData(); ErrorHandler.successResponse(res, menuData, 'Menü-Daten erfolgreich abgerufen');
res.json(menuData); });
} catch (error) {
res.status(500).send('Error fetching menu data');
}
};
exports.saveMenuData = async (req, res) => { exports.saveMenuData = ErrorHandler.asyncHandler(async (req, res) => {
try { const result = await MenuDataService.saveMenuData(req.body);
const menuData = req.body; ErrorHandler.successResponse(res, result, result.message);
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,48 +1,27 @@
// controllers/pageController.js const PageService = require('../services/PageService');
const { Page } = require('../models'); const ErrorHandler = require('../utils/ErrorHandler');
exports.getMenuData = async (req, res) => { exports.getMenuData = ErrorHandler.asyncHandler(async (req, res) => {
try { const pages = await PageService.getAllPages();
const pages = await Page.findAll({ ErrorHandler.successResponse(res, pages, 'Seiten erfolgreich abgerufen');
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 = async (req, res) => { exports.getPageContent = ErrorHandler.asyncHandler(async (req, res) => {
try { const result = await PageService.getPageContent(req.query.link);
const page = await Page.findOne({ ErrorHandler.successResponse(res, result, 'Seiteninhalt erfolgreich abgerufen');
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 = async (req, res) => { exports.savePageContent = ErrorHandler.asyncHandler(async (req, res) => {
try { const result = await PageService.savePageContent(req.body);
const { link, name, content } = req.body; ErrorHandler.successResponse(res, result, result.message);
let page = await Page.findOne({ where: { link } }); });
if (page) {
page.content = content; exports.getPageById = ErrorHandler.asyncHandler(async (req, res) => {
page.name = name; const page = await PageService.getPageById(req.params.id);
} else { ErrorHandler.successResponse(res, page, 'Seite erfolgreich abgerufen');
page = await Page.create({ link, name, content }); });
}
await page.save(); exports.deletePage = ErrorHandler.asyncHandler(async (req, res) => {
res.json({ message: 'Seiteninhalt gespeichert', page }); const result = await PageService.deletePage(req.params.id);
} catch (error) { ErrorHandler.successResponse(res, result, result.message);
console.error('Fehler beim Speichern des Seiteninhalts:', error); });
res.status(500).json({ message: 'Fehler beim Speichern des Seiteninhalts' });
}
};

View File

@@ -1,104 +1,42 @@
const { User } = require('../models'); const UserService = require('../services/UserService');
const UserValidator = require('../validators/UserValidator');
const ErrorHandler = require('../utils/ErrorHandler');
exports.getAllUsers = async (req, res) => { exports.getAllUsers = ErrorHandler.asyncHandler(async (req, res) => {
try { const users = await UserService.getAllUsers();
const users = await User.findAll({ ErrorHandler.successResponse(res, users, 'Benutzer erfolgreich abgerufen');
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 = async (req, res) => { exports.getUserById = ErrorHandler.asyncHandler(async (req, res) => {
try { UserValidator.validateId(req.params.id);
const user = await User.findByPk(req.params.id, { const user = await UserService.getUserById(req.params.id);
attributes: ['id', 'name', 'email', 'active', 'created_at'] // Passwort ausschließen ErrorHandler.successResponse(res, user, 'Benutzer erfolgreich abgerufen');
}); });
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 = async (req, res) => { exports.createUser = ErrorHandler.asyncHandler(async (req, res) => {
try { UserValidator.validateCreateUser(req.body);
const user = await User.create(req.body); const user = await UserService.createUser(req.body);
ErrorHandler.successResponse(res, user, 'Benutzer erfolgreich erstellt', 201);
});
// Sichere User-Daten zurückgeben (ohne Passwort) exports.updateUser = ErrorHandler.asyncHandler(async (req, res) => {
const safeUser = { UserValidator.validateId(req.params.id);
id: user.id, UserValidator.validateUpdateUser(req.body);
name: user.name, const user = await UserService.updateUser(req.params.id, req.body);
email: user.email, ErrorHandler.successResponse(res, user, 'Benutzer erfolgreich aktualisiert');
active: user.active, });
created_at: user.created_at
};
res.status(201).json(safeUser); exports.deleteUser = ErrorHandler.asyncHandler(async (req, res) => {
} catch (error) { UserValidator.validateId(req.params.id);
console.error('Error creating user:', error); await UserService.deleteUser(req.params.id);
res.status(500).json({ message: 'Error creating user' }); ErrorHandler.successResponse(res, null, 'Benutzer erfolgreich gelöscht');
} });
};
exports.updateUser = async (req, res) => { // Neue Route für Passwort-Änderung
try { exports.changePassword = ErrorHandler.asyncHandler(async (req, res) => {
const user = await User.findByPk(req.params.id); const { currentPassword, newPassword } = req.body;
if (user) { UserValidator.validateId(req.params.id);
// Erstelle eine Kopie der Request-Daten ohne sensible Felder UserValidator.validatePasswordChange(currentPassword, newPassword);
const updateData = { ...req.body }; await UserService.changePassword(req.params.id, currentPassword, newPassword);
ErrorHandler.successResponse(res, null, 'Passwort erfolgreich geändert');
// 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 = async (req, res) => {
try {
const user = await User.findByPk(req.params.id);
if (user) {
await user.destroy();
res.status(200).json({ message: 'User deleted successfully' });
} else {
res.status(404).json({ message: 'User not found' });
}
} catch (error) {
console.error('Error deleting user:', error);
res.status(500).json({ message: 'Error deleting user' });
}
};

File diff suppressed because it is too large Load Diff

View File

@@ -1,28 +0,0 @@
'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

@@ -1,16 +0,0 @@
'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

@@ -1,17 +0,0 @@
'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,10 +25,6 @@ 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',

View File

@@ -1,24 +0,0 @@
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,17 +61,6 @@ 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

26019
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": "cp -r dist/* public/", "copy-dist": "rm -rf public/* && 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": "^4.2.2", "@vue/cli": "^5.0.8",
"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,12 +34,10 @@
"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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

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

View File

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
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

@@ -0,0 +1 @@
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

@@ -0,0 +1 @@
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

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

View File

@@ -0,0 +1 @@
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

@@ -0,0 +1 @@
.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

@@ -0,0 +1 @@
.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 +1,19 @@
<!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> <!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.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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1 @@
{"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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1,2 @@
"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

2
public/js/23.179aa174.js Normal file
View File

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1 @@
{"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":""}

2
public/js/23.86dde413.js Normal file
View File

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1 @@
{"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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1 @@
{"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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1 @@
{"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

@@ -0,0 +1,2 @@
"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

@@ -0,0 +1,2 @@
"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