diff --git a/frontend/src/components/subscriptions/Subscription.vue b/frontend/src/components/subscriptions/Subscription.vue new file mode 100644 index 0000000000000000000000000000000000000000..dd396ca1750e546281163c23f21ab41e4a427c7a --- /dev/null +++ b/frontend/src/components/subscriptions/Subscription.vue @@ -0,0 +1,45 @@ +<template> + <v-list-tile + exact + :to="{name: 'subscription', params: {pk: subscriptionPk}}" + > + <v-list-tile-content class="ml-3"> + {{query_key ? query_key : 'Active'}} + </v-list-tile-content> + <v-list-tile-action-text> + {{stageMap[feedback_stage]}} + </v-list-tile-action-text> + </v-list-tile> +</template> + +<script> + export default { + name: 'subscription', + props: { + subscriptionPk: { + types: String, + required: true + }, + feedback_stage: { + type: String, + required: true + }, + query_key: { + type: String + } + }, + data () { + return { + stageMap: { + 'feedback-creation': 'create', + 'feedback-validation': 'validate', + 'feedback-conflict-resolution': 'conflict' + } + } + } + } +</script> + +<style scoped> + +</style> diff --git a/frontend/src/components/subscriptions/SubscriptionList.vue b/frontend/src/components/subscriptions/SubscriptionList.vue index bc165e4b7cecc20b5f6543308e3e565112df7d64..f3e44747bd523c4b10d54a06cab3ed303b4b75f5 100644 --- a/frontend/src/components/subscriptions/SubscriptionList.vue +++ b/frontend/src/components/subscriptions/SubscriptionList.vue @@ -8,56 +8,22 @@ </v-toolbar> <v-list :dense="sidebar" v-if="!sidebar || (sidebar && !sideBarCollapsed)"> <div v-for="item in subscriptionTypes" :key="item.type"> - <v-list-tile> - <v-list-tile-content> - <v-list-tile-title> - {{ item.name }} - </v-list-tile-title> - <v-list-tile-sub-title> - {{ item.description }} - </v-list-tile-sub-title> - </v-list-tile-content> - <v-list-tile-action v-if="subscriptions[item.type].length > 0"> - <v-btn icon @click="item.expanded = !item.expanded"> - <v-icon v-if="item.expanded">keyboard_arrow_up</v-icon> - <v-icon v-else>keyboard_arrow_down</v-icon> - </v-btn> - </v-list-tile-action> - <v-list-tile-action - v-if="!item.hasOwnProperty('permission') || item.permission()" - > - <v-menu - offset-x - :min-width="500" - :close-on-content-click="false" - :nudge-width="200" - v-model="subscriptionCreateMenu[item.type]" - > - <v-btn small flat icon slot="activator"> - <v-icon>add</v-icon> - </v-btn> - <subscription-creation - :title="item.name" - :type="item.type" - :keyItems="possibleKeys[item.type]" - /> - </v-menu> - </v-list-tile-action> - </v-list-tile> - <v-list-tile - exact - v-if="subscriptions[item.type].length > 0 && item.expanded" - v-for="subscription in subscriptions[item.type]" - :key="subscription.pk" - :to="{name: 'subscription', params: {pk: subscription['pk']}}" + <subscription-type + v-bind="item" + :empty-subscription-type="subscriptions[item.type].length === 0" + :possible-subscription-keys="possibleKeys[item.type]" + @toggleExpand="item.expanded = !item.expanded" > - <v-list-tile-content class="ml-3"> - {{subscription.query_key ? subscription.query_key : 'Active'}} - </v-list-tile-content> - <v-list-tile-action-text> - {{stageMap[subscription.feedback_stage]}} - </v-list-tile-action-text> - </v-list-tile> + <subscription + v-for="subscription in subscriptions[item.type]" + :key="subscription.pk" + :subscription-pk="subscription.pk" + :feedback_stage="subscription.feedback_stage" + :query_key="subscription.query_key" + > + + </subscription> + </subscription-type> </div> </v-list> </v-card> @@ -66,9 +32,14 @@ <script> import {mapGetters, mapActions, mapState} from 'vuex' import SubscriptionCreation from '@/components/subscriptions/SubscriptionCreation' + import SubscriptionType from '@/components/subscriptions/SubscriptionType' + import Subscription from '@/components/subscriptions/Subscription' export default { - components: {SubscriptionCreation}, + components: { + Subscription, + SubscriptionType, + SubscriptionCreation}, name: 'subscription-list', props: { sidebar: { @@ -79,11 +50,6 @@ data () { return { subscriptionCreateMenu: {}, - stageMap: { - 'feedback-creation': 'create', - 'feedback-validation': 'validate', - 'feedback-conflict-resolution': 'conflict' - }, subscriptionTypes: [ { name: 'Random', @@ -95,7 +61,13 @@ name: 'Exam', type: 'exam', description: 'Just submissions for the specified exam.', - expanded: true + expanded: true, + createPermission: () => { + return this.$store.getters.isReviewer + }, + viewPermission: () => { + return this.$store.getters.isReviewer + } }, { name: 'Submission Type', @@ -108,7 +80,10 @@ type: 'student', description: 'The submissions of a student.', expanded: true, - permission: () => { + createPermission: () => { + return this.$store.getters.isReviewer + }, + viewPermission: () => { return this.$store.getters.isReviewer } } @@ -150,7 +125,8 @@ if (Object.keys(this.$store.state.submissionTypes).length === 0) { this.updateSubmissionTypes(['name']) } - if (Object.keys(this.$store.state.examTypes).length === 0) { + if (Object.keys(this.$store.state.examTypes).length === 0 && + this.$store.getters.isReviewer) { this.getExamTypes() } } diff --git a/frontend/src/components/subscriptions/SubscriptionType.vue b/frontend/src/components/subscriptions/SubscriptionType.vue new file mode 100644 index 0000000000000000000000000000000000000000..0b59b87bdbb40294b36fc4c93f05c09d324efbec --- /dev/null +++ b/frontend/src/components/subscriptions/SubscriptionType.vue @@ -0,0 +1,91 @@ +<template> + <div> + <v-list-tile v-if="viewPermission()"> + <v-list-tile-content> + <v-list-tile-title> + {{ name }} + </v-list-tile-title> + <v-list-tile-sub-title> + {{ description }} + </v-list-tile-sub-title> + </v-list-tile-content> + <v-list-tile-action v-if="!emptySubscriptionType"> + <v-btn icon @click="$emit('toggleExpand')"> + <v-icon v-if="expanded">keyboard_arrow_up</v-icon> + <v-icon v-else>keyboard_arrow_down</v-icon> + </v-btn> + </v-list-tile-action> + <v-list-tile-action + v-if="createPermission()" + > + <v-menu + offset-x + :min-width="500" + :close-on-content-click="false" + :nudge-width="200" + v-model="subscriptionCreateMenu" + > + <v-btn small flat icon slot="activator"> + <v-icon>add</v-icon> + </v-btn> + <subscription-creation + :title="name" + :type="type" + :keyItems="possibleSubscriptionKeys" + /> + </v-menu> + </v-list-tile-action> + </v-list-tile> + <slot v-if="expanded"></slot> + </div> +</template> + +<script> + import SubscriptionCreation from '@/components/subscriptions/SubscriptionCreation' + + export default { + components: {SubscriptionCreation}, + name: 'subscription-type', + props: { + name: { + type: String, + required: true + }, + type: { + type: String, + required: true + }, + description: { + type: String + }, + expanded: { + type: Boolean, + default: true + }, + emptySubscriptionType: { + type: Boolean, + required: true + }, + createPermission: { + type: Function, + default: () => true + }, + viewPermission: { + type: Function, + default: () => true + }, + possibleSubscriptionKeys: { + type: Array + } + }, + data () { + return { + subscriptionCreateMenu: {} + } + } + } +</script> + +<style scoped> + +</style>