Add old classes view
This commit is contained in:
parent
985ccd0e62
commit
229c6b4d8b
|
|
@ -2,7 +2,8 @@
|
||||||
<div class="class-selection" v-if="currentClassSelection">
|
<div class="class-selection" v-if="currentClassSelection">
|
||||||
<div data-cy="class-selection" class="class-selection__selected-class selected-class"
|
<div data-cy="class-selection" class="class-selection__selected-class selected-class"
|
||||||
@click="showPopover = !showPopover">
|
@click="showPopover = !showPopover">
|
||||||
<current-class class="selected-class__text"></current-class> <chevron-down class="selected-class__dropdown-icon"></chevron-down>
|
<current-class class="selected-class__text"></current-class>
|
||||||
|
<chevron-down class="selected-class__dropdown-icon"></chevron-down>
|
||||||
</div>
|
</div>
|
||||||
<widget-popover v-if="showPopover"
|
<widget-popover v-if="showPopover"
|
||||||
@hide-me="showPopover = false"
|
@hide-me="showPopover = false"
|
||||||
|
|
@ -13,9 +14,13 @@
|
||||||
:key="schoolClass.id"
|
:key="schoolClass.id"
|
||||||
:label="schoolClass.name"
|
:label="schoolClass.name"
|
||||||
:item="schoolClass"
|
:item="schoolClass"
|
||||||
@click="updateFilter(schoolClass)">
|
@click="updateSelectedClass(schoolClass)">
|
||||||
{{schoolClass.name}}
|
{{schoolClass.name}}
|
||||||
</li>
|
</li>
|
||||||
|
<li class="popover-links__link popover-links__link--large popover-links__divider">Klasse erfassen</li>
|
||||||
|
<li class="popover-links__link popover-links__link--large popover-links__divider">
|
||||||
|
<router-link :to="{name: 'old-classes'}">Alte Klassen anzeigen</router-link>
|
||||||
|
</li>
|
||||||
</widget-popover>
|
</widget-popover>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -24,8 +29,10 @@
|
||||||
import WidgetPopover from '@/components/WidgetPopover';
|
import WidgetPopover from '@/components/WidgetPopover';
|
||||||
import ChevronDown from '@/components/icons/ChevronDown';
|
import ChevronDown from '@/components/icons/ChevronDown';
|
||||||
import CurrentClass from '@/components/school-class/CurrentClass';
|
import CurrentClass from '@/components/school-class/CurrentClass';
|
||||||
|
|
||||||
import ME_QUERY from '@/graphql/gql/meQuery.gql';
|
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 {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
|
@ -41,6 +48,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
mixins: [updateSelectedClassMixin],
|
||||||
|
|
||||||
apollo: {
|
apollo: {
|
||||||
me: {
|
me: {
|
||||||
query: ME_QUERY,
|
query: ME_QUERY,
|
||||||
|
|
@ -67,22 +76,8 @@
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
updateFilter(selectedClass) {
|
updateSelectedClassAndHidePopover(selectedClass) {
|
||||||
this.$apollo.mutate({
|
this.updateSelectedClass(selectedClass);
|
||||||
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)
|
|
||||||
});
|
|
||||||
this.showPopover = false;
|
this.showPopover = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -139,9 +134,4 @@
|
||||||
fill: $color-brand;
|
fill: $color-brand;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.popover-links__link {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
<template>
|
||||||
|
<div class="old-classes">
|
||||||
|
<h1 class="old-classes__title">Alte Klassen</h1>
|
||||||
|
<ul class="old-classes__list simple-list">
|
||||||
|
<li class="simple-list__item" v-for="schoolClass in me.oldClasses" :key="schoolClass.id"><span
|
||||||
|
class="old-classes__class-name">{{schoolClass.name}}</span> <a
|
||||||
|
class="simple-list__action" @click="updateSelectedClassAndGoToClassList(schoolClass)">Anzeigen</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import gql from 'graphql-tag';
|
||||||
|
|
||||||
|
import updateSelectedClassMixin from '@/mixins/updateSelectedClass';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
mixins: [updateSelectedClassMixin],
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
updateSelectedClassAndGoToClassList(selectedClass) {
|
||||||
|
this.updateSelectedClass(selectedClass).then(() => {
|
||||||
|
console.log('roger');
|
||||||
|
this.$router.push({name: 'my-class'});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
apollo: {
|
||||||
|
me: {
|
||||||
|
query: gql`
|
||||||
|
query OldClassesQuery {
|
||||||
|
me {
|
||||||
|
id
|
||||||
|
oldClasses {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
update(data) {
|
||||||
|
return this.$getRidOfEdges(data).me;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data: () => ({
|
||||||
|
me: {
|
||||||
|
oldClasses: []
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
@import "@/styles/_variables.scss";
|
||||||
|
|
||||||
|
.old-classes {
|
||||||
|
&__class-name {
|
||||||
|
font-family: $sans-serif-font-family;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -31,6 +31,7 @@ import login from '@/pages/login'
|
||||||
import registration from '@/pages/registration'
|
import registration from '@/pages/registration'
|
||||||
import waitForClass from '@/pages/waitForClass'
|
import waitForClass from '@/pages/waitForClass'
|
||||||
import joinClass from '@/pages/joinClass'
|
import joinClass from '@/pages/joinClass'
|
||||||
|
import oldClasses from '@/pages/oldClasses';
|
||||||
|
|
||||||
import store from '@/store/index';
|
import store from '@/store/index';
|
||||||
|
|
||||||
|
|
@ -111,6 +112,13 @@ const routes = [
|
||||||
{path: 'my-class', name: 'my-class', component: myClass, meta: {isProfile: true}},
|
{path: 'my-class', name: 'my-class', component: myClass, meta: {isProfile: true}},
|
||||||
{path: 'activity', name: 'activity', component: activity, meta: {isProfile: true}},
|
{path: 'activity', name: 'activity', component: activity, meta: {isProfile: true}},
|
||||||
{path: '', name: 'profile-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'}},
|
{path: 'join-class', name: 'join-class', component: joinClass, meta: {layout: 'simple'}},
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import graphene
|
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 django.db.models.functions import Concat
|
||||||
from graphene import relay, ObjectType
|
from graphene import relay, ObjectType
|
||||||
from graphene_django import DjangoObjectType
|
from graphene_django import DjangoObjectType
|
||||||
|
|
@ -34,6 +34,7 @@ class UserNode(DjangoObjectType):
|
||||||
permissions = graphene.List(graphene.String)
|
permissions = graphene.List(graphene.String)
|
||||||
selected_class = graphene.Field(SchoolClassNode)
|
selected_class = graphene.Field(SchoolClassNode)
|
||||||
is_teacher = graphene.Boolean()
|
is_teacher = graphene.Boolean()
|
||||||
|
old_classes = DjangoFilterConnectionField(SchoolClassNode)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
|
|
@ -54,6 +55,14 @@ class UserNode(DjangoObjectType):
|
||||||
def resolve_is_teacher(self, info):
|
def resolve_is_teacher(self, info):
|
||||||
return self.is_teacher()
|
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):
|
class ClassMemberNode(ObjectType):
|
||||||
"""
|
"""
|
||||||
We need to build this ourselves, because we want the active property on the node, because providing it on the
|
We need to build this ourselves, because we want the active property on the node, because providing it on the
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue