From 7e344fc6faf059ef472dabfb6c1872bc76302584 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Tue, 24 May 2022 05:34:06 +0000 Subject: [PATCH] feat(admin): migrate groups page to vue 3 composable --- server/db/migrations/3.0.0.js | 2 +- server/graph/schemas/group.graphql | 69 ++++--- ux/src/pages/AdminGroups.vue | 296 ++++++++++++++++------------- ux/src/router/routes.js | 2 +- 4 files changed, 214 insertions(+), 155 deletions(-) diff --git a/server/db/migrations/3.0.0.js b/server/db/migrations/3.0.0.js index 4b842b74..f9c22db4 100644 --- a/server/db/migrations/3.0.0.js +++ b/server/db/migrations/3.0.0.js @@ -341,7 +341,7 @@ exports.up = async knex => { // -> GENERATE IDS const groupAdminId = uuid() - const groupGuestId = '10000000-0000-4000-0000-000000000001' + const groupGuestId = '10000000-0000-4000-8000-000000000001' const siteId = uuid() const authModuleId = uuid() const userAdminId = uuid() diff --git a/server/graph/schemas/group.graphql b/server/graph/schemas/group.graphql index 4f247f28..7a9a43a1 100644 --- a/server/graph/schemas/group.graphql +++ b/server/graph/schemas/group.graphql @@ -9,7 +9,7 @@ extend type Query { ): [Group] groupById( - id: Int! + id: UUID! ): Group } @@ -19,22 +19,25 @@ extend type Mutation { ): GroupResponse updateGroup( - id: Int! - patch: GroupUpdateInput! + id: UUID! + name: String! + redirectOnLogin: String! + permissions: [String]! + rules: [GroupRuleInput]! ): DefaultResponse deleteGroup( - id: Int! + id: UUID! ): DefaultResponse assignUserToGroup( - groupId: Int! - userId: Int! + groupId: UUID! + userId: UUID! ): DefaultResponse unassignUserFromGroup( - groupId: Int! - userId: Int! + groupId: UUID! + userId: UUID! ): DefaultResponse } @@ -48,46 +51,60 @@ type GroupResponse { } type Group { - id: Int + id: UUID name: String isSystem: Boolean redirectOnLogin: String + redirectOnFirstLogin: String + redirectOnLogout: String permissions: [String] - pageRules: [PageRule] - users: [UserMinimal] + rules: [GroupRule] + users( + page: Int + pageSize: Int + orderBy: UserOrderBy + orderByDirection: OrderByDirection + # Filter by name / email + filter: String + ): [UserMinimal] + userCount: Int createdAt: Date updatedAt: Date } -type PageRule { - id: String - deny: Boolean - match: PageRuleMatch +type GroupRule { + id: UUID + name: String + mode: GroupRuleMode + match: GroupRuleMatch roles: [String] path: String locales: [String] + sites: [UUID] } -input GroupUpdateInput { +input GroupRuleInput { + id: UUID! name: String! - redirectOnLogin: String! - permissions: [String]! - pageRules: [PageRuleInput]! -} - -input PageRuleInput { - id: String! - deny: Boolean! - match: PageRuleMatch! + mode: GroupRuleMode! + match: GroupRuleMatch! roles: [String]! path: String! locales: [String]! + sites: [UUID] +} + +enum GroupRuleMode { + ALLOW + DENY + FORCEALLOW } -enum PageRuleMatch { +enum GroupRuleMatch { START EXACT END REGEX TAG + TAGALL } diff --git a/ux/src/pages/AdminGroups.vue b/ux/src/pages/AdminGroups.vue index dd304e07..23737193 100644 --- a/ux/src/pages/AdminGroups.vue +++ b/ux/src/pages/AdminGroups.vue @@ -4,12 +4,12 @@ q-page.admin-groups .col-auto img.admin-icon.animated.fadeInLeft(src='/_assets/icons/fluent-people.svg') .col.q-pl-md - .text-h5.text-primary.animated.fadeInLeft {{ $t('admin.groups.title') }} - .text-subtitle1.text-grey.animated.fadeInLeft.wait-p2s {{ $t('admin.groups.subtitle') }} + .text-h5.text-primary.animated.fadeInLeft {{ t('admin.groups.title') }} + .text-subtitle1.text-grey.animated.fadeInLeft.wait-p2s {{ t('admin.groups.subtitle') }} .col-auto.flex.items-center q-input.denser.q-mr-sm( outlined - v-model='search' + v-model='state.search' dense :class='$q.dark.isActive ? `bg-dark` : `bg-white`' ) @@ -28,12 +28,12 @@ q-page.admin-groups flat color='secondary' @click='load' - :loading='loading > 0' + :loading='state.loading > 0' ) q-btn( unelevated icon='las la-plus' - :label='$t(`admin.groups.create`)' + :label='t(`admin.groups.create`)' color='primary' @click='createGroup' ) @@ -42,15 +42,15 @@ q-page.admin-groups .col-12 q-card.shadow-1 q-table( - :rows='groups' + :rows='state.groups' :columns='headers' row-key='id' flat hide-header hide-bottom :rows-per-page-options='[0]' - :loading='loading > 0' - :filter='search' + :loading='state.loading > 0' + :filter='state.search' ) template(v-slot:body-cell-id='props') q-td(:props='props') @@ -71,7 +71,7 @@ q-page.admin-groups :color='$q.dark.isActive ? `dark-6` : `grey-2`' :text-color='$q.dark.isActive ? `white` : `grey-8`' dense - ) {{$t('admin.groups.usersCount', { count: props.value })}} + ) {{t('admin.groups.usersCount', { count: props.value })}} template(v-slot:body-cell-edit='props') q-td(:props='props') q-btn.acrylic-btn.q-mr-sm( @@ -79,7 +79,7 @@ q-page.admin-groups :to='`/_admin/groups/` + props.row.id' icon='las la-pen' color='indigo' - :label='$t(`common.actions.edit`)' + :label='t(`common.actions.edit`)' no-caps ) q-btn.acrylic-btn( @@ -91,136 +91,178 @@ q-page.admin-groups ) -