diff --git a/kdb-web/src/app/models/data/level.model.ts b/kdb-web/src/app/models/data/level.model.ts
index 932070a7..f747628f 100644
--- a/kdb-web/src/app/models/data/level.model.ts
+++ b/kdb-web/src/app/models/data/level.model.ts
@@ -1,5 +1,5 @@
-import { Data } from "./data.model";
-import { Server, ServerFilter } from "./server.model";
+import {Data} from "./data.model";
+import {Server, ServerFilter} from "./server.model";
export interface Level extends Data {
id?: number;
@@ -12,6 +12,6 @@ export interface Level extends Data {
export interface LevelFilter {
id?: number;
- name?: String;
+ name?: string;
server?: ServerFilter;
}
diff --git a/kdb-web/src/app/models/graphql/mutations.model.ts b/kdb-web/src/app/models/graphql/mutations.model.ts
index 4d10e87d..0cba6ef3 100644
--- a/kdb-web/src/app/models/graphql/mutations.model.ts
+++ b/kdb-web/src/app/models/graphql/mutations.model.ts
@@ -79,4 +79,46 @@ export class Mutations {
}
}
`;
+
+ static createLevel = `
+ mutation createLevel($name: String, $color: String, $minXp: Int, $permissions: String, $serverId: ID) {
+ level {
+ createLevel(input: { name: $name, color: $color, minXp: $minXp, permissions: $permissions, serverId: $serverId}) {
+ id
+ name
+ color
+ minXp
+ permissions
+ server {
+ id
+ }
+ }
+ }
+ }
+ `;
+
+ static updateLevel = `
+ mutation updateLevel($id: ID, $name: String, $color: String, $minXp: Int, $permissions: String) {
+ level {
+ updateLevel(input: { id: $id, name: $name, color: $color, minXp: $minXp, permissions: $permissions }) {
+ id
+ name
+ color
+ minXp
+ permissions
+ }
+ }
+ }
+ `;
+
+ static deleteLevel = `
+ mutation deleteLevel($id: ID) {
+ level {
+ deleteLevel(id: $id) {
+ id
+ name
+ }
+ }
+ }
+ `;
}
diff --git a/kdb-web/src/app/models/graphql/result.model.ts b/kdb-web/src/app/models/graphql/result.model.ts
index 5ad5cd8a..bf3b660e 100644
--- a/kdb-web/src/app/models/graphql/result.model.ts
+++ b/kdb-web/src/app/models/graphql/result.model.ts
@@ -1,5 +1,6 @@
import { User } from "../data/user.model";
import { AutoRole, AutoRoleRule } from "../data/auto_role.model";
+import { Level } from "../data/level.model";
export interface GraphQLResult {
data: any;
@@ -31,3 +32,11 @@ export interface AutoRoleRuleMutationResult {
deleteAutoRoleRule?: AutoRoleRule
};
}
+
+export interface LevelMutationResult {
+ level: {
+ createLevel?: Level
+ updateLevel?: Level
+ deleteLevel?: Level
+ };
+}
diff --git a/kdb-web/src/app/modules/view/server/levels/components/levels/levels.component.html b/kdb-web/src/app/modules/view/server/levels/components/levels/levels.component.html
index 94888113..8e42c31c 100644
--- a/kdb-web/src/app/modules/view/server/levels/components/levels/levels.component.html
+++ b/kdb-web/src/app/modules/view/server/levels/components/levels/levels.component.html
@@ -18,10 +18,10 @@
@@ -121,7 +121,7 @@
- {{level.name}}
+
{{level.name}}
@@ -132,7 +132,7 @@
- {{level.color}}
+
{{level.color}}
@@ -143,7 +143,7 @@
- {{level.minXp}}
+
{{level.minXp}}
@@ -154,7 +154,7 @@
- {{level.permissions}}
+
{{level.permissions}}
@@ -182,18 +182,17 @@
|
-
-
+ (click)="onRowEditInit(dt, level, ri)">
+
+ icon="pi pi-check-circle" (click)="onRowEditSave(dt, level, ri)">
+ icon="pi pi-times-circle" (click)="onRowEditCancel(ri)">
|
@@ -202,7 +201,7 @@
- {{'view.server.auto_roles.no_entries_found' | translate}} |
+ {{'view.server.levels.no_entries_found' | translate}} |
diff --git a/kdb-web/src/app/modules/view/server/levels/components/levels/levels.component.ts b/kdb-web/src/app/modules/view/server/levels/components/levels/levels.component.ts
index d2b8cdaa..65052d71 100644
--- a/kdb-web/src/app/modules/view/server/levels/components/levels/levels.component.ts
+++ b/kdb-web/src/app/modules/view/server/levels/components/levels/levels.component.ts
@@ -13,8 +13,13 @@ import {Sort, SortDirection} from "../../../../../../models/graphql/filter/sort.
import {Level, LevelFilter} from "../../../../../../models/data/level.model";
import {LevelListQuery} from "../../../../../../models/graphql/query.model";
import {Queries} from "../../../../../../models/graphql/queries.model";
-import {debounceTime} from "rxjs/operators";
+import {catchError, debounceTime} from "rxjs/operators";
import {LazyLoadEvent} from "primeng/api";
+import {Table} from "primeng/table";
+import {User} from "../../../../../../models/data/user.model";
+import {LevelMutationResult, UpdateUserMutationResult} from "../../../../../../models/graphql/result.model";
+import {Mutations} from "../../../../../../models/graphql/mutations.model";
+import {throwError} from "rxjs";
@Component({
selector: 'app-levels',
@@ -23,12 +28,12 @@ import {LazyLoadEvent} from "primeng/api";
})
export class LevelsComponent {
- levels!: Level[];
- loading = true;
+ public levels!: Level[];
+ public loading = true;
- isEditingNew: boolean = false;
+ public isEditingNew: boolean = false;
- filterForm!: FormGroup<{
+ public filterForm!: FormGroup<{
id: FormControl,
name: FormControl,
color: FormControl,
@@ -36,17 +41,19 @@ export class LevelsComponent {
permissions: FormControl,
}>;
- filter: LevelFilter = {};
- page: Page = {
+ public filter: LevelFilter = {};
+ public page: Page = {
pageSize: undefined,
pageIndex: undefined
};
- sort: Sort = {
+ public sort: Sort = {
sortColumn: undefined,
sortDirection: undefined
};
- totalRecords!: number;
+ public totalRecords!: number;
+
+ public clonedLevels: { [s: string]: Level; } = {};
public constructor(
private authService: AuthService,
@@ -67,7 +74,7 @@ export class LevelsComponent {
this.loadNextPage();
}
- public loadNextPage() {
+ public loadNextPage(): void {
this.loading = true;
this.data.query(Queries.levelQuery, {
filter: this.filter, page: this.page, sort: this.sort
@@ -80,7 +87,7 @@ export class LevelsComponent {
});
}
- public setFilterForm() {
+ public setFilterForm(): void {
this.filterForm = this.fb.group({
id: new FormControl(null),
name: new FormControl(null),
@@ -114,7 +121,13 @@ export class LevelsComponent {
});
}
- public nextPage(event: LazyLoadEvent) {
+ public newLevelTemplate: Level = {
+ id: 0,
+ createdAt: "",
+ modifiedAt: ""
+ };
+
+ public nextPage(event: LazyLoadEvent): void {
this.page.pageSize = event.rows ?? 0;
if (event.first != null && event.rows != null)
this.page.pageIndex = event.first / event.rows;
@@ -124,4 +137,121 @@ export class LevelsComponent {
this.loadNextPage();
}
+ public resetFilters(): void {
+ this.filterForm.reset();
+ }
+
+ public onRowEditInit(table: Table, user: User, index: number): void {
+ this.clonedLevels[index] = {...user};
+ }
+
+ public onRowEditSave(table: Table, newLevel: Level, index: number): void {
+ // const oldUser = this.clonedUsers[index];
+ // delete this.clonedUsers[index];
+
+ // if (JSON.stringify(oldUser) === JSON.stringify(newUser) && !this.isEditingNew) {
+ // console.log(1, oldUser, newUser, JSON.stringify(oldUser) === JSON.stringify(newUser), !this.isEditingNew);
+ // return;
+ // }
+
+ if (this.isEditingNew && JSON.stringify(newLevel) === JSON.stringify(this.newLevelTemplate)) {
+ this.isEditingNew = false;
+ this.levels.splice(index, 1);
+ return;
+ }
+
+ if (!newLevel.id && !this.isEditingNew || !newLevel.minXp && !newLevel?.name && !newLevel?.permissions) {
+ return;
+ }
+
+ if (this.isEditingNew) {
+ this.spinner.showSpinner();
+ this.data.mutation(Mutations.createLevel, {
+ name: newLevel.name,
+ color: newLevel.color,
+ minXp: newLevel.minXp,
+ permissions: newLevel.permissions,
+ serverId: this.sidebar.server$.value?.id
+ }
+ ).pipe(catchError(err => {
+ this.spinner.hideSpinner();
+ this.toastService.error(this.translate.instant("view.server.levels.message.level_create_failed"), this.translate.instant("view.server.levels.message.level_create_failed_d"));
+ return throwError(err);
+ })).subscribe(result => {
+ this.isEditingNew = false;
+ this.spinner.hideSpinner();
+ this.toastService.success(this.translate.instant("view.server.levels.message.level_create"), this.translate.instant("view.server.levels.message.level_create_d", {name: result.level.createLevel?.name}));
+ this.loadNextPage();
+ });
+ return;
+ }
+
+ this.spinner.showSpinner();
+ this.data.mutation(Mutations.updateLevel, {
+ id: newLevel.id,
+ name: newLevel.name,
+ color: newLevel.color,
+ minXp: newLevel.minXp,
+ permissions: newLevel.permissions,
+ }
+ ).pipe(catchError(err => {
+ this.spinner.hideSpinner();
+ this.toastService.error(this.translate.instant("view.server.levels.message.level_update_failed"), this.translate.instant("view.server.levels.message.level_update_failed_d", {name: newLevel.name}));
+ return throwError(err);
+ })).subscribe(_ => {
+ this.spinner.hideSpinner();
+ this.toastService.success(this.translate.instant("view.server.levels.message.level_update"), this.translate.instant("view.server.levels.message.level_update_d", {name: newLevel.name}));
+ this.loadNextPage();
+ });
+
+ }
+
+ public onRowEditCancel(index: number): void {
+ if (this.isEditingNew) {
+ this.levels.splice(index, 1);
+ delete this.clonedLevels[index];
+ this.isEditingNew = false;
+ return;
+ }
+
+ this.levels[index] = this.clonedLevels[index];
+ delete this.clonedLevels[index];
+ }
+
+ public deleteLevel(level: Level): void {
+ this.confirmDialog.confirmDialog(
+ this.translate.instant("view.server.levels.message.level_delete"), this.translate.instant("view.server.levels.message.level_delete_q", {name: level.name}),
+ () => {
+ this.spinner.showSpinner();
+ this.data.mutation(Mutations.deleteLevel, {
+ id: level.id
+ }
+ ).pipe(catchError(err => {
+ this.spinner.hideSpinner();
+ this.toastService.error(this.translate.instant("view.server.levels.message.level_delete_failed"), this.translate.instant("view.server.levels.message.level_delete_failedd", {name: level.name}));
+ return throwError(err);
+ })).subscribe(l => {
+ this.spinner.hideSpinner();
+ this.toastService.success(this.translate.instant("view.server.levels.message.level_deleted"), this.translate.instant("view.server.levels.message.level_deleted_d", {name: level.name}));
+ this.loadNextPage();
+ });
+ });
+ }
+
+ public addLevel(table: Table): void {
+ const newLevel = JSON.parse(JSON.stringify(this.newLevelTemplate));
+ newLevel.id = Math.max.apply(Math, this.levels.map(l => {
+ return l.id ?? 0;
+ })) + 1;
+
+ this.levels.push(newLevel);
+
+ table.initRowEdit(newLevel);
+
+ const index = this.levels.findIndex(l => l.id == newLevel.id);
+ this.onRowEditInit(table, newLevel, index);
+
+ this.isEditingNew = true;
+ }
+
}
diff --git a/kdb-web/src/app/modules/view/server/members/members.component.html b/kdb-web/src/app/modules/view/server/members/members.component.html
index 1c120f02..9fe65927 100644
--- a/kdb-web/src/app/modules/view/server/members/members.component.html
+++ b/kdb-web/src/app/modules/view/server/members/members.component.html
@@ -97,29 +97,34 @@
|
|
|
|
@@ -194,7 +199,8 @@
-
+
{{member.level.name}}
@@ -225,12 +231,13 @@
-
+
+ icon="pi pi-times-circle" (click)="onRowEditCancel(ri)">
|
diff --git a/kdb-web/src/app/modules/view/server/members/members.component.ts b/kdb-web/src/app/modules/view/server/members/members.component.ts
index a81cd7c9..3728cc50 100644
--- a/kdb-web/src/app/modules/view/server/members/members.component.ts
+++ b/kdb-web/src/app/modules/view/server/members/members.component.ts
@@ -88,6 +88,7 @@ export class MembersComponent implements OnInit {
private fb: FormBuilder,
private translate: TranslateService,
private data: DataService,
+ private sidebar: SidebarService,
private route: ActivatedRoute
) {
}
@@ -234,7 +235,7 @@ export class MembersComponent implements OnInit {
}
- onRowEditCancel(user: User, index: number) {
+ onRowEditCancel(index: number) {
if (this.isEditingNew) {
this.members.splice(index, 1);
delete this.clonedUsers[index];
diff --git a/kdb-web/src/assets/i18n/de.json b/kdb-web/src/assets/i18n/de.json
index b36b602b..26ceea96 100644
--- a/kdb-web/src/assets/i18n/de.json
+++ b/kdb-web/src/assets/i18n/de.json
@@ -221,7 +221,7 @@
"message": {
"user_changed": "Benutzer geändert",
"user_changed_d": "Benutzer {{name}} erfolgreich geändert",
- "user_change_failed": "Benutzer änderung fehlgeschlagen",
+ "user_change_failed": "Benutzer Änderung fehlgeschlagen",
"user_change_failed_d": "Benutzer {{name}} konnte nicht geändert werden!"
}
},
@@ -298,10 +298,20 @@
},
"no_entries_found": "Keine Einträge gefunden",
"message": {
- "level_changed": "Level geändert",
- "level_changed_d": "Level {{name}} erfolgreich geändert",
- "level_change_failed": "Level Änderung fehlgeschlagen",
- "level_change_failed_d": "Level {{name}} konnte nicht geändert werden!"
+ "level_create": "Level erstellt",
+ "level_create_d": "Level {{name}} erfolgreich erstellt",
+ "level_create_failed": "Level Erstellung fehlgeschlagen",
+ "level_create_failed_d": "Die Erstellung des Levels ist fehlgeschlagen!",
+ "level_update": "Level bearbeitet",
+ "level_update_d": "Level {{name}} erfolgreich bearbeitet",
+ "level_update_failed": "Level Bearbeitung fehlgeschlagen",
+ "level_update_failed_d": "Die Bearbeitung des Levels ist fehlgeschlagen!",
+ "level_delete": "Level löschen",
+ "level_delete_q": "Sind Sie sich sicher, dass Sie das Level {{name}} löschen möchten?",
+ "level_deleted": "Level gelöscht",
+ "level_deleted_d": "Level {{name}} erfolgreich gelöscht",
+ "level_delete_failed": "Level Löschung fehlgeschlagen",
+ "level_delete_failed_d": "Die Löschung des Levels {{name}} ist fehlgeschlagen!"
}
}
},
| | |