From 8bd6d51028a3a92253f095ed323a301a63c7ff3f Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 23 Jul 2019 15:59:25 +0200 Subject: [PATCH 01/15] Add new SVGs for icons --- client/src/components/AddContentBlockButton.vue | 2 +- client/src/components/icons/AddPointer.vue | 5 +++-- client/src/components/icons/EyeIcon.vue | 4 +--- .../{ => toggle-menu}/ToggleSolutionsForModule.vue | 0 4 files changed, 5 insertions(+), 6 deletions(-) rename client/src/components/{ => toggle-menu}/ToggleSolutionsForModule.vue (100%) diff --git a/client/src/components/AddContentBlockButton.vue b/client/src/components/AddContentBlockButton.vue index 9af880d0..66efb655 100644 --- a/client/src/components/AddContentBlockButton.vue +++ b/client/src/components/AddContentBlockButton.vue @@ -46,7 +46,7 @@ } &__icon { - height: 57px; + width: 40px; fill: $color-silver-dark; } } diff --git a/client/src/components/icons/AddPointer.vue b/client/src/components/icons/AddPointer.vue index a241a274..b878eccc 100644 --- a/client/src/components/icons/AddPointer.vue +++ b/client/src/components/icons/AddPointer.vue @@ -1,7 +1,8 @@ diff --git a/client/src/components/icons/EyeIcon.vue b/client/src/components/icons/EyeIcon.vue index 20d557a6..05e7cb03 100644 --- a/client/src/components/icons/EyeIcon.vue +++ b/client/src/components/icons/EyeIcon.vue @@ -1,8 +1,6 @@ diff --git a/client/src/components/ToggleSolutionsForModule.vue b/client/src/components/toggle-menu/ToggleSolutionsForModule.vue similarity index 100% rename from client/src/components/ToggleSolutionsForModule.vue rename to client/src/components/toggle-menu/ToggleSolutionsForModule.vue From a4cf7a0d62fbb4b35e166d8a1b1b41e188a32a7f Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 23 Jul 2019 16:00:53 +0200 Subject: [PATCH 02/15] Add toggle for module editing --- client/src/components/Chapter.vue | 5 +++- client/src/components/ContentBlock.vue | 9 ++++-- client/src/components/modules/Module.vue | 4 +++ .../components/modules/ModuleNavigation.vue | 12 ++++++-- .../components/toggle-menu/ToggleEditing.vue | 28 +++++++++++++++++++ client/src/pages/module.vue | 5 ++-- client/src/store/index.js | 10 ++++++- 7 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 client/src/components/toggle-menu/ToggleEditing.vue diff --git a/client/src/components/Chapter.vue b/client/src/components/Chapter.vue index 8feee031..0ef57481 100644 --- a/client/src/components/Chapter.vue +++ b/client/src/components/Chapter.vue @@ -6,7 +6,7 @@ {{chapter.description}}

- +
- +

{{instrumentLabel}}

{{contentBlock.title}}

@@ -24,7 +24,7 @@
- + @@ -54,6 +54,8 @@ import CHAPTER_QUERY from '@/graphql/gql/chapterQuery.gql'; import DELETE_CONTENT_BLOCK_MUTATION from '@/graphql/gql/mutations/deleteContentBlock.gql'; + import {mapGetters} from 'vuex'; + const instruments = { base_communication: 'Sprache & Kommunikation', base_society: 'Gesellschaft' @@ -87,6 +89,7 @@ }, computed: { + ...mapGetters(['editModule']), specialClass() { return `content-block--${this.contentBlock.type.toLowerCase()}` }, diff --git a/client/src/components/modules/Module.vue b/client/src/components/modules/Module.vue index 07de26e0..dfb8b31c 100644 --- a/client/src/components/modules/Module.vue +++ b/client/src/components/modules/Module.vue @@ -46,6 +46,10 @@ module: { required: true, type: Object + }, + edit: { + type: Boolean, + default: false } }, diff --git a/client/src/components/modules/ModuleNavigation.vue b/client/src/components/modules/ModuleNavigation.vue index a8b10747..d922bb17 100644 --- a/client/src/components/modules/ModuleNavigation.vue +++ b/client/src/components/modules/ModuleNavigation.vue @@ -32,6 +32,10 @@ +
+ +
+ + + + + +

