From 229c6b4d8b834c3e13c7935ed311f6604e1c0810 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Sun, 8 Mar 2020 11:57:42 +0100 Subject: [PATCH] Add old classes view --- .../school-class/ClassSelectionWidget.vue | 38 ++++------ client/src/mixins/updateSelectedClass.js | 24 +++++++ client/src/pages/oldClasses.vue | 70 +++++++++++++++++++ client/src/router/index.js | 8 +++ server/users/schema.py | 11 ++- 5 files changed, 126 insertions(+), 25 deletions(-) create mode 100644 client/src/mixins/updateSelectedClass.js create mode 100644 client/src/pages/oldClasses.vue diff --git a/client/src/components/school-class/ClassSelectionWidget.vue b/client/src/components/school-class/ClassSelectionWidget.vue index c11f9dd9..674a7cff 100644 --- a/client/src/components/school-class/ClassSelectionWidget.vue +++ b/client/src/components/school-class/ClassSelectionWidget.vue @@ -2,7 +2,8 @@
- + +
+ @click="updateSelectedClass(schoolClass)"> {{schoolClass.name}} + +
@@ -24,8 +29,10 @@ import WidgetPopover from '@/components/WidgetPopover'; import ChevronDown from '@/components/icons/ChevronDown'; import CurrentClass from '@/components/school-class/CurrentClass'; + import ME_QUERY from '@/graphql/gql/meQuery.gql'; - import UPDATE_USER_SETTING from '@/graphql/gql/mutations/updateUserSetting.gql'; + + import updateSelectedClassMixin from '@/mixins/updateSelectedClass'; export default { components: { @@ -41,6 +48,8 @@ } }, + mixins: [updateSelectedClassMixin], + apollo: { me: { query: ME_QUERY, @@ -67,22 +76,8 @@ }, methods: { - updateFilter(selectedClass) { - this.$apollo.mutate({ - mutation: UPDATE_USER_SETTING, - variables: { - input: { - id: selectedClass.id - } - }, - update(store, data) { - let meData = store.readQuery({query: ME_QUERY}); - meData.me.selectedClass = selectedClass; - store.writeQuery({query: ME_QUERY, data: meData}); - } - }).catch((error) => { - console.log('fail', error) - }); + updateSelectedClassAndHidePopover(selectedClass) { + this.updateSelectedClass(selectedClass); this.showPopover = false; } }, @@ -139,9 +134,4 @@ fill: $color-brand; } } - - .popover-links__link { - cursor: pointer; - } - diff --git a/client/src/mixins/updateSelectedClass.js b/client/src/mixins/updateSelectedClass.js new file mode 100644 index 00000000..15505fd8 --- /dev/null +++ b/client/src/mixins/updateSelectedClass.js @@ -0,0 +1,24 @@ +import ME_QUERY from '@/graphql/gql/meQuery.gql'; +import UPDATE_USER_SETTING from '@/graphql/gql/mutations/updateUserSetting.gql'; + +export default { + methods: { + updateSelectedClass(selectedClass) { + return this.$apollo.mutate({ + mutation: UPDATE_USER_SETTING, + variables: { + input: { + id: selectedClass.id + } + }, + update(store, data) { + let meData = store.readQuery({query: ME_QUERY}); + meData.me.selectedClass = selectedClass; + store.writeQuery({query: ME_QUERY, data: meData}); + } + }).catch((error) => { + console.log('fail', error) + }); + } + }, +} diff --git a/client/src/pages/oldClasses.vue b/client/src/pages/oldClasses.vue new file mode 100644 index 00000000..412d7eae --- /dev/null +++ b/client/src/pages/oldClasses.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/client/src/router/index.js b/client/src/router/index.js index 0c8fa266..585f587e 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -31,6 +31,7 @@ import login from '@/pages/login' import registration from '@/pages/registration' import waitForClass from '@/pages/waitForClass' import joinClass from '@/pages/joinClass' +import oldClasses from '@/pages/oldClasses'; import store from '@/store/index'; @@ -111,6 +112,13 @@ const routes = [ {path: 'my-class', name: 'my-class', component: myClass, meta: {isProfile: true}}, {path: 'activity', name: 'activity', component: activity, meta: {isProfile: true}}, {path: '', name: 'profile-activity', component: activity, meta: {isProfile: true}}, + { + path: 'old-classes', + name: 'old-classes', + component: oldClasses, + meta: {isProfile: true} + }, + ] }, {path: 'join-class', name: 'join-class', component: joinClass, meta: {layout: 'simple'}}, diff --git a/server/users/schema.py b/server/users/schema.py index 042a1bd4..4b2abe48 100644 --- a/server/users/schema.py +++ b/server/users/schema.py @@ -1,5 +1,5 @@ import graphene -from django.db.models import Prefetch, Value, CharField +from django.db.models import Prefetch, Value, CharField, Q from django.db.models.functions import Concat from graphene import relay, ObjectType from graphene_django import DjangoObjectType @@ -34,6 +34,7 @@ class UserNode(DjangoObjectType): permissions = graphene.List(graphene.String) selected_class = graphene.Field(SchoolClassNode) is_teacher = graphene.Boolean() + old_classes = DjangoFilterConnectionField(SchoolClassNode) class Meta: model = User @@ -54,6 +55,14 @@ class UserNode(DjangoObjectType): def resolve_is_teacher(self, info): return self.is_teacher() + def resolve_school_classes(self, info): + return SchoolClass.objects.filter( + Q(schoolclassmember__active=True, schoolclassmember__user=self) | Q(pk=self.selected_class().pk)).distinct() + + def resolve_old_classes(self, info): + return SchoolClass.objects.filter(schoolclassmember__active=False, schoolclassmember__user=self) + + class ClassMemberNode(ObjectType): """ We need to build this ourselves, because we want the active property on the node, because providing it on the