@kuzntsv/uikit 1.0.42 → 1.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kuzntsv-uikit-ui.mjs","names":[],"sources":["../../ui/src/auth/components/login-form/login-form.component.ts","../../ui/src/auth/components/login-form/login-form.component.html","../../ui/src/auth/components/permit-form/permit-form.component.ts","../../ui/src/auth/components/permit-form/permit-form.component.html","../../ui/src/services/avatar.service.ts","../../ui/src/shared/chip-input-autocomplete/chip-input-autocomplete.component.ts","../../ui/src/shared/chip-input-autocomplete/chip-input-autocomplete.component.html","../../ui/src/shared/date-range-input/models/custom-date-adapter.ts","../../ui/src/shared/date-range-input/models/date-range.ts","../../ui/src/shared/date-range-input/date-range-input.component.ts","../../ui/src/shared/date-range-input/date-range-input.component.html","../../ui/src/shared/dialog/dialog.component.ts","../../ui/src/shared/dialog/dialog.component.html","../../ui/src/shared/dialog/models/dialog-action.ts","../../ui/src/shared/empty/empty.ts","../../ui/src/base/base-toolbar/components/base-toolbar.component.ts","../../ui/src/base/base-toolbar/components/base-toolbar.component.html","../../ui/src/base/base-classes/base-class.ts","../../ui/src/base/base-classes/base-edit-dialog-data.ts","../../ui/src/base/base-classes/base-edit-class.ts","../../ui/src/base/base-classes/base-entity-action.ts","../../ui/src/base/base-classes/base-filter-class.ts","../../ui/src/base/base-classes/base-nav-bar-menu-class.ts","../../ui/src/services/local-storage-service.ts","../../ui/src/base/base-classes/base-page-class.ts","../../ui/src/base/base-classes/base-service-class.ts","../../ui/src/base/base-classes/base-signal-edit-class.ts","../../ui/src/base/base-classes/base-signal-filter-class.ts","../../ui/src/base/base-classes/base-signal-page-class.ts","../../ui/src/base/base-classes/base-signal-service-class.ts","../../ui/src/pipes/safe.pipe.ts","../../ui/src/pipes/time.pipe.ts","../../ui/src/pipes/truncate.pipe.ts","../../ui/src/shared/navbar/navbar.ts","../../ui/src/shared/navbar/navbar.html","../../ui/src/shared/not-found/not-found.component.ts","../../ui/src/shared/not-found/not-found.component.html","../../ui/src/shared/progress-spinner/progress-spinner.component.ts","../../ui/src/shared/select-autocomplete-with-vs/select-autocomplete-with-vs.component.ts","../../ui/src/shared/select-autocomplete-with-vs/select-autocomplete-with-vs.component.html","../../ui/src/shared/select-with-group/select-with-group.component.ts","../../ui/src/shared/select-with-group/select-with-group.component.html","../../ui/src/shared/table/table.component.ts","../../ui/src/shared/table/table.component.html","../../ui/src/services/loader.service.ts","../../ui/src/services/secure-image.service.ts","../../ui/src/services/export.service.ts","../../ui/src/services/sse/sse.service.ts","../../ui/src/auth/components/login-page/login-page.component.ts","../../ui/src/auth/components/login-page/login-page.component.html","../../ui/src/directives/disable-if-role.directive.ts","../../ui/src/directives/hide-if-role-not.directive.ts","../../ui/src/directives/set-value.directive.ts","../../ui/src/guards/auth-guard.service.ts","../../ui/src/guards/redirect-guard.ts","../../ui/src/guards/role-guard.service.ts","../../ui/src/logger/logger.config.ts","../../ui/src/logger/logger.service.ts","../../ui/src/logger/logger.provider.ts","../../ui/src/models/sec-user.model.ts"],"sourcesContent":["import {\n Component,\n effect,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { MatButton } from '@angular/material/button';\nimport {\n MatCard,\n MatCardContent,\n MatCardHeader,\n MatCardTitle,\n} from '@angular/material/card';\nimport {\n MatError,\n MatFormField,\n MatLabel,\n MatSuffix,\n} from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\n\nimport { Authenticate } from '../../models/authenticate';\n\n@Component({\n selector: 'ngx-uik-login-form',\n templateUrl: 'login-form.component.html',\n styleUrls: ['login-form.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatCard,\n MatCardHeader,\n MatCardTitle,\n MatCardContent,\n FormsModule,\n ReactiveFormsModule,\n MatFormField,\n MatLabel,\n MatInput,\n MatError,\n MatIcon,\n MatSuffix,\n MatButton,\n ],\n})\nexport class LoginFormComponent {\n pending = input<boolean>(false);\n errorMessage = input<string>('');\n submitted = output<Authenticate>();\n\n hide = true;\n\n form: FormGroup = new FormGroup({\n username: new FormControl('', [Validators.required]),\n password: new FormControl('', [Validators.required]),\n });\n\n constructor() {\n effect(() => {\n if (this.pending()) {\n this.form.disable();\n } else {\n this.form.enable();\n }\n });\n }\n\n submit() {\n if (this.form.valid) {\n this.submitted.emit(this.form.value);\n }\n }\n}\n","<mat-card appearance=\"outlined\">\r\n <mat-card-header>\r\n <mat-card-title>\r\n Авторизация\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\r\n <p>\r\n <mat-form-field>\r\n <mat-label>Имя пользователя</mat-label>\r\n <input type=\"text\" pattern=\"[A-Za-z]{1,}.[A-Za-z]{1,}.[A-Za-z]*\"\r\n matInput\r\n autocomplete=\"on\"\r\n name=\"login-form-username\"\r\n placeholder=\"Имя пользователя\"\r\n formControlName=\"username\">\r\n @if (form.controls['username'].hasError('pattern')) {\r\n <mat-error>\r\n Пожалуйста, используйте требуемый формат (Пример: a.p.petrov)\r\n </mat-error>\r\n }\r\n @if (form.controls['username'].hasError('required')) {\r\n <mat-error>\r\n Пожалуйста, заполните это поле\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n <p>\r\n <mat-form-field>\r\n <mat-label>Пароль</mat-label>\r\n <input [type]=\"hide ? 'password' : 'text'\" matInput placeholder=\"Пароль\" formControlName=\"password\">\r\n <mat-icon class=\"watcher\" matSuffix (mousedown)=\"hide=false\" (mouseup)=\"hide=true\"\r\n >{{ hide ? 'visibility_off' : 'visibility'}}</mat-icon>\r\n @if (form.controls['password'].hasError('required')) {\r\n <mat-error>\r\n Пожалуйста, заполните это поле\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n @if (errorMessage()) {\r\n <p class=\"loginError\">\r\n {{ errorMessage() }}\r\n </p>\r\n }\r\n\r\n <p class=\"loginButtons\">\r\n <button type=\"submit\" mat-button mat-stroked-button color=\"primary\" [disabled]=\"pending()\">Войти</button>\r\n </p>\r\n\r\n </form>\r\n </mat-card-content>\r\n </mat-card>\r\n","import {\n Component,\n ElementRef,\n HostListener,\n OnInit,\n output,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n MatCard,\n MatCardContent,\n MatCardHeader,\n MatCardTitle,\n} from '@angular/material/card';\n\n@Component({\n selector: 'ngx-uik-permit-form',\n templateUrl: 'permit-form.component.html',\n styleUrls: ['permit-form.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [MatCard, MatCardHeader, MatCardTitle, MatCardContent],\n})\nexport class PermitFormComponent implements OnInit {\n readonly hidy = viewChild<ElementRef>('hidy');\n\n submitted = output<string>();\n\n @HostListener('document:mouseup', ['$event'])\n mouseHandling(event: MouseEvent) {\n this.hidy()?.nativeElement.focus();\n }\n\n ngOnInit() {\n // Обнуляем значение Input\n const hidy = this.hidy();\n if (hidy) {\n hidy.nativeElement.value = null;\n hidy.nativeElement.focus();\n }\n }\n\n /**\n * Поле ввода\n *\n * @param событие нажатия на клавишу\n */\n onKeydown(event: any): void {\n if (event.key === 'Enter') {\n const permit = this.hidy()?.nativeElement.value;\n if (permit) {\n this.submitted.emit(permit);\n }\n }\n }\n}\n","<mat-card appearance=\"outlined\">\r\n <mat-card-header>\r\n <mat-card-title>\r\n Приложите пропуск\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <div class=\"permit\"></div>\r\n </mat-card-content>\r\n</mat-card>\r\n<input #hidy class=\"hidy\" type=\"text\" (keydown)=\"onKeydown($event)\"/>","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AvatarService {\r\n baseRoute = 'common/human/';\r\n\r\n private readonly http = inject(HttpClient);\r\n\r\n getAvatarById(idHuman: number): Observable<ArrayBuffer> {\r\n return this.http.get(this.baseRoute + idHuman + '/avatar', { responseType: 'arraybuffer' });\r\n }\r\n\r\n}\r\n","import { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport { AsyncPipe } from '@angular/common';\nimport {\n Component,\n effect,\n ElementRef,\n input,\n output,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n MatAutocompleteModule,\n MatAutocompleteSelectedEvent,\n MatOption,\n} from '@angular/material/autocomplete';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { Observable, startWith } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { ChipItem } from './models';\n\n@Component({\n selector: 'ngx-uik-chip-input-autocomplete',\n templateUrl: './chip-input-autocomplete.component.html',\n styleUrl: './chip-input-autocomplete.component.css',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatFormField,\n AsyncPipe,\n FormsModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n MatIcon,\n MatOption,\n MatChipsModule,\n MatLabel,\n ],\n})\nexport class BaseMatChipComponent {\n // Все элементы\n items = input<ChipItem[]>([]);\n // Выбранные элементы, ключи (ChipItem.value)\n selectedItemsInput = input<string[]>([]);\n // Заголовок\n title = input<string>('');\n // Событие изменения выбранных элементов\n selectedItemsChange = output<string[]>();\n\n readonly input = viewChild<ElementRef<HTMLInputElement>>('input');\n\n separatorKeysCodes: number[] = [ENTER, COMMA];\n inputCtrl = new FormControl();\n filteredItems$?: Observable<ChipItem[]>;\n selectedItems: ChipItem[] = [];\n\n constructor() {\n effect(() => {\n if (this.items().length > 0) {\n this.filteredItems$ = this.inputCtrl.valueChanges.pipe(\n startWith(null),\n map((item) => (item ? this._filter(item) : this.items().slice())),\n );\n }\n });\n\n effect(() => {\n if (this.selectedItemsInput())\n this.selectedItems = this.items().filter((s) =>\n this.selectedItemsInput().includes(s.value),\n );\n });\n }\n\n remove(value: string): void {\n this.selectedItems = [...this.selectedItems];\n const index = this.selectedItems.map((i) => i.value).indexOf(value);\n if (index >= 0) {\n this.selectedItems.splice(index, 1);\n this.selectedItemsChange.emit(this.selectedItems.map((i) => i.value));\n }\n }\n\n selected(event: MatAutocompleteSelectedEvent): void {\n this.selectedItems = [...this.selectedItems];\n const item = this.items().find((s) => s.value == event.option.value);\n if (item) {\n this.selectedItems.push(item);\n }\n this.selectedItemsChange.emit(this.selectedItems.map((i) => i.value));\n const inputValue = this.input();\n if (inputValue) inputValue.nativeElement.value = '';\n this.inputCtrl.setValue(null);\n }\n\n private _filter(value: string): ChipItem[] {\n const filterValue = value.toLowerCase();\n return this.items().filter((item) =>\n item.viewValue.toLowerCase().includes(filterValue),\n );\n }\n\n onCloseClick($event: MouseEvent) {\n $event.stopPropagation();\n this.selectedItemsChange.emit([]);\n }\n}\n","<mat-form-field class=\"chip-list\" appearance=\"fill\">\n <mat-label>{{ title() }}</mat-label>\n <mat-chip-grid #chipList aria-label=\"'Выбор '+title()\">\n @for (item of selectedItems; track item) {\n <mat-chip-row color=\"primary\" (removed)=\"remove(item.value)\">\n {{ item.viewValue }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <input\n #input\n [placeholder]=\"'Введите ' + title() + '...'\"\n [formControl]=\"inputCtrl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n @for (item of filteredItems$ | async; track item) {\n <mat-option\n [value]=\"item.value\"\n [disabled]=\"\n $safeNavigationMigration(selectedItemsInput()?.includes(item.value))\n \"\n >\n {{ item.viewValue }}\n </mat-option>\n }\n </mat-autocomplete>\n @if (selectedItems.length > 0) {\n <button\n matSuffix\n mat-icon-button\n aria-label=\"Clear\"\n (click)=\"onCloseClick($event)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n</mat-form-field>\n","import { Injectable } from '@angular/core';\r\nimport { NativeDateAdapter } from '@angular/material/core';\r\n\r\n@Injectable()\r\nexport class CustomDateAdapter extends NativeDateAdapter {\r\n \r\n // 1. Как дата ПАРСИТСЯ, когда пользователь вводит её руками в инпут\r\n override parse(value: any): Date | null {\r\n if (typeof value === 'string' && value.indexOf('.') > -1) {\r\n const str = value.split('.');\r\n const year = Number(str[2]);\r\n const month = Number(str[1]) - 1;\r\n const day = Number(str[0]);\r\n return new Date(year, month, day);\r\n }\r\n const timestamp = typeof value === 'number' ? value : Date.parse(value);\r\n return isNaN(timestamp) ? null : new Date(timestamp);\r\n }\r\n\r\n // 2. Как дата ОТОБРАЖАЕТСЯ в самом инпуте\r\n override format(date: Date, displayFormat: Object): string {\r\n if (displayFormat === 'input') {\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}.${month}.${year}`; // Наш строгий DD.MM.YYYY\r\n }\r\n // Для всех остальных элементов (выбор месяца, года) оставляем стандартное поведение локали\r\n return super.format(date, displayFormat);\r\n }\r\n}\r\n\r\n// Объект форматов для NativeDateAdapter\r\nexport const MY_NATIVE_FORMATS = {\r\n parse: {\r\n dateInput: 'input',\r\n },\r\n display: {\r\n dateInput: 'input', // Маркер 'input' будет перехвачен нашим методом format() выше\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n};","export interface DateRange {\r\n begin: string;\r\n end: string;\r\n}\r\n\r\nexport function dateFormat(date: Date | null | undefined): string {\r\n if (date && !isNaN(date.getTime())) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n \r\n return `${year}-${month}-${day}`;\r\n }\r\n return '';\r\n}\r\n","import {\n Component,\n effect,\n input,\n OnDestroy,\n OnInit,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';\nimport {\n MatDatepickerToggle,\n MatDateRangeInput,\n MatDateRangePicker,\n MatEndDate,\n MatStartDate,\n} from '@angular/material/datepicker';\nimport {\n MatError,\n MatFormField,\n MatLabel,\n MatSuffix,\n} from '@angular/material/form-field';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nimport { dateFormat, DateRange } from './models';\nimport { CustomDateAdapter, MY_NATIVE_FORMATS } from './models/custom-date-adapter';\n\n@Component({\n selector: 'ngx-uik-date-range-input',\n templateUrl: './date-range-input.component.html',\n styleUrls: ['./date-range-input.component.scss'],\n imports: [\n MatFormField,\n MatLabel,\n MatDateRangeInput,\n FormsModule,\n ReactiveFormsModule,\n MatStartDate,\n MatEndDate,\n MatDatepickerToggle,\n MatSuffix,\n MatDateRangePicker,\n MatError,\n ],\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\n { provide: DateAdapter, useClass: CustomDateAdapter },\n { provide: MAT_DATE_FORMATS, useValue: MY_NATIVE_FORMATS },\n ],\n})\nexport class DateRangeInputComponent implements OnInit, OnDestroy {\n label = input<string>('');\n dateRange = input<DateRange>(<DateRange>{ begin: '', end: '' });\n // eslint-disable-next-line no-magic-numbers\n minDate = input<Date>(new Date(2020, 0, 1));\n clearInput = input<any>(null);\n required = input<boolean>(false);\n dateRangeChange = output<DateRange>();\n\n form = new FormGroup({\n begin: new FormControl(),\n end: new FormControl(),\n });\n subscription = new Subscription();\n\n constructor() {\n effect(() => {\n if (this.clearInput()) this.form.reset();\n });\n\n effect(() => {\n const value = this.dateRange();\n if (this.form) {\n this.form.controls['begin'].setValue(\n value.begin ? new Date(value.begin) : null,\n );\n this.form.controls['end'].setValue(\n value.end ? new Date(value.begin) : null,\n );\n }\n this.dateRangeChange.emit(this.rangeToDateDateRange(this.form.value));\n });\n }\n\n ngOnInit() {\n if (this.required()) {\n this.form.controls['begin'].addValidators(Validators.required);\n this.form.controls['end'].addValidators(Validators.required);\n }\n\n // подписка на изменение периода\n this.form.valueChanges\n .pipe(\n // eslint-disable-next-line no-magic-numbers\n debounceTime(500),\n distinctUntilChanged(),\n )\n .subscribe({\n next: (range) => {\n if (this.required()) {\n if (range.begin && range.end) {\n this.dateRangeChange.emit(this.rangeToDateDateRange(range));\n }\n } else {\n this.dateRangeChange.emit(this.rangeToDateDateRange(range));\n }\n },\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) this.subscription.unsubscribe();\n }\n\n private rangeToDateDateRange(\n range: Partial<{ begin: Date; end: Date }>,\n ): DateRange {\n return {\n begin: range.begin ? dateFormat(range.begin) : '',\n end: range.end ? dateFormat(range.end) : '',\n };\n }\n}\n","<mat-form-field appearance=\"fill\">\r\n <mat-label>{{label()}}</mat-label>\r\n <mat-date-range-input\r\n [rangePicker]=\"picker\"\r\n [formGroup]=\"form\"\r\n [min]=\"minDate()\">\r\n <input matStartDate formControlName=\"begin\" placeholder=\"Дата начала\">\r\n <input matEndDate formControlName=\"end\" placeholder=\"Дата окончания\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n <mat-error>Укажите период</mat-error>\r\n</mat-form-field>\r\n\r\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { MatButton } from '@angular/material/button';\nimport {\n MAT_DIALOG_DATA,\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatDialogRef,\n MatDialogTitle,\n} from '@angular/material/dialog';\n\nimport { DialogData } from './models';\n\n@Component({\n selector: 'ngx-uik-dialog',\n templateUrl: './dialog.component.html',\n styleUrls: ['./dialog.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatDialogTitle,\n MatDialogContent,\n MatDialogActions,\n MatButton,\n MatDialogClose,\n ],\n})\nexport class DialogComponent {\n readonly data = inject<DialogData>(MAT_DIALOG_DATA);\n readonly dialogRef = inject(MatDialogRef<DialogComponent>);\n\n constructor() {\n if (!this.data.title) {\n this.data.title = 'Подтверждение';\n }\n if (!this.data.btnNoTitle) {\n this.data.btnNoTitle = 'Нет';\n }\n if (!this.data.btnYesTitle) {\n this.data.btnYesTitle = 'Да';\n }\n }\n\n onNoClick(): void {\n this.dialogRef.close();\n }\n}\n","<h1 mat-dialog-title>{{ data.title }}</h1>\r\n<div mat-dialog-content>\r\n <div style=\"white-space: pre-line\">{{ data.message }}</div>\r\n</div>\r\n<div mat-dialog-actions align=\"end\">\r\n <button mat-raised-button (click)=\"onNoClick()\" cdkFocusInitial>{{ data.btnNoTitle }}</button>\r\n <button mat-raised-button color=\"warn\" [mat-dialog-close]=\"data.id\">{{ data.btnYesTitle }}</button>\r\n</div>\r\n\r\n","export enum DialogAction {\r\n Add = 'Добавить',\r\n Edit = 'Изменить',\r\n Delete = 'Удалить',\r\n None = ''\r\n }","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'app-empty-route-guard-holder',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n template: '', // пустой шаблон, так как гуард сразу уводит пользователя со страницы\n})\nexport class EmptyComponent {}\n","import {\n Component,\n computed,\n inject,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatDivider } from '@angular/material/divider';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';\nimport { MatToolbar } from '@angular/material/toolbar';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { RoleService } from '@kuzntsv/uikit';\nimport { IContextMenuOptions } from '../../../shared/table';\n\n@Component({\n selector: 'ngx-uik-base-toolbar',\n templateUrl: 'base-toolbar.component.html',\n styleUrls: ['base-toolbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatToolbar,\n MatIconButton,\n MatTooltip,\n MatIcon,\n MatMenu,\n MatDivider,\n MatMenuTrigger,\n MatMenuItem,\n ],\n})\nexport class BaseToolbarComponent {\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesNewBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesEditBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesRemoveBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesCopyBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesExcelBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesCsvBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesPdfBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesPrintBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesRefreshBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesClearBtn = input<string[]>([]);\n\n // Состояния блокировки\n newBtnDisabled = input<boolean>(false);\n editBtnDisabled = input<boolean>(false);\n removeBtnDisabled = input<boolean>(false);\n copyBtnDisabled = input<boolean>(false);\n excelBtnDisabled = input<boolean>(false);\n csvBtnDisabled = input<boolean>(false);\n pdfBtnDisabled = input<boolean>(false);\n printBtnDisabled = input<boolean>(false);\n refreshBtnDisabled = input<boolean>(false);\n clearBtnDisabled = input<boolean>(false);\n\n // Тултипы\n newBtnTooltip = input<string>('Добавить');\n editBtnTooltip = input<string>('Изменить');\n removeBtnTooltip = input<string>('Удалить');\n copyBtnTooltip = input<string>('Скопировать');\n excelBtnTooltip = input<string>('Экспортировать в Excel');\n csvBtnTooltip = input<string>('Экспортировать в Csv');\n pdfBtnTooltip = input<string>('Экспортировать в Pdf');\n printBtnTooltip = input<string>('Печатать');\n refreshBtnTooltip = input<string>('Обновить данные');\n clearBtnTooltip = input<string>('Очистить фильтр');\n\n /** Список элементов контекстного меню. */\n newBtnOpt = input<IContextMenuOptions<string>[]>([]);\n\n // События\n clickedNewBtn = output();\n clickedEditBtn = output();\n clickedRemoveBtn = output();\n clickedCopyBtn = output();\n clickedExcelBtn = output();\n clickedCsvBtn = output();\n clickedPdfBtn = output();\n clickedPrintBtn = output();\n clickedRefreshBtn = output();\n clickedClearBtn = output();\n\n // DI\n // protected authService = inject(AuthService);\n protected roleService = inject(RoleService);\n\n // Вычисляемые сигналы видимости кнопок.\n readonly isNewBtnVisible = computed(() =>\n this.checkVisibility(this.rolesNewBtn()),\n );\n readonly isEditBtnVisible = computed(() =>\n this.checkVisibility(this.rolesEditBtn()),\n );\n readonly isRemoveBtnVisible = computed(() =>\n this.checkVisibility(this.rolesRemoveBtn()),\n );\n readonly isCopyBtnVisible = computed(() =>\n this.checkVisibility(this.rolesCopyBtn()),\n );\n readonly isExcelBtnVisible = computed(() =>\n this.checkVisibility(this.rolesExcelBtn()),\n );\n readonly isCsvBtnVisible = computed(() =>\n this.checkVisibility(this.rolesCsvBtn()),\n );\n readonly isPdfBtnVisible = computed(() =>\n this.checkVisibility(this.rolesPdfBtn()),\n );\n readonly isPrintBtnVisible = computed(() =>\n this.checkVisibility(this.rolesPrintBtn()),\n );\n readonly isRefreshBtnVisible = computed(() =>\n this.checkVisibility(this.rolesRefreshBtn()),\n );\n readonly isClearBtnVisible = computed(() =>\n this.checkVisibility(this.rolesClearBtn()),\n );\n\n /**\n * Внутренний метод для вычисления видимости.\n * Не вызывается напрямую из шаблона, а служит хелпером для декларативных computed.\n * Проверяет, заблокирован ли доступ к элементу на основе списка ограничений.\n * Возвращает true, если у пользователя есть запрещенная роль или передан маркер 'HIDE'.\n * Администратор (ADMIN) всегда игнорирует любые запреты и маркер 'HIDE'.\n */\n private checkVisibility(forbiddenRoles: string[]): boolean {\n return !this.roleService.hasForbiddenRole(forbiddenRoles);\n }\n\n onNewClick() {\n this.clickedNewBtn.emit();\n }\n\n onEditClick() {\n this.clickedEditBtn.emit();\n }\n\n onRemoveClick() {\n this.clickedRemoveBtn.emit();\n }\n\n onCopyClick() {\n this.clickedCopyBtn.emit();\n }\n\n onExcelClick() {\n this.clickedExcelBtn.emit();\n }\n\n onCsvClick() {\n this.clickedCsvBtn.emit();\n }\n\n onPdfClick() {\n this.clickedPdfBtn.emit();\n }\n\n onPrintClick() {\n this.clickedPrintBtn.emit();\n }\n\n onRefreshGridClick() {\n this.clickedRefreshBtn.emit();\n }\n\n onClearClick() {\n this.clickedClearBtn.emit();\n }\n}\n","<mat-toolbar>\r\n @if (isNewBtnVisible()) {\r\n @if (newBtnOpt() && newBtnOpt().length > 0) {\r\n <button [disabled]=\"newBtnDisabled()\" [matMenuTriggerFor]=\"menuNewBtn\"\r\n mat-icon-button [matTooltip]=\"newBtnTooltip()\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <mat-menu #menuNewBtn=\"matMenu\">\r\n @for (menuItem of newBtnOpt(); track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn('') : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn('') : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n } \r\n @else {\r\n <button [disabled]=\"newBtnDisabled()\" (click)=\"onNewClick()\"\r\n mat-icon-button routerLink=\"new\" routerLinkActive=\"active\" [matTooltip]=\"newBtnTooltip()\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if (isEditBtnVisible()) {\r\n <button [disabled]=\"editBtnDisabled()\" (click)=\"onEditClick()\"\r\n mat-icon-button routerLink=\"edit\" color=\"primary\" routerLinkActive=\"active\" [matTooltip]=\"editBtnTooltip()\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n }\r\n @if (isRemoveBtnVisible()) {\r\n <button [disabled]=\"removeBtnDisabled()\" (click)=\"onRemoveClick()\"\r\n mat-icon-button routerLink=\"delete\" color=\"warn\" routerLinkActive=\"active\" [matTooltip]=\"removeBtnTooltip()\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n }\r\n @if (isCopyBtnVisible()) {\r\n <button [disabled]=\"copyBtnDisabled()\" (click)=\"onCopyClick()\"\r\n mat-icon-button routerLink=\"delete\" routerLinkActive=\"active\" [matTooltip]=\"copyBtnTooltip()\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n }\r\n @if (isExcelBtnVisible()) {\r\n <button [disabled]=\"excelBtnDisabled()\" (click)=\"onExcelClick()\"\r\n mat-icon-button routerLink=\"excel\" routerLinkActive=\"active\" [matTooltip]=\"excelBtnTooltip()\">\r\n <mat-icon class=\"material-icons-outlined\">explicit</mat-icon>\r\n </button>\r\n }\r\n @if (isCsvBtnVisible()) {\r\n <button [disabled]=\"csvBtnDisabled()\" (click)=\"onCsvClick()\"\r\n mat-icon-button routerLink=\"csv\" routerLinkActive=\"active\" [matTooltip]=\"csvBtnTooltip()\">\r\n <mat-icon class=\"material-icons-outlined\">download</mat-icon>\r\n </button>\r\n }\r\n @if (isPdfBtnVisible()) {\r\n <button [disabled]=\"pdfBtnDisabled()\" (click)=\"onPdfClick()\"\r\n mat-icon-button routerLink=\"pdf\" routerLinkActive=\"active\" [matTooltip]=\"pdfBtnTooltip()\">\r\n <mat-icon class=\"material-icons-outlined\">picture_as_pdf</mat-icon>\r\n </button>\r\n }\r\n @if (isPrintBtnVisible()) {\r\n <button [disabled]=\"printBtnDisabled()\" (click)=\"onPrintClick()\"\r\n mat-icon-button routerLink=\"print\" routerLinkActive=\"active\" [matTooltip]=\"printBtnTooltip()\">\r\n <mat-icon class=\"material-icons-outlined\">print_outline</mat-icon>\r\n </button>\r\n }\r\n @if (isRefreshBtnVisible()) {\r\n <button [disabled]=\"refreshBtnDisabled()\" (click)=\"onRefreshGridClick()\"\r\n mat-icon-button routerLink=\"refresh\" routerLinkActive=\"active\" [matTooltip]=\"refreshBtnTooltip()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n }\r\n @if (isClearBtnVisible()) {\r\n <button [disabled]=\"clearBtnDisabled()\" (click)=\"onClearClick()\"\r\n mat-icon-button routerLink=\"clear\" routerLinkActive=\"active\" [matTooltip]=\"clearBtnTooltip()\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n }\r\n</mat-toolbar>\r\n","import { z } from 'zod';\r\n\r\n// Базовая схема, описывающая, что у каждого объекта ДОЛЖЕН быть id\r\nexport const BaseSchema = z.object({\r\n id: z.number(),\r\n});\r\n\r\n// TypeScript тип для базового объекта\r\nexport type BaseSchemaClass = z.infer<typeof BaseSchema>;\r\n\r\n/** @deprecated */\r\nexport interface BaseClass {\r\n id: number;\r\n}\r\n","/** Объект передаваемый в диалог формы редактирования, оперирует доменной моделью. */\r\nexport interface IEditDialogData<T, K = any> {\r\n action: Action;\r\n /** Здесь всегда доменная модель */\r\n entity: T;\r\n /** Дополнительные данные, например, фото. */\r\n extraData?: K;\r\n}\r\n\r\nexport enum Action {\r\n Add = 'Добавление',\r\n Edit = 'Изменение'\r\n}\r\n","import { Directive, inject, OnDestroy } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { Subscription } from 'rxjs';\r\nimport { NotificationService, RoleService } from '@kuzntsv/uikit';\r\n\r\nimport { Action, IEditDialogData } from './base-edit-dialog-data';\r\nimport { LoaderService } from '../../services';\r\n\r\n@Directive()\r\nexport abstract class BaseEditClass<T> implements OnDestroy {\r\n /** Заголовок. */\r\n public abstract title: string;\r\n /** Данные диалога. */\r\n protected abstract dialogData?: IEditDialogData<T>;\r\n /** Форма. */\r\n public abstract form?: FormGroup<any>;\r\n /** Ссылка на диалог. */\r\n protected abstract dialogRef?: MatDialogRef<any, IEditDialogData<T> | null>;\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n /** Сервис ролей. */\r\n protected roleService = inject(RoleService);\r\n\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента). */\r\n protected subscription = new Subscription();\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n onNoClick(event: MouseEvent): void {\r\n this.dialogRef?.close(null);\r\n event.preventDefault(); // иначе сработает onSubmit\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.form) {\r\n if (this.form.valid) {\r\n if (this.dialogData)\r\n Object.keys(this.form.controls).forEach(\r\n (controlName) =>\r\n (this.dialogData!.entity[controlName as keyof T] =\r\n this.form?.controls[controlName].value),\r\n );\r\n this.dialogRef?.close(this.dialogData);\r\n } else {\r\n Object.keys(this.form.controls).forEach((controlName) =>\r\n this.form?.controls[controlName].markAsTouched(),\r\n );\r\n }\r\n }\r\n }\r\n\r\n formActionIsAdd(): boolean {\r\n return this.dialogData?.action === Action.Add;\r\n }\r\n\r\n formActionIsEdit(): boolean {\r\n return this.dialogData?.action === Action.Edit;\r\n }\r\n\r\n /**\r\n * Определяет видимость элемента на основе ЧЕРНОГО списка ролей.\r\n * По умолчанию элемент ВИДИМ. Скрывается (возвращает false), если у пользователя\r\n * есть запрещенная роль или если передан маркер скрытия фичи HIDE_ROLE_MARKER.\r\n */\r\n protected isVisibleForForbiddenRoles(forbiddenRoles: string[]): boolean {\r\n // Если роль запрещена, метод roleService вернет true.\r\n // Мы инвертируем (!), чтобы видимость (isMenuVisible) стала false.\r\n return !this.roleService.hasForbiddenRole(forbiddenRoles);\r\n }\r\n\r\n /**\r\n * Определяет видимость элемента на основе БЕЛОГО списка ролей.\r\n * По умолчанию элемент СКРЫТ. Показывается (возвращает true), только если у пользователя\r\n * есть хотя бы одна из разрешенных ролей. Администратор (ADMIN) всегда видит элемент.\r\n */\r\n protected isVisibleForAllowedRoles(allowedRoles: string[]): boolean {\r\n // Проверяем, есть ли у пользователя хотя бы одна роль из разрешенного списка.\r\n // (Предполагается, что у вашего roleService есть соответствующий метод, например, hasAnyRole)\r\n return this.roleService.hasAnyRole(allowedRoles);\r\n }\r\n}\r\n","export interface IEntityAction<T> {\r\n action: EntityAction;\r\n entity: T | undefined;\r\n}\r\n\r\nexport enum EntityAction {\r\n Init = 'Инициализация',\r\n Add = 'Добавление',\r\n Edit = 'Изменение',\r\n Delete = 'Удаление'\r\n}\r\n","import { Directive, inject, OnDestroy } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { LoaderService, LocalStorageService } from '../../services';\r\nimport { NotificationService } from '@kuzntsv/uikit';\r\n\r\n@Directive()\r\nexport class BaseFilterClass implements OnDestroy {\r\n\r\n /** Сервис для работы с LocalStorage. */\r\n protected localStorageService = inject(LocalStorageService);\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultDebounceTime = 500;\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента). */\r\n subscription = new Subscription();\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n}","import { Directive, inject } from \"@angular/core\";\r\nimport { MatMenuTrigger } from \"@angular/material/menu\";\r\nimport { Router } from \"@angular/router\";\r\nimport { RoleService } from '@kuzntsv/uikit';\r\n\r\n@Directive()\r\nexport class BaseNavBarMenuClass {\r\n\r\n protected roleService = inject(RoleService);\r\n protected router = inject(Router);\r\n\r\n /** \r\n * Определяет видимость пункта меню на основе ЧЕРНОГО списка ролей.\r\n * По умолчанию пункт меню ВИДИМ. Скрывается (возвращает false), если у пользователя \r\n * есть запрещенная роль или если передан маркер скрытия фичи HIDE_ROLE_MARKER.\r\n */\r\n protected isVisibleForForbiddenRoles(forbiddenRoles: string[]): boolean {\r\n // Если роль запрещена, метод roleService вернет true. \r\n // Мы инвертируем (!), чтобы видимость (isMenuVisible) стала false.\r\n return !this.roleService.hasForbiddenRole(forbiddenRoles);\r\n }\r\n\r\n /** \r\n * Определяет видимость пункта меню на основе БЕЛОГО списка ролей.\r\n * По умолчанию пункт меню СКРЫТ. Показывается (возвращает true), только если у пользователя \r\n * есть хотя бы одна из разрешенных ролей. Администратор (ADMIN) всегда видит элемент.\r\n */\r\n protected isVisibleForAllowedRoles(allowedRoles: string[]): boolean {\r\n // Проверяем, есть ли у пользователя хотя бы одна роль из разрешенного списка.\r\n // (Предполагается, что у вашего roleService есть соответствующий метод, например, hasAnyRole)\r\n return this.roleService.hasAnyRole(allowedRoles);\r\n }\r\n\r\n /** Нажата средняя кнопка (открыть ссылку в новой вкладке). */\r\n onMiddleClick(event: MouseEvent, baseUrl: string, menu: MatMenuTrigger) {\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if (event.button === 1) {\r\n // event.preventDefault();\r\n menu.closeMenu();\r\n const urlTree = this.router.serializeUrl(\r\n this.router.createUrlTree([baseUrl]\r\n )\r\n );\r\n window.open(urlTree, '_blank');\r\n }\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalStorageService {\r\n\r\n constructor() { }\r\n\r\n public saveData(key: string, value: string) {\r\n localStorage.setItem(key, value);\r\n }\r\n\r\n public getData(key: string) {\r\n return localStorage.getItem(key)\r\n }\r\n public removeData(key: string) {\r\n localStorage.removeItem(key);\r\n }\r\n\r\n public clearData() {\r\n localStorage.clear();\r\n }\r\n\r\n}\r\n","import { Directive, OnDestroy, inject, signal } from '@angular/core';\r\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { Router } from '@angular/router';\r\nimport { Subject, Subscription, forkJoin, map, switchMap, tap } from 'rxjs';\r\n\r\nimport { LocalStorageService } from '../../services/local-storage-service';\r\nimport { DialogComponent } from '../../shared/dialog/dialog.component';\r\nimport { IContextMenuOptions, IPageState, ISortState, ITableState } from '../../shared/table';\r\nimport { ObjectKeys, SortDirection, fnCbType, fnGetCountType, fnGetDataType, fnMapEntityType, fnType } from '../../types/types';\r\nimport { Action, IEditDialogData } from './base-edit-dialog-data';\r\nimport { LoaderService } from '../../services';\r\nimport { NotificationService } from '@kuzntsv/uikit';\r\n\r\n@Directive()\r\nexport class BasePageClass<T> implements OnDestroy {\r\n\r\n protected dialog = inject(MatDialog);\r\n\r\n /** Данные для табличного компонента. */\r\n data = signal<T[]>([]);\r\n /** Количество записей по фильтру. */\r\n length = signal<number>(0);\r\n\r\n entityService: any;\r\n entityType: any;\r\n entityEditComponent: any;\r\n extraData?: any;\r\n\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultPageIndex = 0;\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultPageSize = 10;\r\n\r\n dialogEditWidth = 'auto';\r\n dialogRemoveWidth = '400px';\r\n\r\n routeAddress: string = '';\r\n\r\n /** Сообщение при удалении записи(й). */\r\n removalMessage: string = '';\r\n /** Заголовок страницы. */\r\n pageTitle: string = '';\r\n\r\n /**\r\n * Создание записи: вызывается перед открытием диалога.\r\n */\r\n beforeOpenDialogOnNewEvent: fnType<T>;\r\n /**\r\n * Редактирование записи: вызывается перед открытием диалога.\r\n */\r\n beforeOpenDialogOnEditEvent: fnType<T>;\r\n /**\r\n * Создание записи: вызывается перед сохранением объекта.\r\n */\r\n beforeSaveOnNewEvent: fnType<T>;\r\n /**\r\n * Редактирование записи: вызывается перед сохранением объекта.\r\n */\r\n beforeSaveOnEditEvent: fnType<T>;\r\n /**\r\n * Создание записи: вызывается после сохранения объекта.\r\n */\r\n afterSaveOnNewEvent: fnCbType<T>;\r\n /**\r\n * Редактирование записи: вызывается после сохранения объекта.\r\n */\r\n afterSaveOnEditEvent: fnCbType<T>;\r\n\r\n editorRoles: string[] = [];\r\n executeRoles: string[] = [];\r\n /** Список ролей, для которых скрыть элемент. */\r\n hideRoles: string[] = ['HIDE'];\r\n\r\n /** Загрузка данных. */\r\n loadData$: Subject<null> = new Subject<null>();\r\n /** Загрузка количества записей. */\r\n loadLength$: Subject<null> = new Subject<null>();\r\n /** Очистка фильтра. */\r\n clearFilter$: Subject<null> = new Subject<null>();\r\n\r\n /** Очистка фильтра (для очистки присвоить пустой объект '{}'). */\r\n clearFilter: any = null;\r\n\r\n /** Разрешен выбор нескольких строк. */\r\n allowMultiSelect = false;\r\n /** Выбранные строки в таблице. */\r\n selected: T[] = [];\r\n\r\n /** Состояние сортировки, пагинации. */\r\n tableState: ITableState;\r\n\r\n /** Доступность кнопки \"Изменить\". */\r\n editBtnDisabled = true;\r\n /** Доступность кнопки \"Удалить\". */\r\n removeBtnDisabled = true;\r\n\r\n /** Разрешено ли отправлять событие rowDoubleClicked при двойном щелчке мышью. */\r\n dblClickedEventEnable = true;\r\n\r\n // Список элементов контекстного меню.\r\n opt: IContextMenuOptions<T>[] = [];\r\n\r\n // DI\r\n protected router = inject(Router);\r\n /** Сервис для работы с LocalStorage. */\r\n protected localStorageService = inject(LocalStorageService);\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента). */\r\n subscription = new Subscription();\r\n\r\n constructor() {\r\n this.tableState = {\r\n sortActive: this.localStorageService.getData(this.constructor.name + 'SortActive') || '',\r\n sortDirection: (this.localStorageService.getData(this.constructor.name + 'SortDirection') || '') as SortDirection,\r\n pageIndex: Number(this.localStorageService.getData(this.constructor.name + 'PageIndex')) || this.defaultPageIndex,\r\n pageSize: Number(this.localStorageService.getData(this.constructor.name + 'PageSize')) || this.defaultPageSize\r\n };\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n subscribeToLoadData( fnGetData: fnGetDataType<T>, fnGetCount: fnGetCountType<T>, fnMapEntity?: fnMapEntityType<T>) {\r\n // отменять стримы, созданные ранее\r\n const subs = this.loadData$\r\n .pipe(\r\n tap(() => this.loaderService.show()),\r\n switchMap(() => fnGetData()),\r\n map(v => fnMapEntity ? v.map(fnMapEntity()) : v),\r\n )\r\n .subscribe({\r\n next: (response: T[]) => {\r\n this.data.set(response);\r\n this.loaderService.hide();\r\n },\r\n error: (error: any) => {\r\n this.loaderService.hide();\r\n console.log(error);\r\n this.notificationService.error('Произошла ошибка: ' + error, 0);\r\n }\r\n });\r\n this.subscription?.add(subs);\r\n\r\n const subs2 = this.loadLength$\r\n .pipe(\r\n switchMap(() => fnGetCount())\r\n )\r\n .subscribe({\r\n next: (response: number) => {\r\n this.length.set(response);\r\n },\r\n error: (error: any) => {\r\n console.log(error);\r\n this.notificationService.error('Произошла ошибка: ' + error, 0);\r\n }\r\n });\r\n this.subscription?.add(subs2);\r\n\r\n // загрузить данные и количество записей\r\n this.loadData$.next(null);\r\n this.loadLength$.next(null);\r\n }\r\n\r\n onPageChange(pageState: IPageState) {\r\n this.tableState.pageIndex = pageState.pageIndex;\r\n this.tableState.pageSize = pageState.pageSize;\r\n this.localStorageService.saveData(this.constructor.name + 'PageIndex', pageState.pageIndex.toString());\r\n this.localStorageService.saveData(this.constructor.name + 'PageSize', pageState.pageSize.toString());\r\n\r\n this.loadData$.next(null);\r\n this.loadLength$.next(null);\r\n }\r\n\r\n onSortChange(sortState: ISortState) {\r\n this.tableState.sortActive = sortState.sortActive;\r\n this.tableState.sortDirection = sortState.sortDirection;\r\n this.localStorageService.saveData(this.constructor.name + 'SortActive', sortState.sortActive);\r\n this.localStorageService.saveData(this.constructor.name + 'SortDirection', sortState.sortDirection);\r\n\r\n this.loadData$.next(null);\r\n this.loadLength$.next(null);\r\n }\r\n\r\n entityFactory(type: new () => T): T {\r\n return new type();\r\n }\r\n\r\n /** Событие изменение выбранных записей. */\r\n onSelectionChange(selected: T[]) {\r\n this.selected = selected;\r\n this.editBtnDisabledUpdate(this.selected);\r\n this.removeBtnDisabledUpdate(this.selected);\r\n }\r\n\r\n /** Обновление доступности кнопки \"Изменить\" - вызывается при изменении выбранных записей. */\r\n editBtnDisabledUpdate(selected: T[]) {\r\n this.editBtnDisabled = !(selected && selected.length === 1);\r\n }\r\n\r\n /** Обновление доступности кнопки \"Удалить\" - вызывается при изменении выбранных записей. */\r\n removeBtnDisabledUpdate(selected: T[]) {\r\n this.removeBtnDisabled = !(selected && selected.length > 0);\r\n }\r\n\r\n /** Событие двойной клик. */\r\n onRowDoubleClicked() {\r\n this.editEvent();\r\n }\r\n\r\n /** Событие создание. */\r\n newEvent() {\r\n if (this.entityEditComponent) {\r\n const data: IEditDialogData<T> = { action: Action.Add, entity: new this.entityType(null) };\r\n\r\n // Назначить значения полей объекта перед открытием диалога.\r\n if (this.beforeOpenDialogOnNewEvent) {\r\n this.beforeOpenDialogOnNewEvent(data.entity, data.extraData);\r\n }\r\n\r\n // Открытие окна\r\n const dialogRef = this.openDialog(this.entityEditComponent, data, this.dialog);\r\n\r\n // Обработка закрытия окна\r\n const subs = dialogRef.afterClosed().subscribe((result: IEditDialogData<T>) => {\r\n // Проверка результата\r\n if (result && result.entity && (Object.keys(result.entity).length !== 0)) {\r\n // Дополнительные действия перед сохранением объекта.\r\n if (this.beforeSaveOnNewEvent)\r\n this.beforeSaveOnNewEvent(result.entity, result.extraData);\r\n\r\n const subs = this.entityService.newObject(result.entity)\r\n .subscribe({\r\n next: (obj: any) => {\r\n // Дополнительные действия после сохранения объекта.\r\n if (this.afterSaveOnNewEvent) {\r\n const callback = () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись добавлена.');\r\n }\r\n this.afterSaveOnNewEvent(callback.bind(this), obj, result.extraData);\r\n } else {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись добавлена.');\r\n }\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error('Произошла ошибка при добавлении записи: ' + error, 0);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n } else {\r\n this.notificationService.warning('Действие не доступно.');\r\n }\r\n }\r\n\r\n /** Событие редактирование. */\r\n editEvent() {\r\n if (this.selected && this.selected.length === 1) {\r\n if (this.entityEditComponent) {\r\n const data: IEditDialogData<T> = { action: Action.Edit, entity: this.selected[0] };\r\n\r\n // Назначить значения полей объекта перед открытием диалога.\r\n if (this.beforeOpenDialogOnEditEvent) {\r\n this.beforeOpenDialogOnEditEvent(data.entity, data.extraData);\r\n }\r\n\r\n // Открытие окна\r\n const dialogRef = this.openDialog(this.entityEditComponent, data, this.dialog);\r\n\r\n // Обработка закрытия окна\r\n const subs = dialogRef.afterClosed().subscribe((result: IEditDialogData<T>) => {\r\n // Проверка результата\r\n if (result && result.entity && (Object.keys(result.entity).length !== 0)) {\r\n // Дополнительные действия перед сохранением объекта.\r\n if (this.beforeSaveOnEditEvent)\r\n this.beforeSaveOnEditEvent(result.entity, result.extraData);\r\n\r\n const subs = this.entityService.editObject(result.entity)\r\n .subscribe({\r\n next: () => {\r\n // Дополнительные действия после сохранения объекта.\r\n if (this.afterSaveOnEditEvent) {\r\n const callback = () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись изменена.');\r\n }\r\n this.afterSaveOnEditEvent(callback.bind(this), result.entity, result.extraData);\r\n } else {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись изменена.');\r\n }\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error('Произошла ошибка при изменении записи: ' + error, 0);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n } else {\r\n this.notificationService.warning('Действие не доступно.');\r\n }\r\n }\r\n }\r\n\r\n /** Событие удаление. */\r\n removeEvent() {\r\n // если выбрана запись(и)\r\n if (this.selected && this.selected.length > 0) {\r\n const dialogRef = this.openDialogRemoveConfirm(this.removalMessage);\r\n if (dialogRef) {\r\n const subs = dialogRef.afterClosed().subscribe((result: any) => {\r\n // при подтверждении возвращается 'delete'\r\n if (result === 'delete') {\r\n // готовим объект с запросами на удаление\r\n const sourcesObject: ObjectKeys = {};\r\n this.selected.forEach((item, index) => sourcesObject['obj' + index] = this.entityService.deleteObject(item));\r\n // ждем, когда выполнятся все запросы\r\n const subs = forkJoin(sourcesObject)\r\n .subscribe({\r\n next: () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Выбранные записи удалены.');\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error('Произошла ошибка при удалении записи: ' + error, 0);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n }\r\n }\r\n }\r\n\r\n /** Событие обновления данных. */\r\n refreshEvent() {\r\n this.loadData$.next(null);\r\n this.loadLength$.next(null);\r\n }\r\n\r\n /** Событие очистки фильтра. */\r\n clearEvent() {\r\n this.clearFilter$.next(null);\r\n this.clearFilter = {};\r\n }\r\n\r\n /** Изменение сообщения об удалении. */\r\n onRemovalMessageChange(message: string) {\r\n this.removalMessage = message;\r\n }\r\n\r\n /** Изменение заголовка страницы. */\r\n onPageTitleChange(title: string) {\r\n this.pageTitle = title;\r\n }\r\n\r\n openDialog(entityComponent: any, data: IEditDialogData<T>, dialog: any) {\r\n // create dialog config\r\n const dialogConfig = new MatDialogConfig();\r\n dialogConfig.disableClose = true;\r\n dialogConfig.autoFocus = true;\r\n dialogConfig.width = this.dialogEditWidth;\r\n dialogConfig.data = data;\r\n dialogConfig.panelClass = this.entityType.name + '-edit-dialog';\r\n // return dialog\r\n return dialog.open(entityComponent, dialogConfig);\r\n }\r\n\r\n openDialogRemoveConfirm(removalMessage: string): MatDialogRef<DialogComponent> | undefined {\r\n let message = 'Вы хотите удалить ';\r\n message += removalMessage ?\r\n removalMessage :\r\n this.allowMultiSelect ? `выбранные записи (${this.selected.length})?` : 'выбранную запись?';\r\n return this.dialog.open(DialogComponent, {\r\n width: this.dialogRemoveWidth,\r\n data: {\r\n id: 'delete',\r\n title: 'Подтверждение',\r\n message: message,\r\n btnNoTitle: 'Отмена',\r\n btnYesTitle: 'Удалить'\r\n }\r\n });\r\n }\r\n\r\n // contextMenu: При щелчке ПКМ открыть в новой вкладке.\r\n protected onMiddleButton(baseUrl: string, queryParamName?: string, queryParamValue?: string) {\r\n return ($event: MouseEvent, item: T | undefined, contextMenu: MatMenuTrigger) => {\r\n // Нажата средняя кнопка (в новой вкладке).\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if ($event.button === 1 && item) {\r\n //$event.preventDefault();\r\n contextMenu.closeMenu();\r\n // Converts the route into a string that can be used\r\n // with the window.open() function\r\n const url = this.router.serializeUrl(\r\n queryParamName && queryParamValue ?\r\n this.router.createUrlTree([baseUrl], { queryParams: { [queryParamName]: item[queryParamValue as keyof T] } })\r\n : this.router.createUrlTree([baseUrl])\r\n );\r\n window.open(url, '_blank');\r\n }\r\n };\r\n }\r\n\r\n // Action в таблице: При щелчке ПКМ открыть в новой вкладке.\r\n protected onActionMiddleButton(baseUrl: string, queryParamName?: string, queryParamValue?: string) {\r\n return ($event: MouseEvent, item: T | undefined) => {\r\n // Нажата средняя кнопка (в новой вкладке).\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if ($event.button === 1 && item) {\r\n //$event.preventDefault();\r\n // Converts the route into a string that can be used\r\n // with the window.open() function\r\n const url = this.router.serializeUrl(\r\n queryParamName && queryParamValue ?\r\n this.router.createUrlTree([baseUrl], { queryParams: { [queryParamName]: item[queryParamValue as keyof T] } })\r\n : this.router.createUrlTree([baseUrl])\r\n );\r\n window.open(url, '_blank');\r\n }\r\n };\r\n }\r\n\r\n protected dateToString(date: string | number | Date) {\r\n return date ? (new Date(date)).toLocaleString('ru-RU', { timeZone: 'Europe/Samara' }) : null; // MSK+01\r\n }\r\n\r\n}\r\n\r\n","import { HttpClient, HttpContext, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { BaseClass } from './base-class';\r\nimport { API_NAME } from '@kuzntsv/uikit';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport abstract class BaseServiceClass<T extends BaseClass> {\r\n abstract baseRoute: string;\r\n abstract entityType: any;\r\n\r\n protected countRoute = 'count';\r\n\r\n protected pageIndexParam = 'page';\r\n protected pageSizeParam = 'limit';\r\n protected sortColumnParam = 'column';\r\n protected directionParam = 'direction';\r\n\r\n // По умолчанию используем дефолтное API (пустая строка)\r\n protected apiContextName = ''; \r\n\r\n protected http = inject(HttpClient);\r\n\r\n getObjects(): Observable<T[]> {\r\n return this.http.get<T[]>(this.baseRoute, this.getHttpContext())\r\n .pipe(map(data => data.map(item => new this.entityType(item).deserialize(item))));\r\n }\r\n\r\n getObject(id: number): any {\r\n return this.http.get<T>(this.baseRoute + id, this.getHttpContext())\r\n .pipe(map(data => new this.entityType(data).deserialize(data)));\r\n }\r\n\r\n getCount(): Observable<number> {\r\n return this.http.get<number>(this.baseRoute + this.countRoute, this.getHttpContext());\r\n }\r\n\r\n getObjectsByPaging(pageIndex: number, pageSize: number, sortColumn: string, direction: string): Observable<T[]> {\r\n const params = this.getParams(pageIndex, pageSize, sortColumn, direction);\r\n return this.http.get<T[]>(this.baseRoute, { params, ...this.getHttpContext()})\r\n .pipe(map(data => data.map(item => new this.entityType(item).deserialize(item))));\r\n }\r\n\r\n newObject(entity: T): any {\r\n return this.http.post(this.baseRoute, entity, this.getHttpContext());\r\n }\r\n\r\n editObject(entity: T): any {\r\n return this.http.put(this.baseRoute + entity.id, entity, this.getHttpContext());\r\n }\r\n\r\n deleteObject(entity: T): any {\r\n return this.http.delete(this.baseRoute + entity.id, this.getHttpContext());\r\n }\r\n\r\n protected getParams(pageIndex: number, pageSize: number, sortColumn: string, direction: string): HttpParams {\r\n let params = new HttpParams();\r\n if (pageIndex + 1)\r\n // переход от индекса к номеру страницы\r\n params = params.append(this.pageIndexParam, pageIndex + 1);\r\n if (pageSize)\r\n params = params.append(this.pageSizeParam, pageSize);\r\n if (sortColumn)\r\n params = params.append(this.sortColumnParam, sortColumn);\r\n if (direction)\r\n params = params.append(this.directionParam, direction);\r\n return params;\r\n }\r\n\r\n // Вспомогательный метод для сборки опций HttpClient\r\n protected getHttpContext(): { context?: HttpContext } {\r\n // Если имя не задано (пустая строка, null или undefined), возвращаем пустой объект\r\n if (!this.apiContextName) {\r\n return {};\r\n }\r\n\r\n // Если имя задано, создаем и возвращаем контекст\r\n return {\r\n context: new HttpContext().set(API_NAME, this.apiContextName)\r\n };\r\n }\r\n}\r\n","import {\r\n computed,\r\n Directive,\r\n inject,\r\n linkedSignal,\r\n OnDestroy,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { FieldTree } from '@angular/forms/signals';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { NotificationService } from '@kuzntsv/uikit';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { LoaderService } from '../../services';\r\nimport { Action, IEditDialogData } from './base-edit-dialog-data';\r\n\r\n@Directive()\r\nexport abstract class BaseSignalEditClass<\r\n TDomain extends Record<string, any>,\r\n TForm extends Record<string, any> = TDomain, // TForm по умолчанию равен TDomain\r\n> implements OnDestroy {\r\n /** Заголовок. */\r\n public abstract title: string;\r\n /** Данные диалога. */\r\n protected abstract dialogData: WritableSignal<IEditDialogData<TDomain>>;\r\n\r\n protected formAction = computed(() => this.dialogData().action);\r\n protected formActionIsAdd = computed(\r\n () => this.dialogData().action === Action.Add,\r\n );\r\n protected formActionIsEdit = computed(\r\n () => this.dialogData().action === Action.Edit,\r\n );\r\n protected domainModel = computed(() => this.dialogData().entity);\r\n protected formModel = linkedSignal({\r\n source: this.domainModel,\r\n computation: (domainModel) => this.domainModelToFormModel(domainModel),\r\n });\r\n /** Форма. */\r\n protected abstract form: FieldTree<TForm>;\r\n /** Ссылка на диалог. */\r\n protected abstract dialogRef?: MatDialogRef<\r\n any,\r\n IEditDialogData<TDomain> | null\r\n >;\r\n\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента).\r\n * @deprecated\r\n */\r\n protected subscription = new Subscription();\r\n\r\n /**\r\n * Маппинг: Домен -> Форма.\r\n * Реализация по умолчанию делает поверхностную копию. Наследник может её переопределить.\r\n */\r\n protected domainModelToFormModel(domainModel: TDomain): TForm {\r\n return { ...domainModel } as unknown as TForm;\r\n }\r\n\r\n /**\r\n * Маппинг: Форма -> Домен.\r\n * Реализация по умолчанию объединяет старый домен и новые поля формы.\r\n */\r\n protected formModelToDomainModel(\r\n formModel: TForm,\r\n originalDomain?: TDomain,\r\n ): TDomain {\r\n return {\r\n ...originalDomain,\r\n ...(formModel as unknown as Partial<TDomain>),\r\n } as TDomain;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n onNoClick(event: MouseEvent): void {\r\n this.dialogRef?.close(null);\r\n event.preventDefault(); // иначе сработает onSubmit\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.form().valid()) {\r\n const updatedDomainEntity = this.formModelToDomainModel(this.formModel());\r\n this.dialogData.update(\r\n (currentData) =>\r\n ({\r\n ...currentData,\r\n entity: updatedDomainEntity,\r\n }) as IEditDialogData<TDomain>,\r\n );\r\n this.dialogRef?.close(this.dialogData());\r\n } else {\r\n this.form().markAsTouched();\r\n }\r\n }\r\n}\r\n","import { Directive, inject, input, linkedSignal, model, OnDestroy, output } from '@angular/core';\r\nimport { NotificationService } from '@kuzntsv/uikit';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { LoaderService } from '../../services';\r\nimport { SafeFilterState } from './base-filter.model';\r\n\r\n@Directive()\r\nexport class BaseSignalFilterClass implements OnDestroy {\r\n\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n \r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n \r\n /** Время на успокоение значения фильтра. */\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultDebounceTime = 500;\r\n\r\n /** \r\n * writable-сигнал, Принимаем текущее реактивное состояние фильтров с родительской страницы.\r\n * Родитель передает значение через [(filters)]=\"pageFilters()\".\r\n * При любом изменении полей ввода обновляйте сигнал целиком через метод update.\r\n * \r\n * @example\r\n * updateCategory(newCategory: string) {\r\n * this.filters.update(prev => ({ ...prev, category: newCategory }));\r\n * }\r\n */\r\n initialValues = input<SafeFilterState>({});\r\n\r\n /** Входной сигнал для сброса состояния формы. */\r\n clearFilter = input<any>(null);\r\n\r\n // Один output с типом Record<string, any> взамен пяти старых\r\n filterChange = output<SafeFilterState>();\r\n\r\n // Локальный writable-сигнал, который зависит от input\r\n filter = linkedSignal(() => this.initialValues());\r\n\r\n /** \r\n * Объект для отписки от внутренних подписок (например, valueChanges у FormControl).\r\n * Метод unsubscribe вызывается при уничтожении компонента.\r\n */\r\n subscription = new Subscription();\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n}\r\n","import { Directive, OnDestroy, computed, inject, signal } from '@angular/core';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport {\r\n MatDialog,\r\n MatDialogConfig,\r\n MatDialogRef,\r\n} from '@angular/material/dialog';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { Router } from '@angular/router';\r\nimport { HIDE_ROLE_MARKER, UIKIT_NOTIFICATION_TOKEN } from '@kuzntsv/uikit';\r\nimport { Subject, Subscription, finalize, forkJoin, map, of } from 'rxjs';\r\n\r\nimport { LoaderService } from '../../services';\r\nimport { LocalStorageService } from '../../services/local-storage-service';\r\nimport { DialogComponent } from '../../shared/dialog/dialog.component';\r\nimport {\r\n IContextMenuOptions,\r\n IPageState,\r\n ISortState,\r\n ITableState,\r\n} from '../../shared/table';\r\nimport {\r\n ObjectKeys,\r\n SortDirection,\r\n fnCbType,\r\n fnGetCountType,\r\n fnGetDataType,\r\n fnMapEntityType,\r\n fnType,\r\n} from '../../types/types';\r\nimport { Action, IEditDialogData } from './base-edit-dialog-data';\r\nimport { SafeFilterState } from './base-filter.model';\r\n\r\n@Directive()\r\nexport class BaseSignalPageClass<T> implements OnDestroy {\r\n protected dialog = inject(MatDialog);\r\n\r\n entityService: any;\r\n entityType: any;\r\n entityEditComponent: any;\r\n extraData?: any;\r\n\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultPageIndex = 0;\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultPageSize = 10;\r\n\r\n dialogEditWidth = 'auto';\r\n dialogRemoveWidth = '400px';\r\n\r\n routeAddress: string = '';\r\n\r\n /** Сообщение при удалении записи(й). */\r\n removalMessage: string = '';\r\n /** Заголовок страницы. */\r\n pageTitle: string = '';\r\n\r\n /**\r\n * Создание записи: вызывается перед открытием диалога.\r\n */\r\n beforeOpenDialogOnNewEvent: fnType<T>;\r\n /**\r\n * Редактирование записи: вызывается перед открытием диалога.\r\n */\r\n beforeOpenDialogOnEditEvent: fnType<T>;\r\n /**\r\n * Создание записи: вызывается перед сохранением объекта.\r\n */\r\n beforeSaveOnNewEvent: fnType<T>;\r\n /**\r\n * Редактирование записи: вызывается перед сохранением объекта.\r\n */\r\n beforeSaveOnEditEvent: fnType<T>;\r\n /**\r\n * Создание записи: вызывается после сохранения объекта.\r\n */\r\n afterSaveOnNewEvent: fnCbType<T>;\r\n /**\r\n * Редактирование записи: вызывается после сохранения объекта.\r\n */\r\n afterSaveOnEditEvent: fnCbType<T>;\r\n\r\n editorRoles: string[] = [];\r\n executeRoles: string[] = [];\r\n /** Список ролей, для которых скрыть элемент. */\r\n hideRoles: string[] = [HIDE_ROLE_MARKER];\r\n\r\n /** Загрузка данных. */\r\n loadData$: Subject<null> = new Subject<null>();\r\n /** Загрузка количества записей. */\r\n loadLength$: Subject<null> = new Subject<null>();\r\n /** Очистка фильтра. (для очистки присвоить пустой объект '{}'). */\r\n clearFilters = signal<any>(null);\r\n\r\n /** Разрешен выбор нескольких строк. */\r\n allowMultiSelect = false;\r\n /** Выбранные строки в таблице. */\r\n selected: T[] = [];\r\n\r\n // Сигналы для ленивой инициализации функций загрузки данных\r\n protected fnGetData = signal<fnGetDataType<T> | null>(null);\r\n protected fnGetCount = signal<fnGetCountType<T> | null>(null);\r\n protected fnMapEntity = signal<fnMapEntityType<T> | undefined>(undefined);\r\n\r\n // 2. Описываем Ресурс для получения списка ДАННЫХ\r\n protected dataResource = rxResource({\r\n // Ресурс сработает автоматически при изменении любого из этих сигналов:\r\n params: () => {\r\n const fetchFn = this.fnGetData();\r\n if (!fetchFn) return null; // Ждем инициализации в ngOnInit\r\n\r\n return {\r\n fetchFn,\r\n state: this.tableState(),\r\n mapFn: this.fnMapEntity(),\r\n };\r\n },\r\n stream: ({ params, abortSignal }) => {\r\n if (!params) return of([] as T[]);\r\n\r\n this.loaderService.show();\r\n\r\n // Вызываем переданную функцию загрузки (поддерживает Observable/Promise благодаря Resource API)\r\n return params.fetchFn().pipe(\r\n map((v) =>\r\n params.mapFn && Array.isArray(v) ? v.map(params.mapFn()) : v,\r\n ),\r\n finalize(() => {\r\n this.loaderService.hide();\r\n }),\r\n );\r\n },\r\n });\r\n\r\n // 3. Описываем Ресурс для получения КОЛИЧЕСТВА записей\r\n protected countResource = rxResource({\r\n params: () => {\r\n const fetchCountFn = this.fnGetCount();\r\n if (!fetchCountFn) return null;\r\n return { fetchCountFn, state: this.tableState() }; // перезапуск при смене пейджинга/сортировки\r\n },\r\n stream: ({ params }) => {\r\n if (!params) return of(0);\r\n\r\n return params.fetchCountFn();\r\n },\r\n });\r\n\r\n // 4. Связываем старые свойства-сигналы с новыми ресурсами для совместимости с шаблонами\r\n /** Данные для табличного компонента. */\r\n data = computed<T[]>(() => this.dataResource.value() || []);\r\n /** Количество записей по фильтру. */\r\n length = computed<number>(() => this.countResource.value() || 0);\r\n\r\n // data = signal<T[]>([]);\r\n\r\n // length = signal<number>(0);\r\n\r\n /** Доступность кнопки \"Изменить\". */\r\n editBtnDisabled = true;\r\n /** Доступность кнопки \"Удалить\". */\r\n removeBtnDisabled = true;\r\n\r\n /** Разрешено ли отправлять событие rowDoubleClicked при двойном щелчке мышью. */\r\n dblClickedEventEnable = true;\r\n\r\n // Список элементов контекстного меню.\r\n opt: IContextMenuOptions<T>[] = [];\r\n\r\n // DI\r\n protected router = inject(Router);\r\n /** Сервис для работы с LocalStorage. */\r\n protected localStorageService = inject(LocalStorageService);\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(UIKIT_NOTIFICATION_TOKEN);\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента). */\r\n subscription = new Subscription();\r\n\r\n private getInitialFilters(): SafeFilterState {\r\n const saved = this.localStorageService.getData(this.constructor.name + '_Filters');\r\n return saved ? (JSON.parse(saved) as SafeFilterState) : {};\r\n }\r\n\r\n private getInitialFilters2(): SafeFilterState {\r\n const prefix = this.constructor.name + '_Filter_';\r\n const state: Record<string, any> = {};\r\n\r\n // Проходим по всем ключам LocalStorage и собираем только фильтры этой страницы\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n const filterKey = key.replace(prefix, '');\r\n const rawValue = this.localStorageService.getData(key);\r\n try {\r\n state[filterKey] = rawValue ? JSON.parse(rawValue) : rawValue;\r\n } catch {\r\n state[filterKey] = rawValue; // если там была просто строка\r\n }\r\n }\r\n }\r\n return state;\r\n }\r\n\r\n // Единое реактивное хранилище для ВСЕХ фильтров текущей страницы\r\n filters = signal<SafeFilterState>(this.getInitialFilters());\r\n\r\n\r\n // 1. Инициализация сигнала filters при старте страницы\r\nfilters2 = signal<Record<string, any>>(this.getInitialFilters2());\r\n\r\n\r\n /** Состояние сортировки, пагинации. */\r\n tableState = signal<ITableState>({\r\n sortActive: '',\r\n sortDirection: '' as SortDirection,\r\n pageIndex: this.defaultPageIndex,\r\n pageSize: this.defaultPageSize,\r\n });\r\n\r\n constructor() {\r\n this.tableState.set({\r\n sortActive:\r\n this.localStorageService.getData(\r\n this.constructor.name + 'SortActive',\r\n ) || '',\r\n sortDirection: (this.localStorageService.getData(\r\n this.constructor.name + 'SortDirection',\r\n ) || '') as SortDirection,\r\n pageIndex:\r\n Number(\r\n this.localStorageService.getData(this.constructor.name + 'PageIndex'),\r\n ) || this.defaultPageIndex,\r\n pageSize:\r\n Number(\r\n this.localStorageService.getData(this.constructor.name + 'PageSize'),\r\n ) || this.defaultPageSize,\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n // 4. Новый метод просто прокидывает функции в сигналы, запуская ресурсы\r\n subscribeToLoadData(\r\n fnGetData: fnGetDataType<T>,\r\n fnGetCount: fnGetCountType<T>,\r\n fnMapEntity?: fnMapEntityType<T>,\r\n ) {\r\n this.fnMapEntity.set(fnMapEntity);\r\n this.fnGetData.set(fnGetData);\r\n this.fnGetCount.set(fnGetCount);\r\n }\r\n\r\n\r\n\r\n\r\n // // 3. Метод для динамической установки/обновления фильтров из любого компонента\r\n // setFilter(key: string, value: any) {\r\n // this.filters.update((prev) => {\r\n // const next = { ...prev };\r\n\r\n // // Сохраняем ВЕСЬ объект фильтров одной строкой для этой конкретной страницы\r\n // this.localStorageService.saveData(\r\n // this.constructor.name + '_Filters',\r\n // JSON.stringify(next),\r\n // );\r\n // return next;\r\n // });\r\n\r\n // // При любом изменении фильтра сбрасываем пагинацию на первую страницу\r\n // this.tableState.update((prev) => ({ ...prev, pageIndex: 0 }));\r\n // }\r\n// 2. Адаптированный метод установки фильтра\r\nsetFilter(key: string, value: any) {\r\n const storageKey = `${this.constructor.name}_Filter_${key}`;\r\n\r\n this.filters.update((prev) => {\r\n const next = { ...prev };\r\n \r\n if (value === null || value === undefined || value === '' || value === '-1') {\r\n delete next[key];\r\n // Удаляем из LocalStorage только это конкретное поле!\r\n localStorage.removeItem(storageKey); \r\n } else {\r\n next[key] = value;\r\n // Записываем в LocalStorage только это конкретное поле!\r\n this.localStorageService.saveData(storageKey, JSON.stringify(value));\r\n }\r\n return next;\r\n });\r\n\r\n this.tableState.update((prev) => ({ ...prev, pageIndex: 0 }));\r\n}\r\n\r\n\r\n onPageChange(pageState: IPageState) {\r\n this.localStorageService.saveData(\r\n this.constructor.name + 'PageIndex',\r\n pageState.pageIndex.toString(),\r\n );\r\n this.localStorageService.saveData(\r\n this.constructor.name + 'PageSize',\r\n pageState.pageSize.toString(),\r\n );\r\n\r\n this.tableState.update((prev) => ({\r\n ...prev,\r\n pageIndex: pageState.pageIndex,\r\n pageSize: pageState.pageSize,\r\n }));\r\n }\r\n\r\n onSortChange(sortState: ISortState) {\r\n this.localStorageService.saveData(\r\n this.constructor.name + 'SortActive',\r\n sortState.sortActive,\r\n );\r\n this.localStorageService.saveData(\r\n this.constructor.name + 'SortDirection',\r\n sortState.sortDirection,\r\n );\r\n\r\n this.tableState.update((prev) => ({\r\n ...prev,\r\n sortActive: sortState.sortActive,\r\n sortDirection: sortState.sortDirection,\r\n }));\r\n }\r\n\r\n entityFactory(type: new () => T): T {\r\n return new type();\r\n }\r\n\r\n /** Событие изменение выбранных записей. */\r\n onSelectionChange(selected: T[]) {\r\n this.selected = selected;\r\n this.editBtnDisabledUpdate(this.selected);\r\n this.removeBtnDisabledUpdate(this.selected);\r\n }\r\n\r\n /** Обновление доступности кнопки \"Изменить\" - вызывается при изменении выбранных записей. */\r\n editBtnDisabledUpdate(selected: T[]) {\r\n this.editBtnDisabled = !(selected && selected.length === 1);\r\n }\r\n\r\n /** Обновление доступности кнопки \"Удалить\" - вызывается при изменении выбранных записей. */\r\n removeBtnDisabledUpdate(selected: T[]) {\r\n this.removeBtnDisabled = !(selected && selected.length > 0);\r\n }\r\n\r\n /** Событие двойной клик. */\r\n onRowDoubleClicked() {\r\n this.editEvent();\r\n }\r\n\r\n /** Событие создание. */\r\n newEvent() {\r\n if (this.entityEditComponent) {\r\n const data: IEditDialogData<T> = {\r\n action: Action.Add,\r\n entity: new this.entityType(null),\r\n };\r\n\r\n // Назначить значения полей объекта перед открытием диалога.\r\n if (this.beforeOpenDialogOnNewEvent) {\r\n this.beforeOpenDialogOnNewEvent(data.entity, data.extraData);\r\n }\r\n\r\n // Открытие окна\r\n const dialogRef = this.openDialog(\r\n this.entityEditComponent,\r\n data,\r\n this.dialog,\r\n );\r\n\r\n // Обработка закрытия окна\r\n const subs = dialogRef\r\n .afterClosed()\r\n .subscribe((result: IEditDialogData<T>) => {\r\n // Проверка результата\r\n if (\r\n result &&\r\n result.entity &&\r\n Object.keys(result.entity).length !== 0\r\n ) {\r\n // Дополнительные действия перед сохранением объекта.\r\n if (this.beforeSaveOnNewEvent)\r\n this.beforeSaveOnNewEvent(result.entity, result.extraData);\r\n\r\n const subs = this.entityService.newObject(result.entity).subscribe({\r\n next: (obj: any) => {\r\n // Дополнительные действия после сохранения объекта.\r\n if (this.afterSaveOnNewEvent) {\r\n const callback = () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись добавлена.');\r\n };\r\n this.afterSaveOnNewEvent(\r\n callback.bind(this),\r\n obj,\r\n result.extraData,\r\n );\r\n } else {\r\n this.refreshEvent();\r\n this.notificationService?.success('Запись добавлена.');\r\n }\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error(\r\n 'Произошла ошибка при добавлении записи: ' + error,\r\n 0,\r\n );\r\n },\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n } else {\r\n this.notificationService.warning('Действие не доступно.');\r\n }\r\n }\r\n\r\n /** Событие редактирование. */\r\n editEvent() {\r\n if (this.selected && this.selected.length === 1) {\r\n if (this.entityEditComponent) {\r\n const data: IEditDialogData<T> = {\r\n action: Action.Edit,\r\n entity: this.selected[0],\r\n };\r\n\r\n // Назначить значения полей объекта перед открытием диалога.\r\n if (this.beforeOpenDialogOnEditEvent) {\r\n this.beforeOpenDialogOnEditEvent(data.entity, data.extraData);\r\n }\r\n\r\n // Открытие окна\r\n const dialogRef = this.openDialog(\r\n this.entityEditComponent,\r\n data,\r\n this.dialog,\r\n );\r\n\r\n // Обработка закрытия окна\r\n const subs = dialogRef\r\n .afterClosed()\r\n .subscribe((result: IEditDialogData<T>) => {\r\n // Проверка результата\r\n if (\r\n result &&\r\n result.entity &&\r\n Object.keys(result.entity).length !== 0\r\n ) {\r\n // Дополнительные действия перед сохранением объекта.\r\n if (this.beforeSaveOnEditEvent)\r\n this.beforeSaveOnEditEvent(result.entity, result.extraData);\r\n\r\n const subs = this.entityService\r\n .editObject(result.entity)\r\n .subscribe({\r\n next: () => {\r\n // Дополнительные действия после сохранения объекта.\r\n if (this.afterSaveOnEditEvent) {\r\n const callback = () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись изменена.');\r\n };\r\n this.afterSaveOnEditEvent(\r\n callback.bind(this),\r\n result.entity,\r\n result.extraData,\r\n );\r\n } else {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись изменена.');\r\n }\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error(\r\n 'Произошла ошибка при изменении записи: ' + error,\r\n 0,\r\n );\r\n },\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n } else {\r\n this.notificationService.warning('Действие не доступно.');\r\n }\r\n }\r\n }\r\n\r\n /** Событие удаление. */\r\n removeEvent() {\r\n // если выбрана запись(и)\r\n if (this.selected && this.selected.length > 0) {\r\n const dialogRef = this.openDialogRemoveConfirm(this.removalMessage);\r\n if (dialogRef) {\r\n const subs = dialogRef.afterClosed().subscribe((result: any) => {\r\n // при подтверждении возвращается 'delete'\r\n if (result === 'delete') {\r\n // готовим объект с запросами на удаление\r\n const sourcesObject: ObjectKeys = {};\r\n this.selected.forEach(\r\n (item, index) =>\r\n (sourcesObject['obj' + index] =\r\n this.entityService.deleteObject(item)),\r\n );\r\n // ждем, когда выполнятся все запросы\r\n const subs = forkJoin(sourcesObject).subscribe({\r\n next: () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Выбранные записи удалены.');\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService?.error(\r\n 'Произошла ошибка при удалении записи: ' + error,\r\n 0,\r\n );\r\n },\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n }\r\n }\r\n }\r\n\r\n /** Событие обновления данных. */\r\n refreshEvent() {\r\n this.dataResource.reload();\r\n this.countResource.reload();\r\n }\r\n\r\n /** Событие очистки фильтра. */\r\n // clearEvent() {\r\n // this.filters.set({});\r\n // // При очистке — удаляем запись из LocalStorage\r\n // this.localStorageService.saveData(this.constructor.name + '_Filters', '{}');\r\n // this.tableState.update((prev) => ({ ...prev, pageIndex: 0 }));\r\n\r\n // // Передаем новый объект, чтобы Angular гарантированно зафиксировал изменение значения\r\n // this.clearFilters.set({});\r\n // }\r\n\r\n \r\n// 3. Адаптированный метод очистки фильтров\r\nclearEvent() {\r\n const prefix = this.constructor.name + '_Filter_';\r\n \r\n // Находим и удаляем из хранилища только ключи фильтров этой страницы\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n keysToRemove.push(key);\r\n }\r\n }\r\n keysToRemove.forEach(key => localStorage.removeItem(key));\r\n\r\n this.filters.set({});\r\n this.tableState.update((prev) => ({ ...prev, pageIndex: 0 }));\r\n this.clearFilters.set({}); \r\n}\r\n\r\n /** Изменение сообщения об удалении. */\r\n onRemovalMessageChange(message: string) {\r\n this.removalMessage = message;\r\n }\r\n\r\n /** Изменение заголовка страницы. */\r\n onPageTitleChange(title: string) {\r\n this.pageTitle = title;\r\n }\r\n\r\n openDialog(entityComponent: any, data: IEditDialogData<T>, dialog: any) {\r\n // create dialog config\r\n const dialogConfig = new MatDialogConfig();\r\n dialogConfig.disableClose = true;\r\n dialogConfig.autoFocus = true;\r\n dialogConfig.width = this.dialogEditWidth;\r\n dialogConfig.data = data;\r\n dialogConfig.panelClass = this.entityType.name + '-edit-dialog';\r\n // return dialog\r\n return dialog.open(entityComponent, dialogConfig);\r\n }\r\n\r\n openDialogRemoveConfirm(\r\n removalMessage: string,\r\n ): MatDialogRef<DialogComponent> | undefined {\r\n let message = 'Вы хотите удалить ';\r\n message += removalMessage\r\n ? removalMessage\r\n : this.allowMultiSelect\r\n ? `выбранные записи (${this.selected.length})?`\r\n : 'выбранную запись?';\r\n return this.dialog.open(DialogComponent, {\r\n width: this.dialogRemoveWidth,\r\n data: {\r\n id: 'delete',\r\n title: 'Подтверждение',\r\n message: message,\r\n btnNoTitle: 'Отмена',\r\n btnYesTitle: 'Удалить',\r\n },\r\n });\r\n }\r\n\r\n // contextMenu: При щелчке ПКМ открыть в новой вкладке.\r\n protected onMiddleButton(\r\n baseUrl: string,\r\n queryParamName?: string,\r\n queryParamValue?: string,\r\n ) {\r\n return (\r\n $event: MouseEvent,\r\n item: T | undefined,\r\n contextMenu: MatMenuTrigger,\r\n ) => {\r\n // Нажата средняя кнопка (в новой вкладке).\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if ($event.button === 1 && item) {\r\n //$event.preventDefault();\r\n contextMenu.closeMenu();\r\n // Converts the route into a string that can be used\r\n // with the window.open() function\r\n const url = this.router.serializeUrl(\r\n queryParamName && queryParamValue\r\n ? this.router.createUrlTree([baseUrl], {\r\n queryParams: {\r\n [queryParamName]: item[queryParamValue as keyof T],\r\n },\r\n })\r\n : this.router.createUrlTree([baseUrl]),\r\n );\r\n window.open(url, '_blank');\r\n }\r\n };\r\n }\r\n\r\n // Action в таблице: При щелчке ПКМ открыть в новой вкладке.\r\n protected onActionMiddleButton(\r\n baseUrl: string,\r\n queryParamName?: string,\r\n queryParamValue?: string,\r\n ) {\r\n return ($event: MouseEvent, item: T | undefined) => {\r\n // Нажата средняя кнопка (в новой вкладке).\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if ($event.button === 1 && item) {\r\n //$event.preventDefault();\r\n // Converts the route into a string that can be used\r\n // with the window.open() function\r\n const url = this.router.serializeUrl(\r\n queryParamName && queryParamValue\r\n ? this.router.createUrlTree([baseUrl], {\r\n queryParams: {\r\n [queryParamName]: item[queryParamValue as keyof T],\r\n },\r\n })\r\n : this.router.createUrlTree([baseUrl]),\r\n );\r\n window.open(url, '_blank');\r\n }\r\n };\r\n }\r\n\r\n protected dateToString(date: string | number | Date) {\r\n return date\r\n ? new Date(date).toLocaleString('ru-RU', { timeZone: 'Europe/Samara' })\r\n : null; // MSK+01\r\n }\r\n}\r\n","import {\r\n HttpClient,\r\n HttpContext,\r\n HttpParams,\r\n httpResource,\r\n HttpResourceRef,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable, signal } from '@angular/core';\r\nimport { API_NAME } from '@kuzntsv/uikit';\r\nimport z from 'zod';\r\n\r\nimport { BaseSchemaClass } from './base-class';\r\nimport { tap } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport abstract class BaseSignalServiceClass<T extends BaseSchemaClass> {\r\n abstract baseRoute: string;\r\n abstract entityType: any;\r\n\r\n // Гарантирует, что переданная схема валидирует объект, содержащий как минимум { id: number }\r\n protected abstract readonly schema: z.ZodType<T>;\r\n\r\n protected countRoute = 'count';\r\n\r\n protected pageIndexParam = 'page';\r\n protected pageSizeParam = 'limit';\r\n protected sortColumnParam = 'column';\r\n protected directionParam = 'direction';\r\n\r\n // По умолчанию используем дефолтное API (пустая строка)\r\n protected apiContextName = '';\r\n\r\n protected http = inject(HttpClient);\r\n\r\n // Реактивный триггер для перезапуска списков\r\n private readonly _refreshTrigger = signal(0);\r\n\r\n // Вспомогательный метод для ручного или автоматического пинка триггера\r\n public refresh(): void {\r\n this._refreshTrigger.update(v => v + 1);\r\n }\r\n\r\n // 1. Возвращает ResourceRef, который сразу можно использовать в шаблонах или других ресурсах\r\n getObjects() {\r\n return httpResource<T[]>(() => ({url: this.baseRoute}), {\r\n ...this.getHttpContext(),\r\n // Ключевое улучшение v22: трансформация данных прямо на уровне ресурса\r\n parse: (data: unknown) => {\r\n if (!data) return [];\r\n // Валидация через Zod вернет строго тип T, у которого точно есть id\r\n return z.array(this.schema).parse(data);\r\n },\r\n });\r\n }\r\n\r\n getObject(id: number | (() => number)) {\r\n // Приводим id к функции-сигналу для обеспечения реактивности httpResource\r\n const idSignal = typeof id === 'function' ? id : () => id;\r\n\r\n return httpResource<T>(() => `${this.baseRoute}${idSignal()}`, {\r\n ...this.getHttpContext(),\r\n parse: (data: unknown) =>\r\n data ? new this.entityType(data).deserialize(data) : null,\r\n });\r\n }\r\n\r\n getCount() {\r\n return httpResource<number>(\r\n () => ({ url: `${this.baseRoute}${this.countRoute}` }),\r\n {\r\n ...this.getHttpContext(),\r\n parse: (data: unknown) => Number(data),\r\n },\r\n );\r\n }\r\n\r\n getObjectsByPaging(\r\n pageIndex: () => number,\r\n pageSize: () => number,\r\n sortColumn: () => string,\r\n direction: () => string,\r\n ) {\r\n return httpResource<T[]>(\r\n () => {\r\n // Собираем плоский JSON-объект с параметрами вместо вызовов HttpParams\r\n const queryParams: Record<string, string | number> = {};\r\n\r\n if (pageIndex() + 1) queryParams[this.pageIndexParam] = pageIndex() + 1;\r\n if (pageSize()) queryParams[this.pageSizeParam] = pageSize();\r\n if (sortColumn()) queryParams[this.sortColumnParam] = sortColumn();\r\n if (direction()) queryParams[this.directionParam] = direction();\r\n\r\n return {\r\n url: this.baseRoute,\r\n params: queryParams,\r\n };\r\n },\r\n {\r\n ...this.getHttpContext(),\r\n parse: (data) =>\r\n Array.isArray(data)\r\n ? data.map((item) => new this.entityType(item).deserialize(item))\r\n : [],\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * МЕТОД СОЗДАНИЯ (POST)\r\n * Принимает данные БЕЗ id. Тип формируется автоматически через Zod.\r\n */\r\n newObject(entity: Omit<T, 'id'>): any {\r\n return this.http.post(this.baseRoute, entity, this.getHttpContext());\r\n }\r\n\r\n /**\r\n * Метод для СОЗДАНИЯ объекта (POST)\r\n * Тип аргумента генерируется автоматически: это ваш тип T, но БЕЗ поля id.\r\n */\r\n create(dto: Omit<T, 'id'>): HttpResourceRef<T | undefined> {\r\n return httpResource<T>(() => ({\r\n url: this.baseRoute,\r\n method: 'POST',\r\n body: dto // Отправляем данные без id\r\n }), {\r\n ...this.getHttpContext(),\r\n // Сервер вернет созданный объект уже С присвоенным id, валидируем его полной схемой\r\n parse: (data: unknown) => this.schema.parse(data)\r\n });\r\n }\r\n\r\n editObject(entity: T): any {\r\n return this.http.put(\r\n this.baseRoute + entity.id,\r\n entity,\r\n this.getHttpContext(),\r\n );\r\n }\r\n\r\n /**\r\n * Метод для ОБНОВЛЕНИЯ объекта (PUT / PATCH)\r\n * Принимает id и частичный объект (все свойства T становятся необязательными, кроме id)\r\n */\r\n update(id: number, dto: Partial<Omit<T, 'id'>>): HttpResourceRef<T | undefined> {\r\n return httpResource<T>(() => ({\r\n url: `${this.baseRoute}/${id}`,\r\n method: 'PUT',\r\n body: dto\r\n }), {\r\n ...this.getHttpContext(),\r\n parse: (data: unknown) => this.schema.parse(data)\r\n });\r\n }\r\n\r\n /**\r\n * Метод DELETE (Переписанный под новую архитектуру)\r\n * Возвращает Observable. При подписке делает DELETE запрос, \r\n * а оператор 'tap' автоматически обновляет список getObjects() при успехе.\r\n */\r\n deleteObject(entity: T): any {\r\n return this.http.delete(this.baseRoute + entity.id, this.getHttpContext()).pipe(\r\n // Как только бэкенд ответит успехом, дергаем триггер обновления\r\n tap(() => this.refresh()) \r\n );;\r\n }\r\n\r\n protected getParams(\r\n pageIndex: number,\r\n pageSize: number,\r\n sortColumn: string,\r\n direction: string,\r\n ): HttpParams {\r\n let params = new HttpParams();\r\n if (pageIndex + 1)\r\n // переход от индекса к номеру страницы\r\n params = params.append(this.pageIndexParam, pageIndex + 1);\r\n if (pageSize) params = params.append(this.pageSizeParam, pageSize);\r\n if (sortColumn) params = params.append(this.sortColumnParam, sortColumn);\r\n if (direction) params = params.append(this.directionParam, direction);\r\n return params;\r\n }\r\n\r\n // Вспомогательный метод для сборки опций HttpClient\r\n protected getHttpContext(): { context?: HttpContext } {\r\n // Если имя не задано (пустая строка, null или undefined), возвращаем пустой объект\r\n if (!this.apiContextName) {\r\n return {};\r\n }\r\n\r\n // Если имя задано, создаем и возвращаем контекст\r\n return {\r\n context: new HttpContext().set(API_NAME, this.apiContextName),\r\n };\r\n }\r\n}\r\n","import { inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'safe',\r\n standalone: true\r\n})\r\nexport class SafePipe implements PipeTransform {\r\n\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n transform(url: string | SafeUrl | null | undefined) {\r\n if (!url) {\r\n return '';\r\n }\r\n\r\n // Проверяем, является ли значение уже объектом SafeUrl.\r\n // Объекты SafeUrl от DomSanitizer имеют скрытые свойства или метод toString(), \r\n // но самый надежный способ в Angular — проверить, что это не обычная строка.\r\n if (typeof url !== 'string') {\r\n return url; // Возвращаем как есть, так как это уже SafeUrl\r\n }\r\n return this.sanitizer.bypassSecurityTrustUrl(url);\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'time'\r\n})\r\nexport class TimePipe implements PipeTransform {\r\n\r\n transform(value: number): string {\r\n // const hour = Math.abs(value) >= 60 ? Math.round(value / 60) + 'ч.' : '';\r\n // const minute = ' ' + Math.abs(value % 60) + 'м.';\r\n // return value === 0 ? '0' : hour + ' ' + minute;\r\n\r\n const hour = Math.abs(value) >= 60 ? Math.floor(Math.abs(value) / 60).toString().padStart(2,'0') : '00';\r\n const minute = Math.abs(value % 60).toString().padStart(2,'0');\r\n const time = hour + ':' + minute;\r\n return value < 0 ? '-' + time : time;\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'truncate'\r\n})\r\nexport class TruncatePipe implements PipeTransform {\r\n // Usage:\r\n // {{ str | truncate:[20] }} // or\r\n // {{ str | truncate:[20, '...'] }} // or|\r\n transform(value: string, args: any[]): string {\r\n const limit = args.length > 0 ? parseInt(args[0], 10) : 20;\r\n const trail = args.length > 1 ? args[1] : '...';\r\n return value.length > limit ? value.substring(0, limit) + trail : value;\r\n }\r\n\r\n}\r\n","import {\n Component,\n inject,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatAnchor } from '@angular/material/button';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { BaseNavBarMenuClass } from '../../base';\nimport { SafePipe } from '../../pipes';\nimport { DialogComponent } from '../dialog';\nimport { filter, take } from 'rxjs';\nimport { SafeUrl } from '@angular/platform-browser';\n\n@Component({\n selector: 'ngx-uik-navbar',\n templateUrl: 'navbar.html',\n styleUrls: ['./navbar.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [MatAnchor, MatIcon, MatTooltip, SafePipe],\n})\nexport class NavBarComponent extends BaseNavBarMenuClass {\n /** Видимость панели, когда loggedIn === false. */\n visibleOnLogout = input<boolean>(false);\n /** Видимость аватара. */\n visibleAvatar = input<boolean>(true);\n /** Видимость кнопки \"Выйти\". */\n visibleLogoutBtn = input<boolean>(true);\n\n /** Признак, что пользователь авторизован. */\n loggedIn = input<boolean>(false);\n /** ФИО пользователя. */\n fioUser = input<string>('');\n /** Всплывающая подсказка о пользователе. */\n userTooltip = input<string>('');\n /** URL аватара */\n avatarURL = input<string | SafeUrl>('');\n\n /** Нажата кнопка \"Выйти\". */\n logout = output<string>();\n\n private readonly dialog = inject(MatDialog);\n\n constructor() {\n super();\n }\n\n onLogout() {\n this.logout.emit(this.router.url);\n }\n\n openDialog(): void {\n const dialogRef = this.dialog.open(DialogComponent, {\n width: '400px',\n data: {\n id: 'logout',\n title: 'Подтверждение',\n message: 'Вы хотите выйти?',\n btnNoTitle: 'Отмена',\n btnYesTitle: 'Выйти',\n },\n });\n\n dialogRef\n .afterClosed()\n .pipe(\n take(1), // Берем только одно значение (когда закрылся)\n filter((id) => !!id), // Пропускаем дальше, только если id существует (нажали \"Выйти\")\n )\n .subscribe((id: any) => {\n if (id) {\n this.onLogout();\n }\n });\n }\n}\n","@if (visibleOnLogout() || loggedIn()) {\r\n <nav class=\"ngx-uik-navbar-header\">\r\n \r\n <ng-content></ng-content>\r\n\r\n <div class=\"flex-spacer\"></div>\r\n \r\n @if (visibleAvatar() && (loggedIn() === false || !avatarURL())) {\r\n <mat-icon [matTooltip]=\"userTooltip()\">account_circle</mat-icon>\r\n }\r\n @if (visibleAvatar() && loggedIn() && !!avatarURL()) {\r\n <img\r\n class=\"user-photo\"\r\n [src]=\"avatarURL() | safe\"\r\n loading=\"lazy\"\r\n [alt]=\"fioUser()\"\r\n [matTooltip]=\"userTooltip()\">\r\n }\r\n\r\n <span class = \"user-name\" [matTooltip]=\"userTooltip()\">\r\n {{ fioUser() }}\r\n </span>\r\n\r\n @if (visibleLogoutBtn()) {\r\n <a mat-button class=\"pm-button\" (click)=\"openDialog()\">Выйти <mat-icon>logout</mat-icon></a>\r\n }\r\n </nav>\r\n}","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'ngx-uik-not-found',\n templateUrl: './not-found.component.html',\n styleUrls: ['./not-found.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: true,\n})\nexport class NotFoundComponent {}\n","<div class=\"center\">\r\n <h3 class=\"mat-display-1\">Страница не найдена</h3>\r\n</div>\r\n","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\r\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\r\n\r\n@Component({\r\n selector: 'ngx-uik-loader',\r\n template: `\r\n <div class=\"loading-indicator\" mat-dialog-content>\r\n <mat-progress-spinner mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </div>\r\n `,\r\n styles: [`\r\n /* Разместить по центру */\r\n .loading-indicator {\r\n position: fixed;\r\n z-index: 999;\r\n height: 2em;\r\n width: 2em;\r\n overflow: initial;\r\n margin: auto;\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n right: 0;\r\n }\r\n\r\n /* Заблокировать оверлей */\r\n .loading-indicator:before {\r\n content: '';\r\n display: block;\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(0,0,0,0.3);\r\n }\r\n `],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatProgressSpinner]\r\n})\r\n\r\nexport class ProgressSpinnerComponent implements AfterViewInit {\r\n\r\n private readonly cdRef = inject(ChangeDetectorRef);\r\n\r\n ngAfterViewInit() {\r\n this.cdRef.detectChanges();\r\n }\r\n}\r\n","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport {\n Component,\n effect,\n input,\n linkedSignal,\n OnDestroy,\n OnInit,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n MatAutocompleteModule,\n MatOption,\n} from '@angular/material/autocomplete';\nimport {\n MatError,\n MatFormField,\n MatHint,\n MatLabel,\n} from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { Subscription } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n map,\n startWith,\n} from 'rxjs/operators';\n\nimport { SelectItem } from './models';\n\n@Component({\n selector: 'ngx-uik-select-autocomplete-with-vs',\n templateUrl: './select-autocomplete-with-vs.component.html',\n styleUrl: './select-autocomplete-with-vs.component.css',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n MatHint,\n MatError,\n MatOption,\n MatIcon,\n MatFormField,\n ScrollingModule,\n MatInput,\n MatLabel,\n ],\n})\nexport class BaseSelectAutocompleteWithVsComponent\n implements OnInit, OnDestroy\n{\n // https://stackblitz.com/edit/autocomplete-with-virtual-scroll-dc9u2g\n\n // Все элементы\n items = input<SelectItem[]>([]);\n // Выбранный элемент (входной параметр)\n selectedItemInput = input<SelectItem | undefined>(undefined);\n // Заголовок\n title = input<string>('');\n // Видимость\n isVisible = input<boolean>(true);\n // Обязательность\n isRequired = input<boolean>(false);\n // Доступность\n isDisabled = input<boolean>(false);\n // Ширина\n width = input<string>('200');\n\n // Выбранный элемент\n selectedItem = linkedSignal(() => this.selectedItemInput());\n // Событие изменения выбранного элемента\n selectedItemChange = output<string>();\n\n public height: string = '200px';\n // input элемент\n inputCtrl = new FormControl();\n // отфильтрованные (отображаемые) элементы\n filteredItems: SelectItem[] = [];\n\n subscription = new Subscription();\n\n constructor() {\n effect(() => {\n console.log('ITEMS =', this.items());\n //this.filteredItems = this.items();\n\n console.log('selectedItem =', this.selectedItemInput());\n if (this.items().length > 0) {\n console.log('filteredItems SET');\n this.setFileredItems(this.items());\n this.inputCtrl.setValue(this.selectedItemInput());\n }\n });\n }\n\n ngOnInit(): void {\n // Listen for changes to the input\n const subs = this.inputCtrl.valueChanges\n .pipe(\n startWith(''),\n // eslint-disable-next-line no-magic-numbers\n debounceTime(500),\n distinctUntilChanged(),\n // Note: If the option value is bound to object, after selecting the option\n // Note: the value will change from string to {}. We want to perform search\n // Note: only when the type is string (no match)\n //filter(q => typeof q === 'string'),\n //tap((v) => console.log('v=', v)),\n map((value) => {\n // Filter the options\n console.log('typeof value =', typeof value);\n\n if (typeof value === 'undefined') {\n this.setFileredItems(this.items());\n } else {\n if (typeof value !== 'object') {\n console.log('v1=', value);\n this.setFileredItems(\n this.items().filter((option) =>\n option.viewValue.toLowerCase().includes(value.toLowerCase()),\n ),\n );\n } else {\n // typeof value === 'object'\n console.log('v2=', value);\n if (value) {\n // this.predmet = value;\n this.setFileredItems(\n this.items().filter((option) =>\n option.viewValue\n .toLowerCase()\n .includes(value.viewValue.toLowerCase()),\n ),\n );\n console.log('v3=', value);\n } else {\n this.setFileredItems(this.items());\n console.log('v4=', value);\n }\n }\n }\n }),\n )\n .subscribe();\n this.subscription.add(subs);\n\n if (this.isDisabled()) {\n this.inputCtrl.disable();\n } else {\n this.inputCtrl.enable();\n }\n }\n\n ngOnDestroy(): void {\n if (this.subscription) this.subscription.unsubscribe();\n }\n\n onSelectedItemChange(item: any) {\n console.log('onSelectedItemChange, item=', item);\n this.selectedItem.set(item);\n this.selectedItemChange.emit(item);\n }\n\n onClearClick($event: MouseEvent) {\n $event.stopPropagation();\n this.inputCtrl.setValue('');\n }\n\n displayWithFn(lookup: any) {\n return lookup ? lookup.viewValue : null;\n }\n\n private setFileredItems(items: SelectItem[]) {\n this.filteredItems = items;\n // Recompute how big the viewport should be.\n // eslint-disable-next-line no-magic-numbers\n if (items.length < 4) {\n // eslint-disable-next-line no-magic-numbers\n this.height = items.length * 50 + 'px';\n } else {\n this.height = '200px';\n }\n console.log('update filteredItems =', this.filteredItems);\n }\n}\n","@if (isVisible()) {\r\n <mat-form-field [style.width.px]=\"width()\">\r\n <mat-label>{{ title() }}</mat-label>\r\n <input type=\"text\"\r\n [placeholder]=title()\r\n aria-label=\"Number\"\r\n matInput\r\n (ngModelChange)=\"onSelectedItemChange($event)\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [required]=\"isRequired() ? 'required' : ''\"\r\n >\r\n @if (!isDisabled && selectedItem()) {\r\n <button mat-button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClearClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayWithFn\" showPanel=\"true\">\r\n <cdk-virtual-scroll-viewport class=\"autocomplete-test-viewport\" [style.height]=\"height\" itemSize=\"25\">\r\n <mat-option *cdkVirtualFor=\"let option of filteredItems\" [value]=\"option\" class=\"autocomplete-item\">\r\n {{option.viewValue}}\r\n </mat-option>\r\n </cdk-virtual-scroll-viewport>\r\n </mat-autocomplete>\r\n @if (inputCtrl.invalid) {\r\n <mat-error>Введите {{title()}}</mat-error>\r\n }\r\n @if (!inputCtrl.value) {\r\n <mat-hint>Начните вводить ...</mat-hint>\r\n }\r\n </mat-form-field>\r\n}","import { COMMA, ENTER } from '@angular/cdk/keycodes';\n\nimport {\n Component,\n effect,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatOptgroup, MatOption } from '@angular/material/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatFormField, MatLabel, MatSelect } from '@angular/material/select';\n\nimport { SelectGroup } from './models';\n\n@Component({\n selector: 'ngx-uik-select-with-group',\n templateUrl: './select-with-group.component.html',\n styleUrls: ['./select-with-group.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n MatIcon,\n MatOption,\n MatOptgroup,\n MatSelect,\n MatFormField,\n MatLabel,\n ],\n})\nexport class BaseSelectWithGroupComponent {\n // Все группы\n groups = input<SelectGroup[]>([]);\n // Выбранные элементы, ключи (BaseSelectItem.value)\n selectedItems = input<string[]>([]);\n // Заголовок\n title = input<string>('');\n // Событие изменения выбранных элементов\n selectedItemsChange = output<string[]>();\n\n separatorKeysCodes: number[] = [ENTER, COMMA];\n control = new FormControl<number[]>([]);\n\n constructor() {\n effect(() => {\n if (this.groups().length > 0) {\n this.control.setValue(this.selectedItems().map((i) => Number(i)));\n }\n });\n }\n\n selectionChange($event: any) {\n this.selectedItemsChange.emit(\n $event.value.map((i: number) => i.toString()),\n );\n }\n\n onClearClick($event: MouseEvent) {\n $event.stopPropagation();\n // this.control.setValue('');\n this.selectedItemsChange.emit([]);\n }\n}\n","<mat-form-field class=\"select-with-group\" appearance=\"fill\">\r\n <mat-label>{{ title() }}</mat-label>\r\n <mat-select [formControl]=\"control\" (selectionChange)=\"selectionChange($event)\" multiple>\r\n @for (group of groups(); track group) {\r\n <mat-optgroup [label]=\"group.name\">\r\n @for (item of group.items; track item) {\r\n <mat-option [value]=\"item.value\" >\r\n {{item.viewValue}}\r\n </mat-option>\r\n }\r\n </mat-optgroup>\r\n }\r\n\r\n </mat-select>\r\n @if (control.value && control.value!.length > 0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClearClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n","import { SelectionModel } from '@angular/cdk/collections';\nimport {\n AfterViewInit,\n Component,\n OnDestroy,\n OnInit,\n effect,\n input,\n linkedSignal,\n output,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatDivider } from '@angular/material/divider';\nimport { MatIcon } from '@angular/material/icon';\nimport {\n MatMenu,\n MatMenuContent,\n MatMenuItem,\n MatMenuTrigger,\n} from '@angular/material/menu';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, MatSortHeader } from '@angular/material/sort';\nimport {\n MatCell,\n MatCellDef,\n MatColumnDef,\n MatFooterCell,\n MatFooterCellDef,\n MatFooterRow,\n MatFooterRowDef,\n MatHeaderCell,\n MatHeaderCellDef,\n MatHeaderRow,\n MatHeaderRowDef,\n MatNoDataRow,\n MatRow,\n MatRowDef,\n MatTable,\n MatTableDataSource,\n MatTableModule,\n} from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatIconButton } from '@angular/material/button';\nimport { RouterLink } from '@angular/router';\nimport { Subscription } from 'rxjs';\n\nimport { IColumnOptions } from './models/column-options.interface';\nimport { IContextMenuOptions } from './models/context-menu-options.interface';\nimport { IPageState, ISortState, ITableState } from './models/table-state';\n\n@Component({\n selector: 'ngx-uik-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatTable,\n MatSort,\n MatColumnDef,\n MatHeaderCellDef,\n MatHeaderCell,\n MatCheckbox,\n MatCellDef,\n MatCell,\n MatSortHeader,\n MatIcon,\n RouterLink,\n MatNoDataRow,\n MatHeaderRowDef,\n MatHeaderRow,\n MatRowDef,\n MatRow,\n MatMenuTrigger,\n MatMenu,\n MatMenuContent,\n MatDivider,\n MatMenuItem,\n MatPaginator,\n MatFooterRowDef,\n MatFooterRow,\n MatFooterCellDef,\n MatFooterCell,\n MatTableModule,\n MatTooltipModule,\n MatIconButton,\n ],\n})\nexport class TableComponent<T> implements OnInit, AfterViewInit, OnDestroy {\n /** Отображаемые данные. */\n data = input<T[]>([]);\n /** Количество записей. */\n length = input<number>(0);\n /** Настройки колонок. */\n columnOptions = input<IColumnOptions<T>[]>([]);\n /** Состояние сортировки, пагинации. */\n tableState = input.required<ITableState>();\n /** Разрешен выбор нескольких строк. */\n allowMultiSelect = input<boolean>(false);\n /** Список элементов контекстного меню. */\n opt = input<IContextMenuOptions<T>[]>([]);\n /** Отправка события rowDoubleClicked (при двойном щелчке мышью) отключена. */\n rowDblClickedDisable = input<boolean>(false);\n /** Отображать строку с итогом. */\n footer = input<boolean>(false);\n\n /** Изменение страницы. */\n pageStateChange = output<IPageState>();\n /** Изменение сортировки. */\n sortStateChange = output<ISortState>();\n /** Изменение выбранных записей. */\n selectionChange = output<T[]>();\n /** Двойной щелчек ЛКМ*/\n rowDoubleClicked = output<T>();\n\n readonly sort = viewChild(MatSort);\n readonly paginator = viewChild(MatPaginator);\n readonly contextMenu = viewChild(MatMenuTrigger);\n\n pageState = linkedSignal<IPageState>(() => {\n return {\n pageIndex: this.tableState().pageIndex,\n pageSize: this.tableState().pageSize,\n };\n });\n\n sortState = linkedSignal<ISortState>(() => {\n return {\n sortActive: this.tableState().sortActive,\n sortDirection: this.tableState().sortDirection,\n };\n });\n\n /** Выбранная строка, для которого будет показываться меню при нажатии правой кнопки мыши. */\n itemForMenu?: T;\n /** Позиция в которой отображается контекстное меню. */\n contextMenuPosition = { x: '0px', y: '0px' };\n\n // eslint-disable-next-line no-magic-numbers\n defaultPageIndex = 0;\n // eslint-disable-next-line no-magic-numbers\n defaultPageSize = 10;\n\n /** Источник данных для отображения. */\n dataSource = new MatTableDataSource<T>();\n\n /** Выбранные записи. */\n selection: SelectionModel<T> = new SelectionModel<T>();\n\n /** Список отображаемых колонок (формируется из @columnOptions). */\n displayedColumns?: string[];\n\n subscription = new Subscription();\n\n constructor() {\n effect(() => {\n this.dataSource.data = this.data();\n\n // сохранить выделенные строки, если они все еще есть в данных\n const selected = this.selection.selected;\n this.selection.clear();\n this.data()\n .filter((v) =>\n selected.map((s) => JSON.stringify(s)).includes(JSON.stringify(v)),\n )\n .map((d) => {\n this.selection.select(d);\n });\n });\n }\n\n ngOnInit(): void {\n this.displayedColumns = ['select'].concat(\n this.columnOptions()\n ?.filter((c) => !c.hide)\n .map((item) => item.name) || [],\n );\n\n // пересоздаем, т.к. параметр allowMultiSelect появляется только сейчас\n this.selection = new SelectionModel<T>(this.allowMultiSelect());\n }\n\n ngOnDestroy(): void {\n if (this.subscription) this.subscription.unsubscribe();\n }\n\n ngAfterViewInit() {\n // подписи элементов управления пагинатора (MatPaginatorIntl)\n const paginator = this.paginator();\n if (paginator) {\n paginator._intl.itemsPerPageLabel = 'Записей на странице';\n paginator._intl.firstPageLabel = 'Первая страница';\n paginator._intl.previousPageLabel = 'Предыдущая страница';\n paginator._intl.nextPageLabel = 'Следующая страница';\n paginator._intl.lastPageLabel = 'Последняя страница';\n\n // изменение пагинации\n const subs = paginator.page.subscribe((page) => {\n const pageState = {\n pageIndex: page.pageIndex,\n pageSize: page.pageSize,\n } as IPageState;\n this.pageState.set(pageState);\n this.pageStateChange.emit(pageState);\n });\n this.subscription.add(subs);\n }\n\n // изменение сортировки\n const sortValue = this.sort();\n if (sortValue) {\n const subs = sortValue.sortChange.subscribe((sort) => {\n const sortState = {\n sortActive: sort.active,\n sortDirection: sort.direction,\n } as ISortState;\n this.sortState.set(sortState);\n this.sortStateChange.emit(sortState);\n });\n this.subscription.add(subs);\n }\n\n // изменение выбранных записей\n if (this.selection) {\n const subs = this.selection.changed.subscribe((change) => {\n this.selectionChange.emit(change.source.selected);\n });\n this.subscription.add(subs);\n }\n }\n\n /** Whether the number of selected elements matches the total number of rows. */\n isAllSelected() {\n const numSelected = this.selection.selected.length;\n const numRows = this.dataSource.data.length;\n return numSelected === numRows;\n }\n\n /** Selects all rows if they are not all selected; otherwise clear selection. */\n masterToggle() {\n console.log(this.selection.isMultipleSelection());\n if (this.isAllSelected()) {\n this.selection.clear();\n } else {\n this.dataSource.data.forEach((row) => this.selection.select(row));\n }\n }\n\n /** При щелчке по строке. */\n onRowClicked(row: T) {\n // выделение строки при щелчке по строке\n if (this.selection.isSelected(row)) {\n this.selection.deselect(row);\n } else {\n this.selection.select(row);\n }\n }\n\n /** При двойном щелчке по строке. */\n onRowDblClicked(row: T) {\n // выделение строки при двойном щелчке по строке\n this.selection.clear();\n this.selection.select(row);\n if (!this.rowDblClickedDisable()) this.rowDoubleClicked.emit(row);\n }\n\n /** При вызове контекстного меню. */\n onContextMenu(event: MouseEvent, itemForMenu: T | undefined) {\n if (this.opt() && this.opt().length === 0) {\n // если нет пунктов меню, то не показываем меню\n return;\n }\n event.preventDefault();\n this.itemForMenu = itemForMenu;\n this.contextMenuPosition.x = event.clientX + 'px';\n this.contextMenuPosition.y = event.clientY + 'px';\n // как это (menuData) использовать в шаблоне не понятно, поэтому использую this.itemForMenu\n // https://www.concretepage.com/angular-material/passing-data-to-mat-menu-angular-material\n const contextMenu = this.contextMenu();\n if (contextMenu) {\n contextMenu.menuData = { itemForMenu };\n contextMenu.menu?.focusFirstItem('mouse');\n contextMenu.openMenu();\n }\n }\n\n getTotal(columnName: string) {\n const arr = this.dataSource.data\n .filter((t) => typeof t[columnName as keyof T] === 'number')\n .map((t) => t[columnName as keyof T]);\n if (arr.length === 0) return '';\n else return arr.reduce((acc, value) => acc + <number>value, 0);\n }\n}\n","<div class=\"component-container\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\"\r\n matSort\r\n [matSortActive]=\"sortState().sortActive || ''\"\r\n [matSortDirection]=\"sortState().sortDirection\"\r\n matSortDisableClear>\r\n\r\n <!-- Выбор строки Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (allowMultiSelect()) {\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n }\r\n </ng-container>\r\n\r\n @for (item of columnOptions(); track item) {\r\n <ng-container matColumnDef={{item.name}}>\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"item.titleSortDisable\">{{item.title}}</th>\r\n @if (!item.format) {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n {{element[item.name]}}\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footer) {\r\n <strong>{{ getTotal(item.name) }}</strong>\r\n }\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n } \r\n }\r\n @if (item.format === 'pre-wrap') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" class=\"pre-wrap\" [matTooltip]=\"item.tooltip ?? ''\">\r\n {{element[item.name]}}\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'link') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n <a [href]=\"element[item.name]\" target=\"_blank\">{{element[item.name]}}</a>\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'linkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n @if (element[item.name]) {\r\n <a [href]=\"element[item.name]\" target=\"_blank\">\r\n @if (item.icon) {\r\n <mat-icon [class]=\"item.classList ? item.classList : ''\" >{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span [class]=\"item.classList ? item.classList : ''\" >{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'routerLink') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n <a [routerLink]=\"[element[item.name]]\">{{element[item.name]}}</a>\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'routerLinkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n @if (element[item.name]) {\r\n <a [routerLink]=\"[element[item.name]]\">\r\n @if (item.icon) {\r\n <mat-icon [class]=\"item.classList ? item.classList : ''\" >{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span [class]=\"item.classList ? item.classList : ''\" >{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'checkbox') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n <mat-checkbox [checked]=\"element[item.name] === 1\" [disabled]=\"true\"></mat-checkbox>\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'icon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n @if (item.icon) {\r\n <mat-icon [class]=\"item.classList ? item.classList : ''\" >{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span [class]=\"item.classList ? item.classList : ''\" >{{item.symbol}}</span>\r\n }\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'icons') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (item.icons) {\r\n <mat-icon [class]=\"item.classList ? item.classList[element[item.name]] : ''\" \r\n [matTooltip]=\"item.tooltips ? item.tooltips[element[item.name]] : ''\">{{item.icons[element[item.name]]}}</mat-icon>\r\n } \r\n @if (item.symbols) {\r\n <span [class]=\"item.classList ? item.classList[element[item.name]] : ''\" >{{item.symbols[element[item.name]]}}</span>\r\n }\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'actions') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (item.actions) {\r\n <div class=\"actions-container\">\r\n @for (action of item.actions; track action) {\r\n @if (!(action.hideFn ? action.hideFn(element) : action.hide)) {\r\n <button mat-icon-button\r\n (click)=\"action.onClickFn ? action.onClickFn(element) : ''\"\r\n (mousedown)=\"action.onClickMiddleFn ? action.onClickMiddleFn($event, element) : ''\"\r\n [disabled]=\"action.disabledFn ? action.disabledFn(element) : action.disabled\"\r\n [matTooltip]=\"action.tooltip ? action.tooltip : ''\" >\r\n @if (action.icon) {\r\n <mat-icon [class]=\"action.classList ? action.classList : ''\" >{{action.icon}}</mat-icon>\r\n }\r\n @if (action.symbol) {\r\n <span [class]=\"action.classList ? action.classList : ''\" >{{action.symbol}}</span>\r\n }\r\n {{ action.title }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n } \r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'image') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n @if (element[item.name]) {\r\n <img\r\n [src]=\"element[item.name]\"\r\n [alt]=\"item.imageAlt && element[item.imageAlt] ? element[item.imageAlt] : ''\"\r\n [class]=\"item.classList ? item.classList : ''\"\r\n />\r\n } \r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n </ng-container>\r\n }\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"mat-cell\" colspan=\"9999\">\r\n Нет данных для отображения\r\n </td>\r\n </tr>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" \r\n (click)=\"onRowClicked(row)\" (dblclick)=\"onRowDblClicked(row)\" \r\n class=\"element-row\" [class.selected-row]=\"selection.isSelected(row)\">\r\n </tr>\r\n @if (footer()) {\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n }\r\n </table>\r\n <div style=\"visibility: hidden; position: fixed\"\r\n [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\"\r\n [matMenuTriggerFor]=\"contextMenu\" #menuTrigger=\"matMenuTrigger\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\">\r\n <ng-template matMenuContent let-id=\"id\">\r\n @for (menuItem of opt(); track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn(itemForMenu) : ''\"\r\n (mousedown)=\"menuItem.onClickMiddleFn ? menuItem.onClickMiddleFn($event, itemForMenu, menuTrigger) : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn(itemForMenu) : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon [class]=\"menuItem.classList ? menuItem.classList : ''\">{{menuItem.icon}}</mat-icon>\r\n }\r\n @if (menuItem.symbol) {\r\n <span [class]=\"menuItem.classList ? menuItem.classList : ''\">{{menuItem.symbol}}</span>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n </mat-menu>\r\n</div>\r\n\r\n\r\n<mat-paginator [length]=\"length()\"\r\n [pageIndex]=\"pageState().pageIndex || defaultPageIndex\"\r\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\r\n [pageSize]=\"pageState().pageSize || defaultPageSize\"\r\n showFirstLastButtons\r\n itemsPerPageLabel=\"\"\r\n></mat-paginator>\r\n</div>\r\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { inject, Injectable } from '@angular/core';\r\n\r\nimport { ProgressSpinnerComponent } from '../shared';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class LoaderService {\r\n private overlayRef: OverlayRef | null = null;\r\n\r\n private readonly overlay = inject(Overlay);\r\n\r\n public show() {\r\n if (!this.overlayRef) {\r\n this.overlayRef = this.overlay.create();\r\n }\r\n const spinnerOverlayPortal = new ComponentPortal(ProgressSpinnerComponent);\r\n // Исправление ошибки Expression has changed after it was checked\r\n setTimeout(() => {\r\n if (!this.overlayRef?.hasAttached()) {\r\n this.overlayRef?.attach(spinnerOverlayPortal);\r\n }\r\n });\r\n }\r\n\r\n public hide() {\r\n if (this.overlayRef) {\r\n this.overlayRef.detach();\r\n }\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { API_NAME } from '@kuzntsv/uikit';\r\n\r\n@Injectable({\r\n providedIn: 'root' // Сервис будет доступен глобально во всем приложении\r\n})\r\nexport class SecureImageService {\r\n private readonly http = inject(HttpClient);\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n /**\r\n * Загружает защищенное изображение и возвращает SafeUrl\r\n */\r\n getSecureUrl(relativeUrl: string | null | undefined, apiKey: string = 'default'): Observable<SafeUrl | string> {\r\n if (!relativeUrl) {\r\n return of('');\r\n }\r\n\r\n const context = new HttpContext().set(API_NAME, apiKey);\r\n\r\n return this.http.get(relativeUrl, { responseType: 'blob', context }).pipe(\r\n map((blob) => {\r\n const objectUrl = URL.createObjectURL(blob);\r\n return this.sanitizer.bypassSecurityTrustUrl(objectUrl);\r\n }),\r\n catchError((err) => {\r\n console.error(`[SecureImageService] Ошибка загрузки картинки с API \"${apiKey}\":`, err);\r\n return of(''); \r\n })\r\n );\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExportService {\r\n\r\n // Экспорт в CSV\r\n exportCSV(data: any, filename = 'data', arrHeader: any, newHeaders: any) {\r\n const csvData = this.convertToCSV(data, arrHeader, newHeaders);\r\n console.log(csvData);\r\n const blob = new Blob(['\\ufeff' + csvData], { type: 'text/csv;charset=utf-8;' });\r\n const dwldLink = document.createElement('a');\r\n const url = URL.createObjectURL(blob);\r\n const isSafariBrowser = navigator.userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('Chrome') === -1;\r\n if (isSafariBrowser) { //if Safari open in new window to save file with random filename.\r\n dwldLink.setAttribute('target', '_blank');\r\n }\r\n dwldLink.setAttribute('href', url);\r\n dwldLink.setAttribute('download', filename + '.csv');\r\n dwldLink.style.visibility = 'hidden';\r\n document.body.appendChild(dwldLink);\r\n dwldLink.click();\r\n document.body.removeChild(dwldLink);\r\n }\r\n\r\n convertToCSV(objArray: any, headerList: any, newHeaders: any) {\r\n const array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;\r\n let str = '';\r\n let row = 'S.No,';\r\n for (const index in newHeaders) {\r\n if (Object.prototype.hasOwnProperty.call(newHeaders, index)) {\r\n row += newHeaders[index] + ',';\r\n }\r\n }\r\n row = row.slice(0, -1);\r\n str += row + '\\r\\n';\r\n for (let i = 0; i < array.length; i++) {\r\n let line = (i + 1) + '';\r\n for (const index in headerList) {\r\n if (Object.prototype.hasOwnProperty.call(newHeaders, index)) {\r\n const head = headerList[index];\r\n line += ',' + array[i][head];\r\n }\r\n }\r\n str += line + '\\r\\n';\r\n }\r\n return str;\r\n }\r\n\r\n}\r\n","import { Injectable, inject, NgZone } from \"@angular/core\";\r\nimport { Observable, ReplaySubject } from \"rxjs\";\r\n\r\nimport { SseUser } from \"./models/sse-user\";\r\nimport { Topic } from \"./models/topic\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SseService<T> {\r\n\r\n private zone = inject(NgZone);\r\n\r\n private eventSource: EventSource | null = null;\r\n private isConnected = false;\r\n\r\n constructor() { }\r\n\r\n createSseEventSource(baseUrl: string, user: SseUser, topic: Topic): Observable<T> {\r\n const subject = new ReplaySubject<T>(1);\r\n\r\n // Close any existing connection\r\n this.closeSseEventSource();\r\n\r\n const topicUri = topic.getTopic(baseUrl, user);\r\n // environment.sse_url\r\n this.eventSource = new EventSource(topicUri\r\n //, {withCredentials: true}\r\n );\r\n\r\n if (this.eventSource) {\r\n this.isConnected = true;\r\n\r\n // Listen for messages\r\n this.eventSource.onmessage = (event: MessageEvent) => {\r\n console.log(event);\r\n const messageData: T = JSON.parse(event.data);\r\n this.zone.run(() => {\r\n subject.next(messageData);\r\n });\r\n };\r\n this.eventSource.onopen = () => {\r\n console.log('SSE connection opened.');\r\n };\r\n // Process error\r\n this.eventSource.onerror = (error: any) => {\r\n console.error('SSE error:', error);\r\n this.reconnectOnError(baseUrl, user, topic, subject);\r\n };\r\n }\r\n return subject.asObservable();\r\n }\r\n\r\n private reconnectOnError(baseUrl: string, user: SseUser, topic: Topic, subject: ReplaySubject<T>): void {\r\n\r\n this.closeSseEventSource();\r\n if (this.isConnected) return; // Prevent duplicate connections\r\n\r\n console.log('Reconnecting to SSE in 1 second...');\r\n setTimeout(() => {\r\n this.zone.run(() => {\r\n this.createSseEventSource(baseUrl, user, topic).subscribe(subject);\r\n });\r\n }, 1000);\r\n }\r\n\r\n closeSseEventSource(): void {\r\n if (this.eventSource) {\r\n this.eventSource.close();\r\n this.eventSource = null;\r\n this.isConnected = false;\r\n console.log('SSE Connection closed');\r\n }\r\n }\r\n}","import {\n Component,\n inject,\n input,\n OnInit,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { finalize } from 'rxjs';\n\nimport { Authenticate } from '../../models/authenticate';\nimport { AuthService, UIKIT_NOTIFICATION_TOKEN } from '@kuzntsv/uikit';\nimport { LoginFormComponent } from '../login-form/login-form.component';\nimport { PermitFormComponent } from '../permit-form/permit-form.component';\nimport { LoaderService } from '../../../services';\n\n@Component({\n selector: 'ngx-uik-login-page',\n templateUrl: 'login-page.component.html',\n styleUrls: ['login-page.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [LoginFormComponent, PermitFormComponent],\n})\nexport class LoginPageComponent implements OnInit {\n pending: boolean = false;\n error: string = '';\n isKiosk: boolean = false;\n /**\n * Идентификатор АС получаем автоматически из ActivatedRoute Data!\n * (Для этого в настройках роутера должен быть включен withComponentInputBinding())\n */\n idCas = input<number>(0);\n\n private readonly authService = inject(AuthService);\n private readonly router = inject(Router);\n private readonly loaderService = inject(LoaderService);\n private readonly notificationService = inject(UIKIT_NOTIFICATION_TOKEN, {\n optional: true,\n });\n\n ngOnInit() {\n if (\n localStorage.getItem('id_human') ||\n localStorage.getItem('kiosk-keyboard-layout')\n ) {\n // this.isKiosk = true;\n }\n }\n\n onSubmit($event: Authenticate) {\n this.loaderService.show();\n this.pending = true;\n\n this.authService\n .login($event.username, $event.password, this.idCas())\n .pipe(\n // Очищаем состояние лоадеров ВСЕГДА (и при успехе, и при ошибке)\n finalize(() => {\n this.pending = false;\n this.loaderService.hide();\n }),\n )\n .subscribe({\n next: () => this.handleSuccessLogin(),\n error: (error) => {\n const errorMsg =\n 'Ошибка при авторизации: ' + error.error ||\n error.error?.message ||\n error.message;\n this.notificationService?.error(errorMsg, 0);\n },\n });\n }\n\n onSubmitPermit($event: string) {\n const permit = $event;\n\n this.loaderService.show();\n this.pending = true;\n\n this.authService\n .loginByPermit(permit, this.idCas())\n .pipe(\n // Очищаем состояние лоадеров ВСЕГДА (и при успехе, и при ошибке)\n finalize(() => {\n this.pending = false;\n this.loaderService.hide();\n }),\n )\n .subscribe({\n next: () => this.handleSuccessLogin(),\n error: (error) => {\n const errorMsg =\n 'Ошибка при авторизации: ' + error.error ||\n error.error?.message ||\n error.message;\n this.notificationService?.error(errorMsg, 0);\n },\n });\n }\n\n private handleSuccessLogin(): void {\n this.notificationService?.success('Успешная авторизация');\n\n // ЛОГИКА ВОЗВРАТА ПОСЛЕ УСПЕШНОГО ЛОГИНА\n if (this.router) {\n // Извлекаем returnUrl из текущего query-параметра текущего маршрута\n const currentUrlTree = this.router.parseUrl(this.router.url);\n const returnUrl = currentUrlTree.queryParamMap.get('returnUrl');\n\n if (returnUrl) {\n // Декодируем и перенаправляем пользователя туда, где он был\n this.router.navigateByUrl(decodeURIComponent(returnUrl));\n return;\n }\n\n // Если returnUrl нет, идем на главную\n this.router.navigate(['/']);\n }\n\n // Логика перенаправления обратно: достаем returnUrl из текущих query-параметров страницы логина\n const currentUrlTree = this.router.parseUrl(this.router.url);\n const returnUrl = currentUrlTree.queryParamMap.get('returnUrl');\n\n if (returnUrl) {\n this.router.navigateByUrl(decodeURIComponent(returnUrl));\n }\n {\n this.router.navigate(['/']); // дефолтный роут, если returnUrl нет\n }\n }\n}\n","@if (!isKiosk) {\r\n <ngx-uik-login-form\r\n (submitted)=\"onSubmit($event)\"\r\n [pending]=\"pending\"\r\n [errorMessage]=\"error\">\r\n </ngx-uik-login-form>\r\n }\r\n @if (isKiosk) {\r\n <ngx-uik-permit-form\r\n (submitted)=\"onSubmitPermit($event)\"\r\n >\r\n </ngx-uik-permit-form>\r\n }","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\r\nimport { RoleService } from '@kuzntsv/uikit';\r\n\r\n@Directive({\r\n selector: '[ngxUikDisableIfRole]',\r\n standalone: true\r\n})\r\nexport class DisableIfRoleDirective {\r\n readonly forbiddenRoles = input<string[]>([], { alias: 'ngxUikDisableIfRole' });\r\n\r\n private readonly el = inject(ElementRef);\r\n private readonly roleService = inject(RoleService);\r\n\r\n constructor() {\r\n effect(() => {\r\n // Спрашиваем у сервиса, заблокирована ли данная конфигурация ролей\r\n const shouldDisable = this.roleService.hasForbiddenRole(this.forbiddenRoles());\r\n\r\n\r\n // 2. Безопасное управление атрибутом для любых элементов\r\n const nativeEl = this.el.nativeElement;\r\n \r\n if ('disabled' in nativeEl) {\r\n nativeEl.disabled = shouldDisable;\r\n } else {\r\n // Для элементов вроде <a>, у которых нет свойства disabled в DOM API\r\n if (shouldDisable) {\r\n nativeEl.setAttribute('disabled', 'true');\r\n } else {\r\n nativeEl.removeAttribute('disabled');\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\nimport { RoleService } from '@kuzntsv/uikit';\r\n\r\n@Directive({\r\n selector: '[ngxUikHideIfForbiddenRole]',\r\n standalone: true,\r\n})\r\nexport class HideIfForbiddenRoleDirective {\r\n readonly forbiddenRoles = input<string[]>([], {\r\n alias: 'ngxUikHideIfForbiddenRole',\r\n });\r\n\r\n private readonly el = inject(ElementRef);\r\n private readonly roleService = inject(RoleService);\r\n\r\n constructor() {\r\n effect(() => {\r\n // Элемент скрывается, если у пользователя есть запрещенная роль или передан маркер HIDE_ROLE_MARKER\r\n const shouldHide = this.roleService.hasForbiddenRole(\r\n this.forbiddenRoles(),\r\n );\r\n\r\n // Управляем отображением. Пустая строка возвращает дефолтный CSS-стиль элемента.\r\n this.el.nativeElement.style.display = shouldHide ? 'none' : '';\r\n });\r\n }\r\n}\r\n","import { Directive, effect, inject, input } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[setValue]',\r\n standalone: true,\r\n})\r\nexport class SetValueDirective {\r\n readonly value = input<any>(null, { alias: 'setValue' });\r\n\r\n // 3. Используем опциональный inject, чтобы директива не падала, если формы нет\r\n private readonly ngControl = inject(NgControl, { optional: true });\r\n\r\n constructor() {\r\n effect(() => {\r\n // Эффект автоматически отслеживает изменение входного значения\r\n const val = this.value();\r\n\r\n // Безопасное приведение undefined к null для стандартизации значений в формах\r\n const normalizedValue = val === undefined ? null : val;\r\n\r\n // Используем проверку, так как на старте ngControl.control может быть еще не создан Angular-ом\r\n if (this.ngControl && this.ngControl.control) {\r\n this.ngControl.control.setValue(normalizedValue, { emitEvent: false });\r\n }\r\n });\r\n }\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router } from '@angular/router';\r\nimport { AuthService } from '@kuzntsv/uikit';\r\n\r\nexport const authGuard = (allowedRoles: string[]): CanActivateFn => {\r\n return (route, state) => {\r\n const authService = inject(AuthService);\r\n const router = inject(Router);\r\n\r\n const isLogin = authService.loggedIn();\r\n if (!isLogin) {\r\n console.log('state.url =', state.url);\r\n\r\n // Если не зарегистрирован вернуть в форму авторизации\r\n return router.createUrlTree(['/login'], { queryParams: { returnUrl: state.url } });\r\n }\r\n\r\n return isLogin;\r\n };\r\n};","import { ActivatedRouteSnapshot, CanActivateFn } from '@angular/router';\r\n\r\nexport const redirectGuard: CanActivateFn = (route: ActivatedRouteSnapshot) => {\r\n const externalUrl = route.data?.['externalUrl'];\r\n \r\n if (externalUrl) {\r\n window.location.href = externalUrl;\r\n }\r\n \r\n return true;\r\n};\r\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn } from '@angular/router';\r\nimport { RoleService } from '@kuzntsv/uikit';\r\n\r\n/**\r\n * Пускает на роут только тех пользователей, у которых есть роли из списка allowedRoles.\r\n * ADMIN всегда имеет доступ.\r\n */\r\nexport const roleGuard = (allowedRoles: string[]): CanActivateFn => {\r\n return (route, state) => {\r\n const roleService = inject(RoleService);\r\n\r\n // Проверяем доступ на основе аргумента allowedRoles\r\n return roleService.hasAnyRole(allowedRoles);\r\n };\r\n};","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface LoggerConfig {\r\n isProduction: boolean;\r\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\r\n}\r\n\r\nexport const LOGGER_CONFIG = new InjectionToken<LoggerConfig>('LOGGER_CONFIG');\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { LOGGER_CONFIG } from './logger.config';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LoggerService {\r\n public logPrefix: string = '';\r\n private isProduction: boolean;\r\n private readonly config = inject(LOGGER_CONFIG);\r\n\r\n constructor() {\r\n this.isProduction = this.config.isProduction;\r\n }\r\n\r\n log(message: string, ...args: any[]) {\r\n if (!this.isProduction) {\r\n // Prepend log prefix log string\r\n args.unshift(this.logPrefix + ' ');\r\n console.log(`[DEV LOG]: ${message}`, ...args);\r\n }else {\r\n console.log(`[PROD LOG]: ${message}`, ...args);\r\n }\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n console.error(`[ERROR]: ${message}`, ...args);\r\n }\r\n}\r\n\r\n\r\n\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { LOGGER_CONFIG, LoggerConfig } from './logger.config';\r\nimport { LoggerService } from './logger.service';\r\n\r\n\r\nexport function provideLogger(config: LoggerConfig): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: LOGGER_CONFIG, useValue: config },\r\n LoggerService\r\n ]);\r\n};\r\n","import { Deserializable } from './deserializable.model';\r\nimport { SecUserView } from './sec-user-view.model';\r\n\r\nexport class SecUser implements Deserializable {\r\n id: number = 0;\r\n login: string = '';\r\n fio: string = '';\r\n dept: number = 0;\r\n tabnum: number = 0;\r\n userView: SecUserView | undefined;\r\n\r\n public constructor(init: SecUser) {\r\n if (init) {\r\n Object.assign(this, init);\r\n } else {\r\n this.id = 0;\r\n this.login = '';\r\n this.dept = 0;\r\n this.tabnum = 0;\r\n this.fio = '';\r\n }\r\n }\r\n\r\n deserialize(input: any): this {\r\n Object.assign(this, input);\r\n return this;\r\n }\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kuzntsv-uikit-ui.mjs","names":[],"sources":["../../ui/src/auth/components/login-form/login-form.component.ts","../../ui/src/auth/components/login-form/login-form.component.html","../../ui/src/auth/components/permit-form/permit-form.component.ts","../../ui/src/auth/components/permit-form/permit-form.component.html","../../ui/src/services/avatar.service.ts","../../ui/src/shared/chip-input-autocomplete/chip-input-autocomplete.component.ts","../../ui/src/shared/chip-input-autocomplete/chip-input-autocomplete.component.html","../../ui/src/shared/date-range-input/models/custom-date-adapter.ts","../../ui/src/shared/date-range-input/models/date-range.ts","../../ui/src/shared/date-range-input/date-range-input.component.ts","../../ui/src/shared/date-range-input/date-range-input.component.html","../../ui/src/shared/dialog/dialog.component.ts","../../ui/src/shared/dialog/dialog.component.html","../../ui/src/shared/dialog/models/dialog-action.ts","../../ui/src/shared/empty/empty.ts","../../ui/src/base/base-toolbar/components/base-toolbar.component.ts","../../ui/src/base/base-toolbar/components/base-toolbar.component.html","../../ui/src/base/base-classes/base-class.ts","../../ui/src/base/base-classes/base-edit-dialog-data.ts","../../ui/src/base/base-classes/base-edit-class.ts","../../ui/src/base/base-classes/base-entity-action.ts","../../ui/src/base/base-classes/base-filter-class.ts","../../ui/src/base/base-classes/base-nav-bar-menu-class.ts","../../ui/src/services/local-storage-service.ts","../../ui/src/base/base-classes/base-page-class.ts","../../ui/src/base/base-classes/base-service-class.ts","../../ui/src/base/base-classes/base-signal-edit-class.ts","../../ui/src/base/base-classes/base-signal-filter-class.ts","../../ui/src/base/base-classes/base-signal-page-class.ts","../../ui/src/base/base-classes/base-signal-service-class.ts","../../ui/src/pipes/safe.pipe.ts","../../ui/src/pipes/time.pipe.ts","../../ui/src/pipes/truncate.pipe.ts","../../ui/src/shared/navbar/navbar.ts","../../ui/src/shared/navbar/navbar.html","../../ui/src/shared/not-found/not-found.component.ts","../../ui/src/shared/not-found/not-found.component.html","../../ui/src/shared/progress-spinner/progress-spinner.component.ts","../../ui/src/shared/select-autocomplete-with-vs/select-autocomplete-with-vs.component.ts","../../ui/src/shared/select-autocomplete-with-vs/select-autocomplete-with-vs.component.html","../../ui/src/shared/select-with-group/select-with-group.component.ts","../../ui/src/shared/select-with-group/select-with-group.component.html","../../ui/src/shared/table/table.component.ts","../../ui/src/shared/table/table.component.html","../../ui/src/services/loader.service.ts","../../ui/src/services/secure-image.service.ts","../../ui/src/services/export.service.ts","../../ui/src/services/sse/sse.service.ts","../../ui/src/auth/components/login-page/login-page.component.ts","../../ui/src/auth/components/login-page/login-page.component.html","../../ui/src/directives/disable-if-role.directive.ts","../../ui/src/directives/hide-if-role-not.directive.ts","../../ui/src/directives/set-value.directive.ts","../../ui/src/guards/auth-guard.service.ts","../../ui/src/guards/redirect-guard.ts","../../ui/src/guards/role-guard.service.ts","../../ui/src/logger/logger.config.ts","../../ui/src/logger/logger.service.ts","../../ui/src/logger/logger.provider.ts","../../ui/src/models/sec-user.model.ts"],"sourcesContent":["import {\n Component,\n effect,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { MatButton } from '@angular/material/button';\nimport {\n MatCard,\n MatCardContent,\n MatCardHeader,\n MatCardTitle,\n} from '@angular/material/card';\nimport {\n MatError,\n MatFormField,\n MatLabel,\n MatSuffix,\n} from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\n\nimport { Authenticate } from '../../models/authenticate';\n\n@Component({\n selector: 'ngx-uik-login-form',\n templateUrl: 'login-form.component.html',\n styleUrls: ['login-form.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatCard,\n MatCardHeader,\n MatCardTitle,\n MatCardContent,\n FormsModule,\n ReactiveFormsModule,\n MatFormField,\n MatLabel,\n MatInput,\n MatError,\n MatIcon,\n MatSuffix,\n MatButton,\n ],\n})\nexport class LoginFormComponent {\n pending = input<boolean>(false);\n errorMessage = input<string>('');\n submitted = output<Authenticate>();\n\n hide = true;\n\n form: FormGroup = new FormGroup({\n username: new FormControl('', [Validators.required]),\n password: new FormControl('', [Validators.required]),\n });\n\n constructor() {\n effect(() => {\n if (this.pending()) {\n this.form.disable();\n } else {\n this.form.enable();\n }\n });\n }\n\n submit() {\n if (this.form.valid) {\n this.submitted.emit(this.form.value);\n }\n }\n}\n","<mat-card appearance=\"outlined\">\r\n <mat-card-header>\r\n <mat-card-title>\r\n Авторизация\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\r\n <p>\r\n <mat-form-field>\r\n <mat-label>Имя пользователя</mat-label>\r\n <input type=\"text\" pattern=\"[A-Za-z]{1,}.[A-Za-z]{1,}.[A-Za-z]*\"\r\n matInput\r\n autocomplete=\"on\"\r\n name=\"login-form-username\"\r\n placeholder=\"Имя пользователя\"\r\n formControlName=\"username\">\r\n @if (form.controls['username'].hasError('pattern')) {\r\n <mat-error>\r\n Пожалуйста, используйте требуемый формат (Пример: a.p.petrov)\r\n </mat-error>\r\n }\r\n @if (form.controls['username'].hasError('required')) {\r\n <mat-error>\r\n Пожалуйста, заполните это поле\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n <p>\r\n <mat-form-field>\r\n <mat-label>Пароль</mat-label>\r\n <input [type]=\"hide ? 'password' : 'text'\" matInput placeholder=\"Пароль\" formControlName=\"password\">\r\n <mat-icon class=\"watcher\" matSuffix (mousedown)=\"hide=false\" (mouseup)=\"hide=true\"\r\n >{{ hide ? 'visibility_off' : 'visibility'}}</mat-icon>\r\n @if (form.controls['password'].hasError('required')) {\r\n <mat-error>\r\n Пожалуйста, заполните это поле\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n @if (errorMessage()) {\r\n <p class=\"loginError\">\r\n {{ errorMessage() }}\r\n </p>\r\n }\r\n\r\n <p class=\"loginButtons\">\r\n <button type=\"submit\" mat-button mat-stroked-button color=\"primary\" [disabled]=\"pending()\">Войти</button>\r\n </p>\r\n\r\n </form>\r\n </mat-card-content>\r\n </mat-card>\r\n","import {\n Component,\n ElementRef,\n HostListener,\n OnInit,\n output,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n MatCard,\n MatCardContent,\n MatCardHeader,\n MatCardTitle,\n} from '@angular/material/card';\n\n@Component({\n selector: 'ngx-uik-permit-form',\n templateUrl: 'permit-form.component.html',\n styleUrls: ['permit-form.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [MatCard, MatCardHeader, MatCardTitle, MatCardContent],\n})\nexport class PermitFormComponent implements OnInit {\n readonly hidy = viewChild<ElementRef>('hidy');\n\n submitted = output<string>();\n\n @HostListener('document:mouseup', ['$event'])\n mouseHandling(event: MouseEvent) {\n this.hidy()?.nativeElement.focus();\n }\n\n ngOnInit() {\n // Обнуляем значение Input\n const hidy = this.hidy();\n if (hidy) {\n hidy.nativeElement.value = null;\n hidy.nativeElement.focus();\n }\n }\n\n /**\n * Поле ввода\n *\n * @param событие нажатия на клавишу\n */\n onKeydown(event: any): void {\n if (event.key === 'Enter') {\n const permit = this.hidy()?.nativeElement.value;\n if (permit) {\n this.submitted.emit(permit);\n }\n }\n }\n}\n","<mat-card appearance=\"outlined\">\r\n <mat-card-header>\r\n <mat-card-title>\r\n Приложите пропуск\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <div class=\"permit\"></div>\r\n </mat-card-content>\r\n</mat-card>\r\n<input #hidy class=\"hidy\" type=\"text\" (keydown)=\"onKeydown($event)\"/>","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AvatarService {\r\n baseRoute = 'common/human/';\r\n\r\n private readonly http = inject(HttpClient);\r\n\r\n getAvatarById(idHuman: number): Observable<ArrayBuffer> {\r\n return this.http.get(this.baseRoute + idHuman + '/avatar', { responseType: 'arraybuffer' });\r\n }\r\n\r\n}\r\n","import { COMMA, ENTER } from '@angular/cdk/keycodes';\nimport { AsyncPipe } from '@angular/common';\nimport {\n Component,\n effect,\n ElementRef,\n input,\n output,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n MatAutocompleteModule,\n MatAutocompleteSelectedEvent,\n MatOption,\n} from '@angular/material/autocomplete';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { Observable, startWith } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { ChipItem } from './models';\n\n@Component({\n selector: 'ngx-uik-chip-input-autocomplete',\n templateUrl: './chip-input-autocomplete.component.html',\n styleUrl: './chip-input-autocomplete.component.css',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatFormField,\n AsyncPipe,\n FormsModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n MatIcon,\n MatOption,\n MatChipsModule,\n MatLabel,\n ],\n})\nexport class BaseMatChipComponent {\n // Все элементы\n items = input<ChipItem[]>([]);\n // Выбранные элементы, ключи (ChipItem.value)\n selectedItemsInput = input<string[]>([]);\n // Заголовок\n title = input<string>('');\n // Событие изменения выбранных элементов\n selectedItemsChange = output<string[]>();\n\n readonly input = viewChild<ElementRef<HTMLInputElement>>('input');\n\n separatorKeysCodes: number[] = [ENTER, COMMA];\n inputCtrl = new FormControl();\n filteredItems$?: Observable<ChipItem[]>;\n selectedItems: ChipItem[] = [];\n\n constructor() {\n effect(() => {\n if (this.items().length > 0) {\n this.filteredItems$ = this.inputCtrl.valueChanges.pipe(\n startWith(null),\n map((item) => (item ? this._filter(item) : this.items().slice())),\n );\n }\n });\n\n effect(() => {\n if (this.selectedItemsInput())\n this.selectedItems = this.items().filter((s) =>\n this.selectedItemsInput().includes(s.value),\n );\n });\n }\n\n remove(value: string): void {\n this.selectedItems = [...this.selectedItems];\n const index = this.selectedItems.map((i) => i.value).indexOf(value);\n if (index >= 0) {\n this.selectedItems.splice(index, 1);\n this.selectedItemsChange.emit(this.selectedItems.map((i) => i.value));\n }\n }\n\n selected(event: MatAutocompleteSelectedEvent): void {\n this.selectedItems = [...this.selectedItems];\n const item = this.items().find((s) => s.value == event.option.value);\n if (item) {\n this.selectedItems.push(item);\n }\n this.selectedItemsChange.emit(this.selectedItems.map((i) => i.value));\n const inputValue = this.input();\n if (inputValue) inputValue.nativeElement.value = '';\n this.inputCtrl.setValue(null);\n }\n\n private _filter(value: string): ChipItem[] {\n const filterValue = value.toLowerCase();\n return this.items().filter((item) =>\n item.viewValue.toLowerCase().includes(filterValue),\n );\n }\n\n onCloseClick($event: MouseEvent) {\n $event.stopPropagation();\n this.selectedItemsChange.emit([]);\n }\n}\n","<mat-form-field class=\"chip-list\" appearance=\"fill\">\n <mat-label>{{ title() }}</mat-label>\n <mat-chip-grid #chipList aria-label=\"'Выбор '+title()\">\n @for (item of selectedItems; track item) {\n <mat-chip-row color=\"primary\" (removed)=\"remove(item.value)\">\n {{ item.viewValue }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n }\n </mat-chip-grid>\n <input\n #input\n [placeholder]=\"'Введите ' + title() + '...'\"\n [formControl]=\"inputCtrl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\n @for (item of filteredItems$ | async; track item) {\n <mat-option\n [value]=\"item.value\"\n [disabled]=\"\n $safeNavigationMigration(selectedItemsInput()?.includes(item.value))\n \"\n >\n {{ item.viewValue }}\n </mat-option>\n }\n </mat-autocomplete>\n @if (selectedItems.length > 0) {\n <button\n matSuffix\n mat-icon-button\n aria-label=\"Clear\"\n (click)=\"onCloseClick($event)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n</mat-form-field>\n","import { Injectable } from '@angular/core';\r\nimport { NativeDateAdapter } from '@angular/material/core';\r\n\r\n@Injectable()\r\nexport class CustomDateAdapter extends NativeDateAdapter {\r\n \r\n // 1. Как дата ПАРСИТСЯ, когда пользователь вводит её руками в инпут\r\n override parse(value: any): Date | null {\r\n if (typeof value === 'string' && value.indexOf('.') > -1) {\r\n const str = value.split('.');\r\n const year = Number(str[2]);\r\n const month = Number(str[1]) - 1;\r\n const day = Number(str[0]);\r\n return new Date(year, month, day);\r\n }\r\n const timestamp = typeof value === 'number' ? value : Date.parse(value);\r\n return isNaN(timestamp) ? null : new Date(timestamp);\r\n }\r\n\r\n // 2. Как дата ОТОБРАЖАЕТСЯ в самом инпуте\r\n override format(date: Date, displayFormat: Object): string {\r\n if (displayFormat === 'input') {\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const year = date.getFullYear();\r\n return `${day}.${month}.${year}`; // Наш строгий DD.MM.YYYY\r\n }\r\n // Для всех остальных элементов (выбор месяца, года) оставляем стандартное поведение локали\r\n return super.format(date, displayFormat);\r\n }\r\n}\r\n\r\n// Объект форматов для NativeDateAdapter\r\nexport const MY_NATIVE_FORMATS = {\r\n parse: {\r\n dateInput: 'input',\r\n },\r\n display: {\r\n dateInput: 'input', // Маркер 'input' будет перехвачен нашим методом format() выше\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n};","export interface DateRange {\r\n begin: string;\r\n end: string;\r\n}\r\n\r\nexport function dateFormat(date: Date | null | undefined): string {\r\n if (date && !isNaN(date.getTime())) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n \r\n return `${year}-${month}-${day}`;\r\n }\r\n return '';\r\n}\r\n","import {\n Component,\n effect,\n input,\n OnDestroy,\n OnInit,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';\nimport {\n MatDatepickerToggle,\n MatDateRangeInput,\n MatDateRangePicker,\n MatEndDate,\n MatStartDate,\n} from '@angular/material/datepicker';\nimport {\n MatError,\n MatFormField,\n MatLabel,\n MatSuffix,\n} from '@angular/material/form-field';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nimport { dateFormat, DateRange } from './models';\nimport { CustomDateAdapter, MY_NATIVE_FORMATS } from './models/custom-date-adapter';\n\n@Component({\n selector: 'ngx-uik-date-range-input',\n templateUrl: './date-range-input.component.html',\n styleUrls: ['./date-range-input.component.scss'],\n imports: [\n MatFormField,\n MatLabel,\n MatDateRangeInput,\n FormsModule,\n ReactiveFormsModule,\n MatStartDate,\n MatEndDate,\n MatDatepickerToggle,\n MatSuffix,\n MatDateRangePicker,\n MatError,\n ],\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [\n { provide: DateAdapter, useClass: CustomDateAdapter },\n { provide: MAT_DATE_FORMATS, useValue: MY_NATIVE_FORMATS },\n ],\n})\nexport class DateRangeInputComponent implements OnInit, OnDestroy {\n label = input<string>('');\n dateRange = input<DateRange>(<DateRange>{ begin: '', end: '' });\n // eslint-disable-next-line no-magic-numbers\n minDate = input<Date>(new Date(2020, 0, 1));\n clearInput = input<any>(null);\n required = input<boolean>(false);\n dateRangeChange = output<DateRange>();\n\n form = new FormGroup({\n begin: new FormControl(),\n end: new FormControl(),\n });\n subscription = new Subscription();\n\n constructor() {\n effect(() => {\n if (this.clearInput()) this.form.reset();\n });\n\n effect(() => {\n const value = this.dateRange();\n if (this.form) {\n this.form.controls['begin'].setValue(\n value.begin ? new Date(value.begin) : null,\n );\n this.form.controls['end'].setValue(\n value.end ? new Date(value.begin) : null,\n );\n }\n this.dateRangeChange.emit(this.rangeToDateDateRange(this.form.value));\n });\n }\n\n ngOnInit() {\n if (this.required()) {\n this.form.controls['begin'].addValidators(Validators.required);\n this.form.controls['end'].addValidators(Validators.required);\n }\n\n // подписка на изменение периода\n this.form.valueChanges\n .pipe(\n // eslint-disable-next-line no-magic-numbers\n debounceTime(500),\n distinctUntilChanged(),\n )\n .subscribe({\n next: (range) => {\n if (this.required()) {\n if (range.begin && range.end) {\n this.dateRangeChange.emit(this.rangeToDateDateRange(range));\n }\n } else {\n this.dateRangeChange.emit(this.rangeToDateDateRange(range));\n }\n },\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) this.subscription.unsubscribe();\n }\n\n private rangeToDateDateRange(\n range: Partial<{ begin: Date; end: Date }>,\n ): DateRange {\n return {\n begin: range.begin ? dateFormat(range.begin) : '',\n end: range.end ? dateFormat(range.end) : '',\n };\n }\n}\n","<mat-form-field appearance=\"fill\">\r\n <mat-label>{{label()}}</mat-label>\r\n <mat-date-range-input\r\n [rangePicker]=\"picker\"\r\n [formGroup]=\"form\"\r\n [min]=\"minDate()\">\r\n <input matStartDate formControlName=\"begin\" placeholder=\"Дата начала\">\r\n <input matEndDate formControlName=\"end\" placeholder=\"Дата окончания\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n <mat-error>Укажите период</mat-error>\r\n</mat-form-field>\r\n\r\n","import { Component, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { MatButton } from '@angular/material/button';\nimport {\n MAT_DIALOG_DATA,\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatDialogRef,\n MatDialogTitle,\n} from '@angular/material/dialog';\n\nimport { DialogData } from './models';\n\n@Component({\n selector: 'ngx-uik-dialog',\n templateUrl: './dialog.component.html',\n styleUrls: ['./dialog.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatDialogTitle,\n MatDialogContent,\n MatDialogActions,\n MatButton,\n MatDialogClose,\n ],\n})\nexport class DialogComponent {\n readonly data = inject<DialogData>(MAT_DIALOG_DATA);\n readonly dialogRef = inject(MatDialogRef<DialogComponent>);\n\n constructor() {\n if (!this.data.title) {\n this.data.title = 'Подтверждение';\n }\n if (!this.data.btnNoTitle) {\n this.data.btnNoTitle = 'Нет';\n }\n if (!this.data.btnYesTitle) {\n this.data.btnYesTitle = 'Да';\n }\n }\n\n onNoClick(): void {\n this.dialogRef.close();\n }\n}\n","<h1 mat-dialog-title>{{ data.title }}</h1>\r\n<div mat-dialog-content>\r\n <div style=\"white-space: pre-line\">{{ data.message }}</div>\r\n</div>\r\n<div mat-dialog-actions align=\"end\">\r\n <button mat-raised-button (click)=\"onNoClick()\" cdkFocusInitial>{{ data.btnNoTitle }}</button>\r\n <button mat-raised-button color=\"warn\" [mat-dialog-close]=\"data.id\">{{ data.btnYesTitle }}</button>\r\n</div>\r\n\r\n","export enum DialogAction {\r\n Add = 'Добавить',\r\n Edit = 'Изменить',\r\n Delete = 'Удалить',\r\n None = ''\r\n }","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'app-empty-route-guard-holder',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n template: '', // пустой шаблон, так как гуард сразу уводит пользователя со страницы\n})\nexport class EmptyComponent {}\n","import {\n Component,\n computed,\n inject,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatDivider } from '@angular/material/divider';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';\nimport { MatToolbar } from '@angular/material/toolbar';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { RoleService } from '@kuzntsv/uikit';\nimport { IContextMenuOptions } from '../../../shared/table';\n\n@Component({\n selector: 'ngx-uik-base-toolbar',\n templateUrl: 'base-toolbar.component.html',\n styleUrls: ['base-toolbar.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatToolbar,\n MatIconButton,\n MatTooltip,\n MatIcon,\n MatMenu,\n MatDivider,\n MatMenuTrigger,\n MatMenuItem,\n ],\n})\nexport class BaseToolbarComponent {\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesNewBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesEditBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesRemoveBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesCopyBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesExcelBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesCsvBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesPdfBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesPrintBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesRefreshBtn = input<string[]>([]);\n /**\n * Список Ролей, для которых кнопка видна. Если в списке есть роль 'HIDE', то скрывается.\n */\n rolesClearBtn = input<string[]>([]);\n\n // Состояния блокировки\n newBtnDisabled = input<boolean>(false);\n editBtnDisabled = input<boolean>(false);\n removeBtnDisabled = input<boolean>(false);\n copyBtnDisabled = input<boolean>(false);\n excelBtnDisabled = input<boolean>(false);\n csvBtnDisabled = input<boolean>(false);\n pdfBtnDisabled = input<boolean>(false);\n printBtnDisabled = input<boolean>(false);\n refreshBtnDisabled = input<boolean>(false);\n clearBtnDisabled = input<boolean>(false);\n\n // Тултипы\n newBtnTooltip = input<string>('Добавить');\n editBtnTooltip = input<string>('Изменить');\n removeBtnTooltip = input<string>('Удалить');\n copyBtnTooltip = input<string>('Скопировать');\n excelBtnTooltip = input<string>('Экспортировать в Excel');\n csvBtnTooltip = input<string>('Экспортировать в Csv');\n pdfBtnTooltip = input<string>('Экспортировать в Pdf');\n printBtnTooltip = input<string>('Печатать');\n refreshBtnTooltip = input<string>('Обновить данные');\n clearBtnTooltip = input<string>('Очистить фильтр');\n\n /** Список элементов контекстного меню. */\n newBtnOpt = input<IContextMenuOptions<string>[]>([]);\n\n // События\n clickedNewBtn = output();\n clickedEditBtn = output();\n clickedRemoveBtn = output();\n clickedCopyBtn = output();\n clickedExcelBtn = output();\n clickedCsvBtn = output();\n clickedPdfBtn = output();\n clickedPrintBtn = output();\n clickedRefreshBtn = output();\n clickedClearBtn = output();\n\n // DI\n // protected authService = inject(AuthService);\n protected roleService = inject(RoleService);\n\n // Вычисляемые сигналы видимости кнопок.\n readonly isNewBtnVisible = computed(() =>\n this.checkVisibility(this.rolesNewBtn()),\n );\n readonly isEditBtnVisible = computed(() =>\n this.checkVisibility(this.rolesEditBtn()),\n );\n readonly isRemoveBtnVisible = computed(() =>\n this.checkVisibility(this.rolesRemoveBtn()),\n );\n readonly isCopyBtnVisible = computed(() =>\n this.checkVisibility(this.rolesCopyBtn()),\n );\n readonly isExcelBtnVisible = computed(() =>\n this.checkVisibility(this.rolesExcelBtn()),\n );\n readonly isCsvBtnVisible = computed(() =>\n this.checkVisibility(this.rolesCsvBtn()),\n );\n readonly isPdfBtnVisible = computed(() =>\n this.checkVisibility(this.rolesPdfBtn()),\n );\n readonly isPrintBtnVisible = computed(() =>\n this.checkVisibility(this.rolesPrintBtn()),\n );\n readonly isRefreshBtnVisible = computed(() =>\n this.checkVisibility(this.rolesRefreshBtn()),\n );\n readonly isClearBtnVisible = computed(() =>\n this.checkVisibility(this.rolesClearBtn()),\n );\n\n /**\n * Внутренний метод для вычисления видимости.\n * Не вызывается напрямую из шаблона, а служит хелпером для декларативных computed.\n * Проверяет, заблокирован ли доступ к элементу на основе списка ограничений.\n * Возвращает true, если у пользователя есть запрещенная роль или передан маркер 'HIDE'.\n * Администратор (ADMIN) всегда игнорирует любые запреты и маркер 'HIDE'.\n */\n private checkVisibility(forbiddenRoles: string[]): boolean {\n return !this.roleService.hasForbiddenRole(forbiddenRoles);\n }\n\n onNewClick() {\n this.clickedNewBtn.emit();\n }\n\n onEditClick() {\n this.clickedEditBtn.emit();\n }\n\n onRemoveClick() {\n this.clickedRemoveBtn.emit();\n }\n\n onCopyClick() {\n this.clickedCopyBtn.emit();\n }\n\n onExcelClick() {\n this.clickedExcelBtn.emit();\n }\n\n onCsvClick() {\n this.clickedCsvBtn.emit();\n }\n\n onPdfClick() {\n this.clickedPdfBtn.emit();\n }\n\n onPrintClick() {\n this.clickedPrintBtn.emit();\n }\n\n onRefreshGridClick() {\n this.clickedRefreshBtn.emit();\n }\n\n onClearClick() {\n this.clickedClearBtn.emit();\n }\n}\n","<mat-toolbar>\r\n @if (isNewBtnVisible()) {\r\n @if (newBtnOpt() && newBtnOpt().length > 0) {\r\n <button [disabled]=\"newBtnDisabled()\" [matMenuTriggerFor]=\"menuNewBtn\"\r\n mat-icon-button [matTooltip]=\"newBtnTooltip()\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <mat-menu #menuNewBtn=\"matMenu\">\r\n @for (menuItem of newBtnOpt(); track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn('') : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn('') : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n </mat-menu>\r\n } \r\n @else {\r\n <button [disabled]=\"newBtnDisabled()\" (click)=\"onNewClick()\"\r\n mat-icon-button routerLink=\"new\" routerLinkActive=\"active\" [matTooltip]=\"newBtnTooltip()\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if (isEditBtnVisible()) {\r\n <button [disabled]=\"editBtnDisabled()\" (click)=\"onEditClick()\"\r\n mat-icon-button routerLink=\"edit\" color=\"primary\" routerLinkActive=\"active\" [matTooltip]=\"editBtnTooltip()\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n }\r\n @if (isRemoveBtnVisible()) {\r\n <button [disabled]=\"removeBtnDisabled()\" (click)=\"onRemoveClick()\"\r\n mat-icon-button routerLink=\"delete\" color=\"warn\" routerLinkActive=\"active\" [matTooltip]=\"removeBtnTooltip()\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n }\r\n @if (isCopyBtnVisible()) {\r\n <button [disabled]=\"copyBtnDisabled()\" (click)=\"onCopyClick()\"\r\n mat-icon-button routerLink=\"delete\" routerLinkActive=\"active\" [matTooltip]=\"copyBtnTooltip()\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n }\r\n @if (isExcelBtnVisible()) {\r\n <button [disabled]=\"excelBtnDisabled()\" (click)=\"onExcelClick()\"\r\n mat-icon-button routerLink=\"excel\" routerLinkActive=\"active\" [matTooltip]=\"excelBtnTooltip()\">\r\n <mat-icon class=\"material-icons-outlined\">explicit</mat-icon>\r\n </button>\r\n }\r\n @if (isCsvBtnVisible()) {\r\n <button [disabled]=\"csvBtnDisabled()\" (click)=\"onCsvClick()\"\r\n mat-icon-button routerLink=\"csv\" routerLinkActive=\"active\" [matTooltip]=\"csvBtnTooltip()\">\r\n <mat-icon class=\"material-icons-outlined\">download</mat-icon>\r\n </button>\r\n }\r\n @if (isPdfBtnVisible()) {\r\n <button [disabled]=\"pdfBtnDisabled()\" (click)=\"onPdfClick()\"\r\n mat-icon-button routerLink=\"pdf\" routerLinkActive=\"active\" [matTooltip]=\"pdfBtnTooltip()\">\r\n <mat-icon class=\"material-icons-outlined\">picture_as_pdf</mat-icon>\r\n </button>\r\n }\r\n @if (isPrintBtnVisible()) {\r\n <button [disabled]=\"printBtnDisabled()\" (click)=\"onPrintClick()\"\r\n mat-icon-button routerLink=\"print\" routerLinkActive=\"active\" [matTooltip]=\"printBtnTooltip()\">\r\n <mat-icon class=\"material-icons-outlined\">print_outline</mat-icon>\r\n </button>\r\n }\r\n @if (isRefreshBtnVisible()) {\r\n <button [disabled]=\"refreshBtnDisabled()\" (click)=\"onRefreshGridClick()\"\r\n mat-icon-button routerLink=\"refresh\" routerLinkActive=\"active\" [matTooltip]=\"refreshBtnTooltip()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n }\r\n @if (isClearBtnVisible()) {\r\n <button [disabled]=\"clearBtnDisabled()\" (click)=\"onClearClick()\"\r\n mat-icon-button routerLink=\"clear\" routerLinkActive=\"active\" [matTooltip]=\"clearBtnTooltip()\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n }\r\n</mat-toolbar>\r\n","import { z } from 'zod';\r\n\r\n// Базовая схема, описывающая, что у каждого объекта ДОЛЖЕН быть id\r\nexport const BaseSchema = z.object({\r\n id: z.number(),\r\n});\r\n\r\n// TypeScript тип для базового объекта\r\nexport type BaseSchemaClass = z.infer<typeof BaseSchema>;\r\n\r\n/** @deprecated */\r\nexport interface BaseClass {\r\n id: number;\r\n}\r\n","/** Объект передаваемый в диалог формы редактирования, оперирует доменной моделью. */\r\nexport interface IEditDialogData<T, K = any> {\r\n action: Action;\r\n /** Здесь всегда доменная модель */\r\n entity: T;\r\n /** Дополнительные данные, например, фото. */\r\n extraData?: K;\r\n}\r\n\r\nexport enum Action {\r\n Add = 'Добавление',\r\n Edit = 'Изменение'\r\n}\r\n","import { Directive, inject, OnDestroy } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { Subscription } from 'rxjs';\r\nimport { NotificationService, RoleService } from '@kuzntsv/uikit';\r\n\r\nimport { Action, IEditDialogData } from './base-edit-dialog-data';\r\nimport { LoaderService } from '../../services';\r\n\r\n@Directive()\r\nexport abstract class BaseEditClass<T> implements OnDestroy {\r\n /** Заголовок. */\r\n public abstract title: string;\r\n /** Данные диалога. */\r\n protected abstract dialogData?: IEditDialogData<T>;\r\n /** Форма. */\r\n public abstract form?: FormGroup<any>;\r\n /** Ссылка на диалог. */\r\n protected abstract dialogRef?: MatDialogRef<any, IEditDialogData<T> | null>;\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n /** Сервис ролей. */\r\n protected roleService = inject(RoleService);\r\n\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента). */\r\n protected subscription = new Subscription();\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n onNoClick(event: MouseEvent): void {\r\n this.dialogRef?.close(null);\r\n event.preventDefault(); // иначе сработает onSubmit\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.form) {\r\n if (this.form.valid) {\r\n if (this.dialogData)\r\n Object.keys(this.form.controls).forEach(\r\n (controlName) =>\r\n (this.dialogData!.entity[controlName as keyof T] =\r\n this.form?.controls[controlName].value),\r\n );\r\n this.dialogRef?.close(this.dialogData);\r\n } else {\r\n Object.keys(this.form.controls).forEach((controlName) =>\r\n this.form?.controls[controlName].markAsTouched(),\r\n );\r\n }\r\n }\r\n }\r\n\r\n formActionIsAdd(): boolean {\r\n return this.dialogData?.action === Action.Add;\r\n }\r\n\r\n formActionIsEdit(): boolean {\r\n return this.dialogData?.action === Action.Edit;\r\n }\r\n\r\n /**\r\n * Определяет видимость элемента на основе ЧЕРНОГО списка ролей.\r\n * По умолчанию элемент ВИДИМ. Скрывается (возвращает false), если у пользователя\r\n * есть запрещенная роль или если передан маркер скрытия фичи HIDE_ROLE_MARKER.\r\n */\r\n protected isVisibleForForbiddenRoles(forbiddenRoles: string[]): boolean {\r\n // Если роль запрещена, метод roleService вернет true.\r\n // Мы инвертируем (!), чтобы видимость (isMenuVisible) стала false.\r\n return !this.roleService.hasForbiddenRole(forbiddenRoles);\r\n }\r\n\r\n /**\r\n * Определяет видимость элемента на основе БЕЛОГО списка ролей.\r\n * По умолчанию элемент СКРЫТ. Показывается (возвращает true), только если у пользователя\r\n * есть хотя бы одна из разрешенных ролей. Администратор (ADMIN) всегда видит элемент.\r\n */\r\n protected isVisibleForAllowedRoles(allowedRoles: string[]): boolean {\r\n // Проверяем, есть ли у пользователя хотя бы одна роль из разрешенного списка.\r\n // (Предполагается, что у вашего roleService есть соответствующий метод, например, hasAnyRole)\r\n return this.roleService.hasAnyRole(allowedRoles);\r\n }\r\n}\r\n","export interface IEntityAction<T> {\r\n action: EntityAction;\r\n entity: T | undefined;\r\n}\r\n\r\nexport enum EntityAction {\r\n Init = 'Инициализация',\r\n Add = 'Добавление',\r\n Edit = 'Изменение',\r\n Delete = 'Удаление'\r\n}\r\n","import { Directive, inject, OnDestroy } from '@angular/core';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { LoaderService, LocalStorageService } from '../../services';\r\nimport { NotificationService } from '@kuzntsv/uikit';\r\n\r\n@Directive()\r\nexport class BaseFilterClass implements OnDestroy {\r\n\r\n /** Сервис для работы с LocalStorage. */\r\n protected localStorageService = inject(LocalStorageService);\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultDebounceTime = 500;\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента). */\r\n subscription = new Subscription();\r\n\r\n constructor() {\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n}","import { Directive, inject } from \"@angular/core\";\r\nimport { MatMenuTrigger } from \"@angular/material/menu\";\r\nimport { Router } from \"@angular/router\";\r\nimport { RoleService } from '@kuzntsv/uikit';\r\n\r\n@Directive()\r\nexport class BaseNavBarMenuClass {\r\n\r\n protected roleService = inject(RoleService);\r\n protected router = inject(Router);\r\n\r\n /** \r\n * Определяет видимость пункта меню на основе ЧЕРНОГО списка ролей.\r\n * По умолчанию пункт меню ВИДИМ. Скрывается (возвращает false), если у пользователя \r\n * есть запрещенная роль или если передан маркер скрытия фичи HIDE_ROLE_MARKER.\r\n */\r\n protected isVisibleForForbiddenRoles(forbiddenRoles: string[]): boolean {\r\n // Если роль запрещена, метод roleService вернет true. \r\n // Мы инвертируем (!), чтобы видимость (isMenuVisible) стала false.\r\n return !this.roleService.hasForbiddenRole(forbiddenRoles);\r\n }\r\n\r\n /** \r\n * Определяет видимость пункта меню на основе БЕЛОГО списка ролей.\r\n * По умолчанию пункт меню СКРЫТ. Показывается (возвращает true), только если у пользователя \r\n * есть хотя бы одна из разрешенных ролей. Администратор (ADMIN) всегда видит элемент.\r\n */\r\n protected isVisibleForAllowedRoles(allowedRoles: string[]): boolean {\r\n // Проверяем, есть ли у пользователя хотя бы одна роль из разрешенного списка.\r\n // (Предполагается, что у вашего roleService есть соответствующий метод, например, hasAnyRole)\r\n return this.roleService.hasAnyRole(allowedRoles);\r\n }\r\n\r\n /** Нажата средняя кнопка (открыть ссылку в новой вкладке). */\r\n onMiddleClick(event: MouseEvent, baseUrl: string, menu: MatMenuTrigger) {\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if (event.button === 1) {\r\n // event.preventDefault();\r\n menu.closeMenu();\r\n const urlTree = this.router.serializeUrl(\r\n this.router.createUrlTree([baseUrl]\r\n )\r\n );\r\n window.open(urlTree, '_blank');\r\n }\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LocalStorageService {\r\n\r\n constructor() { }\r\n\r\n public saveData(key: string, value: string) {\r\n localStorage.setItem(key, value);\r\n }\r\n\r\n public getData(key: string) {\r\n return localStorage.getItem(key)\r\n }\r\n public removeData(key: string) {\r\n localStorage.removeItem(key);\r\n }\r\n\r\n public clearData() {\r\n localStorage.clear();\r\n }\r\n\r\n}\r\n","import { Directive, OnDestroy, inject, signal } from '@angular/core';\r\nimport { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { Router } from '@angular/router';\r\nimport { Subject, Subscription, forkJoin, map, switchMap, tap } from 'rxjs';\r\n\r\nimport { LocalStorageService } from '../../services/local-storage-service';\r\nimport { DialogComponent } from '../../shared/dialog/dialog.component';\r\nimport { IContextMenuOptions, IPageState, ISortState, ITableState } from '../../shared/table';\r\nimport { ObjectKeys, SortDirection, fnCbType, fnGetCountType, fnGetDataType, fnMapEntityType, fnType } from '../../types/types';\r\nimport { Action, IEditDialogData } from './base-edit-dialog-data';\r\nimport { LoaderService } from '../../services';\r\nimport { NotificationService } from '@kuzntsv/uikit';\r\n\r\n@Directive()\r\nexport class BasePageClass<T> implements OnDestroy {\r\n\r\n protected dialog = inject(MatDialog);\r\n\r\n /** Данные для табличного компонента. */\r\n data = signal<T[]>([]);\r\n /** Количество записей по фильтру. */\r\n length = signal<number>(0);\r\n\r\n entityService: any;\r\n entityType: any;\r\n entityEditComponent: any;\r\n extraData?: any;\r\n\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultPageIndex = 0;\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultPageSize = 10;\r\n\r\n dialogEditWidth = 'auto';\r\n dialogRemoveWidth = '400px';\r\n\r\n routeAddress: string = '';\r\n\r\n /** Сообщение при удалении записи(й). */\r\n removalMessage: string = '';\r\n /** Заголовок страницы. */\r\n pageTitle: string = '';\r\n\r\n /**\r\n * Создание записи: вызывается перед открытием диалога.\r\n */\r\n beforeOpenDialogOnNewEvent: fnType<T>;\r\n /**\r\n * Редактирование записи: вызывается перед открытием диалога.\r\n */\r\n beforeOpenDialogOnEditEvent: fnType<T>;\r\n /**\r\n * Создание записи: вызывается перед сохранением объекта.\r\n */\r\n beforeSaveOnNewEvent: fnType<T>;\r\n /**\r\n * Редактирование записи: вызывается перед сохранением объекта.\r\n */\r\n beforeSaveOnEditEvent: fnType<T>;\r\n /**\r\n * Создание записи: вызывается после сохранения объекта.\r\n */\r\n afterSaveOnNewEvent: fnCbType<T>;\r\n /**\r\n * Редактирование записи: вызывается после сохранения объекта.\r\n */\r\n afterSaveOnEditEvent: fnCbType<T>;\r\n\r\n editorRoles: string[] = [];\r\n executeRoles: string[] = [];\r\n /** Список ролей, для которых скрыть элемент. */\r\n hideRoles: string[] = ['HIDE'];\r\n\r\n /** Загрузка данных. */\r\n loadData$: Subject<null> = new Subject<null>();\r\n /** Загрузка количества записей. */\r\n loadLength$: Subject<null> = new Subject<null>();\r\n /** Очистка фильтра. */\r\n clearFilter$: Subject<null> = new Subject<null>();\r\n\r\n /** Очистка фильтра (для очистки присвоить пустой объект '{}'). */\r\n clearFilter: any = null;\r\n\r\n /** Разрешен выбор нескольких строк. */\r\n allowMultiSelect = false;\r\n /** Выбранные строки в таблице. */\r\n selected: T[] = [];\r\n\r\n /** Состояние сортировки, пагинации. */\r\n tableState: ITableState;\r\n\r\n /** Доступность кнопки \"Изменить\". */\r\n editBtnDisabled = true;\r\n /** Доступность кнопки \"Удалить\". */\r\n removeBtnDisabled = true;\r\n\r\n /** Разрешено ли отправлять событие rowDoubleClicked при двойном щелчке мышью. */\r\n dblClickedEventEnable = true;\r\n\r\n // Список элементов контекстного меню.\r\n opt: IContextMenuOptions<T>[] = [];\r\n\r\n // DI\r\n protected router = inject(Router);\r\n /** Сервис для работы с LocalStorage. */\r\n protected localStorageService = inject(LocalStorageService);\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента). */\r\n subscription = new Subscription();\r\n\r\n constructor() {\r\n this.tableState = {\r\n sortActive: this.localStorageService.getData(this.constructor.name + 'SortActive') || '',\r\n sortDirection: (this.localStorageService.getData(this.constructor.name + 'SortDirection') || '') as SortDirection,\r\n pageIndex: Number(this.localStorageService.getData(this.constructor.name + 'PageIndex')) || this.defaultPageIndex,\r\n pageSize: Number(this.localStorageService.getData(this.constructor.name + 'PageSize')) || this.defaultPageSize\r\n };\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n subscribeToLoadData( fnGetData: fnGetDataType<T>, fnGetCount: fnGetCountType<T>, fnMapEntity?: fnMapEntityType<T>) {\r\n // отменять стримы, созданные ранее\r\n const subs = this.loadData$\r\n .pipe(\r\n tap(() => this.loaderService.show()),\r\n switchMap(() => fnGetData()),\r\n map(v => fnMapEntity ? v.map(fnMapEntity()) : v),\r\n )\r\n .subscribe({\r\n next: (response: T[]) => {\r\n this.data.set(response);\r\n this.loaderService.hide();\r\n },\r\n error: (error: any) => {\r\n this.loaderService.hide();\r\n console.log(error);\r\n this.notificationService.error('Произошла ошибка: ' + error, 0);\r\n }\r\n });\r\n this.subscription?.add(subs);\r\n\r\n const subs2 = this.loadLength$\r\n .pipe(\r\n switchMap(() => fnGetCount())\r\n )\r\n .subscribe({\r\n next: (response: number) => {\r\n this.length.set(response);\r\n },\r\n error: (error: any) => {\r\n console.log(error);\r\n this.notificationService.error('Произошла ошибка: ' + error, 0);\r\n }\r\n });\r\n this.subscription?.add(subs2);\r\n\r\n // загрузить данные и количество записей\r\n this.loadData$.next(null);\r\n this.loadLength$.next(null);\r\n }\r\n\r\n onPageChange(pageState: IPageState) {\r\n this.tableState.pageIndex = pageState.pageIndex;\r\n this.tableState.pageSize = pageState.pageSize;\r\n this.localStorageService.saveData(this.constructor.name + 'PageIndex', pageState.pageIndex.toString());\r\n this.localStorageService.saveData(this.constructor.name + 'PageSize', pageState.pageSize.toString());\r\n\r\n this.loadData$.next(null);\r\n this.loadLength$.next(null);\r\n }\r\n\r\n onSortChange(sortState: ISortState) {\r\n this.tableState.sortActive = sortState.sortActive;\r\n this.tableState.sortDirection = sortState.sortDirection;\r\n this.localStorageService.saveData(this.constructor.name + 'SortActive', sortState.sortActive);\r\n this.localStorageService.saveData(this.constructor.name + 'SortDirection', sortState.sortDirection);\r\n\r\n this.loadData$.next(null);\r\n this.loadLength$.next(null);\r\n }\r\n\r\n /** Событие изменение выбранных записей. */\r\n onSelectionChange(selected: T[]) {\r\n this.selected = selected;\r\n this.editBtnDisabledUpdate(this.selected);\r\n this.removeBtnDisabledUpdate(this.selected);\r\n }\r\n\r\n /** Обновление доступности кнопки \"Изменить\" - вызывается при изменении выбранных записей. */\r\n editBtnDisabledUpdate(selected: T[]) {\r\n this.editBtnDisabled = !(selected && selected.length === 1);\r\n }\r\n\r\n /** Обновление доступности кнопки \"Удалить\" - вызывается при изменении выбранных записей. */\r\n removeBtnDisabledUpdate(selected: T[]) {\r\n this.removeBtnDisabled = !(selected && selected.length > 0);\r\n }\r\n\r\n /** Событие двойной клик. */\r\n onRowDoubleClicked() {\r\n this.editEvent();\r\n }\r\n\r\n /** Событие создание. */\r\n newEvent() {\r\n if (this.entityEditComponent) {\r\n const data: IEditDialogData<T> = { action: Action.Add, entity: new this.entityType(null) };\r\n\r\n // Назначить значения полей объекта перед открытием диалога.\r\n if (this.beforeOpenDialogOnNewEvent) {\r\n this.beforeOpenDialogOnNewEvent(data.entity, data.extraData);\r\n }\r\n\r\n // Открытие окна\r\n const dialogRef = this.openDialog(this.entityEditComponent, data, this.dialog);\r\n\r\n // Обработка закрытия окна\r\n const subs = dialogRef.afterClosed().subscribe((result: IEditDialogData<T>) => {\r\n // Проверка результата\r\n if (result && result.entity && (Object.keys(result.entity).length !== 0)) {\r\n // Дополнительные действия перед сохранением объекта.\r\n if (this.beforeSaveOnNewEvent)\r\n this.beforeSaveOnNewEvent(result.entity, result.extraData);\r\n\r\n const subs = this.entityService.newObject(result.entity)\r\n .subscribe({\r\n next: (obj: any) => {\r\n // Дополнительные действия после сохранения объекта.\r\n if (this.afterSaveOnNewEvent) {\r\n const callback = () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись добавлена.');\r\n }\r\n this.afterSaveOnNewEvent(callback.bind(this), obj, result.extraData);\r\n } else {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись добавлена.');\r\n }\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error('Произошла ошибка при добавлении записи: ' + error, 0);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n } else {\r\n this.notificationService.warning('Действие не доступно.');\r\n }\r\n }\r\n\r\n /** Событие редактирование. */\r\n editEvent() {\r\n if (this.selected && this.selected.length === 1) {\r\n if (this.entityEditComponent) {\r\n const data: IEditDialogData<T> = { action: Action.Edit, entity: this.selected[0] };\r\n\r\n // Назначить значения полей объекта перед открытием диалога.\r\n if (this.beforeOpenDialogOnEditEvent) {\r\n this.beforeOpenDialogOnEditEvent(data.entity, data.extraData);\r\n }\r\n\r\n // Открытие окна\r\n const dialogRef = this.openDialog(this.entityEditComponent, data, this.dialog);\r\n\r\n // Обработка закрытия окна\r\n const subs = dialogRef.afterClosed().subscribe((result: IEditDialogData<T>) => {\r\n // Проверка результата\r\n if (result && result.entity && (Object.keys(result.entity).length !== 0)) {\r\n // Дополнительные действия перед сохранением объекта.\r\n if (this.beforeSaveOnEditEvent)\r\n this.beforeSaveOnEditEvent(result.entity, result.extraData);\r\n\r\n const subs = this.entityService.editObject(result.entity)\r\n .subscribe({\r\n next: () => {\r\n // Дополнительные действия после сохранения объекта.\r\n if (this.afterSaveOnEditEvent) {\r\n const callback = () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись изменена.');\r\n }\r\n this.afterSaveOnEditEvent(callback.bind(this), result.entity, result.extraData);\r\n } else {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись изменена.');\r\n }\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error('Произошла ошибка при изменении записи: ' + error, 0);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n } else {\r\n this.notificationService.warning('Действие не доступно.');\r\n }\r\n }\r\n }\r\n\r\n /** Событие удаление. */\r\n removeEvent() {\r\n // если выбрана запись(и)\r\n if (this.selected && this.selected.length > 0) {\r\n const dialogRef = this.openDialogRemoveConfirm(this.removalMessage);\r\n if (dialogRef) {\r\n const subs = dialogRef.afterClosed().subscribe((result: any) => {\r\n // при подтверждении возвращается 'delete'\r\n if (result === 'delete') {\r\n // готовим объект с запросами на удаление\r\n const sourcesObject: ObjectKeys = {};\r\n this.selected.forEach((item, index) => sourcesObject['obj' + index] = this.entityService.deleteObject(item));\r\n // ждем, когда выполнятся все запросы\r\n const subs = forkJoin(sourcesObject)\r\n .subscribe({\r\n next: () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Выбранные записи удалены.');\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error('Произошла ошибка при удалении записи: ' + error, 0);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n }\r\n }\r\n }\r\n\r\n /** Событие обновления данных. */\r\n refreshEvent() {\r\n this.loadData$.next(null);\r\n this.loadLength$.next(null);\r\n }\r\n\r\n /** Событие очистки фильтра. */\r\n clearEvent() {\r\n this.clearFilter$.next(null);\r\n this.clearFilter = {};\r\n }\r\n\r\n /** Изменение сообщения об удалении. */\r\n onRemovalMessageChange(message: string) {\r\n this.removalMessage = message;\r\n }\r\n\r\n /** Изменение заголовка страницы. */\r\n onPageTitleChange(title: string) {\r\n this.pageTitle = title;\r\n }\r\n\r\n openDialog(entityComponent: any, data: IEditDialogData<T>, dialog: any) {\r\n // create dialog config\r\n const dialogConfig = new MatDialogConfig();\r\n dialogConfig.disableClose = true;\r\n dialogConfig.autoFocus = true;\r\n dialogConfig.width = this.dialogEditWidth;\r\n dialogConfig.data = data;\r\n dialogConfig.panelClass = this.entityType.name + '-edit-dialog';\r\n // return dialog\r\n return dialog.open(entityComponent, dialogConfig);\r\n }\r\n\r\n openDialogRemoveConfirm(removalMessage: string): MatDialogRef<DialogComponent> | undefined {\r\n let message = 'Вы хотите удалить ';\r\n message += removalMessage ?\r\n removalMessage :\r\n this.allowMultiSelect ? `выбранные записи (${this.selected.length})?` : 'выбранную запись?';\r\n return this.dialog.open(DialogComponent, {\r\n width: this.dialogRemoveWidth,\r\n data: {\r\n id: 'delete',\r\n title: 'Подтверждение',\r\n message: message,\r\n btnNoTitle: 'Отмена',\r\n btnYesTitle: 'Удалить'\r\n }\r\n });\r\n }\r\n\r\n // contextMenu: При щелчке ПКМ открыть в новой вкладке.\r\n protected onMiddleButton(baseUrl: string, queryParamName?: string, queryParamValue?: string) {\r\n return ($event: MouseEvent, item: T | undefined, contextMenu: MatMenuTrigger) => {\r\n // Нажата средняя кнопка (в новой вкладке).\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if ($event.button === 1 && item) {\r\n //$event.preventDefault();\r\n contextMenu.closeMenu();\r\n // Converts the route into a string that can be used\r\n // with the window.open() function\r\n const url = this.router.serializeUrl(\r\n queryParamName && queryParamValue ?\r\n this.router.createUrlTree([baseUrl], { queryParams: { [queryParamName]: item[queryParamValue as keyof T] } })\r\n : this.router.createUrlTree([baseUrl])\r\n );\r\n window.open(url, '_blank');\r\n }\r\n };\r\n }\r\n\r\n // Action в таблице: При щелчке ПКМ открыть в новой вкладке.\r\n protected onActionMiddleButton(baseUrl: string, queryParamName?: string, queryParamValue?: string) {\r\n return ($event: MouseEvent, item: T | undefined) => {\r\n // Нажата средняя кнопка (в новой вкладке).\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if ($event.button === 1 && item) {\r\n //$event.preventDefault();\r\n // Converts the route into a string that can be used\r\n // with the window.open() function\r\n const url = this.router.serializeUrl(\r\n queryParamName && queryParamValue ?\r\n this.router.createUrlTree([baseUrl], { queryParams: { [queryParamName]: item[queryParamValue as keyof T] } })\r\n : this.router.createUrlTree([baseUrl])\r\n );\r\n window.open(url, '_blank');\r\n }\r\n };\r\n }\r\n\r\n protected dateToString(date: string | number | Date) {\r\n return date ? (new Date(date)).toLocaleString('ru-RU', { timeZone: 'Europe/Samara' }) : null; // MSK+01\r\n }\r\n\r\n}\r\n\r\n","import { HttpClient, HttpContext, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\nimport { BaseClass } from './base-class';\r\nimport { API_NAME } from '@kuzntsv/uikit';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport abstract class BaseServiceClass<T extends BaseClass> {\r\n abstract baseRoute: string;\r\n abstract entityType: any;\r\n\r\n protected countRoute = 'count';\r\n\r\n protected pageIndexParam = 'page';\r\n protected pageSizeParam = 'limit';\r\n protected sortColumnParam = 'column';\r\n protected directionParam = 'direction';\r\n\r\n // По умолчанию используем дефолтное API (пустая строка)\r\n protected apiContextName = ''; \r\n\r\n protected http = inject(HttpClient);\r\n\r\n getObjects(): Observable<T[]> {\r\n return this.http.get<T[]>(this.baseRoute, this.getHttpContext())\r\n .pipe(map(data => data.map(item => new this.entityType(item).deserialize(item))));\r\n }\r\n\r\n getObject(id: number): any {\r\n return this.http.get<T>(this.baseRoute + id, this.getHttpContext())\r\n .pipe(map(data => new this.entityType(data).deserialize(data)));\r\n }\r\n\r\n getCount(): Observable<number> {\r\n return this.http.get<number>(this.baseRoute + this.countRoute, this.getHttpContext());\r\n }\r\n\r\n getObjectsByPaging(pageIndex: number, pageSize: number, sortColumn: string, direction: string): Observable<T[]> {\r\n const params = this.getParams(pageIndex, pageSize, sortColumn, direction);\r\n return this.http.get<T[]>(this.baseRoute, { params, ...this.getHttpContext()})\r\n .pipe(map(data => data.map(item => new this.entityType(item).deserialize(item))));\r\n }\r\n\r\n newObject(entity: T): any {\r\n return this.http.post(this.baseRoute, entity, this.getHttpContext());\r\n }\r\n\r\n editObject(entity: T): any {\r\n return this.http.put(this.baseRoute + entity.id, entity, this.getHttpContext());\r\n }\r\n\r\n deleteObject(entity: T): any {\r\n return this.http.delete(this.baseRoute + entity.id, this.getHttpContext());\r\n }\r\n\r\n protected getParams(pageIndex: number, pageSize: number, sortColumn: string, direction: string): HttpParams {\r\n let params = new HttpParams();\r\n if (pageIndex + 1)\r\n // переход от индекса к номеру страницы\r\n params = params.append(this.pageIndexParam, pageIndex + 1);\r\n if (pageSize)\r\n params = params.append(this.pageSizeParam, pageSize);\r\n if (sortColumn)\r\n params = params.append(this.sortColumnParam, sortColumn);\r\n if (direction)\r\n params = params.append(this.directionParam, direction);\r\n return params;\r\n }\r\n\r\n // Вспомогательный метод для сборки опций HttpClient\r\n protected getHttpContext(): { context?: HttpContext } {\r\n // Если имя не задано (пустая строка, null или undefined), возвращаем пустой объект\r\n if (!this.apiContextName) {\r\n return {};\r\n }\r\n\r\n // Если имя задано, создаем и возвращаем контекст\r\n return {\r\n context: new HttpContext().set(API_NAME, this.apiContextName)\r\n };\r\n }\r\n}\r\n","import {\r\n computed,\r\n Directive,\r\n inject,\r\n linkedSignal,\r\n OnDestroy,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { FieldTree } from '@angular/forms/signals';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { NotificationService } from '@kuzntsv/uikit';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { LoaderService } from '../../services';\r\nimport { Action, IEditDialogData } from './base-edit-dialog-data';\r\n\r\n@Directive()\r\nexport abstract class BaseSignalEditClass<\r\n TDomain extends Record<string, any>,\r\n TForm extends Record<string, any> = TDomain, // TForm по умолчанию равен TDomain\r\n> implements OnDestroy {\r\n /** Заголовок. */\r\n public abstract title: string;\r\n /** Данные диалога. */\r\n protected abstract dialogData: WritableSignal<IEditDialogData<TDomain>>;\r\n\r\n protected formAction = computed(() => this.dialogData().action);\r\n protected formActionIsAdd = computed(\r\n () => this.dialogData().action === Action.Add,\r\n );\r\n protected formActionIsEdit = computed(\r\n () => this.dialogData().action === Action.Edit,\r\n );\r\n protected domainModel = computed(() => this.dialogData().entity);\r\n protected formModel = linkedSignal({\r\n source: this.domainModel,\r\n computation: (domainModel) => this.domainModelToFormModel(domainModel),\r\n });\r\n /** Форма. */\r\n protected abstract form: FieldTree<TForm>;\r\n /** Ссылка на диалог. */\r\n protected abstract dialogRef?: MatDialogRef<\r\n any,\r\n IEditDialogData<TDomain> | null\r\n >;\r\n\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента).\r\n * @deprecated\r\n */\r\n protected subscription = new Subscription();\r\n\r\n /**\r\n * Маппинг: Домен -> Форма.\r\n * Реализация по умолчанию делает поверхностную копию. Наследник может её переопределить.\r\n */\r\n protected domainModelToFormModel(domainModel: TDomain): TForm {\r\n return { ...domainModel } as unknown as TForm;\r\n }\r\n\r\n /**\r\n * Маппинг: Форма -> Домен.\r\n * Реализация по умолчанию объединяет старый домен и новые поля формы.\r\n */\r\n protected formModelToDomainModel(\r\n formModel: TForm,\r\n originalDomain?: TDomain,\r\n ): TDomain {\r\n return {\r\n ...originalDomain,\r\n ...(formModel as unknown as Partial<TDomain>),\r\n } as TDomain;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n onNoClick(event: MouseEvent): void {\r\n this.dialogRef?.close(null);\r\n event.preventDefault(); // иначе сработает onSubmit\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.form().valid()) {\r\n const updatedDomainEntity = this.formModelToDomainModel(this.formModel());\r\n this.dialogData.update(\r\n (currentData) =>\r\n ({\r\n ...currentData,\r\n entity: updatedDomainEntity,\r\n }) as IEditDialogData<TDomain>,\r\n );\r\n this.dialogRef?.close(this.dialogData());\r\n } else {\r\n this.form().markAsTouched();\r\n }\r\n }\r\n}\r\n","import { Directive, inject, input, linkedSignal, model, OnDestroy, output } from '@angular/core';\r\nimport { NotificationService } from '@kuzntsv/uikit';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { LoaderService } from '../../services';\r\nimport { SafeFilterState } from './base-filter.model';\r\n\r\n@Directive()\r\nexport class BaseSignalFilterClass implements OnDestroy {\r\n\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n \r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(NotificationService);\r\n \r\n /** Время на успокоение значения фильтра. */\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultDebounceTime = 500;\r\n\r\n /** \r\n * writable-сигнал, Принимаем текущее реактивное состояние фильтров с родительской страницы.\r\n * Родитель передает значение через [(filters)]=\"pageFilters()\".\r\n * При любом изменении полей ввода обновляйте сигнал целиком через метод update.\r\n * \r\n * @example\r\n * updateCategory(newCategory: string) {\r\n * this.filters.update(prev => ({ ...prev, category: newCategory }));\r\n * }\r\n */\r\n initialValues = input<SafeFilterState>({});\r\n\r\n /** Входной сигнал для сброса состояния формы. */\r\n clearFilter = input<any>(null);\r\n\r\n // Один output с типом Record<string, any> взамен пяти старых\r\n filterChange = output<SafeFilterState>();\r\n\r\n // Локальный writable-сигнал, который зависит от input\r\n filter = linkedSignal(() => this.initialValues());\r\n\r\n /** \r\n * Объект для отписки от внутренних подписок (например, valueChanges у FormControl).\r\n * Метод unsubscribe вызывается при уничтожении компонента.\r\n */\r\n subscription = new Subscription();\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n}\r\n","import { Directive, OnDestroy, computed, effect, inject, signal } from '@angular/core';\r\nimport {\r\n MatDialog,\r\n MatDialogConfig,\r\n MatDialogRef,\r\n} from '@angular/material/dialog';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { Router } from '@angular/router';\r\nimport { HIDE_ROLE_MARKER, UIKIT_NOTIFICATION_TOKEN } from '@kuzntsv/uikit';\r\nimport { Subscription, finalize, forkJoin, map } from 'rxjs';\r\n\r\nimport { LoaderService } from '../../services';\r\nimport { LocalStorageService } from '../../services/local-storage-service';\r\nimport { DialogComponent } from '../../shared/dialog/dialog.component';\r\nimport {\r\n IContextMenuOptions,\r\n IPageState,\r\n ISortState,\r\n ITableState,\r\n} from '../../shared/table';\r\nimport {\r\n ObjectKeys,\r\n SortDirection,\r\n fnCbType,\r\n fnGetCountResType,\r\n fnGetDataResType,\r\n fnMapEntityType,\r\n fnType,\r\n} from '../../types/types';\r\nimport { Action, IEditDialogData } from './base-edit-dialog-data';\r\nimport { SafeFilterState } from './base-filter.model';\r\n\r\n@Directive()\r\nexport class BaseSignalPageClass<T> implements OnDestroy {\r\n protected dialog = inject(MatDialog);\r\n\r\n entityService: any;\r\n entityType: any;\r\n entityEditComponent: any;\r\n extraData?: any;\r\n\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultPageIndex = 0;\r\n // eslint-disable-next-line no-magic-numbers\r\n defaultPageSize = 10;\r\n\r\n dialogEditWidth = 'auto';\r\n dialogRemoveWidth = '400px';\r\n\r\n routeAddress: string = '';\r\n\r\n /** Сообщение при удалении записи(й). */\r\n removalMessage: string = '';\r\n /** Заголовок страницы. */\r\n pageTitle: string = '';\r\n\r\n /**\r\n * Создание записи: вызывается перед открытием диалога.\r\n */\r\n beforeOpenDialogOnNewEvent: fnType<T>;\r\n /**\r\n * Редактирование записи: вызывается перед открытием диалога.\r\n */\r\n beforeOpenDialogOnEditEvent: fnType<T>;\r\n /**\r\n * Создание записи: вызывается перед сохранением объекта.\r\n */\r\n beforeSaveOnNewEvent: fnType<T>;\r\n /**\r\n * Редактирование записи: вызывается перед сохранением объекта.\r\n */\r\n beforeSaveOnEditEvent: fnType<T>;\r\n /**\r\n * Создание записи: вызывается после сохранения объекта.\r\n */\r\n afterSaveOnNewEvent: fnCbType<T>;\r\n /**\r\n * Редактирование записи: вызывается после сохранения объекта.\r\n */\r\n afterSaveOnEditEvent: fnCbType<T>;\r\n\r\n editorRoles: string[] = [];\r\n executeRoles: string[] = [];\r\n /** Список ролей, для которых скрыть элемент. */\r\n hideRoles: string[] = [HIDE_ROLE_MARKER];\r\n\r\n /** Загрузка данных. */\r\n // loadData$: Subject<null> = new Subject<null>();\r\n /** Загрузка количества записей. */\r\n // loadLength$: Subject<null> = new Subject<null>();\r\n /** Очистка фильтра. (для очистки присвоить пустой объект '{}'). */\r\n clearFilters = signal<any>(null);\r\n\r\n /** Разрешен выбор нескольких строк. */\r\n allowMultiSelect = false;\r\n /** Выбранные строки в таблице. */\r\n selected: T[] = [];\r\n\r\n // Сигналы для ленивой инициализации функций загрузки данных\r\n protected fnGetData = signal<fnGetDataResType<T> | null>(null);\r\n protected fnGetCount = signal<fnGetCountResType<T> | null>(null);\r\n protected fnMapEntity = signal<fnMapEntityType<T> | undefined>(undefined);\r\n\r\n // 2. Описываем Ресурс для получения списка ДАННЫХ\r\n protected dataResource = computed(() => {\r\n // Ресурс сработает автоматически при изменении любого из этих сигналов:\r\n\r\n const fetchFn = this.fnGetData();\r\n if (!fetchFn) return null; // Ждем инициализации в ngOnInit\r\n\r\n // Читаем сигналы состояния, чтобы httpResource внутри сервиса автоматически перезапускался\r\n const state = this.tableState();\r\n const currentFilters = this.filters(); \r\n\r\n // Вызываем переданную функцию загрузки (поддерживает Observable/Promise благодаря Resource API)\r\n return fetchFn();\r\n });\r\n\r\n // 3. Описываем Ресурс для получения КОЛИЧЕСТВА записей\r\n protected countResource = computed(() => {\r\n\r\n const fetchCountFn = this.fnGetCount();\r\n if (!fetchCountFn) return null;\r\n\r\n const currentFilters = this.filters(); \r\n\r\n return fetchCountFn();\r\n\r\n });\r\n\r\n // 4. Связываем старые свойства-сигналы с новыми ресурсами для совместимости с шаблонами\r\n /** Данные для табличного компонента. */\r\n data = computed<T[]>(() => {\r\n const rawData = this.dataResource()?.value() || [];\r\n const mapFn = this.fnMapEntity();\r\n \r\n if (mapFn && Array.isArray(rawData)) {\r\n return rawData.map(mapFn());\r\n }\r\n return rawData;\r\n });\r\n /** Количество записей по фильтру. */\r\n length = computed<number>(() => this.countResource()?.value() || 0);\r\n\r\n /** Глобальный индикатор загрузки (для спиннера на странице) */\r\n isLoading = computed<boolean>(() => {\r\n const dataLoading = this.dataResource()?.isLoading() ?? false;\r\n const countLoading = this.countResource()?.isLoading() ?? false;\r\n return dataLoading || countLoading;\r\n });\r\n\r\n /** Доступность кнопки \"Изменить\". */\r\n editBtnDisabled = true;\r\n /** Доступность кнопки \"Удалить\". */\r\n removeBtnDisabled = true;\r\n\r\n /** Разрешено ли отправлять событие rowDoubleClicked при двойном щелчке мышью. */\r\n dblClickedEventEnable = true;\r\n\r\n // Список элементов контекстного меню.\r\n opt: IContextMenuOptions<T>[] = [];\r\n\r\n // DI\r\n protected router = inject(Router);\r\n /** Сервис для работы с LocalStorage. */\r\n protected localStorageService = inject(LocalStorageService);\r\n /** Сервис индикатор загрузки. */\r\n protected loaderService = inject(LoaderService);\r\n /** Сервис уведомлений. */\r\n protected notificationService = inject(UIKIT_NOTIFICATION_TOKEN);\r\n /** Объект для отписки (вызывается метод unsubscribe при уничтожении компонента). */\r\n subscription = new Subscription();\r\n\r\n private getInitialFilters(): SafeFilterState {\r\n const saved = this.localStorageService.getData(this.constructor.name + '_Filters');\r\n return saved ? (JSON.parse(saved) as SafeFilterState) : {};\r\n }\r\n\r\n private getInitialFilters2(): SafeFilterState {\r\n const prefix = this.constructor.name + '_Filter_';\r\n const state: Record<string, any> = {};\r\n\r\n // Проходим по всем ключам LocalStorage и собираем только фильтры этой страницы\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n const filterKey = key.replace(prefix, '');\r\n const rawValue = this.localStorageService.getData(key);\r\n try {\r\n state[filterKey] = rawValue ? JSON.parse(rawValue) : rawValue;\r\n } catch {\r\n state[filterKey] = rawValue; // если там была просто строка\r\n }\r\n }\r\n }\r\n return state;\r\n }\r\n\r\n // Единое реактивное хранилище для ВСЕХ фильтров текущей страницы\r\n filters = signal<SafeFilterState>(this.getInitialFilters());\r\n\r\n\r\n // 1. Инициализация сигнала filters при старте страницы\r\nfilters2 = signal<Record<string, any>>(this.getInitialFilters2());\r\n\r\n\r\n /** Состояние сортировки, пагинации. */\r\n tableState = signal<ITableState>({\r\n sortActive: '',\r\n sortDirection: '' as SortDirection,\r\n pageIndex: this.defaultPageIndex,\r\n pageSize: this.defaultPageSize,\r\n });\r\n\r\n constructor() {\r\n this.tableState.set({\r\n sortActive:\r\n this.localStorageService.getData(\r\n this.constructor.name + 'SortActive',\r\n ) || '',\r\n sortDirection: (this.localStorageService.getData(\r\n this.constructor.name + 'SortDirection',\r\n ) || '') as SortDirection,\r\n pageIndex:\r\n Number(\r\n this.localStorageService.getData(this.constructor.name + 'PageIndex'),\r\n ) || this.defaultPageIndex,\r\n pageSize:\r\n Number(\r\n this.localStorageService.getData(this.constructor.name + 'PageSize'),\r\n ) || this.defaultPageSize,\r\n });\r\n\r\n // 5. Автоматическое управление глобальным LoaderService через эффект\r\n effect(() => {\r\n const showLoader = this.isLoading();\r\n if (showLoader) {\r\n this.loaderService.show();\r\n } else {\r\n this.loaderService.hide();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n // 4. Новый метод просто прокидывает функции в сигналы, запуская ресурсы\r\n subscribeToLoadData(\r\n fnGetData: fnGetDataResType<T>,\r\n fnGetCount: fnGetCountResType<T>,\r\n fnMapEntity?: fnMapEntityType<T>,\r\n ) {\r\n this.fnMapEntity.set(fnMapEntity);\r\n this.fnGetData.set(fnGetData);\r\n this.fnGetCount.set(fnGetCount);\r\n }\r\n\r\n\r\n\r\n\r\n // // 3. Метод для динамической установки/обновления фильтров из любого компонента\r\n // setFilter(key: string, value: any) {\r\n // this.filters.update((prev) => {\r\n // const next = { ...prev };\r\n\r\n // // Сохраняем ВЕСЬ объект фильтров одной строкой для этой конкретной страницы\r\n // this.localStorageService.saveData(\r\n // this.constructor.name + '_Filters',\r\n // JSON.stringify(next),\r\n // );\r\n // return next;\r\n // });\r\n\r\n // // При любом изменении фильтра сбрасываем пагинацию на первую страницу\r\n // this.tableState.update((prev) => ({ ...prev, pageIndex: 0 }));\r\n // }\r\n// 2. Адаптированный метод установки фильтра\r\nsetFilter(key: string, value: any) {\r\n const storageKey = `${this.constructor.name}_Filter_${key}`;\r\n\r\n // При любом изменении фильтра сбрасываем пагинацию на первую страницу\r\n this.tableState.update((prev) => ({ ...prev, pageIndex: 0 }));\r\n\r\n this.filters.update((prev) => {\r\n const next = { ...prev };\r\n \r\n if (value === null || value === undefined || value === '' || value === '-1') {\r\n delete next[key];\r\n // Удаляем из LocalStorage только это конкретное поле!\r\n localStorage.removeItem(storageKey); \r\n } else {\r\n next[key] = value;\r\n // Записываем в LocalStorage только это конкретное поле!\r\n this.localStorageService.saveData(storageKey, JSON.stringify(value));\r\n }\r\n return next;\r\n });\r\n\r\n \r\n}\r\n\r\n\r\n onPageChange(pageState: IPageState) {\r\n this.localStorageService.saveData(\r\n this.constructor.name + 'PageIndex',\r\n pageState.pageIndex.toString(),\r\n );\r\n this.localStorageService.saveData(\r\n this.constructor.name + 'PageSize',\r\n pageState.pageSize.toString(),\r\n );\r\n\r\n this.tableState.update((prev) => ({\r\n ...prev,\r\n pageIndex: pageState.pageIndex,\r\n pageSize: pageState.pageSize,\r\n }));\r\n }\r\n\r\n onSortChange(sortState: ISortState) {\r\n this.localStorageService.saveData(\r\n this.constructor.name + 'SortActive',\r\n sortState.sortActive,\r\n );\r\n this.localStorageService.saveData(\r\n this.constructor.name + 'SortDirection',\r\n sortState.sortDirection,\r\n );\r\n\r\n this.tableState.update((prev) => ({\r\n ...prev,\r\n sortActive: sortState.sortActive,\r\n sortDirection: sortState.sortDirection,\r\n }));\r\n }\r\n\r\n /** Событие изменение выбранных записей. */\r\n onSelectionChange(selected: T[]) {\r\n this.selected = selected;\r\n this.editBtnDisabledUpdate(this.selected);\r\n this.removeBtnDisabledUpdate(this.selected);\r\n }\r\n\r\n /** Обновление доступности кнопки \"Изменить\" - вызывается при изменении выбранных записей. */\r\n editBtnDisabledUpdate(selected: T[]) {\r\n this.editBtnDisabled = !(selected && selected.length === 1);\r\n }\r\n\r\n /** Обновление доступности кнопки \"Удалить\" - вызывается при изменении выбранных записей. */\r\n removeBtnDisabledUpdate(selected: T[]) {\r\n this.removeBtnDisabled = !(selected && selected.length > 0);\r\n }\r\n\r\n /** Событие двойной клик. */\r\n onRowDoubleClicked() {\r\n this.editEvent();\r\n }\r\n\r\n /** Событие создание. */\r\n newEvent() {\r\n if (this.entityEditComponent) {\r\n const data: IEditDialogData<T> = {\r\n action: Action.Add,\r\n entity: new this.entityType(null),\r\n };\r\n\r\n // Назначить значения полей объекта перед открытием диалога.\r\n if (this.beforeOpenDialogOnNewEvent) {\r\n this.beforeOpenDialogOnNewEvent(data.entity, data.extraData);\r\n }\r\n\r\n // Открытие окна\r\n const dialogRef = this.openDialog(\r\n this.entityEditComponent,\r\n data,\r\n this.dialog,\r\n );\r\n\r\n // Обработка закрытия окна\r\n const subs = dialogRef\r\n .afterClosed()\r\n .subscribe((result: IEditDialogData<T>) => {\r\n // Проверка результата\r\n if (\r\n result &&\r\n result.entity &&\r\n Object.keys(result.entity).length !== 0\r\n ) {\r\n // Дополнительные действия перед сохранением объекта.\r\n if (this.beforeSaveOnNewEvent)\r\n this.beforeSaveOnNewEvent(result.entity, result.extraData);\r\n\r\n const subs = this.entityService.newObject(result.entity).subscribe({\r\n next: (obj: any) => {\r\n // Дополнительные действия после сохранения объекта.\r\n if (this.afterSaveOnNewEvent) {\r\n const callback = () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись добавлена.');\r\n };\r\n this.afterSaveOnNewEvent(\r\n callback.bind(this),\r\n obj,\r\n result.extraData,\r\n );\r\n } else {\r\n this.refreshEvent();\r\n this.notificationService?.success('Запись добавлена.');\r\n }\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error(\r\n 'Произошла ошибка при добавлении записи: ' + error,\r\n 0,\r\n );\r\n },\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n } else {\r\n this.notificationService.warning('Действие не доступно.');\r\n }\r\n }\r\n\r\n /** Событие редактирование. */\r\n editEvent() {\r\n if (this.selected && this.selected.length === 1) {\r\n if (this.entityEditComponent) {\r\n const data: IEditDialogData<T> = {\r\n action: Action.Edit,\r\n entity: this.selected[0],\r\n };\r\n\r\n // Назначить значения полей объекта перед открытием диалога.\r\n if (this.beforeOpenDialogOnEditEvent) {\r\n this.beforeOpenDialogOnEditEvent(data.entity, data.extraData);\r\n }\r\n\r\n // Открытие окна\r\n const dialogRef = this.openDialog(\r\n this.entityEditComponent,\r\n data,\r\n this.dialog,\r\n );\r\n\r\n // Обработка закрытия окна\r\n const subs = dialogRef\r\n .afterClosed()\r\n .subscribe((result: IEditDialogData<T>) => {\r\n // Проверка результата\r\n if (\r\n result &&\r\n result.entity &&\r\n Object.keys(result.entity).length !== 0\r\n ) {\r\n // Дополнительные действия перед сохранением объекта.\r\n if (this.beforeSaveOnEditEvent)\r\n this.beforeSaveOnEditEvent(result.entity, result.extraData);\r\n\r\n const subs = this.entityService\r\n .editObject(result.entity)\r\n .subscribe({\r\n next: () => {\r\n // Дополнительные действия после сохранения объекта.\r\n if (this.afterSaveOnEditEvent) {\r\n const callback = () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись изменена.');\r\n };\r\n this.afterSaveOnEditEvent(\r\n callback.bind(this),\r\n result.entity,\r\n result.extraData,\r\n );\r\n } else {\r\n this.refreshEvent();\r\n this.notificationService.success('Запись изменена.');\r\n }\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService.error(\r\n 'Произошла ошибка при изменении записи: ' + error,\r\n 0,\r\n );\r\n },\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n } else {\r\n this.notificationService.warning('Действие не доступно.');\r\n }\r\n }\r\n }\r\n\r\n /** Событие удаление. */\r\n removeEvent() {\r\n // если выбрана запись(и)\r\n if (this.selected && this.selected.length > 0) {\r\n const dialogRef = this.openDialogRemoveConfirm(this.removalMessage);\r\n if (dialogRef) {\r\n const subs = dialogRef.afterClosed().subscribe((result: any) => {\r\n // при подтверждении возвращается 'delete'\r\n if (result === 'delete') {\r\n // готовим объект с запросами на удаление\r\n const sourcesObject: ObjectKeys = {};\r\n this.selected.forEach(\r\n (item, index) =>\r\n (sourcesObject['obj' + index] =\r\n this.entityService.deleteObject(item)),\r\n );\r\n // ждем, когда выполнятся все запросы\r\n const subs = forkJoin(sourcesObject).subscribe({\r\n next: () => {\r\n this.refreshEvent();\r\n this.notificationService.success('Выбранные записи удалены.');\r\n },\r\n error: (error: any) => {\r\n console.log('error', error);\r\n this.notificationService?.error(\r\n 'Произошла ошибка при удалении записи: ' + error,\r\n 0,\r\n );\r\n },\r\n });\r\n this.subscription.add(subs);\r\n }\r\n });\r\n this.subscription.add(subs);\r\n\r\n // Закрытие окна по нажатию Escape\r\n const subs2 = dialogRef.keydownEvents().subscribe((event: any) => {\r\n if (event.key === 'Escape') {\r\n dialogRef.close(null);\r\n }\r\n });\r\n this.subscription.add(subs2);\r\n }\r\n }\r\n }\r\n\r\n /** Событие обновления данных. */\r\n refreshEvent() {\r\n this.dataResource()?.reload();\r\n this.countResource()?.reload();\r\n }\r\n\r\n /** Событие очистки фильтра. */\r\n // clearEvent() {\r\n // this.filters.set({});\r\n // // При очистке — удаляем запись из LocalStorage\r\n // this.localStorageService.saveData(this.constructor.name + '_Filters', '{}');\r\n // this.tableState.update((prev) => ({ ...prev, pageIndex: 0 }));\r\n\r\n // // Передаем новый объект, чтобы Angular гарантированно зафиксировал изменение значения\r\n // this.clearFilters.set({});\r\n // }\r\n\r\n \r\n// 3. Адаптированный метод очистки фильтров\r\nclearEvent() {\r\n const prefix = this.constructor.name + '_Filter_';\r\n \r\n // Находим и удаляем из хранилища только ключи фильтров этой страницы\r\n const keysToRemove: string[] = [];\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key && key.startsWith(prefix)) {\r\n keysToRemove.push(key);\r\n }\r\n }\r\n keysToRemove.forEach(key => localStorage.removeItem(key));\r\n\r\n this.filters.set({});\r\n this.tableState.update((prev) => ({ ...prev, pageIndex: 0 }));\r\n this.clearFilters.set({}); \r\n}\r\n\r\n /** Изменение сообщения об удалении. */\r\n onRemovalMessageChange(message: string) {\r\n this.removalMessage = message;\r\n }\r\n\r\n /** Изменение заголовка страницы. */\r\n onPageTitleChange(title: string) {\r\n this.pageTitle = title;\r\n }\r\n\r\n openDialog(entityComponent: any, data: IEditDialogData<T>, dialog: any) {\r\n // create dialog config\r\n const dialogConfig = new MatDialogConfig();\r\n dialogConfig.disableClose = true;\r\n dialogConfig.autoFocus = true;\r\n dialogConfig.width = this.dialogEditWidth;\r\n dialogConfig.data = data;\r\n dialogConfig.panelClass = this.entityType.name + '-edit-dialog';\r\n // return dialog\r\n return dialog.open(entityComponent, dialogConfig);\r\n }\r\n\r\n openDialogRemoveConfirm(\r\n removalMessage: string,\r\n ): MatDialogRef<DialogComponent> | undefined {\r\n let message = 'Вы хотите удалить ';\r\n message += removalMessage\r\n ? removalMessage\r\n : this.allowMultiSelect\r\n ? `выбранные записи (${this.selected.length})?`\r\n : 'выбранную запись?';\r\n return this.dialog.open(DialogComponent, {\r\n width: this.dialogRemoveWidth,\r\n data: {\r\n id: 'delete',\r\n title: 'Подтверждение',\r\n message: message,\r\n btnNoTitle: 'Отмена',\r\n btnYesTitle: 'Удалить',\r\n },\r\n });\r\n }\r\n\r\n // contextMenu: При щелчке ПКМ открыть в новой вкладке.\r\n protected onMiddleButton(\r\n baseUrl: string,\r\n queryParamName?: string,\r\n queryParamValue?: string,\r\n ) {\r\n return (\r\n $event: MouseEvent,\r\n item: T | undefined,\r\n contextMenu: MatMenuTrigger,\r\n ) => {\r\n // Нажата средняя кнопка (в новой вкладке).\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if ($event.button === 1 && item) {\r\n //$event.preventDefault();\r\n contextMenu.closeMenu();\r\n // Converts the route into a string that can be used\r\n // with the window.open() function\r\n const url = this.router.serializeUrl(\r\n queryParamName && queryParamValue\r\n ? this.router.createUrlTree([baseUrl], {\r\n queryParams: {\r\n [queryParamName]: item[queryParamValue as keyof T],\r\n },\r\n })\r\n : this.router.createUrlTree([baseUrl]),\r\n );\r\n window.open(url, '_blank');\r\n }\r\n };\r\n }\r\n\r\n // Action в таблице: При щелчке ПКМ открыть в новой вкладке.\r\n protected onActionMiddleButton(\r\n baseUrl: string,\r\n queryParamName?: string,\r\n queryParamValue?: string,\r\n ) {\r\n return ($event: MouseEvent, item: T | undefined) => {\r\n // Нажата средняя кнопка (в новой вкладке).\r\n // 1 -\tAuxiliary button pressed (usually the middle button)\r\n if ($event.button === 1 && item) {\r\n //$event.preventDefault();\r\n // Converts the route into a string that can be used\r\n // with the window.open() function\r\n const url = this.router.serializeUrl(\r\n queryParamName && queryParamValue\r\n ? this.router.createUrlTree([baseUrl], {\r\n queryParams: {\r\n [queryParamName]: item[queryParamValue as keyof T],\r\n },\r\n })\r\n : this.router.createUrlTree([baseUrl]),\r\n );\r\n window.open(url, '_blank');\r\n }\r\n };\r\n }\r\n\r\n protected dateToString(date: string | number | Date) {\r\n return date\r\n ? new Date(date).toLocaleString('ru-RU', { timeZone: 'Europe/Samara' })\r\n : null; // MSK+01\r\n }\r\n}\r\n","import {\r\n HttpClient,\r\n HttpContext,\r\n HttpParams,\r\n httpResource,\r\n HttpResourceRef,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable, signal } from '@angular/core';\r\nimport { API_NAME } from '@kuzntsv/uikit';\r\nimport z from 'zod';\r\n\r\nimport { BaseSchemaClass } from './base-class';\r\nimport { tap } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport abstract class BaseSignalServiceClass<T extends BaseSchemaClass> {\r\n abstract baseRoute: string;\r\n abstract entityType: any;\r\n\r\n // Гарантирует, что переданная схема валидирует объект, содержащий как минимум { id: number }\r\n protected abstract readonly schema: z.ZodType<T>;\r\n\r\n protected countRoute = 'count';\r\n\r\n protected pageIndexParam = 'page';\r\n protected pageSizeParam = 'limit';\r\n protected sortColumnParam = 'column';\r\n protected directionParam = 'direction';\r\n\r\n // По умолчанию используем дефолтное API (пустая строка)\r\n protected apiContextName = '';\r\n\r\n protected http = inject(HttpClient);\r\n\r\n // Реактивный триггер для перезапуска списков\r\n protected readonly _refreshTrigger = signal(0);\r\n\r\n // Вспомогательный метод для ручного или автоматического пинка триггера\r\n public refresh(): void {\r\n this._refreshTrigger.update((v) => v + 1);\r\n }\r\n\r\n // 1. Возвращает ResourceRef, который сразу можно использовать в шаблонах или других ресурсах\r\n getObjects() {\r\n return httpResource<T[]>(\r\n () => {\r\n // Читаем триггер обновления, чтобы ресурс перезапустился автоматически\r\n this._refreshTrigger();\r\n return { url: this.baseRoute };\r\n },\r\n {\r\n ...this.getHttpContext(),\r\n // Ключевое улучшение v22: трансформация данных прямо на уровне ресурса\r\n parse: (data: unknown) => {\r\n if (!data) return [];\r\n // Валидация через Zod вернет строго тип T, у которого точно есть id\r\n return z.array(this.schema).parse(data);\r\n },\r\n },\r\n );\r\n }\r\n\r\n getObject(id: number | (() => number | null | undefined)): HttpResourceRef<T | null | undefined> {\r\n // Приводим id к функции-сигналу для обеспечения реактивности httpResource\r\n const idSignal = typeof id === 'function' ? id : () => id;\r\n\r\n return httpResource<T | null>(\r\n () => {\r\n // Читаем триггер обновления, чтобы ресурс перезапустился автоматически\r\n this._refreshTrigger();\r\n\r\n const currentId = idSignal();\r\n // Защита: если ID еще нет, не делаем запрос и переводим ресурс в состояние Idle\r\n if (currentId === null || currentId === undefined) {\r\n return undefined;\r\n }\r\n\r\n return { url: `${this.baseRoute}${currentId}` };\r\n },\r\n {\r\n ...this.getHttpContext(),\r\n parse: (data: unknown) => {\r\n if (!data) return null;\r\n return this.schema.parse(data);\r\n },\r\n },\r\n );\r\n }\r\n\r\n getCount() {\r\n return httpResource<number>(\r\n () => {\r\n // Читаем триггер обновления, чтобы ресурс перезапустился автоматически\r\n this._refreshTrigger();\r\n return {\r\n url: `${this.baseRoute}${this.countRoute}`,\r\n };\r\n },\r\n {\r\n ...this.getHttpContext(),\r\n parse: (data: unknown) => z.coerce.number().parse(data),\r\n },\r\n );\r\n }\r\n\r\n getObjectsByPaging(\r\n pageIndex: () => number,\r\n pageSize: () => number,\r\n sortColumn: () => string,\r\n direction: () => string,\r\n ) {\r\n return httpResource<T[]>(\r\n () => {\r\n // Читаем триггер, чтобы httpResource реагировал на вызов .refresh()\r\n this._refreshTrigger();\r\n\r\n // Собираем плоский JSON-объект с параметрами вместо вызовов HttpParams\r\n const queryParams: Record<string, string | number> = {};\r\n\r\n if (pageIndex() + 1) queryParams[this.pageIndexParam] = pageIndex() + 1;\r\n if (pageSize()) queryParams[this.pageSizeParam] = pageSize();\r\n if (sortColumn()) queryParams[this.sortColumnParam] = sortColumn();\r\n if (direction()) queryParams[this.directionParam] = direction();\r\n\r\n return {\r\n url: this.baseRoute,\r\n params: queryParams,\r\n };\r\n },\r\n {\r\n ...this.getHttpContext(),\r\n parse: (data) => {\r\n if (!data) return [];\r\n // Валидация через Zod вернет строго тип T, у которого точно есть id\r\n return z.array(this.schema).parse(data);\r\n },\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * МЕТОД СОЗДАНИЯ (POST)\r\n * Принимает данные БЕЗ id. Тип формируется автоматически через Zod.\r\n */\r\n newObject(entity: Omit<T, 'id'>): any {\r\n return this.http.post(this.baseRoute, entity, this.getHttpContext());\r\n }\r\n\r\n /**\r\n * Метод для СОЗДАНИЯ объекта (POST)\r\n * Тип аргумента генерируется автоматически: это ваш тип T, но БЕЗ поля id.\r\n */\r\n // create(dto: Omit<T, 'id'>): HttpResourceRef<T | undefined> {\r\n // return httpResource<T>(\r\n // () => ({\r\n // url: this.baseRoute,\r\n // method: 'POST',\r\n // body: dto, // Отправляем данные без id\r\n // }),\r\n // {\r\n // ...this.getHttpContext(),\r\n // // Сервер вернет созданный объект уже С присвоенным id, валидируем его полной схемой\r\n // parse: (data: unknown) => this.schema.parse(data),\r\n // },\r\n // );\r\n // }\r\n\r\n editObject(entity: T): any {\r\n return this.http.put(\r\n this.baseRoute + entity.id,\r\n entity,\r\n this.getHttpContext(),\r\n );\r\n }\r\n\r\n /**\r\n * Метод для ОБНОВЛЕНИЯ объекта (PUT / PATCH)\r\n * Принимает id и частичный объект (все свойства T становятся необязательными, кроме id)\r\n */\r\n // update(\r\n // id: number,\r\n // dto: Partial<Omit<T, 'id'>>,\r\n // ): HttpResourceRef<T | undefined> {\r\n // return httpResource<T>(\r\n // () => ({\r\n // url: `${this.baseRoute}/${id}`,\r\n // method: 'PUT',\r\n // body: dto,\r\n // }),\r\n // {\r\n // ...this.getHttpContext(),\r\n // parse: (data: unknown) => this.schema.parse(data),\r\n // },\r\n // );\r\n // }\r\n\r\n /**\r\n * Метод DELETE (Переписанный под новую архитектуру)\r\n * Возвращает Observable. При подписке делает DELETE запрос,\r\n * а оператор 'tap' автоматически обновляет список getObjects() при успехе.\r\n */\r\n deleteObject(entity: T): any {\r\n return this.http\r\n .delete(this.baseRoute + entity.id, this.getHttpContext())\r\n .pipe(\r\n // Как только бэкенд ответит успехом, дергаем триггер обновления\r\n tap(() => this.refresh()),\r\n );\r\n }\r\n\r\n protected getParams(\r\n pageIndex: number,\r\n pageSize: number,\r\n sortColumn: string,\r\n direction: string,\r\n ): HttpParams {\r\n let params = new HttpParams();\r\n if (pageIndex + 1)\r\n // переход от индекса к номеру страницы\r\n params = params.append(this.pageIndexParam, pageIndex + 1);\r\n if (pageSize) params = params.append(this.pageSizeParam, pageSize);\r\n if (sortColumn) params = params.append(this.sortColumnParam, sortColumn);\r\n if (direction) params = params.append(this.directionParam, direction);\r\n return params;\r\n }\r\n\r\n // Вспомогательный метод для сборки опций HttpClient\r\n protected getHttpContext(): { context?: HttpContext } {\r\n // Если имя не задано (пустая строка, null или undefined), возвращаем пустой объект\r\n if (!this.apiContextName) {\r\n return {};\r\n }\r\n\r\n // Если имя задано, создаем и возвращаем контекст\r\n return {\r\n context: new HttpContext().set(API_NAME, this.apiContextName),\r\n };\r\n }\r\n}\r\n","import { inject, Pipe, PipeTransform } from '@angular/core';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\n\r\n@Pipe({\r\n name: 'safe',\r\n standalone: true\r\n})\r\nexport class SafePipe implements PipeTransform {\r\n\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n transform(url: string | SafeUrl | null | undefined) {\r\n if (!url) {\r\n return '';\r\n }\r\n\r\n // Проверяем, является ли значение уже объектом SafeUrl.\r\n // Объекты SafeUrl от DomSanitizer имеют скрытые свойства или метод toString(), \r\n // но самый надежный способ в Angular — проверить, что это не обычная строка.\r\n if (typeof url !== 'string') {\r\n return url; // Возвращаем как есть, так как это уже SafeUrl\r\n }\r\n return this.sanitizer.bypassSecurityTrustUrl(url);\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'time'\r\n})\r\nexport class TimePipe implements PipeTransform {\r\n\r\n transform(value: number): string {\r\n // const hour = Math.abs(value) >= 60 ? Math.round(value / 60) + 'ч.' : '';\r\n // const minute = ' ' + Math.abs(value % 60) + 'м.';\r\n // return value === 0 ? '0' : hour + ' ' + minute;\r\n\r\n const hour = Math.abs(value) >= 60 ? Math.floor(Math.abs(value) / 60).toString().padStart(2,'0') : '00';\r\n const minute = Math.abs(value % 60).toString().padStart(2,'0');\r\n const time = hour + ':' + minute;\r\n return value < 0 ? '-' + time : time;\r\n }\r\n\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'truncate'\r\n})\r\nexport class TruncatePipe implements PipeTransform {\r\n // Usage:\r\n // {{ str | truncate:[20] }} // or\r\n // {{ str | truncate:[20, '...'] }} // or|\r\n transform(value: string, args: any[]): string {\r\n const limit = args.length > 0 ? parseInt(args[0], 10) : 20;\r\n const trail = args.length > 1 ? args[1] : '...';\r\n return value.length > limit ? value.substring(0, limit) + trail : value;\r\n }\r\n\r\n}\r\n","import {\n Component,\n inject,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatAnchor } from '@angular/material/button';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { BaseNavBarMenuClass } from '../../base';\nimport { SafePipe } from '../../pipes';\nimport { DialogComponent } from '../dialog';\nimport { filter, take } from 'rxjs';\nimport { SafeUrl } from '@angular/platform-browser';\n\n@Component({\n selector: 'ngx-uik-navbar',\n templateUrl: 'navbar.html',\n styleUrls: ['./navbar.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [MatAnchor, MatIcon, MatTooltip, SafePipe],\n})\nexport class NavBarComponent extends BaseNavBarMenuClass {\n /** Видимость панели, когда loggedIn === false. */\n visibleOnLogout = input<boolean>(false);\n /** Видимость аватара. */\n visibleAvatar = input<boolean>(true);\n /** Видимость кнопки \"Выйти\". */\n visibleLogoutBtn = input<boolean>(true);\n\n /** Признак, что пользователь авторизован. */\n loggedIn = input<boolean>(false);\n /** ФИО пользователя. */\n fioUser = input<string>('');\n /** Всплывающая подсказка о пользователе. */\n userTooltip = input<string>('');\n /** URL аватара */\n avatarURL = input<string | SafeUrl>('');\n\n /** Нажата кнопка \"Выйти\". */\n logout = output<string>();\n\n private readonly dialog = inject(MatDialog);\n\n constructor() {\n super();\n }\n\n onLogout() {\n this.logout.emit(this.router.url);\n }\n\n openDialog(): void {\n const dialogRef = this.dialog.open(DialogComponent, {\n width: '400px',\n data: {\n id: 'logout',\n title: 'Подтверждение',\n message: 'Вы хотите выйти?',\n btnNoTitle: 'Отмена',\n btnYesTitle: 'Выйти',\n },\n });\n\n dialogRef\n .afterClosed()\n .pipe(\n take(1), // Берем только одно значение (когда закрылся)\n filter((id) => !!id), // Пропускаем дальше, только если id существует (нажали \"Выйти\")\n )\n .subscribe((id: any) => {\n if (id) {\n this.onLogout();\n }\n });\n }\n}\n","@if (visibleOnLogout() || loggedIn()) {\r\n <nav class=\"ngx-uik-navbar-header\">\r\n \r\n <ng-content></ng-content>\r\n\r\n <div class=\"flex-spacer\"></div>\r\n \r\n @if (visibleAvatar() && (loggedIn() === false || !avatarURL())) {\r\n <mat-icon [matTooltip]=\"userTooltip()\">account_circle</mat-icon>\r\n }\r\n @if (visibleAvatar() && loggedIn() && !!avatarURL()) {\r\n <img\r\n class=\"user-photo\"\r\n [src]=\"avatarURL() | safe\"\r\n loading=\"lazy\"\r\n [alt]=\"fioUser()\"\r\n [matTooltip]=\"userTooltip()\">\r\n }\r\n\r\n <span class = \"user-name\" [matTooltip]=\"userTooltip()\">\r\n {{ fioUser() }}\r\n </span>\r\n\r\n @if (visibleLogoutBtn()) {\r\n <a mat-button class=\"pm-button\" (click)=\"openDialog()\">Выйти <mat-icon>logout</mat-icon></a>\r\n }\r\n </nav>\r\n}","import { Component, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'ngx-uik-not-found',\n templateUrl: './not-found.component.html',\n styleUrls: ['./not-found.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n standalone: true,\n})\nexport class NotFoundComponent {}\n","<div class=\"center\">\r\n <h3 class=\"mat-display-1\">Страница не найдена</h3>\r\n</div>\r\n","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\r\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\r\n\r\n@Component({\r\n selector: 'ngx-uik-loader',\r\n template: `\r\n <div class=\"loading-indicator\" mat-dialog-content>\r\n <mat-progress-spinner mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </div>\r\n `,\r\n styles: [`\r\n /* Разместить по центру */\r\n .loading-indicator {\r\n position: fixed;\r\n z-index: 999;\r\n height: 2em;\r\n width: 2em;\r\n overflow: initial;\r\n margin: auto;\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n right: 0;\r\n }\r\n\r\n /* Заблокировать оверлей */\r\n .loading-indicator:before {\r\n content: '';\r\n display: block;\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(0,0,0,0.3);\r\n }\r\n `],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatProgressSpinner]\r\n})\r\n\r\nexport class ProgressSpinnerComponent implements AfterViewInit {\r\n\r\n private readonly cdRef = inject(ChangeDetectorRef);\r\n\r\n ngAfterViewInit() {\r\n this.cdRef.detectChanges();\r\n }\r\n}\r\n","import { ScrollingModule } from '@angular/cdk/scrolling';\nimport {\n Component,\n effect,\n input,\n linkedSignal,\n OnDestroy,\n OnInit,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n MatAutocompleteModule,\n MatOption,\n} from '@angular/material/autocomplete';\nimport {\n MatError,\n MatFormField,\n MatHint,\n MatLabel,\n} from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { Subscription } from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n map,\n startWith,\n} from 'rxjs/operators';\n\nimport { SelectItem } from './models';\n\n@Component({\n selector: 'ngx-uik-select-autocomplete-with-vs',\n templateUrl: './select-autocomplete-with-vs.component.html',\n styleUrl: './select-autocomplete-with-vs.component.css',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n MatAutocompleteModule,\n MatHint,\n MatError,\n MatOption,\n MatIcon,\n MatFormField,\n ScrollingModule,\n MatInput,\n MatLabel,\n ],\n})\nexport class BaseSelectAutocompleteWithVsComponent\n implements OnInit, OnDestroy\n{\n // https://stackblitz.com/edit/autocomplete-with-virtual-scroll-dc9u2g\n\n // Все элементы\n items = input<SelectItem[]>([]);\n // Выбранный элемент (входной параметр)\n selectedItemInput = input<SelectItem | undefined>(undefined);\n // Заголовок\n title = input<string>('');\n // Видимость\n isVisible = input<boolean>(true);\n // Обязательность\n isRequired = input<boolean>(false);\n // Доступность\n isDisabled = input<boolean>(false);\n // Ширина\n width = input<string>('200');\n\n // Выбранный элемент\n selectedItem = linkedSignal(() => this.selectedItemInput());\n // Событие изменения выбранного элемента\n selectedItemChange = output<string>();\n\n public height: string = '200px';\n // input элемент\n inputCtrl = new FormControl();\n // отфильтрованные (отображаемые) элементы\n filteredItems: SelectItem[] = [];\n\n subscription = new Subscription();\n\n constructor() {\n effect(() => {\n console.log('ITEMS =', this.items());\n //this.filteredItems = this.items();\n\n console.log('selectedItem =', this.selectedItemInput());\n if (this.items().length > 0) {\n console.log('filteredItems SET');\n this.setFileredItems(this.items());\n this.inputCtrl.setValue(this.selectedItemInput());\n }\n });\n }\n\n ngOnInit(): void {\n // Listen for changes to the input\n const subs = this.inputCtrl.valueChanges\n .pipe(\n startWith(''),\n // eslint-disable-next-line no-magic-numbers\n debounceTime(500),\n distinctUntilChanged(),\n // Note: If the option value is bound to object, after selecting the option\n // Note: the value will change from string to {}. We want to perform search\n // Note: only when the type is string (no match)\n //filter(q => typeof q === 'string'),\n //tap((v) => console.log('v=', v)),\n map((value) => {\n // Filter the options\n console.log('typeof value =', typeof value);\n\n if (typeof value === 'undefined') {\n this.setFileredItems(this.items());\n } else {\n if (typeof value !== 'object') {\n console.log('v1=', value);\n this.setFileredItems(\n this.items().filter((option) =>\n option.viewValue.toLowerCase().includes(value.toLowerCase()),\n ),\n );\n } else {\n // typeof value === 'object'\n console.log('v2=', value);\n if (value) {\n // this.predmet = value;\n this.setFileredItems(\n this.items().filter((option) =>\n option.viewValue\n .toLowerCase()\n .includes(value.viewValue.toLowerCase()),\n ),\n );\n console.log('v3=', value);\n } else {\n this.setFileredItems(this.items());\n console.log('v4=', value);\n }\n }\n }\n }),\n )\n .subscribe();\n this.subscription.add(subs);\n\n if (this.isDisabled()) {\n this.inputCtrl.disable();\n } else {\n this.inputCtrl.enable();\n }\n }\n\n ngOnDestroy(): void {\n if (this.subscription) this.subscription.unsubscribe();\n }\n\n onSelectedItemChange(item: any) {\n console.log('onSelectedItemChange, item=', item);\n this.selectedItem.set(item);\n this.selectedItemChange.emit(item);\n }\n\n onClearClick($event: MouseEvent) {\n $event.stopPropagation();\n this.inputCtrl.setValue('');\n }\n\n displayWithFn(lookup: any) {\n return lookup ? lookup.viewValue : null;\n }\n\n private setFileredItems(items: SelectItem[]) {\n this.filteredItems = items;\n // Recompute how big the viewport should be.\n // eslint-disable-next-line no-magic-numbers\n if (items.length < 4) {\n // eslint-disable-next-line no-magic-numbers\n this.height = items.length * 50 + 'px';\n } else {\n this.height = '200px';\n }\n console.log('update filteredItems =', this.filteredItems);\n }\n}\n","@if (isVisible()) {\r\n <mat-form-field [style.width.px]=\"width()\">\r\n <mat-label>{{ title() }}</mat-label>\r\n <input type=\"text\"\r\n [placeholder]=title()\r\n aria-label=\"Number\"\r\n matInput\r\n (ngModelChange)=\"onSelectedItemChange($event)\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [required]=\"isRequired() ? 'required' : ''\"\r\n >\r\n @if (!isDisabled && selectedItem()) {\r\n <button mat-button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClearClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayWithFn\" showPanel=\"true\">\r\n <cdk-virtual-scroll-viewport class=\"autocomplete-test-viewport\" [style.height]=\"height\" itemSize=\"25\">\r\n <mat-option *cdkVirtualFor=\"let option of filteredItems\" [value]=\"option\" class=\"autocomplete-item\">\r\n {{option.viewValue}}\r\n </mat-option>\r\n </cdk-virtual-scroll-viewport>\r\n </mat-autocomplete>\r\n @if (inputCtrl.invalid) {\r\n <mat-error>Введите {{title()}}</mat-error>\r\n }\r\n @if (!inputCtrl.value) {\r\n <mat-hint>Начните вводить ...</mat-hint>\r\n }\r\n </mat-form-field>\r\n}","import { COMMA, ENTER } from '@angular/cdk/keycodes';\n\nimport {\n Component,\n effect,\n input,\n output,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatOptgroup, MatOption } from '@angular/material/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatFormField, MatLabel, MatSelect } from '@angular/material/select';\n\nimport { SelectGroup } from './models';\n\n@Component({\n selector: 'ngx-uik-select-with-group',\n templateUrl: './select-with-group.component.html',\n styleUrls: ['./select-with-group.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n FormsModule,\n ReactiveFormsModule,\n MatIcon,\n MatOption,\n MatOptgroup,\n MatSelect,\n MatFormField,\n MatLabel,\n ],\n})\nexport class BaseSelectWithGroupComponent {\n // Все группы\n groups = input<SelectGroup[]>([]);\n // Выбранные элементы, ключи (BaseSelectItem.value)\n selectedItems = input<string[]>([]);\n // Заголовок\n title = input<string>('');\n // Событие изменения выбранных элементов\n selectedItemsChange = output<string[]>();\n\n separatorKeysCodes: number[] = [ENTER, COMMA];\n control = new FormControl<number[]>([]);\n\n constructor() {\n effect(() => {\n if (this.groups().length > 0) {\n this.control.setValue(this.selectedItems().map((i) => Number(i)));\n }\n });\n }\n\n selectionChange($event: any) {\n this.selectedItemsChange.emit(\n $event.value.map((i: number) => i.toString()),\n );\n }\n\n onClearClick($event: MouseEvent) {\n $event.stopPropagation();\n // this.control.setValue('');\n this.selectedItemsChange.emit([]);\n }\n}\n","<mat-form-field class=\"select-with-group\" appearance=\"fill\">\r\n <mat-label>{{ title() }}</mat-label>\r\n <mat-select [formControl]=\"control\" (selectionChange)=\"selectionChange($event)\" multiple>\r\n @for (group of groups(); track group) {\r\n <mat-optgroup [label]=\"group.name\">\r\n @for (item of group.items; track item) {\r\n <mat-option [value]=\"item.value\" >\r\n {{item.viewValue}}\r\n </mat-option>\r\n }\r\n </mat-optgroup>\r\n }\r\n\r\n </mat-select>\r\n @if (control.value && control.value!.length > 0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClearClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n","import { SelectionModel } from '@angular/cdk/collections';\nimport {\n AfterViewInit,\n Component,\n OnDestroy,\n OnInit,\n effect,\n input,\n linkedSignal,\n output,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatDivider } from '@angular/material/divider';\nimport { MatIcon } from '@angular/material/icon';\nimport {\n MatMenu,\n MatMenuContent,\n MatMenuItem,\n MatMenuTrigger,\n} from '@angular/material/menu';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, MatSortHeader } from '@angular/material/sort';\nimport {\n MatCell,\n MatCellDef,\n MatColumnDef,\n MatFooterCell,\n MatFooterCellDef,\n MatFooterRow,\n MatFooterRowDef,\n MatHeaderCell,\n MatHeaderCellDef,\n MatHeaderRow,\n MatHeaderRowDef,\n MatNoDataRow,\n MatRow,\n MatRowDef,\n MatTable,\n MatTableDataSource,\n MatTableModule,\n} from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatIconButton } from '@angular/material/button';\nimport { RouterLink } from '@angular/router';\nimport { Subscription } from 'rxjs';\n\nimport { IColumnOptions } from './models/column-options.interface';\nimport { IContextMenuOptions } from './models/context-menu-options.interface';\nimport { IPageState, ISortState, ITableState } from './models/table-state';\n\n@Component({\n selector: 'ngx-uik-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n MatTable,\n MatSort,\n MatColumnDef,\n MatHeaderCellDef,\n MatHeaderCell,\n MatCheckbox,\n MatCellDef,\n MatCell,\n MatSortHeader,\n MatIcon,\n RouterLink,\n MatNoDataRow,\n MatHeaderRowDef,\n MatHeaderRow,\n MatRowDef,\n MatRow,\n MatMenuTrigger,\n MatMenu,\n MatMenuContent,\n MatDivider,\n MatMenuItem,\n MatPaginator,\n MatFooterRowDef,\n MatFooterRow,\n MatFooterCellDef,\n MatFooterCell,\n MatTableModule,\n MatTooltipModule,\n MatIconButton,\n ],\n})\nexport class TableComponent<T> implements OnInit, AfterViewInit, OnDestroy {\n /** Отображаемые данные. */\n data = input<T[]>([]);\n /** Количество записей. */\n length = input<number>(0);\n /** Настройки колонок. */\n columnOptions = input<IColumnOptions<T>[]>([]);\n /** Состояние сортировки, пагинации. */\n tableState = input.required<ITableState>();\n /** Разрешен выбор нескольких строк. */\n allowMultiSelect = input<boolean>(false);\n /** Список элементов контекстного меню. */\n opt = input<IContextMenuOptions<T>[]>([]);\n /** Отправка события rowDoubleClicked (при двойном щелчке мышью) отключена. */\n rowDblClickedDisable = input<boolean>(false);\n /** Отображать строку с итогом. */\n footer = input<boolean>(false);\n\n /** Изменение страницы. */\n pageStateChange = output<IPageState>();\n /** Изменение сортировки. */\n sortStateChange = output<ISortState>();\n /** Изменение выбранных записей. */\n selectionChange = output<T[]>();\n /** Двойной щелчек ЛКМ*/\n rowDoubleClicked = output<T>();\n\n readonly sort = viewChild(MatSort);\n readonly paginator = viewChild(MatPaginator);\n readonly contextMenu = viewChild(MatMenuTrigger);\n\n pageState = linkedSignal<IPageState>(() => {\n return {\n pageIndex: this.tableState().pageIndex,\n pageSize: this.tableState().pageSize,\n };\n });\n\n sortState = linkedSignal<ISortState>(() => {\n return {\n sortActive: this.tableState().sortActive,\n sortDirection: this.tableState().sortDirection,\n };\n });\n\n /** Выбранная строка, для которого будет показываться меню при нажатии правой кнопки мыши. */\n itemForMenu?: T;\n /** Позиция в которой отображается контекстное меню. */\n contextMenuPosition = { x: '0px', y: '0px' };\n\n // eslint-disable-next-line no-magic-numbers\n defaultPageIndex = 0;\n // eslint-disable-next-line no-magic-numbers\n defaultPageSize = 10;\n\n /** Источник данных для отображения. */\n dataSource = new MatTableDataSource<T>();\n\n /** Выбранные записи. */\n selection: SelectionModel<T> = new SelectionModel<T>();\n\n /** Список отображаемых колонок (формируется из @columnOptions). */\n displayedColumns?: string[];\n\n subscription = new Subscription();\n\n constructor() {\n effect(() => {\n this.dataSource.data = this.data();\n\n // сохранить выделенные строки, если они все еще есть в данных\n const selected = this.selection.selected;\n this.selection.clear();\n this.data()\n .filter((v) =>\n selected.map((s) => JSON.stringify(s)).includes(JSON.stringify(v)),\n )\n .map((d) => {\n this.selection.select(d);\n });\n });\n }\n\n ngOnInit(): void {\n this.displayedColumns = ['select'].concat(\n this.columnOptions()\n ?.filter((c) => !c.hide)\n .map((item) => item.name) || [],\n );\n\n // пересоздаем, т.к. параметр allowMultiSelect появляется только сейчас\n this.selection = new SelectionModel<T>(this.allowMultiSelect());\n }\n\n ngOnDestroy(): void {\n if (this.subscription) this.subscription.unsubscribe();\n }\n\n ngAfterViewInit() {\n // подписи элементов управления пагинатора (MatPaginatorIntl)\n const paginator = this.paginator();\n if (paginator) {\n paginator._intl.itemsPerPageLabel = 'Записей на странице';\n paginator._intl.firstPageLabel = 'Первая страница';\n paginator._intl.previousPageLabel = 'Предыдущая страница';\n paginator._intl.nextPageLabel = 'Следующая страница';\n paginator._intl.lastPageLabel = 'Последняя страница';\n\n // изменение пагинации\n const subs = paginator.page.subscribe((page) => {\n const pageState = {\n pageIndex: page.pageIndex,\n pageSize: page.pageSize,\n } as IPageState;\n this.pageState.set(pageState);\n this.pageStateChange.emit(pageState);\n });\n this.subscription.add(subs);\n }\n\n // изменение сортировки\n const sortValue = this.sort();\n if (sortValue) {\n const subs = sortValue.sortChange.subscribe((sort) => {\n const sortState = {\n sortActive: sort.active,\n sortDirection: sort.direction,\n } as ISortState;\n this.sortState.set(sortState);\n this.sortStateChange.emit(sortState);\n });\n this.subscription.add(subs);\n }\n\n // изменение выбранных записей\n if (this.selection) {\n const subs = this.selection.changed.subscribe((change) => {\n this.selectionChange.emit(change.source.selected);\n });\n this.subscription.add(subs);\n }\n }\n\n /** Whether the number of selected elements matches the total number of rows. */\n isAllSelected() {\n const numSelected = this.selection.selected.length;\n const numRows = this.dataSource.data.length;\n return numSelected === numRows;\n }\n\n /** Selects all rows if they are not all selected; otherwise clear selection. */\n masterToggle() {\n console.log(this.selection.isMultipleSelection());\n if (this.isAllSelected()) {\n this.selection.clear();\n } else {\n this.dataSource.data.forEach((row) => this.selection.select(row));\n }\n }\n\n /** При щелчке по строке. */\n onRowClicked(row: T) {\n // выделение строки при щелчке по строке\n if (this.selection.isSelected(row)) {\n this.selection.deselect(row);\n } else {\n this.selection.select(row);\n }\n }\n\n /** При двойном щелчке по строке. */\n onRowDblClicked(row: T) {\n // выделение строки при двойном щелчке по строке\n this.selection.clear();\n this.selection.select(row);\n if (!this.rowDblClickedDisable()) this.rowDoubleClicked.emit(row);\n }\n\n /** При вызове контекстного меню. */\n onContextMenu(event: MouseEvent, itemForMenu: T | undefined) {\n if (this.opt() && this.opt().length === 0) {\n // если нет пунктов меню, то не показываем меню\n return;\n }\n event.preventDefault();\n this.itemForMenu = itemForMenu;\n this.contextMenuPosition.x = event.clientX + 'px';\n this.contextMenuPosition.y = event.clientY + 'px';\n // как это (menuData) использовать в шаблоне не понятно, поэтому использую this.itemForMenu\n // https://www.concretepage.com/angular-material/passing-data-to-mat-menu-angular-material\n const contextMenu = this.contextMenu();\n if (contextMenu) {\n contextMenu.menuData = { itemForMenu };\n contextMenu.menu?.focusFirstItem('mouse');\n contextMenu.openMenu();\n }\n }\n\n getTotal(columnName: string) {\n const arr = this.dataSource.data\n .filter((t) => typeof t[columnName as keyof T] === 'number')\n .map((t) => t[columnName as keyof T]);\n if (arr.length === 0) return '';\n else return arr.reduce((acc, value) => acc + <number>value, 0);\n }\n}\n","<div class=\"component-container\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\"\r\n matSort\r\n [matSortActive]=\"sortState().sortActive || ''\"\r\n [matSortDirection]=\"sortState().sortDirection\"\r\n matSortDisableClear>\r\n\r\n <!-- Выбор строки Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (allowMultiSelect()) {\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n }\r\n </ng-container>\r\n\r\n @for (item of columnOptions(); track item) {\r\n <ng-container matColumnDef={{item.name}}>\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"item.titleSortDisable\">{{item.title}}</th>\r\n @if (!item.format) {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n {{element[item.name]}}\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footer) {\r\n <strong>{{ getTotal(item.name) }}</strong>\r\n }\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n } \r\n }\r\n @if (item.format === 'pre-wrap') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" class=\"pre-wrap\" [matTooltip]=\"item.tooltip ?? ''\">\r\n {{element[item.name]}}\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'link') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n <a [href]=\"element[item.name]\" target=\"_blank\">{{element[item.name]}}</a>\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'linkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n @if (element[item.name]) {\r\n <a [href]=\"element[item.name]\" target=\"_blank\">\r\n @if (item.icon) {\r\n <mat-icon [class]=\"item.classList ? item.classList : ''\" >{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span [class]=\"item.classList ? item.classList : ''\" >{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'routerLink') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n <a [routerLink]=\"[element[item.name]]\">{{element[item.name]}}</a>\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'routerLinkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n @if (element[item.name]) {\r\n <a [routerLink]=\"[element[item.name]]\">\r\n @if (item.icon) {\r\n <mat-icon [class]=\"item.classList ? item.classList : ''\" >{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span [class]=\"item.classList ? item.classList : ''\" >{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'checkbox') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n <mat-checkbox [checked]=\"element[item.name] === 1\" [disabled]=\"true\"></mat-checkbox>\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'icon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n @if (item.icon) {\r\n <mat-icon [class]=\"item.classList ? item.classList : ''\" >{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span [class]=\"item.classList ? item.classList : ''\" >{{item.symbol}}</span>\r\n }\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'icons') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (item.icons) {\r\n <mat-icon [class]=\"item.classList ? item.classList[element[item.name]] : ''\" \r\n [matTooltip]=\"item.tooltips ? item.tooltips[element[item.name]] : ''\">{{item.icons[element[item.name]]}}</mat-icon>\r\n } \r\n @if (item.symbols) {\r\n <span [class]=\"item.classList ? item.classList[element[item.name]] : ''\" >{{item.symbols[element[item.name]]}}</span>\r\n }\r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'actions') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (item.actions) {\r\n <div class=\"actions-container\">\r\n @for (action of item.actions; track action) {\r\n @if (!(action.hideFn ? action.hideFn(element) : action.hide)) {\r\n <button mat-icon-button\r\n (click)=\"action.onClickFn ? action.onClickFn(element) : ''\"\r\n (mousedown)=\"action.onClickMiddleFn ? action.onClickMiddleFn($event, element) : ''\"\r\n [disabled]=\"action.disabledFn ? action.disabledFn(element) : action.disabled\"\r\n [matTooltip]=\"action.tooltip ? action.tooltip : ''\" >\r\n @if (action.icon) {\r\n <mat-icon [class]=\"action.classList ? action.classList : ''\" >{{action.icon}}</mat-icon>\r\n }\r\n @if (action.symbol) {\r\n <span [class]=\"action.classList ? action.classList : ''\" >{{action.symbol}}</span>\r\n }\r\n {{ action.title }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n } \r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (item.format === 'image') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" [matTooltip]=\"item.tooltip ?? ''\">\r\n @if (element[item.name]) {\r\n <img\r\n [src]=\"element[item.name]\"\r\n [alt]=\"item.imageAlt && element[item.imageAlt] ? element[item.imageAlt] : ''\"\r\n [class]=\"item.classList ? item.classList : ''\"\r\n />\r\n } \r\n </td>\r\n @if (footer()) {\r\n <td mat-footer-cell *matFooterCellDef>\r\n @if (item.footerTitle) {\r\n <strong>{{ item.footerTitle }}</strong>\r\n }\r\n </td>\r\n }\r\n }\r\n </ng-container>\r\n }\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"mat-cell\" colspan=\"9999\">\r\n Нет данных для отображения\r\n </td>\r\n </tr>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" \r\n (click)=\"onRowClicked(row)\" (dblclick)=\"onRowDblClicked(row)\" \r\n class=\"element-row\" [class.selected-row]=\"selection.isSelected(row)\">\r\n </tr>\r\n @if (footer()) {\r\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\r\n }\r\n </table>\r\n <div style=\"visibility: hidden; position: fixed\"\r\n [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\"\r\n [matMenuTriggerFor]=\"contextMenu\" #menuTrigger=\"matMenuTrigger\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\">\r\n <ng-template matMenuContent let-id=\"id\">\r\n @for (menuItem of opt(); track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn(itemForMenu) : ''\"\r\n (mousedown)=\"menuItem.onClickMiddleFn ? menuItem.onClickMiddleFn($event, itemForMenu, menuTrigger) : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn(itemForMenu) : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon [class]=\"menuItem.classList ? menuItem.classList : ''\">{{menuItem.icon}}</mat-icon>\r\n }\r\n @if (menuItem.symbol) {\r\n <span [class]=\"menuItem.classList ? menuItem.classList : ''\">{{menuItem.symbol}}</span>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n </mat-menu>\r\n</div>\r\n\r\n\r\n<mat-paginator [length]=\"length()\"\r\n [pageIndex]=\"pageState().pageIndex || defaultPageIndex\"\r\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\r\n [pageSize]=\"pageState().pageSize || defaultPageSize\"\r\n showFirstLastButtons\r\n itemsPerPageLabel=\"\"\r\n></mat-paginator>\r\n</div>\r\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { inject, Injectable } from '@angular/core';\r\n\r\nimport { ProgressSpinnerComponent } from '../shared';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class LoaderService {\r\n private overlayRef: OverlayRef | null = null;\r\n\r\n private readonly overlay = inject(Overlay);\r\n\r\n public show() {\r\n if (!this.overlayRef) {\r\n this.overlayRef = this.overlay.create();\r\n }\r\n const spinnerOverlayPortal = new ComponentPortal(ProgressSpinnerComponent);\r\n // Исправление ошибки Expression has changed after it was checked\r\n setTimeout(() => {\r\n if (!this.overlayRef?.hasAttached()) {\r\n this.overlayRef?.attach(spinnerOverlayPortal);\r\n }\r\n });\r\n }\r\n\r\n public hide() {\r\n if (this.overlayRef) {\r\n this.overlayRef.detach();\r\n }\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map, catchError } from 'rxjs/operators';\r\nimport { API_NAME } from '@kuzntsv/uikit';\r\n\r\n@Injectable({\r\n providedIn: 'root' // Сервис будет доступен глобально во всем приложении\r\n})\r\nexport class SecureImageService {\r\n private readonly http = inject(HttpClient);\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n /**\r\n * Загружает защищенное изображение и возвращает SafeUrl\r\n */\r\n getSecureUrl(relativeUrl: string | null | undefined, apiKey: string = 'default'): Observable<SafeUrl | string> {\r\n if (!relativeUrl) {\r\n return of('');\r\n }\r\n\r\n const context = new HttpContext().set(API_NAME, apiKey);\r\n\r\n return this.http.get(relativeUrl, { responseType: 'blob', context }).pipe(\r\n map((blob) => {\r\n const objectUrl = URL.createObjectURL(blob);\r\n return this.sanitizer.bypassSecurityTrustUrl(objectUrl);\r\n }),\r\n catchError((err) => {\r\n console.error(`[SecureImageService] Ошибка загрузки картинки с API \"${apiKey}\":`, err);\r\n return of(''); \r\n })\r\n );\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExportService {\r\n\r\n // Экспорт в CSV\r\n exportCSV(data: any, filename = 'data', arrHeader: any, newHeaders: any) {\r\n const csvData = this.convertToCSV(data, arrHeader, newHeaders);\r\n console.log(csvData);\r\n const blob = new Blob(['\\ufeff' + csvData], { type: 'text/csv;charset=utf-8;' });\r\n const dwldLink = document.createElement('a');\r\n const url = URL.createObjectURL(blob);\r\n const isSafariBrowser = navigator.userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('Chrome') === -1;\r\n if (isSafariBrowser) { //if Safari open in new window to save file with random filename.\r\n dwldLink.setAttribute('target', '_blank');\r\n }\r\n dwldLink.setAttribute('href', url);\r\n dwldLink.setAttribute('download', filename + '.csv');\r\n dwldLink.style.visibility = 'hidden';\r\n document.body.appendChild(dwldLink);\r\n dwldLink.click();\r\n document.body.removeChild(dwldLink);\r\n }\r\n\r\n convertToCSV(objArray: any, headerList: any, newHeaders: any) {\r\n const array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;\r\n let str = '';\r\n let row = 'S.No,';\r\n for (const index in newHeaders) {\r\n if (Object.prototype.hasOwnProperty.call(newHeaders, index)) {\r\n row += newHeaders[index] + ',';\r\n }\r\n }\r\n row = row.slice(0, -1);\r\n str += row + '\\r\\n';\r\n for (let i = 0; i < array.length; i++) {\r\n let line = (i + 1) + '';\r\n for (const index in headerList) {\r\n if (Object.prototype.hasOwnProperty.call(newHeaders, index)) {\r\n const head = headerList[index];\r\n line += ',' + array[i][head];\r\n }\r\n }\r\n str += line + '\\r\\n';\r\n }\r\n return str;\r\n }\r\n\r\n}\r\n","import { Injectable, inject, NgZone } from \"@angular/core\";\r\nimport { Observable, ReplaySubject } from \"rxjs\";\r\n\r\nimport { SseUser } from \"./models/sse-user\";\r\nimport { Topic } from \"./models/topic\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SseService<T> {\r\n\r\n private zone = inject(NgZone);\r\n\r\n private eventSource: EventSource | null = null;\r\n private isConnected = false;\r\n\r\n constructor() { }\r\n\r\n createSseEventSource(baseUrl: string, user: SseUser, topic: Topic): Observable<T> {\r\n const subject = new ReplaySubject<T>(1);\r\n\r\n // Close any existing connection\r\n this.closeSseEventSource();\r\n\r\n const topicUri = topic.getTopic(baseUrl, user);\r\n // environment.sse_url\r\n this.eventSource = new EventSource(topicUri\r\n //, {withCredentials: true}\r\n );\r\n\r\n if (this.eventSource) {\r\n this.isConnected = true;\r\n\r\n // Listen for messages\r\n this.eventSource.onmessage = (event: MessageEvent) => {\r\n console.log(event);\r\n const messageData: T = JSON.parse(event.data);\r\n this.zone.run(() => {\r\n subject.next(messageData);\r\n });\r\n };\r\n this.eventSource.onopen = () => {\r\n console.log('SSE connection opened.');\r\n };\r\n // Process error\r\n this.eventSource.onerror = (error: any) => {\r\n console.error('SSE error:', error);\r\n this.reconnectOnError(baseUrl, user, topic, subject);\r\n };\r\n }\r\n return subject.asObservable();\r\n }\r\n\r\n private reconnectOnError(baseUrl: string, user: SseUser, topic: Topic, subject: ReplaySubject<T>): void {\r\n\r\n this.closeSseEventSource();\r\n if (this.isConnected) return; // Prevent duplicate connections\r\n\r\n console.log('Reconnecting to SSE in 1 second...');\r\n setTimeout(() => {\r\n this.zone.run(() => {\r\n this.createSseEventSource(baseUrl, user, topic).subscribe(subject);\r\n });\r\n }, 1000);\r\n }\r\n\r\n closeSseEventSource(): void {\r\n if (this.eventSource) {\r\n this.eventSource.close();\r\n this.eventSource = null;\r\n this.isConnected = false;\r\n console.log('SSE Connection closed');\r\n }\r\n }\r\n}","import {\n Component,\n inject,\n input,\n OnInit,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { finalize } from 'rxjs';\n\nimport { Authenticate } from '../../models/authenticate';\nimport { AuthService, UIKIT_NOTIFICATION_TOKEN } from '@kuzntsv/uikit';\nimport { LoginFormComponent } from '../login-form/login-form.component';\nimport { PermitFormComponent } from '../permit-form/permit-form.component';\nimport { LoaderService } from '../../../services';\n\n@Component({\n selector: 'ngx-uik-login-page',\n templateUrl: 'login-page.component.html',\n styleUrls: ['login-page.component.scss'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [LoginFormComponent, PermitFormComponent],\n})\nexport class LoginPageComponent implements OnInit {\n pending: boolean = false;\n error: string = '';\n isKiosk: boolean = false;\n /**\n * Идентификатор АС получаем автоматически из ActivatedRoute Data!\n * (Для этого в настройках роутера должен быть включен withComponentInputBinding())\n */\n idCas = input<number>(0);\n\n private readonly authService = inject(AuthService);\n private readonly router = inject(Router);\n private readonly loaderService = inject(LoaderService);\n private readonly notificationService = inject(UIKIT_NOTIFICATION_TOKEN, {\n optional: true,\n });\n\n ngOnInit() {\n if (\n localStorage.getItem('id_human') ||\n localStorage.getItem('kiosk-keyboard-layout')\n ) {\n // this.isKiosk = true;\n }\n }\n\n onSubmit($event: Authenticate) {\n this.loaderService.show();\n this.pending = true;\n\n this.authService\n .login($event.username, $event.password, this.idCas())\n .pipe(\n // Очищаем состояние лоадеров ВСЕГДА (и при успехе, и при ошибке)\n finalize(() => {\n this.pending = false;\n this.loaderService.hide();\n }),\n )\n .subscribe({\n next: () => this.handleSuccessLogin(),\n error: (error) => {\n const errorMsg =\n 'Ошибка при авторизации: ' + error.error ||\n error.error?.message ||\n error.message;\n this.notificationService?.error(errorMsg, 0);\n },\n });\n }\n\n onSubmitPermit($event: string) {\n const permit = $event;\n\n this.loaderService.show();\n this.pending = true;\n\n this.authService\n .loginByPermit(permit, this.idCas())\n .pipe(\n // Очищаем состояние лоадеров ВСЕГДА (и при успехе, и при ошибке)\n finalize(() => {\n this.pending = false;\n this.loaderService.hide();\n }),\n )\n .subscribe({\n next: () => this.handleSuccessLogin(),\n error: (error) => {\n const errorMsg =\n 'Ошибка при авторизации: ' + error.error ||\n error.error?.message ||\n error.message;\n this.notificationService?.error(errorMsg, 0);\n },\n });\n }\n\n private handleSuccessLogin(): void {\n this.notificationService?.success('Успешная авторизация');\n\n // ЛОГИКА ВОЗВРАТА ПОСЛЕ УСПЕШНОГО ЛОГИНА\n if (this.router) {\n // Извлекаем returnUrl из текущего query-параметра текущего маршрута\n const currentUrlTree = this.router.parseUrl(this.router.url);\n const returnUrl = currentUrlTree.queryParamMap.get('returnUrl');\n\n if (returnUrl) {\n // Декодируем и перенаправляем пользователя туда, где он был\n this.router.navigateByUrl(decodeURIComponent(returnUrl));\n return;\n }\n\n // Если returnUrl нет, идем на главную\n this.router.navigate(['/']);\n }\n\n // Логика перенаправления обратно: достаем returnUrl из текущих query-параметров страницы логина\n const currentUrlTree = this.router.parseUrl(this.router.url);\n const returnUrl = currentUrlTree.queryParamMap.get('returnUrl');\n\n if (returnUrl) {\n this.router.navigateByUrl(decodeURIComponent(returnUrl));\n }\n {\n this.router.navigate(['/']); // дефолтный роут, если returnUrl нет\n }\n }\n}\n","@if (!isKiosk) {\r\n <ngx-uik-login-form\r\n (submitted)=\"onSubmit($event)\"\r\n [pending]=\"pending\"\r\n [errorMessage]=\"error\">\r\n </ngx-uik-login-form>\r\n }\r\n @if (isKiosk) {\r\n <ngx-uik-permit-form\r\n (submitted)=\"onSubmitPermit($event)\"\r\n >\r\n </ngx-uik-permit-form>\r\n }","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\r\nimport { RoleService } from '@kuzntsv/uikit';\r\n\r\n@Directive({\r\n selector: '[ngxUikDisableIfRole]',\r\n standalone: true\r\n})\r\nexport class DisableIfRoleDirective {\r\n readonly forbiddenRoles = input<string[]>([], { alias: 'ngxUikDisableIfRole' });\r\n\r\n private readonly el = inject(ElementRef);\r\n private readonly roleService = inject(RoleService);\r\n\r\n constructor() {\r\n effect(() => {\r\n // Спрашиваем у сервиса, заблокирована ли данная конфигурация ролей\r\n const shouldDisable = this.roleService.hasForbiddenRole(this.forbiddenRoles());\r\n\r\n\r\n // 2. Безопасное управление атрибутом для любых элементов\r\n const nativeEl = this.el.nativeElement;\r\n \r\n if ('disabled' in nativeEl) {\r\n nativeEl.disabled = shouldDisable;\r\n } else {\r\n // Для элементов вроде <a>, у которых нет свойства disabled в DOM API\r\n if (shouldDisable) {\r\n nativeEl.setAttribute('disabled', 'true');\r\n } else {\r\n nativeEl.removeAttribute('disabled');\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","import { Directive, ElementRef, effect, inject, input } from '@angular/core';\r\n\r\nimport { RoleService } from '@kuzntsv/uikit';\r\n\r\n@Directive({\r\n selector: '[ngxUikHideIfForbiddenRole]',\r\n standalone: true,\r\n})\r\nexport class HideIfForbiddenRoleDirective {\r\n readonly forbiddenRoles = input<string[]>([], {\r\n alias: 'ngxUikHideIfForbiddenRole',\r\n });\r\n\r\n private readonly el = inject(ElementRef);\r\n private readonly roleService = inject(RoleService);\r\n\r\n constructor() {\r\n effect(() => {\r\n // Элемент скрывается, если у пользователя есть запрещенная роль или передан маркер HIDE_ROLE_MARKER\r\n const shouldHide = this.roleService.hasForbiddenRole(\r\n this.forbiddenRoles(),\r\n );\r\n\r\n // Управляем отображением. Пустая строка возвращает дефолтный CSS-стиль элемента.\r\n this.el.nativeElement.style.display = shouldHide ? 'none' : '';\r\n });\r\n }\r\n}\r\n","import { Directive, effect, inject, input } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\n\r\n@Directive({\r\n selector: '[setValue]',\r\n standalone: true,\r\n})\r\nexport class SetValueDirective {\r\n readonly value = input<any>(null, { alias: 'setValue' });\r\n\r\n // 3. Используем опциональный inject, чтобы директива не падала, если формы нет\r\n private readonly ngControl = inject(NgControl, { optional: true });\r\n\r\n constructor() {\r\n effect(() => {\r\n // Эффект автоматически отслеживает изменение входного значения\r\n const val = this.value();\r\n\r\n // Безопасное приведение undefined к null для стандартизации значений в формах\r\n const normalizedValue = val === undefined ? null : val;\r\n\r\n // Используем проверку, так как на старте ngControl.control может быть еще не создан Angular-ом\r\n if (this.ngControl && this.ngControl.control) {\r\n this.ngControl.control.setValue(normalizedValue, { emitEvent: false });\r\n }\r\n });\r\n }\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router } from '@angular/router';\r\nimport { AuthService } from '@kuzntsv/uikit';\r\n\r\nexport const authGuard = (allowedRoles: string[]): CanActivateFn => {\r\n return (route, state) => {\r\n const authService = inject(AuthService);\r\n const router = inject(Router);\r\n\r\n const isLogin = authService.loggedIn();\r\n if (!isLogin) {\r\n console.log('state.url =', state.url);\r\n\r\n // Если не зарегистрирован вернуть в форму авторизации\r\n return router.createUrlTree(['/login'], { queryParams: { returnUrl: state.url } });\r\n }\r\n\r\n return isLogin;\r\n };\r\n};","import { ActivatedRouteSnapshot, CanActivateFn } from '@angular/router';\r\n\r\nexport const redirectGuard: CanActivateFn = (route: ActivatedRouteSnapshot) => {\r\n const externalUrl = route.data?.['externalUrl'];\r\n \r\n if (externalUrl) {\r\n window.location.href = externalUrl;\r\n }\r\n \r\n return true;\r\n};\r\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn } from '@angular/router';\r\nimport { RoleService } from '@kuzntsv/uikit';\r\n\r\n/**\r\n * Пускает на роут только тех пользователей, у которых есть роли из списка allowedRoles.\r\n * ADMIN всегда имеет доступ.\r\n */\r\nexport const roleGuard = (allowedRoles: string[]): CanActivateFn => {\r\n return (route, state) => {\r\n const roleService = inject(RoleService);\r\n\r\n // Проверяем доступ на основе аргумента allowedRoles\r\n return roleService.hasAnyRole(allowedRoles);\r\n };\r\n};","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface LoggerConfig {\r\n isProduction: boolean;\r\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\r\n}\r\n\r\nexport const LOGGER_CONFIG = new InjectionToken<LoggerConfig>('LOGGER_CONFIG');\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { LOGGER_CONFIG } from './logger.config';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LoggerService {\r\n public logPrefix: string = '';\r\n private isProduction: boolean;\r\n private readonly config = inject(LOGGER_CONFIG);\r\n\r\n constructor() {\r\n this.isProduction = this.config.isProduction;\r\n }\r\n\r\n log(message: string, ...args: any[]) {\r\n if (!this.isProduction) {\r\n // Prepend log prefix log string\r\n args.unshift(this.logPrefix + ' ');\r\n console.log(`[DEV LOG]: ${message}`, ...args);\r\n }else {\r\n console.log(`[PROD LOG]: ${message}`, ...args);\r\n }\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n console.error(`[ERROR]: ${message}`, ...args);\r\n }\r\n}\r\n\r\n\r\n\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { LOGGER_CONFIG, LoggerConfig } from './logger.config';\r\nimport { LoggerService } from './logger.service';\r\n\r\n\r\nexport function provideLogger(config: LoggerConfig): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: LOGGER_CONFIG, useValue: config },\r\n LoggerService\r\n ]);\r\n};\r\n","import { Deserializable } from './deserializable.model';\r\nimport { SecUserView } from './sec-user-view.model';\r\n\r\nexport class SecUser implements Deserializable {\r\n id: number = 0;\r\n login: string = '';\r\n fio: string = '';\r\n dept: number = 0;\r\n tabnum: number = 0;\r\n userView: SecUserView | undefined;\r\n\r\n public constructor(init: SecUser) {\r\n if (init) {\r\n Object.assign(this, init);\r\n } else {\r\n this.id = 0;\r\n this.login = '';\r\n this.dept = 0;\r\n this.tabnum = 0;\r\n this.fio = '';\r\n }\r\n }\r\n\r\n deserialize(input: any): this {\r\n Object.assign(this, input);\r\n return this;\r\n }\r\n}\r\n"],"mappings":"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"}
|