diff --git a/controllers/imageController.js b/controllers/imageController.js index 5667f4b..7780e34 100644 --- a/controllers/imageController.js +++ b/controllers/imageController.js @@ -71,6 +71,21 @@ exports.getImageById = async (req, res) => { } }; +exports.getImageByHash = async (req, res) => { + try { + const { idHash } = req.params; + const image = await Image.findByPk(idHash); + if (image) { + res.status(200).json(image); + } else { + res.status(404).send('Bild nicht gefunden'); + } + } catch (error) { + console.error('Fehler beim Abrufen des Bildes:', error); + res.status(500).send('Fehler beim Abrufen des Bildes'); + } +}; + exports.updateImage = async (req, res) => { try { const { id } = req.params; diff --git a/routes/image.js b/routes/image.js index 65b1df0..41b65f6 100644 --- a/routes/image.js +++ b/routes/image.js @@ -1,6 +1,6 @@ const express = require('express'); const router = express.Router(); -const { uploadImage, saveImageDetails, getImages, getImagesByPage, getImageById, updateImage } = require('../controllers/imageController'); +const { uploadImage, saveImageDetails, getImages, getImagesByPage, getImageById, getImageByHash, updateImage } = require('../controllers/imageController'); const authMiddleware = require('../middleware/authMiddleware') router.post('/', authMiddleware, uploadImage, saveImageDetails); @@ -8,5 +8,5 @@ router.get('/', authMiddleware, getImages); router.get('/page/:pageId', getImagesByPage); router.get('/:id', getImageById); router.put('/:id', authMiddleware, updateImage); - +router.put('/hash/:id', getImageByHash); module.exports = router; diff --git a/src/assets/css/editor.css b/src/assets/css/editor.css index 8ed099c..4ad14d8 100644 --- a/src/assets/css/editor.css +++ b/src/assets/css/editor.css @@ -5,6 +5,7 @@ border: 1px solid black; margin: 7px; padding: 5px; + overflow: auto; } .htmleditor table { diff --git a/src/components/AddImageDialog.vue b/src/components/AddImageDialog.vue new file mode 100644 index 0000000..753caa5 --- /dev/null +++ b/src/components/AddImageDialog.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/components/ImageRender.vue b/src/components/ImageRender.vue new file mode 100644 index 0000000..8797a08 --- /dev/null +++ b/src/components/ImageRender.vue @@ -0,0 +1,50 @@ + + + + + \ No newline at end of file diff --git a/src/components/RenderContentComponent.vue b/src/components/RenderContentComponent.vue index 3124042..198c965 100644 --- a/src/components/RenderContentComponent.vue +++ b/src/components/RenderContentComponent.vue @@ -1,74 +1,100 @@ - - - - - \ No newline at end of file + + watch( + () => props.content, + (newContent) => { + parsedContent.value = renderContent(newContent); + }, + { immediate: true } + ); + +return { + parsedContent, +}; + }, +}; + + + diff --git a/src/content/admin/EditPagesComponent.vue b/src/content/admin/EditPagesComponent.vue index 3e00c96..a84c05b 100644 --- a/src/content/admin/EditPagesComponent.vue +++ b/src/content/admin/EditPagesComponent.vue @@ -20,22 +20,51 @@ - - - - + + + + +
- - - - - - - - - + + + + + + + +
@@ -49,6 +78,7 @@ +
@@ -69,16 +99,32 @@ import OrderedList from '@tiptap/extension-ordered-list'; import Heading from '@tiptap/extension-heading'; import { CustomTableCell, CustomTableHeader } from '../../extensions/CustomTableCell'; import WorshipDialog from '@/components/WorshipDialog.vue'; -import { BoldIcon, ItalicIcon, UnderlineIcon } from '@/icons'; +import AddImageDialog from '@/components/AddImageDialog.vue'; + +import { BoldIcon, ItalicIcon, UnderlineIcon, StrikethroughIcon, ListIcon, NumberedListLeftIcon, TableIcon, + Table2ColumnsIcon, ArrowDownIcon, ArrowRightIcon, TableRowsIcon, AlignTopBoxIcon, AlignLeftBoxIcon, StatsReportIcon + } from '@/icons'; export default { name: 'EditPagesComponent', components: { EditorContent, WorshipDialog, + AddImageDialog, BoldIcon, ItalicIcon, - UnderlineIcon + UnderlineIcon, + StrikethroughIcon, + ListIcon, + NumberedListLeftIcon, + TableIcon, + Table2ColumnsIcon, + ArrowDownIcon, + ArrowRightIcon, + TableRowsIcon, + AlignTopBoxIcon, + AlignLeftBoxIcon, + StatsReportIcon, }, setup() { const store = useStore(); @@ -86,6 +132,7 @@ export default { const selectedPage = ref(''); const pageHtmlContent = computed(() => store.state.pageContent); const worshipDialog = ref(null); + const addImageDialog = ref(null); const editor = useEditor({ extensions: [ @@ -190,6 +237,10 @@ export default { worshipDialog.value.openWorshipDialog(); }; + const openAddImageDialog = () => { + addImageDialog.value.openAddImageDialog(); + }; + const insertWorshipList = (selectedLocations) => { if (editor.value) { const configuration = `location=${selectedLocations},order:"date asc"`; @@ -197,6 +248,12 @@ export default { } }; + const insertImage = (selectedImage) => { + if (editor.value) { + editor.value.chain().focus().insertContent(`{{ image:${selectedImage} }}`).run(); + } + }; + return { pages, sortedPages, @@ -208,6 +265,9 @@ export default { openWorshipDialog, insertWorshipList, worshipDialog, + addImageDialog, + openAddImageDialog, + insertImage, }; }, }; @@ -269,4 +329,10 @@ export default { width: 24px; height: 24px; } +.delete-icon { + fill: #ff0000; +} +.align-top { + vertical-align: top; +} diff --git a/src/content/kita/AmBuegelContent.vue b/src/content/kita/AmBuegelContent.vue new file mode 100644 index 0000000..23c146c --- /dev/null +++ b/src/content/kita/AmBuegelContent.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/content/kita/KramambuliContent.vue b/src/content/kita/KramambuliContent.vue new file mode 100644 index 0000000..23c146c --- /dev/null +++ b/src/content/kita/KramambuliContent.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/content/kita/SternenzeltContent.vue b/src/content/kita/SternenzeltContent.vue new file mode 100644 index 0000000..23c146c --- /dev/null +++ b/src/content/kita/SternenzeltContent.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/icons.js b/src/icons.js index 7ebd7b6..f792bd0 100644 --- a/src/icons.js +++ b/src/icons.js @@ -1,8 +1,21 @@ // src/icons.js -import { Bold, Italic, Underline } from '@iconoir/vue'; +import { Bold, Italic, Underline, Strikethrough, List, NumberedListLeft, Table, Table2Columns, ArrowRight, ArrowDown, TableRows, + AlignTopBox, AlignLeftBox, StatsReport + } from '@iconoir/vue'; export { Bold as BoldIcon, Italic as ItalicIcon, Underline as UnderlineIcon, + Strikethrough as StrikethroughIcon, + List as ListIcon, + NumberedListLeft as NumberedListLeftIcon, + Table as TableIcon, + Table2Columns as Table2ColumnsIcon, + ArrowRight as ArrowRightIcon, + ArrowDown as ArrowDownIcon, + TableRows as TableRowsIcon, + AlignTopBox as AlignTopBoxIcon, + AlignLeftBox as AlignLeftBoxIcon, + StatsReport as StatsReportIcon }; diff --git a/vue.config.js b/vue.config.js index 1a56548..f5ed984 100644 --- a/vue.config.js +++ b/vue.config.js @@ -4,7 +4,7 @@ const webpack = require('webpack'); module.exports = defineConfig({ transpileDependencies: true, devServer: { - host: '127.0.0.1', + host: 'localhost', port: 8080 }, configureWebpack: {