|
|
|
@ -30,28 +30,11 @@ import HistoryTab from './Tabs/HistoryTab.vue' |
|
|
|
|
import BubbleMenu from './BubbleMenu.vue' |
|
|
|
|
import FloatingMenu from './FloatingMenu.vue' |
|
|
|
|
|
|
|
|
|
const ImageAlign = Image.extend({ |
|
|
|
|
addAttributes() { |
|
|
|
|
return { |
|
|
|
|
...this.parent?.(), |
|
|
|
|
alignment: { |
|
|
|
|
default: 'left', |
|
|
|
|
renderHTML: attributes => { |
|
|
|
|
return { |
|
|
|
|
class: `image-align-${attributes.alignment}`, |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
// Props and emits |
|
|
|
|
const props = defineProps({ |
|
|
|
|
initialContent: { |
|
|
|
|
type: String, |
|
|
|
|
content: { |
|
|
|
|
type: Object || String, |
|
|
|
|
default: ` |
|
|
|
|
<h2> |
|
|
|
|
<h2> |
|
|
|
|
Présentation du groupe |
|
|
|
|
</h2> |
|
|
|
|
<p> |
|
|
|
@ -78,19 +61,45 @@ const props = defineProps({ |
|
|
|
|
N’hésitez pas à nous contacter si vous souhaitez avoir plus d’informations concernant notre groupe ou nos séances. |
|
|
|
|
</p> |
|
|
|
|
` |
|
|
|
|
}, |
|
|
|
|
editable: { |
|
|
|
|
type: Boolean, |
|
|
|
|
default: true, |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
const emit = defineEmits(['update']) |
|
|
|
|
|
|
|
|
|
// Editor instance |
|
|
|
|
const editor = ref(null) |
|
|
|
|
const edit = ref(props.editable); |
|
|
|
|
const activeTab = ref('text') |
|
|
|
|
|
|
|
|
|
defineExpose({ |
|
|
|
|
editable: (flag) => { |
|
|
|
|
edit.value = flag; |
|
|
|
|
editor.value.setEditable(flag) |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
const ImageAlign = Image.extend({ |
|
|
|
|
addAttributes() { |
|
|
|
|
return { |
|
|
|
|
...this.parent?.(), |
|
|
|
|
alignment: { |
|
|
|
|
default: 'left', |
|
|
|
|
renderHTML: attributes => { |
|
|
|
|
return { |
|
|
|
|
class: `image-align-${attributes.alignment}`, |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
// Initialize editor |
|
|
|
|
onMounted(() => { |
|
|
|
|
editor.value = new Editor({ |
|
|
|
|
content: props.initialContent, |
|
|
|
|
content: props.content, |
|
|
|
|
editorProps: { |
|
|
|
|
attributes: { |
|
|
|
|
class: 'tiptap-editor', |
|
|
|
@ -154,7 +163,8 @@ onMounted(() => { |
|
|
|
|
json: editor.getJSON() |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
}); |
|
|
|
|
editor.value.setEditable(edit); |
|
|
|
|
emit('update', { |
|
|
|
|
html: editor.value.getHTML(), |
|
|
|
|
json: editor.value.getJSON() |
|
|
|
@ -169,9 +179,9 @@ onBeforeUnmount(() => { |
|
|
|
|
}) |
|
|
|
|
</script> |
|
|
|
|
<template> |
|
|
|
|
<div v-if="editor" class="notion-editor-container relative"> |
|
|
|
|
<div v-if="editor" class="notion-editor-container"> |
|
|
|
|
<!-- Toolbar based on active tab --> |
|
|
|
|
<div class="sticky top-0 right-0 left-0 z-10 bg-white border-b border-gray-200 py-2 flex space-x-2 flex-wrap"> |
|
|
|
|
<div v-if="edit" class="sticky top-16 right-0 left-0 z-10 bg-white border-b border-gray-200 py-2 flex space-x-2 flex-wrap"> |
|
|
|
|
<Tabs @active="(tab) => activeTab = tab"/> |
|
|
|
|
<TextTab v-show="activeTab == 'text'" :editor="editor" /> |
|
|
|
|
<BlockTab v-show="activeTab == 'blocks'" :editor="editor"/> |
|
|
|
@ -180,9 +190,9 @@ onBeforeUnmount(() => { |
|
|
|
|
<TableTab v-show="activeTab == 'tables'" :editor="editor"/> |
|
|
|
|
<HistoryTab v-show="activeTab == 'history'" :editor="editor"/> |
|
|
|
|
</div> |
|
|
|
|
<BubbleMenu :editor="editor" /> |
|
|
|
|
<BubbleMenu v-if="edit" :editor="editor" /> |
|
|
|
|
<!-- Floating Menu for Block Types --> |
|
|
|
|
<FloatingMenu :editor="editor" /> |
|
|
|
|
<FloatingMenu v-if="edit" :editor="editor" /> |
|
|
|
|
<!-- Editor Content --> |
|
|
|
|
<editor-content |
|
|
|
|
:editor="editor" |
|
|
|
|