Compare commits

..

No commits in common. "02e0c72a8071e57ea94b1438c2d9e70127ccd68f" and "1fc5ef76a6c66b3ac456eafd004e5e77d15d8d3e" have entirely different histories.

40 changed files with 316 additions and 789 deletions

View File

@ -1,4 +1,3 @@
from enum import Enum
from typing import Optional from typing import Optional
from cpl_core.database.context import DatabaseContextABC from cpl_core.database.context import DatabaseContextABC
@ -101,17 +100,9 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
): ):
crit_sort_direction = criteria.sort_direction.lower() crit_sort_direction = criteria.sort_direction.lower()
if crit_sort_direction == "desc" or crit_sort_direction == "descending": if crit_sort_direction == "desc" or crit_sort_direction == "descending":
query = query.order_by_descending( query = query.order_by_descending(lambda x: getattr(x, criteria.sort_column))
lambda x: getattr(x, criteria.sort_column)
if not isinstance(getattr(x, criteria.sort_column), Enum)
else getattr(x, criteria.sort_column).value
)
else: else:
query = query.order_by( query = query.order_by(lambda x: getattr(x, criteria.sort_column))
lambda x: getattr(x, criteria.sort_column)
if not isinstance(getattr(x, criteria.sort_column), Enum)
else getattr(x, criteria.sort_column).value
)
result = FilteredResult() result = FilteredResult()
result.total_count = query.count() result.total_count = query.count()

View File

@ -1,6 +1,6 @@
{ {
"name": "kdb-web", "name": "kdb-web",
"version": "1.1.dev79_hide_table_columns", "version": "1.1.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"update-version": "ts-node-esm update-version.ts", "update-version": "ts-node-esm update-version.ts",

View File

@ -1,7 +0,0 @@
import { ComponentWithTable } from './component-with-table';
describe('ComponentWithTable', () => {
it('should create an instance', () => {
expect(new ComponentWithTable()).toBeTruthy();
});
});

View File

@ -1,39 +0,0 @@
export interface Column {
key: string;
name: string;
}
export class ComponentWithTable {
private _hiddenColumns: Column[] = [];
set hiddenColumns(value: Column[]) {
this._hiddenColumns = value;
localStorage.setItem("hiddenColumns", JSON.stringify(value));
}
get hiddenColumns(): Column[] {
return this._hiddenColumns;
}
private name: string = "";
public columns: Column[] = [];
constructor(
name: string,
columns: string[]
) {
this.name = name;
this.columns = columns.map(column => {
return { key: this.getKey(column), name: column };
});
this._hiddenColumns = JSON.parse(localStorage.getItem("hiddenColumns") ?? "");
}
private getKey(column: string): string {
return `${this.name}_${column}`;
}
public isColumnVisible(column: string): boolean {
return !this._hiddenColumns.map(column => column.key).includes(this.getKey(column));
}
}

View File

@ -9,14 +9,11 @@
<ng-template pTemplate="caption"> <ng-template pTemplate="caption">
<div class="table-caption"> <div class="table-caption">
<div class="table-caption-table-info"> <div class="table-caption-text">
<div class="table-caption-text"> <ng-container *ngIf="!loading">{{users.length}} {{'common.of' | translate}}
<ng-container *ngIf="!loading">{{users.length}} {{'common.of' | translate}} {{dt.totalRecords}}
{{dt.totalRecords}} </ng-container>
</ng-container> {{'admin.auth_users.users' | translate}}
{{'admin.auth_users.users' | translate}}
</div>
<app-multi-select-columns [columns]="columns" [(hiddenColumns)]="hiddenColumns"></app-multi-select-columns>
</div> </div>
<div class="table-caption-btn-wrapper btn-wrapper"> <div class="table-caption-btn-wrapper btn-wrapper">
@ -32,44 +29,44 @@
<ng-template pTemplate="header"> <ng-template pTemplate="header">
<tr> <tr>
<th hideable-th="first_name" [parent]="this" [sortable]="true"> <th pSortableColumn="firstName">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.first_name' | translate}}</div> <div class="table-header-text">{{'admin.auth_users.headers.first_name' | translate}}</div>
<p-sortIcon field="firstName" class="table-header-icon"></p-sortIcon> <p-sortIcon field="firstName" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="last_name" [parent]="this" [sortable]="true"> <th pSortableColumn="lastName">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.last_name' | translate}}</div> <div class="table-header-text">{{'admin.auth_users.headers.last_name' | translate}}</div>
<p-sortIcon field="lastName" class="table-header-icon"></p-sortIcon> <p-sortIcon field="lastName" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="email" [parent]="this" [sortable]="true"> <th pSortableColumn="email">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.email' | translate}}</div> <div class="table-header-text">{{'common.email' | translate}}</div>
<p-sortIcon field="email" class="table-header-icon"></p-sortIcon> <p-sortIcon field="email" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th class="table-header-actions" hideable-th="active" [parent]="this" [sortable]="true"> <th class="table-header-actions" pSortableColumn="confirmationId">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.active' | translate}}</div> <div class="table-header-text">{{'admin.auth_users.headers.active' | translate}}</div>
<p-sortIcon field="confirmationId" class="table-header-icon"></p-sortIcon> <p-sortIcon field="confirmationId" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th class="table-header-small-dropdown" hideable-th="auth_role" [parent]="this" [sortable]="true"> <th class="table-header-small-dropdown" pSortableColumn="authRole">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.role' | translate}}</div> <div class="table-header-text">{{'admin.auth_users.headers.role' | translate}}</div>
<p-sortIcon field="authRole" class="table-header-icon"></p-sortIcon> <p-sortIcon field="authRole" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="password" [parent]="this"> <th>
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.password' | translate}}</div> <div class="table-header-text">{{'admin.auth_users.headers.password' | translate}}</div>
</div> </div>
</th> </th>
@ -92,28 +89,28 @@
</th> </th>
</tr> </tr>
<tr> <tr>
<th hideable-th="first_name" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="firstName" placeholder="{{'common.first_name' | translate}}"> <input type="text" pInputText formControlName="firstName" placeholder="{{'admin.auth_users.headers.first_name' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="last_name" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="lastName" placeholder="{{'common.last_name' | translate}}"> <input type="text" pInputText formControlName="lastName" placeholder="{{'admin.auth_users.headers.last_name' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="email" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="email" pInputText formControlName="email" placeholder="{{'common.email' | translate}}"> <input type="email" pInputText formControlName="email" placeholder="{{'common.email' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="active" [parent]="this"></th> <th></th>
<th hideable-th="auth_role" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<p-dropdown formControlName="authRole" [options]="authRoles" placeholder="{{'common.auth_role' | translate}}"></p-dropdown> <p-dropdown formControlName="authRole" [options]="authRoles" placeholder="{{'admin.auth_users.headers.auth_role' | translate}}"></p-dropdown>
</form> </form>
</th> </th>
<th hideable-th="password" [parent]="this"></th> <th></th>
<th></th> <th></th>
<th></th> <th></th>
<th></th> <th></th>
@ -122,7 +119,7 @@
<ng-template pTemplate="body" let-user let-editing="editing" let-ri="rowIndex"> <ng-template pTemplate="body" let-user let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="user"> <tr [pEditableRow]="user">
<td hideable-td="first_name" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="text" [(ngModel)]="user.firstName" <input class="table-edit-input" pInputText type="text" [(ngModel)]="user.firstName"
@ -133,7 +130,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="last_name" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="text" [(ngModel)]="user.lastName" <input class="table-edit-input" pInputText type="text" [(ngModel)]="user.lastName"
@ -144,7 +141,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="email" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="email" [(ngModel)]="user.email" <input class="table-edit-input" pInputText type="email" [(ngModel)]="user.email"
@ -155,7 +152,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="active" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-checkbox [binary]="true" [(ngModel)]="user.isConfirmed" <p-checkbox [binary]="true" [(ngModel)]="user.isConfirmed"
@ -168,7 +165,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="auth_role" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-dropdown [options]="authRoles" [(ngModel)]="user.authRole" <p-dropdown [options]="authRoles" [(ngModel)]="user.authRole"
@ -179,7 +176,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="password" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="password" [(ngModel)]="user.password" <input class="table-edit-input" pInputText type="password" [(ngModel)]="user.password"

View File

@ -15,7 +15,6 @@ import { AuthUserSelectCriterion } from "src/app/models/selection/auth-user/auth
import { LazyLoadEvent } from "primeng/api"; import { LazyLoadEvent } from "primeng/api";
import { Subject, throwError } from "rxjs"; import { Subject, throwError } from "rxjs";
import { TranslateService } from "@ngx-translate/core"; import { TranslateService } from "@ngx-translate/core";
import { ComponentWithTable } from "../../../../../base/component-with-table";
@Component({ @Component({
@ -23,7 +22,7 @@ import { ComponentWithTable } from "../../../../../base/component-with-table";
templateUrl: "./auth-user.component.html", templateUrl: "./auth-user.component.html",
styleUrls: ["./auth-user.component.scss"] styleUrls: ["./auth-user.component.scss"]
}) })
export class AuthUserComponent extends ComponentWithTable implements OnInit, OnDestroy { export class AuthUserComponent implements OnInit, OnDestroy {
users!: AuthUserDTO[]; users!: AuthUserDTO[];
statuses!: any[]; statuses!: any[];
@ -73,7 +72,6 @@ export class AuthUserComponent extends ComponentWithTable implements OnInit, OnD
private fb: FormBuilder, private fb: FormBuilder,
private translate: TranslateService private translate: TranslateService
) { ) {
super("auth-users", ["first_name", "last_name", "email", "active", 'auth_role', 'password']);
} }
ngOnInit(): void { ngOnInit(): void {

View File

@ -1,7 +0,0 @@
import { HideableComponent } from './hideable-component';
describe('HideableComponent', () => {
it('should create an instance', () => {
expect(new HideableComponent()).toBeTruthy();
});
});

View File

@ -1,13 +0,0 @@
import { Directive, HostBinding, Input } from "@angular/core";
import { ComponentWithTable } from "../../../base/component-with-table";
@Directive()
export class HideableComponent {
@HostBinding("class.hidden-column")
get hidden() {
return !(this.parent?.isColumnVisible(this.column) ?? true);
};
@Input() column!: string;
@Input() parent!: ComponentWithTable;
}

View File

@ -1,16 +0,0 @@
<div class="table-caption-column-select">
<p-multiSelect display="chip" [options]="columns" [(ngModel)]="hiddenColumns" optionLabel="name" placeholder="{{'common.hidden_columns' | translate}}" [filter]=false>
<ng-template let-value pTemplate="selectedItems">
<div *ngFor="let item of hiddenColumns; let i = index;">
<div>
{{'common.' + item.name | translate}}<span *ngIf="i < columns.length-1">,</span>
</div>
</div>
<div *ngIf="!hiddenColumns || hiddenColumns.length === 0">{{'common.hidden_columns' | translate}}</div>
</ng-template>
<ng-template let-item pTemplate="item">
<div>{{'common.' + item.name | translate}}</div>
</ng-template>
</p-multiSelect>
</div>

View File

@ -1,23 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MultiSelectColumnsComponent } from './multi-select-columns.component';
describe('MultiSelectColumnsComponent', () => {
let component: MultiSelectColumnsComponent;
let fixture: ComponentFixture<MultiSelectColumnsComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ MultiSelectColumnsComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(MultiSelectColumnsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,24 +0,0 @@
import { Component, EventEmitter, Input, Output } from "@angular/core";
import { Column } from "../../../../base/component-with-table";
@Component({
selector: "app-multi-select-columns",
templateUrl: "./multi-select-columns.component.html",
styleUrls: ["./multi-select-columns.component.scss"]
})
export class MultiSelectColumnsComponent {
@Input() columns: Column[] = [];
private _hiddenColumns: Column[] = [];
@Input()
set hiddenColumns(columns: Column[]) {
this._hiddenColumns = columns;
this.hiddenColumnsChange.emit(columns);
}
get hiddenColumns(): Column[] {
return this._hiddenColumns;
}
@Output() hiddenColumnsChange: EventEmitter<Column[]> = new EventEmitter<Column[]>();
}

View File

@ -1,23 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HideableColumnComponent } from './hideable-column.component';
describe('HideableColumnComponent', () => {
let component: HideableColumnComponent;
let fixture: ComponentFixture<HideableColumnComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ HideableColumnComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(HideableColumnComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,16 +0,0 @@
import { Component, Input } from "@angular/core";
import { HideableComponent } from "../../base/hideable-component";
@Component({
selector: "[hideable-td]",
templateUrl: "./hideable-column.component.html",
styleUrls: ["./hideable-column.component.scss"]
})
export class HideableColumnComponent extends HideableComponent {
@Input("hideable-td") override column!: string;
constructor() {
super();
}
}

View File

@ -1,11 +0,0 @@
<ng-template #content>
<ng-content></ng-content>
</ng-template>
<div *ngIf="sortable; else without" [pSortableColumn]="column">
<ng-container *ngTemplateOutlet="content"></ng-container>
</div>
<ng-template #without>
<ng-container *ngTemplateOutlet="content"></ng-container>
</ng-template>

View File

@ -1,23 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HideableHeaderComponent } from './hideable-header.component';
describe('HideableHeaderComponent', () => {
let component: HideableHeaderComponent;
let fixture: ComponentFixture<HideableHeaderComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ HideableHeaderComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(HideableHeaderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,16 +0,0 @@
import { Component, Input } from "@angular/core";
import { HideableComponent } from "../../base/hideable-component";
@Component({
selector: "[hideable-th]",
templateUrl: "./hideable-header.component.html",
styleUrls: ["./hideable-header.component.scss"]
})
export class HideableHeaderComponent extends HideableComponent {
@Input("hideable-th") override column!: string;
@Input() sortable: boolean = false;
constructor() {
super();
}
}

View File

@ -13,7 +13,7 @@ import { InputTextModule } from "primeng/inputtext";
import { MenuModule } from "primeng/menu"; import { MenuModule } from "primeng/menu";
import { PasswordModule } from "primeng/password"; import { PasswordModule } from "primeng/password";
import { ProgressSpinnerModule } from "primeng/progressspinner"; import { ProgressSpinnerModule } from "primeng/progressspinner";
import { SortableColumn, TableModule } from "primeng/table"; import { TableModule } from "primeng/table";
import { ToastModule } from "primeng/toast"; import { ToastModule } from "primeng/toast";
import { AuthRolePipe } from "./pipes/auth-role.pipe"; import { AuthRolePipe } from "./pipes/auth-role.pipe";
import { IpAddressPipe } from "./pipes/ip-address.pipe"; import { IpAddressPipe } from "./pipes/ip-address.pipe";
@ -23,13 +23,9 @@ import { PanelModule } from "primeng/panel";
import { InputNumberModule } from "primeng/inputnumber"; import { InputNumberModule } from "primeng/inputnumber";
import { ImageModule } from "primeng/image"; import { ImageModule } from "primeng/image";
import { SidebarModule } from "primeng/sidebar"; import { SidebarModule } from "primeng/sidebar";
import { HistoryBtnComponent } from "./components/history-btn/history-btn.component"; import { HistoryBtnComponent } from './components/history-btn/history-btn.component';
import { DataViewModule, DataViewLayoutOptions } from "primeng/dataview"; import { DataViewModule, DataViewLayoutOptions } from 'primeng/dataview';
import { ConfigListComponent } from "./components/config-list/config-list.component"; import { ConfigListComponent } from './components/config-list/config-list.component';
import { MultiSelectModule } from "primeng/multiselect";
import { HideableColumnComponent } from './components/hideable-column/hideable-column.component';
import { HideableHeaderComponent } from './components/hideable-header/hideable-header.component';
import { MultiSelectColumnsComponent } from './base/multi-select-columns/multi-select-columns.component';
@NgModule({ @NgModule({
@ -39,9 +35,6 @@ import { MultiSelectColumnsComponent } from './base/multi-select-columns/multi-s
BoolPipe, BoolPipe,
HistoryBtnComponent, HistoryBtnComponent,
ConfigListComponent, ConfigListComponent,
HideableColumnComponent,
HideableHeaderComponent,
MultiSelectColumnsComponent,
], ],
imports: [ imports: [
CommonModule, CommonModule,
@ -67,42 +60,36 @@ import { MultiSelectColumnsComponent } from './base/multi-select-columns/multi-s
ImageModule, ImageModule,
SidebarModule, SidebarModule,
DataViewModule, DataViewModule,
MultiSelectModule,
], ],
exports: [ exports: [
ButtonModule, ButtonModule,
PasswordModule, PasswordModule,
MenuModule, MenuModule,
DialogModule, DialogModule,
ProgressSpinnerModule, ProgressSpinnerModule,
HttpClientModule, HttpClientModule,
FormsModule, FormsModule,
ReactiveFormsModule, ReactiveFormsModule,
ToastModule, ToastModule,
ConfirmDialogModule, ConfirmDialogModule,
TableModule, TableModule,
InputTextModule, InputTextModule,
CheckboxModule, CheckboxModule,
DropdownModule, DropdownModule,
TranslateModule, TranslateModule,
DynamicDialogModule, DynamicDialogModule,
PanelMenuModule, PanelMenuModule,
PanelModule, PanelModule,
AuthRolePipe, AuthRolePipe,
IpAddressPipe, IpAddressPipe,
BoolPipe, BoolPipe,
InputNumberModule, InputNumberModule,
ImageModule, ImageModule,
SidebarModule, SidebarModule,
HistoryBtnComponent, HistoryBtnComponent,
DataViewModule, DataViewModule,
DataViewLayoutOptions, DataViewLayoutOptions,
ConfigListComponent, ConfigListComponent
MultiSelectModule, ]
HideableColumnComponent,
HideableHeaderComponent,
MultiSelectColumnsComponent,
]
}) })
export class SharedModule { export class SharedModule { }
}

View File

@ -9,15 +9,11 @@
<ng-template pTemplate="caption"> <ng-template pTemplate="caption">
<div class="table-caption"> <div class="table-caption">
<div class="table-caption-table-info"> <div class="table-caption-text">
<div class="table-caption-text"> <ng-container *ngIf="!loading">{{achievements.length}} {{'common.of' | translate}}
<ng-container *ngIf="!loading">{{achievements.length}} {{'common.of' | translate}} {{dt.totalRecords}}
{{dt.totalRecords}} </ng-container>
</ng-container> {{'view.server.achievements.achievements' | translate}}
{{'view.server.achievements.achievements' | translate}}
</div>
<app-multi-select-columns [columns]="columns" [(hiddenColumns)]="hiddenColumns"></app-multi-select-columns>
</div> </div>
<div class="table-caption-btn-wrapper btn-wrapper"> <div class="table-caption-btn-wrapper btn-wrapper">
@ -33,44 +29,44 @@
<ng-template pTemplate="header"> <ng-template pTemplate="header">
<tr> <tr>
<th hideable-th="id" [parent]="this" [sortable]="true"> <th pSortableColumn="id">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.id' | translate}}</div> <div class="table-header-text">{{'common.id' | translate}}</div>
<p-sortIcon field="id" class="table-header-icon"></p-sortIcon> <p-sortIcon field="id" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="name" [parent]="this" [sortable]="true"> <th pSortableColumn="name">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.name' | translate}}</div> <div class="table-header-text">{{'view.server.achievements.headers.name' | translate}}</div>
<p-sortIcon field="name" class="table-header-icon"></p-sortIcon> <p-sortIcon field="name" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="description" [parent]="this" [sortable]="true"> <th pSortableColumn="description">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.description' | translate}}</div> <div class="table-header-text">{{'view.server.achievements.headers.description' | translate}}</div>
<p-sortIcon field="name" class="table-header-icon"></p-sortIcon> <p-sortIcon field="name" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="attribute" [parent]="this" [sortable]="true"> <th pSortableColumn="attribute">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.attribute' | translate}}</div> <div class="table-header-text">{{'view.server.achievements.headers.attribute' | translate}}</div>
<p-sortIcon field="attribute" class="table-header-icon"></p-sortIcon> <p-sortIcon field="attribute" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="operator" [parent]="this" [sortable]="true"> <th pSortableColumn="operator">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.operator' | translate}}</div> <div class="table-header-text">{{'view.server.achievements.headers.operator' | translate}}</div>
<p-sortIcon field="operator" class="table-header-icon"></p-sortIcon> <p-sortIcon field="operator" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="value" [parent]="this" [sortable]="true"> <th pSortableColumn="value">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.value' | translate}}</div> <div class="table-header-text">{{'view.server.achievements.headers.value' | translate}}</div>
<p-sortIcon field="value" class="table-header-icon"></p-sortIcon> <p-sortIcon field="value" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
@ -95,27 +91,27 @@
</tr> </tr>
<tr> <tr>
<th hideable-th="id" [parent]="this" class="table-header-small"> <th class="table-header-small">
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="id" <input type="text" pInputText formControlName="id"
placeholder="{{'common.id' | translate}}"> placeholder="{{'common.id' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="name" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="name" <input type="text" pInputText formControlName="name"
placeholder="{{'common.name' | translate}}"> placeholder="{{'view.server.achievements.headers.name' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="description" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="description" <input type="text" pInputText formControlName="name"
placeholder="{{'common.description' | translate}}"> placeholder="{{'view.server.achievements.headers.description' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="attribute" [parent]="this"></th> <th></th>
<th hideable-th="operator" [parent]="this"></th> <th></th>
<th hideable-th="value" [parent]="this"></th> <th></th>
<th class="table-header-small-dropdown"></th> <th class="table-header-small-dropdown"></th>
<th class="table-header-small-dropdown"></th> <th class="table-header-small-dropdown"></th>
<th class="table-header-actions"></th> <th class="table-header-actions"></th>
@ -124,7 +120,7 @@
<ng-template pTemplate="body" let-achievement let-editing="editing" let-ri="rowIndex"> <ng-template pTemplate="body" let-achievement let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="achievement"> <tr [pEditableRow]="achievement">
<td hideable-td="id" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{achievement.id}} {{achievement.id}}
@ -135,7 +131,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="name" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="text" [(ngModel)]="achievement.name"> <input class="table-edit-input" pInputText type="text" [(ngModel)]="achievement.name">
@ -146,7 +142,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="description" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="text" [(ngModel)]="achievement.description"> <input class="table-edit-input" pInputText type="text" [(ngModel)]="achievement.description">
@ -157,11 +153,11 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="attribute" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-dropdown [options]="attributes" [(ngModel)]="achievement.attribute" <p-dropdown [options]="attributes" [(ngModel)]="achievement.attribute"
placeholder="{{'common.attribute' | translate}}"></p-dropdown> placeholder="{{'view.server.achievements.headers.attribute' | translate}}"></p-dropdown>
</ng-template> </ng-template>
<ng-template pTemplate="output"> <ng-template pTemplate="output">
{{achievement.attribute}} {{achievement.attribute}}
@ -169,10 +165,10 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="description" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-dropdown [options]="operators" [(ngModel)]="achievement.operator" placeholder="{{'common.operator' | translate}}"></p-dropdown> <p-dropdown [options]="operators" [(ngModel)]="achievement.operator" placeholder="{{'view.server.achievements.headers.operator' | translate}}"></p-dropdown>
</ng-template> </ng-template>
<ng-template pTemplate="output"> <ng-template pTemplate="output">
{{achievement.operator}} {{achievement.operator}}
@ -180,7 +176,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="value" [parent]="this"> <td>
<p-cellEditor *ngIf="getAchievementAttributeByName(achievement.attribute)?.type === 'number'"> <p-cellEditor *ngIf="getAchievementAttributeByName(achievement.attribute)?.type === 'number'">
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText min="0" type="number" [(ngModel)]="achievement.value"> <input class="table-edit-input" pInputText min="0" type="number" [(ngModel)]="achievement.value">

View File

@ -22,14 +22,13 @@ import { Table } from "primeng/table";
import { User } from "../../../../../../models/data/user.model"; import { User } from "../../../../../../models/data/user.model";
import { AchievementMutationResult } from "../../../../../../models/graphql/result.model"; import { AchievementMutationResult } from "../../../../../../models/graphql/result.model";
import { Mutations } from "../../../../../../models/graphql/mutations.model"; import { Mutations } from "../../../../../../models/graphql/mutations.model";
import { ComponentWithTable } from "../../../../../../base/component-with-table";
@Component({ @Component({
selector: "app-achievement", selector: "app-achievement",
templateUrl: "./achievement.component.html", templateUrl: "./achievement.component.html",
styleUrls: ["./achievement.component.scss"] styleUrls: ["./achievement.component.scss"]
}) })
export class AchievementComponent extends ComponentWithTable implements OnInit, OnDestroy { export class AchievementComponent implements OnInit, OnDestroy {
public achievements: Achievement[] = []; public achievements: Achievement[] = [];
public loading = true; public loading = true;
@ -38,7 +37,6 @@ export class AchievementComponent extends ComponentWithTable implements OnInit,
public filterForm!: FormGroup<{ public filterForm!: FormGroup<{
id: FormControl<number | null>, id: FormControl<number | null>,
name: FormControl<string | null>, name: FormControl<string | null>,
description: FormControl<string | null>,
color: FormControl<string | null>, color: FormControl<string | null>,
min_xp: FormControl<number | null>, min_xp: FormControl<number | null>,
permissions: FormControl<string | null>, permissions: FormControl<string | null>,
@ -81,7 +79,6 @@ export class AchievementComponent extends ComponentWithTable implements OnInit,
private data: DataService, private data: DataService,
private sidebar: SidebarService, private sidebar: SidebarService,
private route: ActivatedRoute) { private route: ActivatedRoute) {
super("achievement", ["id", "name", "description", "attribute", "operator", "value"]);
} }
public ngOnInit(): void { public ngOnInit(): void {
@ -160,7 +157,6 @@ export class AchievementComponent extends ComponentWithTable implements OnInit,
this.filterForm = this.fb.group({ this.filterForm = this.fb.group({
id: new FormControl<number | null>(null), id: new FormControl<number | null>(null),
name: new FormControl<string | null>(null), name: new FormControl<string | null>(null),
description: new FormControl<string | null>(null),
color: new FormControl<string | null>(null), color: new FormControl<string | null>(null),
min_xp: new FormControl<number | null>(null), min_xp: new FormControl<number | null>(null),
permissions: new FormControl<string | null>(null) permissions: new FormControl<string | null>(null)

View File

@ -9,14 +9,11 @@
<ng-template pTemplate="caption"> <ng-template pTemplate="caption">
<div class="table-caption"> <div class="table-caption">
<div class="table-caption-table-info"> <div class="table-caption-text">
<div class="table-caption-text"> <ng-container *ngIf="!loading">{{rules.length}} {{'common.of' | translate}}
<ng-container *ngIf="!loading">{{rules.length}} {{'common.of' | translate}} {{dt.totalRecords}}
{{dt.totalRecords}} </ng-container>
</ng-container> {{'view.server.auto_roles.rules.auto_roles' | translate}}
{{'view.server.auto_roles.rules.auto_roles' | translate}}
</div>
<app-multi-select-columns [columns]="columns" [(hiddenColumns)]="hiddenColumns"></app-multi-select-columns>
</div> </div>
<div class="table-caption-btn-wrapper btn-wrapper"> <div class="table-caption-btn-wrapper btn-wrapper">
@ -32,23 +29,23 @@
<ng-template pTemplate="header"> <ng-template pTemplate="header">
<tr> <tr>
<th hideable-th="id" [parent]="this" [sortable]="true"> <th pSortableColumn="id">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.id' | translate}}</div> <div class="table-header-text">{{'common.id' | translate}}</div>
<p-sortIcon field="id" class="table-header-icon"></p-sortIcon> <p-sortIcon field="id" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="role" [parent]="this" [sortable]="true"> <th pSortableColumn="roleName">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.role' | translate}}</div> <div class="table-header-text">{{'view.server.auto_roles.rules.headers.role' | translate}}</div>
<p-sortIcon field="roleName" class="table-header-icon"></p-sortIcon> <p-sortIcon field="roleName" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="emoji" [parent]="this"> <th>
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.emoji' | translate}}</div> <div class="table-header-text">{{'view.server.auto_roles.rules.headers.emoji' | translate}}</div>
</div> </div>
</th> </th>
@ -72,17 +69,17 @@
</tr> </tr>
<tr> <tr>
<th hideable-th="id" [parent]="this" class="table-header-small"> <th class="table-header-small">
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="id" placeholder="{{'common.id' | translate}}"> <input type="text" pInputText formControlName="id" placeholder="{{'common.id' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="role" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="roleId" placeholder="{{'common.role' | translate}}"> <input type="text" pInputText formControlName="roleId" placeholder="{{'view.server.auto_roles.rules.headers.role' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="emoji" [parent]="this"></th> <th></th>
<th class="table-header-small-dropdown"></th> <th class="table-header-small-dropdown"></th>
<th class="table-header-small-dropdown"></th> <th class="table-header-small-dropdown"></th>
<th class="table-header-actions"></th> <th class="table-header-actions"></th>
@ -91,7 +88,7 @@
<ng-template pTemplate="body" let-autoRoleRule let-editing="editing" let-ri="rowIndex"> <ng-template pTemplate="body" let-autoRoleRule let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="autoRoleRule"> <tr [pEditableRow]="autoRoleRule">
<td hideable-td="id" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{autoRoleRule.id}} {{autoRoleRule.id}}
@ -102,11 +99,11 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="role" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-dropdown [options]="roles" optionValue="value.id" [(ngModel)]="autoRoleRule.roleId" <p-dropdown [options]="roles" optionValue="value.id" [(ngModel)]="autoRoleRule.roleId"
placeholder="{{'common.role' | translate}}"></p-dropdown> placeholder="{{'view.server.auto_roles.rules.headers.role' | translate}}"></p-dropdown>
</ng-template> </ng-template>
<ng-template pTemplate="output"> <ng-template pTemplate="output">
{{autoRoleRule.roleName}} {{autoRoleRule.roleName}}
@ -114,11 +111,11 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="emoji" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-dropdown [options]="emojis" optionValue="value.name" [(ngModel)]="autoRoleRule.emojiName" <p-dropdown [options]="emojis" optionValue="value.name" [(ngModel)]="autoRoleRule.emojiName"
placeholder="{{'common.emoji' | translate}}"> placeholder="{{'view.server.auto_roles.rules.headers.emoji' | translate}}">
<ng-template pTemplate="selectedItem"> <ng-template pTemplate="selectedItem">
<div class="dropdown-icon-label-wrapper" *ngIf="autoRoleRule.emojiName"> <div class="dropdown-icon-label-wrapper" *ngIf="autoRoleRule.emojiName">
<p-image [src]="getEmojiUrl(autoRoleRule.emojiName)" [alt]="autoRoleRule.emojiName" width="25"></p-image> <p-image [src]="getEmojiUrl(autoRoleRule.emojiName)" [alt]="autoRoleRule.emojiName" width="25"></p-image>
@ -163,7 +160,7 @@
<td> <td>
<div class="btn-wrapper"> <div class="btn-wrapper">
<app-history-btn *ngIf="!isEditingNew" [id]="autoRoleRule.id" [query]="query" translationKey="view.server.auto_roles.rules.header"></app-history-btn> <app-history-btn *ngIf="!isEditingNew" [id] ="autoRoleRule.id" [query]="query" translationKey="view.server.auto_roles.rules.header"></app-history-btn>
<button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil" (click)="onRowEditInit(dt, autoRoleRule, ri)"></button> <button *ngIf="!editing" pButton pInitEditableRow class="btn icon-btn" icon="pi pi-pencil" (click)="onRowEditInit(dt, autoRoleRule, ri)"></button>
<button *ngIf="!editing" pButton class="btn icon-btn danger-icon-btn" icon="pi pi-trash" <button *ngIf="!editing" pButton class="btn icon-btn danger-icon-btn" icon="pi pi-trash"
(click)="deleteAutoRoleRule(autoRoleRule)"></button> (click)="deleteAutoRoleRule(autoRoleRule)"></button>

View File

@ -22,14 +22,13 @@ import { Table } from "primeng/table";
import { AutoRoleMutationResult, AutoRoleRuleMutationResult } from "../../../../../../models/graphql/result.model"; import { AutoRoleMutationResult, AutoRoleRuleMutationResult } from "../../../../../../models/graphql/result.model";
import { Mutations } from "../../../../../../models/graphql/mutations.model"; import { Mutations } from "../../../../../../models/graphql/mutations.model";
import { Subject, throwError } from "rxjs"; import { Subject, throwError } from "rxjs";
import { ComponentWithTable } from "../../../../../../base/component-with-table";
@Component({ @Component({
selector: "app-auto-roles-rules", selector: "app-auto-roles-rules",
templateUrl: "./auto-roles-rules.component.html", templateUrl: "./auto-roles-rules.component.html",
styleUrls: ["./auto-roles-rules.component.scss"] styleUrls: ["./auto-roles-rules.component.scss"]
}) })
export class AutoRolesRulesComponent extends ComponentWithTable implements OnInit, OnDestroy { export class AutoRolesRulesComponent implements OnInit, OnDestroy {
rules: AutoRoleRule[] = []; rules: AutoRoleRule[] = [];
guild: Guild = { channels: [], emojis: [], roles: [] }; guild: Guild = { channels: [], emojis: [], roles: [] };
@ -81,7 +80,6 @@ export class AutoRolesRulesComponent extends ComponentWithTable implements OnIni
private route: ActivatedRoute, private route: ActivatedRoute,
private router: Router private router: Router
) { ) {
super('auto-role-rules', ['id', 'role', 'emoji']);
} }
public getEmojiUrl(name: string): string { public getEmojiUrl(name: string): string {

View File

@ -9,15 +9,11 @@
<ng-template pTemplate="caption"> <ng-template pTemplate="caption">
<div class="table-caption"> <div class="table-caption">
<div class="table-caption-table-info"> <div class="table-caption-text">
<div class="table-caption-text"> <ng-container *ngIf="!loading">{{auto_roles.length}} {{'common.of' | translate}}
<ng-container *ngIf="!loading">{{auto_roles.length}} {{'common.of' | translate}} {{dt.totalRecords}}
{{dt.totalRecords}} </ng-container>
</ng-container> {{'view.server.auto_roles.auto_roles' | translate}}
{{'view.server.auto_roles.auto_roles' | translate}}
</div>
<app-multi-select-columns [columns]="columns" [(hiddenColumns)]="hiddenColumns"></app-multi-select-columns>
</div> </div>
<div class="table-caption-btn-wrapper btn-wrapper"> <div class="table-caption-btn-wrapper btn-wrapper">
@ -33,37 +29,37 @@
<ng-template pTemplate="header"> <ng-template pTemplate="header">
<tr> <tr>
<th hideable-th="id" [parent]="this" [sortable]="true"> <th pSortableColumn="id">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.id' | translate}}</div> <div class="table-header-text">{{'common.id' | translate}}</div>
<p-sortIcon field="id" class="table-header-icon"></p-sortIcon> <p-sortIcon field="id" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="channel_id" [parent]="this" [sortable]="true"> <th pSortableColumn="discordChannelId">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.channel_id' | translate}}</div> <div class="table-header-text">{{'view.server.auto_roles.headers.channel_id' | translate}}</div>
<p-sortIcon field="channel_id" class="table-header-icon"></p-sortIcon> <p-sortIcon field="discordChannelId" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="channel_name" [parent]="this" [sortable]="true"> <th pSortableColumn="discordChannelName">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.channel_name' | translate}}</div> <div class="table-header-text">{{'view.server.auto_roles.headers.channel_name' | translate}}</div>
<p-sortIcon field="channel_name" class="table-header-icon"></p-sortIcon> <p-sortIcon field="discordChannelName" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="message_id" [parent]="this" [sortable]="true"> <th pSortableColumn="discordMessageId">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.message_id' | translate}}</div> <div class="table-header-text">{{'view.server.auto_roles.headers.message_id' | translate}}</div>
<p-sortIcon field="message_id" class="table-header-icon"></p-sortIcon> <p-sortIcon field="discordMessageId" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="rule_count" [parent]="this" [sortable]="true"> <th>
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.rule_count' | translate}}</div> <div class="table-header-text">{{'view.server.auto_roles.headers.role_count' | translate}}</div>
</div> </div>
</th> </th>
@ -87,27 +83,27 @@
</tr> </tr>
<tr> <tr>
<th hideable-th="id" [parent]="this" class="table-header-small"> <th class="table-header-small">
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="id" placeholder="{{'common.id' | translate}}"> <input type="text" pInputText formControlName="id" placeholder="{{'common.id' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="channel_id" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="channelId" placeholder="{{'common.channel_id' | translate}}"> <input type="text" pInputText formControlName="channelId" placeholder="{{'view.server.auto_roles.headers.channel_id' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="channel_name" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="channelName" placeholder="{{'common.channel_name' | translate}}"> <input type="text" pInputText formControlName="channelName" placeholder="{{'view.server.auto_roles.headers.channel_name' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="message_id" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="messageId" placeholder="{{'common.message_id' | translate}}"> <input type="text" pInputText formControlName="messageId" placeholder="{{'view.server.auto_roles.headers.message_id' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="rule_count" [parent]="this"></th> <th></th>
<th class="table-header-small-dropdown"></th> <th class="table-header-small-dropdown"></th>
<th class="table-header-small-dropdown"></th> <th class="table-header-small-dropdown"></th>
<th class="table-header-actions"></th> <th class="table-header-actions"></th>
@ -116,7 +112,7 @@
<ng-template pTemplate="body" let-autoRole let-editing="editing" let-ri="rowIndex"> <ng-template pTemplate="body" let-autoRole let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="autoRole"> <tr [pEditableRow]="autoRole">
<td hideable-td="id" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{autoRole.id}} {{autoRole.id}}
@ -127,11 +123,11 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="channel_id" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-dropdown [options]="channels" optionValue="value.id" [(ngModel)]="autoRole.channelId" <p-dropdown [options]="channels" optionValue="value.id" [(ngModel)]="autoRole.channelId"
placeholder="{{'common.channel_id' | translate}}"></p-dropdown> placeholder="{{'view.server.auto_roles.headers.channel_id' | translate}}"></p-dropdown>
</ng-template> </ng-template>
<ng-template pTemplate="output"> <ng-template pTemplate="output">
{{autoRole.channelId}} {{autoRole.channelId}}
@ -139,7 +135,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="channel_name" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{autoRole.channelName}} {{autoRole.channelName}}
@ -150,7 +146,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="message_id" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input pInputText class="table-edit-input" [(ngModel)]="autoRole.messageId"> <input pInputText class="table-edit-input" [(ngModel)]="autoRole.messageId">
@ -161,7 +157,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-td="rule_count" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{autoRole.autoRoleRuleCount}} {{autoRole.autoRoleRuleCount}}

View File

@ -22,14 +22,13 @@ import { Subject, throwError } from "rxjs";
import { AutoRole, AutoRoleFilter } from "../../../../../../models/data/auto_role.model"; import { AutoRole, AutoRoleFilter } from "../../../../../../models/data/auto_role.model";
import { ChannelType, Guild } from "../../../../../../models/data/discord.model"; import { ChannelType, Guild } from "../../../../../../models/data/discord.model";
import { Server } from "../../../../../../models/data/server.model"; import { Server } from "../../../../../../models/data/server.model";
import { ComponentWithTable } from "../../../../../../base/component-with-table";
@Component({ @Component({
selector: "app-auto-roles", selector: "app-auto-roles",
templateUrl: "./auto-roles.component.html", templateUrl: "./auto-roles.component.html",
styleUrls: ["./auto-roles.component.scss"] styleUrls: ["./auto-roles.component.scss"]
}) })
export class AutoRolesComponent extends ComponentWithTable implements OnInit, OnDestroy { export class AutoRolesComponent implements OnInit, OnDestroy {
auto_roles: AutoRole[] = []; auto_roles: AutoRole[] = [];
guild: Guild = { channels: [], emojis: [], roles: [] }; guild: Guild = { channels: [], emojis: [], roles: [] };
channels: MenuItem[] = []; channels: MenuItem[] = [];
@ -77,7 +76,6 @@ export class AutoRolesComponent extends ComponentWithTable implements OnInit, On
private sidebar: SidebarService, private sidebar: SidebarService,
private route: ActivatedRoute private route: ActivatedRoute
) { ) {
super('auto-role', ['id', 'channel_id', 'channel_name', 'message_id', 'rule_count'])
} }
public ngOnInit(): void { public ngOnInit(): void {

View File

@ -110,7 +110,7 @@ export class ConfigComponent implements OnInit {
return throwError(err); return throwError(err);
})).subscribe(result => { })).subscribe(result => {
this.spinner.hideSpinner(); this.spinner.hideSpinner();
this.toastService.success(this.translate.instant("view.server.config.message.server#_config_create"), this.translate.instant("view.server.config.message.server_config_create_d")); this.toastService.success(this.translate.instant("view.server.config.message.server_config_create"), this.translate.instant("view.server.config.message.server_config_create_d"));
}); });
} }
} }

View File

@ -9,15 +9,11 @@
<ng-template pTemplate="caption"> <ng-template pTemplate="caption">
<div class="table-caption"> <div class="table-caption">
<div class="table-caption-table-info"> <div class="table-caption-text">
<div class="table-caption-text"> <ng-container *ngIf="!loading">{{levels.length}} {{'common.of' | translate}}
<ng-container *ngIf="!loading">{{levels.length}} {{'common.of' | translate}} {{dt.totalRecords}}
{{dt.totalRecords}} </ng-container>
</ng-container> {{'view.server.levels.levels' | translate}}
{{'view.server.levels.levels' | translate}}
</div>
<app-multi-select-columns [columns]="columns" [(hiddenColumns)]="hiddenColumns"></app-multi-select-columns>
</div> </div>
<div class="table-caption-btn-wrapper btn-wrapper"> <div class="table-caption-btn-wrapper btn-wrapper">
@ -33,37 +29,37 @@
<ng-template pTemplate="header"> <ng-template pTemplate="header">
<tr> <tr>
<th hideable-th="id" [parent]="this" [sortable]="true"> <th pSortableColumn="id">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.id' | translate}}</div> <div class="table-header-text">{{'common.id' | translate}}</div>
<p-sortIcon field="id" class="table-header-icon"></p-sortIcon> <p-sortIcon field="id" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="name" [parent]="this" [sortable]="true"> <th pSortableColumn="name">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.name' | translate}}</div> <div class="table-header-text">{{'view.server.levels.headers.name' | translate}}</div>
<p-sortIcon field="name" class="table-header-icon"></p-sortIcon> <p-sortIcon field="name" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="color" [parent]="this" [sortable]="true"> <th pSortableColumn="color">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.color' | translate}}</div> <div class="table-header-text">{{'view.server.levels.headers.color' | translate}}</div>
<p-sortIcon field="color" class="table-header-icon"></p-sortIcon> <p-sortIcon field="color" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="min_xp" [parent]="this" [sortable]="true"> <th pSortableColumn="minXp">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.min_xp' | translate}}</div> <div class="table-header-text">{{'view.server.levels.headers.min_xp' | translate}}</div>
<p-sortIcon field="minXp" class="table-header-icon"></p-sortIcon> <p-sortIcon field="minXp" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="permissions" [parent]="this" [sortable]="true"> <th pSortableColumn="permissions">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.permissions' | translate}}</div> <div class="table-header-text">{{'view.server.levels.headers.permissions' | translate}}</div>
<p-sortIcon field="permissions" class="table-header-icon"></p-sortIcon> <p-sortIcon field="permissions" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
@ -88,21 +84,21 @@
</tr> </tr>
<tr> <tr>
<th hideable-th="id" [parent]="this" class="table-header-small"> <th class="table-header-small">
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="id" <input type="text" pInputText formControlName="id"
placeholder="{{'common.id' | translate}}"> placeholder="{{'common.id' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="name" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="name" <input type="text" pInputText formControlName="name"
placeholder="{{'common.name' | translate}}"> placeholder="{{'view.server.levels.headers.name' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="color" [parent]="this"></th> <th></th>
<th hideable-th="min_xp" [parent]="this"></th> <th></th>
<th hideable-th="permissions" [parent]="this"></th> <th></th>
<th class="table-header-small-dropdown"></th> <th class="table-header-small-dropdown"></th>
<th class="table-header-small-dropdown"></th> <th class="table-header-small-dropdown"></th>
<th class="table-header-actions"></th> <th class="table-header-actions"></th>
@ -111,7 +107,7 @@
<ng-template pTemplate="body" let-level let-editing="editing" let-ri="rowIndex"> <ng-template pTemplate="body" let-level let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="level"> <tr [pEditableRow]="level">
<td hideable-th="id" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{level.id}} {{level.id}}
@ -122,7 +118,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="name" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="text" [(ngModel)]="level.name"> <input class="table-edit-input" pInputText type="text" [(ngModel)]="level.name">
@ -133,7 +129,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="color" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="text" [(ngModel)]="level.color"> <input class="table-edit-input" pInputText type="text" [(ngModel)]="level.color">
@ -144,7 +140,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="min_xp" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText min="0" type="number" [(ngModel)]="level.minXp"> <input class="table-edit-input" pInputText min="0" type="number" [(ngModel)]="level.minXp">
@ -155,7 +151,7 @@
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="permissions" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<input class="table-edit-input" pInputText min="0" type="text" [(ngModel)]="level.permissions"> <input class="table-edit-input" pInputText min="0" type="text" [(ngModel)]="level.permissions">

View File

@ -22,14 +22,14 @@ import { Mutations } from "../../../../../../models/graphql/mutations.model";
import { Subject, throwError } from "rxjs"; import { Subject, throwError } from "rxjs";
import { Server } from "../../../../../../models/data/server.model"; import { Server } from "../../../../../../models/data/server.model";
import { UserDTO } from "../../../../../../models/auth/auth-user.dto"; import { UserDTO } from "../../../../../../models/auth/auth-user.dto";
import { ComponentWithTable } from "../../../../../../base/component-with-table";
@Component({ @Component({
selector: "app-levels", selector: "app-levels",
templateUrl: "./levels.component.html", templateUrl: "./levels.component.html",
styleUrls: ["./levels.component.scss"] styleUrls: ["./levels.component.scss"]
}) })
export class LevelsComponent extends ComponentWithTable implements OnInit, OnDestroy { export class LevelsComponent implements OnInit, OnDestroy {
public levels: Level[] = []; public levels: Level[] = [];
public loading = true; public loading = true;
@ -72,9 +72,7 @@ export class LevelsComponent extends ComponentWithTable implements OnInit, OnDes
private translate: TranslateService, private translate: TranslateService,
private data: DataService, private data: DataService,
private sidebar: SidebarService, private sidebar: SidebarService,
private route: ActivatedRoute private route: ActivatedRoute) {
) {
super("level", ["id", "name", "color", "min_xp", "permissions"]);
} }
public ngOnInit(): void { public ngOnInit(): void {
@ -98,8 +96,8 @@ export class LevelsComponent extends ComponentWithTable implements OnInit, OnDes
serverId: this.server.id, filter: this.filter, page: this.page, sort: this.sort serverId: this.server.id, filter: this.filter, page: this.page, sort: this.sort
}, },
(data: Query) => { (data: Query) => {
return data.servers[0]; return data.servers[0];
} }
).subscribe(data => { ).subscribe(data => {
this.totalRecords = data.levelCount; this.totalRecords = data.levelCount;
this.levels = data.levels; this.levels = data.levels;

View File

@ -9,15 +9,11 @@
<ng-template pTemplate="caption"> <ng-template pTemplate="caption">
<div class="table-caption"> <div class="table-caption">
<div class="table-caption-table-info"> <div class="table-caption-text">
<div class="table-caption-text"> <ng-container *ngIf="!loading">{{members.length}} {{'common.of' | translate}}
<ng-container *ngIf="!loading">{{members.length}} {{'common.of' | translate}} {{dt.totalRecords}}
{{dt.totalRecords}} </ng-container>
</ng-container> {{'view.server.members.members' | translate}}
{{'view.server.members.members' | translate}}
</div>
<app-multi-select-columns [columns]="columns" [(hiddenColumns)]="hiddenColumns"></app-multi-select-columns>
</div> </div>
<div class="table-caption-btn-wrapper btn-wrapper"> <div class="table-caption-btn-wrapper btn-wrapper">
@ -30,51 +26,51 @@
<ng-template pTemplate="header"> <ng-template pTemplate="header">
<tr> <tr>
<th hideable-th="id" [parent]="this" [sortable]="true"> <th pSortableColumn="id">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.id' | translate}}</div> <div class="table-header-text">{{'common.id' | translate}}</div>
<p-sortIcon field="id" class="table-header-icon"></p-sortIcon> <p-sortIcon field="id" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="discord_id" [parent]="this" [sortable]="true"> <th pSortableColumn="discordId">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.discord_id' | translate}}</div> <div class="table-header-text">{{'common.discord_id' | translate}}</div>
<p-sortIcon field="discordId" class="table-header-icon"></p-sortIcon> <p-sortIcon field="discordId" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="name" [parent]="this" [sortable]="true"> <th pSortableColumn="name">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.name' | translate}}</div> <div class="table-header-text">{{'view.server.members.headers.name' | translate}}</div>
<p-sortIcon field="name" class="table-header-icon"></p-sortIcon> <p-sortIcon field="name" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="xp" [parent]="this" [sortable]="true"> <th pSortableColumn="xp">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.xp' | translate}}</div> <div class="table-header-text">{{'view.server.members.headers.xp' | translate}}</div>
<p-sortIcon field="xp" class="table-header-icon"></p-sortIcon> <p-sortIcon field="xp" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="ontime" [parent]="this" [sortable]="true"> <th pSortableColumn="ontime">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.ontime' | translate}}</div> <div class="table-header-text">{{'view.server.members.headers.ontime' | translate}}</div>
<p-sortIcon field="ontime" class="table-header-icon"></p-sortIcon> <p-sortIcon field="ontime" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="left_server" [parent]="this" [sortable]="true"> <th pSortableColumn="leftServer">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.left_server' | translate}}</div> <div class="table-header-text">{{'view.server.members.headers.left_server' | translate}}</div>
<p-sortIcon field="leftServer" class="table-header-icon"></p-sortIcon> <p-sortIcon field="leftServer" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
<th hideable-th="level" [parent]="this" [sortable]="true"> <th pSortableColumn="level.name">
<div class="table-header-label"> <div class="table-header-label">
<div class="table-header-text">{{'common.level' | translate}}</div> <div class="table-header-text">{{'view.server.members.headers.level' | translate}}</div>
<p-sortIcon field="level.name" class="table-header-icon"></p-sortIcon> <p-sortIcon field="level.name" class="table-header-icon"></p-sortIcon>
</div> </div>
</th> </th>
@ -99,31 +95,31 @@
</tr> </tr>
<tr> <tr>
<th hideable-th="id" [parent]="this" class="table-header-small"> <th class="table-header-small">
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="id" placeholder="{{'common.id' | translate}}"> <input type="text" pInputText formControlName="id" placeholder="{{'common.id' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="discord_id" [parent]="this" class="table-header-medium"> <th class="table-header-medium">
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="discordId" placeholder="{{'common.discord_id' | translate}}"> <input type="text" pInputText formControlName="discordId" placeholder="{{'common.discord_id' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="name" [parent]="this"> <th>
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<input type="text" pInputText formControlName="name" placeholder="{{'common.name' | translate}}"> <input type="text" pInputText formControlName="name" placeholder="{{'view.server.members.headers.name' | translate}}">
</form> </form>
</th> </th>
<th hideable-th="xp" [parent]="this"></th> <th></th>
<th hideable-th="ontime" [parent]="this"></th> <th></th>
<th hideable-th="left_server" [parent]="this" class="table-header-small-dropdown"> <th class="table-header-small-dropdown">
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<p-dropdown formControlName="leftServer" [options]="leftServerOptions" placeholder="{{'common.left_server' | translate}}"></p-dropdown> <p-dropdown formControlName="leftServer" [options]="leftServerOptions" placeholder="{{'view.server.members.headers.left_server' | translate}}"></p-dropdown>
</form> </form>
</th> </th>
<th hideable-th="level" [parent]="this" class="table-header-small-dropdown"> <th class="table-header-small-dropdown">
<form [formGroup]="filterForm"> <form [formGroup]="filterForm">
<p-dropdown formControlName="level" [options]="levels" placeholder="{{'common.level' | translate}}"></p-dropdown> <p-dropdown formControlName="level" [options]="levels" placeholder="{{'view.server.members.headers.level' | translate}}"></p-dropdown>
</form> </form>
</th> </th>
<th></th> <th></th>
@ -134,7 +130,7 @@
<ng-template pTemplate="body" let-member let-editing="editing" let-ri="rowIndex"> <ng-template pTemplate="body" let-member let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="member"> <tr [pEditableRow]="member">
<td hideable-th="id" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{member.id}} {{member.id}}
@ -144,7 +140,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="discord_id" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{member.discordId}} {{member.discordId}}
@ -154,7 +150,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="name" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{member.name}} {{member.name}}
@ -164,7 +160,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="xp" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-inputNumber class="table-edit-input" styleClass="input-number" [(ngModel)]="member.xp" mode="decimal" [min]="0" [useGrouping]="false" [showButtons]="true" <p-inputNumber class="table-edit-input" styleClass="input-number" [(ngModel)]="member.xp" mode="decimal" [min]="0" [useGrouping]="false" [showButtons]="true"
@ -176,7 +172,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="ontime" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{member.ontime}} {{member.ontime}}
@ -186,7 +182,7 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="left_server" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
{{!member.leftServer | bool}} {{!member.leftServer | bool}}
@ -196,10 +192,10 @@
</ng-template> </ng-template>
</p-cellEditor> </p-cellEditor>
</td> </td>
<td hideable-th="level" [parent]="this"> <td>
<p-cellEditor> <p-cellEditor>
<ng-template pTemplate="input"> <ng-template pTemplate="input">
<p-dropdown [options]="levels" [(ngModel)]="member.level" placeholder="{{'common.level' | translate}}"></p-dropdown> <p-dropdown [options]="levels" [(ngModel)]="member.level" placeholder="{{'view.server.members.headers.level' | translate}}"></p-dropdown>
</ng-template> </ng-template>
<ng-template pTemplate="output"> <ng-template pTemplate="output">
{{member.level.name}} {{member.level.name}}

View File

@ -20,17 +20,19 @@ import { UpdateUserMutationResult } from "../../../../models/graphql/result.mode
import { ActivatedRoute } from "@angular/router"; import { ActivatedRoute } from "@angular/router";
import { Level } from "../../../../models/data/level.model"; import { Level } from "../../../../models/data/level.model";
import { Server } from "../../../../models/data/server.model"; import { Server } from "../../../../models/data/server.model";
import { ComponentWithTable } from "../../../../base/component-with-table";
@Component({ @Component({
selector: "app-members", selector: "app-members",
templateUrl: "./members.component.html", templateUrl: "./members.component.html",
styleUrls: ["./members.component.scss"] styleUrls: ["./members.component.scss"]
}) })
export class MembersComponent extends ComponentWithTable implements OnInit, OnDestroy { export class MembersComponent implements OnInit, OnDestroy {
members!: User[]; members!: User[];
levels!: MenuItem[]; levels!: MenuItem[];
leftServerOptions: { label: string; value: boolean; }[] = []; leftServerOptions = [
{ label: this.translate.instant("common.bool_as_string.true"), value: false },
{ label: this.translate.instant("common.bool_as_string.false"), value: true }
];
loading = true; loading = true;
clonedUsers: { [s: string]: User; } = {}; clonedUsers: { [s: string]: User; } = {};
@ -91,7 +93,6 @@ export class MembersComponent extends ComponentWithTable implements OnInit, OnDe
private data: DataService, private data: DataService,
private route: ActivatedRoute private route: ActivatedRoute
) { ) {
super("member", ["id", "discord_id", "name", "xp", "ontime", "left_server", "level"]);
} }
ngOnInit(): void { ngOnInit(): void {
@ -111,14 +112,9 @@ export class MembersComponent extends ComponentWithTable implements OnInit, OnDe
return { label: level.name, value: level }; return { label: level.name, value: level };
}); });
}); });
this.leftServerOptions = [
{ label: this.translate.instant("common.bool_as_string.true"), value: false },
{ label: this.translate.instant("common.bool_as_string.false"), value: true }
];
this.loadNextPage(); this.loadNextPage();
}); });
} }
public ngOnDestroy(): void { public ngOnDestroy(): void {
this.unsubscriber.next(); this.unsubscriber.next();
this.unsubscriber.complete(); this.unsubscriber.complete();

View File

@ -2,6 +2,15 @@
"admin": { "admin": {
"auth_users": { "auth_users": {
"header": "Benutzer", "header": "Benutzer",
"headers": {
"active": "Aktiv",
"auth_role": "Rolle",
"first_name": "Vorname",
"last_name": "Nachname",
"password": "Passwort",
"role": "Rolle",
"users": "Benutzer"
},
"message": { "message": {
"cannot_delete_user": "Benutzer kann nicht gelöscht werden", "cannot_delete_user": "Benutzer kann nicht gelöscht werden",
"invalid_email": "Ungültige E-Mail", "invalid_email": "Ungültige E-Mail",
@ -124,25 +133,15 @@
"common": { "common": {
"404": "404 - Der Eintrag konnte nicht gefunden werden", "404": "404 - Der Eintrag konnte nicht gefunden werden",
"actions": "Aktionen", "actions": "Aktionen",
"active": "Aktiv",
"add": "Hinzufügen", "add": "Hinzufügen",
"attribute": "Attribut",
"auth_role": "Rolle",
"bool_as_string": { "bool_as_string": {
"false": "Nein", "false": "Nein",
"true": "Ja" "true": "Ja"
}, },
"channel_id": "Kanal Id",
"channel_name": "Kanal",
"color": "Farbe",
"created_at": "Erstellt am", "created_at": "Erstellt am",
"description": "Beschreibung",
"discord_id": "Discord Id", "discord_id": "Discord Id",
"email": "E-Mail", "email": "E-Mail",
"emoji": "Emoji",
"error": "Fehler", "error": "Fehler",
"first_name": "Vorname",
"hidden_columns": "Ausgeblendete Spalten",
"history": { "history": {
"attribute": "Attribut", "attribute": "Attribut",
"autoRole": "Auto Rolle", "autoRole": "Auto Rolle",
@ -168,27 +167,13 @@
}, },
"id": "Id", "id": "Id",
"joined_at": "Beigetreten am", "joined_at": "Beigetreten am",
"last_name": "Nachname",
"leaved_at": "Verlassen am", "leaved_at": "Verlassen am",
"left_server": "Aktiv",
"level": "Level",
"message_id": "Nachricht Id",
"min_xp": "Min. XP",
"modified_at": "Bearbeitet am", "modified_at": "Bearbeitet am",
"name": "Name", "name": "Name",
"no_entries_found": "Keine Einträge gefunden", "no_entries_found": "Keine Einträge gefunden",
"of": "von", "of": "von",
"ontime": "Ontime",
"operator": "Operator",
"password": "Passwort",
"permissions": "Rechte",
"reset_filters": "Filter zurücksetzen", "reset_filters": "Filter zurücksetzen",
"role": "Rolle", "save": "Speichern"
"rule_count": "Regeln",
"save": "Speichern",
"users": "Benutzer",
"value": "Wert",
"xp": "XP"
}, },
"dialog": { "dialog": {
"abort": "Abbrechen", "abort": "Abbrechen",
@ -353,6 +338,13 @@
"achievements": { "achievements": {
"achievements": "Errungenschaften", "achievements": "Errungenschaften",
"header": "Errungenschaften", "header": "Errungenschaften",
"headers": {
"attribute": "Attribut",
"description": "Beschreibung",
"name": "Name",
"operator": "Operator",
"value": "Wert"
},
"message": { "message": {
"achievement_create": "Errungenschaft erstellt", "achievement_create": "Errungenschaft erstellt",
"achievement_create_d": "Errungenschaft {{name}} erfolgreich erstellt", "achievement_create_d": "Errungenschaft {{name}} erfolgreich erstellt",
@ -373,6 +365,12 @@
"auto_roles": { "auto_roles": {
"auto_roles": "Auto Rollen", "auto_roles": "Auto Rollen",
"header": "Auto Rollen", "header": "Auto Rollen",
"headers": {
"channel_id": "Kanal Id",
"channel_name": "Kanal",
"message_id": "Nachricht Id",
"role_count": "Regeln"
},
"message": { "message": {
"auto_role_create": "Auto Rolle erstellt", "auto_role_create": "Auto Rolle erstellt",
"auto_role_create_d": "Auto Rolle {{id}} erfolgreich erstellt", "auto_role_create_d": "Auto Rolle {{id}} erfolgreich erstellt",
@ -388,6 +386,10 @@
"rules": { "rules": {
"auto_roles": "Auto Rollen Regeln", "auto_roles": "Auto Rollen Regeln",
"header": "Auto Rollen Regeln", "header": "Auto Rollen Regeln",
"headers": {
"emoji": "Emoji",
"role": "Rolle"
},
"message": { "message": {
"auto_role_rule_create": "Auto Rollen Regel erstellt", "auto_role_rule_create": "Auto Rollen Regel erstellt",
"auto_role_rule_create_d": "Auto Rollen Regel {{id}} erfolgreich erstellt", "auto_role_rule_create_d": "Auto Rollen Regel {{id}} erfolgreich erstellt",
@ -444,6 +446,12 @@
"header": "Server", "header": "Server",
"levels": { "levels": {
"header": "Level", "header": "Level",
"headers": {
"color": "Farbe",
"min_xp": "Min. XP",
"name": "Name",
"permissions": "Rechte"
},
"levels": "Level", "levels": "Level",
"message": { "message": {
"level_create": "Level erstellt", "level_create": "Level erstellt",
@ -464,6 +472,13 @@
}, },
"members": { "members": {
"header": "Mitglieder", "header": "Mitglieder",
"headers": {
"left_server": "Aktiv",
"level": "Level",
"name": "Name",
"ontime": "Ontime",
"xp": "XP"
},
"members": "Mitgliedern", "members": "Mitgliedern",
"message": { "message": {
"user_change_failed": "Benutzeränderung fehlgeschlagen", "user_change_failed": "Benutzeränderung fehlgeschlagen",

View File

@ -2,6 +2,15 @@
"admin": { "admin": {
"auth_users": { "auth_users": {
"header": "User", "header": "User",
"headers": {
"active": "Active",
"auth_role": "Role",
"first_name": "First name",
"last_name": "Last name",
"password": "Password",
"role": "Role",
"users": "User"
},
"message": { "message": {
"cannot_delete_user": "User cannot be deleted", "cannot_delete_user": "User cannot be deleted",
"invalid_email": "Invalid E-Mail", "invalid_email": "Invalid E-Mail",
@ -124,25 +133,15 @@
"common": { "common": {
"404": "404 - Entry not found!", "404": "404 - Entry not found!",
"actions": "Actions", "actions": "Actions",
"active": "Active",
"add": "Add", "add": "Add",
"attribute": "Attribute",
"auth_role": "Role",
"bool_as_string": { "bool_as_string": {
"false": "No", "false": "No",
"true": "Yes" "true": "Yes"
}, },
"channel_id": "Channel Id",
"channel_name": "Channel",
"color": "Color",
"created_at": "Created at", "created_at": "Created at",
"description": "Description",
"discord_id": "Discord Id", "discord_id": "Discord Id",
"email": "E-Mail", "email": "E-Mail",
"emoji": "Emoji",
"error": "Error", "error": "Error",
"first_name": "First name",
"hidden_columns": "Hidden columns",
"history": { "history": {
"attribute": "Attribute", "attribute": "Attribute",
"autoRole": "Auto role", "autoRole": "Auto role",
@ -168,27 +167,13 @@
}, },
"id": "Id", "id": "Id",
"joined_at": "Joined at", "joined_at": "Joined at",
"last_name": "Last name",
"leaved_at": "Leaved at", "leaved_at": "Leaved at",
"left_server": "Active",
"level": "Level",
"message_id": "Message Id",
"min_xp": "Min. XP",
"modified_at": "Modified at", "modified_at": "Modified at",
"name": "Name", "name": "Name",
"no_entries_found": "No entries found", "no_entries_found": "No entries found",
"of": "of", "of": "of",
"ontime": "Ontime",
"operator": "Operator",
"password": "Password",
"permissions": "Permissions",
"reset_filters": "Reset filters", "reset_filters": "Reset filters",
"role": "Role", "save": "Save"
"rule_count": "Rules",
"save": "Save",
"users": "User",
"value": "Value",
"xp": "XP"
}, },
"dialog": { "dialog": {
"abort": "Abort", "abort": "Abort",
@ -353,6 +338,13 @@
"achievements": { "achievements": {
"achievements": "Achievements", "achievements": "Achievements",
"header": "Achievements", "header": "Achievements",
"headers": {
"attribute": "Attribute",
"description": "Description",
"name": "Namer",
"operator": "Operator",
"value": "Value"
},
"message": { "message": {
"achievement_create": "Achievement created", "achievement_create": "Achievement created",
"achievement_create_d": "Achievement {{name}} successfully created", "achievement_create_d": "Achievement {{name}} successfully created",
@ -373,6 +365,12 @@
"auto_roles": { "auto_roles": {
"auto_roles": "Auto roles", "auto_roles": "Auto roles",
"header": "Auto roles", "header": "Auto roles",
"headers": {
"channel_id": "Channel Id",
"channel_name": "Channel",
"message_id": "Message Id",
"role_count": "Rules"
},
"message": { "message": {
"auto_role_create": "Auto role created", "auto_role_create": "Auto role created",
"auto_role_create_d": "Auto role {{id}} created successfully", "auto_role_create_d": "Auto role {{id}} created successfully",
@ -388,6 +386,10 @@
"rules": { "rules": {
"auto_roles": "Auto role rules", "auto_roles": "Auto role rules",
"header": "Auto role rules", "header": "Auto role rules",
"headers": {
"emoji": "Emoji",
"role": "Role"
},
"message": { "message": {
"auto_role_rule_create": "Auto role rules created", "auto_role_rule_create": "Auto role rules created",
"auto_role_rule_create_d": "Auto role rule {{id}} successfully created", "auto_role_rule_create_d": "Auto role rule {{id}} successfully created",
@ -444,6 +446,12 @@
"header": "Server", "header": "Server",
"levels": { "levels": {
"header": "Level", "header": "Level",
"headers": {
"color": "Color",
"min_xp": "Min. XP",
"name": "Name",
"permissions": "Permissions"
},
"levels": "Level", "levels": "Level",
"message": { "message": {
"level_create": "Level created", "level_create": "Level created",
@ -464,6 +472,13 @@
}, },
"members": { "members": {
"header": "Members", "header": "Members",
"headers": {
"left_server": "Active",
"level": "Level",
"name": "Name",
"ontime": "Ontime",
"xp": "XP"
},
"members": "Members", "members": "Members",
"message": { "message": {
"user_change_failed": "User change failed", "user_change_failed": "User change failed",

View File

@ -2,6 +2,6 @@
"WebVersion": { "WebVersion": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "1",
"Micro": "dev79_hide_table_columns" "Micro": "0"
} }
} }

View File

@ -241,22 +241,9 @@ header {
.table-caption { .table-caption {
display: flex; display: flex;
.table-caption-table-info { .table-caption-text {
display: flex;
flex: 1; flex: 1;
flex-direction: row; font-weight: 400;
gap: 25px;
.table-caption-text {
display: flex;
align-items: center;
font-weight: 400;
}
.table-caption-column-select {
flex: 1;
}
} }
.table-caption-search { .table-caption-search {
@ -616,7 +603,3 @@ footer {
align-items: center; align-items: center;
} }
} }
.hidden-column {
display: none;
}

View File

@ -386,12 +386,7 @@
color: $primaryTextColor !important; color: $primaryTextColor !important;
.table-caption { .table-caption {
.table-caption-table-info { .table-caption-text {
.table-caption-text {
}
.table-caption-column-select {
}
} }
.table-caption-search-wrapper { .table-caption-search-wrapper {
@ -616,50 +611,4 @@
} }
} }
} }
.p-multiselect {
background-color: $primaryBackgroundColor !important;
color: $primaryTextColor !important;
&:focus,
&.p-focus,
&:not(.p-disabled):hover {
border-color: $primaryHeaderColor !important;
box-shadow: none !important;
}
.p-multiselect-panel {
.p-multiselect-header {
background-color: $primaryBackgroundColor !important;
}
.p-multiselect-items,
.p-multiselect-item {
background-color: $secondaryBackgroundColor !important;
}
.p-multiselect-item {
color: $primaryTextColor !important;
border: 1px solid transparent !important;
&:hover {
border: 1px solid $primaryHeaderColor !important;
color: $primaryHeaderColor !important;
}
&:focus {
box-shadow: none !important;
}
}
.p-checkbox .p-checkbox-box.p-highlight {
border-color: $primaryHeaderColor !important;
background: $primaryHeaderColor !important;
}
.p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover {
border-color: $primaryHeaderColor !important;
}
}
}
} }

View File

@ -386,12 +386,7 @@
color: $primaryTextColor !important; color: $primaryTextColor !important;
.table-caption { .table-caption {
.table-caption-table-info { .table-caption-text {
.table-caption-text {
}
.table-caption-column-select {
}
} }
.table-caption-search-wrapper { .table-caption-search-wrapper {
@ -616,50 +611,4 @@
} }
} }
} }
.p-multiselect {
background-color: $primaryBackgroundColor !important;
color: $primaryTextColor !important;
&:focus,
&.p-focus,
&:not(.p-disabled):hover {
border-color: $primaryHeaderColor !important;
box-shadow: none !important;
}
.p-multiselect-panel {
.p-multiselect-header {
background-color: $secondaryBackgroundColor !important;
}
.p-multiselect-items,
.p-multiselect-item {
background-color: $primaryBackgroundColor !important;
}
.p-multiselect-item {
color: $primaryTextColor !important;
border: 1px solid transparent !important;
&:hover {
border: 1px solid $primaryHeaderColor !important;
color: $primaryHeaderColor !important;
}
&:focus {
box-shadow: none !important;
}
}
.p-checkbox .p-checkbox-box.p-highlight {
border-color: $primaryHeaderColor !important;
background: $primaryHeaderColor !important;
}
.p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover {
border-color: $primaryHeaderColor !important;
}
}
}
} }

View File

@ -390,12 +390,7 @@
color: $primaryTextColor !important; color: $primaryTextColor !important;
.table-caption { .table-caption {
.table-caption-table-info { .table-caption-text {
.table-caption-text {
}
.table-caption-column-select {
}
} }
.table-caption-search-wrapper { .table-caption-search-wrapper {
@ -586,10 +581,8 @@
} }
.p-datatable .p-sortable-column.p-highlight, .p-datatable .p-sortable-column.p-highlight,
.p-datatable .p-sortable-column.p-highlight .p-sortable-column-icon, .p-datatable .p-sortable-column.p-highlight .p-sortable-column-icon {
.p-datatable .p-sortable-column:not(.p-highlight):hover{
color: $primaryHeaderColor !important; color: $primaryHeaderColor !important;
background-color: transparent !important;
} }
.p-dropdown:not(.p-disabled):hover, .p-dropdown:not(.p-disabled):hover,
@ -626,50 +619,4 @@
} }
} }
} }
.p-multiselect {
background-color: $primaryBackgroundColor !important;
color: $primaryTextColor !important;
&:focus,
&.p-focus,
&:not(.p-disabled):hover {
border-color: $primaryHeaderColor !important;
box-shadow: none !important;
}
.p-multiselect-panel {
.p-multiselect-header {
background-color: $primaryBackgroundColor !important;
}
.p-multiselect-items,
.p-multiselect-item {
background-color: $secondaryBackgroundColor !important;
}
.p-multiselect-item {
color: $primaryTextColor !important;
border: 1px solid transparent !important;
&:hover {
border: 1px solid $primaryHeaderColor !important;
color: $primaryHeaderColor !important;
}
&:focus {
box-shadow: none !important;
}
}
.p-checkbox .p-checkbox-box.p-highlight {
border-color: $primaryHeaderColor !important;
background: $primaryHeaderColor !important;
}
.p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover {
border-color: $primaryHeaderColor !important;
}
}
}
} }

View File

@ -386,12 +386,7 @@
color: $primaryTextColor !important; color: $primaryTextColor !important;
.table-caption { .table-caption {
.table-caption-table-info { .table-caption-text {
.table-caption-text {
}
.table-caption-column-select {
}
} }
.table-caption-search-wrapper { .table-caption-search-wrapper {
@ -616,50 +611,4 @@
} }
} }
} }
.p-multiselect {
background-color: $primaryBackgroundColor !important;
color: $primaryTextColor !important;
&:focus,
&.p-focus,
&:not(.p-disabled):hover {
border-color: $primaryHeaderColor !important;
box-shadow: none !important;
}
.p-multiselect-panel {
.p-multiselect-header {
background-color: $secondaryBackgroundColor !important;
}
.p-multiselect-items,
.p-multiselect-item {
background-color: $primaryBackgroundColor !important;
}
.p-multiselect-item {
color: $primaryTextColor !important;
border: 1px solid transparent !important;
&:hover {
border: 1px solid $primaryHeaderColor !important;
color: $primaryHeaderColor !important;
}
&:focus {
box-shadow: none !important;
}
}
.p-checkbox .p-checkbox-box.p-highlight {
border-color: $primaryHeaderColor !important;
background: $primaryHeaderColor !important;
}
.p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover {
border-color: $primaryHeaderColor !important;
}
}
}
} }