@@ -26,10 +48,12 @@
diff --git a/src/router/index.ts b/src/router/index.ts
index ffa9676..db95e53 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -60,26 +60,36 @@ const router = createRouter({
path: "",
name: "admin-club-default",
component: () => import("../views/admin/ViewSelect.vue"),
+ meta: { type: "read", section: "club" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "members",
name: "admin-club-members",
component: () => import("../views/admin/members/Overview.vue"),
+ meta: { type: "read", section: "club", module: "members" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "calendar",
name: "admin-club-calendar",
component: () => import("../views/admin/members/Overview.vue"),
+ meta: { type: "read", section: "club", module: "calendar" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "newsletter",
name: "admin-club-newsletter",
component: () => import("../views/admin/members/Overview.vue"),
+ meta: { type: "read", section: "club", module: "newsletter" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "protocol",
name: "admin-club-protocol",
component: () => import("../views/admin/members/Overview.vue"),
+ meta: { type: "read", section: "club", module: "protocoll" },
+ beforeEnter: [abilityAndNavUpdate],
},
],
},
@@ -94,26 +104,36 @@ const router = createRouter({
path: "",
name: "admin-settings-default",
component: () => import("../views/admin/ViewSelect.vue"),
+ meta: { type: "read", section: "settings" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "qualification",
name: "admin-settings-qualification",
component: () => import("../views/admin/members/Overview.vue"),
+ meta: { type: "read", section: "settings", module: "qualification" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "award",
name: "admin-settings-award",
component: () => import("../views/admin/members/Overview.vue"),
+ meta: { type: "read", section: "settings", module: "award" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "executive-position",
name: "admin-settings-executive_position",
component: () => import("../views/admin/members/Overview.vue"),
+ meta: { type: "read", section: "settings", module: "executive_position" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "communication",
name: "admin-settings-communication",
component: () => import("../views/admin/members/Overview.vue"),
+ meta: { type: "read", section: "settings", module: "communication" },
+ beforeEnter: [abilityAndNavUpdate],
},
],
},
@@ -128,16 +148,76 @@ const router = createRouter({
path: "",
name: "admin-user-default",
component: () => import("../views/admin/ViewSelect.vue"),
+ meta: { type: "read", section: "user" },
+ beforeEnter: [abilityAndNavUpdate],
},
{
path: "user",
- name: "admin-user-user",
- component: () => import("../views/admin/user/User.vue"),
+ name: "admin-user-user-route",
+ component: () => import("../views/RouterView.vue"),
+ meta: { type: "read", section: "user", module: "user" },
+ beforeEnter: [abilityAndNavUpdate],
+ children: [
+ {
+ path: "",
+ name: "admin-user-user",
+ component: () => import("../views/admin/user/User.vue"),
+ },
+ {
+ path: ":id/edit",
+ name: "admin-user-user-edit",
+ component: () => import("../views/admin/user/UserEdit.vue"),
+ meta: { type: "update", section: "user", module: "user" },
+ beforeEnter: [abilityAndNavUpdate],
+ props: true,
+ },
+ {
+ path: ":id/permission",
+ name: "admin-user-user-permission",
+ component: () => import("../views/admin/user/UserEditPermission.vue"),
+ meta: { type: "update", section: "user", module: "user" },
+ beforeEnter: [abilityAndNavUpdate],
+ props: true,
+ },
+ {
+ path: ":id/roles",
+ name: "admin-user-user-roles",
+ component: () => import("../views/admin/user/UserEditRoles.vue"),
+ meta: { type: "update", section: "user", module: "user" },
+ beforeEnter: [abilityAndNavUpdate],
+ props: true,
+ },
+ ],
},
{
path: "role",
- name: "admin-user-role",
- component: () => import("../views/admin/user/Role.vue"),
+ name: "admin-user-role-route",
+ component: () => import("../views/RouterView.vue"),
+ meta: { type: "read", section: "user", module: "role" },
+ beforeEnter: [abilityAndNavUpdate],
+ children: [
+ {
+ path: "",
+ name: "admin-user-role",
+ component: () => import("../views/admin/user/Role.vue"),
+ },
+ {
+ path: ":id/edit",
+ name: "admin-user-role-edit",
+ component: () => import("../views/admin/user/RoleEdit.vue"),
+ meta: { type: "update", section: "user", module: "role" },
+ beforeEnter: [abilityAndNavUpdate],
+ props: true,
+ },
+ {
+ path: ":id/permission",
+ name: "admin-user-role-permission",
+ component: () => import("../views/admin/user/RoleEditPermission.vue"),
+ meta: { type: "update", section: "user", module: "role" },
+ beforeEnter: [abilityAndNavUpdate],
+ props: true,
+ },
+ ],
},
],
},
diff --git a/src/stores/admin/role.ts b/src/stores/admin/role.ts
index 0e2e98f..d255ffd 100644
--- a/src/stores/admin/role.ts
+++ b/src/stores/admin/role.ts
@@ -1,6 +1,7 @@
import { defineStore } from "pinia";
import type { RoleViewModel } from "../../viewmodels/admin/role.models";
import { http } from "../../serverCom";
+import type { PermissionObject } from "../../types/permissionTypes";
export const useRoleStore = defineStore("role", {
state: () => {
@@ -10,9 +11,16 @@ export const useRoleStore = defineStore("role", {
loadingAll: null as null | "loading" | "success" | "failed",
loadingSingle: null as null | "loading" | "success" | "failed",
createStatus: null as null | "loading" | { status: "success" | "failed"; reason?: string },
+ updateStatus: null as null | "loading" | { status: "success" | "failed"; reason?: string },
+ deleteStatus: null as null | "loading" | { status: "success" | "failed"; reason?: string },
};
},
actions: {
+ resetStatus() {
+ this.createStatus = null;
+ this.updateStatus = null;
+ this.deleteStatus = null;
+ },
fetchRoles() {
this.loadingAll = "loading";
http
@@ -38,9 +46,6 @@ export const useRoleStore = defineStore("role", {
this.loadingSingle = "failed";
});
},
- resetCreateStatus() {
- this.createStatus = null;
- },
createRole(role: string) {
this.createStatus = "loading";
http
@@ -55,5 +60,47 @@ export const useRoleStore = defineStore("role", {
this.createStatus = { status: "failed", reason: err.data };
});
},
+ updateActiveRole(role: string) {
+ if (this.role == null) return;
+ this.updateStatus = "loading";
+ http
+ .patch(`/admin/role/${this.role.id}`, {
+ role: role,
+ })
+ .then((result) => {
+ this.updateStatus = { status: "success" };
+ this.fetchRoles();
+ })
+ .catch((err) => {
+ this.updateStatus = { status: "failed" };
+ });
+ },
+ updateActiveRolePermissions(permission: PermissionObject) {
+ if (this.role == null) return;
+ this.updateStatus = "loading";
+ http
+ .patch(`/admin/role/${this.role.id}/permissions`, {
+ permissions: permission,
+ })
+ .then((result) => {
+ this.updateStatus = { status: "success" };
+ this.fetchRoles();
+ })
+ .catch((err) => {
+ this.updateStatus = { status: "failed" };
+ });
+ },
+ deleteRole(role: number) {
+ this.deleteStatus = "loading";
+ http
+ .delete(`/admin/role/${role}`)
+ .then((res) => {
+ this.deleteStatus = { status: "success" };
+ this.fetchRoles();
+ })
+ .catch((err) => {
+ this.deleteStatus = { status: "failed", reason: err.data };
+ });
+ },
},
});
diff --git a/src/stores/admin/user.ts b/src/stores/admin/user.ts
index 38fc97f..a6905fd 100644
--- a/src/stores/admin/user.ts
+++ b/src/stores/admin/user.ts
@@ -1,6 +1,7 @@
import { defineStore } from "pinia";
-import type { UserViewModel } from "../../viewmodels/admin/user.models";
+import type { CreateOrUpdateUserViewModel, UserViewModel } from "../../viewmodels/admin/user.models";
import { http } from "../../serverCom";
+import type { PermissionObject } from "../../types/permissionTypes";
export const useUserStore = defineStore("user", {
state: () => {
@@ -9,9 +10,17 @@ export const useUserStore = defineStore("user", {
user: null as null | UserViewModel,
loadingAll: "loading" as "loading" | "fetched" | "failed",
loadingSingle: "loading" as "loading" | "fetched" | "failed",
+ createStatus: null as null | "loading" | { status: "success" | "failed"; reason?: string },
+ updateStatus: null as null | "loading" | { status: "success" | "failed"; reason?: string },
+ deleteStatus: null as null | "loading" | { status: "success" | "failed"; reason?: string },
};
},
actions: {
+ resetStatus() {
+ this.createStatus = null;
+ this.updateStatus = null;
+ this.deleteStatus = null;
+ },
fetchUsers() {
this.loadingAll = "loading";
http
@@ -37,5 +46,65 @@ export const useUserStore = defineStore("user", {
this.loadingSingle = "failed";
});
},
+ updateActiveUser(user: CreateOrUpdateUserViewModel) {
+ if (this.user == null) return;
+ this.updateStatus = "loading";
+ http
+ .patch(`/admin/user/${this.user.id}`, {
+ username: user.username,
+ firstname: user.firstname,
+ lastname: user.lastname,
+ mail: user.mail,
+ })
+ .then((result) => {
+ this.updateStatus = { status: "success" };
+ this.fetchUsers();
+ })
+ .catch((err) => {
+ this.updateStatus = { status: "failed" };
+ });
+ },
+ updateActiveUserPermissions(permission: PermissionObject) {
+ if (this.user == null) return;
+ this.updateStatus = "loading";
+ http
+ .patch(`/admin/user/${this.user.id}/permissions`, {
+ permissions: permission,
+ })
+ .then((result) => {
+ this.updateStatus = { status: "success" };
+ this.fetchUsers();
+ })
+ .catch((err) => {
+ this.updateStatus = { status: "failed" };
+ });
+ },
+ updateActiveUserRoles(roles: Array
) {
+ if (this.user == null) return;
+ this.updateStatus = "loading";
+ http
+ .patch(`/admin/user/${this.user.id}/roles`, {
+ roleIds: roles,
+ })
+ .then((result) => {
+ this.updateStatus = { status: "success" };
+ this.fetchUsers();
+ })
+ .catch((err) => {
+ this.updateStatus = { status: "failed" };
+ });
+ },
+ deleteUser(user: number) {
+ this.deleteStatus = "loading";
+ http
+ .delete(`/admin/user/${user}`)
+ .then((res) => {
+ this.deleteStatus = { status: "success" };
+ this.fetchUsers();
+ })
+ .catch((err) => {
+ this.deleteStatus = { status: "failed", reason: err.data };
+ });
+ },
},
});
diff --git a/src/templates/Main.vue b/src/templates/Main.vue
index 9292318..cdf8a4d 100644
--- a/src/templates/Main.vue
+++ b/src/templates/Main.vue
@@ -1,6 +1,10 @@
-
+
zur Übersicht
@@ -37,7 +41,7 @@ export default defineComponent({
},
},
computed: {
- ...mapState(useNavigationStore, ["activeLink"]),
+ ...mapState(useNavigationStore, ["activeLink", "activeNavigation"]),
defaultRoute() {
return ((this.$route?.name as string) ?? "").includes("-default");
},
diff --git a/src/viewmodels/admin/user.models.ts b/src/viewmodels/admin/user.models.ts
index 39ee152..c73c526 100644
--- a/src/viewmodels/admin/user.models.ts
+++ b/src/viewmodels/admin/user.models.ts
@@ -11,3 +11,10 @@ export interface UserViewModel {
roles: Array;
permissions_total: PermissionObject;
}
+
+export interface CreateOrUpdateUserViewModel {
+ username: string;
+ mail: string;
+ firstname: string;
+ lastname: string;
+}
diff --git a/src/views/admin/user/RoleEdit.vue b/src/views/admin/user/RoleEdit.vue
new file mode 100644
index 0000000..bd1ba9c
--- /dev/null
+++ b/src/views/admin/user/RoleEdit.vue
@@ -0,0 +1,62 @@
+
+
+
+ zurück zur Liste
+
+
+
+
Rolle {{ role?.role }} - Daten bearbeiten
+
+
+
+
+ laden fehlgeschlagen
+
+
+
+
+
+
+
+
diff --git a/src/views/admin/user/RoleEditPermission.vue b/src/views/admin/user/RoleEditPermission.vue
new file mode 100644
index 0000000..297f5ff
--- /dev/null
+++ b/src/views/admin/user/RoleEditPermission.vue
@@ -0,0 +1,54 @@
+
+
+
+ zurück zur Liste
+
+
+
+
Rolle {{ role?.role }} - Berechtigungen bearbeiten
+
+
+
+
+ laden fehlgeschlagen
+
+
+
+
+
+
+
+
diff --git a/src/views/admin/user/UserEdit.vue b/src/views/admin/user/UserEdit.vue
new file mode 100644
index 0000000..ad0dc34
--- /dev/null
+++ b/src/views/admin/user/UserEdit.vue
@@ -0,0 +1,86 @@
+
+
+
+ zurück zur Liste
+
+
+
+
Nutzer {{ user?.username }} - Daten bearbeiten
+
+
+
+
+ laden fehlgeschlagen
+
+
+
+
+
+
+
+
diff --git a/src/views/admin/user/UserEditPermission.vue b/src/views/admin/user/UserEditPermission.vue
new file mode 100644
index 0000000..a0685f5
--- /dev/null
+++ b/src/views/admin/user/UserEditPermission.vue
@@ -0,0 +1,54 @@
+
+
+
+ zurück zur Liste
+
+
+
+
Nutzer {{ user?.username }} - Berechtigungen bearbeiten
+
+
+
+
+ laden fehlgeschlagen
+
+
+
+
+
+
+
+
diff --git a/src/views/admin/user/UserEditRoles.vue b/src/views/admin/user/UserEditRoles.vue
new file mode 100644
index 0000000..ee95193
--- /dev/null
+++ b/src/views/admin/user/UserEditRoles.vue
@@ -0,0 +1,114 @@
+
+
+
+ zurück zur Liste
+
+
+
+
Nutzer {{ user?.username }} - Rollen bearbeiten
+
+
+
+
+ laden fehlgeschlagen
+
+
+
zugewiesene Rollen
+
+
verfügbare Rollen
+
+
+
+ abbrechen
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/setup/Verify.vue b/src/views/setup/Verify.vue
index 97a238b..aad549f 100644
--- a/src/views/setup/Verify.vue
+++ b/src/views/setup/Verify.vue
@@ -19,7 +19,7 @@
-
@@ -61,7 +61,7 @@ import Spinner from "@/components/Spinner.vue";
import SuccessCheckmark from "@/components/SuccessCheckmark.vue";
import FailureXMark from "@/components/FailureXMark.vue";
import { RouterLink } from "vue-router";
-import { ClipboardCopyIcon } from "@heroicons/vue/outline";
+import { ClipboardIcon } from "@heroicons/vue/24/outline";