mirror of https://github.com/doccano/doccano.git
2 changed files with 144 additions and 72 deletions
Split View
Diff Options
-
94frontend/components/tasks/sequenceLabeling/EntityEditor.vue
-
122frontend/components/tasks/sequenceLabeling/LabelingMenu.vue
@ -0,0 +1,122 @@ |
|||
<template> |
|||
<v-menu |
|||
:value="opened" |
|||
:position-x="x" |
|||
:position-y="y" |
|||
absolute |
|||
offset-y |
|||
@input="close" |
|||
> |
|||
<v-list |
|||
dense |
|||
min-width="150" |
|||
max-height="400" |
|||
class="overflow-y-auto" |
|||
> |
|||
<v-list-item> |
|||
<v-autocomplete |
|||
ref="autocomplete" |
|||
:value="selectedLabel" |
|||
:items="labels" |
|||
autofocus |
|||
dense |
|||
deletable-chips |
|||
hide-details |
|||
item-text="text" |
|||
item-value="id" |
|||
label="Select a label" |
|||
small-chips |
|||
@input="onLabelSelected" |
|||
/> |
|||
</v-list-item> |
|||
<v-list-item |
|||
v-for="(label, i) in labels" |
|||
:key="i" |
|||
@click="onLabelSelected(label.id)" |
|||
> |
|||
<v-list-item-action |
|||
v-if="hasAnySuffixKey" |
|||
> |
|||
<v-chip |
|||
v-if="label.suffixKey" |
|||
:color="label.backgroundColor" |
|||
outlined |
|||
small |
|||
v-text="label.suffixKey" |
|||
/> |
|||
<span v-else class="mr-8" /> |
|||
</v-list-item-action> |
|||
<v-list-item-content> |
|||
<v-list-item-title v-text="label.text"/> |
|||
</v-list-item-content> |
|||
</v-list-item> |
|||
</v-list> |
|||
</v-menu> |
|||
</template> |
|||
|
|||
<script lang="ts"> |
|||
import Vue from 'vue' |
|||
export default Vue.extend({ |
|||
props: { |
|||
labels: { |
|||
type: Array, |
|||
default: () => [], |
|||
required: true, |
|||
}, |
|||
opened: { |
|||
type: Boolean, |
|||
default: false, |
|||
required: true, |
|||
}, |
|||
selectedLabel: { |
|||
type: Object, |
|||
default: null, |
|||
required: false, |
|||
}, |
|||
x: { |
|||
type: Number, |
|||
default: 0, |
|||
required: true, |
|||
}, |
|||
y: { |
|||
type: Number, |
|||
default: 0, |
|||
required: true, |
|||
} |
|||
}, |
|||
|
|||
data() { |
|||
return { |
|||
startOffset: 0, |
|||
endOffset: 0, |
|||
entity: null as any, |
|||
fromEntity: null as any, |
|||
toEntity: null as any, |
|||
}; |
|||
}, |
|||
|
|||
computed: { |
|||
hasAnySuffixKey(): boolean { |
|||
return this.labels.some((label: any) => label.suffixKey !== null) |
|||
} |
|||
}, |
|||
|
|||
methods: { |
|||
close() { |
|||
// Todo: a bit hacky. I want to fix this problem. |
|||
// https://github.com/vuetifyjs/vuetify/issues/10765 |
|||
this.$nextTick(() => { |
|||
if (this.$refs.autocomplete) { |
|||
(this.$refs.autocomplete as any).selectedItems = [] |
|||
} |
|||
}) |
|||
this.$emit('close') |
|||
}, |
|||
|
|||
onLabelSelected(labelId: number) { |
|||
this.$emit('click:label', labelId) |
|||
this.close() |
|||
} |
|||
} |
|||
}) |
|||
</script> |
Write
Preview
Loading…
Cancel
Save