{{instrumentLabel}}

From c479d0f2bff1480d00a2b287dba5b0fd49d60ae9 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 24 Jul 2019 11:19:39 +0200 Subject: [PATCH 04/15] Only show module edit checkbox for teacher --- client/src/components/modules/ModuleNavigation.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/src/components/modules/ModuleNavigation.vue b/client/src/components/modules/ModuleNavigation.vue index d922bb17..8f3ad3e0 100644 --- a/client/src/components/modules/ModuleNavigation.vue +++ b/client/src/components/modules/ModuleNavigation.vue @@ -32,7 +32,7 @@ -
+
@@ -82,6 +82,9 @@ return [...this.module.assignments].sort((a, b) => { return a.title.toLowerCase() > b.title.toLowerCase() ? 1 : -1; }) + }, + canManageContent() { + return this.me.permissions.includes('users.can_manage_school_class_content'); } }, From 185cd4a81e365d35f9cd824dc976e6f44e197efd Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Wed, 24 Jul 2019 11:28:46 +0200 Subject: [PATCH 05/15] Remove visibility popover, add eye icon button --- client/src/components/icons/ClosedEyeIcon.vue | 6 + .../visibility/VisibilityAction.vue | 67 +++++++-- .../visibility/VisibilityPopover.vue | 138 ------------------ client/src/styles/_actions.scss | 3 +- 4 files changed, 63 insertions(+), 151 deletions(-) create mode 100644 client/src/components/icons/ClosedEyeIcon.vue delete mode 100644 client/src/components/visibility/VisibilityPopover.vue diff --git a/client/src/components/icons/ClosedEyeIcon.vue b/client/src/components/icons/ClosedEyeIcon.vue new file mode 100644 index 00000000..edc6f8c5 --- /dev/null +++ b/client/src/components/icons/ClosedEyeIcon.vue @@ -0,0 +1,6 @@ + diff --git a/client/src/components/visibility/VisibilityAction.vue b/client/src/components/visibility/VisibilityAction.vue index 721466f3..c083201e 100644 --- a/client/src/components/visibility/VisibilityAction.vue +++ b/client/src/components/visibility/VisibilityAction.vue @@ -1,40 +1,84 @@ - - diff --git a/client/src/styles/_actions.scss b/client/src/styles/_actions.scss index ee7a9673..63e7e66f 100644 --- a/client/src/styles/_actions.scss +++ b/client/src/styles/_actions.scss @@ -1,5 +1,4 @@ .action-icon { - width: 40px; - height: 40px; + width: 30px; fill: $color-silver-dark; } From 0c2cc090e2944f074b543016e84bb60a4fc60fc2 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 25 Jul 2019 09:52:26 +0200 Subject: [PATCH 06/15] Add comment to unreadable code block --- client/src/components/visibility/VisibilityAction.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/src/components/visibility/VisibilityAction.vue b/client/src/components/visibility/VisibilityAction.vue index c083201e..87703ed4 100644 --- a/client/src/components/visibility/VisibilityAction.vue +++ b/client/src/components/visibility/VisibilityAction.vue @@ -34,8 +34,11 @@ return this.me.selectedClass || {id: 'U2Nob29sQ2xhc3NOb2RlOjE='}; // todo: remove after merge with select class feature }, hidden() { + // is this content block / objective group user created? return (this.isContentBlock ? this.block.userCreated : !!this.block.owner) + // if so, is visibility not explicitly set for this school class? ? this.block.visibleFor.findIndex(el => el.id === this.schoolClass.id) === -1 + // otherwise, is it explicitly hidden for this school class? : this.block.hiddenFor.findIndex(el => el.id === this.schoolClass.id) > -1; } }, From ee89522b9940d4a8d6d722006e27034a2cab7b18 Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 25 Jul 2019 10:54:09 +0200 Subject: [PATCH 07/15] Update panel styling in surveys --- client/src/styles/_survey.scss | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/src/styles/_survey.scss b/client/src/styles/_survey.scss index 962d5d13..e4fa2c92 100644 --- a/client/src/styles/_survey.scss +++ b/client/src/styles/_survey.scss @@ -1,5 +1,4 @@ .survey { - &__panel-title, &__page-title { @include main-title; margin-bottom: $large-spacing*2; @@ -8,17 +7,20 @@ } } + &__panel-title, &__panel-description, &__page-description { - @include regular-paragraph; line-height: 1.5; margin-bottom: $large-spacing; + > span > span { // weird survey.js html structure + @include heading-4; + } } &__question-title { @include heading-4; margin-bottom: $medium-spacing; - span { + > span > span { // weird survey.js html structure @include heading-4; } } From b19419af69295a42b8f501a594efbf47a91bf70f Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 25 Jul 2019 11:12:24 +0200 Subject: [PATCH 08/15] Normalize heading font size in survey panels --- client/src/styles/_survey.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/styles/_survey.scss b/client/src/styles/_survey.scss index e4fa2c92..ec676b30 100644 --- a/client/src/styles/_survey.scss +++ b/client/src/styles/_survey.scss @@ -12,6 +12,8 @@ &__page-description { line-height: 1.5; margin-bottom: $large-spacing; + font-size: 1rem; + > span > span { // weird survey.js html structure @include heading-4; } From ea9822562a43033e43a1c4a357e689f7c0c5df22 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Thu, 18 Jul 2019 13:38:22 +0200 Subject: [PATCH 09/15] Use popover in user widget --- client/src/components/HeaderBar.vue | 4 +- client/src/components/MoreOptionsWidget.vue | 4 +- client/src/components/UserWidget.vue | 53 +++++++++++++++++-- .../components/{rooms => }/WidgetPopover.vue | 2 +- .../components/portfolio/ProjectActions.vue | 10 +++- client/src/components/rooms/RoomActions.vue | 10 +++- client/src/styles/_mixins.scss | 4 ++ client/src/styles/_variables.scss | 3 ++ 8 files changed, 76 insertions(+), 14 deletions(-) rename client/src/components/{rooms => }/WidgetPopover.vue (97%) diff --git a/client/src/components/HeaderBar.vue b/client/src/components/HeaderBar.vue index 7c97788b..45af59c5 100644 --- a/client/src/components/HeaderBar.vue +++ b/client/src/components/HeaderBar.vue @@ -5,9 +5,7 @@
- - - +
diff --git a/client/src/components/MoreOptionsWidget.vue b/client/src/components/MoreOptionsWidget.vue index 863129ba..9fcb68d2 100644 --- a/client/src/components/MoreOptionsWidget.vue +++ b/client/src/components/MoreOptionsWidget.vue @@ -12,7 +12,7 @@ + + diff --git a/client/src/components/HeaderBar.vue b/client/src/components/HeaderBar.vue index 45af59c5..35ae07ac 100644 --- a/client/src/components/HeaderBar.vue +++ b/client/src/components/HeaderBar.vue @@ -5,8 +5,8 @@
+ -
@@ -19,6 +19,7 @@ import UserWidget from '@/components/UserWidget.vue'; import LogoutWidget from '@/components/LogoutWidget.vue'; import Logo from '@/components/icons/Logo'; + import ClassSelectionWidget from '@/components/ClassSelectionWidget'; import ME_QUERY from '@/graphql/gql/meQuery.gql'; @@ -28,7 +29,8 @@ UserWidget, LogoutWidget, BookNavigation, - Logo + Logo, + ClassSelectionWidget }, computed: { From 91967ceb218772467fbe9e50e550cfb483c55a7c Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 24 Jul 2019 22:26:51 +0200 Subject: [PATCH 11/15] Add mutations and query, fix popover --- .../src/components/ClassSelectionWidget.vue | 2 +- client/src/components/UserWidget.vue | 6 +- server/rooms/mutations.py | 2 +- server/users/migrations/0007_usersetting.py | 23 +++++ server/users/models.py | 21 ++++- server/users/mutations.py | 25 ++++++ server/users/schema.py | 39 ++++---- server/users/tests/test_usersettings.py | 88 +++++++++++++++++++ 8 files changed, 183 insertions(+), 23 deletions(-) create mode 100644 server/users/migrations/0007_usersetting.py create mode 100644 server/users/tests/test_usersettings.py diff --git a/client/src/components/ClassSelectionWidget.vue b/client/src/components/ClassSelectionWidget.vue index bc590db0..33593744 100644 --- a/client/src/components/ClassSelectionWidget.vue +++ b/client/src/components/ClassSelectionWidget.vue @@ -3,7 +3,7 @@
{{currentClassSelection}}
- - - - + +
@@ -19,6 +17,7 @@ import UserWidget from '@/components/UserWidget'; import LogoutWidget from '@/components/LogoutWidget'; import TopNavigation from '@/components/TopNavigation'; + import ClassSelectionWidget from '@/components/ClassSelectionWidget'; import {meQuery} from '@/graphql/queries'; @@ -27,7 +26,8 @@ TopNavigation, Cross, UserWidget, - LogoutWidget + LogoutWidget, + ClassSelectionWidget }, methods: { diff --git a/client/src/components/UserWidget.vue b/client/src/components/UserWidget.vue index 2eceefa2..ac17bdb5 100644 --- a/client/src/components/UserWidget.vue +++ b/client/src/components/UserWidget.vue @@ -3,22 +3,21 @@
- - - + - - - @@ -64,6 +63,7 @@ diff --git a/client/src/graphql/gql/fragments/userParts.gql b/client/src/graphql/gql/fragments/userParts.gql index 1ea3939c..befaf6f0 100644 --- a/client/src/graphql/gql/fragments/userParts.gql +++ b/client/src/graphql/gql/fragments/userParts.gql @@ -11,6 +11,9 @@ fragment UserParts on UserNode { id slug } + selectedClass { + id + } schoolClasses { edges { node { diff --git a/client/src/graphql/gql/mutations/updateUserSetting.gql b/client/src/graphql/gql/mutations/updateUserSetting.gql new file mode 100644 index 00000000..0e8190ee --- /dev/null +++ b/client/src/graphql/gql/mutations/updateUserSetting.gql @@ -0,0 +1,8 @@ +mutation UpdateSettings($input: UpdateSettingInput!) { + updateSetting(input: $input) { + success + errors { + field + } + } +} diff --git a/client/src/pages/rooms.vue b/client/src/pages/rooms.vue index 23fecf01..61479564 100644 --- a/client/src/pages/rooms.vue +++ b/client/src/pages/rooms.vue @@ -23,7 +23,7 @@ return this.rooms.filter(room => this.visibleFor(room, this.currentFilter)); }, currentFilter() { - return this.$store.state.filterForSchoolClass; + return this.me.selectedClass.id; }, canAddRoom() { return this.me.permissions.includes('users.can_manage_school_class_content') @@ -53,6 +53,9 @@ return { rooms: [], me: { + selectedClass: { + id: '' + }, permissions: [] } } diff --git a/client/src/store/index.js b/client/src/store/index.js index 3bbe932a..6b6b41cb 100644 --- a/client/src/store/index.js +++ b/client/src/store/index.js @@ -12,7 +12,6 @@ export default new Vuex.Store({ showMobileNavigation: false, contentBlockPosition: {}, scrollPosition: 0, - filterForSchoolClass: '', currentContentBlock: '', currentRoomEntry: '', parentRoom: null, @@ -108,9 +107,6 @@ export default new Vuex.Store({ document.body.classList.add('no-scroll'); // won't get at the body any other way commit('setModal', payload); }, - setfilterForSchoolClass({commit}, payload) { - commit('setfilterForSchoolClass', payload); - }, addProjectEntry({commit, dispatch}, payload) { commit('setParentProject', payload); dispatch('showModal', 'new-project-entry-wizard'); @@ -174,9 +170,6 @@ export default new Vuex.Store({ setCurrentContentBlock(state, payload) { state.currentContentBlock = payload; }, - setfilterForSchoolClass(state, payload) { - state.filterForSchoolClass = payload; - }, setParentRoom(state, payload) { state.parentRoom = payload; }, diff --git a/server/users/admin.py b/server/users/admin.py index c1f96794..9733310f 100644 --- a/server/users/admin.py +++ b/server/users/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin from users.forms import CustomUserCreationForm, CustomUserChangeForm -from .models import User, SchoolClass, Role, UserRole +from .models import User, SchoolClass, Role, UserRole, UserSetting class SchoolClassInline(admin.TabularInline): @@ -53,3 +53,9 @@ class CustomUserAdmin(UserAdmin): admin.site.register(User, CustomUserAdmin) + + +@admin.register(UserSetting) +class UserSettingAdmin(admin.ModelAdmin): + list_display = ('user', 'selected_class') + raw_id_fields = ('user', 'selected_class') diff --git a/server/users/mutations.py b/server/users/mutations.py index 29200972..bbaae8c0 100644 --- a/server/users/mutations.py +++ b/server/users/mutations.py @@ -5,7 +5,7 @@ from graphene import relay from api.utils import get_object from users.inputs import PasswordUpdateInput -from users.models import SchoolClass +from users.models import SchoolClass, UserSetting from users.serializers import PasswordSerialzer, AvatarUrlSerializer @@ -89,11 +89,13 @@ class UpdateSetting(relay.ClientIDMutation): class_id = kwargs.get('id') school_class = get_object(SchoolClass, class_id) user = info.context.user - if school_class not in user.school_classes.all(): + + if school_class and school_class not in user.school_classes.all(): raise PermissionDenied('Permission denied: Incorrect school class') - user.user_setting.selected_class = school_class - user.user_setting.save() + user_settings, created = UserSetting.objects.get_or_create(user=user) + user_settings.selected_class = school_class + user_settings.save() return cls(success=True) success = graphene.Boolean() diff --git a/server/users/tests/test_usersettings.py b/server/users/tests/test_usersettings.py index 963273be..147bd223 100644 --- a/server/users/tests/test_usersettings.py +++ b/server/users/tests/test_usersettings.py @@ -94,3 +94,25 @@ class UserSettingTests(TestCase): self.assertIsNone(query_result.get('errors')) self.assertEqual(query_result.get('data').get('me').get('selectedClass').get('name'), selected_class.name) + + def test_user_can_select_class_even_no_settings_exist(self): + + selected_class = self.user.school_classes.all()[1] + mutation_result = self.make_mutation(selected_class.pk) + self.assertIsNone(mutation_result.get('errors')) + query_result = self.make_query() + self.assertIsNone(query_result.get('errors')) + self.assertEqual(query_result.get('data').get('me').get('selectedClass').get('name'), + selected_class.name) + + + def test_user_cannot_select_class_shes_not_part_of(self): + + default_class = self.user.school_classes.first() + setting = UserSetting.objects.create(user=self.user, selected_class=default_class) + setting.save() + + mutation_result = self.make_mutation(self.class3.pk) + self.assertIsNotNone(mutation_result.get('errors')) + + From 780602dfd2077bda54b95b4eded1a0bd163dab64 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Thu, 25 Jul 2019 11:39:01 +0200 Subject: [PATCH 14/15] Add option for mobile --- .../src/components/ClassSelectionWidget.vue | 8 ++ client/src/components/FilterBar.vue | 76 ------------------- client/src/components/MobileNavigation.vue | 4 +- client/src/components/UserWidget.vue | 17 ++++- client/src/components/WidgetPopover.vue | 11 ++- client/src/layouts/DefaultLayout.vue | 4 - 6 files changed, 34 insertions(+), 86 deletions(-) delete mode 100644 client/src/components/FilterBar.vue diff --git a/client/src/components/ClassSelectionWidget.vue b/client/src/components/ClassSelectionWidget.vue index b72d33e8..214d345a 100644 --- a/client/src/components/ClassSelectionWidget.vue +++ b/client/src/components/ClassSelectionWidget.vue @@ -5,6 +5,7 @@