diff --git a/client/src/components/modules/Module.vue b/client/src/components/modules/Module.vue index a8bb9277..30d0fda4 100644 --- a/client/src/components/modules/Module.vue +++ b/client/src/components/modules/Module.vue @@ -4,12 +4,23 @@ class="module" v-if="module.id" > -

- {{ module.metaTitle }} -

+
+
+

+ {{ module.metaTitle }} +

+
+ +
+ + +
+ +
+

diff --git a/client/src/components/modules/ModuleFilter.vue b/client/src/components/modules/ModuleFilter.vue index 237beb95..11eeaf17 100644 --- a/client/src/components/modules/ModuleFilter.vue +++ b/client/src/components/modules/ModuleFilter.vue @@ -101,6 +101,8 @@ function filterModules() { let filteredModules = props.modules; + + if (selectedCategory.value === null) { return props.modules; } @@ -108,14 +110,14 @@ // filter by Lehrjahr if (selectedCategory.value.name !== '---') { filteredModules = filteredModules.filter((module) => { - return module.category.id == selectedCategory.value.id; + return module.category?.id == selectedCategory.value.id; }); } //filter by Lernfeld if (selectedLernfeld.value.name !== '---') { filteredModules = filteredModules.filter((module) => { - return module.categoryType.id == selectedLernfeld.value.id; + return module.categoryType?.id == selectedLernfeld.value.id; }); } updateLastModuleCategory(selectedCategory.value); diff --git a/client/src/components/modules/ModuleTeaser.vue b/client/src/components/modules/ModuleTeaser.vue index fef9dbdf..1943bf5c 100644 --- a/client/src/components/modules/ModuleTeaser.vue +++ b/client/src/components/modules/ModuleTeaser.vue @@ -17,89 +17,88 @@

{{ teaser }}

- -
{{attribute}}
-
+
+ + +
diff --git a/client/src/components/profile/Profile.vue b/client/src/components/profile/Profile.vue index 9576b52d..3fac7adf 100644 --- a/client/src/components/profile/Profile.vue +++ b/client/src/components/profile/Profile.vue @@ -30,6 +30,8 @@ import Avatar from '@/components/profile/Avatar.vue'; import { defineAsyncComponent } from 'vue'; const TrashIcon = defineAsyncComponent(() => import('@/components/icons/TrashIcon.vue')); + +// TODO: Kann das mit me.ts zusammengeführt werden? export default { components: { AvatarUploadForm, diff --git a/client/src/components/ui/Pill.vue b/client/src/components/ui/Pill.vue new file mode 100644 index 00000000..8bd4d68e --- /dev/null +++ b/client/src/components/ui/Pill.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/client/src/mixins/me.ts b/client/src/mixins/me.ts index c01711b0..baa9353d 100644 --- a/client/src/mixins/me.ts +++ b/client/src/mixins/me.ts @@ -14,6 +14,7 @@ export interface Me { team: any; lastTopic: any; readOnly: boolean; + lastModuleCategory: any; } export interface MeQuery { @@ -30,6 +31,8 @@ export interface Location { type RouteLocation = Location | string; + +// TODO: ME_QUERY existiert an einem weiteren Ort. Dieser sollte entfernt werden. const defaultMe: MeQuery = { me: { selectedClass: { @@ -42,6 +45,7 @@ const defaultMe: MeQuery = { team: null, readOnly: false, lastTopic: undefined, + lastModuleCategory: undefined, }, }; @@ -76,6 +80,10 @@ const getCurrentClassName = (me: Me) => { return currentClass ? currentClass.name : me.schoolClasses.length ? me.schoolClasses[0].name : ''; }; +const getLastModuleCategory = (me: Me) => { + return me.lastModuleCategory; +} + const getMe = () => { const { result } = useQuery(ME_QUERY); @@ -126,6 +134,10 @@ const meMixin = { // @ts-ignore return getCurrentClassName(this.$data.me); }, + lastModuleCategory(): any { + // @ts-ignore + return getLastModuleCategory(this.$data.me); + } }, apollo: { diff --git a/server/books/schema/mutations/module.py b/server/books/schema/mutations/module.py index 0a2a11e0..f551c97b 100644 --- a/server/books/schema/mutations/module.py +++ b/server/books/schema/mutations/module.py @@ -3,7 +3,7 @@ from django.utils import timezone from graphene import relay from api.utils import get_object -from books.models import Module, RecentModule +from books.models import Module, RecentModule, ModuleCategory from books.schema.nodes import ModuleNode from users.models import SchoolClass, User from users.schema import PrivateUserNode @@ -115,6 +115,8 @@ class UpdateLastModuleCategory(relay.ClientIDMutation): def mutate_and_get_payload(cls, root, info, **args): user = info.context.user id = args.get('id') + module_category = get_object(ModuleCategory, id) - User.objects.filter(pk=user.id).update(last_module_category_id=id) + + User.objects.filter(pk=user.id).update(last_module_category_id=module_category.id) return cls(user=user) diff --git a/server/books/schema/nodes/module.py b/server/books/schema/nodes/module.py index 87e3b367..66e89fe8 100644 --- a/server/books/schema/nodes/module.py +++ b/server/books/schema/nodes/module.py @@ -108,7 +108,7 @@ class ModuleNode(DjangoObjectType): @staticmethod def resolve_objective_groups(parent, info, **kwargs): - return parent.objective_groups.all().prefetch_related("hidden_for") @ staticmethod + return parent.objective_groups.all().prefetch_related("hidden_for") def resolve_category(self, info, **kwargs): return ModuleCategory.objects.get(pk=self.category_id) if self.category_id else None diff --git a/server/users/schema/types.py b/server/users/schema/types.py index d06b33b3..afebcfd4 100644 --- a/server/users/schema/types.py +++ b/server/users/schema/types.py @@ -104,6 +104,7 @@ class PrivateUserNode(DjangoObjectType): "onboarding_visited", "team", "read_only", + "last_module_category" ] interfaces = (relay.Node,) @@ -114,7 +115,6 @@ class PrivateUserNode(DjangoObjectType): is_teacher = graphene.Boolean() old_classes = graphene.List(SchoolClassNode) school_classes = graphene.List(SchoolClassNode) - last_module_category = graphene.Field(ModuleCategoryNode) recent_modules = DjangoFilterConnectionField( ModuleNode, filterset_class=RecentModuleFilter @@ -163,8 +163,6 @@ class PrivateUserNode(DjangoObjectType): def resolve_team(self, info, **kwargs): return self.team - def resolve_last_module_category(self, info, **kwargs): - return self.last_module_category class ClassMemberNode(ObjectType):