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.
250 lines
7.2 KiB
250 lines
7.2 KiB
<template>
|
|
<v-stepper
|
|
v-model="step.count"
|
|
>
|
|
<v-stepper-header>
|
|
<v-stepper-step
|
|
:complete="step.count > 1"
|
|
step="1"
|
|
>
|
|
Select a config template
|
|
</v-stepper-step>
|
|
<v-divider />
|
|
<v-stepper-step
|
|
:complete="step.count > 2"
|
|
step="2"
|
|
>
|
|
Configure parameters
|
|
</v-stepper-step>
|
|
<v-divider />
|
|
<v-stepper-step
|
|
:complete="step.count > 3"
|
|
step="3"
|
|
>
|
|
Test the config
|
|
</v-stepper-step>
|
|
</v-stepper-header>
|
|
|
|
<v-card>
|
|
<v-overlay :value="isLoading">
|
|
<v-progress-circular indeterminate size="64" />
|
|
</v-overlay>
|
|
<v-card-text class="pa-0">
|
|
<v-stepper-content step="1">
|
|
<h4 class="text-h6">Select a config template</h4>
|
|
<p class="font-weight-regular body-1">
|
|
You can select the template to create the auto-labeling configuration.
|
|
</p>
|
|
<v-select
|
|
v-model="templateName"
|
|
:items="templateNames"
|
|
label="Select a config template"
|
|
outlined
|
|
/>
|
|
</v-stepper-content>
|
|
|
|
<v-stepper-content step="2">
|
|
<h4 class="text-h6">Set parameters</h4>
|
|
<p class="font-weight-regular body-1">
|
|
You can set parameters to fetch API response.
|
|
</p>
|
|
<template v-for="item in templateConfig.model_attrs">
|
|
<v-text-field
|
|
v-if="item.type === 'textField'"
|
|
v-model="item.value"
|
|
:label="item.name"
|
|
outlined
|
|
:key="item.name"
|
|
/>
|
|
<v-select
|
|
v-if="item.type === 'selectField'"
|
|
v-model="item.value"
|
|
:items="item.items"
|
|
:label="item.name"
|
|
outlined
|
|
:key="item.name"
|
|
/>
|
|
<object-field
|
|
v-if="item.type === 'objectField'"
|
|
v-model="item.value"
|
|
:title="item.name"
|
|
:key="item.name"
|
|
/>
|
|
</template>
|
|
|
|
<h4 class="text-h6">Set mapping template</h4>
|
|
<p class="font-weight-regular body-1">
|
|
You can set mapping template to convert API response to doccano format.
|
|
</p>
|
|
<v-textarea
|
|
v-model="templateConfig.template"
|
|
outlined
|
|
label="Mapping Template"
|
|
/>
|
|
|
|
<h4 class="text-h6">Configure label mappings</h4>
|
|
<p class="font-weight-regular body-1">
|
|
Once you fetch the API response, you can convert the label into the defined one.
|
|
</p>
|
|
<label-mapping v-model="templateConfig.label_mapping" />
|
|
</v-stepper-content>
|
|
|
|
<v-stepper-content step="3">
|
|
<h4 class="text-h6">Test the defined config</h4>
|
|
<p class="font-weight-regular body-1">
|
|
Before saving the config, you need to test the defined config.
|
|
Please input sample text and press the <strong>Test</strong> button.
|
|
</p>
|
|
<v-text-field
|
|
v-model="sampleText"
|
|
outlined
|
|
label="Sample Text"
|
|
/>
|
|
</v-stepper-content>
|
|
</v-card-text>
|
|
<v-card-actions class="me-4">
|
|
<v-spacer />
|
|
<v-btn
|
|
v-show="step.hasPrev()"
|
|
text
|
|
class="text-capitalize"
|
|
@click="step.prev()"
|
|
>
|
|
Prev
|
|
</v-btn>
|
|
<v-btn
|
|
v-show="step.hasNext()"
|
|
:disabled="disabled"
|
|
color="primary"
|
|
class="text-capitalize"
|
|
@click="step.next()"
|
|
>
|
|
Next
|
|
</v-btn>
|
|
<v-btn
|
|
v-show="step.isLast() && !passTesting"
|
|
:disabled="sampleText === '' || isLoading"
|
|
color="primary"
|
|
class="text-capitalize"
|
|
@click="testConfig"
|
|
>
|
|
Test
|
|
</v-btn>
|
|
<v-btn
|
|
v-show="step.isLast() && passTesting"
|
|
color="success"
|
|
class="text-capitalize"
|
|
@click="saveConfig"
|
|
>
|
|
Save
|
|
</v-btn>
|
|
</v-card-actions>
|
|
</v-card>
|
|
</v-stepper>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Vue from 'vue'
|
|
import { FromApiTemplateRepository } from '@/repositories/template/api'
|
|
import { FromApiConfigItemListRepository } from '@/repositories/config/api'
|
|
import { TemplateApplicationService } from '@/services/application/template.service'
|
|
import { ConfigApplicationService } from '@/services/application/config.service'
|
|
import { ConfigTemplateItem } from '@/models/config/config-template'
|
|
import { ConfigItem } from '@/models/config/config-item-list'
|
|
import { StepCounter } from '@/models/stepper'
|
|
import LabelMapping from '@/components/containers/settings/LabelMapping.vue'
|
|
import ObjectField from '@/components/containers/settings/ObjectField.vue'
|
|
|
|
export default Vue.extend({
|
|
components: {
|
|
LabelMapping,
|
|
ObjectField
|
|
},
|
|
|
|
data() {
|
|
return {
|
|
isLoading: false,
|
|
passTesting: false,
|
|
sampleText: '',
|
|
step: new StepCounter(1, 3),
|
|
templateName: null,
|
|
templateConfig: {},
|
|
templateNames: [] as string[]
|
|
}
|
|
},
|
|
|
|
async created() {
|
|
this.templateNames = await this.templateService.list(this.$route.params.id)
|
|
},
|
|
|
|
watch: {
|
|
async templateName(val) {
|
|
const projectId = this.$route.params.id
|
|
const response: ConfigTemplateItem = await this.templateService.find(projectId, val)
|
|
this.templateConfig = response.toObject()
|
|
},
|
|
templateConfig: {
|
|
handler() {
|
|
this.passTesting = false
|
|
},
|
|
deep: true
|
|
}
|
|
},
|
|
|
|
computed: {
|
|
disabled(): boolean {
|
|
return this.step.isFirst() && this.templateName === null
|
|
},
|
|
templateService(): TemplateApplicationService {
|
|
const repository = new FromApiTemplateRepository()
|
|
const service = new TemplateApplicationService(repository)
|
|
return service
|
|
},
|
|
configService(): ConfigApplicationService{
|
|
const repository = new FromApiConfigItemListRepository()
|
|
const service = new ConfigApplicationService(repository)
|
|
return service
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
createConfig() {
|
|
const payload = {
|
|
// @ts-ignore
|
|
modelName: this.templateConfig.model_name,
|
|
// @ts-ignore
|
|
modelAttrs: this.templateConfig.model_attrs,
|
|
// @ts-ignore
|
|
template: this.templateConfig.template,
|
|
// @ts-ignore
|
|
labelMapping: this.templateConfig.label_mapping
|
|
}
|
|
return ConfigItem.parseFromUI(payload)
|
|
},
|
|
testConfig() {
|
|
const projectId = this.$route.params.id
|
|
const item = this.createConfig()
|
|
this.isLoading = true
|
|
this.configService.testConfig(projectId, item, this.sampleText)
|
|
.then(value => {
|
|
this.passTesting = value.valid
|
|
})
|
|
.finally(() => {
|
|
this.isLoading = false
|
|
})
|
|
},
|
|
saveConfig() {
|
|
const projectId = this.$route.params.id
|
|
const item = this.createConfig()
|
|
this.isLoading = true
|
|
this.configService.save(projectId, item)
|
|
.then(item => {
|
|
this.$emit('onCreate')
|
|
})
|
|
.finally(() => {
|
|
this.isLoading = false
|
|
})
|
|
}
|
|
}
|
|
})
|
|
</script>
|