mirror of https://github.com/doccano/doccano.git
pythondatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learningannotation-tool
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
4.7 KiB
207 lines
4.7 KiB
<template>
|
|
<v-data-table
|
|
:headers="headers"
|
|
:items="value"
|
|
>
|
|
<template v-slot:top>
|
|
<v-toolbar
|
|
class="toolbar-control"
|
|
flat
|
|
>
|
|
<v-toolbar-title class="text-capitalize">
|
|
{{ title }}
|
|
</v-toolbar-title>
|
|
<v-spacer />
|
|
<v-dialog
|
|
v-model="dialog"
|
|
max-width="800px"
|
|
>
|
|
<template v-slot:activator="{ on, attrs }">
|
|
<v-btn
|
|
color="primary"
|
|
dark
|
|
class="text-none"
|
|
v-bind="attrs"
|
|
v-on="on"
|
|
>
|
|
Add
|
|
</v-btn>
|
|
</template>
|
|
<v-card>
|
|
<v-card-title>
|
|
<span class="headline">Add a new field</span>
|
|
</v-card-title>
|
|
|
|
<v-card-text>
|
|
<v-container>
|
|
<v-form
|
|
ref="form"
|
|
v-model="valid"
|
|
>
|
|
<v-row>
|
|
<v-col
|
|
cols="12"
|
|
sm="12"
|
|
class="pa-0"
|
|
>
|
|
<v-text-field
|
|
v-model="editedItem.key"
|
|
label="Key"
|
|
outlined
|
|
/>
|
|
</v-col>
|
|
<v-col
|
|
cols="12"
|
|
sm="12"
|
|
class="pa-0"
|
|
>
|
|
<v-text-field
|
|
v-model="editedItem.value"
|
|
label="Value"
|
|
outlined
|
|
/>
|
|
</v-col>
|
|
</v-row>
|
|
</v-form>
|
|
</v-container>
|
|
</v-card-text>
|
|
|
|
<v-card-actions>
|
|
<v-spacer />
|
|
<v-btn
|
|
color="blue darken-1"
|
|
class="text-capitalize"
|
|
text
|
|
@click="close"
|
|
>
|
|
Cancel
|
|
</v-btn>
|
|
<v-btn
|
|
:disabled="!valid"
|
|
color="blue darken-1"
|
|
class="text-capitalize"
|
|
text
|
|
@click="save"
|
|
>
|
|
Save
|
|
</v-btn>
|
|
</v-card-actions>
|
|
</v-card>
|
|
</v-dialog>
|
|
</v-toolbar>
|
|
</template>
|
|
<template v-slot:[`item.actions`]="{ item }">
|
|
<v-icon
|
|
small
|
|
class="mr-2"
|
|
@click="editItem(item)"
|
|
>
|
|
mdi-pencil
|
|
</v-icon>
|
|
<v-icon
|
|
small
|
|
@click="deleteItem(item)"
|
|
>
|
|
mdi-delete
|
|
</v-icon>
|
|
</template>
|
|
</v-data-table>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Vue from 'vue'
|
|
|
|
export default Vue.extend({
|
|
|
|
props: {
|
|
value: {
|
|
type: Array,
|
|
default: () => [],
|
|
required: true
|
|
},
|
|
title: {
|
|
type: String,
|
|
default: '',
|
|
required: true
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
headers: [
|
|
{
|
|
text: 'Key',
|
|
align: 'left',
|
|
value: 'key',
|
|
sortable: false
|
|
},
|
|
{
|
|
text: 'Value',
|
|
align: 'left',
|
|
value: 'value',
|
|
sortable: false
|
|
},
|
|
{
|
|
text: 'Actions',
|
|
value: 'actions',
|
|
sortable: false
|
|
}
|
|
],
|
|
dialog: false,
|
|
valid: false,
|
|
editedIndex: -1,
|
|
editedItem: {
|
|
'key': '',
|
|
'value': ''
|
|
},
|
|
defaultItem: {
|
|
'key': '',
|
|
'value': ''
|
|
},
|
|
items: [] as string[],
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
editItem(item: {'key': string, 'value': string}) {
|
|
this.editedIndex = this.value.indexOf(item)
|
|
this.editedItem = Object.assign({}, item)
|
|
this.dialog = true
|
|
},
|
|
|
|
deleteItem(item: {'key': string, 'value': string}) {
|
|
this.editedIndex = this.value.indexOf(item)
|
|
this.editedItem = Object.assign({}, item)
|
|
const items = Object.assign([], this.value)
|
|
items.splice(this.editedIndex, 1)
|
|
this.editedItem = Object.assign({}, this.defaultItem)
|
|
this.editedIndex = -1
|
|
this.$emit('input', items)
|
|
},
|
|
|
|
close() {
|
|
this.dialog = false
|
|
this.$nextTick(() => {
|
|
this.editedItem = Object.assign({}, this.defaultItem)
|
|
this.editedIndex = -1
|
|
})
|
|
},
|
|
|
|
save() {
|
|
const items = Object.assign([], this.value)
|
|
if (this.editedIndex > -1) {
|
|
Object.assign(items[this.editedIndex], this.editedItem)
|
|
} else {
|
|
items.push(this.editedItem)
|
|
}
|
|
this.close()
|
|
this.$emit('input', items)
|
|
}
|
|
}
|
|
})
|
|
</script>
|
|
|
|
<style scoped>
|
|
.toolbar-control >>> .v-toolbar__content {
|
|
padding: 0px !important;
|
|
}
|
|
</style>
|