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.
168 lines
4.4 KiB
168 lines
4.4 KiB
<template>
|
|
<v-data-table :headers="headers" :items="value">
|
|
<template #top>
|
|
<v-dialog v-model="dialog" max-width="800px">
|
|
<template #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 mapping</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.from"
|
|
label="From"
|
|
:rules="labelNameRules($t('rules.labelNameRules'))"
|
|
outlined
|
|
/>
|
|
</v-col>
|
|
<v-col cols="12" sm="12" class="pa-0">
|
|
<v-select
|
|
v-model="editedItem.to"
|
|
:items="items"
|
|
:rules="labelNameRules($t('rules.labelNameRules'))"
|
|
label="To"
|
|
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>
|
|
</template>
|
|
<template #[`item.actions`]="{ item }">
|
|
<v-icon small class="mr-2" @click="editItem(item)">
|
|
{{ mdiPencil }}
|
|
</v-icon>
|
|
<v-icon small @click="deleteItem(item)">
|
|
{{ mdiDelete }}
|
|
</v-icon>
|
|
</template>
|
|
</v-data-table>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Vue from 'vue'
|
|
import { mdiPencil, mdiDelete } from '@mdi/js'
|
|
import { labelNameRules } from '@/rules/index'
|
|
|
|
export default Vue.extend({
|
|
props: {
|
|
value: {
|
|
type: Array,
|
|
default: () => [],
|
|
required: true
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
dialog: false,
|
|
headers: [
|
|
{
|
|
text: 'From',
|
|
align: 'left',
|
|
value: 'from',
|
|
sortable: false
|
|
},
|
|
{
|
|
text: 'To',
|
|
align: 'left',
|
|
value: 'to',
|
|
sortable: false
|
|
},
|
|
{
|
|
text: 'Actions',
|
|
value: 'actions',
|
|
sortable: false
|
|
}
|
|
],
|
|
valid: false,
|
|
editedIndex: -1,
|
|
editedItem: {
|
|
from: '',
|
|
to: ''
|
|
},
|
|
defaultItem: {
|
|
from: '',
|
|
to: ''
|
|
},
|
|
items: [] as string[],
|
|
labelNameRules,
|
|
mdiPencil,
|
|
mdiDelete
|
|
}
|
|
},
|
|
|
|
async created() {
|
|
const project = await this.$services.project.findById(this.$route.params.id)
|
|
if (project.projectType.endsWith('Classification')) {
|
|
const labels = await this.$services.categoryType.list(this.$route.params.id)
|
|
this.items = labels.map((item) => item.text)
|
|
} else {
|
|
const labels = await this.$services.spanType.list(this.$route.params.id)
|
|
this.items = labels.map((item) => item.text)
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
editItem(item: { from: string; to: string }) {
|
|
this.editedIndex = this.value.indexOf(item)
|
|
this.editedItem = Object.assign({}, item)
|
|
this.dialog = true
|
|
},
|
|
|
|
deleteItem(item: { from: string; to: 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.$emit('input', items)
|
|
this.close()
|
|
}
|
|
}
|
|
})
|
|
</script>
|