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 @@
+
+
+
+
+
Bild auswählen
+
+
+
![]()
+
{{ image.title }}
+
{{ image.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
-
-
-
+
+
+
+
+
@@ -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: {