diff --git a/.env b/.env
index 781c7cd..bfc766f 100644
--- a/.env
+++ b/.env
@@ -1 +1 @@
-VUE_APP_BACKEND_URL=
+VUE_APP_BACKEND_URL=http://localhost:3000/api
diff --git a/controllers/menuDataController.js b/controllers/menuDataController.js
index 2d44894..6012bf7 100644
--- a/controllers/menuDataController.js
+++ b/controllers/menuDataController.js
@@ -1,5 +1,4 @@
-// controllers/menuDataController.js
-
+const { MenuItem } = require('../models'); // Stellen Sie sicher, dass das Modell korrekt importiert wird
const fetchMenuData = require('../utils/fetchMenuData');
exports.getMenuData = async (req, res) => {
@@ -15,9 +14,10 @@ exports.saveMenuData = async (req, res) => {
try {
const menuData = req.body;
await MenuItem.destroy({ where: {} });
- await MenuItem.bulkCreate(menuData);
+ await MenuItem.bulkCreate(menuData, { include: [{ model: MenuItem, as: 'submenu' }] });
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');
}
};
diff --git a/migrations/20240616083105-add-page-title-to-menu-items.js b/migrations/20240616083105-add-page-title-to-menu-items.js
new file mode 100644
index 0000000..6d532e5
--- /dev/null
+++ b/migrations/20240616083105-add-page-title-to-menu-items.js
@@ -0,0 +1,15 @@
+// migrations/[timestamp]-add-page-title-to-menu-items.js
+'use strict';
+
+module.exports = {
+ up: async (queryInterface, Sequelize) => {
+ await queryInterface.addColumn('menu_items', 'page_title', {
+ type: Sequelize.STRING,
+ allowNull: true
+ });
+ },
+
+ down: async (queryInterface, Sequelize) => {
+ await queryInterface.removeColumn('menu_items', 'page_title');
+ }
+};
diff --git a/models/MenuItem.js b/models/MenuItem.js
index 562c5aa..4ad1f33 100644
--- a/models/MenuItem.js
+++ b/models/MenuItem.js
@@ -1,3 +1,4 @@
+// models/MenuItem.js
const { DataTypes } = require('sequelize');
module.exports = (sequelize) => {
@@ -32,6 +33,10 @@ module.exports = (sequelize) => {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 0
+ },
+ page_title: { // Neuer Eintrag
+ type: DataTypes.STRING,
+ allowNull: true
}
}, {
tableName: 'menu_items',
diff --git a/routes/pages.js b/routes/pages.js
index bcd66a4..3ec1b30 100644
--- a/routes/pages.js
+++ b/routes/pages.js
@@ -3,7 +3,7 @@ const router = express.Router();
const pageController = require('../controllers/pageController');
const authMiddleware = require('../middleware/authMiddleware')
-router.get('/', authMiddleware, pageController.getPageContent);
+router.get('/', pageController.getPageContent);
router.post('/', authMiddleware, pageController.savePageContent);
module.exports = router;
diff --git a/src/components/ContentComponent.vue b/src/components/ContentComponent.vue
new file mode 100644
index 0000000..e3ea700
--- /dev/null
+++ b/src/components/ContentComponent.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
diff --git a/src/components/WorshipDialog.vue b/src/components/WorshipDialog.vue
new file mode 100644
index 0000000..b9fbb9e
--- /dev/null
+++ b/src/components/WorshipDialog.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
Gottesdienst-Konfiguration
+
+ Bitte wählen Sie den Ort für den Gottestdienst aus:
+
+
+
+ Alle Orte
+
+ {{ location.name }}
+
+
+
+
+ Bestätigen
+ Schließen
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/content/admin/EditPagesComponent.vue b/src/content/admin/EditPagesComponent.vue
index f173703..b7e3b2d 100644
--- a/src/content/admin/EditPagesComponent.vue
+++ b/src/content/admin/EditPagesComponent.vue
@@ -4,7 +4,7 @@
Wähle eine Seite:
- {{ page.name }}
+ {{ page.name }}
@@ -15,8 +15,7 @@
Kursiv
Unterstrichen
Durchgestrichen
- Tabelle
+ Tabelle
Liste
Nummerierte Liste
@@ -35,12 +34,14 @@
Events
Kontaktpersonen
Institutionen
- Gottesdienste
+ Gottesdienste
Speichern
+
+
@@ -59,18 +60,21 @@ import Strike from '@tiptap/extension-strike';
import BulletList from '@tiptap/extension-bullet-list';
import OrderedList from '@tiptap/extension-ordered-list';
import Heading from '@tiptap/extension-heading';
-import { CustomTableCell, CustomTableHeader } from '../../extensions/CustomTableCell'; // Importiere die angepasste Erweiterung
+import { CustomTableCell, CustomTableHeader } from '../../extensions/CustomTableCell';
+import WorshipDialog from '@/components/WorshipDialog.vue';
export default {
name: 'EditPagesComponent',
components: {
EditorContent,
+ WorshipDialog,
},
setup() {
const store = useStore();
const pages = ref([]);
const selectedPage = ref('');
const pageHtmlContent = computed(() => store.state.pageContent);
+ const worshipDialog = ref(null);
const editor = useEditor({
extensions: [
@@ -97,10 +101,23 @@ export default {
},
});
+ const flattenPages = (pages, allPages, parentName = '') => {
+ pages.forEach(page => {
+ const pageName = parentName ? `${parentName} -> ${page.name}` : page.name;
+ allPages.push({ ...page, name: pageName });
+ if (page.submenu && page.submenu.length) {
+ flattenPages(page.submenu, allPages, pageName);
+ }
+ });
+ };
+
const fetchPages = async () => {
try {
const response = await axios.get('/menu-data');
- pages.value = response.data;
+ const data = response.data;
+ const allPages = [];
+ flattenPages(data, allPages);
+ pages.value = allPages.sort((a, b) => a.name.localeCompare(b.name));
} catch (error) {
console.error('Fehler beim Abrufen der Seiten:', error);
}
@@ -115,7 +132,7 @@ export default {
if (editor.value && editor.value.commands) {
editor.value.commands.setContent(content, false);
} else {
- setTimeout(setEditorContent, 100); // Try again after 100ms if not ready
+ setTimeout(setEditorContent, 100);
}
};
@@ -146,13 +163,31 @@ export default {
onMounted(fetchPages);
+ const sortedPages = computed(() => {
+ return pages.value;
+ });
+
+ const openWorshipDialog = () => {
+ worshipDialog.value.openWorshipDialog();
+ };
+
+ const insertWorshipList = (configuration) => {
+ if (editor.value) {
+ editor.value.chain().focus().insertContent(`{{ worshipslist:location=${configuration},order:"date asc" }}`).run();
+ }
+ };
+
return {
pages,
+ sortedPages,
selectedPage,
editor,
loadPageContent,
savePageContent,
pageHtmlContent,
+ openWorshipDialog,
+ insertWorshipList,
+ worshipDialog,
};
},
};
diff --git a/src/content/admin/MenuManagement.vue b/src/content/admin/MenuManagement.vue
new file mode 100644
index 0000000..5e76036
--- /dev/null
+++ b/src/content/admin/MenuManagement.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/content/admin/PagePreviewComponent.vue b/src/content/admin/PagePreviewComponent.vue
index a990219..59677d2 100644
--- a/src/content/admin/PagePreviewComponent.vue
+++ b/src/content/admin/PagePreviewComponent.vue
@@ -1,22 +1,24 @@
Dies ist eine Vorschau.
-
+
\ No newline at end of file
+
+
+
+
+
+
+
+
diff --git a/src/content/worship/AmBuegelContent.vue b/src/content/worship/AmBuegelContent.vue
new file mode 100644
index 0000000..6294358
--- /dev/null
+++ b/src/content/worship/AmBuegelContent.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/content/worship/BonamesWorshipContent.vue b/src/content/worship/BonamesWorshipContent.vue
index eefe572..6294358 100644
--- a/src/content/worship/BonamesWorshipContent.vue
+++ b/src/content/worship/BonamesWorshipContent.vue
@@ -1,11 +1,24 @@
-
-
Gottesdienste in Bonames
+
+
\ No newline at end of file
+
+
+
diff --git a/src/content/worship/KalbachContent.vue b/src/content/worship/KalbachContent.vue
new file mode 100644
index 0000000..6294358
--- /dev/null
+++ b/src/content/worship/KalbachContent.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/store/index.js b/src/store/index.js
index 40c223e..dc3f85d 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -48,9 +48,8 @@ export default createStore({
actions: {
async loadMenuData({ commit }) {
try {
- const response = await fetch('/menu-data');
- const menuData = await response.json();
- commit('setMenuData', menuData);
+ const response = await axios.get('/menu-data');
+ commit('setMenuData', response.data);
} catch (error) {
console.error('Fehler beim Laden der Menü-Daten:', error);
}
diff --git a/src/utils/render.js b/src/utils/render.js
new file mode 100644
index 0000000..b343785
--- /dev/null
+++ b/src/utils/render.js
@@ -0,0 +1,15 @@
+export function render(content) {
+ console.log('do render', content);
+ const worshipsPattern = /{{ worshipslist:(.*?) }}/g;
+ const renderedContent = content.replace(worshipsPattern, (match, config) => {
+ return renderWorships(config);
+ });
+
+ return renderedContent;
+ }
+
+ function renderWorships(config) {
+ console.log('render worships', config);
+ return `
Worships at location ${location}
`;
+ }
+
\ No newline at end of file
diff --git a/utils/fetchMenuData.js b/utils/fetchMenuData.js
index 2601569..712500c 100644
--- a/utils/fetchMenuData.js
+++ b/utils/fetchMenuData.js
@@ -34,6 +34,7 @@ function buildMenuStructure(menuItems) {
showInMenu: item.show_in_menu,
requiresAuth: item.requires_auth,
orderId: item.order_id,
+ pageTitle: item.page_title,
submenu: []
};
});