diff --git a/frontend/components/layout/TheSideBar.vue b/frontend/components/layout/TheSideBar.vue
index 798b6387..f7996ccf 100644
--- a/frontend/components/layout/TheSideBar.vue
+++ b/frontend/components/layout/TheSideBar.vue
@@ -46,6 +46,11 @@ export default {
type: Object,
default: () => {},
required: true
+ },
+ project: {
+ type: Object,
+ default: () => {},
+ required: true
}
},
@@ -58,24 +63,66 @@ export default {
computed: {
filteredItems() {
const items = [
- { icon: 'mdi-home', text: this.$t('projectHome.home'), link: '', adminOnly: false },
- { icon: 'mdi-database', text: this.$t('dataset.dataset'), link: 'dataset', adminOnly: true },
- { icon: 'label', text: this.$t('labels.labels'), link: 'labels', adminOnly: true },
- { icon: 'label', text: 'Relations', link: 'links', adminOnly: true },
- { icon: 'person', text: this.$t('members.members'), link: 'members', adminOnly: true },
- { icon: 'mdi-comment-account-outline', text: 'Comments', link: 'comments', adminOnly: true },
- { icon: 'mdi-book-open-outline', text: this.$t('guideline.guideline'), link: 'guideline', adminOnly: true },
- { icon: 'mdi-chart-bar', text: this.$t('statistics.statistics'), link: 'statistics', adminOnly: true },
- { icon: 'mdi-cog', text: this.$t('settings.title'), link: 'settings', adminOnly: true }
+ {
+ icon: 'mdi-home',
+ text: this.$t('projectHome.home'),
+ link: '',
+ isVisible: true
+ },
+ {
+ icon: 'mdi-database',
+ text: this.$t('dataset.dataset'),
+ link: 'dataset',
+ isVisible: this.role.is_project_admin
+ },
+ {
+ icon: 'label',
+ text: this.$t('labels.labels'),
+ link: 'labels',
+ isVisible: this.role.is_project_admin && this.project.canDefineLabel
+ },
+ {
+ icon: 'label',
+ text: 'Relations',
+ link: 'links',
+ isVisible: this.role.is_project_admin && this.project.canDefineRelation
+ },
+ {
+ icon: 'person',
+ text: this.$t('members.members'),
+ link: 'members',
+ isVisible: this.role.is_project_admin
+ },
+ {
+ icon: 'mdi-comment-account-outline',
+ text: 'Comments',
+ link: 'comments',
+ isVisible: this.role.is_project_admin
+ },
+ {
+ icon: 'mdi-book-open-outline',
+ text: this.$t('guideline.guideline'),
+ link: 'guideline',
+ isVisible: this.role.is_project_admin
+ },
+ {
+ icon: 'mdi-chart-bar',
+ text: this.$t('statistics.statistics'),
+ link: 'statistics',
+ isVisible: this.role.is_project_admin
+ },
+ {
+ icon: 'mdi-cog',
+ text: this.$t('settings.title'),
+ link: 'settings',
+ isVisible: this.role.is_project_admin
+ }
]
- return items.filter(item => this.isVisible(item))
+ return items.filter(item => item.isVisible)
}
},
methods: {
- isVisible(item) {
- return !item.adminOnly || this.role.is_project_admin
- },
toLabeling() {
const query = this.$services.option.findOption(this.$route.params.id)
this.$router.push({
diff --git a/frontend/domain/models/project/project.ts b/frontend/domain/models/project/project.ts
index eab59ef5..a37c5eba 100644
--- a/frontend/domain/models/project/project.ts
+++ b/frontend/domain/models/project/project.ts
@@ -90,6 +90,22 @@ export class ProjectReadItem {
return role && !role.is_annotator
}
+ get canDefineLabel() {
+ const allowedProjectTypes = [
+ 'DocumentClassification',
+ 'SequenceLabeling',
+ 'ImageClassification'
+ ]
+ return allowedProjectTypes.includes(this.project_type)
+ }
+
+ get canDefineRelation() {
+ const allowedProjectTypes = [
+ 'SequenceLabeling'
+ ]
+ return allowedProjectTypes.includes(this.project_type)
+ }
+
get filterOption() {
if (this.project_type === 'DocumentClassification') {
return 'categories__isnull'
diff --git a/frontend/layouts/project.vue b/frontend/layouts/project.vue
index b2e298d3..d475f3ba 100644
--- a/frontend/layouts/project.vue
+++ b/frontend/layouts/project.vue
@@ -15,6 +15,7 @@
@@ -55,7 +56,7 @@ export default {
},
computed: {
- ...mapGetters('projects', ['getLink', 'getCurrentUserRole'])
+ ...mapGetters('projects', ['getLink', 'getCurrentUserRole', 'currentProject'])
}
}
diff --git a/frontend/layouts/workspace.vue b/frontend/layouts/workspace.vue
index 38d70a43..a2f30bdc 100644
--- a/frontend/layouts/workspace.vue
+++ b/frontend/layouts/workspace.vue
@@ -14,6 +14,7 @@
@@ -43,7 +44,7 @@ export default {
},
computed: {
- ...mapGetters('projects', ['getLink', 'getCurrentUserRole'])
+ ...mapGetters('projects', ['getLink', 'getCurrentUserRole', 'currentProject'])
},
watch: {
diff --git a/frontend/pages/projects/_id/labels/index.vue b/frontend/pages/projects/_id/labels/index.vue
index 3c53946b..07b39af8 100644
--- a/frontend/pages/projects/_id/labels/index.vue
+++ b/frontend/pages/projects/_id/labels/index.vue
@@ -56,6 +56,7 @@ import FormDelete from '@/components/label/FormDelete.vue'
import FormUpload from '@/components/label/FormUpload.vue'
import LabelList from '@/components/label/LabelList.vue'
import { LabelDTO } from '~/services/application/label/labelData'
+import { ProjectDTO } from '~/services/application/project/projectData'
export default Vue.extend({
layout: 'project',
@@ -183,8 +184,14 @@ export default Vue.extend({
}
},
- validate({ params }) {
- return /^\d+$/.test(params.id)
+ validate({ params, app }) {
+ if (/^\d+$/.test(params.id)) {
+ return app.$services.project.findById(params.id)
+ .then((res:ProjectDTO) => {
+ return res.canDefineLabel
+ })
+ }
+ return false
}
})
diff --git a/frontend/pages/projects/_id/links/index.vue b/frontend/pages/projects/_id/links/index.vue
index 67572ce8..04c9cd15 100644
--- a/frontend/pages/projects/_id/links/index.vue
+++ b/frontend/pages/projects/_id/links/index.vue
@@ -46,6 +46,7 @@ import FormCreate from '@/components/links/FormCreate.vue'
import FormDelete from '@/components/links/FormDelete.vue'
import LinksList from '~/components/links/LinksList.vue'
import { LinkTypeDTO } from '~/services/application/links/linkData'
+import { ProjectDTO } from '~/services/application/project/projectData'
export default Vue.extend({
layout: 'project',
@@ -142,8 +143,14 @@ export default Vue.extend({
}
},
- validate({ params }) {
- return /^\d+$/.test(params.id)
+ validate({ params, app }) {
+ if (/^\d+$/.test(params.id)) {
+ return app.$services.project.findById(params.id)
+ .then((res:ProjectDTO) => {
+ return res.canDefineRelation
+ })
+ }
+ return false
}
})
diff --git a/frontend/services/application/project/projectData.ts b/frontend/services/application/project/projectData.ts
index fa591ace..d9e8ccab 100644
--- a/frontend/services/application/project/projectData.ts
+++ b/frontend/services/application/project/projectData.ts
@@ -15,6 +15,8 @@ export class ProjectDTO {
permitApprove: Boolean
filterOption: String
tags: Object[]
+ canDefineLabel: Boolean
+ canDefineRelation: Boolean
constructor(item: ProjectReadItem) {
this.id = item.id
@@ -31,6 +33,8 @@ export class ProjectDTO {
this.permitApprove = item.permitApprove
this.filterOption = item.filterOption
this.tags = item.tags
+ this.canDefineLabel = item.canDefineLabel
+ this.canDefineRelation = item.canDefineRelation
}
}