<template>
<div>
<h2>Dokumen Saya</h2>
<!-- Beralih antar editor secara dinamis -->
<component
:is="editorComponent"
v-model="documentContent"
:placeholder="placeholderText"
:editor-config="activeConfig"
:editor-data.sync="documentDataObject"
ref="editor"
/>
<div class="actions">
<button @click="saveDocument">Simpan Dokumen</button>
<button @click="clearEditor">Kosongkan</button>
<div v-if="validationError" class="error">{{ validationError }}</div>
</div>
</div>
</template>
<script>
import TiptapEditor from './components/TiptapEditor.vue';
import QuillEditor from './components/QuillEditor.vue';
// Contoh: Impor ekstensi Tiptap tambahan untuk konfigurasi
import { Heading } from 'tiptap-extensions';
export default {
components: {
TiptapEditor,
QuillEditor,
},
data() {
return {
// Atur ke 'TiptapEditor' atau 'QuillEditor'
editorComponent: 'TiptapEditor',
// Data untuk v-model (HTML)
documentContent: '<h2>Selamat Datang!</h2><p>Mulai mengedit...</p>',
// Data untuk :editor-data.sync (JSON/Delta)
documentDataObject: null,
placeholderText: 'Tulis sesuatu yang luar biasa...',
validationError: null,
// --- Objek Konfigurasi ---
tiptapConfig: {
// Timpa ekstensi default untuk menambahkan Heading
extensions: [
// Catatan: Anda mungkin perlu mengimpor ekstensi default dari
// komponen wrapper Anda jika ingin tetap menggunakannya.
// Untuk kesederhanaan, kita definisikan set baru di sini.
new Heading({ levels: [1, 2, 3] }),
// ... tambahkan ekstensi lain seperti Bold, Italic, dll. jika perlu
],
},
quillConfig: {
// Ganti tema dan kustomisasi toolbar
theme: 'bubble',
modules: {
toolbar: [
['bold', 'italic'],
[{ 'header': 1 }, { 'header': 2 }],
['link', 'image']
],
},
},
};
},
computed: {
// Menyediakan objek konfigurasi yang benar berdasarkan editor yang dipilih
activeConfig() {
return this.editorComponent === 'TiptapEditor'
? this.tiptapConfig
: this.quillConfig;
},
},
watch: {
// Memantau perubahan untuk memvalidasi konten secara real-time
documentContent(newValue) {
this.validateContent(newValue);
// Contoh: Fitur simpan-otomatis (autosave)
// console.log("Konten berubah, bisa menjalankan autosave sekarang...");
},
},
methods: {
/**
* Contoh fungsi validasi. Memeriksa apakah konten terlalu pendek.
* @param {string} htmlContent Konten HTML dari editor.
*/
validateContent(htmlContent) {
// Validator sederhana: hapus tag HTML dan periksa panjangnya
const text = htmlContent.replace(/<[^>]*>?/gm, '');
if (text.length > 0 && text.length < 10) {
this.validationError = 'Konten terlalu pendek (minimal 10 karakter).';
} else {
this.validationError = null;
}
},
/**
* Membersihkan konten editor.
*/
clearEditor() {
this.documentContent = '';
this.documentDataObject = null;
},
/**
* Mensimulasikan penyimpanan dokumen ke server.
*/
saveDocument() {
if (this.validationError) {
alert('Mohon perbaiki kesalahan validasi sebelum menyimpan.');
return;
}
console.log('--- Menyimpan Dokumen ---');
// Opsi 1: Simpan format data asli (Direkomendasikan)
// Ini lebih bersih dan andal untuk penyimpanan.
console.log('Data Asli (JSON/Delta):', this.documentDataObject);
// Contoh pemanggilan API:
// api.save({ content: this.documentDataObject, format: 'json' });
// Opsi 2: Simpan konten HTML
console.log('Konten HTML:', this.documentContent);
// Contoh pemanggilan API:
// api.save({ content: this.documentContent, format: 'html' });
alert('Konten dokumen telah di-log ke konsol!');
},
},
}
</script>
<style scoped>
.actions {
margin-top: 1rem;
display: flex;
align-items: center;
gap: 10px;
}
.error {
color: red;
font-size: 0.9em;
}
</style>