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.
204 lines
5.1 KiB
204 lines
5.1 KiB
<template>
|
|
<v-app>
|
|
<the-header>
|
|
<template #leftDrawerIcon>
|
|
<v-app-bar-nav-icon @click="drawerLeft = !drawerLeft" />
|
|
</template>
|
|
</the-header>
|
|
|
|
<v-navigation-drawer
|
|
v-model="drawerLeft"
|
|
app
|
|
clipped
|
|
color=""
|
|
>
|
|
<the-side-bar
|
|
:link="getLink"
|
|
:role="getCurrentUserRole"
|
|
/>
|
|
</v-navigation-drawer>
|
|
|
|
<v-main>
|
|
<v-overlay :value="loading">
|
|
<v-progress-circular indeterminate size="64" />
|
|
</v-overlay>
|
|
<v-container fluid>
|
|
<v-row
|
|
no-gutters
|
|
class="d-none d-sm-flex"
|
|
>
|
|
<v-col>
|
|
<approve-button
|
|
v-if="canViewApproveButton"
|
|
v-model="page"
|
|
:length="total"
|
|
:approved="approved"
|
|
:disabled="currentDoc ? false : true"
|
|
/>
|
|
<filter-button
|
|
v-model="filterOption"
|
|
/>
|
|
<guideline-button />
|
|
<comment-button />
|
|
<clear-annotations-button />
|
|
</v-col>
|
|
<v-spacer />
|
|
<v-col>
|
|
<pagination
|
|
v-model="page"
|
|
:length="total"
|
|
/>
|
|
</v-col>
|
|
</v-row>
|
|
<v-row justify="center">
|
|
<v-col cols="12" md="9">
|
|
<nuxt />
|
|
</v-col>
|
|
<v-col cols="12" md="3">
|
|
<metadata-box
|
|
v-if="currentDoc && !loading"
|
|
:metadata="JSON.parse(currentDoc.meta)"
|
|
/>
|
|
</v-col>
|
|
</v-row>
|
|
</v-container>
|
|
</v-main>
|
|
|
|
<bottom-navigator
|
|
v-model="page"
|
|
:length="total"
|
|
class="d-flex d-sm-none"
|
|
/>
|
|
</v-app>
|
|
</template>
|
|
|
|
<script>
|
|
import { mapActions, mapGetters, mapState, mapMutations } from 'vuex'
|
|
import BottomNavigator from '@/components/containers/annotation/BottomNavigator'
|
|
import ClearAnnotationsButton from '@/components/containers/annotation/ClearAnnotationsButton.vue'
|
|
import GuidelineButton from '@/components/containers/annotation/GuidelineButton'
|
|
import MetadataBox from '@/components/organisms/annotation/MetadataBox'
|
|
import FilterButton from '@/components/containers/annotation/FilterButton'
|
|
import ApproveButton from '@/components/containers/annotation/ApproveButton'
|
|
import CommentButton from '@/components/containers/annotation/CommentButton'
|
|
import Pagination from '~/components/containers/annotation/Pagination'
|
|
import TheHeader from '~/components/organisms/layout/TheHeader'
|
|
import TheSideBar from '~/components/organisms/layout/TheSideBar'
|
|
|
|
export default {
|
|
middleware: ['check-auth', 'auth', 'set-project'],
|
|
|
|
components: {
|
|
TheSideBar,
|
|
TheHeader,
|
|
BottomNavigator,
|
|
Pagination,
|
|
GuidelineButton,
|
|
FilterButton,
|
|
ApproveButton,
|
|
MetadataBox,
|
|
ClearAnnotationsButton,
|
|
CommentButton
|
|
},
|
|
|
|
fetch() {
|
|
this.getDocumentList({
|
|
projectId: this.$route.params.id,
|
|
limit: this.limit,
|
|
offset: this.offset,
|
|
q: this.$route.query.q,
|
|
isChecked: this.filterOption,
|
|
filterName: this.getFilterOption
|
|
})
|
|
},
|
|
|
|
data() {
|
|
return {
|
|
drawerLeft: null,
|
|
limit: 10
|
|
}
|
|
},
|
|
|
|
computed: {
|
|
...mapGetters('projects', ['getLink', 'getCurrentUserRole', 'getFilterOption', 'canViewApproveButton']),
|
|
...mapState('documents', ['loading', 'total']),
|
|
...mapGetters('documents', ['currentDoc', 'approved']),
|
|
page: {
|
|
get() {
|
|
return parseInt(this.$route.query.page, 10)
|
|
},
|
|
set(value) {
|
|
this.$router.push({
|
|
query: {
|
|
isChecked: this.$route.query.isChecked,
|
|
page: parseInt(value, 10),
|
|
q: this.$route.query.q
|
|
}
|
|
})
|
|
}
|
|
},
|
|
filterOption: {
|
|
get() {
|
|
return this.$route.query.isChecked
|
|
},
|
|
set(value) {
|
|
this.$router.push({
|
|
query: {
|
|
isChecked: value,
|
|
page: 1,
|
|
q: this.$route.query.q
|
|
}
|
|
})
|
|
}
|
|
},
|
|
offset() {
|
|
return Math.floor((this.page - 1) / this.limit) * this.limit
|
|
},
|
|
current() {
|
|
return (this.page - 1) % this.limit
|
|
},
|
|
searchOptions() {
|
|
// a bit tricky technique to capture variables change simultaneously.
|
|
// see https://github.com/vuejs/vue/issues/844#issuecomment-265315349
|
|
return JSON.stringify({
|
|
page: this.page,
|
|
q: this.$route.query.q,
|
|
isChecked: this.filterOption
|
|
})
|
|
}
|
|
},
|
|
|
|
watch: {
|
|
total() {
|
|
// To validate the range of page variable on reloading the annotation page.
|
|
if (this.total !== 0 && this.page > this.total) {
|
|
this.$router.push({
|
|
path: this.localePath(`/projects/${this.$route.params.id}/`)
|
|
})
|
|
}
|
|
},
|
|
offset() {
|
|
this.$fetch()
|
|
},
|
|
filterOption() {
|
|
this.page = 1
|
|
this.$fetch()
|
|
},
|
|
current: {
|
|
handler() {
|
|
this.setCurrent(this.current)
|
|
},
|
|
immediate: true
|
|
},
|
|
searchOptions() {
|
|
this.saveSearchOptions(JSON.parse(this.searchOptions))
|
|
}
|
|
},
|
|
|
|
methods: {
|
|
...mapActions('documents', ['getDocumentList']),
|
|
...mapMutations('documents', ['setCurrent']),
|
|
...mapMutations('projects', ['saveSearchOptions'])
|
|
}
|
|
}
|
|
</script>
|