@rt-tools/ui-kit-v2 0.18.0 → 0.19.0
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.
- package/README.md +3 -2
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +14 -8
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +97 -0
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +10 -3
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +81 -0
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +98 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +5 -5
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +124 -25
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +3 -3
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +64 -27
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +46 -0
- package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +336 -12
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +3 -3
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +31 -5
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +3 -0
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
- package/package.json +13 -1
- package/rt-tools-ui-kit-v2-0.19.0.tgz +0 -0
- package/src/assets/icons/sparkle.svg +9 -0
- package/src/assets/icons/thumb-down.svg +10 -0
- package/src/assets/icons/thumb-up.svg +9 -0
- package/src/assets/icons/trash-x.svg +7 -0
- package/src/assets/icons-material/sparkle.fill.svg +5 -0
- package/src/assets/icons-material/sparkle.svg +5 -0
- package/src/assets/icons-material/thumb-down.fill.svg +5 -0
- package/src/assets/icons-material/thumb-down.svg +5 -0
- package/src/assets/icons-material/thumb-up.fill.svg +5 -0
- package/src/assets/icons-material/thumb-up.svg +5 -0
- package/src/assets/icons-material/trash-x.fill.svg +5 -0
- package/src/assets/icons-material/trash-x.svg +5 -0
- package/src/lib/components/action-bar/CONTEXT.md +8 -2
- package/src/lib/components/action-bar/rt-action-bar-holder.component.scss +10 -7
- package/src/lib/components/action-bar/rt-action-bar.component.scss +82 -34
- package/src/lib/components/ai-run-status/CONTEXT.md +36 -0
- package/src/lib/components/ai-run-status/rt-ai-run-status.component.scss +119 -0
- package/src/lib/components/aside/CONTEXT.md +1 -0
- package/src/lib/components/aside/header/rt-aside-header.component.scss +27 -11
- package/src/lib/components/copy-value/CONTEXT.md +31 -0
- package/src/lib/components/copy-value/rt-copy-value.component.scss +39 -0
- package/src/lib/components/data-list/settings/rt-data-list-settings-aside.component.scss +5 -5
- package/src/lib/components/dynamic-selector/CONTEXT.md +18 -0
- package/src/lib/components/dynamic-selector/list/rt-dynamic-selector-list.component.scss +29 -1
- package/src/lib/components/dynamic-selector/popup/rt-dynamic-selector-popup.component.scss +84 -25
- package/src/lib/components/empty-state/CONTEXT.md +2 -1
- package/src/lib/components/empty-state/rt-empty-state.component.scss +4 -2
- package/src/lib/components/icon/CONTEXT.md +16 -12
- package/src/lib/components/icon/rt-icon.component.scss +13 -3
- package/src/lib/components/prompt-suggestion/CONTEXT.md +29 -0
- package/src/lib/components/prompt-suggestion/rt-prompt-suggestion.component.scss +58 -0
- package/src/lib/components/thread-list/CONTEXT.md +4 -0
- package/src/lib/components/thread-list/rt-thread-list.component.scss +29 -0
- package/src/lib/components/toolbar/CONTEXT.md +4 -0
- package/src/lib/components/toolbar/rt-toolbar.component.scss +7 -0
- package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +58 -0
- package/src/rich-editor/lib/components/ai-chat/answer/rt-ai-chat-answer.component.scss +12 -0
- package/src/rich-editor/lib/components/ai-chat/rt-ai-chat.component.scss +222 -0
- package/src/rich-editor/lib/components/rich-editor/rt-rich-editor.component.scss +3 -0
- package/src/styles/_scrollbar.scss +9 -0
- package/styles/tokens.css +3 -0
- package/types/rt-tools-ui-kit-v2-action-bar.d.ts +11 -2
- package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +49 -0
- package/types/rt-tools-ui-kit-v2-aside.d.ts +9 -1
- package/types/rt-tools-ui-kit-v2-copy-value.d.ts +29 -0
- package/types/rt-tools-ui-kit-v2-core.d.ts +93 -53
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +44 -5
- package/types/rt-tools-ui-kit-v2-icon.d.ts +12 -4
- package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +21 -0
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +186 -2
- package/types/rt-tools-ui-kit-v2-thread-list.d.ts +15 -2
- package/types/rt-tools-ui-kit-v2.d.ts +3 -0
- package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-data-table.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-cell.logic.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-config.service.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-icon.directive.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-row-click.directive.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/cell/rt-data-table-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/cell/rt-data-table-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-sort.logic.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/header-cell/rt-data-table-header-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/header-cell/rt-data-table-header-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-filter.logic.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-cells.directive.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-selection.logic.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table.component.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table.component.html","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-selectors.directive.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-tools-ui-kit-v2-data-table.ts"],"sourcesContent":["import { isNumber, isString, TNullable } from '@rt-tools/utils';\n\nimport { iconMaterialMap, IRtIconMaterialEntry } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\n/** Значение ячейки: как его отдала запись или как его переделала колонка. */\nexport function dataTableCellValue<T>(row: T, column: IRtDataTable.Column<T>): T[keyof T] | string | number {\n const transform: TNullable<(value: T[keyof T]) => string | number> = column.transform;\n const raw: T[keyof T] = row[column.propName];\n\n return transform ? transform(raw) : raw;\n}\n\n/** Текст значения для подсказки и буфера — так же, как первый кит: строка, число, иначе JSON. */\nexport function dataTableCellText(value: unknown): string {\n if (isString(value)) {\n return value;\n }\n\n if (isNumber(value)) {\n return value.toString();\n }\n\n return JSON.stringify(value);\n}\n\n/**\n * Сторона кнопки копирования: заданная колонкой, иначе противоположная выравниванию значения —\n * справа выровненное значение копируется кнопкой слева.\n */\nexport function dataTableCopyButtonSide(column: IRtDataTable.Column<unknown>): 'left' | 'right' {\n return column.copyBtnAlign ?? (column.align === 'right' ? 'left' : 'right');\n}\n\n/**\n * Значок набора кита для имени первого кита, либо `null`, если пары нет.\n *\n * Идёт через перечень соответствий кита, а не своим списком: второй список разошёлся бы с\n * перечнем молча, и одно имя рисовалось бы в двух местах двумя рисунками.\n */\nexport function dataTableIconName(glyph: string): IRtIcon.Name | null {\n return iconMaterialMap.find((entry: IRtIconMaterialEntry) => entry.from === glyph)?.to ?? null;\n}\n","import { DestroyRef, Injectable, Signal, WritableSignal, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { Observable, Subject } from 'rxjs';\nimport { concatMap, map, switchMap, take, takeUntil } from 'rxjs/operators';\n\nimport { IDBStorageService } from '@rt-tools/core';\nimport { areArraysEqual, TNullable } from '@rt-tools/utils';\n\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\n/** Настройка, как её держит хранилище: столбцы там лежат частичными. Форма — первого кита. */\ninterface IStoredConfig<ENTITY_TYPE> {\n isVerticalScrollbarShown: boolean;\n isHorizontalScrollbarShown: boolean;\n columns: Array<Partial<IRtDataTable.Column<ENTITY_TYPE>>>;\n}\n\n/** Просьба чтения: с каким составом столбцов сверять прочитанное. */\ninterface IConfigRead<ENTITY_TYPE> {\n readonly storageKey: string;\n readonly config: Array<IRtDataTable.Column<ENTITY_TYPE>>;\n}\n\n/** Просьба записи или снятия: обе идут одним потоком, чтобы не разойтись порядком. */\ntype TConfigWrite<ENTITY_TYPE> =\n | { readonly kind: 'set'; readonly storageKey: string; readonly config: IRtDataTable.Config.Data<ENTITY_TYPE> }\n | { readonly kind: 'remove'; readonly storageKey: string };\n\n/**\n * Порядок имён колонок для сверки двух наборов.\n *\n * Какой именно порядок, значения не имеет: оба набора выстраиваются одним и тем же и сравниваются\n * на равенство. Важно лишь, чтобы порядок был один и не зависел от вида значения, — умолчание\n * `sort()` приводит элементы к строке по-своему и на числовых ключах даёт лексикографический.\n */\nexport function comparePropNames(a: PropertyKey | undefined, b: PropertyKey | undefined): number {\n return String(a).localeCompare(String(b));\n}\n\n/**\n * Настройки таблицы в хранилище браузера: порядок и видимость столбцов, полосы прокрутки.\n *\n * Перенесено из первого кита как есть: ключ — тот, что дало приложение, форма записи — та же.\n * Поэтому настройки, сохранённые таблицей первого кита, читаются здесь без переделки.\n */\n@Injectable()\nexport class RtDataTableConfigService<ENTITY_TYPE> {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #iDBStorageService: IDBStorageService<IStoredConfig<ENTITY_TYPE>> = inject(IDBStorageService);\n\n /** Просьбы прочитать сохранённую настройку. */\n readonly #readSource: Subject<IConfigRead<ENTITY_TYPE>> = new Subject<IConfigRead<ENTITY_TYPE>>();\n\n /** Настройку поменяли здесь: чтение, начатое раньше, отвечать уже не должно. */\n readonly #updatedSource: Subject<void> = new Subject<void>();\n\n /** Просьбы записать и снять настройку — один источник на оба действия. */\n readonly #writeSource: Subject<TConfigWrite<ENTITY_TYPE>> = new Subject<TConfigWrite<ENTITY_TYPE>>();\n\n readonly #tableConfig: WritableSignal<IRtDataTable.Config.Data<ENTITY_TYPE>> = signal({\n isVerticalScrollbarShown: false,\n isHorizontalScrollbarShown: false,\n columns: [],\n });\n public readonly tableConfig: Signal<IRtDataTable.Config.Data<ENTITY_TYPE>> = this.#tableConfig.asReadonly();\n\n /**\n * Потоки чтения и записи объявлены один раз, а методы только толкают в них просьбы.\n *\n * Чтение — `switchMap`: отвечает последний вызов, потому что настройка, прочитанная под\n * прежний состав столбцов, к нынешнему уже не относится. Чтение, ещё не вернувшееся к\n * `updateConfig`, гасится им: иначе прочитанное позже затёрло бы то, что поменяли после.\n * Запись и снятие — один поток и `concatMap`: разведённые по двум, они теряют порядок между\n * собой, и снятие, обогнавшее запись, оставляет в хранилище снятое.\n */\n constructor() {\n this.#readSource\n .pipe(\n switchMap((read: IConfigRead<ENTITY_TYPE>): Observable<IRtDataTable.Config.Data<ENTITY_TYPE>> =>\n this.#iDBStorageService.get(read.storageKey).pipe(\n take(1),\n takeUntil(this.#updatedSource),\n map((savedConfig: TNullable<IStoredConfig<ENTITY_TYPE>>): IRtDataTable.Config.Data<ENTITY_TYPE> =>\n this.#configOf(read.config, savedConfig)\n )\n )\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((config: IRtDataTable.Config.Data<ENTITY_TYPE>) => {\n this.#tableConfig.set(config);\n });\n\n this.#writeSource\n .pipe(\n concatMap((write: TConfigWrite<ENTITY_TYPE>): Observable<unknown> => this.#writeOf(write).pipe(take(1))),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe();\n }\n\n public initConfig(storageKey: string, config: Array<IRtDataTable.Column<ENTITY_TYPE>>): void {\n this.#readSource.next({ storageKey, config });\n }\n\n public updateConfig(storageKey: string, config: IRtDataTable.Config.Data<ENTITY_TYPE>): void {\n this.#updatedSource.next();\n this.#writeSource.next({ kind: 'set', storageKey, config });\n this.#tableConfig.set(config);\n }\n\n public deleteConfig(storageKey: string): void {\n this.#writeSource.next({ kind: 'remove', storageKey });\n }\n\n /** Обращение к хранилищу под просьбу записи или снятия. */\n #writeOf(write: TConfigWrite<ENTITY_TYPE>): Observable<unknown> {\n if (write.kind === 'remove') {\n return this.#iDBStorageService.remove(write.storageKey);\n }\n\n const storedColumns: Array<Partial<IRtDataTable.Column<ENTITY_TYPE>>> = write.config.columns.map(\n (el: IRtDataTable.Column<ENTITY_TYPE>) => ({\n displayName: el.header.label ?? el.propName.toString(),\n propName: el.propName,\n width: el?.width ?? 'auto',\n orderIndex: el?.orderIndex ?? 0,\n hidden: !!el?.hidden,\n fixed: !!el?.fixed,\n })\n );\n\n return this.#iDBStorageService.set(write.storageKey, { ...write.config, columns: storedColumns });\n }\n\n /**\n * Настройка, которую показывает таблица: сохранённая, если она сходится с нынешним составом\n * столбцов, иначе — собранная из самого состава.\n */\n #configOf(\n config: Array<IRtDataTable.Column<ENTITY_TYPE>>,\n savedConfig: TNullable<IStoredConfig<ENTITY_TYPE>>\n ): IRtDataTable.Config.Data<ENTITY_TYPE> {\n if (!savedConfig?.columns || !this.#isSavedConfigConsistent(config, savedConfig.columns)) {\n return {\n isVerticalScrollbarShown: false,\n isHorizontalScrollbarShown: true,\n columns: config.map((el: IRtDataTable.Column<ENTITY_TYPE>, index: number) => ({\n ...el,\n orderIndex: index,\n displayName: el?.header?.label?.length ? el.header.label : el.propName.toString(),\n })),\n };\n }\n\n const updatedColumns: Array<IRtDataTable.Column<ENTITY_TYPE>> = savedConfig.columns.map(\n (el: Partial<IRtDataTable.Column<ENTITY_TYPE>>): IRtDataTable.Column<ENTITY_TYPE> => {\n const declared: TNullable<IRtDataTable.Column<ENTITY_TYPE>> = config.find(\n (item: IRtDataTable.Column<ENTITY_TYPE>) => el.propName === item.propName\n );\n\n return {\n // Сверка составов выше гарантирует, что столбец с этим именем объявлен.\n ...(declared as IRtDataTable.Column<ENTITY_TYPE>),\n displayName: declared?.header?.label?.length ? declared.header.label : el?.propName?.toString(),\n propName: el.propName as Extract<keyof ENTITY_TYPE, string>,\n width: el?.width ?? 'auto',\n orderIndex: el?.orderIndex ?? 0,\n hidden: !!el?.hidden,\n fixed: !!el?.fixed,\n };\n }\n );\n\n return {\n isVerticalScrollbarShown: !!savedConfig?.isVerticalScrollbarShown,\n isHorizontalScrollbarShown: !!savedConfig?.isHorizontalScrollbarShown,\n columns: updatedColumns,\n };\n }\n\n #isSavedConfigConsistent(\n declared: Array<IRtDataTable.Column<ENTITY_TYPE>>,\n saved: Array<Partial<IRtDataTable.Column<ENTITY_TYPE>>>\n ): boolean {\n return (\n !!declared?.length &&\n !!saved?.length &&\n declared.length === saved.length &&\n areArraysEqual(\n declared.map((el: IRtDataTable.Column<ENTITY_TYPE>) => el.propName).toSorted(comparePropNames),\n saved.map((el: Partial<IRtDataTable.Column<ENTITY_TYPE>>) => el.propName).toSorted(comparePropNames)\n )\n );\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\n/** Что получает шаблон значка: имя, колонку и — в ячейке — запись строки. */\nexport interface IRtDataTableIconContext<T = Record<string, unknown>> {\n /** Имя значка из описания колонки — то, что там написало приложение. */\n $implicit: string;\n column: IRtDataTable.Column<T>;\n /** Запись строки; в шапке её нет. */\n row: T | null;\n}\n\n/**\n * Шаблон значка, который приложение отдаёт таблице.\n *\n * Когда он дан, значки шапки и ячеек, названные в описании колонок, рисует он, а перечень\n * соответствий кита не спрашивается. Это выход для имени, которому в наборе кита нет пары.\n *\n * ```html\n * <rt-data-table ...>\n * <ng-template rtDataTableIcon let-name let-row=\"row\">\n * <rt-icon [name]=\"iconOf(name)\" />\n * </ng-template>\n * </rt-data-table>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtDataTableIcon]',\n exportAs: 'rtDataTableIcon',\n})\nexport class RtDataTableIconDirective<T = Record<string, unknown>> {\n public readonly template: TemplateRef<IRtDataTableIconContext<T>> = inject<TemplateRef<IRtDataTableIconContext<T>>>(TemplateRef);\n\n public static ngTemplateContextGuard<T>(\n _directive: RtDataTableIconDirective<T>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n context: unknown\n ): context is IRtDataTableIconContext<T> {\n return true;\n }\n}\n","import {\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n InjectionToken,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n} from '@angular/core';\nimport { BooleanInput } from '@angular/cdk/coercion';\n\nimport { PlatformService } from '@rt-tools/core';\n\n/** Атрибут части строки, нажатие на которую до строки не доходит. */\nexport const RT_DATA_TABLE_STOP_ROW_CLICK_ATTRIBUTE: string = 'rt-data-table-stop-row-click';\n\n/** Кому строка сообщает о нажатии и двойном нажатии — самой таблице. */\nexport interface IRtDataTableRowHost<ENTITY_TYPE> {\n onRowClick(row: ENTITY_TYPE, event: MouseEvent): void;\n onRowDoubleClick(row: ENTITY_TYPE): void;\n}\n\nexport const RT_DATA_TABLE_ROW_HOST: InjectionToken<IRtDataTableRowHost<unknown>> = new InjectionToken<IRtDataTableRowHost<unknown>>(\n 'RtDataTableRowHost'\n);\n\n/** Попало ли нажатие в часть строки, помеченную как не доходящую до строки. */\nfunction isInsideStopNode(event: MouseEvent): boolean {\n return event.target instanceof Element && !!event.target.closest(`[${RT_DATA_TABLE_STOP_ROW_CLICK_ATTRIBUTE}]`);\n}\n\n/**\n * Помечает часть строки, нажатие на которую до строки не доходит, — картинку, кнопку приложения,\n * блок текста в своей ячейке.\n */\n@Directive({\n selector: '[rtDataTableStopRowClick]',\n})\nexport class RtDataTableStopRowClickDirective implements OnInit {\n readonly #platformService: PlatformService = inject(PlatformService);\n readonly #elementRef: ElementRef<HTMLElement> = inject(ElementRef<HTMLElement>);\n\n public ngOnInit(): void {\n if (this.#platformService.isPlatformBrowser) {\n this.#elementRef.nativeElement.setAttribute(RT_DATA_TABLE_STOP_ROW_CLICK_ATTRIBUTE, '');\n }\n }\n}\n\n/**\n * Нажатие и двойное нажатие строки — как в первом ките.\n *\n * О нажатии строка сообщает, когда кнопка опускается, а не когда отпускается, и любой кнопкой:\n * так было в первом ките, и так переносится. Двойное нажатие поэтому приходит после двух нажатий\n * строки.\n */\n@Directive({\n selector: '[rtDataTableRowClick]',\n host: {\n '(mousedown)': 'onMouseDown($event)',\n '(dblclick)': 'onDoubleClick($event)',\n },\n})\nexport class RtDataTableRowClickDirective<ENTITY_TYPE> {\n readonly #host: IRtDataTableRowHost<ENTITY_TYPE> = inject<IRtDataTableRowHost<ENTITY_TYPE>>(RT_DATA_TABLE_ROW_HOST);\n\n /** Запись строки. */\n public readonly entity: InputSignal<ENTITY_TYPE> = input.required<ENTITY_TYPE>({ alias: 'rtDataTableRowClick' });\n\n /** Строка сообщает о нажатиях. */\n public readonly isTableRowClickable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n public onMouseDown(event: MouseEvent): void {\n if (!this.isTableRowClickable() || isInsideStopNode(event)) {\n event.stopPropagation();\n return;\n }\n this.#host.onRowClick(this.entity(), event);\n }\n\n public onDoubleClick(event: MouseEvent): void {\n if (!this.isTableRowClickable() || isInsideStopNode(event)) {\n event.stopPropagation();\n return;\n }\n this.#host.onRowDoubleClick(this.entity());\n }\n}\n","import { Clipboard } from '@angular/cdk/clipboard';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n Signal,\n signal,\n TemplateRef,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DomSanitizer, SafeStyle } from '@angular/platform-browser';\n\nimport { BlockDirective, ElemDirective, EmptyToDashPipe, ModDirective } from '@rt-tools/core';\nimport { isEmpty, TNullable } from '@rt-tools/utils';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { dataTableCellText, dataTableCellValue, dataTableCopyButtonSide, dataTableIconName } from '../rt-data-table-cell.logic';\nimport { IRtDataTableIconContext } from '../rt-data-table-icon.directive';\nimport { RtDataTableStopRowClickDirective } from '../rt-data-table-row-click.directive';\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-data-table-cell';\n\n/** Сколько держать «скопировано» перед возвратом кнопки — как в первом ките. */\nconst COPIED_DELAY_MS: number = 2000;\n\n/**\n * Готовая ячейка `rt-data-table` — ячейка первого кита без Material.\n *\n * Значение рисуется как пришло или как его переделала колонка; пустое — прочерком. Длинное\n * обрезается в строку, и подсказка со значением целиком бывает только у обрезанного. Значок —\n * набором кита по имени первого кита либо шаблоном значка приложения. Кнопка копирования\n * проявляется при наведении и стоит на стороне, противоположной выравниванию значения.\n */\n@Component({\n selector: 'rt-data-table-cell',\n templateUrl: './rt-data-table-cell.component.html',\n styleUrl: './rt-data-table-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // components\n RtIconButtonComponent,\n RtIconComponent,\n\n // directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n NgTemplateOutlet,\n RtDataTableStopRowClickDirective,\n RtTooltipDirective,\n\n // pipes\n EmptyToDashPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[style.width]': 'column().width',\n '[style.min-width]': 'column().minWidth',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'hovered.set(false)',\n },\n})\nexport class RtDataTableCellComponent<T = Record<string, unknown>> {\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n readonly #clipboard: Clipboard = inject(Clipboard);\n readonly #sanitizer: DomSanitizer = inject(DomSanitizer);\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n #copiedTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly #copyLabel: Signal<string> = rtKitLabel('dataTableCopy');\n readonly #copiedLabel: Signal<string> = rtKitLabel('dataTableCopied');\n\n /** Экран узкий: подсказки гаснут. Что кнопка копирования там видна всегда, решают стили. */\n protected readonly narrow: Signal<boolean> = this.#breakpoints.narrow;\n\n protected readonly value: Signal<T[keyof T] | string | number> = computed(() => dataTableCellValue(this.row(), this.column()));\n\n /**\n * Копировать нечего: значение пусто. Считается той же утилитой, что рисует прочерк вместо\n * значения, — второй ответ на этот вопрос разошёлся бы с прочерком молча.\n */\n protected readonly empty: Signal<boolean> = computed(() => isEmpty(this.value()));\n\n protected readonly copyable: Signal<boolean> = computed(() => this.column().copyable && !this.empty());\n\n /**\n * Значок колонки. Его видимость, цвет и подсказку ячейка не читает — как первый кит: поля\n * приняты ради переезда без правок и ничего не меняют.\n */\n protected readonly icon: Signal<IRtDataTable.Icon | null> = computed(() => this.column().icon ?? null);\n\n /** Значок набора кита для имени первого кита; без пары — ничего. */\n protected readonly kitIcon: Signal<IRtIcon.Name | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon ? dataTableIconName(icon.glyph) : null;\n });\n\n /**\n * Имя без пары в перечне соответствий: его ячейка рисует глифом шрифта Material Symbols, как\n * первый кит рисовал любой глиф. Шрифт кит не везёт — глиф виден там, где шрифт подключило\n * приложение, а без шрифта на месте значка стоит его имя.\n */\n protected readonly glyph: Signal<string | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon && !this.kitIcon() ? icon.glyph : null;\n });\n\n /** Залитый глиф — как залитый значок набора: контурным его делает `outlined` колонки. */\n protected readonly glyphMods: Signal<Record<string, boolean>> = computed(() => ({ filled: this.icon()?.outlined !== true }));\n\n protected readonly iconContext: Signal<IRtDataTableIconContext<T> | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon ? { $implicit: icon.glyph, column: this.column(), row: this.row() } : null;\n });\n\n /**\n * Стиль значка, посчитанный колонкой по значению строки, — строкой, как в первом ките.\n * Это одна из странностей первого кита, перенесённых как есть: такую строку не перекрашивает\n * ни набор, ни тёмная тема.\n */\n protected readonly iconStyle: Signal<SafeStyle | null> = computed(() => {\n const transform: TNullable<(value: T[keyof T]) => string> = this.column().iconTransform;\n\n // eslint-disable-next-line sonarjs/no-angular-bypass-sanitization -- строка стиля собрана описанием колонок приложения, а не значением, введённым человеком\n return transform ? this.#sanitizer.bypassSecurityTrustStyle(transform(this.row()[this.column().propName])) : null;\n });\n\n protected readonly hovered: WritableSignal<boolean> = signal(false);\n protected readonly copied: WritableSignal<boolean> = signal(false);\n\n /** Подсказка: заданная колонкой, иначе значение целиком — и только у обрезанного. */\n protected readonly hint: WritableSignal<string> = signal('');\n\n protected readonly copyLabel: Signal<string> = computed(() => (this.copied() ? this.#copiedLabel() : this.#copyLabel()));\n\n protected readonly copyIcon: Signal<IRtIcon.Name> = computed(() => (this.copied() ? 'check' : 'copy'));\n\n protected readonly titleMods: Signal<Record<string, string>> = computed(() => ({ align: this.column().align }));\n\n protected readonly copyMods: Signal<Record<string, string | boolean>> = computed(() => ({\n position: dataTableCopyButtonSide(this.column() as IRtDataTable.Column<unknown>),\n complete: this.copied(),\n visible: this.hovered(),\n }));\n\n public readonly row: InputSignal<T> = input.required<T>();\n public readonly column: InputSignal<IRtDataTable.Column<T>> = input.required<IRtDataTable.Column<T>>();\n\n /** Шаблон значка приложения; когда он дан, перечень кита не спрашивается. */\n public readonly iconTemplate: InputSignal<TemplateRef<IRtDataTableIconContext<T>> | null> = input<TemplateRef<\n IRtDataTableIconContext<T>\n > | null>(null);\n\n constructor() {\n inject(DestroyRef).onDestroy((): void => this.#clearTimer());\n }\n\n /**\n * Наведение: проявить кнопку копирования и замерить обрезку.\n *\n * Ширина известна только отрисованному узлу, а меняется она и от переезда столбца, и от\n * ширины окна: посчитанная один раз, она соврала бы при первом же изменении.\n */\n protected onMouseEnter(): void {\n this.hovered.set(true);\n\n const text: HTMLElement | null = this.#host.nativeElement.querySelector(`.${BEM_BLOCK}__text`);\n const cut: boolean = text !== null && text.scrollWidth > text.clientWidth;\n\n this.hint.set(!this.narrow() && cut ? (this.column().tooltip ?? dataTableCellText(this.value())) : '');\n }\n\n protected onCopy(): void {\n this.#clipboard.copy(dataTableCellText(this.value()));\n this.copied.set(true);\n\n this.#clearTimer();\n this.#copiedTimer = setTimeout((): void => this.copied.set(false), COPIED_DELAY_MS);\n }\n\n #clearTimer(): void {\n if (this.#copiedTimer !== null) {\n clearTimeout(this.#copiedTimer);\n this.#copiedTimer = null;\n }\n }\n}\n","<ng-container rtBlock=\"rt-data-table-cell\">\n <ng-template #iconTpl>\n @if (iconTemplate(); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"iconContext()\" />\n } @else if (kitIcon(); as name) {\n <rt-icon size=\"lg\" [name]=\"name\" [fill]=\"icon()?.outlined !== true\" [style]=\"iconStyle()\" />\n } @else if (glyph(); as name) {\n <span rtElem=\"glyph\" aria-hidden=\"true\" qa-dataid=\"data-table-cell-glyph\" [rtMod]=\"glyphMods()\" [style]=\"iconStyle()\">\n {{ name }}\n </span>\n }\n </ng-template>\n\n @if (icon()?.placement === 'left') {\n <span rtElem=\"prefix\" qa-dataid=\"data-table-cell-prefix\"><ng-container [ngTemplateOutlet]=\"iconTpl\" /></span>\n }\n\n <div rtElem=\"title\" [rtMod]=\"titleMods()\">\n <div rtElem=\"text\" qa-dataid=\"data-table-cell-text\" [rtTooltip]=\"hint()\">{{ value() | emptyToDash }}</div>\n </div>\n\n @if (icon()?.placement === 'right') {\n <span rtElem=\"suffix\" qa-dataid=\"data-table-cell-suffix\"><ng-container [ngTemplateOutlet]=\"iconTpl\" /></span>\n }\n\n @if (copyable()) {\n <rt-icon-button\n rtElem=\"copy-button\"\n rtDataTableStopRowClick\n qa-dataid=\"data-table-cell-copy\"\n size=\"sm\"\n [rtMod]=\"copyMods()\"\n [icon]=\"copyIcon()\"\n [ariaLabel]=\"copyLabel()\"\n [tooltip]=\"narrow() ? '' : copyLabel()\"\n (clicked)=\"onCopy()\" />\n }\n</ng-container>\n","import { EListSortOrder, ISortModel, TListSortOrderType, TNullable } from '@rt-tools/utils';\n\n/**\n * Какой порядок просит нажатие на шапку — как в первом ките: по возрастанию, а после возрастания\n * по убыванию. Снятия порядка нет: после убывания снова возрастание.\n */\nexport function dataTableNextSortOrder(current: TNullable<ISortModel<string>>): TListSortOrderType {\n return current?.sortDirection?.toLowerCase() === EListSortOrder.ASC ? EListSortOrder.DESC : EListSortOrder.ASC;\n}\n\n/** Порядок таблицы сейчас стоит по этой колонке. */\nexport function dataTableSortActive(sort: TNullable<ISortModel<string>>, current: TNullable<ISortModel<string>>): boolean {\n return !!current?.propertyName && !!sort?.propertyName && current.propertyName === sort.propertyName;\n}\n\n/** Значение `aria-sort` шапки: скринридер называет порядок колонки, а не только её имя. */\nexport type TRtDataTableAriaSort = 'ascending' | 'descending' | 'none';\n\n/**\n * `aria-sort` сортируемой колонки: порядок по ней, если он стоит по ней, иначе `none`. Колонке\n * без сортировки атрибут не положен вовсе — `null` снимает его.\n */\nexport function dataTableAriaSort(\n sort: TNullable<ISortModel<string>>,\n current: TNullable<ISortModel<string>>\n): TRtDataTableAriaSort | null {\n if (!sort?.propertyName) {\n return null;\n }\n\n if (!dataTableSortActive(sort, current)) {\n return 'none';\n }\n\n const direction: string | undefined = current?.sortDirection?.toLowerCase();\n\n if (direction === EListSortOrder.ASC) {\n return 'ascending';\n }\n\n return direction === EListSortOrder.DESC ? 'descending' : 'none';\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { BlockDirective, ConcatClassesPipe, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { EListSortOrder, ISortModel, TNullable } from '@rt-tools/utils';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { dataTableIconName } from '../rt-data-table-cell.logic';\nimport { IRtDataTableIconContext } from '../rt-data-table-icon.directive';\nimport { dataTableNextSortOrder, dataTableSortActive } from '../rt-data-table-sort.logic';\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-data-table-header-cell';\n\n/**\n * Ячейка шапки `rt-data-table` — шапка первого кита без Material.\n *\n * Нажатие на шапку сортируемой колонки просит порядок: по возрастанию, затем по убыванию, и так\n * по кругу — снятия порядка нет. С клавиатуры то же делают Enter и пробел. Стрелки порядка видны\n * при наведении, при фокусе и у колонки, по которой порядок стоит. Значок шапки — набором кита по имени первого кита либо шаблоном приложения.\n */\n@Component({\n selector: 'rt-data-table-header-cell',\n templateUrl: './rt-data-table-header-cell.component.html',\n styleUrl: './rt-data-table-header-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // components\n RtIconComponent,\n\n // directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n NgTemplateOutlet,\n RtTooltipDirective,\n\n // pipes\n ConcatClassesPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[style.text-align]': 'headerModel().align',\n '[attr.tabindex]': 'sortable() ? 0 : null',\n '[attr.role]': 'sortable() ? \"button\" : null',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onKey($event)',\n '(keydown.space)': 'onKey($event)',\n },\n})\nexport class RtDataTableHeaderCellComponent<T = Record<string, unknown>> {\n /** Шапка сортируемой колонки нажимается и с клавиатуры: у неё фокус и роль кнопки. */\n protected readonly sortable: Signal<boolean> = computed(() => !!this.sortModel()?.propertyName);\n\n protected readonly active: Signal<boolean> = computed(() => dataTableSortActive(this.sortModel(), this.currentSortModel()));\n\n protected readonly labelMods: Signal<Record<string, string>> = computed(() => ({ align: this.headerModel().align }));\n\n protected readonly arrowsMods: Signal<Record<string, boolean>> = computed(() => ({ active: this.active() }));\n\n protected readonly descMods: Signal<Record<string, boolean>> = computed(() => ({\n active: this.active() && this.currentSortModel()?.sortDirection?.toLowerCase() === EListSortOrder.DESC,\n first: true,\n }));\n\n protected readonly ascMods: Signal<Record<string, boolean>> = computed(() => ({\n active: this.active() && this.currentSortModel()?.sortDirection?.toLowerCase() === EListSortOrder.ASC,\n second: true,\n }));\n\n /** Значок шапки; его цвет и видимость, как в первом ките, ничего не меняют. */\n protected readonly icon: Signal<IRtDataTable.Icon | null> = computed(() => this.headerModel().icon ?? null);\n\n protected readonly kitIcon: Signal<IRtIcon.Name | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon ? dataTableIconName(icon.glyph) : null;\n });\n\n /** Имя без пары в перечне шапка рисует глифом Material Symbols — так же, как ячейка. */\n protected readonly glyph: Signal<string | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon && !this.kitIcon() ? icon.glyph : null;\n });\n\n /** Залитый глиф — как залитый значок набора: контурным его делает `outlined` колонки. */\n protected readonly glyphMods: Signal<Record<string, boolean>> = computed(() => ({ filled: this.icon()?.outlined !== true }));\n\n protected readonly iconContext: Signal<IRtDataTableIconContext<T> | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n const column: IRtDataTable.Column<T> | null = this.column();\n\n return icon && column ? { column, $implicit: icon.glyph, row: null } : null;\n });\n\n public readonly headerModel: InputSignal<IRtDataTable.Header> = input.required<IRtDataTable.Header>();\n public readonly sortModel: InputSignal<TNullable<ISortModel<string>>> = input.required<TNullable<ISortModel<string>>>();\n public readonly currentSortModel: InputSignal<TNullable<ISortModel<string>>> = input.required<TNullable<ISortModel<string>>>();\n\n /** Колонка шапки — её получает шаблон значка приложения. */\n public readonly column: InputSignal<IRtDataTable.Column<T> | null> = input<IRtDataTable.Column<T> | null>(null);\n\n /** Шаблон значка приложения; когда он дан, перечень кита не спрашивается. */\n public readonly iconTemplate: InputSignal<TemplateRef<IRtDataTableIconContext<T>> | null> = input<TemplateRef<\n IRtDataTableIconContext<T>\n > | null>(null);\n\n public readonly sortChange: OutputEmitterRef<ISortModel<string>> = output<ISortModel<string>>();\n\n /** Enter и пробел просят порядок так же, как нажатие; пробел иначе прокрутил бы страницу. */\n protected onKey(event: Event): void {\n if (this.sortable()) {\n event.preventDefault();\n this.onClick();\n }\n }\n\n protected onClick(): void {\n const propertyName: TNullable<string> = this.sortModel()?.propertyName;\n\n if (propertyName) {\n this.sortChange.emit({ propertyName, sortDirection: dataTableNextSortOrder(this.currentSortModel()) });\n }\n }\n}\n","<ng-container rtBlock=\"rt-data-table-header-cell\">\n <ng-template #iconTpl>\n @if (iconTemplate(); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"iconContext()\" />\n } @else if (kitIcon(); as name) {\n <rt-icon size=\"lg\" [name]=\"name\" [fill]=\"icon()?.outlined !== true\" />\n } @else if (glyph(); as name) {\n <span rtElem=\"glyph\" aria-hidden=\"true\" qa-dataid=\"data-table-header-glyph\" [rtMod]=\"glyphMods()\">{{ name }}</span>\n }\n </ng-template>\n\n <div rtElem=\"label\" [rtMod]=\"labelMods()\">\n @if (icon()?.placement === 'left') {\n <span rtElem=\"prefix\" qa-dataid=\"data-table-header-prefix\"><ng-container [ngTemplateOutlet]=\"iconTpl\" /></span>\n }\n\n <div\n rtElem=\"text\"\n qa-dataid=\"data-table-header-text\"\n [class]=\"[headerModel().className] | concatClasses\"\n [rtTooltip]=\"headerModel().tooltip ?? ''\">\n {{ headerModel().label }}\n </div>\n\n @if (icon()?.placement === 'right') {\n <span rtElem=\"suffix\" qa-dataid=\"data-table-header-suffix\"><ng-container [ngTemplateOutlet]=\"iconTpl\" /></span>\n }\n </div>\n\n @if (sortModel()) {\n <div rtElem=\"arrows\" qa-dataid=\"data-table-header-sort\" [rtMod]=\"arrowsMods()\">\n <div rtElem=\"arrow\" [rtMod]=\"descMods()\"></div>\n <div rtElem=\"arrow\" [rtMod]=\"ascMods()\"></div>\n </div>\n }\n</ng-container>\n","import { EFilterOperatorType, FILTER_OPERATORS, IFilterModel, TFilterOperatorType } from '@rt-tools/utils';\n\n/** Значение отбора в том виде, в каком его отдаёт приложению первый кит. */\nexport type TRtDataTableFilterValue = string | number | boolean;\n\n/**\n * Значок вида сравнения — имя первого кита; набор кита рисует его по перечню соответствий.\n * «Начинается с» и «заканчивается на» первый кит объявлял, но значка и пункта меню им не давал.\n */\nexport const DATA_TABLE_FILTER_OPERATOR_GLYPHS: Readonly<Record<TFilterOperatorType, string | null>> = {\n [EFilterOperatorType.EQUALS]: 'drag_handle',\n [EFilterOperatorType.NOT_EQUALS]: 'block',\n [EFilterOperatorType.STARTS_WITH]: null,\n [EFilterOperatorType.ENDS_WITH]: null,\n [EFilterOperatorType.CONTAINS]: 'more_horiz',\n [EFilterOperatorType.GREATER_THAN]: 'chevron_right',\n [EFilterOperatorType.LESS_THAN]: 'chevron_left',\n};\n\n/** Пункты меню видов сравнения в порядке первого кита. */\nexport const DATA_TABLE_FILTER_MENU_OPERATORS: ReadonlyArray<TFilterOperatorType> = [\n EFilterOperatorType.EQUALS,\n EFilterOperatorType.NOT_EQUALS,\n EFilterOperatorType.CONTAINS,\n EFilterOperatorType.GREATER_THAN,\n EFilterOperatorType.LESS_THAN,\n];\n\n/** Вид сравнения колонки по умолчанию: незнакомое и пустое значение дают «равно». */\nexport function dataTableDefaultOperator(operator: TFilterOperatorType | null | undefined): TFilterOperatorType {\n return operator && FILTER_OPERATORS.includes(operator) ? operator : EFilterOperatorType.EQUALS;\n}\n\n/** Условие колонки из набора приложения, а без него — пустое условие с видом по умолчанию. */\nexport function dataTableColumnFilter<KEY extends string>(\n filters: ReadonlyArray<IFilterModel<KEY>>,\n propertyName: KEY,\n defaultOperator: TFilterOperatorType\n): IFilterModel<KEY> {\n return (\n filters.find((filter: IFilterModel<KEY>) => filter.propertyName === propertyName) ?? {\n propertyName,\n operatorType: defaultOperator,\n value: '',\n }\n );\n}\n\n/**\n * Набор условий после смены значения колонки; `null` — приложению сообщать нечего.\n * Пустое значение снимает условие колонки, значение на колонке без условия добавляет его.\n */\nexport function dataTableFiltersWithValue<KEY extends string>(\n filters: ReadonlyArray<IFilterModel<KEY>>,\n current: IFilterModel<KEY>,\n value: TRtDataTableFilterValue\n): IFilterModel<KEY>[] | null {\n const hasCondition: boolean = filters.some((filter: IFilterModel<KEY>) => filter.propertyName === current.propertyName);\n\n if (hasCondition) {\n return value\n ? filters.map((filter: IFilterModel<KEY>) => (filter.propertyName === current.propertyName ? { ...filter, value } : filter))\n : filters.filter((filter: IFilterModel<KEY>) => filter.propertyName !== current.propertyName);\n }\n\n return value ? [...filters, { propertyName: current.propertyName, operatorType: current.operatorType, value }] : null;\n}\n\n/** Набор условий после смены вида сравнения; `null` — ни условия, ни значения, спрашивать нечего. */\nexport function dataTableFiltersWithOperator<KEY extends string>(\n filters: ReadonlyArray<IFilterModel<KEY>>,\n current: IFilterModel<KEY>,\n operatorType: TFilterOperatorType\n): IFilterModel<KEY>[] | null {\n const hasCondition: boolean = filters.some((filter: IFilterModel<KEY>) => filter.propertyName === current.propertyName);\n\n if (hasCondition) {\n return filters.map((filter: IFilterModel<KEY>) =>\n filter.propertyName === current.propertyName ? { ...filter, operatorType } : filter\n );\n }\n\n return current.value ? [...filters, { operatorType, propertyName: current.propertyName, value: current.value }] : null;\n}\n\n/**\n * День поля даты кита (`2025-01-01`) — в момент ISO, как отдавал первый кит: полночь дня по\n * местному времени. Пустая строка остаётся пустой — она снимает условие.\n */\nexport function dataTableDayToIso(day: string): string {\n const [year, month, date]: number[] = day.split('-').map(Number);\n const complete: boolean = [year, month, date].every((part: number | undefined) => !!part);\n\n return complete ? new Date(year, month - 1, date).toISOString() : '';\n}\n\n/** Обратно: момент условия — в день поля даты по местному времени; нераспознанное даёт пустое. */\nexport function dataTableIsoToDay(value: unknown): string {\n const moment: Date = new Date(typeof value === 'string' ? value : '');\n\n if (Number.isNaN(moment.getTime())) {\n return '';\n }\n\n const month: string = String(moment.getMonth() + 1).padStart(2, '0');\n const date: string = String(moment.getDate()).padStart(2, '0');\n\n return `${moment.getFullYear()}-${month}-${date}`;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n linkedSignal,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { TitleCasePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\nimport { EFilterOperatorType, IFilterModel, TFilterOperatorType, transformArrayInput } from '@rt-tools/utils';\n\nimport { RT_KIT_TRANSLATOR, rtKitLabel, TRtKitLabelKey, TRtKitTranslator } from '@rt-tools/ui-kit-v2/core';\nimport { RtDatePickerComponent } from '@rt-tools/ui-kit-v2/date-picker';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtInputNumberComponent } from '@rt-tools/ui-kit-v2/input-number';\nimport { RtInputComponent } from '@rt-tools/ui-kit-v2/input';\nimport { RtMenuItemComponent } from '@rt-tools/ui-kit-v2/menu';\nimport { RtMenuComponent } from '@rt-tools/ui-kit-v2/menu';\nimport { RtSelectComponent } from '@rt-tools/ui-kit-v2/select';\nimport { IRtSelect } from '@rt-tools/ui-kit-v2/select';\nimport { dataTableIconName } from '../rt-data-table-cell.logic';\nimport {\n DATA_TABLE_FILTER_MENU_OPERATORS,\n DATA_TABLE_FILTER_OPERATOR_GLYPHS,\n dataTableColumnFilter,\n dataTableDayToIso,\n dataTableDefaultOperator,\n dataTableFiltersWithOperator,\n dataTableFiltersWithValue,\n dataTableIsoToDay,\n TRtDataTableFilterValue,\n} from '../rt-data-table-filter.logic';\nimport { ERtDataTableFilterType, IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-data-table-filter-cell';\n\n/** Значок кнопки вида сравнения, которому первый кит значка не дал. */\nconst FALLBACK_OPERATOR_ICON: IRtIcon.Name = 'ellipsis-h';\n\nconst OPERATOR_LABELS: Readonly<Partial<Record<TFilterOperatorType, TRtKitLabelKey>>> = {\n [EFilterOperatorType.EQUALS]: 'dataTableFilterOperatorEquals',\n [EFilterOperatorType.NOT_EQUALS]: 'dataTableFilterOperatorNotEquals',\n [EFilterOperatorType.CONTAINS]: 'dataTableFilterOperatorContains',\n [EFilterOperatorType.GREATER_THAN]: 'dataTableFilterOperatorGreaterThan',\n [EFilterOperatorType.LESS_THAN]: 'dataTableFilterOperatorLessThan',\n};\n\n/** Одно и то же условие: колонка, вид сравнения и значение совпадают. */\nfunction sameFilter<KEY extends string>(a: IFilterModel<KEY>, b: IFilterModel<KEY>): boolean {\n return a.propertyName === b.propertyName && a.operatorType === b.operatorType && a.value === b.value;\n}\n\ninterface IOperatorItem {\n operator: TFilterOperatorType;\n icon: IRtIcon.Name;\n label: string;\n}\n\n/**\n * Ячейка строки отбора `rt-data-table` — ячейка отбора первого кита на полях кита.\n *\n * Своих условий у ячейки нет: она читает набор приложения и отдаёт ему новый при каждой смене.\n * Текст и число фиксируются по Enter и уходу с поля, дата — выбором дня, список — выбором пункта;\n * пустое значение снимает условие колонки. Кнопка вида сравнения предлагает остальные виды.\n */\n@Component({\n selector: 'rt-data-table-filter-cell',\n templateUrl: './rt-data-table-filter-cell.component.html',\n styleUrl: './rt-data-table-filter-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // components\n RtDatePickerComponent,\n RtIconButtonComponent,\n RtInputComponent,\n RtInputNumberComponent,\n RtMenuComponent,\n RtMenuItemComponent,\n RtSelectComponent,\n\n // directives\n BlockDirective,\n ElemDirective,\n FormsModule,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtDataTableFilterCellComponent<KEY extends string = string> {\n readonly #translate: Signal<TRtKitTranslator> = inject(RT_KIT_TRANSLATOR);\n readonly #titleCase: TitleCasePipe = new TitleCasePipe();\n\n /** Набранное, но ещё не зафиксированное значение текстового и числового поля. */\n #draft: TRtDataTableFilterValue | null = null;\n\n protected readonly filterTypes: typeof ERtDataTableFilterType = ERtDataTableFilterType;\n\n protected readonly valuePlaceholder: Signal<string> = rtKitLabel('dataTableFilterValuePlaceholder');\n protected readonly selectPlaceholder: Signal<string> = rtKitLabel('dataTableFilterSelectPlaceholder');\n protected readonly clearLabel: Signal<string> = rtKitLabel('dataTableFilterClear');\n\n /**\n * Условие своей колонки из набора приложения. Сверяется по содержимому: набор меняется целиком\n * и по чужой колонке, а своё условие при этом остаётся тем же — и выбранный здесь вид\n * сравнения пустой колонки сбрасывать нечем.\n */\n readonly #ownFilter: Signal<IFilterModel<KEY>> = computed(\n (): IFilterModel<KEY> =>\n dataTableColumnFilter(this.filterModel(), this.filterProperty(), dataTableDefaultOperator(this.defaultFilterOperator())),\n { equal: sameFilter }\n );\n\n /** Условие колонки: из набора приложения, а вид сравнения без условия помнит сама ячейка. */\n protected readonly currentFilter: WritableSignal<IFilterModel<KEY>> = linkedSignal((): IFilterModel<KEY> => this.#ownFilter());\n\n protected readonly hasValue: Signal<boolean> = computed(() => !!this.currentFilter().value);\n\n protected readonly day: Signal<string> = computed(() => dataTableIsoToDay(this.currentFilter().value));\n\n protected readonly number: Signal<number | null> = computed(() => {\n const value: number = Number(this.currentFilter().value);\n\n return this.currentFilter().value === '' || Number.isNaN(value) ? null : value;\n });\n\n protected readonly operatorIcon: Signal<IRtIcon.Name> = computed(() => this.#operatorIcon(this.currentFilter().operatorType));\n\n protected readonly operatorLabel: Signal<string> = computed(() =>\n this.#operatorLabel(this.#translate(), this.currentFilter().operatorType)\n );\n\n /**\n * Пункты меню — предложенные колонкой виды в порядке первого кита, кроме нынешнего: его первый кит\n * в меню не выводит, нынешний вид показывает кнопка.\n */\n protected readonly operatorItems: Signal<IOperatorItem[]> = computed(() => {\n const translate: TRtKitTranslator = this.#translate();\n const current: TFilterOperatorType = this.currentFilter().operatorType;\n\n return DATA_TABLE_FILTER_MENU_OPERATORS.filter(\n (operator: TFilterOperatorType) => operator !== current && this.filterOperators().includes(operator)\n ).map((operator: TFilterOperatorType) => ({\n operator,\n icon: this.#operatorIcon(operator),\n label: this.#operatorLabel(translate, operator),\n }));\n });\n\n protected readonly selectOptions: Signal<IRtSelect.Option<string>[]> = computed(() =>\n this.filterSelectOptions().map((option: string) => ({ label: this.#titleCase.transform(option), value: option }))\n );\n\n /** Колонка, по которой отбирает ячейка. */\n /** Вид полей отбора: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly filterProperty: InputSignal<KEY> = input.required<KEY>();\n public readonly filterType: InputSignal<IRtDataTable.FilterType> = input.required<IRtDataTable.FilterType>();\n\n /** Весь набор условий приложения. */\n public readonly filterModel: InputSignalWithTransform<IFilterModel<KEY>[], IFilterModel<KEY>[] | null | undefined> = input<\n IFilterModel<KEY>[],\n IFilterModel<KEY>[] | null | undefined\n >([], { transform: transformArrayInput });\n\n public readonly defaultFilterOperator: InputSignal<TFilterOperatorType | null | undefined> = input<\n TFilterOperatorType | null | undefined\n >(null);\n\n public readonly filterOperators: InputSignalWithTransform<TFilterOperatorType[], TFilterOperatorType[] | null | undefined> = input<\n TFilterOperatorType[],\n TFilterOperatorType[] | null | undefined\n >([], { transform: transformArrayInput });\n\n public readonly filterSelectOptions: InputSignalWithTransform<string[], string[] | null | undefined> = input<\n string[],\n string[] | null | undefined\n >([], { transform: transformArrayInput });\n\n public readonly filterChange: OutputEmitterRef<IFilterModel<KEY>[]> = output<IFilterModel<KEY>[]>();\n\n /** Набор в поле: пустое поле — это очистка, она фиксируется сразу, как у первого кита. */\n protected onDraft(value: TRtDataTableFilterValue | null): void {\n this.#draft = value ?? '';\n\n if (this.#draft === '') {\n this.onCommit();\n }\n }\n\n /** Enter и уход с поля фиксируют набранное. */\n protected onCommit(): void {\n if (this.#draft !== null) {\n this.onValueChange(this.#draft);\n this.#draft = null;\n }\n }\n\n protected onNumberDraft(value: number | null): void {\n this.onDraft(value === null ? '' : String(value));\n }\n\n protected onDayChange(day: string | null): void {\n this.onValueChange(dataTableDayToIso(day ?? ''));\n }\n\n protected onValueChange(value: TRtDataTableFilterValue | null): void {\n const next: TRtDataTableFilterValue = value ?? '';\n const current: IFilterModel<KEY> = this.currentFilter();\n\n if (next === current.value) {\n return;\n }\n\n const filters: IFilterModel<KEY>[] | null = dataTableFiltersWithValue(this.filterModel(), current, next);\n\n if (filters) {\n this.filterChange.emit(filters);\n }\n\n this.currentFilter.set({ ...current, value: next });\n }\n\n protected onOperatorChange(operatorType: TFilterOperatorType): void {\n const current: IFilterModel<KEY> = this.currentFilter();\n const filters: IFilterModel<KEY>[] | null = dataTableFiltersWithOperator(this.filterModel(), current, operatorType);\n\n if (filters) {\n this.filterChange.emit(filters);\n }\n\n this.currentFilter.set({ ...current, operatorType });\n }\n\n #operatorIcon(operator: TFilterOperatorType): IRtIcon.Name {\n const glyph: string | null = DATA_TABLE_FILTER_OPERATOR_GLYPHS[operator];\n\n return (glyph && dataTableIconName(glyph)) || FALLBACK_OPERATOR_ICON;\n }\n\n #operatorLabel(translate: TRtKitTranslator, operator: TFilterOperatorType): string {\n const key: TRtKitLabelKey | undefined = OPERATOR_LABELS[operator];\n\n return key ? translate(key) : this.#titleCase.transform(operator);\n }\n}\n","<ng-container rtBlock=\"rt-data-table-filter-cell\">\n @if (filterOperators().length) {\n <rt-menu qa-dataid=\"data-table-filter-operator\" align=\"start\" [icon]=\"operatorIcon()\" [ariaLabel]=\"operatorLabel()\">\n @for (item of operatorItems(); track item.operator) {\n <rt-menu-item\n qa-dataid=\"data-table-filter-operator-item\"\n [icon]=\"item.icon\"\n [label]=\"item.label\"\n (selected)=\"onOperatorChange(item.operator)\" />\n }\n </rt-menu>\n }\n\n @switch (filterType()) {\n @case (filterTypes.TEXT) {\n <rt-input\n rtElem=\"field\"\n qa-dataid=\"data-table-filter-input\"\n size=\"sm\"\n [appearance]=\"appearance()\"\n [placeholder]=\"valuePlaceholder()\"\n [ngModel]=\"currentFilter().value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onDraft($event)\"\n (keydown.enter)=\"onCommit()\"\n (focusout)=\"onCommit()\" />\n }\n @case (filterTypes.NUMBER) {\n <rt-input-number\n rtElem=\"field\"\n qa-dataid=\"data-table-filter-number\"\n size=\"sm\"\n [appearance]=\"appearance()\"\n [placeholder]=\"valuePlaceholder()\"\n [ngModel]=\"number()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onNumberDraft($event)\"\n (keydown.enter)=\"onCommit()\"\n (focusout)=\"onCommit()\" />\n }\n @case (filterTypes.DATE) {\n <rt-icon-button\n qa-dataid=\"data-table-filter-clear\"\n icon=\"close\"\n [ariaLabel]=\"clearLabel()\"\n [tooltip]=\"clearLabel()\"\n [disabled]=\"!hasValue()\"\n (clicked)=\"onValueChange('')\" />\n\n <rt-date-picker\n rtElem=\"field\"\n qa-dataid=\"data-table-filter-date\"\n size=\"sm\"\n [appearance]=\"appearance()\"\n [clearable]=\"false\"\n [ngModel]=\"day()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onDayChange($event)\" />\n }\n @case (filterTypes.SELECT) {\n <rt-icon-button\n qa-dataid=\"data-table-filter-clear\"\n icon=\"close\"\n [ariaLabel]=\"clearLabel()\"\n [tooltip]=\"clearLabel()\"\n [disabled]=\"!hasValue()\"\n (clicked)=\"onValueChange('')\" />\n\n <rt-select\n rtElem=\"field\"\n qa-dataid=\"data-table-filter-select\"\n size=\"sm\"\n [appearance]=\"appearance()\"\n [clearable]=\"false\"\n [options]=\"selectOptions()\"\n [placeholder]=\"selectPlaceholder()\"\n [ngModel]=\"currentFilter().value || null\"\n [ngModelOptions]=\"{ standalone: true }\"\n (selectionChange)=\"onValueChange($event)\" />\n }\n }\n</ng-container>\n","import { Directive, input, InputSignal, TemplateRef } from '@angular/core';\n\n/** Что получает шаблон приложения, рисующий строку целиком или её часть. */\nexport interface IRtDataTableRowContext<ENTITY_TYPE> {\n $implicit: ENTITY_TYPE;\n}\n\n/**\n * Шаблоны пользовательских ячеек: имя свойства колонки — шаблон её ячейки.\n *\n * Колонку типа «custom» таблица рисует этим шаблоном и готовой ячейки не берёт.\n */\n@Directive({\n selector: '[rtDataTableCustomCells]',\n})\nexport class RtDataTableCustomCellsDirective<ENTITY_TYPE> {\n public readonly cellsTemplates: InputSignal<{\n [K in keyof ENTITY_TYPE]?: TemplateRef<IRtDataTableRowContext<ENTITY_TYPE>>;\n }> = input.required({ alias: 'rtDataTableCustomCells' });\n\n public getTemplateByPropName(propName: keyof ENTITY_TYPE): TemplateRef<IRtDataTableRowContext<ENTITY_TYPE>> | null {\n return this.cellsTemplates()[propName] ?? null;\n }\n}\n\n/** Пункты меню строки: шаблон раскрывается в панели меню кита. */\n@Directive({\n selector: '[rtDataTableRowActions]',\n})\nexport class RtDataTableRowActionsDirective {}\n\n/** Действия строки рядом с кнопкой меню: шаблон рисуется в полосе действий. */\n@Directive({\n selector: '[rtDataTableAdditionalRowActions]',\n})\nexport class RtDataTableAdditionalRowActionsDirective {}\n","/** Ключи записей списка. */\nexport function dataTableKeysOf<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n entities: ReadonlyArray<ENTITY_TYPE>,\n keyExp: KEY\n): Array<ENTITY_TYPE[KEY]> {\n return entities.map((entity: ENTITY_TYPE) => entity[keyExp]);\n}\n\n/** Записи страницы, добавленные к отмеченным; повторов не будет. */\nexport function dataTableWithPageEntities<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n selected: ReadonlyArray<ENTITY_TYPE>,\n page: ReadonlyArray<ENTITY_TYPE>,\n keyExp: KEY\n): ENTITY_TYPE[] {\n const keys: Array<ENTITY_TYPE[KEY]> = dataTableKeysOf(selected, keyExp);\n\n return [...selected, ...page.filter((entity: ENTITY_TYPE) => !keys.includes(entity[keyExp]))];\n}\n\n/** Отмеченные без записей страницы. */\nexport function dataTableWithoutPageEntities<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n selected: ReadonlyArray<ENTITY_TYPE>,\n page: ReadonlyArray<ENTITY_TYPE>,\n keyExp: KEY\n): ENTITY_TYPE[] {\n const keys: Array<ENTITY_TYPE[KEY]> = dataTableKeysOf(page, keyExp);\n\n return selected.filter((entity: ENTITY_TYPE) => !keys.includes(entity[keyExp]));\n}\n\n/** Отмеченные после отметки или снятия одной записи. */\nexport function dataTableWithEntity<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n selected: ReadonlyArray<ENTITY_TYPE>,\n entity: ENTITY_TYPE,\n checked: boolean,\n keyExp: KEY\n): ENTITY_TYPE[] {\n const without: ENTITY_TYPE[] = selected.filter((el: ENTITY_TYPE) => el[keyExp] !== entity[keyExp]);\n\n return checked ? [...without, entity] : without;\n}\n\n/** Хоть одна запись страницы отмечена. */\nexport function dataTableAnyOnPage<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n page: ReadonlyArray<ENTITY_TYPE>,\n selectedKeys: ReadonlyArray<ENTITY_TYPE[KEY]>,\n keyExp: KEY\n): boolean {\n return page.some((entity: ENTITY_TYPE) => selectedKeys.includes(entity[keyExp]));\n}\n\n/** Отмечены все записи страницы; пустая страница у первого кита считается отмеченной целиком. */\nexport function dataTableAllOnPage<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n page: ReadonlyArray<ENTITY_TYPE>,\n selectedKeys: ReadonlyArray<ENTITY_TYPE[KEY]>,\n keyExp: KEY\n): boolean {\n return page.every((entity: ENTITY_TYPE) => selectedKeys.includes(entity[keyExp]));\n}\n\n/** Записи первой страницы, чьи ключи названы приложением как отмеченные заранее. */\nexport function dataTablePresetEntities<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n entities: ReadonlyArray<ENTITY_TYPE>,\n keys: ReadonlyArray<ENTITY_TYPE[KEY]>,\n keyExp: KEY\n): ENTITY_TYPE[] {\n return entities.filter((entity: ENTITY_TYPE) => keys.includes(entity[keyExp]));\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewChecked,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n forwardRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { EFilterOperatorType, ISortModel, TNullable, transformArrayInput } from '@rt-tools/utils';\n\nimport { IRtKitConfig } from '@rt-tools/ui-kit-v2/core';\nimport { rtKitDefault } from '@rt-tools/ui-kit-v2/core';\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\nimport { RtCheckboxComponent } from '@rt-tools/ui-kit-v2/checkbox';\nimport { RtMenuComponent } from '@rt-tools/ui-kit-v2/menu';\nimport { RtRadioButtonComponent } from '@rt-tools/ui-kit-v2/radio-button';\nimport { RtDataTableCellComponent } from './cell/rt-data-table-cell.component';\nimport { RtDataTableFilterCellComponent } from './filter-cell/rt-data-table-filter-cell.component';\nimport { RtDataTableHeaderCellComponent } from './header-cell/rt-data-table-header-cell.component';\nimport {\n IRtDataTableRowContext,\n RtDataTableAdditionalRowActionsDirective,\n RtDataTableCustomCellsDirective,\n RtDataTableRowActionsDirective,\n} from './rt-data-table-cells.directive';\nimport { RtDataTableConfigService } from './rt-data-table-config.service';\nimport { RtDataTableIconDirective } from './rt-data-table-icon.directive';\nimport { dataTableAriaSort, TRtDataTableAriaSort } from './rt-data-table-sort.logic';\nimport { RT_DATA_TABLE_ROW_HOST, RtDataTableRowClickDirective } from './rt-data-table-row-click.directive';\nimport {\n ERtDataTableColumnType,\n IRtDataTable,\n RT_DATA_TABLE_PRESET_FROM_HOST,\n RT_PRESET_MATERIAL_CLASS,\n TRtDataTableFilters,\n} from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-data-table';\n\n/**\n * Таблица записей первого кита во втором — без Material.\n *\n * Колонки берутся у службы настроек, строки приходят входом. Таблица рисует шапку, строку\n * отбора, готовые или пользовательские ячейки, колонку выбора флажком либо радиокнопкой и полосу\n * действий в конце строки. Своего отбора и своего порядка она не ведёт: обо всём просит\n * приложение. Отметками строк занимается директива выбора — она ставит их сюда.\n */\n@Component({\n selector: 'rt-data-table',\n templateUrl: './rt-data-table.component.html',\n styleUrl: './rt-data-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // components\n RtCheckboxComponent,\n RtDataTableCellComponent,\n RtDataTableFilterCellComponent,\n RtDataTableHeaderCellComponent,\n RtMenuComponent,\n RtRadioButtonComponent,\n\n // directives\n BlockDirective,\n ElemDirective,\n FormsModule,\n ModDirective,\n NgTemplateOutlet,\n RtDataTableRowClickDirective,\n ],\n host: { class: BEM_BLOCK, '[class.rt-preset-material]': \"look() === 'material' && !presetFromHost\" },\n providers: [{ provide: RT_DATA_TABLE_ROW_HOST, useExisting: forwardRef(() => RtDataTableComponent) }],\n})\nexport class RtDataTableComponent<\n ENTITY_TYPE extends Record<string, unknown>,\n SORT_PROPERTY extends Extract<keyof ENTITY_TYPE, string>,\n KEY extends Extract<keyof ENTITY_TYPE, string>,\n> implements AfterViewChecked {\n readonly #configService: RtDataTableConfigService<ENTITY_TYPE> = inject(RtDataTableConfigService);\n\n /* Вид считается из настроек при объявлении входа: вход в разметке по-прежнему перебивает всё. */\n readonly #look: IRtDataTable.Look = rtKitDefault(\n 'dataTable',\n (it: IRtKitConfig.DataTable): IRtDataTable.Look | undefined => it.look,\n 'material'\n );\n\n /** Полоса действий и две ячейки, которым она отдаёт свою ширину, — приём первого кита. */\n protected readonly rowActionsRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('rowActions');\n protected readonly headerSpacerRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('headerSpacer');\n protected readonly rowSpacerRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('rowSpacer');\n\n protected readonly columnTypes: typeof ERtDataTableColumnType = ERtDataTableColumnType;\n\n /** Набор даёт узел вокруг — список; тогда класс набора на самой таблице не ставится. */\n protected readonly presetFromHost: boolean = inject(RT_DATA_TABLE_PRESET_FROM_HOST, { optional: true }) ?? false;\n\n /** Классы меню строки: оно открывается поверх страницы и вид семьи получает от неё. */\n protected readonly menuPanelClass: Signal<string[]> = computed(() => (this.look() === 'material' ? [RT_PRESET_MATERIAL_CLASS] : []));\n\n protected readonly actionsLabel: Signal<string> = rtKitLabel('dataTableActions');\n protected readonly selectRowLabel: Signal<string> = rtKitLabel('dataTableSelectRow');\n protected readonly selectPageLabel: Signal<string> = rtKitLabel('dataTableSelectPage');\n\n /** Полоса действий рисуется, когда приложение дало меню строки или действия рядом с ним. */\n protected readonly hasRowActions: Signal<boolean> = computed(() => !!this.rowActionsTpl() || !!this.additionalRowActionsTpl());\n\n protected readonly visibleColumns: Signal<Array<IRtDataTable.Column<ENTITY_TYPE>>> = computed(() =>\n this.columns().filter((column: IRtDataTable.Column<ENTITY_TYPE>) => !column.hidden)\n );\n\n /** `aria-sort` каждой показанной колонки по её имени: шаблон читает готовое, а не зовёт расчёт. */\n protected readonly ariaSorts: Signal<Readonly<Record<string, TRtDataTableAriaSort | null>>> = computed(() =>\n Object.fromEntries(\n this.visibleColumns().map((column: IRtDataTable.Column<ENTITY_TYPE>): [string, TRtDataTableAriaSort | null] => [\n column.propName,\n dataTableAriaSort(column.sorting, this.currentSortModel()),\n ])\n )\n );\n\n /** Колонки — из службы настроек: их порядок и видимость помнит она. */\n /** Вид полей отбора: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n /**\n * Вид семьи. Материальный набор стоит на самом узле, а не на странице: семья выглядит как первый\n * кит, где бы её ни поставили, и соседи на странице своего вида не теряют.\n */\n public readonly look: InputSignal<IRtDataTable.Look> = input<IRtDataTable.Look>(this.#look);\n\n public readonly filterAppearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly columns: Signal<Array<IRtDataTable.Column<ENTITY_TYPE>>> = computed(() => this.#configService.tableConfig().columns);\n\n public readonly isTableRowsClickable: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n /** Свойство, которым записи отличаются друг от друга. */\n public readonly keyExp: InputSignal<NonNullable<KEY>> = input('id' as NonNullable<KEY>);\n\n public readonly entities: InputSignalWithTransform<ENTITY_TYPE[], ENTITY_TYPE[] | null | undefined> = input.required<\n ENTITY_TYPE[],\n ENTITY_TYPE[] | null | undefined\n >({ transform: transformArrayInput });\n\n public readonly currentSortModel: InputSignal<TNullable<ISortModel<SORT_PROPERTY>>> =\n input.required<TNullable<ISortModel<SORT_PROPERTY>>>();\n\n /**\n * Условия отбора. Их ключ — имя свойства колонки, а не ключ записи: отбирают по колонке, и\n * ключ записи здесь оказался бы уже нужного — строка отбора зовёт ячейку именем колонки.\n */\n public readonly filterModel: InputSignalWithTransform<TRtDataTableFilters<ENTITY_TYPE>, TNullable<TRtDataTableFilters<ENTITY_TYPE>>> =\n input<TRtDataTableFilters<ENTITY_TYPE>, TNullable<TRtDataTableFilters<ENTITY_TYPE>>>([], { transform: transformArrayInput });\n\n public readonly isFiltersShown: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n public readonly rowClick: OutputEmitterRef<{ row: ENTITY_TYPE; event: MouseEvent }> = output<{ row: ENTITY_TYPE; event: MouseEvent }>();\n public readonly rowDoubleClick: OutputEmitterRef<ENTITY_TYPE> = output<ENTITY_TYPE>();\n public readonly sortChange: OutputEmitterRef<ISortModel<SORT_PROPERTY>> = output<ISortModel<SORT_PROPERTY>>();\n public readonly filterChange: OutputEmitterRef<TRtDataTableFilters<ENTITY_TYPE>> = output<TRtDataTableFilters<ENTITY_TYPE>>();\n\n public readonly customCellsTpl: Signal<TNullable<RtDataTableCustomCellsDirective<ENTITY_TYPE>>> =\n contentChild(RtDataTableCustomCellsDirective);\n\n public readonly rowActionsTpl: Signal<TNullable<TemplateRef<IRtDataTableRowContext<ENTITY_TYPE>>>> = contentChild(\n RtDataTableRowActionsDirective,\n { read: TemplateRef }\n );\n\n public readonly additionalRowActionsTpl: Signal<TNullable<TemplateRef<IRtDataTableRowContext<ENTITY_TYPE>>>> = contentChild(\n RtDataTableAdditionalRowActionsDirective,\n { read: TemplateRef }\n );\n\n /** Шаблон значка приложения: его получают и шапка, и готовая ячейка. */\n public readonly iconTpl: Signal<TNullable<RtDataTableIconDirective<ENTITY_TYPE>>> = contentChild(RtDataTableIconDirective);\n\n /** Ключи отмеченных записей; их ставит директива выбора. */\n public readonly selectedEntitiesIds: WritableSignal<ENTITY_TYPE[KEY][]> = signal([]);\n public readonly isPageEntitiesSelected: WritableSignal<boolean> = signal(false);\n public readonly isPageEntitiesIndeterminate: WritableSignal<boolean> = signal(false);\n public readonly isMultiSelect: WritableSignal<boolean> = signal(true);\n public readonly isSelectorsColumnShown: WritableSignal<boolean> = signal(false);\n public readonly isSelectorsColumnDisabled: WritableSignal<boolean> = signal(false);\n\n /** Строка с открытым меню; у первого кита она подсвечена, пока меню открыто. */\n public readonly activeRowIndex: WritableSignal<TNullable<number>> = signal(null);\n\n /** Отметить запись; метод ставит директива выбора, без неё колонки выбора нет вовсе. */\n public onToggleEntity: (entity: ENTITY_TYPE, checked: boolean) => void = (): void => undefined;\n\n /** Отметить все строки показанной страницы; метод ставит директива выбора. */\n public onTogglePageEntities: (checked: boolean) => void = (): void => undefined;\n\n public ngAfterViewChecked(): void {\n this.#syncSpacerWidth();\n }\n\n /**\n * Имя колонки приходит строкой, а наружу уходит ключом домена: приведение сверяется с тем же\n * набором колонок, который рисует таблица. Несовпавшее не отдаётся вовсе — приём первого кита.\n */\n public onSortChange(sortModel: ISortModel<string>): void {\n const names: string[] = this.columns().map((column: IRtDataTable.Column<ENTITY_TYPE>) => String(column.propName));\n\n if (names.includes(sortModel.propertyName)) {\n this.sortChange.emit({ ...sortModel, propertyName: sortModel.propertyName as SORT_PROPERTY });\n }\n }\n\n public onFilterChange(filterModel: TRtDataTableFilters<ENTITY_TYPE>): void {\n this.filterChange.emit(filterModel);\n }\n\n public onRowClick(row: ENTITY_TYPE, event: MouseEvent): void {\n this.rowClick.emit({ row, event });\n }\n\n public onRowDoubleClick(row: ENTITY_TYPE): void {\n this.rowDoubleClick.emit(row);\n }\n\n protected onMenuOpenedChange(index: number, opened: boolean): void {\n this.activeRowIndex.set(opened ? index : null);\n }\n\n protected defaultOperator(column: IRtDataTable.Column<ENTITY_TYPE>): IRtDataTable.Column<ENTITY_TYPE>['defaultFilterOperator'] {\n return column.defaultFilterOperator ?? EFilterOperatorType.EQUALS;\n }\n\n /**\n * Полоса действий висит над концом строки, и место под неё держат две пустые ячейки — в\n * шапке и в строке. Ширину им таблица ставит по ширине самой полосы, как первый кит.\n */\n #syncSpacerWidth(): void {\n const strip: TNullable<HTMLElement> = this.rowActionsRef()?.nativeElement;\n\n if (!strip) {\n return;\n }\n\n const width: string = `${strip.offsetWidth}px`;\n\n [this.headerSpacerRef()?.nativeElement, this.rowSpacerRef()?.nativeElement].forEach((spacer: TNullable<HTMLElement>) => {\n if (spacer && spacer.style.width !== width) {\n spacer.style.width = width;\n }\n });\n }\n}\n","<ng-container rtBlock=\"rt-data-table\">\n <table rtElem=\"table\">\n <thead rtElem=\"head\">\n <tr>\n @if (isSelectorsColumnShown()) {\n <th rtElem=\"cell\" [rtMod]=\"{ head: true, selectable: true }\">\n @if (isMultiSelect()) {\n <rt-checkbox\n qa-dataid=\"data-table-page-checkbox\"\n [ariaLabel]=\"selectPageLabel()\"\n [disabled]=\"isSelectorsColumnDisabled()\"\n [indeterminate]=\"isPageEntitiesIndeterminate() && !isPageEntitiesSelected()\"\n [ngModel]=\"isPageEntitiesSelected()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onTogglePageEntities($event)\" />\n }\n </th>\n }\n\n @for (column of visibleColumns(); track column.propName) {\n <th\n rtElem=\"cell\"\n qa-dataid=\"data-table-header-cell\"\n [attr.aria-sort]=\"ariaSorts()[column.propName]\"\n [rtMod]=\"{ head: true, sortable: !!column.sorting }\">\n <rt-data-table-header-cell\n [headerModel]=\"column.header\"\n [sortModel]=\"column.sorting\"\n [currentSortModel]=\"currentSortModel()\"\n [column]=\"column\"\n [iconTemplate]=\"iconTpl()?.template ?? null\"\n (sortChange)=\"onSortChange($event)\" />\n </th>\n }\n\n @if (hasRowActions()) {\n <th #headerSpacer rtElem=\"cell\" qa-dataid=\"data-table-actions-header\" [rtMod]=\"{ head: true }\">{{ actionsLabel() }}</th>\n }\n </tr>\n\n @if (isFiltersShown()) {\n <tr qa-dataid=\"data-table-filter-row\">\n @if (isSelectorsColumnShown()) {\n <th rtElem=\"cell\" [rtMod]=\"{ head: true, filterable: true, empty: true }\"></th>\n }\n\n @for (column of visibleColumns(); track column.propName) {\n <th rtElem=\"cell\" [rtMod]=\"{ head: true, filterable: true }\">\n @if (column.filterType; as filterType) {\n <rt-data-table-filter-cell\n [filterProperty]=\"column.propName\"\n [filterType]=\"filterType\"\n [filterModel]=\"filterModel()\"\n [defaultFilterOperator]=\"column.defaultFilterOperator\"\n [filterOperators]=\"column.filterOperators\"\n [filterSelectOptions]=\"column.filterSelectOptions\"\n [appearance]=\"filterAppearance()\"\n (filterChange)=\"onFilterChange($event)\" />\n }\n </th>\n }\n\n @if (hasRowActions()) {\n <th rtElem=\"cell\" [rtMod]=\"{ head: true, filterable: true }\"></th>\n }\n </tr>\n }\n </thead>\n\n <tbody>\n @for (row of entities(); track row[keyExp()]; let index = $index) {\n <tr\n rtElem=\"row\"\n qa-dataid=\"data-table-row\"\n [rtDataTableRowClick]=\"row\"\n [isTableRowClickable]=\"isTableRowsClickable()\"\n [rtMod]=\"{ clickable: isTableRowsClickable(), active: activeRowIndex() === index }\">\n @if (isSelectorsColumnShown()) {\n <td rtElem=\"cell\" [rtMod]=\"{ selectable: true }\" [attr.rt-data-table-stop-row-click]=\"''\">\n @if (isMultiSelect()) {\n <rt-checkbox\n qa-dataid=\"data-table-row-checkbox\"\n [ariaLabel]=\"selectRowLabel()\"\n [disabled]=\"isSelectorsColumnDisabled()\"\n [ngModel]=\"selectedEntitiesIds().includes(row[keyExp()])\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onToggleEntity(row, $event)\" />\n } @else {\n <rt-radio-button\n qa-dataid=\"data-table-row-radio\"\n [value]=\"row[keyExp()]\"\n [ariaLabel]=\"selectRowLabel()\"\n [disabled]=\"isSelectorsColumnDisabled()\"\n [checked]=\"selectedEntitiesIds().includes(row[keyExp()])\"\n (checkedChange)=\"onToggleEntity(row, true)\" />\n }\n </td>\n }\n\n @for (column of visibleColumns(); track column.propName) {\n <td rtElem=\"cell\" qa-dataid=\"data-table-cell\" [rtMod]=\"{ copyable: !!column.copyable }\">\n @if (column.type === columnTypes.CUSTOM) {\n <ng-container\n [ngTemplateOutlet]=\"customCellsTpl()?.getTemplateByPropName(column.propName) ?? null\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n } @else {\n <rt-data-table-cell [row]=\"row\" [column]=\"column\" [iconTemplate]=\"iconTpl()?.template ?? null\" />\n }\n </td>\n }\n\n @if (hasRowActions()) {\n <td #rowSpacer rtElem=\"cell\" [rtMod]=\"{ spacer: true }\"></td>\n\n <div rtBlock=\"rt-data-table-actions\" [rtMod]=\"{ hidden: activeRowIndex() !== index }\">\n <div #rowActions rtElem=\"container\" qa-dataid=\"data-table-actions\">\n @if (additionalRowActionsTpl(); as additional) {\n <ng-container [ngTemplateOutlet]=\"additional\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n }\n\n @if (rowActionsTpl(); as actions) {\n <rt-menu\n rtElem=\"action\"\n qa-dataid=\"data-table-row-menu\"\n icon=\"ellipsis-v\"\n size=\"sm\"\n [panelClass]=\"menuPanelClass()\"\n [attr.rt-data-table-stop-row-click]=\"''\"\n [ariaLabel]=\"actionsLabel()\"\n (openedChange)=\"onMenuOpenedChange(index, $event)\">\n <ng-container [ngTemplateOutlet]=\"actions\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n }\n </div>\n </div>\n }\n </tr>\n }\n </tbody>\n </table>\n</ng-container>\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n effect,\n inject,\n Injector,\n input,\n InputSignalWithTransform,\n OnInit,\n Signal,\n signal,\n untracked,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { filter, switchMap, take } from 'rxjs/operators';\n\nimport { transformArrayInput } from '@rt-tools/utils';\n\nimport { RtDataTableComponent } from './rt-data-table.component';\nimport {\n dataTableAllOnPage,\n dataTableAnyOnPage,\n dataTableKeysOf,\n dataTablePresetEntities,\n dataTableWithEntity,\n dataTableWithoutPageEntities,\n dataTableWithPageEntities,\n} from './rt-data-table-selection.logic';\n\n/**\n * Выбор строк таблицы `rt-data-table` — колонка выбора первого кита.\n *\n * Директива ведёт отметки и ставит таблице всё, что та рисует: ключи отмеченных, состояние\n * флажка страницы и признаки колонки выбора. Приложение читает отмеченные записи целиком —\n * запись, отмеченная на странице, которой уже нет на экране, остаётся отмеченной.\n */\n@Directive({\n selector: 'rt-data-table[rtDataTableSelectors]',\n})\nexport class RtDataTableSelectorsDirective<\n ENTITY_TYPE extends Record<string, unknown>,\n SORT_PROPERTY extends Extract<keyof ENTITY_TYPE, string>,\n KEY extends Extract<keyof ENTITY_TYPE, string>,\n> implements OnInit {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #injector: Injector = inject(Injector);\n readonly #table: RtDataTableComponent<ENTITY_TYPE, SORT_PROPERTY, KEY> =\n inject<RtDataTableComponent<ENTITY_TYPE, SORT_PROPERTY, KEY>>(RtDataTableComponent);\n\n readonly #selectedEntities: WritableSignal<ENTITY_TYPE[]> = signal([]);\n readonly #isPageEntitiesSelected: WritableSignal<boolean> = signal(false);\n readonly #isPageEntitiesIndeterminate: WritableSignal<boolean> = signal(false);\n\n public readonly isMultiSelect: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(true, {\n transform: booleanAttribute,\n });\n\n public readonly isSelectorColumnShown: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n public readonly isSelectorsColumnDisabled: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n /** Ключи записей, отмеченных заранее; они применяются один раз — к первым пришедшим строкам. */\n public readonly selectedEntitiesKeys: InputSignalWithTransform<ENTITY_TYPE[KEY][], ENTITY_TYPE[KEY][] | null | undefined> = input<\n ENTITY_TYPE[KEY][],\n ENTITY_TYPE[KEY][] | null | undefined\n >([], { transform: transformArrayInput });\n\n /** Отмеченные записи целиком. */\n public readonly selectedEntities: Signal<ENTITY_TYPE[]> = this.#selectedEntities.asReadonly();\n\n public readonly selectedEntitiesIds: Signal<ENTITY_TYPE[KEY][]> = computed(() =>\n dataTableKeysOf(this.selectedEntities(), this.#keyExp())\n );\n\n public readonly isPageEntitiesSelected: Signal<boolean> = this.#isPageEntitiesSelected.asReadonly();\n public readonly isPageEntitiesIndeterminate: Signal<boolean> = this.#isPageEntitiesIndeterminate.asReadonly();\n\n constructor() {\n this.#table.onToggleEntity = (entity: ENTITY_TYPE, checked: boolean): void => this.toggleEntity(entity, checked);\n this.#table.onTogglePageEntities = (checked: boolean): void => this.togglePageEntities(checked);\n\n /* Отметки ведёт директива, а рисует их таблица: каждое значение переливается в её поле.\n Обратного хода нет — таблица сама их не меняет. */\n effect(() => this.#table.selectedEntitiesIds.set(this.selectedEntitiesIds()));\n effect(() => this.#table.isPageEntitiesSelected.set(this.isPageEntitiesSelected()));\n effect(() => this.#table.isPageEntitiesIndeterminate.set(this.isPageEntitiesIndeterminate()));\n effect(() => this.#table.isMultiSelect.set(this.isMultiSelect()));\n effect(() => this.#table.isSelectorsColumnShown.set(this.isSelectorColumnShown()));\n effect(() => this.#table.isSelectorsColumnDisabled.set(this.isSelectorsColumnDisabled()));\n\n /* Новая страница — новый флажок страницы: он считается по её строкам, а не остаётся от\n прежней. Отметки читаются без слежки — пересчёт идёт только на смену строк. */\n effect(() => {\n this.#table.entities();\n untracked(() => this.setExistingEntitiesState());\n });\n }\n\n public ngOnInit(): void {\n /** Отметки, названные заранее, ставятся один раз: к первым непустым строкам. */\n toObservable(this.#table.entities, { injector: this.#injector })\n .pipe(\n filter((entities: ENTITY_TYPE[]) => !!entities.length),\n take(1),\n switchMap(() =>\n toObservable(this.selectedEntitiesKeys, { injector: this.#injector }).pipe(\n filter((keys: ENTITY_TYPE[KEY][]) => !!keys.length),\n take(1)\n )\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe(() => {\n this.#selectedEntities.set(dataTablePresetEntities(this.#table.entities(), this.selectedEntitiesKeys(), this.#keyExp()));\n this.setExistingEntitiesState();\n });\n }\n\n /** Отметить или снять все строки показанной страницы; других отметок это не трогает. */\n public togglePageEntities(checked: boolean): void {\n const page: ENTITY_TYPE[] = this.#table.entities();\n\n this.#isPageEntitiesSelected.set(checked);\n this.#selectedEntities.update((selected: ENTITY_TYPE[]) =>\n checked\n ? dataTableWithPageEntities(selected, page, this.#keyExp())\n : dataTableWithoutPageEntities(selected, page, this.#keyExp())\n );\n this.#isPageEntitiesIndeterminate.set(dataTableAnyOnPage(page, this.selectedEntitiesIds(), this.#keyExp()));\n }\n\n /** Отметить или снять одну запись; при выборе по одной прежняя отметка уходит. */\n public toggleEntity(entity: ENTITY_TYPE, checked: boolean): void {\n if (!this.isMultiSelect()) {\n this.#selectedEntities.set([entity]);\n\n return;\n }\n\n this.#selectedEntities.update((selected: ENTITY_TYPE[]) => dataTableWithEntity(selected, entity, checked, this.#keyExp()));\n\n const page: ENTITY_TYPE[] = this.#table.entities();\n const keys: ENTITY_TYPE[KEY][] = this.selectedEntitiesIds();\n\n if (keys.length) {\n this.#isPageEntitiesSelected.set(dataTableAllOnPage(page, keys, this.#keyExp()));\n this.#isPageEntitiesIndeterminate.set(true);\n } else {\n this.#isPageEntitiesSelected.set(false);\n this.#isPageEntitiesIndeterminate.set(dataTableAnyOnPage(page, keys, this.#keyExp()));\n }\n }\n\n /** Снять все отметки. */\n public clearSelectedList(): void {\n this.#selectedEntities.set([]);\n this.#isPageEntitiesSelected.set(false);\n this.#isPageEntitiesIndeterminate.set(false);\n }\n\n /**\n * Пересчитать флажок страницы по показанным строкам: отмечен, когда отмечены все строки\n * страницы, промежуточен, когда отмечена часть. Отметки других страниц здесь не в счёт.\n */\n public setExistingEntitiesState(): void {\n const page: ENTITY_TYPE[] = this.#table.entities();\n const keys: ENTITY_TYPE[KEY][] = this.selectedEntitiesIds();\n\n const all: boolean = !!page.length && dataTableAllOnPage(page, keys, this.#keyExp());\n\n this.#isPageEntitiesSelected.set(all);\n this.#isPageEntitiesIndeterminate.set(!all && dataTableAnyOnPage(page, keys, this.#keyExp()));\n }\n\n #keyExp(): KEY {\n return this.#table.keyExp();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["BEM_BLOCK"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-data-table.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-cell.logic.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-config.service.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-icon.directive.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-row-click.directive.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/cell/rt-data-table-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/cell/rt-data-table-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-sort.logic.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/header-cell/rt-data-table-header-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/header-cell/rt-data-table-header-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-filter.logic.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/filter-cell/rt-data-table-filter-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-cells.directive.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-selection.logic.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table.component.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table.component.html","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-data-table-selectors.directive.ts","../../../projects/ui-kit-v2/src/lib/components/data-table/rt-tools-ui-kit-v2-data-table.ts"],"sourcesContent":["import { isNumber, isString, TNullable } from '@rt-tools/utils';\n\nimport { iconMaterialMap, IRtIconMaterialEntry } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\n/** Значение ячейки: как его отдала запись или как его переделала колонка. */\nexport function dataTableCellValue<T>(row: T, column: IRtDataTable.Column<T>): T[keyof T] | string | number {\n const transform: TNullable<(value: T[keyof T]) => string | number> = column.transform;\n const raw: T[keyof T] = row[column.propName];\n\n return transform ? transform(raw) : raw;\n}\n\n/** Текст значения для подсказки и буфера — так же, как первый кит: строка, число, иначе JSON. */\nexport function dataTableCellText(value: unknown): string {\n if (isString(value)) {\n return value;\n }\n\n if (isNumber(value)) {\n return value.toString();\n }\n\n return JSON.stringify(value);\n}\n\n/**\n * Сторона кнопки копирования: заданная колонкой, иначе противоположная выравниванию значения —\n * справа выровненное значение копируется кнопкой слева.\n */\nexport function dataTableCopyButtonSide(column: IRtDataTable.Column<unknown>): 'left' | 'right' {\n return column.copyBtnAlign ?? (column.align === 'right' ? 'left' : 'right');\n}\n\n/**\n * Значок набора кита для имени первого кита, либо `null`, если пары нет.\n *\n * Идёт через перечень соответствий кита, а не своим списком: второй список разошёлся бы с\n * перечнем молча, и одно имя рисовалось бы в двух местах двумя рисунками.\n */\nexport function dataTableIconName(glyph: string): IRtIcon.Name | null {\n return iconMaterialMap.find((entry: IRtIconMaterialEntry) => entry.from === glyph)?.to ?? null;\n}\n","import { DestroyRef, Injectable, Signal, WritableSignal, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { Observable, Subject } from 'rxjs';\nimport { concatMap, map, switchMap, take, takeUntil } from 'rxjs/operators';\n\nimport { IDBStorageService } from '@rt-tools/core';\nimport { areArraysEqual, TNullable } from '@rt-tools/utils';\n\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\n/** Настройка, как её держит хранилище: столбцы там лежат частичными. Форма — первого кита. */\ninterface IStoredConfig<ENTITY_TYPE> {\n isVerticalScrollbarShown: boolean;\n isHorizontalScrollbarShown: boolean;\n columns: Array<Partial<IRtDataTable.Column<ENTITY_TYPE>>>;\n}\n\n/** Просьба чтения: с каким составом столбцов сверять прочитанное. */\ninterface IConfigRead<ENTITY_TYPE> {\n readonly storageKey: string;\n readonly config: Array<IRtDataTable.Column<ENTITY_TYPE>>;\n}\n\n/** Просьба записи или снятия: обе идут одним потоком, чтобы не разойтись порядком. */\ntype TConfigWrite<ENTITY_TYPE> =\n | { readonly kind: 'set'; readonly storageKey: string; readonly config: IRtDataTable.Config.Data<ENTITY_TYPE> }\n | { readonly kind: 'remove'; readonly storageKey: string };\n\n/**\n * Порядок имён колонок для сверки двух наборов.\n *\n * Какой именно порядок, значения не имеет: оба набора выстраиваются одним и тем же и сравниваются\n * на равенство. Важно лишь, чтобы порядок был один и не зависел от вида значения, — умолчание\n * `sort()` приводит элементы к строке по-своему и на числовых ключах даёт лексикографический.\n */\nexport function comparePropNames(a: PropertyKey | undefined, b: PropertyKey | undefined): number {\n return String(a).localeCompare(String(b));\n}\n\n/**\n * Настройки таблицы в хранилище браузера: порядок и видимость столбцов, полосы прокрутки.\n *\n * Перенесено из первого кита как есть: ключ — тот, что дало приложение, форма записи — та же.\n * Поэтому настройки, сохранённые таблицей первого кита, читаются здесь без переделки.\n */\n@Injectable()\nexport class RtDataTableConfigService<ENTITY_TYPE> {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #iDBStorageService: IDBStorageService<IStoredConfig<ENTITY_TYPE>> = inject(IDBStorageService);\n\n /** Просьбы прочитать сохранённую настройку. */\n readonly #readSource: Subject<IConfigRead<ENTITY_TYPE>> = new Subject<IConfigRead<ENTITY_TYPE>>();\n\n /** Настройку поменяли здесь: чтение, начатое раньше, отвечать уже не должно. */\n readonly #updatedSource: Subject<void> = new Subject<void>();\n\n /** Просьбы записать и снять настройку — один источник на оба действия. */\n readonly #writeSource: Subject<TConfigWrite<ENTITY_TYPE>> = new Subject<TConfigWrite<ENTITY_TYPE>>();\n\n readonly #tableConfig: WritableSignal<IRtDataTable.Config.Data<ENTITY_TYPE>> = signal({\n isVerticalScrollbarShown: false,\n isHorizontalScrollbarShown: false,\n columns: [],\n });\n public readonly tableConfig: Signal<IRtDataTable.Config.Data<ENTITY_TYPE>> = this.#tableConfig.asReadonly();\n\n /**\n * Потоки чтения и записи объявлены один раз, а методы только толкают в них просьбы.\n *\n * Чтение — `switchMap`: отвечает последний вызов, потому что настройка, прочитанная под\n * прежний состав столбцов, к нынешнему уже не относится. Чтение, ещё не вернувшееся к\n * `updateConfig`, гасится им: иначе прочитанное позже затёрло бы то, что поменяли после.\n * Запись и снятие — один поток и `concatMap`: разведённые по двум, они теряют порядок между\n * собой, и снятие, обогнавшее запись, оставляет в хранилище снятое.\n */\n constructor() {\n this.#readSource\n .pipe(\n switchMap((read: IConfigRead<ENTITY_TYPE>): Observable<IRtDataTable.Config.Data<ENTITY_TYPE>> =>\n this.#iDBStorageService.get(read.storageKey).pipe(\n take(1),\n takeUntil(this.#updatedSource),\n map((savedConfig: TNullable<IStoredConfig<ENTITY_TYPE>>): IRtDataTable.Config.Data<ENTITY_TYPE> =>\n this.#configOf(read.config, savedConfig)\n )\n )\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((config: IRtDataTable.Config.Data<ENTITY_TYPE>) => {\n this.#tableConfig.set(config);\n });\n\n this.#writeSource\n .pipe(\n concatMap((write: TConfigWrite<ENTITY_TYPE>): Observable<unknown> => this.#writeOf(write).pipe(take(1))),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe();\n }\n\n public initConfig(storageKey: string, config: Array<IRtDataTable.Column<ENTITY_TYPE>>): void {\n this.#readSource.next({ storageKey, config });\n }\n\n public updateConfig(storageKey: string, config: IRtDataTable.Config.Data<ENTITY_TYPE>): void {\n this.#updatedSource.next();\n this.#writeSource.next({ kind: 'set', storageKey, config });\n this.#tableConfig.set(config);\n }\n\n public deleteConfig(storageKey: string): void {\n this.#writeSource.next({ kind: 'remove', storageKey });\n }\n\n /** Обращение к хранилищу под просьбу записи или снятия. */\n #writeOf(write: TConfigWrite<ENTITY_TYPE>): Observable<unknown> {\n if (write.kind === 'remove') {\n return this.#iDBStorageService.remove(write.storageKey);\n }\n\n const storedColumns: Array<Partial<IRtDataTable.Column<ENTITY_TYPE>>> = write.config.columns.map(\n (el: IRtDataTable.Column<ENTITY_TYPE>) => ({\n displayName: el.header.label ?? el.propName.toString(),\n propName: el.propName,\n width: el?.width ?? 'auto',\n orderIndex: el?.orderIndex ?? 0,\n hidden: !!el?.hidden,\n fixed: !!el?.fixed,\n })\n );\n\n return this.#iDBStorageService.set(write.storageKey, { ...write.config, columns: storedColumns });\n }\n\n /**\n * Настройка, которую показывает таблица: сохранённая, если она сходится с нынешним составом\n * столбцов, иначе — собранная из самого состава.\n */\n #configOf(\n config: Array<IRtDataTable.Column<ENTITY_TYPE>>,\n savedConfig: TNullable<IStoredConfig<ENTITY_TYPE>>\n ): IRtDataTable.Config.Data<ENTITY_TYPE> {\n if (!savedConfig?.columns || !this.#isSavedConfigConsistent(config, savedConfig.columns)) {\n return {\n isVerticalScrollbarShown: false,\n isHorizontalScrollbarShown: true,\n columns: config.map((el: IRtDataTable.Column<ENTITY_TYPE>, index: number) => ({\n ...el,\n orderIndex: index,\n displayName: el?.header?.label?.length ? el.header.label : el.propName.toString(),\n })),\n };\n }\n\n const updatedColumns: Array<IRtDataTable.Column<ENTITY_TYPE>> = savedConfig.columns.map(\n (el: Partial<IRtDataTable.Column<ENTITY_TYPE>>): IRtDataTable.Column<ENTITY_TYPE> => {\n const declared: TNullable<IRtDataTable.Column<ENTITY_TYPE>> = config.find(\n (item: IRtDataTable.Column<ENTITY_TYPE>) => el.propName === item.propName\n );\n\n return {\n // Сверка составов выше гарантирует, что столбец с этим именем объявлен.\n ...(declared as IRtDataTable.Column<ENTITY_TYPE>),\n displayName: declared?.header?.label?.length ? declared.header.label : el?.propName?.toString(),\n propName: el.propName as Extract<keyof ENTITY_TYPE, string>,\n width: el?.width ?? 'auto',\n orderIndex: el?.orderIndex ?? 0,\n hidden: !!el?.hidden,\n fixed: !!el?.fixed,\n };\n }\n );\n\n return {\n isVerticalScrollbarShown: !!savedConfig?.isVerticalScrollbarShown,\n isHorizontalScrollbarShown: !!savedConfig?.isHorizontalScrollbarShown,\n columns: updatedColumns,\n };\n }\n\n #isSavedConfigConsistent(\n declared: Array<IRtDataTable.Column<ENTITY_TYPE>>,\n saved: Array<Partial<IRtDataTable.Column<ENTITY_TYPE>>>\n ): boolean {\n return (\n !!declared?.length &&\n !!saved?.length &&\n declared.length === saved.length &&\n areArraysEqual(\n declared.map((el: IRtDataTable.Column<ENTITY_TYPE>) => el.propName).toSorted(comparePropNames),\n saved.map((el: Partial<IRtDataTable.Column<ENTITY_TYPE>>) => el.propName).toSorted(comparePropNames)\n )\n );\n }\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\n/** Что получает шаблон значка: имя, колонку и — в ячейке — запись строки. */\nexport interface IRtDataTableIconContext<T = Record<string, unknown>> {\n /** Имя значка из описания колонки — то, что там написало приложение. */\n $implicit: string;\n column: IRtDataTable.Column<T>;\n /** Запись строки; в шапке её нет. */\n row: T | null;\n}\n\n/**\n * Шаблон значка, который приложение отдаёт таблице.\n *\n * Когда он дан, значки шапки и ячеек, названные в описании колонок, рисует он, а перечень\n * соответствий кита не спрашивается. Это выход для имени, которому в наборе кита нет пары.\n *\n * ```html\n * <rt-data-table ...>\n * <ng-template rtDataTableIcon let-name let-row=\"row\">\n * <rt-icon [name]=\"iconOf(name)\" />\n * </ng-template>\n * </rt-data-table>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtDataTableIcon]',\n exportAs: 'rtDataTableIcon',\n})\nexport class RtDataTableIconDirective<T = Record<string, unknown>> {\n public readonly template: TemplateRef<IRtDataTableIconContext<T>> = inject<TemplateRef<IRtDataTableIconContext<T>>>(TemplateRef);\n\n public static ngTemplateContextGuard<T>(\n _directive: RtDataTableIconDirective<T>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n context: unknown\n ): context is IRtDataTableIconContext<T> {\n return true;\n }\n}\n","import {\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n InjectionToken,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n} from '@angular/core';\nimport { BooleanInput } from '@angular/cdk/coercion';\n\nimport { PlatformService } from '@rt-tools/core';\n\n/** Атрибут части строки, нажатие на которую до строки не доходит. */\nexport const RT_DATA_TABLE_STOP_ROW_CLICK_ATTRIBUTE: string = 'rt-data-table-stop-row-click';\n\n/** Кому строка сообщает о нажатии и двойном нажатии — самой таблице. */\nexport interface IRtDataTableRowHost<ENTITY_TYPE> {\n onRowClick(row: ENTITY_TYPE, event: MouseEvent): void;\n onRowDoubleClick(row: ENTITY_TYPE): void;\n}\n\nexport const RT_DATA_TABLE_ROW_HOST: InjectionToken<IRtDataTableRowHost<unknown>> = new InjectionToken<IRtDataTableRowHost<unknown>>(\n 'RtDataTableRowHost'\n);\n\n/** Попало ли нажатие в часть строки, помеченную как не доходящую до строки. */\nfunction isInsideStopNode(event: MouseEvent): boolean {\n return event.target instanceof Element && !!event.target.closest(`[${RT_DATA_TABLE_STOP_ROW_CLICK_ATTRIBUTE}]`);\n}\n\n/**\n * Помечает часть строки, нажатие на которую до строки не доходит, — картинку, кнопку приложения,\n * блок текста в своей ячейке.\n */\n@Directive({\n selector: '[rtDataTableStopRowClick]',\n})\nexport class RtDataTableStopRowClickDirective implements OnInit {\n readonly #platformService: PlatformService = inject(PlatformService);\n readonly #elementRef: ElementRef<HTMLElement> = inject(ElementRef<HTMLElement>);\n\n public ngOnInit(): void {\n if (this.#platformService.isPlatformBrowser) {\n this.#elementRef.nativeElement.setAttribute(RT_DATA_TABLE_STOP_ROW_CLICK_ATTRIBUTE, '');\n }\n }\n}\n\n/**\n * Нажатие и двойное нажатие строки — как в первом ките.\n *\n * О нажатии строка сообщает, когда кнопка опускается, а не когда отпускается, и любой кнопкой:\n * так было в первом ките, и так переносится. Двойное нажатие поэтому приходит после двух нажатий\n * строки.\n */\n@Directive({\n selector: '[rtDataTableRowClick]',\n host: {\n '(mousedown)': 'onMouseDown($event)',\n '(dblclick)': 'onDoubleClick($event)',\n },\n})\nexport class RtDataTableRowClickDirective<ENTITY_TYPE> {\n readonly #host: IRtDataTableRowHost<ENTITY_TYPE> = inject<IRtDataTableRowHost<ENTITY_TYPE>>(RT_DATA_TABLE_ROW_HOST);\n\n /** Запись строки. */\n public readonly entity: InputSignal<ENTITY_TYPE> = input.required<ENTITY_TYPE>({ alias: 'rtDataTableRowClick' });\n\n /** Строка сообщает о нажатиях. */\n public readonly isTableRowClickable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n public onMouseDown(event: MouseEvent): void {\n if (!this.isTableRowClickable() || isInsideStopNode(event)) {\n event.stopPropagation();\n return;\n }\n this.#host.onRowClick(this.entity(), event);\n }\n\n public onDoubleClick(event: MouseEvent): void {\n if (!this.isTableRowClickable() || isInsideStopNode(event)) {\n event.stopPropagation();\n return;\n }\n this.#host.onRowDoubleClick(this.entity());\n }\n}\n","import { Clipboard } from '@angular/cdk/clipboard';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n Signal,\n signal,\n TemplateRef,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DomSanitizer, SafeStyle } from '@angular/platform-browser';\n\nimport { BlockDirective, ElemDirective, EmptyToDashPipe, ModDirective } from '@rt-tools/core';\nimport { isEmpty, TNullable } from '@rt-tools/utils';\n\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { dataTableCellText, dataTableCellValue, dataTableCopyButtonSide, dataTableIconName } from '../rt-data-table-cell.logic';\nimport { IRtDataTableIconContext } from '../rt-data-table-icon.directive';\nimport { RtDataTableStopRowClickDirective } from '../rt-data-table-row-click.directive';\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-data-table-cell';\n\n/** Сколько держать «скопировано» перед возвратом кнопки — как в первом ките. */\nconst COPIED_DELAY_MS: number = 2000;\n\n/**\n * Готовая ячейка `rt-data-table` — ячейка первого кита без Material.\n *\n * Значение рисуется как пришло или как его переделала колонка; пустое — прочерком. Длинное\n * обрезается в строку, и подсказка со значением целиком бывает только у обрезанного. Значок —\n * набором кита по имени первого кита либо шаблоном значка приложения. Кнопка копирования\n * проявляется при наведении и стоит на стороне, противоположной выравниванию значения.\n */\n@Component({\n selector: 'rt-data-table-cell',\n templateUrl: './rt-data-table-cell.component.html',\n styleUrl: './rt-data-table-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // components\n RtIconButtonComponent,\n RtIconComponent,\n\n // directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n NgTemplateOutlet,\n RtDataTableStopRowClickDirective,\n RtTooltipDirective,\n\n // pipes\n EmptyToDashPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[style.width]': 'column().width',\n '[style.min-width]': 'column().minWidth',\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'hovered.set(false)',\n },\n})\nexport class RtDataTableCellComponent<T = Record<string, unknown>> {\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n readonly #clipboard: Clipboard = inject(Clipboard);\n readonly #sanitizer: DomSanitizer = inject(DomSanitizer);\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n #copiedTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly #copyLabel: Signal<string> = rtKitLabel('dataTableCopy');\n readonly #copiedLabel: Signal<string> = rtKitLabel('dataTableCopied');\n\n /** Экран узкий: подсказки гаснут. Что кнопка копирования там видна всегда, решают стили. */\n protected readonly narrow: Signal<boolean> = this.#breakpoints.narrow;\n\n protected readonly value: Signal<T[keyof T] | string | number> = computed(() => dataTableCellValue(this.row(), this.column()));\n\n /**\n * Копировать нечего: значение пусто. Считается той же утилитой, что рисует прочерк вместо\n * значения, — второй ответ на этот вопрос разошёлся бы с прочерком молча.\n */\n protected readonly empty: Signal<boolean> = computed(() => isEmpty(this.value()));\n\n protected readonly copyable: Signal<boolean> = computed(() => this.column().copyable && !this.empty());\n\n /**\n * Значок колонки. Его видимость, цвет и подсказку ячейка не читает — как первый кит: поля\n * приняты ради переезда без правок и ничего не меняют.\n */\n protected readonly icon: Signal<IRtDataTable.Icon | null> = computed(() => this.column().icon ?? null);\n\n /** Значок набора кита для имени первого кита; без пары — ничего. */\n protected readonly kitIcon: Signal<IRtIcon.Name | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon ? dataTableIconName(icon.glyph) : null;\n });\n\n /**\n * Имя без пары в перечне соответствий: его ячейка рисует глифом шрифта Material Symbols, как\n * первый кит рисовал любой глиф. Шрифт кит не везёт — глиф виден там, где шрифт подключило\n * приложение, а без шрифта на месте значка стоит его имя.\n */\n protected readonly glyph: Signal<string | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon && !this.kitIcon() ? icon.glyph : null;\n });\n\n /** Залитый глиф — как залитый значок набора: контурным его делает `outlined` колонки. */\n protected readonly glyphMods: Signal<Record<string, boolean>> = computed(() => ({ filled: this.icon()?.outlined !== true }));\n\n protected readonly iconContext: Signal<IRtDataTableIconContext<T> | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon ? { $implicit: icon.glyph, column: this.column(), row: this.row() } : null;\n });\n\n /**\n * Стиль значка, посчитанный колонкой по значению строки, — строкой, как в первом ките.\n * Это одна из странностей первого кита, перенесённых как есть: такую строку не перекрашивает\n * ни набор, ни тёмная тема.\n */\n protected readonly iconStyle: Signal<SafeStyle | null> = computed(() => {\n const transform: TNullable<(value: T[keyof T]) => string> = this.column().iconTransform;\n\n // eslint-disable-next-line sonarjs/no-angular-bypass-sanitization -- строка стиля собрана описанием колонок приложения, а не значением, введённым человеком\n return transform ? this.#sanitizer.bypassSecurityTrustStyle(transform(this.row()[this.column().propName])) : null;\n });\n\n protected readonly hovered: WritableSignal<boolean> = signal(false);\n protected readonly copied: WritableSignal<boolean> = signal(false);\n\n /** Подсказка: заданная колонкой, иначе значение целиком — и только у обрезанного. */\n protected readonly hint: WritableSignal<string> = signal('');\n\n protected readonly copyLabel: Signal<string> = computed(() => (this.copied() ? this.#copiedLabel() : this.#copyLabel()));\n\n protected readonly copyIcon: Signal<IRtIcon.Name> = computed(() => (this.copied() ? 'check' : 'copy'));\n\n protected readonly titleMods: Signal<Record<string, string>> = computed(() => ({ align: this.column().align }));\n\n protected readonly copyMods: Signal<Record<string, string | boolean>> = computed(() => ({\n position: dataTableCopyButtonSide(this.column() as IRtDataTable.Column<unknown>),\n complete: this.copied(),\n visible: this.hovered(),\n }));\n\n public readonly row: InputSignal<T> = input.required<T>();\n public readonly column: InputSignal<IRtDataTable.Column<T>> = input.required<IRtDataTable.Column<T>>();\n\n /** Шаблон значка приложения; когда он дан, перечень кита не спрашивается. */\n public readonly iconTemplate: InputSignal<TemplateRef<IRtDataTableIconContext<T>> | null> = input<TemplateRef<\n IRtDataTableIconContext<T>\n > | null>(null);\n\n constructor() {\n inject(DestroyRef).onDestroy((): void => this.#clearTimer());\n }\n\n /**\n * Наведение: проявить кнопку копирования и замерить обрезку.\n *\n * Ширина известна только отрисованному узлу, а меняется она и от переезда столбца, и от\n * ширины окна: посчитанная один раз, она соврала бы при первом же изменении.\n */\n protected onMouseEnter(): void {\n this.hovered.set(true);\n\n const text: HTMLElement | null = this.#host.nativeElement.querySelector(`.${BEM_BLOCK}__text`);\n const cut: boolean = text !== null && text.scrollWidth > text.clientWidth;\n\n this.hint.set(!this.narrow() && cut ? (this.column().tooltip ?? dataTableCellText(this.value())) : '');\n }\n\n protected onCopy(): void {\n this.#clipboard.copy(dataTableCellText(this.value()));\n this.copied.set(true);\n\n this.#clearTimer();\n this.#copiedTimer = setTimeout((): void => this.copied.set(false), COPIED_DELAY_MS);\n }\n\n #clearTimer(): void {\n if (this.#copiedTimer !== null) {\n clearTimeout(this.#copiedTimer);\n this.#copiedTimer = null;\n }\n }\n}\n","<ng-container rtBlock=\"rt-data-table-cell\">\n <ng-template #iconTpl>\n @if (iconTemplate(); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"iconContext()\" />\n } @else if (kitIcon(); as name) {\n <rt-icon size=\"lg\" [name]=\"name\" [fill]=\"icon()?.outlined !== true\" [style]=\"iconStyle()\" />\n } @else if (glyph(); as name) {\n <span rtElem=\"glyph\" aria-hidden=\"true\" qa-dataid=\"data-table-cell-glyph\" [rtMod]=\"glyphMods()\" [style]=\"iconStyle()\">\n {{ name }}\n </span>\n }\n </ng-template>\n\n @if (icon()?.placement === 'left') {\n <span rtElem=\"prefix\" qa-dataid=\"data-table-cell-prefix\"><ng-container [ngTemplateOutlet]=\"iconTpl\" /></span>\n }\n\n <div rtElem=\"title\" [rtMod]=\"titleMods()\">\n <div rtElem=\"text\" qa-dataid=\"data-table-cell-text\" [rtTooltip]=\"hint()\">{{ value() | emptyToDash }}</div>\n </div>\n\n @if (icon()?.placement === 'right') {\n <span rtElem=\"suffix\" qa-dataid=\"data-table-cell-suffix\"><ng-container [ngTemplateOutlet]=\"iconTpl\" /></span>\n }\n\n @if (copyable()) {\n <rt-icon-button\n rtElem=\"copy-button\"\n rtDataTableStopRowClick\n qa-dataid=\"data-table-cell-copy\"\n size=\"sm\"\n [rtMod]=\"copyMods()\"\n [icon]=\"copyIcon()\"\n [ariaLabel]=\"copyLabel()\"\n [tooltip]=\"narrow() ? '' : copyLabel()\"\n (clicked)=\"onCopy()\" />\n }\n</ng-container>\n","import { EListSortOrder, ISortModel, TListSortOrderType, TNullable } from '@rt-tools/utils';\n\n/**\n * Какой порядок просит нажатие на шапку — как в первом ките: по возрастанию, а после возрастания\n * по убыванию. Снятия порядка нет: после убывания снова возрастание.\n */\nexport function dataTableNextSortOrder(current: TNullable<ISortModel<string>>): TListSortOrderType {\n return current?.sortDirection?.toLowerCase() === EListSortOrder.ASC ? EListSortOrder.DESC : EListSortOrder.ASC;\n}\n\n/** Порядок таблицы сейчас стоит по этой колонке. */\nexport function dataTableSortActive(sort: TNullable<ISortModel<string>>, current: TNullable<ISortModel<string>>): boolean {\n return !!current?.propertyName && !!sort?.propertyName && current.propertyName === sort.propertyName;\n}\n\n/** Значение `aria-sort` шапки: скринридер называет порядок колонки, а не только её имя. */\nexport type TRtDataTableAriaSort = 'ascending' | 'descending' | 'none';\n\n/**\n * `aria-sort` сортируемой колонки: порядок по ней, если он стоит по ней, иначе `none`. Колонке\n * без сортировки атрибут не положен вовсе — `null` снимает его.\n */\nexport function dataTableAriaSort(\n sort: TNullable<ISortModel<string>>,\n current: TNullable<ISortModel<string>>\n): TRtDataTableAriaSort | null {\n if (!sort?.propertyName) {\n return null;\n }\n\n if (!dataTableSortActive(sort, current)) {\n return 'none';\n }\n\n const direction: string | undefined = current?.sortDirection?.toLowerCase();\n\n if (direction === EListSortOrder.ASC) {\n return 'ascending';\n }\n\n return direction === EListSortOrder.DESC ? 'descending' : 'none';\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n output,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\nimport { BlockDirective, ConcatClassesPipe, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { EListSortOrder, ISortModel, TNullable } from '@rt-tools/utils';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\nimport { dataTableIconName } from '../rt-data-table-cell.logic';\nimport { IRtDataTableIconContext } from '../rt-data-table-icon.directive';\nimport { dataTableNextSortOrder, dataTableSortActive } from '../rt-data-table-sort.logic';\nimport { IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-data-table-header-cell';\n\n/**\n * Ячейка шапки `rt-data-table` — шапка первого кита без Material.\n *\n * Нажатие на шапку сортируемой колонки просит порядок: по возрастанию, затем по убыванию, и так\n * по кругу — снятия порядка нет. С клавиатуры то же делают Enter и пробел. Стрелки порядка видны\n * при наведении, при фокусе и у колонки, по которой порядок стоит. Значок шапки — набором кита по имени первого кита либо шаблоном приложения.\n */\n@Component({\n selector: 'rt-data-table-header-cell',\n templateUrl: './rt-data-table-header-cell.component.html',\n styleUrl: './rt-data-table-header-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // components\n RtIconComponent,\n\n // directives\n BlockDirective,\n ElemDirective,\n ModDirective,\n NgTemplateOutlet,\n RtTooltipDirective,\n\n // pipes\n ConcatClassesPipe,\n ],\n host: {\n class: BEM_BLOCK,\n '[style.text-align]': 'headerModel().align',\n '[attr.tabindex]': 'sortable() ? 0 : null',\n '[attr.role]': 'sortable() ? \"button\" : null',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onKey($event)',\n '(keydown.space)': 'onKey($event)',\n },\n})\nexport class RtDataTableHeaderCellComponent<T = Record<string, unknown>> {\n /** Шапка сортируемой колонки нажимается и с клавиатуры: у неё фокус и роль кнопки. */\n protected readonly sortable: Signal<boolean> = computed(() => !!this.sortModel()?.propertyName);\n\n protected readonly active: Signal<boolean> = computed(() => dataTableSortActive(this.sortModel(), this.currentSortModel()));\n\n protected readonly labelMods: Signal<Record<string, string>> = computed(() => ({ align: this.headerModel().align }));\n\n protected readonly arrowsMods: Signal<Record<string, boolean>> = computed(() => ({ active: this.active() }));\n\n protected readonly descMods: Signal<Record<string, boolean>> = computed(() => ({\n active: this.active() && this.currentSortModel()?.sortDirection?.toLowerCase() === EListSortOrder.DESC,\n first: true,\n }));\n\n protected readonly ascMods: Signal<Record<string, boolean>> = computed(() => ({\n active: this.active() && this.currentSortModel()?.sortDirection?.toLowerCase() === EListSortOrder.ASC,\n second: true,\n }));\n\n /** Значок шапки; его цвет и видимость, как в первом ките, ничего не меняют. */\n protected readonly icon: Signal<IRtDataTable.Icon | null> = computed(() => this.headerModel().icon ?? null);\n\n protected readonly kitIcon: Signal<IRtIcon.Name | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon ? dataTableIconName(icon.glyph) : null;\n });\n\n /** Имя без пары в перечне шапка рисует глифом Material Symbols — так же, как ячейка. */\n protected readonly glyph: Signal<string | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n\n return icon && !this.kitIcon() ? icon.glyph : null;\n });\n\n /** Залитый глиф — как залитый значок набора: контурным его делает `outlined` колонки. */\n protected readonly glyphMods: Signal<Record<string, boolean>> = computed(() => ({ filled: this.icon()?.outlined !== true }));\n\n protected readonly iconContext: Signal<IRtDataTableIconContext<T> | null> = computed(() => {\n const icon: IRtDataTable.Icon | null = this.icon();\n const column: IRtDataTable.Column<T> | null = this.column();\n\n return icon && column ? { column, $implicit: icon.glyph, row: null } : null;\n });\n\n public readonly headerModel: InputSignal<IRtDataTable.Header> = input.required<IRtDataTable.Header>();\n public readonly sortModel: InputSignal<TNullable<ISortModel<string>>> = input.required<TNullable<ISortModel<string>>>();\n public readonly currentSortModel: InputSignal<TNullable<ISortModel<string>>> = input.required<TNullable<ISortModel<string>>>();\n\n /** Колонка шапки — её получает шаблон значка приложения. */\n public readonly column: InputSignal<IRtDataTable.Column<T> | null> = input<IRtDataTable.Column<T> | null>(null);\n\n /** Шаблон значка приложения; когда он дан, перечень кита не спрашивается. */\n public readonly iconTemplate: InputSignal<TemplateRef<IRtDataTableIconContext<T>> | null> = input<TemplateRef<\n IRtDataTableIconContext<T>\n > | null>(null);\n\n public readonly sortChange: OutputEmitterRef<ISortModel<string>> = output<ISortModel<string>>();\n\n /** Enter и пробел просят порядок так же, как нажатие; пробел иначе прокрутил бы страницу. */\n protected onKey(event: Event): void {\n if (this.sortable()) {\n event.preventDefault();\n this.onClick();\n }\n }\n\n protected onClick(): void {\n const propertyName: TNullable<string> = this.sortModel()?.propertyName;\n\n if (propertyName) {\n this.sortChange.emit({ propertyName, sortDirection: dataTableNextSortOrder(this.currentSortModel()) });\n }\n }\n}\n","<ng-container rtBlock=\"rt-data-table-header-cell\">\n <ng-template #iconTpl>\n @if (iconTemplate(); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"iconContext()\" />\n } @else if (kitIcon(); as name) {\n <rt-icon size=\"lg\" [name]=\"name\" [fill]=\"icon()?.outlined !== true\" />\n } @else if (glyph(); as name) {\n <span rtElem=\"glyph\" aria-hidden=\"true\" qa-dataid=\"data-table-header-glyph\" [rtMod]=\"glyphMods()\">{{ name }}</span>\n }\n </ng-template>\n\n <div rtElem=\"label\" [rtMod]=\"labelMods()\">\n @if (icon()?.placement === 'left') {\n <span rtElem=\"prefix\" qa-dataid=\"data-table-header-prefix\"><ng-container [ngTemplateOutlet]=\"iconTpl\" /></span>\n }\n\n <div\n rtElem=\"text\"\n qa-dataid=\"data-table-header-text\"\n [class]=\"[headerModel().className] | concatClasses\"\n [rtTooltip]=\"headerModel().tooltip ?? ''\">\n {{ headerModel().label }}\n </div>\n\n @if (icon()?.placement === 'right') {\n <span rtElem=\"suffix\" qa-dataid=\"data-table-header-suffix\"><ng-container [ngTemplateOutlet]=\"iconTpl\" /></span>\n }\n </div>\n\n @if (sortModel()) {\n <div rtElem=\"arrows\" qa-dataid=\"data-table-header-sort\" [rtMod]=\"arrowsMods()\">\n <div rtElem=\"arrow\" [rtMod]=\"descMods()\"></div>\n <div rtElem=\"arrow\" [rtMod]=\"ascMods()\"></div>\n </div>\n }\n</ng-container>\n","import { EFilterOperatorType, FILTER_OPERATORS, IFilterModel, TFilterOperatorType } from '@rt-tools/utils';\n\n/** Значение отбора в том виде, в каком его отдаёт приложению первый кит. */\nexport type TRtDataTableFilterValue = string | number | boolean;\n\n/**\n * Значок вида сравнения — имя первого кита; набор кита рисует его по перечню соответствий.\n * «Начинается с» и «заканчивается на» первый кит объявлял, но значка и пункта меню им не давал.\n */\nexport const DATA_TABLE_FILTER_OPERATOR_GLYPHS: Readonly<Record<TFilterOperatorType, string | null>> = {\n [EFilterOperatorType.EQUALS]: 'drag_handle',\n [EFilterOperatorType.NOT_EQUALS]: 'block',\n [EFilterOperatorType.STARTS_WITH]: null,\n [EFilterOperatorType.ENDS_WITH]: null,\n [EFilterOperatorType.CONTAINS]: 'more_horiz',\n [EFilterOperatorType.GREATER_THAN]: 'chevron_right',\n [EFilterOperatorType.LESS_THAN]: 'chevron_left',\n};\n\n/** Пункты меню видов сравнения в порядке первого кита. */\nexport const DATA_TABLE_FILTER_MENU_OPERATORS: ReadonlyArray<TFilterOperatorType> = [\n EFilterOperatorType.EQUALS,\n EFilterOperatorType.NOT_EQUALS,\n EFilterOperatorType.CONTAINS,\n EFilterOperatorType.GREATER_THAN,\n EFilterOperatorType.LESS_THAN,\n];\n\n/** Вид сравнения колонки по умолчанию: незнакомое и пустое значение дают «равно». */\nexport function dataTableDefaultOperator(operator: TFilterOperatorType | null | undefined): TFilterOperatorType {\n return operator && FILTER_OPERATORS.includes(operator) ? operator : EFilterOperatorType.EQUALS;\n}\n\n/** Условие колонки из набора приложения, а без него — пустое условие с видом по умолчанию. */\nexport function dataTableColumnFilter<KEY extends string>(\n filters: ReadonlyArray<IFilterModel<KEY>>,\n propertyName: KEY,\n defaultOperator: TFilterOperatorType\n): IFilterModel<KEY> {\n return (\n filters.find((filter: IFilterModel<KEY>) => filter.propertyName === propertyName) ?? {\n propertyName,\n operatorType: defaultOperator,\n value: '',\n }\n );\n}\n\n/**\n * Набор условий после смены значения колонки; `null` — приложению сообщать нечего.\n * Пустое значение снимает условие колонки, значение на колонке без условия добавляет его.\n */\nexport function dataTableFiltersWithValue<KEY extends string>(\n filters: ReadonlyArray<IFilterModel<KEY>>,\n current: IFilterModel<KEY>,\n value: TRtDataTableFilterValue\n): IFilterModel<KEY>[] | null {\n const hasCondition: boolean = filters.some((filter: IFilterModel<KEY>) => filter.propertyName === current.propertyName);\n\n if (hasCondition) {\n return value\n ? filters.map((filter: IFilterModel<KEY>) => (filter.propertyName === current.propertyName ? { ...filter, value } : filter))\n : filters.filter((filter: IFilterModel<KEY>) => filter.propertyName !== current.propertyName);\n }\n\n return value ? [...filters, { propertyName: current.propertyName, operatorType: current.operatorType, value }] : null;\n}\n\n/** Набор условий после смены вида сравнения; `null` — ни условия, ни значения, спрашивать нечего. */\nexport function dataTableFiltersWithOperator<KEY extends string>(\n filters: ReadonlyArray<IFilterModel<KEY>>,\n current: IFilterModel<KEY>,\n operatorType: TFilterOperatorType\n): IFilterModel<KEY>[] | null {\n const hasCondition: boolean = filters.some((filter: IFilterModel<KEY>) => filter.propertyName === current.propertyName);\n\n if (hasCondition) {\n return filters.map((filter: IFilterModel<KEY>) =>\n filter.propertyName === current.propertyName ? { ...filter, operatorType } : filter\n );\n }\n\n return current.value ? [...filters, { operatorType, propertyName: current.propertyName, value: current.value }] : null;\n}\n\n/**\n * День поля даты кита (`2025-01-01`) — в момент ISO, как отдавал первый кит: полночь дня по\n * местному времени. Пустая строка остаётся пустой — она снимает условие.\n */\nexport function dataTableDayToIso(day: string): string {\n const [year, month, date]: number[] = day.split('-').map(Number);\n const complete: boolean = [year, month, date].every((part: number | undefined) => !!part);\n\n return complete ? new Date(year, month - 1, date).toISOString() : '';\n}\n\n/** Обратно: момент условия — в день поля даты по местному времени; нераспознанное даёт пустое. */\nexport function dataTableIsoToDay(value: unknown): string {\n const moment: Date = new Date(typeof value === 'string' ? value : '');\n\n if (Number.isNaN(moment.getTime())) {\n return '';\n }\n\n const month: string = String(moment.getMonth() + 1).padStart(2, '0');\n const date: string = String(moment.getDate()).padStart(2, '0');\n\n return `${moment.getFullYear()}-${month}-${date}`;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n linkedSignal,\n output,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { TitleCasePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\nimport { EFilterOperatorType, IFilterModel, TFilterOperatorType, transformArrayInput } from '@rt-tools/utils';\n\nimport { RT_KIT_TRANSLATOR, rtKitLabel, TRtKitLabelKey, TRtKitTranslator } from '@rt-tools/ui-kit-v2/core';\nimport { RtDatePickerComponent } from '@rt-tools/ui-kit-v2/date-picker';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtInputNumberComponent } from '@rt-tools/ui-kit-v2/input-number';\nimport { RtInputComponent } from '@rt-tools/ui-kit-v2/input';\nimport { RtMenuItemComponent } from '@rt-tools/ui-kit-v2/menu';\nimport { RtMenuComponent } from '@rt-tools/ui-kit-v2/menu';\nimport { RtSelectComponent } from '@rt-tools/ui-kit-v2/select';\nimport { IRtSelect } from '@rt-tools/ui-kit-v2/select';\nimport { dataTableIconName } from '../rt-data-table-cell.logic';\nimport {\n DATA_TABLE_FILTER_MENU_OPERATORS,\n DATA_TABLE_FILTER_OPERATOR_GLYPHS,\n dataTableColumnFilter,\n dataTableDayToIso,\n dataTableDefaultOperator,\n dataTableFiltersWithOperator,\n dataTableFiltersWithValue,\n dataTableIsoToDay,\n TRtDataTableFilterValue,\n} from '../rt-data-table-filter.logic';\nimport { ERtDataTableFilterType, IRtDataTable } from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-data-table-filter-cell';\n\n/** Значок кнопки вида сравнения, которому первый кит значка не дал. */\nconst FALLBACK_OPERATOR_ICON: IRtIcon.Name = 'ellipsis-h';\n\nconst OPERATOR_LABELS: Readonly<Partial<Record<TFilterOperatorType, TRtKitLabelKey>>> = {\n [EFilterOperatorType.EQUALS]: 'dataTableFilterOperatorEquals',\n [EFilterOperatorType.NOT_EQUALS]: 'dataTableFilterOperatorNotEquals',\n [EFilterOperatorType.CONTAINS]: 'dataTableFilterOperatorContains',\n [EFilterOperatorType.GREATER_THAN]: 'dataTableFilterOperatorGreaterThan',\n [EFilterOperatorType.LESS_THAN]: 'dataTableFilterOperatorLessThan',\n};\n\n/** Одно и то же условие: колонка, вид сравнения и значение совпадают. */\nfunction sameFilter<KEY extends string>(a: IFilterModel<KEY>, b: IFilterModel<KEY>): boolean {\n return a.propertyName === b.propertyName && a.operatorType === b.operatorType && a.value === b.value;\n}\n\ninterface IOperatorItem {\n operator: TFilterOperatorType;\n icon: IRtIcon.Name;\n label: string;\n}\n\n/**\n * Ячейка строки отбора `rt-data-table` — ячейка отбора первого кита на полях кита.\n *\n * Своих условий у ячейки нет: она читает набор приложения и отдаёт ему новый при каждой смене.\n * Текст и число фиксируются по Enter и уходу с поля, дата — выбором дня, список — выбором пункта;\n * пустое значение снимает условие колонки. Кнопка вида сравнения предлагает остальные виды.\n */\n@Component({\n selector: 'rt-data-table-filter-cell',\n templateUrl: './rt-data-table-filter-cell.component.html',\n styleUrl: './rt-data-table-filter-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // components\n RtDatePickerComponent,\n RtIconButtonComponent,\n RtInputComponent,\n RtInputNumberComponent,\n RtMenuComponent,\n RtMenuItemComponent,\n RtSelectComponent,\n\n // directives\n BlockDirective,\n ElemDirective,\n FormsModule,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtDataTableFilterCellComponent<KEY extends string = string> {\n readonly #translate: Signal<TRtKitTranslator> = inject(RT_KIT_TRANSLATOR);\n readonly #titleCase: TitleCasePipe = new TitleCasePipe();\n\n /** Набранное, но ещё не зафиксированное значение текстового и числового поля. */\n #draft: TRtDataTableFilterValue | null = null;\n\n protected readonly filterTypes: typeof ERtDataTableFilterType = ERtDataTableFilterType;\n\n protected readonly valuePlaceholder: Signal<string> = rtKitLabel('dataTableFilterValuePlaceholder');\n protected readonly selectPlaceholder: Signal<string> = rtKitLabel('dataTableFilterSelectPlaceholder');\n protected readonly clearLabel: Signal<string> = rtKitLabel('dataTableFilterClear');\n\n /**\n * Условие своей колонки из набора приложения. Сверяется по содержимому: набор меняется целиком\n * и по чужой колонке, а своё условие при этом остаётся тем же — и выбранный здесь вид\n * сравнения пустой колонки сбрасывать нечем.\n */\n readonly #ownFilter: Signal<IFilterModel<KEY>> = computed(\n (): IFilterModel<KEY> =>\n dataTableColumnFilter(this.filterModel(), this.filterProperty(), dataTableDefaultOperator(this.defaultFilterOperator())),\n { equal: sameFilter }\n );\n\n /** Условие колонки: из набора приложения, а вид сравнения без условия помнит сама ячейка. */\n protected readonly currentFilter: WritableSignal<IFilterModel<KEY>> = linkedSignal((): IFilterModel<KEY> => this.#ownFilter());\n\n protected readonly hasValue: Signal<boolean> = computed(() => !!this.currentFilter().value);\n\n protected readonly day: Signal<string> = computed(() => dataTableIsoToDay(this.currentFilter().value));\n\n protected readonly number: Signal<number | null> = computed(() => {\n const value: number = Number(this.currentFilter().value);\n\n return this.currentFilter().value === '' || Number.isNaN(value) ? null : value;\n });\n\n protected readonly operatorIcon: Signal<IRtIcon.Name> = computed(() => this.#operatorIcon(this.currentFilter().operatorType));\n\n protected readonly operatorLabel: Signal<string> = computed(() =>\n this.#operatorLabel(this.#translate(), this.currentFilter().operatorType)\n );\n\n /**\n * Пункты меню — предложенные колонкой виды в порядке первого кита, кроме нынешнего: его первый кит\n * в меню не выводит, нынешний вид показывает кнопка.\n */\n protected readonly operatorItems: Signal<IOperatorItem[]> = computed(() => {\n const translate: TRtKitTranslator = this.#translate();\n const current: TFilterOperatorType = this.currentFilter().operatorType;\n\n return DATA_TABLE_FILTER_MENU_OPERATORS.filter(\n (operator: TFilterOperatorType) => operator !== current && this.filterOperators().includes(operator)\n ).map((operator: TFilterOperatorType) => ({\n operator,\n icon: this.#operatorIcon(operator),\n label: this.#operatorLabel(translate, operator),\n }));\n });\n\n protected readonly selectOptions: Signal<IRtSelect.Option<string>[]> = computed(() =>\n this.filterSelectOptions().map((option: string) => ({ label: this.#titleCase.transform(option), value: option }))\n );\n\n /** Колонка, по которой отбирает ячейка. */\n /** Вид полей отбора: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly filterProperty: InputSignal<KEY> = input.required<KEY>();\n public readonly filterType: InputSignal<IRtDataTable.FilterType> = input.required<IRtDataTable.FilterType>();\n\n /** Весь набор условий приложения. */\n public readonly filterModel: InputSignalWithTransform<IFilterModel<KEY>[], IFilterModel<KEY>[] | null | undefined> = input<\n IFilterModel<KEY>[],\n IFilterModel<KEY>[] | null | undefined\n >([], { transform: transformArrayInput });\n\n public readonly defaultFilterOperator: InputSignal<TFilterOperatorType | null | undefined> = input<\n TFilterOperatorType | null | undefined\n >(null);\n\n public readonly filterOperators: InputSignalWithTransform<TFilterOperatorType[], TFilterOperatorType[] | null | undefined> = input<\n TFilterOperatorType[],\n TFilterOperatorType[] | null | undefined\n >([], { transform: transformArrayInput });\n\n public readonly filterSelectOptions: InputSignalWithTransform<string[], string[] | null | undefined> = input<\n string[],\n string[] | null | undefined\n >([], { transform: transformArrayInput });\n\n public readonly filterChange: OutputEmitterRef<IFilterModel<KEY>[]> = output<IFilterModel<KEY>[]>();\n\n /** Набор в поле: пустое поле — это очистка, она фиксируется сразу, как у первого кита. */\n protected onDraft(value: TRtDataTableFilterValue | null): void {\n this.#draft = value ?? '';\n\n if (this.#draft === '') {\n this.onCommit();\n }\n }\n\n /** Enter и уход с поля фиксируют набранное. */\n protected onCommit(): void {\n if (this.#draft !== null) {\n this.onValueChange(this.#draft);\n this.#draft = null;\n }\n }\n\n protected onNumberDraft(value: number | null): void {\n this.onDraft(value === null ? '' : String(value));\n }\n\n protected onDayChange(day: string | null): void {\n this.onValueChange(dataTableDayToIso(day ?? ''));\n }\n\n protected onValueChange(value: TRtDataTableFilterValue | null): void {\n const next: TRtDataTableFilterValue = value ?? '';\n const current: IFilterModel<KEY> = this.currentFilter();\n\n if (next === current.value) {\n return;\n }\n\n const filters: IFilterModel<KEY>[] | null = dataTableFiltersWithValue(this.filterModel(), current, next);\n\n if (filters) {\n this.filterChange.emit(filters);\n }\n\n this.currentFilter.set({ ...current, value: next });\n }\n\n protected onOperatorChange(operatorType: TFilterOperatorType): void {\n const current: IFilterModel<KEY> = this.currentFilter();\n const filters: IFilterModel<KEY>[] | null = dataTableFiltersWithOperator(this.filterModel(), current, operatorType);\n\n if (filters) {\n this.filterChange.emit(filters);\n }\n\n this.currentFilter.set({ ...current, operatorType });\n }\n\n #operatorIcon(operator: TFilterOperatorType): IRtIcon.Name {\n const glyph: string | null = DATA_TABLE_FILTER_OPERATOR_GLYPHS[operator];\n\n return (glyph && dataTableIconName(glyph)) || FALLBACK_OPERATOR_ICON;\n }\n\n #operatorLabel(translate: TRtKitTranslator, operator: TFilterOperatorType): string {\n const key: TRtKitLabelKey | undefined = OPERATOR_LABELS[operator];\n\n return key ? translate(key) : this.#titleCase.transform(operator);\n }\n}\n","<ng-container rtBlock=\"rt-data-table-filter-cell\">\n @if (filterOperators().length) {\n <rt-menu qa-dataid=\"data-table-filter-operator\" align=\"start\" [icon]=\"operatorIcon()\" [ariaLabel]=\"operatorLabel()\">\n @for (item of operatorItems(); track item.operator) {\n <rt-menu-item\n qa-dataid=\"data-table-filter-operator-item\"\n [icon]=\"item.icon\"\n [label]=\"item.label\"\n (selected)=\"onOperatorChange(item.operator)\" />\n }\n </rt-menu>\n }\n\n @switch (filterType()) {\n @case (filterTypes.TEXT) {\n <rt-input\n rtElem=\"field\"\n qa-dataid=\"data-table-filter-input\"\n size=\"sm\"\n [appearance]=\"appearance()\"\n [placeholder]=\"valuePlaceholder()\"\n [ngModel]=\"currentFilter().value\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onDraft($event)\"\n (keydown.enter)=\"onCommit()\"\n (focusout)=\"onCommit()\" />\n }\n @case (filterTypes.NUMBER) {\n <rt-input-number\n rtElem=\"field\"\n qa-dataid=\"data-table-filter-number\"\n size=\"sm\"\n [appearance]=\"appearance()\"\n [placeholder]=\"valuePlaceholder()\"\n [ngModel]=\"number()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onNumberDraft($event)\"\n (keydown.enter)=\"onCommit()\"\n (focusout)=\"onCommit()\" />\n }\n @case (filterTypes.DATE) {\n <rt-icon-button\n qa-dataid=\"data-table-filter-clear\"\n icon=\"close\"\n [ariaLabel]=\"clearLabel()\"\n [tooltip]=\"clearLabel()\"\n [disabled]=\"!hasValue()\"\n (clicked)=\"onValueChange('')\" />\n\n <rt-date-picker\n rtElem=\"field\"\n qa-dataid=\"data-table-filter-date\"\n size=\"sm\"\n [appearance]=\"appearance()\"\n [clearable]=\"false\"\n [ngModel]=\"day()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onDayChange($event)\" />\n }\n @case (filterTypes.SELECT) {\n <rt-icon-button\n qa-dataid=\"data-table-filter-clear\"\n icon=\"close\"\n [ariaLabel]=\"clearLabel()\"\n [tooltip]=\"clearLabel()\"\n [disabled]=\"!hasValue()\"\n (clicked)=\"onValueChange('')\" />\n\n <rt-select\n rtElem=\"field\"\n qa-dataid=\"data-table-filter-select\"\n size=\"sm\"\n [appearance]=\"appearance()\"\n [clearable]=\"false\"\n [options]=\"selectOptions()\"\n [placeholder]=\"selectPlaceholder()\"\n [ngModel]=\"currentFilter().value || null\"\n [ngModelOptions]=\"{ standalone: true }\"\n (selectionChange)=\"onValueChange($event)\" />\n }\n }\n</ng-container>\n","import { Directive, input, InputSignal, TemplateRef } from '@angular/core';\n\n/** Что получает шаблон приложения, рисующий строку целиком или её часть. */\nexport interface IRtDataTableRowContext<ENTITY_TYPE> {\n $implicit: ENTITY_TYPE;\n}\n\n/**\n * Шаблоны пользовательских ячеек: имя свойства колонки — шаблон её ячейки.\n *\n * Колонку типа «custom» таблица рисует этим шаблоном и готовой ячейки не берёт.\n */\n@Directive({\n selector: '[rtDataTableCustomCells]',\n})\nexport class RtDataTableCustomCellsDirective<ENTITY_TYPE> {\n public readonly cellsTemplates: InputSignal<{\n [K in keyof ENTITY_TYPE]?: TemplateRef<IRtDataTableRowContext<ENTITY_TYPE>>;\n }> = input.required({ alias: 'rtDataTableCustomCells' });\n\n public getTemplateByPropName(propName: keyof ENTITY_TYPE): TemplateRef<IRtDataTableRowContext<ENTITY_TYPE>> | null {\n return this.cellsTemplates()[propName] ?? null;\n }\n}\n\n/** Пункты меню строки: шаблон раскрывается в панели меню кита. */\n@Directive({\n selector: '[rtDataTableRowActions]',\n})\nexport class RtDataTableRowActionsDirective {}\n\n/** Действия строки рядом с кнопкой меню: шаблон рисуется в полосе действий. */\n@Directive({\n selector: '[rtDataTableAdditionalRowActions]',\n})\nexport class RtDataTableAdditionalRowActionsDirective {}\n","/** Ключи записей списка. */\nexport function dataTableKeysOf<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n entities: ReadonlyArray<ENTITY_TYPE>,\n keyExp: KEY\n): Array<ENTITY_TYPE[KEY]> {\n return entities.map((entity: ENTITY_TYPE) => entity[keyExp]);\n}\n\n/** Записи страницы, добавленные к отмеченным; повторов не будет. */\nexport function dataTableWithPageEntities<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n selected: ReadonlyArray<ENTITY_TYPE>,\n page: ReadonlyArray<ENTITY_TYPE>,\n keyExp: KEY\n): ENTITY_TYPE[] {\n const keys: Array<ENTITY_TYPE[KEY]> = dataTableKeysOf(selected, keyExp);\n\n return [...selected, ...page.filter((entity: ENTITY_TYPE) => !keys.includes(entity[keyExp]))];\n}\n\n/** Отмеченные без записей страницы. */\nexport function dataTableWithoutPageEntities<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n selected: ReadonlyArray<ENTITY_TYPE>,\n page: ReadonlyArray<ENTITY_TYPE>,\n keyExp: KEY\n): ENTITY_TYPE[] {\n const keys: Array<ENTITY_TYPE[KEY]> = dataTableKeysOf(page, keyExp);\n\n return selected.filter((entity: ENTITY_TYPE) => !keys.includes(entity[keyExp]));\n}\n\n/** Отмеченные после отметки или снятия одной записи. */\nexport function dataTableWithEntity<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n selected: ReadonlyArray<ENTITY_TYPE>,\n entity: ENTITY_TYPE,\n checked: boolean,\n keyExp: KEY\n): ENTITY_TYPE[] {\n const without: ENTITY_TYPE[] = selected.filter((el: ENTITY_TYPE) => el[keyExp] !== entity[keyExp]);\n\n return checked ? [...without, entity] : without;\n}\n\n/** Хоть одна запись страницы отмечена. */\nexport function dataTableAnyOnPage<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n page: ReadonlyArray<ENTITY_TYPE>,\n selectedKeys: ReadonlyArray<ENTITY_TYPE[KEY]>,\n keyExp: KEY\n): boolean {\n return page.some((entity: ENTITY_TYPE) => selectedKeys.includes(entity[keyExp]));\n}\n\n/** Отмечены все записи страницы; пустая страница у первого кита считается отмеченной целиком. */\nexport function dataTableAllOnPage<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n page: ReadonlyArray<ENTITY_TYPE>,\n selectedKeys: ReadonlyArray<ENTITY_TYPE[KEY]>,\n keyExp: KEY\n): boolean {\n return page.every((entity: ENTITY_TYPE) => selectedKeys.includes(entity[keyExp]));\n}\n\n/** Записи первой страницы, чьи ключи названы приложением как отмеченные заранее. */\nexport function dataTablePresetEntities<ENTITY_TYPE, KEY extends keyof ENTITY_TYPE>(\n entities: ReadonlyArray<ENTITY_TYPE>,\n keys: ReadonlyArray<ENTITY_TYPE[KEY]>,\n keyExp: KEY\n): ENTITY_TYPE[] {\n return entities.filter((entity: ENTITY_TYPE) => keys.includes(entity[keyExp]));\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewChecked,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n ElementRef,\n forwardRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { EFilterOperatorType, ISortModel, TNullable, transformArrayInput } from '@rt-tools/utils';\n\nimport { IRtKitConfig } from '@rt-tools/ui-kit-v2/core';\nimport { rtKitDefault } from '@rt-tools/ui-kit-v2/core';\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\nimport { RtCheckboxComponent } from '@rt-tools/ui-kit-v2/checkbox';\nimport { RtMenuComponent } from '@rt-tools/ui-kit-v2/menu';\nimport { RtRadioButtonComponent } from '@rt-tools/ui-kit-v2/radio-button';\nimport { RtDataTableCellComponent } from './cell/rt-data-table-cell.component';\nimport { RtDataTableFilterCellComponent } from './filter-cell/rt-data-table-filter-cell.component';\nimport { RtDataTableHeaderCellComponent } from './header-cell/rt-data-table-header-cell.component';\nimport {\n IRtDataTableRowContext,\n RtDataTableAdditionalRowActionsDirective,\n RtDataTableCustomCellsDirective,\n RtDataTableRowActionsDirective,\n} from './rt-data-table-cells.directive';\nimport { RtDataTableConfigService } from './rt-data-table-config.service';\nimport { RtDataTableIconDirective } from './rt-data-table-icon.directive';\nimport { dataTableAriaSort, TRtDataTableAriaSort } from './rt-data-table-sort.logic';\nimport { RT_DATA_TABLE_ROW_HOST, RtDataTableRowClickDirective } from './rt-data-table-row-click.directive';\nimport {\n ERtDataTableColumnType,\n IRtDataTable,\n RT_DATA_TABLE_PRESET_FROM_HOST,\n RT_PRESET_MATERIAL_CLASS,\n TRtDataTableFilters,\n} from '@rt-tools/ui-kit-v2/core';\n\nconst BEM_BLOCK: string = 'rt-data-table';\n\n/**\n * Таблица записей первого кита во втором — без Material.\n *\n * Колонки берутся у службы настроек, строки приходят входом. Таблица рисует шапку, строку\n * отбора, готовые или пользовательские ячейки, колонку выбора флажком либо радиокнопкой и полосу\n * действий в конце строки. Своего отбора и своего порядка она не ведёт: обо всём просит\n * приложение. Отметками строк занимается директива выбора — она ставит их сюда.\n */\n@Component({\n selector: 'rt-data-table',\n templateUrl: './rt-data-table.component.html',\n styleUrl: './rt-data-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // components\n RtCheckboxComponent,\n RtDataTableCellComponent,\n RtDataTableFilterCellComponent,\n RtDataTableHeaderCellComponent,\n RtMenuComponent,\n RtRadioButtonComponent,\n\n // directives\n BlockDirective,\n ElemDirective,\n FormsModule,\n ModDirective,\n NgTemplateOutlet,\n RtDataTableRowClickDirective,\n ],\n host: { class: BEM_BLOCK, '[class.rt-preset-material]': \"look() === 'material' && !presetFromHost\" },\n providers: [{ provide: RT_DATA_TABLE_ROW_HOST, useExisting: forwardRef(() => RtDataTableComponent) }],\n})\nexport class RtDataTableComponent<\n ENTITY_TYPE extends Record<string, unknown>,\n SORT_PROPERTY extends Extract<keyof ENTITY_TYPE, string>,\n KEY extends Extract<keyof ENTITY_TYPE, string>,\n> implements AfterViewChecked {\n readonly #configService: RtDataTableConfigService<ENTITY_TYPE> = inject(RtDataTableConfigService);\n\n /* Вид считается из настроек при объявлении входа: вход в разметке по-прежнему перебивает всё. */\n readonly #look: IRtDataTable.Look = rtKitDefault(\n 'dataTable',\n (it: IRtKitConfig.DataTable): IRtDataTable.Look | undefined => it.look,\n 'material'\n );\n\n /** Полоса действий и две ячейки, которым она отдаёт свою ширину, — приём первого кита. */\n protected readonly rowActionsRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('rowActions');\n protected readonly headerSpacerRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('headerSpacer');\n protected readonly rowSpacerRef: Signal<TNullable<ElementRef<HTMLElement>>> = viewChild<ElementRef<HTMLElement>>('rowSpacer');\n\n protected readonly columnTypes: typeof ERtDataTableColumnType = ERtDataTableColumnType;\n\n /** Набор даёт узел вокруг — список; тогда класс набора на самой таблице не ставится. */\n protected readonly presetFromHost: boolean = inject(RT_DATA_TABLE_PRESET_FROM_HOST, { optional: true }) ?? false;\n\n /** Классы меню строки: оно открывается поверх страницы и вид семьи получает от неё. */\n protected readonly menuPanelClass: Signal<string[]> = computed(() => (this.look() === 'material' ? [RT_PRESET_MATERIAL_CLASS] : []));\n\n protected readonly actionsLabel: Signal<string> = rtKitLabel('dataTableActions');\n protected readonly selectRowLabel: Signal<string> = rtKitLabel('dataTableSelectRow');\n protected readonly selectPageLabel: Signal<string> = rtKitLabel('dataTableSelectPage');\n\n /** Полоса действий рисуется, когда приложение дало меню строки или действия рядом с ним. */\n protected readonly hasRowActions: Signal<boolean> = computed(() => !!this.rowActionsTpl() || !!this.additionalRowActionsTpl());\n\n protected readonly visibleColumns: Signal<Array<IRtDataTable.Column<ENTITY_TYPE>>> = computed(() =>\n this.columns().filter((column: IRtDataTable.Column<ENTITY_TYPE>) => !column.hidden)\n );\n\n /** `aria-sort` каждой показанной колонки по её имени: шаблон читает готовое, а не зовёт расчёт. */\n protected readonly ariaSorts: Signal<Readonly<Record<string, TRtDataTableAriaSort | null>>> = computed(() =>\n Object.fromEntries(\n this.visibleColumns().map((column: IRtDataTable.Column<ENTITY_TYPE>): [string, TRtDataTableAriaSort | null] => [\n column.propName,\n dataTableAriaSort(column.sorting, this.currentSortModel()),\n ])\n )\n );\n\n /** Колонки — из службы настроек: их порядок и видимость помнит она. */\n /** Вид полей отбора: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n /**\n * Вид семьи. Материальный набор стоит на самом узле, а не на странице: семья выглядит как первый\n * кит, где бы её ни поставили, и соседи на странице своего вида не теряют.\n */\n public readonly look: InputSignal<IRtDataTable.Look> = input<IRtDataTable.Look>(this.#look);\n\n public readonly filterAppearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly columns: Signal<Array<IRtDataTable.Column<ENTITY_TYPE>>> = computed(() => this.#configService.tableConfig().columns);\n\n public readonly isTableRowsClickable: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n /** Свойство, которым записи отличаются друг от друга. */\n public readonly keyExp: InputSignal<NonNullable<KEY>> = input('id' as NonNullable<KEY>);\n\n public readonly entities: InputSignalWithTransform<ENTITY_TYPE[], ENTITY_TYPE[] | null | undefined> = input.required<\n ENTITY_TYPE[],\n ENTITY_TYPE[] | null | undefined\n >({ transform: transformArrayInput });\n\n public readonly currentSortModel: InputSignal<TNullable<ISortModel<SORT_PROPERTY>>> =\n input.required<TNullable<ISortModel<SORT_PROPERTY>>>();\n\n /**\n * Условия отбора. Их ключ — имя свойства колонки, а не ключ записи: отбирают по колонке, и\n * ключ записи здесь оказался бы уже нужного — строка отбора зовёт ячейку именем колонки.\n */\n public readonly filterModel: InputSignalWithTransform<TRtDataTableFilters<ENTITY_TYPE>, TNullable<TRtDataTableFilters<ENTITY_TYPE>>> =\n input<TRtDataTableFilters<ENTITY_TYPE>, TNullable<TRtDataTableFilters<ENTITY_TYPE>>>([], { transform: transformArrayInput });\n\n public readonly isFiltersShown: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n public readonly rowClick: OutputEmitterRef<{ row: ENTITY_TYPE; event: MouseEvent }> = output<{ row: ENTITY_TYPE; event: MouseEvent }>();\n public readonly rowDoubleClick: OutputEmitterRef<ENTITY_TYPE> = output<ENTITY_TYPE>();\n public readonly sortChange: OutputEmitterRef<ISortModel<SORT_PROPERTY>> = output<ISortModel<SORT_PROPERTY>>();\n public readonly filterChange: OutputEmitterRef<TRtDataTableFilters<ENTITY_TYPE>> = output<TRtDataTableFilters<ENTITY_TYPE>>();\n\n public readonly customCellsTpl: Signal<TNullable<RtDataTableCustomCellsDirective<ENTITY_TYPE>>> =\n contentChild(RtDataTableCustomCellsDirective);\n\n public readonly rowActionsTpl: Signal<TNullable<TemplateRef<IRtDataTableRowContext<ENTITY_TYPE>>>> = contentChild(\n RtDataTableRowActionsDirective,\n { read: TemplateRef }\n );\n\n public readonly additionalRowActionsTpl: Signal<TNullable<TemplateRef<IRtDataTableRowContext<ENTITY_TYPE>>>> = contentChild(\n RtDataTableAdditionalRowActionsDirective,\n { read: TemplateRef }\n );\n\n /** Шаблон значка приложения: его получают и шапка, и готовая ячейка. */\n public readonly iconTpl: Signal<TNullable<RtDataTableIconDirective<ENTITY_TYPE>>> = contentChild(RtDataTableIconDirective);\n\n /** Ключи отмеченных записей; их ставит директива выбора. */\n public readonly selectedEntitiesIds: WritableSignal<ENTITY_TYPE[KEY][]> = signal([]);\n public readonly isPageEntitiesSelected: WritableSignal<boolean> = signal(false);\n public readonly isPageEntitiesIndeterminate: WritableSignal<boolean> = signal(false);\n public readonly isMultiSelect: WritableSignal<boolean> = signal(true);\n public readonly isSelectorsColumnShown: WritableSignal<boolean> = signal(false);\n public readonly isSelectorsColumnDisabled: WritableSignal<boolean> = signal(false);\n\n /** Строка с открытым меню; у первого кита она подсвечена, пока меню открыто. */\n public readonly activeRowIndex: WritableSignal<TNullable<number>> = signal(null);\n\n /** Отметить запись; метод ставит директива выбора, без неё колонки выбора нет вовсе. */\n public onToggleEntity: (entity: ENTITY_TYPE, checked: boolean) => void = (): void => undefined;\n\n /** Отметить все строки показанной страницы; метод ставит директива выбора. */\n public onTogglePageEntities: (checked: boolean) => void = (): void => undefined;\n\n public ngAfterViewChecked(): void {\n this.#syncSpacerWidth();\n }\n\n /**\n * Имя колонки приходит строкой, а наружу уходит ключом домена: приведение сверяется с тем же\n * набором колонок, который рисует таблица. Несовпавшее не отдаётся вовсе — приём первого кита.\n */\n public onSortChange(sortModel: ISortModel<string>): void {\n const names: string[] = this.columns().map((column: IRtDataTable.Column<ENTITY_TYPE>) => String(column.propName));\n\n if (names.includes(sortModel.propertyName)) {\n this.sortChange.emit({ ...sortModel, propertyName: sortModel.propertyName as SORT_PROPERTY });\n }\n }\n\n public onFilterChange(filterModel: TRtDataTableFilters<ENTITY_TYPE>): void {\n this.filterChange.emit(filterModel);\n }\n\n public onRowClick(row: ENTITY_TYPE, event: MouseEvent): void {\n this.rowClick.emit({ row, event });\n }\n\n public onRowDoubleClick(row: ENTITY_TYPE): void {\n this.rowDoubleClick.emit(row);\n }\n\n protected onMenuOpenedChange(index: number, opened: boolean): void {\n this.activeRowIndex.set(opened ? index : null);\n }\n\n protected defaultOperator(column: IRtDataTable.Column<ENTITY_TYPE>): IRtDataTable.Column<ENTITY_TYPE>['defaultFilterOperator'] {\n return column.defaultFilterOperator ?? EFilterOperatorType.EQUALS;\n }\n\n /**\n * Полоса действий висит над концом строки, и место под неё держат две пустые ячейки — в\n * шапке и в строке. Ширину им таблица ставит по ширине самой полосы, как первый кит.\n */\n #syncSpacerWidth(): void {\n const strip: TNullable<HTMLElement> = this.rowActionsRef()?.nativeElement;\n\n if (!strip) {\n return;\n }\n\n const width: string = `${strip.offsetWidth}px`;\n\n [this.headerSpacerRef()?.nativeElement, this.rowSpacerRef()?.nativeElement].forEach((spacer: TNullable<HTMLElement>) => {\n if (spacer && spacer.style.width !== width) {\n spacer.style.width = width;\n }\n });\n }\n}\n","<ng-container rtBlock=\"rt-data-table\">\n <table rtElem=\"table\">\n <thead rtElem=\"head\">\n <tr>\n @if (isSelectorsColumnShown()) {\n <th rtElem=\"cell\" [rtMod]=\"{ head: true, selectable: true }\">\n @if (isMultiSelect()) {\n <rt-checkbox\n qa-dataid=\"data-table-page-checkbox\"\n [ariaLabel]=\"selectPageLabel()\"\n [disabled]=\"isSelectorsColumnDisabled()\"\n [indeterminate]=\"isPageEntitiesIndeterminate() && !isPageEntitiesSelected()\"\n [ngModel]=\"isPageEntitiesSelected()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onTogglePageEntities($event)\" />\n }\n </th>\n }\n\n @for (column of visibleColumns(); track column.propName) {\n <th\n rtElem=\"cell\"\n qa-dataid=\"data-table-header-cell\"\n [attr.aria-sort]=\"ariaSorts()[column.propName]\"\n [rtMod]=\"{ head: true, sortable: !!column.sorting }\">\n <rt-data-table-header-cell\n [headerModel]=\"column.header\"\n [sortModel]=\"column.sorting\"\n [currentSortModel]=\"currentSortModel()\"\n [column]=\"column\"\n [iconTemplate]=\"iconTpl()?.template ?? null\"\n (sortChange)=\"onSortChange($event)\" />\n </th>\n }\n\n @if (hasRowActions()) {\n <th #headerSpacer rtElem=\"cell\" qa-dataid=\"data-table-actions-header\" [rtMod]=\"{ head: true }\">{{ actionsLabel() }}</th>\n }\n </tr>\n\n @if (isFiltersShown()) {\n <tr qa-dataid=\"data-table-filter-row\">\n @if (isSelectorsColumnShown()) {\n <th rtElem=\"cell\" [rtMod]=\"{ head: true, filterable: true, empty: true }\"></th>\n }\n\n @for (column of visibleColumns(); track column.propName) {\n <th rtElem=\"cell\" [rtMod]=\"{ head: true, filterable: true }\">\n @if (column.filterType; as filterType) {\n <rt-data-table-filter-cell\n [filterProperty]=\"column.propName\"\n [filterType]=\"filterType\"\n [filterModel]=\"filterModel()\"\n [defaultFilterOperator]=\"column.defaultFilterOperator\"\n [filterOperators]=\"column.filterOperators\"\n [filterSelectOptions]=\"column.filterSelectOptions\"\n [appearance]=\"filterAppearance()\"\n (filterChange)=\"onFilterChange($event)\" />\n }\n </th>\n }\n\n @if (hasRowActions()) {\n <th rtElem=\"cell\" [rtMod]=\"{ head: true, filterable: true }\"></th>\n }\n </tr>\n }\n </thead>\n\n <tbody>\n @for (row of entities(); track row[keyExp()]; let index = $index) {\n <tr\n rtElem=\"row\"\n qa-dataid=\"data-table-row\"\n [rtDataTableRowClick]=\"row\"\n [isTableRowClickable]=\"isTableRowsClickable()\"\n [rtMod]=\"{ clickable: isTableRowsClickable(), active: activeRowIndex() === index }\">\n @if (isSelectorsColumnShown()) {\n <td rtElem=\"cell\" [rtMod]=\"{ selectable: true }\" [attr.rt-data-table-stop-row-click]=\"''\">\n @if (isMultiSelect()) {\n <rt-checkbox\n qa-dataid=\"data-table-row-checkbox\"\n [ariaLabel]=\"selectRowLabel()\"\n [disabled]=\"isSelectorsColumnDisabled()\"\n [ngModel]=\"selectedEntitiesIds().includes(row[keyExp()])\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onToggleEntity(row, $event)\" />\n } @else {\n <rt-radio-button\n qa-dataid=\"data-table-row-radio\"\n [value]=\"row[keyExp()]\"\n [ariaLabel]=\"selectRowLabel()\"\n [disabled]=\"isSelectorsColumnDisabled()\"\n [checked]=\"selectedEntitiesIds().includes(row[keyExp()])\"\n (checkedChange)=\"onToggleEntity(row, true)\" />\n }\n </td>\n }\n\n @for (column of visibleColumns(); track column.propName) {\n <td rtElem=\"cell\" qa-dataid=\"data-table-cell\" [rtMod]=\"{ copyable: !!column.copyable }\">\n @if (column.type === columnTypes.CUSTOM) {\n <ng-container\n [ngTemplateOutlet]=\"customCellsTpl()?.getTemplateByPropName(column.propName) ?? null\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n } @else {\n <rt-data-table-cell [row]=\"row\" [column]=\"column\" [iconTemplate]=\"iconTpl()?.template ?? null\" />\n }\n </td>\n }\n\n @if (hasRowActions()) {\n <td #rowSpacer rtElem=\"cell\" [rtMod]=\"{ spacer: true }\"></td>\n\n <div rtBlock=\"rt-data-table-actions\" [rtMod]=\"{ hidden: activeRowIndex() !== index }\">\n <div #rowActions rtElem=\"container\" qa-dataid=\"data-table-actions\">\n @if (additionalRowActionsTpl(); as additional) {\n <ng-container [ngTemplateOutlet]=\"additional\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n }\n\n @if (rowActionsTpl(); as actions) {\n <rt-menu\n rtElem=\"action\"\n qa-dataid=\"data-table-row-menu\"\n icon=\"ellipsis-v\"\n size=\"sm\"\n [panelClass]=\"menuPanelClass()\"\n [attr.rt-data-table-stop-row-click]=\"''\"\n [ariaLabel]=\"actionsLabel()\"\n (openedChange)=\"onMenuOpenedChange(index, $event)\">\n <ng-container [ngTemplateOutlet]=\"actions\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n }\n </div>\n </div>\n }\n </tr>\n }\n </tbody>\n </table>\n</ng-container>\n","import {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n effect,\n inject,\n Injector,\n input,\n InputSignalWithTransform,\n OnInit,\n Signal,\n signal,\n untracked,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { filter, switchMap, take } from 'rxjs/operators';\n\nimport { transformArrayInput } from '@rt-tools/utils';\n\nimport { RtDataTableComponent } from './rt-data-table.component';\nimport {\n dataTableAllOnPage,\n dataTableAnyOnPage,\n dataTableKeysOf,\n dataTablePresetEntities,\n dataTableWithEntity,\n dataTableWithoutPageEntities,\n dataTableWithPageEntities,\n} from './rt-data-table-selection.logic';\n\n/**\n * Выбор строк таблицы `rt-data-table` — колонка выбора первого кита.\n *\n * Директива ведёт отметки и ставит таблице всё, что та рисует: ключи отмеченных, состояние\n * флажка страницы и признаки колонки выбора. Приложение читает отмеченные записи целиком —\n * запись, отмеченная на странице, которой уже нет на экране, остаётся отмеченной.\n */\n@Directive({\n selector: 'rt-data-table[rtDataTableSelectors]',\n})\nexport class RtDataTableSelectorsDirective<\n ENTITY_TYPE extends Record<string, unknown>,\n SORT_PROPERTY extends Extract<keyof ENTITY_TYPE, string>,\n KEY extends Extract<keyof ENTITY_TYPE, string>,\n> implements OnInit {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #injector: Injector = inject(Injector);\n readonly #table: RtDataTableComponent<ENTITY_TYPE, SORT_PROPERTY, KEY> =\n inject<RtDataTableComponent<ENTITY_TYPE, SORT_PROPERTY, KEY>>(RtDataTableComponent);\n\n readonly #selectedEntities: WritableSignal<ENTITY_TYPE[]> = signal([]);\n readonly #isPageEntitiesSelected: WritableSignal<boolean> = signal(false);\n readonly #isPageEntitiesIndeterminate: WritableSignal<boolean> = signal(false);\n\n public readonly isMultiSelect: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(true, {\n transform: booleanAttribute,\n });\n\n public readonly isSelectorColumnShown: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n public readonly isSelectorsColumnDisabled: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n /** Ключи записей, отмеченных заранее; они применяются один раз — к первым пришедшим строкам. */\n public readonly selectedEntitiesKeys: InputSignalWithTransform<ENTITY_TYPE[KEY][], ENTITY_TYPE[KEY][] | null | undefined> = input<\n ENTITY_TYPE[KEY][],\n ENTITY_TYPE[KEY][] | null | undefined\n >([], { transform: transformArrayInput });\n\n /** Отмеченные записи целиком. */\n public readonly selectedEntities: Signal<ENTITY_TYPE[]> = this.#selectedEntities.asReadonly();\n\n public readonly selectedEntitiesIds: Signal<ENTITY_TYPE[KEY][]> = computed(() =>\n dataTableKeysOf(this.selectedEntities(), this.#keyExp())\n );\n\n public readonly isPageEntitiesSelected: Signal<boolean> = this.#isPageEntitiesSelected.asReadonly();\n public readonly isPageEntitiesIndeterminate: Signal<boolean> = this.#isPageEntitiesIndeterminate.asReadonly();\n\n constructor() {\n this.#table.onToggleEntity = (entity: ENTITY_TYPE, checked: boolean): void => this.toggleEntity(entity, checked);\n this.#table.onTogglePageEntities = (checked: boolean): void => this.togglePageEntities(checked);\n\n /* Отметки ведёт директива, а рисует их таблица: каждое значение переливается в её поле.\n Обратного хода нет — таблица сама их не меняет. */\n effect(() => this.#table.selectedEntitiesIds.set(this.selectedEntitiesIds()));\n effect(() => this.#table.isPageEntitiesSelected.set(this.isPageEntitiesSelected()));\n effect(() => this.#table.isPageEntitiesIndeterminate.set(this.isPageEntitiesIndeterminate()));\n effect(() => this.#table.isMultiSelect.set(this.isMultiSelect()));\n effect(() => this.#table.isSelectorsColumnShown.set(this.isSelectorColumnShown()));\n effect(() => this.#table.isSelectorsColumnDisabled.set(this.isSelectorsColumnDisabled()));\n\n /* Новая страница — новый флажок страницы: он считается по её строкам, а не остаётся от\n прежней. Отметки читаются без слежки — пересчёт идёт только на смену строк. */\n effect(() => {\n this.#table.entities();\n untracked(() => this.setExistingEntitiesState());\n });\n }\n\n public ngOnInit(): void {\n /** Отметки, названные заранее, ставятся один раз: к первым непустым строкам. */\n toObservable(this.#table.entities, { injector: this.#injector })\n .pipe(\n filter((entities: ENTITY_TYPE[]) => !!entities.length),\n take(1),\n switchMap(() =>\n toObservable(this.selectedEntitiesKeys, { injector: this.#injector }).pipe(\n filter((keys: ENTITY_TYPE[KEY][]) => !!keys.length),\n take(1)\n )\n ),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe(() => {\n this.#selectedEntities.set(dataTablePresetEntities(this.#table.entities(), this.selectedEntitiesKeys(), this.#keyExp()));\n this.setExistingEntitiesState();\n });\n }\n\n /** Отметить или снять все строки показанной страницы; других отметок это не трогает. */\n public togglePageEntities(checked: boolean): void {\n const page: ENTITY_TYPE[] = this.#table.entities();\n\n this.#isPageEntitiesSelected.set(checked);\n this.#selectedEntities.update((selected: ENTITY_TYPE[]) =>\n checked\n ? dataTableWithPageEntities(selected, page, this.#keyExp())\n : dataTableWithoutPageEntities(selected, page, this.#keyExp())\n );\n this.#isPageEntitiesIndeterminate.set(dataTableAnyOnPage(page, this.selectedEntitiesIds(), this.#keyExp()));\n }\n\n /** Отметить или снять одну запись; при выборе по одной прежняя отметка уходит. */\n public toggleEntity(entity: ENTITY_TYPE, checked: boolean): void {\n if (!this.isMultiSelect()) {\n this.#selectedEntities.set([entity]);\n\n return;\n }\n\n this.#selectedEntities.update((selected: ENTITY_TYPE[]) => dataTableWithEntity(selected, entity, checked, this.#keyExp()));\n\n const page: ENTITY_TYPE[] = this.#table.entities();\n const keys: ENTITY_TYPE[KEY][] = this.selectedEntitiesIds();\n\n if (keys.length) {\n this.#isPageEntitiesSelected.set(dataTableAllOnPage(page, keys, this.#keyExp()));\n this.#isPageEntitiesIndeterminate.set(true);\n } else {\n this.#isPageEntitiesSelected.set(false);\n this.#isPageEntitiesIndeterminate.set(dataTableAnyOnPage(page, keys, this.#keyExp()));\n }\n }\n\n /** Снять все отметки. */\n public clearSelectedList(): void {\n this.#selectedEntities.set([]);\n this.#isPageEntitiesSelected.set(false);\n this.#isPageEntitiesIndeterminate.set(false);\n }\n\n /**\n * Пересчитать флажок страницы по показанным строкам: отмечен, когда отмечены все строки\n * страницы, промежуточен, когда отмечена часть. Отметки других страниц здесь не в счёт.\n */\n public setExistingEntitiesState(): void {\n const page: ENTITY_TYPE[] = this.#table.entities();\n const keys: ENTITY_TYPE[KEY][] = this.selectedEntitiesIds();\n\n const all: boolean = !!page.length && dataTableAllOnPage(page, keys, this.#keyExp());\n\n this.#isPageEntitiesSelected.set(all);\n this.#isPageEntitiesIndeterminate.set(!all && dataTableAnyOnPage(page, keys, this.#keyExp()));\n }\n\n #keyExp(): KEY {\n return this.#table.keyExp();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["BEM_BLOCK"],"mappings":"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"}
|