mirror of https://github.com/doccano/doccano.git
2 changed files with 147 additions and 11 deletions
Split 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> |
|||
<v-card> |
|||
<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> |
|||
<member-list /> |
|||
<member-list |
|||
v-model="selected" |
|||
:items="items" |
|||
:is-loading="isLoading" |
|||
/> |
|||
</v-card> |
|||
</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', |
|||
|
|||
components: { |
|||
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 }) { |
|||
return /^\d+$/.test(params.id) |
|||
} |
|||
} |
|||
}) |
|||
</script> |
|||
|
|||
<style scoped> |
|||
::v-deep .v-dialog { |
|||
width: 800px; |
|||
} |
|||
</style> |
Write
Preview
Loading…
Cancel
Save