|
|
<template> <v-card> <v-data-table :headers="headers" :items="annotations" @input="update" item-key="id" hide-default-header hide-default-footer disable-pagination class="elevation-1" > <template v-slot:top> <v-text-field v-model="newText" @keyup.enter="create" @compositionstart="compositionStart" @compositionend="compositionEnd" prepend-inner-icon="mdi-pencil" label="New text" autofocus single-line hide-details filled /> </template> <template v-slot:item.text="{ item }"> <v-edit-dialog> <span class="title" style="font-weight:400"> {{ item.text }} </span> <template v-slot:input> <v-textarea :value="item.text" @change="update(item.id, $event)" label="Edit" autofocus /> </template> </v-edit-dialog> </template> <template v-slot:item.action="{ item }"> <v-icon @click="deleteAnnotation(item.id)" small > delete </v-icon> </template> </v-data-table> </v-card> </template>
<script> export default { props: { annotations: { type: Array, default: () => ([]), required: true }, deleteAnnotation: { type: Function, default: () => ([]), required: true }, updateAnnotation: { type: Function, default: () => ([]), required: true }, createAnnotation: { type: Function, default: () => ([]), required: true } },
data() { return { newText: '', headers: [ { text: 'Text', align: 'left', value: 'text' }, { text: 'Actions', align: 'right', value: 'action' } ], isComposing: false, hasCompositionJustEnded: false } },
methods: { update(annotationId, text) { if (text.length > 0) { this.updateAnnotation(annotationId, text) } else { this.deleteAnnotation(annotationId) } }, create() { if (this.isComposing || this.hasCompositionJustEnded) { this.hasCompositionJustEnded = false return } if (this.newText.length > 0) { this.createAnnotation(this.newText) this.newText = '' } }, compositionStart() { this.isComposing = true }, compositionEnd() { this.isComposing = false this.hasCompositionJustEnded = true } } } </script>
|