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
)
-