mirror of https://github.com/doccano/doccano.git
pythonannotation-tooldatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learning
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.
138 lines
4.0 KiB
138 lines
4.0 KiB
<template>
|
|
<v-card>
|
|
<v-toolbar color="primary white--text" flat>
|
|
<v-toolbar-title>Assign examples to members</v-toolbar-title>
|
|
</v-toolbar>
|
|
<v-card-text>
|
|
<v-container fluid>
|
|
<v-row>
|
|
<v-card-title class="pb-0 pl-3">Select assignment strategy</v-card-title>
|
|
<v-col cols="12">
|
|
<v-select
|
|
v-model="selectedStrategy"
|
|
:items="strategies"
|
|
item-text="displayName"
|
|
item-value="value"
|
|
outlined
|
|
dense
|
|
hide-details
|
|
></v-select>
|
|
{{ strategies.find((strategy) => strategy.value === selectedStrategy)?.description }}
|
|
The project managers have access to all examples, regardless of whether they are
|
|
assigned or not.
|
|
</v-col>
|
|
</v-row>
|
|
<v-row>
|
|
<v-card-title class="pb-0 pl-3">Allocate weights</v-card-title>
|
|
<v-col v-for="(member, i) in members" :key="member.id" cols="12" class="pt-0 pb-0">
|
|
<v-subheader class="pl-0">{{ member.username }}</v-subheader>
|
|
<v-slider v-model="workloadAllocation[i]" :max="100" class="align-center">
|
|
<template #append>
|
|
<v-text-field
|
|
v-model="workloadAllocation[i]"
|
|
class="mt-0 pt-0"
|
|
type="number"
|
|
style="width: 60px"
|
|
></v-text-field>
|
|
</template>
|
|
</v-slider>
|
|
</v-col>
|
|
</v-row>
|
|
</v-container>
|
|
</v-card-text>
|
|
<v-card-actions>
|
|
<v-spacer />
|
|
<v-btn class="text-capitalize" text color="primary" data-test="cancel-button" @click="cancel">
|
|
Cancel
|
|
</v-btn>
|
|
<v-btn
|
|
class="text-none"
|
|
text
|
|
:disabled="!validateWeight || isWaiting"
|
|
data-test="delete-button"
|
|
@click="agree"
|
|
>
|
|
Assign
|
|
</v-btn>
|
|
</v-card-actions>
|
|
<v-overlay :value="isWaiting">
|
|
<v-progress-circular indeterminate size="64" />
|
|
</v-overlay>
|
|
</v-card>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import Vue from 'vue'
|
|
import { MemberItem } from '~/domain/models/member/member'
|
|
|
|
export default Vue.extend({
|
|
data() {
|
|
return {
|
|
members: [] as MemberItem[],
|
|
workloadAllocation: [] as number[],
|
|
selectedStrategy: 'weighted_sequential',
|
|
isWaiting: false
|
|
}
|
|
},
|
|
|
|
async fetch() {
|
|
this.members = await this.$repositories.member.list(this.projectId)
|
|
this.workloadAllocation = this.members.map(() => Math.round(100 / this.members.length))
|
|
},
|
|
|
|
computed: {
|
|
projectId() {
|
|
return this.$route.params.id
|
|
},
|
|
|
|
strategies() {
|
|
return [
|
|
{
|
|
displayName: 'Weighted sequential',
|
|
value: 'weighted_sequential',
|
|
description:
|
|
'Assign examples to members in order of their workload. The total weight must equal 100.'
|
|
},
|
|
{
|
|
displayName: 'Weighted random',
|
|
value: 'weighted_random',
|
|
description:
|
|
'Assign examples to members randomly based on their workload. The total weight must equal 100.'
|
|
},
|
|
{
|
|
displayName: 'Sampling without replacement',
|
|
value: 'sampling_without_replacement',
|
|
description: 'Assign examples to members randomly without replacement.'
|
|
}
|
|
]
|
|
},
|
|
|
|
validateWeight(): boolean {
|
|
if (this.selectedStrategy === 'sampling_without_replacement') {
|
|
return true
|
|
} else {
|
|
return this.workloadAllocation.reduce((acc, cur) => acc + cur, 0) === 100
|
|
}
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
async agree() {
|
|
this.isWaiting = true
|
|
const workloads = this.workloadAllocation.map((weight, i) => ({
|
|
weight,
|
|
member_id: this.members[i].id
|
|
}))
|
|
await this.$repositories.assignment.bulkAssign(this.projectId, {
|
|
strategy_name: this.selectedStrategy,
|
|
workloads
|
|
})
|
|
this.isWaiting = false
|
|
this.$emit('assigned')
|
|
},
|
|
cancel() {
|
|
this.$emit('cancel')
|
|
}
|
|
}
|
|
})
|
|
</script>
|