mirror of https://github.com/doccano/doccano.git
2 changed files with 147 additions and 11 deletions
Unified View
Diff Options
@ -0,0 +1,78 @@ |
|||||
|
<template> |
||||
|
<v-data-table |
||||
|
:value="value" |
||||
|
:headers="headers" |
||||
|
:items="items" |
||||
|
:search="search" |
||||
|
:loading="isLoading" |
||||
|
:loading-text="$t('generic.loading')" |
||||
|
:no-data-text="$t('vuetify.noDataAvailable')" |
||||
|
:footer-props="{ |
||||
|
'showFirstLastPage': true, |
||||
|
'items-per-page-options': [5, 10, 15, $t('generic.all')], |
||||
|
'items-per-page-text': $t('vuetify.itemsPerPageText'), |
||||
|
'page-text': $t('dataset.pageText') |
||||
|
}" |
||||
|
item-key="id" |
||||
|
show-select |
||||
|
@input="$emit('input', $event)" |
||||
|
> |
||||
|
<template v-slot:top> |
||||
|
<v-text-field |
||||
|
v-model="search" |
||||
|
prepend-inner-icon="search" |
||||
|
:label="$t('generic.search')" |
||||
|
single-line |
||||
|
hide-details |
||||
|
filled |
||||
|
/> |
||||
|
</template> |
||||
|
<template v-slot:[`item.actions`]="{ item }"> |
||||
|
<v-icon |
||||
|
small |
||||
|
@click="$emit('edit', item)" |
||||
|
> |
||||
|
mdi-pencil |
||||
|
</v-icon> |
||||
|
</template> |
||||
|
</v-data-table> |
||||
|
</template> |
||||
|
|
||||
|
<script lang="ts"> |
||||
|
import Vue from 'vue' |
||||
|
|
||||
|
export default Vue.extend({ |
||||
|
props: { |
||||
|
isLoading: { |
||||
|
type: Boolean, |
||||
|
default: false, |
||||
|
required: true |
||||
|
}, |
||||
|
items: { |
||||
|
type: Array, |
||||
|
default: () => [], |
||||
|
required: true |
||||
|
}, |
||||
|
value: { |
||||
|
type: Array, |
||||
|
default: () => [], |
||||
|
required: true |
||||
|
} |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
search: '' |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
computed: { |
||||
|
headers() { |
||||
|
return [ |
||||
|
{ text: this.$t('generic.name'), value: 'username' }, |
||||
|
{ text: this.$t('members.role'), value: 'rolename' }, |
||||
|
{ text: 'Actions', value: 'actions', sortable: false } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
</script> |
@ -1,29 +1,87 @@ |
|||||
<template> |
<template> |
||||
<v-card> |
<v-card> |
||||
<v-card-title> |
<v-card-title> |
||||
<member-addition-button /> |
|
||||
<member-deletion-button /> |
|
||||
|
<v-btn |
||||
|
class="text-capitalize ms-2" |
||||
|
:disabled="!canDelete" |
||||
|
outlined |
||||
|
@click.stop="dialogDelete=true" |
||||
|
> |
||||
|
{{ $t('generic.delete') }} |
||||
|
</v-btn> |
||||
|
<v-dialog v-model="dialogDelete"> |
||||
|
<form-delete |
||||
|
:selected="selected" |
||||
|
@cancel="dialogDelete=false" |
||||
|
@remove="remove" |
||||
|
/> |
||||
|
</v-dialog> |
||||
</v-card-title> |
</v-card-title> |
||||
<member-list /> |
|
||||
|
<member-list |
||||
|
v-model="selected" |
||||
|
:items="items" |
||||
|
:is-loading="isLoading" |
||||
|
/> |
||||
</v-card> |
</v-card> |
||||
</template> |
</template> |
||||
|
|
||||
<script> |
|
||||
import MemberList from '@/components/containers/members/MemberList' |
|
||||
import MemberAdditionButton from '@/components/containers/members/MemberAdditionButton' |
|
||||
import MemberDeletionButton from '@/components/containers/members/MemberDeletionButton' |
|
||||
|
<script lang="ts"> |
||||
|
import Vue from 'vue' |
||||
|
import MemberList from '@/components/member/MemberList.vue' |
||||
|
import FormDelete from '@/components/member/FormDelete.vue' |
||||
|
import { MemberDTO } from '~/services/application/member.service' |
||||
|
|
||||
export default { |
|
||||
|
export default Vue.extend({ |
||||
layout: 'project', |
layout: 'project', |
||||
|
|
||||
components: { |
components: { |
||||
MemberList, |
MemberList, |
||||
MemberAdditionButton, |
|
||||
MemberDeletionButton |
|
||||
|
FormDelete |
||||
|
}, |
||||
|
|
||||
|
async fetch() { |
||||
|
this.isLoading = true |
||||
|
this.items = await this.$services.member.list(this.projectId) |
||||
|
this.isLoading = false |
||||
|
}, |
||||
|
|
||||
|
data() { |
||||
|
return { |
||||
|
dialogCreate: false, |
||||
|
dialogDelete: false, |
||||
|
items: [] as MemberDTO[], |
||||
|
selected: [] as MemberDTO[], |
||||
|
isLoading: false, |
||||
|
errorMessage: '' |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
computed: { |
||||
|
canDelete(): boolean { |
||||
|
return this.selected.length > 0 |
||||
|
}, |
||||
|
projectId(): string { |
||||
|
return this.$route.params.id |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
async remove() { |
||||
|
await this.$services.member.bulkDelete(this.projectId, this.selected) |
||||
|
this.$fetch() |
||||
|
this.dialogDelete = false |
||||
|
this.selected = [] |
||||
|
} |
||||
}, |
}, |
||||
|
|
||||
validate({ params }) { |
validate({ params }) { |
||||
return /^\d+$/.test(params.id) |
return /^\d+$/.test(params.id) |
||||
} |
} |
||||
} |
|
||||
|
}) |
||||
</script> |
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
::v-deep .v-dialog { |
||||
|
width: 800px; |
||||
|
} |
||||
|
</style> |
Write
Preview
Loading…
Cancel
Save