From 4f1390b794c5ffb241bd01c83cfdff0cf58fe4ac Mon Sep 17 00:00:00 2001 From: Torsten Schulz Date: Sun, 16 Jun 2024 23:03:44 +0200 Subject: [PATCH] Multiple changes --- .env | 2 +- controllers/menuDataController.js | 6 +- ...0616083105-add-page-title-to-menu-items.js | 15 + models/MenuItem.js | 5 + routes/pages.js | 2 +- src/components/ContentComponent.vue | 73 +++++ src/components/WorshipDialog.vue | 91 ++++++ src/content/admin/EditPagesComponent.vue | 49 +++- src/content/admin/MenuManagement.vue | 272 ++++++++++++++++++ src/content/admin/PagePreviewComponent.vue | 6 +- src/content/worship/AllWorshipsContent.vue | 33 ++- src/content/worship/AmBuegelContent.vue | 24 ++ src/content/worship/BonamesWorshipContent.vue | 21 +- src/content/worship/KalbachContent.vue | 24 ++ src/store/index.js | 5 +- src/utils/render.js | 15 + utils/fetchMenuData.js | 1 + 17 files changed, 613 insertions(+), 31 deletions(-) create mode 100644 migrations/20240616083105-add-page-title-to-menu-items.js create mode 100644 src/components/ContentComponent.vue create mode 100644 src/components/WorshipDialog.vue create mode 100644 src/content/admin/MenuManagement.vue create mode 100644 src/content/worship/AmBuegelContent.vue create mode 100644 src/content/worship/KalbachContent.vue create mode 100644 src/utils/render.js 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 @@ + + + + + \ 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 @@
@@ -15,8 +15,7 @@ - +
@@ -35,12 +34,14 @@ - +
+ + @@ -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 @@ \ 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 @@ \ 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: [] }; });