@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-table.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/table/copy-cell/rt-copy-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/copy-cell/rt-copy-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-sort.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-columns.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-filter.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/filter-header/rt-table-filter-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/filter-header/rt-table-filter-header.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-card.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-cards.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-card-activation.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.pipe.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-settings.persistence.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-settings.registry.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-column-settings.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table.component.html","../../../projects/ui-kit-v2/src/lib/components/table/sort-header/rt-table-sort-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/sort-header/rt-table-sort-header.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-panel/rt-table-settings-panel.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-panel/rt-table-settings-panel.component.html","../../../projects/ui-kit-v2/src/lib/components/table/settings-aside/rt-table-settings-aside.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-aside/rt-table-settings-aside.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-tools-ui-kit-v2-table.ts"],"sourcesContent":["import { Clipboard } from '@angular/cdk/clipboard';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n signal,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { TRtKitLabelKey, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtIconButton } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\n\nconst BEM_BLOCK: string = 'rt-copy-cell';\n\n/** Значение для буфера: явная строка/число либо `null` (тогда берётся отображаемый текст). */\ntype TCopyValue = string | number | null;\n\n/**\n * Ключи подписей действия в покое и после копирования (tooltip и aria-label).\n *\n * Здесь ключи, а не готовый текст: константа вычисляется при загрузке чанка,\n * когда язык страницы ещё не выбран, — переводит сам компонент.\n */\nconst COPY_KEY: TRtKitLabelKey = 'uiCopy';\nconst COPIED_KEY: TRtKitLabelKey = 'uiCopied';\n\n/** Сколько держать состояние «скопировано» перед сбросом иконки/подписи. */\nconst RESET_DELAY_MS: number = 2000;\n\n/**\n * Ячейка с копированием в буфер — переиспользуемый примитив для `cdkCellDef`\n * (и не только). rt-table projection-driven: контент ячейки пишет\n * потребитель, поэтому копирование оформлено отдельным cell-level компонентом,\n * а не флагом на конфиге колонки.\n *\n * Потребитель проецирует отображаемый контент через `<ng-content>`. Что уйдёт в\n * буфер:\n * - если задан `[value]` — ровно он (нужно когда копируемое отличается от\n * отображаемого: для id-ячейки показываем `#123`, копируем `123`);\n * - если `[value]` не задан — берётся отображаемый текст (textContent\n * проецируемого контента, схлопнутые пробелы) — «копировать как показано»,\n * удобно для составных ячеек (`#7 — Имя`).\n *\n * По умолчанию кнопка скрыта и проявляется при наведении/фокусе (для плотных\n * таблиц). Вне таблиц (модалки, карточки) строки для hover нет — там\n * `revealOnHover=\"false\"` держит кнопку всегда видимой. Палитра кнопки —\n * через `variant` (по умолчанию `ghost`). После клика на `RESET_DELAY_MS`\n * иконка меняется `copy`→`check`, подпись — на «Скопировано».\n */\n@Component({\n selector: 'rt-copy-cell',\n templateUrl: './rt-copy-cell.component.html',\n styleUrls: ['./rt-copy-cell.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n RtTooltipDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-copy-cell--static]': '!revealOnHover()',\n '(mouseenter)': 'measureTruncation()',\n '(focusin)': 'measureTruncation()',\n },\n})\nexport class RtCopyCellComponent {\n readonly #clipboard: Clipboard = inject(Clipboard);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n #resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly #copyLabel: Signal<string> = rtKitLabel(COPY_KEY);\n readonly #copiedLabel: Signal<string> = rtKitLabel(COPIED_KEY);\n\n protected readonly copied: WritableSignal<boolean> = signal(false);\n\n /**\n * Подсказка со значением целиком — только у обрезанного.\n *\n * У помещающегося она повторяла бы то, что человек и так читает, и всплывала бы над каждой\n * ячейкой таблицы; пустая строка директиву подсказки выключает.\n */\n protected readonly hint: WritableSignal<string> = signal('');\n\n protected readonly iconName: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => (this.copied() ? 'check' : 'copy'));\n\n protected readonly actionLabel: Signal<string> = computed((): string => (this.copied() ? this.#copiedLabel() : this.#copyLabel()));\n\n /**\n * Строка для буфера. Если не задана — копируется отображаемый текст\n * (textContent проецируемого контента). Число приводится к строке.\n */\n public readonly value: InputSignal<TCopyValue> = input<TCopyValue>(null);\n\n /** Палитра кнопки копирования. В таблицах — `ghost`; вне таблиц удобнее `secondary`. */\n public readonly variant: InputSignal<IRtIconButton.Variant> = input<IRtIconButton.Variant>('ghost');\n\n /**\n * Прятать кнопку до наведения/фокуса (поведение плотных таблиц). `false` —\n * кнопка всегда видима: нужно вне таблиц (модалки/карточки), где нет строки\n * для hover.\n */\n public readonly revealOnHover: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n constructor() {\n this.#destroyRef.onDestroy((): void => this.#clearTimer());\n }\n\n /**\n * Замер обрезки в момент наведения.\n *\n * Ширина известна только отрисованному узлу, а меняется она и от переезда столбца, и от\n * ширины окна: посчитанная один раз при заведении, она соврала бы при первом же изменении.\n */\n protected measureTruncation(): void {\n const content: HTMLElement | null = this.#host.nativeElement.querySelector(`.${BEM_BLOCK}__content`);\n const truncated: boolean = content !== null && content.scrollWidth > content.clientWidth;\n\n this.hint.set(truncated ? this.#displayedText() : '');\n }\n\n protected onCopy(event: MouseEvent): void {\n // Гасим всплытие, чтобы клик/Enter по кнопке не активировал кликабельную\n // строку (rtTableRow) и не дошёл до прочих row-level слушателей.\n event.stopPropagation();\n\n this.#clipboard.copy(this.#resolveText());\n this.copied.set(true);\n\n this.#clearTimer();\n this.#resetTimer = setTimeout((): void => this.copied.set(false), RESET_DELAY_MS);\n }\n\n /** Явный `value` приоритетнее; иначе — отображаемый текст со схлопнутыми пробелами. */\n #resolveText(): string {\n const explicit: TCopyValue = this.value();\n if (explicit !== null) {\n return String(explicit);\n }\n\n return this.#displayedText();\n }\n\n /** Отображаемый текст со схлопнутыми пробелами: он же уходит в подсказку обрезанного. */\n #displayedText(): string {\n const content: Element | null = this.#host.nativeElement.querySelector(`.${BEM_BLOCK}__content`);\n\n return (content?.textContent ?? '').replace(/\\s+/g, ' ').trim();\n }\n\n #clearTimer(): void {\n if (this.#resetTimer !== null) {\n clearTimeout(this.#resetTimer);\n this.#resetTimer = null;\n }\n }\n}\n","<ng-container rtBlock=\"rt-copy-cell\">\n <span rtElem=\"content\" qa-dataid=\"copy-cell-content\" [rtTooltip]=\"hint()\"><ng-content /></span>\n <rt-icon-button\n rtElem=\"button\"\n qa-dataid=\"copy-cell-button\"\n size=\"sm\"\n [icon]=\"iconName()\"\n [variant]=\"variant()\"\n [ariaLabel]=\"actionLabel()\"\n [tooltip]=\"actionLabel()\"\n (clicked)=\"onCopy($event)\" />\n</ng-container>\n","import { EListSortOrder, TListSortOrderType, ISortModel } from '@rt-tools/utils';\n\nimport { IRtTable } from './rt-table.model';\n\n/** Значение атрибута `aria-sort` заголовка: направление либо его отсутствие. */\nexport type TRtTableAriaSort = 'ascending' | 'descending' | 'none';\n\n/**\n * Следующее состояние сортировки при нажатии на заголовок колонки.\n *\n * Порядок кругов: по возрастанию → по убыванию → без сортировки. Третье состояние\n * нужно, чтобы пользователь мог вернуть исходный порядок, не перезагружая список.\n */\nexport function nextSort(current: ISortModel<string> | null, propertyName: string): ISortModel<string> | null {\n if (current === null || current.propertyName !== propertyName) {\n return { propertyName, sortDirection: EListSortOrder.ASC };\n }\n if (current.sortDirection === EListSortOrder.ASC) {\n return { propertyName, sortDirection: EListSortOrder.DESC };\n }\n\n return null;\n}\n\n/** Направление сортировки по этой колонке либо `null`, когда сортирует другая. */\nexport function sortDirectionOf(current: ISortModel<string> | null, propertyName: string): TListSortOrderType | null {\n return current !== null && current.propertyName === propertyName ? current.sortDirection : null;\n}\n\n/** Значение `aria-sort` заголовка: направление читается скринридером с самой колонки. */\nexport function ariaSortOf(current: ISortModel<string> | null, propertyName: string): TRtTableAriaSort {\n const direction: TListSortOrderType | null = sortDirectionOf(current, propertyName);\n if (direction === null) {\n return 'none';\n }\n\n return direction === EListSortOrder.ASC ? 'ascending' : 'descending';\n}\n\n/**\n * Сортируется ли колонка. Колонка, описанная в `columnsConfig`, сортируется только\n * по своему признаку; колонки, которой в конфиге нет, метаданных взять неоткуда —\n * объявлением служит сам заголовок.\n */\nexport function isColumnSortable(config: ReadonlyArray<IRtTable.ColumnConfig>, key: string): boolean {\n const column: IRtTable.ColumnConfig | undefined = config.find((candidate: IRtTable.ColumnConfig): boolean => candidate.key === key);\n\n return column === undefined ? true : column.sortable === true;\n}\n","import { IRtTable } from './rt-table.model';\n\n/** Имя внутренней «…»-колонки действий, добавляемой при `[showRowActions]`. */\nexport const RT_TABLE_ROW_ACTIONS_COLUMN: string = 'rtRowActions';\n\n/**\n * Колонки конфига без применённых настроек пользователя — источник для кнопки\n * «Сбросить» в панели. Закрытая колонка видима всегда: скрыть её панель не даёт.\n */\nexport function defaultColumnItems(config: ReadonlyArray<IRtTable.ColumnConfig>): ReadonlyArray<IRtTable.ColumnSettingItem> {\n return config.map((column: IRtTable.ColumnConfig): IRtTable.ColumnSettingItem => ({\n ...column,\n hidden: column.locked === true ? false : column.hidden === true,\n }));\n}\n\n/**\n * Разрешённые колонки настраиваемой таблицы: конфиг в применённом порядке с текущим\n * признаком скрытия.\n *\n * Порядок берётся из сохранённых настроек, а колонки, появившиеся в конфиге после\n * сохранения, встают в конец: настройки, снятые с прежнего состава, иначе прятали бы\n * новую колонку молча. Настроек нет — порядок и скрытие берутся из самого конфига.\n */\nexport function resolveColumns(\n config: ReadonlyArray<IRtTable.ColumnConfig>,\n settings: IRtTable.ColumnSettings | null\n): ReadonlyArray<IRtTable.ColumnSettingItem> {\n if (config.length === 0) {\n return [];\n }\n\n const byKey: Map<string, IRtTable.ColumnConfig> = new Map(\n config.map((column: IRtTable.ColumnConfig): [string, IRtTable.ColumnConfig] => [column.key, column])\n );\n\n const orderedKeys: ReadonlyArray<string> = settings\n ? [\n ...settings.order.filter((key: string): boolean => byKey.has(key)),\n ...config\n .filter((column: IRtTable.ColumnConfig): boolean => !settings.order.includes(column.key))\n .map((column: IRtTable.ColumnConfig): string => column.key),\n ]\n : config.map((column: IRtTable.ColumnConfig): string => column.key);\n\n const hiddenKeys: ReadonlySet<string> = new Set(\n settings\n ? settings.hidden\n : config\n .filter((column: IRtTable.ColumnConfig): boolean => column.hidden === true)\n .map((column: IRtTable.ColumnConfig): string => column.key)\n );\n\n return orderedKeys\n .map((key: string): IRtTable.ColumnConfig | undefined => byKey.get(key))\n .filter((column: IRtTable.ColumnConfig | undefined): column is IRtTable.ColumnConfig => column !== undefined)\n .map((column: IRtTable.ColumnConfig): IRtTable.ColumnSettingItem => ({\n ...column,\n hidden: column.locked === true ? false : hiddenKeys.has(column.key),\n }));\n}\n\n/**\n * Имена колонок для строк CDK: у настраиваемой таблицы — видимые в применённом порядке,\n * у остальных — то, что назвал вход `[columns]`. Колонка действий встаёт последней, когда\n * действия строки включены.\n */\nexport function displayedColumnKeys(\n resolved: ReadonlyArray<IRtTable.ColumnSettingItem>,\n legacyColumns: ReadonlyArray<string>,\n configurable: boolean,\n showRowActions: boolean\n): ReadonlyArray<string> {\n const base: ReadonlyArray<string> = configurable\n ? resolved\n .filter((column: IRtTable.ColumnSettingItem): boolean => !column.hidden)\n .map((column: IRtTable.ColumnSettingItem): string => column.key)\n : [...legacyColumns];\n\n return showRowActions ? [...base, RT_TABLE_ROW_ACTIONS_COLUMN] : [...base];\n}\n\n/**\n * Настройки панели, приведённые к конфигу: ключи закрытых колонок из списка скрытых\n * вычищаются. Панель их не предлагает, но настройки приезжают и из хранилища — снятые с\n * той поры, когда колонка закрытой ещё не была.\n */\nexport function withoutLockedHidden(\n config: ReadonlyArray<IRtTable.ColumnConfig>,\n settings: IRtTable.ColumnSettings\n): IRtTable.ColumnSettings {\n const lockedKeys: ReadonlySet<string> = new Set(\n config\n .filter((column: IRtTable.ColumnConfig): boolean => column.locked === true)\n .map((column: IRtTable.ColumnConfig): string => column.key)\n );\n\n return {\n order: [...settings.order],\n hidden: settings.hidden.filter((key: string): boolean => !lockedKeys.has(key)),\n };\n}\n","import { EFilterOperatorType, IFilterModel, TFilterOperatorType } from '@rt-tools/utils';\n\nimport { RT_TABLE_ROW_ACTIONS_COLUMN } from './rt-table-columns.logic';\nimport { IRtTable } from './rt-table.model';\n\n/** Значение условия в том виде, в каком оно хранится и сверяется. */\nexport type TRtTableFilterValue = string | number | boolean;\n\n/** Что приходит в ячейку от человека: дата приходит объектом, остальное — уже готовым значением. */\nexport type TRtTableFilterInput = TRtTableFilterValue | Date | null | undefined;\n\n/**\n * Значение в том виде, в каком оно хранится: дата — строкой.\n *\n * `Date` не равен строке никогда, и без приведения повторный выбор той же даты каждый раз\n * считался бы новым значением — а тогда статья «повтор того же значения не сообщает ничего»\n * не держалась бы именно там, где её проще всего нарушить.\n */\nexport function filterValueOf(value: TRtTableFilterInput): TRtTableFilterValue {\n return value instanceof Date ? value.toISOString() : (value ?? '');\n}\n\n/** Условие по этой колонке из набора либо `null`, когда колонка ничего не отбирает. */\nexport function filterOf(filters: readonly IFilterModel<string>[], propertyName: string): IFilterModel<string> | null {\n return filters.find((filter: IFilterModel<string>): boolean => filter.propertyName === propertyName) ?? null;\n}\n\n/**\n * Набор условий после перемены значения по одной колонке.\n *\n * Пустое значение снимает колонку с отбора, а не уходит пустым условием: условие без значения\n * просит потребителя ответить «подходит всё», и потребитель, прочитавший его буквально, не\n * вернёт ни одной строки.\n *\n * Возвращает прежний набор тем же объектом, когда менять нечего: по этому признаку ячейка и\n * решает, сообщать ли наружу.\n */\nexport function filtersWithValue(\n filters: readonly IFilterModel<string>[],\n propertyName: string,\n operatorType: TFilterOperatorType,\n value: TRtTableFilterValue\n): readonly IFilterModel<string>[] {\n const current: IFilterModel<string> | null = filterOf(filters, propertyName);\n\n if (value === '') {\n return current === null ? filters : filters.filter((filter: IFilterModel<string>): boolean => filter !== current);\n }\n\n if (current === null) {\n return [...filters, { propertyName, operatorType, value }];\n }\n\n if (current.value === value) {\n return filters;\n }\n\n return filters.map((filter: IFilterModel<string>): IFilterModel<string> => (filter === current ? { ...filter, value } : filter));\n}\n\n/**\n * Набор условий после перемены вида сравнения по одной колонке.\n *\n * Пока значения нет, менять вид сравнения не у чего: отбирать нечего, и набор условий не\n * изменился — значит, наружу ничего не уходит.\n */\nexport function filtersWithOperator(\n filters: readonly IFilterModel<string>[],\n propertyName: string,\n operatorType: TFilterOperatorType\n): readonly IFilterModel<string>[] {\n const current: IFilterModel<string> | null = filterOf(filters, propertyName);\n\n if (current === null || current.operatorType === operatorType) {\n return filters;\n }\n\n return filters.map((filter: IFilterModel<string>): IFilterModel<string> => (filter === current ? { ...filter, operatorType } : filter));\n}\n\n/** Вид сравнения, с которого колонка начинает: свой, первый разрешённый либо равенство. */\nexport function startOperatorOf(\n allowed: readonly TFilterOperatorType[] | undefined,\n start: TFilterOperatorType | undefined\n): TFilterOperatorType {\n if (start !== undefined) {\n return start;\n }\n\n return allowed !== undefined && allowed.length > 0 ? allowed[0] : EFilterOperatorType.EQUALS;\n}\n\n/**\n * Ячейки строки отбора: по ячейке на каждую показанную колонку, в том же порядке.\n *\n * У колонки без объявленного отбора ячейка пустая, и место своё она держит: убрать её значило бы\n * сдвинуть все следующие ячейки на одну колонку влево — поле города встало бы под шапкой цены.\n * Колонка действий строки приходит сюда тем же путём, последней, и отбора у неё нет никогда; её\n * ячейка помечена, чтобы строка отбора не дала ширины колонке, которая места не занимает.\n */\nexport function filterCellsOf(\n columns: ReadonlyArray<string>,\n config: ReadonlyArray<IRtTable.ColumnConfig>\n): ReadonlyArray<IRtTable.FilterCell> {\n return columns.map((key: string): IRtTable.FilterCell => {\n const column: IRtTable.ColumnConfig | undefined = config.find((item: IRtTable.ColumnConfig): boolean => item.key === key);\n\n return { key, filter: column?.filter ?? null, actions: key === RT_TABLE_ROW_ACTIONS_COLUMN };\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n InputSignal,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n output,\n untracked,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { EFilterOperatorType, IFilterModel, TFilterOperatorType } from '@rt-tools/utils';\n\nimport { TRtKitLabelKey } from '@rt-tools/ui-kit-v2/core';\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtDatePickerComponent } from '@rt-tools/ui-kit-v2/date-picker';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\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 { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { IRtSelect } from '@rt-tools/ui-kit-v2/select';\nimport { RtSelectComponent } from '@rt-tools/ui-kit-v2/select';\nimport {\n TRtTableFilterInput,\n TRtTableFilterValue,\n filterOf,\n filterValueOf,\n filtersWithOperator,\n filtersWithValue,\n startOperatorOf,\n} from '../rt-table-filter.logic';\nimport { IRtTable } from '../rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table-filter-header';\n\n/** Ключ подписи для каждого вида сравнения: имена операторов даёт словарь кита, а не шаблон. */\nconst OPERATOR_LABELS: Readonly<Record<TFilterOperatorType, TRtKitLabelKey>> = Object.freeze({\n [EFilterOperatorType.EQUALS]: 'uiFilterEquals',\n [EFilterOperatorType.NOT_EQUALS]: 'uiFilterNotEquals',\n [EFilterOperatorType.CONTAINS]: 'uiFilterContains',\n [EFilterOperatorType.STARTS_WITH]: 'uiFilterStartsWith',\n [EFilterOperatorType.ENDS_WITH]: 'uiFilterEndsWith',\n [EFilterOperatorType.GREATER_THAN]: 'uiFilterGreaterThan',\n [EFilterOperatorType.LESS_THAN]: 'uiFilterLessThan',\n});\n\n/**\n * Виды, у которых недописанного состояния нет вовсе: выбор и дата готовы в ту же минуту, что и\n * сделаны, и ждать ухода из поля значило бы задержать ответ на ровном месте. Текст и число ждут:\n * набор условий, уходящий на каждый знак, спрашивает сервер по букве.\n */\nconst INSTANT_KINDS: ReadonlySet<IRtTable.FilterKind> = new Set<IRtTable.FilterKind>(['select', 'date']);\n\n/** Одно и то же условие: колонка, вид сравнения и значение совпадают. */\nfunction sameFilter(a: IFilterModel<string> | null, b: IFilterModel<string> | null): boolean {\n if (a === null || b === null) {\n return a === b;\n }\n\n return a.propertyName === b.propertyName && a.operatorType === b.operatorType && a.value === b.value;\n}\n\n/** Один вид сравнения в списке: сам вид и его подпись из словаря. */\ninterface IOperatorView {\n readonly type: TFilterOperatorType;\n readonly label: string;\n}\n\n/** Виды сравнения по порядку: колонка разрешает своё подмножество, порядок берётся отсюда. */\nconst ALL_OPERATORS: readonly TFilterOperatorType[] = Object.freeze([\n EFilterOperatorType.EQUALS,\n EFilterOperatorType.NOT_EQUALS,\n EFilterOperatorType.CONTAINS,\n EFilterOperatorType.STARTS_WITH,\n EFilterOperatorType.ENDS_WITH,\n EFilterOperatorType.GREATER_THAN,\n EFilterOperatorType.LESS_THAN,\n]);\n\n/**\n * Отбор в шапке столбца таблицы.\n *\n * Стоит рядом с именем колонки: сужение, живущее в стороне от того, что сужает, не даёт увидеть,\n * какая колонка сузила список — человек читает короткий список и не узнаёт, почему он короткий.\n *\n * Своих полей не рисует ни одного: вид отбора решает, какую готовую часть кита позвать. Поля кита\n * ведутся формой, поэтому значение идёт через `FormControl`, а не входом со своим выходом.\n *\n * Наружу уходит весь набор условий, а не одно изменившееся: потребитель спрашивает сервер набором,\n * и, получив одно условие, держал бы вторую копию набора — две копии расходятся молча. Строк\n * семейство не отбирает: строки принадлежат тому, кто держит список.\n */\n@Component({\n selector: 'rt-table-filter-header',\n templateUrl: './rt-table-filter-header.component.html',\n styleUrl: './rt-table-filter-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n ReactiveFormsModule,\n\n // rt-tools\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // components\n RtDatePickerComponent,\n RtIconButtonComponent,\n RtInputComponent,\n RtInputNumberComponent,\n RtMenuItemComponent,\n RtPopoverDirective,\n RtSelectComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTableFilterHeaderComponent {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /**\n * Подпись каждого вида сравнения — своим сигналом словаря. Семь сигналов, а не один по\n * текущему виду: список показывает их все сразу, и подпись невыбранного вида нужна так же.\n */\n readonly #operatorLabels: Readonly<Record<TFilterOperatorType, Signal<string>>> = Object.freeze({\n [EFilterOperatorType.EQUALS]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.EQUALS]),\n [EFilterOperatorType.NOT_EQUALS]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.NOT_EQUALS]),\n [EFilterOperatorType.CONTAINS]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.CONTAINS]),\n [EFilterOperatorType.STARTS_WITH]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.STARTS_WITH]),\n [EFilterOperatorType.ENDS_WITH]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.ENDS_WITH]),\n [EFilterOperatorType.GREATER_THAN]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.GREATER_THAN]),\n [EFilterOperatorType.LESS_THAN]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.LESS_THAN]),\n });\n\n /** Значение ведёт форма: поля кита берут его только так. */\n protected readonly control: FormControl<TRtTableFilterInput> = new FormControl<TRtTableFilterInput>('');\n\n /**\n * Условие по этой колонке либо `null`: по нему видно и значение, и вид сравнения. Сверяется по\n * содержимому, а не по ссылке: перемена соседней колонки приносит новый набор, и условие этой\n * колонки, пересобранное потребителем тем же, переменой не считается.\n */\n protected readonly own: Signal<IFilterModel<string> | null> = computed(\n (): IFilterModel<string> | null => filterOf(this.filters(), this.propertyName()),\n { equal: sameFilter }\n );\n\n /**\n * Вид сравнения, выбранный здесь, пока значения нет: условия ещё нет, и хранить выбор, кроме\n * самой ячейки, негде. Без него выбор терялся бы, и введённое значение уходило бы с видом по\n * умолчанию. Условие этой колонки, пришедшее снаружи, выбор сбрасывает — вид берётся из него.\n */\n protected readonly chosenOperator: WritableSignal<TFilterOperatorType | null> = linkedSignal<\n IFilterModel<string> | null,\n TFilterOperatorType | null\n >({ source: this.own, computation: (): TFilterOperatorType | null => null });\n\n protected readonly value: Signal<TRtTableFilterValue> = computed((): TRtTableFilterValue => this.own()?.value ?? '');\n\n /** Очистка видна только там, где есть что очищать. */\n protected readonly clearable: Signal<boolean> = computed((): boolean => this.value() !== '');\n\n protected readonly operator: Signal<TFilterOperatorType> = computed((): TFilterOperatorType => {\n const chosen: TFilterOperatorType | null = this.chosenOperator();\n\n if (chosen !== null) {\n return chosen;\n }\n\n const own: IFilterModel<string> | null = this.own();\n\n return own !== null ? own.operatorType : startOperatorOf(this.filter()?.operators, this.filter()?.startOperator);\n });\n\n /** Виды сравнения, которые разрешила колонка; молчит колонка — разрешены все. */\n protected readonly operators: Signal<readonly TFilterOperatorType[]> = computed((): readonly TFilterOperatorType[] => {\n const allowed: readonly TFilterOperatorType[] | undefined = this.filter()?.operators;\n\n return allowed !== undefined && allowed.length > 0 ? allowed : ALL_OPERATORS;\n });\n\n protected readonly chooseLabel: Signal<string> = rtKitLabel('uiFilterChoose');\n protected readonly valueLabel: Signal<string> = rtKitLabel('uiFilterValue');\n\n protected readonly clearLabel: Signal<string> = rtKitLabel('uiClear');\n protected readonly filtersLabel: Signal<string> = rtKitLabel('uiFilters');\n\n /** Список видов сравнения открыт в слое; выбор пункта закрывает его отсюда — сам пункт не умеет. */\n protected readonly operatorPopover: Signal<RtPopoverDirective | undefined> = viewChild(RtPopoverDirective);\n\n /** Список видов сравнения с подписями: шаблон читает готовое, а не зовёт словарь сам. */\n protected readonly operatorViews: Signal<readonly IOperatorView[]> = computed((): readonly IOperatorView[] =>\n this.operators().map((type: TFilterOperatorType): IOperatorView => ({ type, label: this.#operatorLabels[type]() }))\n );\n\n /** Подпись текущего вида сравнения — её несёт кнопка, открывающая список. */\n protected readonly operatorLabel: Signal<string> = computed((): string => this.#operatorLabels[this.operator()]());\n\n /**\n * Имя кнопки для скринридера: что она открывает и какой вид стоит сейчас. Одно «Фильтры»\n * не отличало бы кнопку одной колонки от другой и не говорило бы, какой вид выбран.\n */\n protected readonly operatorAriaLabel: Signal<string> = computed((): string => `${this.filtersLabel()}: ${this.operatorLabel()}`);\n\n /** Сообщает ли этот вид сразу: у выбора и даты недописанного состояния нет. */\n protected readonly instant: Signal<boolean> = computed((): boolean => INSTANT_KINDS.has(this.filter()?.kind ?? 'text'));\n\n protected readonly options: Signal<ReadonlyArray<IRtSelect.Option<string | number>>> = computed(\n (): ReadonlyArray<IRtSelect.Option<string | number>> =>\n (this.filter()?.options ?? []).map((option: IRtTable.FilterOption): IRtSelect.Option<string | number> => ({\n value: option.value,\n label: option.label,\n }))\n );\n\n /** Ключ колонки — тот же, что в `cdkColumnDef` и в `[columnsConfig]`. */\n public readonly propertyName: InputSignal<string> = input.required<string>();\n\n /**\n * Чем колонка отбирает. Объявляет колонка, а не угадывает значение; колонка, которая молчит,\n * не отбирает вовсе — решает это сама ячейка, а не тот, кто её ставит: иначе обещание держал\n * бы каждый потребитель по-своему.\n */\n public readonly filter: InputSignal<IRtTable.ColumnFilter | null> = input<IRtTable.ColumnFilter | null>(null);\n\n /** Текущий набор условий — весь, по всем колонкам сразу. */\n public readonly filters: InputSignal<readonly IFilterModel<string>[]> = input<readonly IFilterModel<string>[]>([]);\n\n public readonly filtersChange: OutputEmitterRef<readonly IFilterModel<string>[]> = output<readonly IFilterModel<string>[]>();\n\n constructor() {\n this.control.valueChanges\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((value: TRtTableFilterInput): void => this.#onValue(value));\n\n // Набор условий меняется и снаружи — соседняя колонка, очистка всех сразу. Поле идёт\n // следом, и запись в него молчит: иначе она вернулась бы сюда же переменой значения.\n effect((): void => {\n const value: TRtTableFilterValue = this.value();\n\n untracked((): void => {\n if (filterValueOf(this.control.value) !== value) {\n this.control.setValue(value, { emitEvent: false });\n }\n });\n });\n }\n\n protected onOperator(operatorType: TFilterOperatorType): void {\n this.operatorPopover()?.close();\n this.chosenOperator.set(operatorType);\n this.#report(filtersWithOperator(this.filters(), this.propertyName(), operatorType));\n }\n\n protected onClear(): void {\n const instant: boolean = this.instant();\n\n this.control.setValue('');\n\n // У мгновенного вида о снятии сообщила сама перемена значения; у остальных — здесь:\n // очистку нажали, ждать ухода из поля нечего.\n if (!instant) {\n this.onCommit();\n }\n }\n\n /** Уход из поля и Enter: набранное значение уходит наружу разом, а не по знаку. */\n protected onCommit(): void {\n this.#commit(this.control.value);\n }\n\n #onValue(value: TRtTableFilterInput): void {\n if (this.instant()) {\n this.#commit(value);\n }\n }\n\n #commit(value: TRtTableFilterInput): void {\n this.#report(filtersWithValue(this.filters(), this.propertyName(), this.operator(), filterValueOf(value)));\n }\n\n /**\n * Наружу уходит только изменившийся набор. Прежний приходит тем же объектом, и по этому\n * признаку видно, что менять было нечего: повтор того же значения и смена вида сравнения\n * без значения не сообщают ничего.\n */\n #report(next: readonly IFilterModel<string>[]): void {\n if (next !== this.filters()) {\n this.filtersChange.emit(next);\n }\n }\n}\n","<ng-container rtBlock=\"rt-table-filter-header\">\n @if (filter(); as columnFilter) {\n <!--\n Кнопка вида сравнения открывает список тех видов, которые разрешила колонка. Список\n объявлен внутри блока намеренно: `rtElem` берёт имя блока инъекцией у ближайшего предка\n с `rtBlock`, а у шаблона, объявленного снаружи, такого предка нет вовсе.\n -->\n <button\n type=\"button\"\n rtElem=\"operator\"\n qa-dataid=\"table-filter-operator\"\n [attr.aria-label]=\"operatorAriaLabel()\"\n [rtMod]=\"{ set: clearable() }\"\n [rtPopover]=\"operatorsTpl\">\n {{ operatorLabel() }}\n </button>\n\n <!--\n Набранное уходит наружу по уходу из поля и по Enter, а не по каждому знаку: набор условий,\n уходящий на букву, спрашивает сервер по букве. Выбор и дата сообщают сами — у них\n недописанного состояния нет.\n -->\n <div rtElem=\"value\" qa-dataid=\"table-filter-value\">\n @switch (columnFilter.kind) {\n @case ('number') {\n <rt-input-number\n qa-dataid=\"table-filter-number\"\n size=\"sm\"\n [placeholder]=\"valueLabel()\"\n [clearable]=\"false\"\n [formControl]=\"control\"\n (focusout)=\"onCommit()\"\n (keydown.enter)=\"onCommit()\" />\n }\n\n @case ('select') {\n <rt-select\n qa-dataid=\"table-filter-select\"\n size=\"sm\"\n [placeholder]=\"chooseLabel()\"\n [clearable]=\"false\"\n [options]=\"options()\"\n [formControl]=\"control\" />\n }\n\n @case ('date') {\n <rt-date-picker qa-dataid=\"table-filter-date\" size=\"sm\" [clearable]=\"false\" [formControl]=\"control\" />\n }\n\n @default {\n <rt-input\n qa-dataid=\"table-filter-text\"\n size=\"sm\"\n [placeholder]=\"valueLabel()\"\n [clearable]=\"false\"\n [formControl]=\"control\"\n (focusout)=\"onCommit()\"\n (keydown.enter)=\"onCommit()\" />\n }\n }\n </div>\n\n <!-- Очистка стоит в разметке только там, где есть что очищать. -->\n @if (clearable()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"table-filter-clear\"\n variant=\"ghost\"\n icon=\"ico-close\"\n size=\"sm\"\n [ariaLabel]=\"clearLabel()\"\n (clicked)=\"onClear()\" />\n }\n\n <ng-template #operatorsTpl>\n <div rtElem=\"operators\" qa-dataid=\"table-filter-operators\" role=\"menu\">\n @for (view of operatorViews(); track view.type) {\n <rt-menu-item qa-dataid=\"table-filter-operator-item\" [label]=\"view.label\" (selected)=\"onOperator(view.type)\" />\n }\n </div>\n </ng-template>\n }\n</ng-container>\n","import { Directive, inject, input, InputSignal, TemplateRef } from '@angular/core';\n\n/**\n * Контекст шаблона `[rtTableCard]`: `$implicit` — строка таблицы.\n */\nexport interface IRtTableCardContext<TRow> {\n $implicit: TRow;\n}\n\n/**\n * Захватывает `<ng-template rtTableCard let-row>` — кастомную разметку карточки\n * строки для мобильного (узкого) режима `rt-table`. Когда задан, rt-table на\n * узком экране (≤1080px) рендерит эту разметку в `<article>` вместо\n * авто-карточки «label: value» по колонкам.\n *\n * Escape-hatch для страниц, которым нужна rich-карточка (составной primary-блок,\n * теги, произвольная раскладка), а не построчный список полей.\n *\n * @example\n * ```html\n * <rt-table #t=\"rtTable\" [dataSource]=\"rows\" ...>\n * ...колонки...\n * <ng-template rtTableCard [rtTableCardRowType]=\"rows\" let-row>\n * <div class=\"my-card-head\">{{ row.login }}</div>\n * </ng-template>\n * <tr cdk-row *cdkRowDef=\"let row; columns: t.displayedColumns()\"></tr>\n * </rt-table>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtTableCard]',\n})\nexport class RtTableCardDirective<TRow = unknown> {\n public readonly template: TemplateRef<IRtTableCardContext<TRow>> = inject<TemplateRef<IRtTableCardContext<TRow>>>(TemplateRef);\n\n /**\n * Type-carrier для вывода `TRow`: биндят тот же массив, что в `dataSource`.\n * Значение в рантайме не читается — служит только подсказкой типизации для\n * `let-row` (через `ngTemplateContextGuard`).\n */\n public readonly rtTableCardRowType: InputSignal<readonly TRow[]> = input<readonly TRow[]>([]);\n\n /** Type-guard: сужает контекст шаблона до строки таблицы при проверке шаблонов. */\n public static ngTemplateContextGuard<TRow>(\n _directive: RtTableCardDirective<TRow>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n context: unknown\n ): context is IRtTableCardContext<TRow> {\n return true;\n }\n}\n","import { CdkColumnDef } from '@angular/cdk/table';\nimport { TemplateRef } from '@angular/core';\n\nimport { IRtTableCardContext } from './rt-table-card.directive';\nimport { RT_TABLE_ROW_ACTIONS_COLUMN } from './rt-table-columns.logic';\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Поле авто-карточки узкого экрана: подпись колонки и её шаблон ячейки. Значение рисуется\n * тем же шаблоном, что и в строке таблицы, — второй разметки у карточки нет.\n */\nexport interface IRtTableCardColumn<TRow> {\n key: string;\n label: string;\n cell: TemplateRef<IRtTableCardContext<TRow>>;\n}\n\n/**\n * Строки, которые можно показать карточками. Источник данных таблицы бывает массивом,\n * потоком и своим объектом, а карточки строятся только по массиву: у остальных состав строк\n * известен лишь самой таблице, и брать его отсюда нечем.\n */\nexport function cardRowsOf<TRow>(dataSource: unknown): ReadonlyArray<TRow> {\n return Array.isArray(dataSource) ? (dataSource as ReadonlyArray<TRow>) : [];\n}\n\n/**\n * Есть ли строки в источнике данных. CdkTable принимает массив, поток и свой объект — точно\n * ответить можно только про массив. Для остальных ответ `true`: заглушку «пусто» и скелет там не\n * показываем, раз не можем знать наверняка.\n */\nexport function hasRowsIn(dataSource: unknown): boolean {\n return Array.isArray(dataSource) ? dataSource.length > 0 : true;\n}\n\n/**\n * Поля авто-карточки: видимые колонки, кроме колонки действий, с подписью из конфига и\n * шаблоном ячейки из объявления колонки. Колонка без шаблона ячейки пропускается — рисовать\n * её значение нечем.\n */\nexport function cardColumnsOf<TRow>(\n displayedColumns: ReadonlyArray<string>,\n columnDefs: ReadonlyArray<CdkColumnDef>,\n columnsConfig: ReadonlyArray<IRtTable.ColumnConfig>\n): ReadonlyArray<IRtTableCardColumn<TRow>> {\n const defsByName: Map<string, CdkColumnDef> = new Map(columnDefs.map((def: CdkColumnDef): [string, CdkColumnDef] => [def.name, def]));\n const labelByKey: Map<string, string> = new Map(\n columnsConfig.map((column: IRtTable.ColumnConfig): [string, string] => [column.key, column.label])\n );\n\n return displayedColumns\n .filter((key: string): boolean => key !== RT_TABLE_ROW_ACTIONS_COLUMN)\n .map((key: string): IRtTableCardColumn<TRow> | null => {\n const cell: TemplateRef<IRtTableCardContext<TRow>> | undefined = defsByName.get(key)?.cell?.template;\n\n return cell === undefined ? null : { key, cell, label: labelByKey.get(key) ?? key };\n })\n .filter((column: IRtTableCardColumn<TRow> | null): column is IRtTableCardColumn<TRow> => column !== null);\n}\n","/**\n * Узлы, нажатие по которым — своё действие, а не открытие строки или карточки: кнопка, ссылка,\n * поле и узлы с ролью кнопки или переключателя.\n */\nconst INTERACTIVE_SELECTOR: string = \"button, a, input, select, textarea, label, [role='button'], [role='switch']\";\n\n/**\n * Пришло ли событие из интерактивного узла внутри строки или карточки. Такое нажатие открытием\n * не считается — иначе вложенные действия спорили бы с переходом к записи.\n */\nexport function isFromInteractive(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest(INTERACTIVE_SELECTOR) !== null;\n}\n\n/**\n * Строка таблицы, которую показывает карточка с этим номером. Карточки строятся из того же массива,\n * что и строки, и в том же порядке, поэтому номер карточки — номер строки. Строки вложенной\n * таблицы в счёт не идут: берутся только строки, чья ближайшая таблица — эта.\n */\nexport function cardRowOf(host: Element, index: number): HTMLElement | null {\n const rows: HTMLElement[] = Array.from(host.querySelectorAll<HTMLElement>('.cdk-row')).filter(\n (row: HTMLElement): boolean => row.parentElement?.closest('rt-table, table[rt-table]') === host\n );\n return rows[index] ?? null;\n}\n","import { booleanAttribute, Directive, ElementRef, inject, input, InputSignal, InputSignalWithTransform } from '@angular/core';\n\nimport { cardRowOf, isFromInteractive } from './rt-table-row.logic';\n\n/** Один обработчик на нажатие, Enter и пробел */\nconst ACTIVATE: string = 'activate($event)';\n\n/**\n * Нажатие на карточку узкого экрана открывает запись так же, как нажатие на строку. Своего выхода у\n * карточки нет: нажатие, Enter и пробел уходят спрятанной строке с тем же номером, и срабатывает\n * тот же `(activated)`, что приложение вешает на строку через `rtTableRow`. Нажатие по кнопке,\n * ссылке или полю внутри карточки открытием не считается.\n *\n * Карточка отзывается и берёт фокус только при `clickable` таблицы — тот же вход включает вид\n * кликабельной строки.\n */\n@Directive({\n selector: '[rtTableCardActivation]',\n host: {\n '[attr.tabindex]': 'rtTableCardActivationEnabled() ? 0 : null',\n '(click)': ACTIVATE,\n '(keydown.enter)': ACTIVATE,\n '(keydown.space)': ACTIVATE,\n },\n})\nexport class RtTableCardActivationDirective {\n readonly #card: HTMLElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n /** Номер карточки — он же номер строки, которую она показывает */\n public readonly rtTableCardActivation: InputSignal<number> = input.required<number>();\n\n /** Карточка отзывается на нажатие */\n public readonly rtTableCardActivationEnabled: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n protected activate(event: Event): void {\n if (!this.rtTableCardActivationEnabled() || isFromInteractive(event.target)) {\n return;\n }\n if (event instanceof KeyboardEvent) {\n // Пробел иначе проскроллит страницу\n event.preventDefault();\n }\n const host: Element | null = this.#card.closest('rt-table, table[rt-table]');\n if (host !== null) {\n cardRowOf(host, this.rtTableCardActivation())?.click();\n }\n }\n}\n","import { Directive, inject, input, InputSignal, TemplateRef } from '@angular/core';\n\n/**\n * Контекст шаблона `[rtTableRowActions]`: `$implicit` — строка таблицы.\n */\nexport interface IRtTableRowActionsContext<TRow> {\n $implicit: TRow;\n}\n\n/**\n * Захватывает `<ng-template rtTableRowActions let-row>` — содержимое «…»-меню\n * действий строки. `rt-table` (`[showRowActions]`) рендерит этот шаблон в конце\n * каждой строки внутри `rt-menu`, прокидывая строку через `$implicit`.\n *\n * Тип `let-row` выводится из `[rtTableRowActionsRowType]` (передаётся тот же\n * массив, что в `dataSource`) — type-carrier, как `*ngFor` выводит тип из\n * `ngForOf`. В рантайме значение не используется.\n *\n * @example\n * ```html\n * <rt-table #t=\"rtTable\" [columns]=\"cols\" [showRowActions]=\"true\" [dataSource]=\"rows\" ...>\n * ...колонки...\n * <ng-template rtTableRowActions [rtTableRowActionsRowType]=\"rows\" let-row>\n * <rt-menu-item icon=\"ico-edit\" label=\"Редактировать\" (selected)=\"edit(row)\" />\n * </ng-template>\n * <tr cdk-header-row *cdkHeaderRowDef=\"t.displayedColumns()\"></tr>\n * <tr cdk-row *cdkRowDef=\"let row; columns: t.displayedColumns()\"></tr>\n * </rt-table>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtTableRowActions]',\n})\nexport class RtTableRowActionsDirective<TRow = unknown> {\n public readonly template: TemplateRef<IRtTableRowActionsContext<TRow>> =\n inject<TemplateRef<IRtTableRowActionsContext<TRow>>>(TemplateRef);\n\n /**\n * Type-carrier для вывода `TRow`: биндят тот же массив, что в `dataSource`.\n * Значение в рантайме не читается — служит только подсказкой типизации для\n * `let-row` (через `ngTemplateContextGuard`). Имя совпадает с binding'ом —\n * без alias, чтобы не триггерить `no-input-rename`.\n */\n public readonly rtTableRowActionsRowType: InputSignal<readonly TRow[]> = input<readonly TRow[]>([]);\n\n /** Type-guard: сужает контекст шаблона до строки таблицы при проверке шаблонов. */\n public static ngTemplateContextGuard<TRow>(\n _directive: RtTableRowActionsDirective<TRow>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n context: unknown\n ): context is IRtTableRowActionsContext<TRow> {\n return true;\n }\n}\n","import { IRtTable } from './rt-table.model';\n\n/**\n * Есть ли у строки хотя бы одно доступное действие.\n *\n * Признак приходит предикатом от экрана, а не подсчётом отрисованных пунктов меню:\n * содержимое спроецированного шаблона известно только после отрисовки, и кнопка\n * успевала бы мигнуть на первом кадре.\n *\n * Предикат не задан — у строки есть действия: экран, который ничего не гейтит,\n * показывает кнопку меню, как и раньше.\n */\nexport function rowHasAvailableActions<TRow>(row: TRow, hasActions: IRtTable.RowActionsPredicate<TRow> | null): boolean {\n return hasActions === null ? true : hasActions(row);\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { rowHasAvailableActions } from './rt-table-row-actions.logic';\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Есть ли у строки доступные действия — гейт кнопки «…» в ячейке действий.\n *\n * Pure-pipe: пересчитывается только при смене строки или предиката, а не на каждом\n * цикле проверки. Значение приходит из контекста шаблона (строка таблицы), поэтому\n * `computed()` здесь неприменим.\n */\n@Pipe({ name: 'rtRowHasActions' })\nexport class RtRowHasActionsPipe implements PipeTransform {\n public transform<TRow>(row: TRow, hasActions: IRtTable.RowActionsPredicate<TRow> | null): boolean {\n return rowHasAvailableActions(row, hasActions);\n }\n}\n","import { DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { mergeMap, Observable, Subject } from 'rxjs';\n\nimport { IDBStorageService } from '@rt-tools/core';\n\nimport { ERtStorageKeys } from '@rt-tools/ui-kit-v2/core';\nimport { IRtTable } from './rt-table.model';\n\n/** Запрос на запись настроек колонок — то, что уезжает в объявленный поток записи. */\ninterface IRtTablePersistRequest {\n tableId: string;\n settings: IRtTable.ColumnSettings;\n}\n\n/** Ключ настроек одной таблицы в хранилище браузера. */\nfunction settingsKey(tableId: string): string {\n return `${ERtStorageKeys.TableColumnsPrefix}${tableId}`;\n}\n\n/**\n * Хранение настроек колонок одной таблицы.\n *\n * Запись объявлена одним потоком, а не подпиской в методе: запросы приходят по одному на\n * каждое движение панели настроек, и каждый из них — своя независимая запись. Зависимости\n * приходят доводами, потому что заводится это в конструкторе компонента, где внедрение уже\n * доступно, а сам класс службой не объявлен — он живёт ровно столько, сколько таблица.\n */\nexport class RtTableSettingsPersistence {\n readonly #storage: IDBStorageService<IRtTable.ColumnSettings>;\n readonly #requestsSource: Subject<IRtTablePersistRequest> = new Subject<IRtTablePersistRequest>();\n\n constructor(storage: IDBStorageService<IRtTable.ColumnSettings>, destroyRef: DestroyRef) {\n this.#storage = storage;\n this.#requestsSource\n .pipe(\n mergeMap((request: IRtTablePersistRequest): Observable<void> =>\n this.#storage.set(settingsKey(request.tableId), request.settings)\n ),\n takeUntilDestroyed(destroyRef)\n )\n .subscribe();\n }\n\n /** Сохранённые настройки этой таблицы. Записи может не быть — тогда применять нечего. */\n public load(tableId: string): Observable<IRtTable.ColumnSettings | undefined> {\n return this.#storage.get(settingsKey(tableId));\n }\n\n /** Кладёт настройки в очередь записи: сама запись идёт объявленным потоком. */\n public save(tableId: string, settings: IRtTable.ColumnSettings): void {\n this.#requestsSource.next({ tableId, settings });\n }\n}\n","import { computed, Injectable, Signal, signal, WritableSignal } from '@angular/core';\n\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Регистрация настраиваемой таблицы в реестре: её текущие/дефолтные колонки\n * (сигналы) + callback применения новых настроек (применяет к таблице и\n * персистит). Заполняется самой `rt-table`, читается route-асайдом настроек.\n */\nexport interface IRtTableSettingsRegistration {\n columns: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>>;\n defaults: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>>;\n apply: (settings: IRtTable.ColumnSettings) => void;\n}\n\n/**\n * Реестр настраиваемых таблиц — мост между `rt-table` (shared UI) и route-асайдом\n * настроек колонок, которые живут в разных ветках дерева и не видят друг друга\n * напрямую. `rt-table` регистрируется по `tableId` на init, снимается на destroy;\n * асайд читает регистрацию активной таблицы (`active()` выставляется при открытии).\n *\n * Реестр реактивный (`Map` живёт в сигнале): при F5 route-асайд инициализируется\n * раньше `rt-table`, и синхронный промах по пустому реестру не должен быть\n * финальным — асайд дожидается регистрации через `effect` (фикс F-16).\n */\n@Injectable({ providedIn: 'root' })\nexport class RtTableSettingsRegistry {\n readonly #registrations: WritableSignal<ReadonlyMap<string, IRtTableSettingsRegistration>> = signal<\n ReadonlyMap<string, IRtTableSettingsRegistration>\n >(new Map<string, IRtTableSettingsRegistration>());\n\n readonly #active: WritableSignal<string | null> = signal<string | null>(null);\n\n /** Id таблицы, чьи настройки сейчас открыты в асайде (или `null`). */\n public readonly active: Signal<string | null> = this.#active.asReadonly();\n\n /**\n * Id единственной зарегистрированной таблицы (или `null`, если их 0 или >1).\n * Нужен асайду для восстановления `active` после F5: сервис пересоздан,\n * `setActive` никто не звал, но открытая страница регистрирует ровно\n * одну настраиваемую таблицу.\n */\n public readonly soleTableId: Signal<string | null> = computed((): string | null => {\n const registrations: ReadonlyMap<string, IRtTableSettingsRegistration> = this.#registrations();\n if (registrations.size !== 1) {\n return null;\n }\n const first: string | undefined = registrations.keys().next().value;\n return first ?? null;\n });\n\n public register(tableId: string, registration: IRtTableSettingsRegistration): void {\n this.#registrations.update(\n (current: ReadonlyMap<string, IRtTableSettingsRegistration>): ReadonlyMap<string, IRtTableSettingsRegistration> => {\n const next: Map<string, IRtTableSettingsRegistration> = new Map(current);\n next.set(tableId, registration);\n return next;\n }\n );\n }\n\n public unregister(tableId: string): void {\n this.#registrations.update(\n (current: ReadonlyMap<string, IRtTableSettingsRegistration>): ReadonlyMap<string, IRtTableSettingsRegistration> => {\n const next: Map<string, IRtTableSettingsRegistration> = new Map(current);\n next.delete(tableId);\n return next;\n }\n );\n if (this.#active() === tableId) {\n this.#active.set(null);\n }\n }\n\n /** Реактивная регистрация таблицы: `null`, пока таблица не зарегистрировалась. */\n public get(tableId: string): Signal<IRtTableSettingsRegistration | null> {\n return computed((): IRtTableSettingsRegistration | null => this.#registrations().get(tableId) ?? null);\n }\n\n public setActive(tableId: string): void {\n this.#active.set(tableId);\n }\n\n public clearActive(): void {\n this.#active.set(null);\n }\n}\n","import { computed, DestroyRef, inject, Signal, signal, WritableSignal } from '@angular/core';\n\nimport { EMPTY, filter, Observable } from 'rxjs';\n\nimport { IDBStorageService } from '@rt-tools/core';\n\nimport { defaultColumnItems, resolveColumns, withoutLockedHidden } from './rt-table-columns.logic';\nimport { RtTableSettingsPersistence } from './rt-table-settings.persistence';\nimport { RtTableSettingsRegistry, type IRtTableSettingsRegistration } from './rt-table-settings.registry';\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Настройка колонок одной таблицы: применённые настройки, объявление реестру, загрузка и запись.\n *\n * Лежит отдельно от компонента: это целое со своим состоянием, а компонент только отдаёт ему свои\n * входы и зовёт на старте и в конце жизни. Входы приезжают функциями, а не сигналами: поле с\n * этим классом заводится раньше, чем поля входов компонента, и читать их можно только позже.\n * Внедрение зовётся в конструкторе — класс заводится полем компонента, где оно доступно.\n * Подписку на сохранённые настройки держит компонент: подписка в методе здесь запрещена.\n */\nexport class RtTableColumnSettings {\n readonly #registry: RtTableSettingsRegistry = inject(RtTableSettingsRegistry);\n readonly #persistence: RtTableSettingsPersistence = new RtTableSettingsPersistence(\n inject<IDBStorageService<IRtTable.ColumnSettings>>(IDBStorageService),\n inject(DestroyRef)\n );\n\n readonly #config: () => ReadonlyArray<IRtTable.ColumnConfig>;\n readonly #tableId: () => string | null;\n\n /** Настройки колонок, применённые поверх конфига; `null` — умолчания конфига. */\n readonly #applied: WritableSignal<IRtTable.ColumnSettings | null> = signal<IRtTable.ColumnSettings | null>(null);\n\n /** Колонки конфига без настроек пользователя — с них панель начинает после сброса. */\n readonly #defaults: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>> = computed((): ReadonlyArray<IRtTable.ColumnSettingItem> =>\n defaultColumnItems(this.#config())\n );\n\n /** Ключ записи настроек. `null` — таблица не настраиваемая: нет ключа или конфига. */\n readonly #persistableTableId: Signal<string | null> = computed((): string | null => {\n const id: string | null = this.#tableId();\n return id !== null && this.#config().length > 0 ? id : null;\n });\n\n /** Разрешённые колонки в применённом порядке, с текущим признаком скрытости. */\n public readonly resolved: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>> = computed((): ReadonlyArray<IRtTable.ColumnSettingItem> =>\n resolveColumns(this.#config(), this.#applied())\n );\n\n /** Таблица настраиваемая: есть и конфиг колонок, и ключ таблицы. */\n public readonly canConfigure: Signal<boolean> = computed((): boolean => this.#config().length > 0 && this.#tableId() !== null);\n\n constructor(config: () => ReadonlyArray<IRtTable.ColumnConfig>, tableId: () => string | null) {\n this.#config = config;\n this.#tableId = tableId;\n }\n\n /** Объявить таблицу реестру: с этой минуты её настраивает панель. */\n public start(): void {\n this.#register();\n }\n\n /**\n * Сохранённые настройки таблицы. У ненастраиваемой таблицы и у таблицы без записи поток пуст:\n * применять нечего. Подписывается компонент — на старте своей жизни.\n */\n public saved(): Observable<IRtTable.ColumnSettings> {\n const persistedTableId: string | null = this.#persistableTableId();\n if (persistedTableId === null) {\n return EMPTY;\n }\n\n return this.#persistence\n .load(persistedTableId)\n .pipe(filter((settings: IRtTable.ColumnSettings | undefined): settings is IRtTable.ColumnSettings => settings !== undefined));\n }\n\n /** Снять таблицу с реестра в конце её жизни. */\n public stop(): void {\n const tableId: string | null = this.#tableId();\n if (tableId !== null) {\n this.#registry.unregister(tableId);\n }\n }\n\n /** Применить настройки: закреплённые колонки скрыть нельзя. */\n public apply(settings: IRtTable.ColumnSettings): void {\n this.#applied.set(withoutLockedHidden(this.#config(), settings));\n }\n\n /**\n * Объявляет таблицу реестру: её колонки, умолчания и приём применения настроек. Реестр —\n * мост к панели настроек, которую потребитель открывает переходом по адресу.\n */\n #register(): void {\n const tableId: string | null = this.#tableId();\n if (tableId === null || !this.canConfigure()) {\n return;\n }\n const registration: IRtTableSettingsRegistration = {\n columns: this.resolved,\n defaults: this.#defaults,\n apply: (settings: IRtTable.ColumnSettings): void => {\n this.apply(settings);\n this.#persist(settings);\n },\n };\n this.#registry.register(tableId, registration);\n }\n\n /** Сохраняет настройки колонок у настраиваемой таблицы; у прочих сохранять нечего. */\n #persist(settings: IRtTable.ColumnSettings): void {\n const tableId: string | null = this.#persistableTableId();\n if (tableId !== null) {\n this.#persistence.save(tableId, settings);\n }\n }\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n CDK_TABLE,\n CdkCell,\n CdkCellDef,\n CdkColumnDef,\n CdkHeaderCell,\n CdkHeaderCellDef,\n CdkTable,\n CdkTableDataSourceInput,\n DataRowOutlet,\n FooterRowOutlet,\n HeaderRowOutlet,\n NoDataRowOutlet,\n} from '@angular/cdk/table';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n linkedSignal,\n numberAttribute,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n TemplateRef,\n ViewChild,\n WritableSignal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { IFilterModel, ISortModel } from '@rt-tools/utils';\n\nimport { TRtKitLabelKey, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtEmptyStateComponent } from '@rt-tools/ui-kit-v2/empty-state';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtMenuComponent } from '@rt-tools/ui-kit-v2/menu';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtSkeletonComponent } from '@rt-tools/ui-kit-v2/skeleton';\nimport { RtSpinnerComponent } from '@rt-tools/ui-kit-v2/spinner';\nimport { RtTableFilterHeaderComponent } from './filter-header/rt-table-filter-header.component';\nimport { RtTableCardDirective } from './rt-table-card.directive';\nimport { cardColumnsOf, cardRowsOf, hasRowsIn, IRtTableCardColumn } from './rt-table-cards.logic';\nimport { RtTableCardActivationDirective } from './rt-table-card-activation.directive';\nimport { RtTableRowActionsDirective } from './rt-table-row-actions.directive';\nimport { RtRowHasActionsPipe } from './rt-table-row-actions.pipe';\nimport { RtTableColumnSettings } from './rt-table-column-settings';\nimport { displayedColumnKeys } from './rt-table-columns.logic';\nimport { filterCellsOf } from './rt-table-filter.logic';\nimport { nextSort } from './rt-table-sort.logic';\nimport { IRtTable } from './rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table';\n\nconst DEFAULT_SKELETON_ROWS: number = 5;\n/** Ключ подписи пустой таблицы: язык известен только после старта приложения */\nconst DEFAULT_EMPTY_KEY: TRtKitLabelKey = 'uiNoRows';\n\n/**\n * Таблица — стилизованная обёртка над `cdk-table` (`@angular/cdk/table`).\n *\n * Селектор работает и как element (`<rt-table>`), и как attribute на native `<table rt-table>`.\n * Native-вариант предпочтительнее — даёт правильную table-семантику для скрин-ридеров, но\n * наложения загрузки, пустого места и заглушек требуют element-варианта: `<div>` не валиден как\n * ребёнок `<table>`.\n *\n * Какие состояния таблица различает и чем рисует каждое — в заметке семьи рядом, `CONTEXT.md`.\n */\n@Component({\n selector: 'rt-table, table[rt-table]',\n exportAs: 'rtTable',\n templateUrl: './rt-table.component.html',\n styleUrl: './rt-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // @angular/cdk\n CdkCell,\n CdkCellDef,\n CdkColumnDef,\n CdkHeaderCell,\n CdkHeaderCellDef,\n DataRowOutlet,\n FooterRowOutlet,\n HeaderRowOutlet,\n NoDataRowOutlet,\n\n // @angular/common\n NgTemplateOutlet,\n\n // standalone components / directives\n RtEmptyStateComponent,\n RtMenuComponent,\n RtSkeletonComponent,\n RtSpinnerComponent,\n RtTableFilterHeaderComponent,\n RtTableCardActivationDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // pipes\n RtRowHasActionsPipe,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n providers: [\n {\n provide: CDK_TABLE,\n useExisting: forwardRef((): typeof RtTableComponent => RtTableComponent),\n },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-table--density--compact]': \"density() === 'compact'\",\n '[class.rt-table--clickable]': 'clickable()',\n '[class.rt-table--loading]': 'isInitialLoading()',\n '[class.rt-table--fetching]': 'fetching()',\n '[class.rt-table--empty]': 'isEmpty()',\n '[class.rt-table--cards]': 'showCards()',\n '[attr.role]': 'hostRole',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-busy]': \"isInitialLoading() || fetching() ? 'true' : null\",\n },\n})\nexport class RtTableComponent<TRow> extends CdkTable<TRow> {\n readonly #t_uiNoRows: Signal<string> = rtKitLabel(DEFAULT_EMPTY_KEY);\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n\n readonly #dataSourceVersion: WritableSignal<number> = signal<number>(0);\n\n /**\n * Выбранная сортировка. Заводится от входа `[sort]` и переключается заголовками:\n * таблица показывает порядок и без потребителя, который его слушает.\n */\n readonly #sort: WritableSignal<ISortModel<string> | null> = linkedSignal<ISortModel<string> | null>((): ISortModel<string> | null =>\n this.sort()\n );\n\n /** Настройка колонок: применённые настройки, реестр панели, загрузка и запись. */\n readonly #columnSettings: RtTableColumnSettings = new RtTableColumnSettings(\n (): ReadonlyArray<IRtTable.ColumnConfig> => this.columnsConfig(),\n (): string | null => this.tableId()\n );\n\n /** Колонка действий и её ячейки: регистрируются в CdkTable вручную — почему, сказано в `CONTEXT.md`. */\n // native-ok: сигнальный viewChild() резолвится после первой отрисовки строк, а колонка действий должна попасть в реестр CdkTable до неё\n @ViewChild(CdkColumnDef, { static: true })\n private readonly actionsColumnDef?: CdkColumnDef;\n\n // native-ok: то же, что у объявления колонки выше: def присваивается вручную в ngOnInit, до первой отрисовки\n @ViewChild(CdkCellDef, { static: true })\n private readonly actionsCellDef?: CdkCellDef;\n\n // native-ok: то же, что у объявления колонки выше: def присваивается вручную в ngOnInit, до первой отрисовки\n @ViewChild(CdkHeaderCellDef, { static: true })\n private readonly actionsHeaderCellDef?: CdkHeaderCellDef;\n\n /**\n * Роль хоста: у native `<table rt-table>` она есть от самого тега, а элементному\n * `<rt-table>` её ставим сами. Без неё скрин-ридер читает список строками текста: роли\n * строк и ячеек CDK проставляет сам, а роли самой таблицы у него нет, и проставленные\n * остаются висеть вне таблицы. Считается один раз — тег хоста по ходу жизни не меняется.\n */\n protected readonly hostRole: 'table' | null = (inject(ElementRef).nativeElement as HTMLElement).tagName === 'RT-TABLE' ? 'table' : null;\n\n /** `true` когда initial-load в полёте и entities ещё нет — рендерим skeleton rows. */\n protected readonly isInitialLoading: Signal<boolean> = computed((): boolean => this.loading() && this.#hasData() === false);\n\n /** `true` когда загрузка завершена и entities пустые — рендерим empty placeholder. */\n protected readonly isEmpty: Signal<boolean> = computed((): boolean => !this.loading() && !this.fetching() && this.#hasData() === false);\n\n /** Массив для `@for` — числа от 0 до skeletonRows-1, рендерим placeholder-rows. */\n protected readonly skeletonRowIndexes: Signal<ReadonlyArray<number>> = computed((): ReadonlyArray<number> =>\n Array.from({ length: this.skeletonRows() }, (_: unknown, i: number) => i)\n );\n\n /** Шаблон содержимого «…»-меню действий строки (`<ng-template rtTableRowActions>`). */\n protected readonly rowActions: Signal<RtTableRowActionsDirective | undefined> = contentChild(RtTableRowActionsDirective);\n\n /** Кастомный шаблон карточки мобильного режима (`<ng-template rtTableCard>`). Опционален. */\n protected readonly cardTemplate: Signal<RtTableCardDirective | undefined> = contentChild(RtTableCardDirective);\n\n /**\n * Все проецируемые потребителем `cdkColumnDef` — источник cell-шаблонов для\n * авто-карточек. «…»-колонка действий объявлена во view rt-table, поэтому в\n * этот content-query не попадает.\n */\n protected readonly columnDefs: Signal<ReadonlyArray<CdkColumnDef>> = contentChildren(CdkColumnDef, { descendants: true });\n\n /** Узкий вьюпорт (≤1080px): таблица прячется, строки рендерятся карточками. */\n protected readonly isNarrow: Signal<boolean> = this.#breakpoints.narrow;\n\n /** Карточки показываются только когда card-режим включён (`[cards]`) и экран узкий. */\n protected readonly showCards: Signal<boolean> = computed((): boolean => this.cards() && this.isNarrow());\n\n /**\n * Строки для карточек узкого экрана. Признак `#dataSourceVersion` пересчитывает список\n * при смене источника: CDK хранит его полем, а не сигналом.\n */\n protected readonly cardRows: Signal<ReadonlyArray<TRow>> = computed((): ReadonlyArray<TRow> => {\n this.#dataSourceVersion();\n\n return cardRowsOf<TRow>(this.dataSource);\n });\n\n /** Поля авто-карточки узкого экрана: видимые колонки с подписью и шаблоном ячейки. */\n protected readonly cardColumns: Signal<ReadonlyArray<IRtTableCardColumn<TRow>>> = computed(\n (): ReadonlyArray<IRtTableCardColumn<TRow>> => cardColumnsOf<TRow>(this.displayedColumns(), this.columnDefs(), this.columnsConfig())\n );\n\n /** ContentChild template для кастом empty-placeholder'а. Опционален; fallback — emptyMessage. */\n public readonly emptyTemplate: Signal<TemplateRef<unknown> | undefined> = contentChild('rtTableEmpty', { read: TemplateRef });\n\n /** ARIA-label корневого `<table>` (или `<rt-table>` элемента). */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Плотность: `\"compact\"` уменьшает padding и высоту ячеек. */\n public readonly density: InputSignal<IRtTable.Density> = input<IRtTable.Density>('default');\n\n /**\n * Мобильный card-режим на узком экране (≤1080px): таблица рендерится списком\n * карточек «поле: значение». Включён по умолчанию для всех списков. Отключать\n * (`[cards]=\"false\"`) для не-списочных таблиц — например, key-value quote-таблицы\n * внутри асайда, где карточки дублируют смысл.\n */\n public readonly cards: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /**\n * Строки кликабельны (открывают деталь/асайд). Включает визуальный аффорданс\n * (cursor/focus-ring); саму активацию + a11y обеспечивает директива\n * `rtTableRow` на `<tr cdk-row>`.\n */\n public readonly clickable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Initial-load в полёте. При `true` + пустых entities рендерит skeleton rows. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Re-fetch в полёте. При `true` рисует sticky overlay c rt-spinner поверх существующих rows. */\n public readonly fetching: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Имена колонок (тот же массив что в `*cdkRowDef columns: ...`). Нужен для skeleton row layout. */\n public readonly columns: InputSignal<ReadonlyArray<string>> = input<ReadonlyArray<string>>([]);\n\n /**\n * Метаданные колонок для настраиваемой таблицы: `[{key,label,hidden?,locked?}]`.\n * Когда задан — `displayedColumns()` вычисляется из него с учётом настроек\n * (видимость + порядок), а таблица получает панель настроек (при заданном `[tableId]`).\n * Пуст — таблица работает по legacy `[columns]` без панели.\n */\n public readonly columnsConfig: InputSignal<ReadonlyArray<IRtTable.ColumnConfig>> = input<ReadonlyArray<IRtTable.ColumnConfig>>([]);\n\n /**\n * Идентификатор таблицы для персиста настроек колонок (ключ в IndexedDB).\n * Без него панель настроек недоступна (`canConfigure()` = false).\n */\n public readonly tableId: InputSignal<string | null> = input<string | null>(null);\n\n /**\n * Добавляет в конец строки «…»-колонку действий (`rt-menu`). Содержимое меню —\n * через `<ng-template rtTableRowActions let-row>`; колонку нужно подключить\n * в row-def'ах через `displayedColumns()`.\n */\n public readonly showRowActions: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Есть ли у строки доступные действия. Строка, которой нельзя сделать ничего,\n * кнопки «…» не показывает вовсе. Экран заполняет тем же признаком, которым\n * гейтит пункты меню; `null` — у всех строк действия есть.\n */\n public readonly rowHasActions: InputSignal<IRtTable.RowActionsPredicate<TRow> | null> =\n input<IRtTable.RowActionsPredicate<TRow> | null>(null);\n\n /**\n * Показывать ли строку отбора под шапкой. Таблица с отбором в настройке колонок не\n * становится таблицей с полями над строками сама: вторая строка шапки стоит высоты\n * экрана, и платить за неё решает потребитель.\n */\n public readonly showFilters: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Набор условий, по которому нарисованы ячейки отбора. Держит его потребитель. */\n public readonly filters: InputSignal<ReadonlyArray<IFilterModel<string>>> = input<ReadonlyArray<IFilterModel<string>>>([]);\n\n /** Набор условий изменился. Строки сужает потребитель — таблица только сообщает. */\n public readonly filtersChange: OutputEmitterRef<ReadonlyArray<IFilterModel<string>>> = output<ReadonlyArray<IFilterModel<string>>>();\n\n /** Выбранная сортировка: `null` — порядок задаёт источник данных. */\n public readonly sort: InputSignal<ISortModel<string> | null> = input<ISortModel<string> | null>(null);\n\n /** Пользователь переключил порядок заголовком. Саму выборку делает потребитель. */\n public readonly sortChange: OutputEmitterRef<ISortModel<string> | null> = output<ISortModel<string> | null>();\n\n /** Текущая сортировка — её читают заголовки колонок (`rtSortHeader`). */\n public readonly currentSort: Signal<ISortModel<string> | null> = this.#sort.asReadonly();\n\n /**\n * Разрешённые колонки настраиваемой таблицы: `[columnsConfig]` в применённом\n * порядке, с текущим флагом `hidden` (locked всегда видимы). Панель настроек\n * читает этот список для отрисовки; из него же строится `displayedColumns()`.\n * Пустой при отсутствии `[columnsConfig]` (legacy-режим).\n */\n public readonly resolvedColumns: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>> = computed(\n (): ReadonlyArray<IRtTable.ColumnSettingItem> => this.#columnSettings.resolved()\n );\n\n /**\n * Колонки для `*cdkHeaderRowDef`/`*cdkRowDef`. При заданном `[columnsConfig]` —\n * видимые колонки в применённом порядке; иначе — legacy `[columns]`. Плюс\n * «…»-колонка действий в конце при `[showRowActions]`. Потребитель читает через\n * template-ref: `<rt-table #t=\"rtTable\" ...>` →\n * `*cdkRowDef=\"let row; columns: t.displayedColumns()\"`.\n */\n public readonly displayedColumns: Signal<ReadonlyArray<string>> = computed((): ReadonlyArray<string> =>\n displayedColumnKeys(this.resolvedColumns(), this.columns(), this.columnsConfig().length > 0, this.showRowActions())\n );\n\n /**\n * Ячейки строки отбора: по ячейке на каждую показанную колонку, в том же порядке. У\n * колонки без объявленного отбора ячейка пустая, но своё место держит — иначе ячейки\n * съезжают на соседние колонки. Колонка действий строки попадает сюда тем же путём:\n * `displayedColumns()` уже несёт её последней.\n */\n public readonly filterCells: Signal<ReadonlyArray<IRtTable.FilterCell>> = computed((): ReadonlyArray<IRtTable.FilterCell> =>\n filterCellsOf(this.displayedColumns(), this.columnsConfig())\n );\n\n /** `true` когда таблица настраиваемая: есть и `[columnsConfig]`, и `[tableId]`. */\n public readonly canConfigure: Signal<boolean> = this.#columnSettings.canConfigure;\n\n /** Сколько skeleton-строк рендерить во время initial-load. Default 5. */\n public readonly skeletonRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(DEFAULT_SKELETON_ROWS, {\n transform: numberAttribute,\n });\n\n /** Подпись пустой таблицы; пусто — берётся переведённое умолчание. */\n public readonly emptyMessage: InputSignal<string> = input<string>('');\n\n /** Своя подпись пустой таблицы важнее умолчания */\n public readonly emptyText: Signal<string> = computed((): string => this.emptyMessage() || this.#t_uiNoRows());\n\n /** Иконка дефолтного empty-placeholder'а (rt-empty-state). `null` — без иконки. */\n public readonly emptyIcon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>('inbox');\n\n /** Описание под заголовком дефолтного empty-placeholder'а. Опционально. */\n public readonly emptyDescription: InputSignal<string | null> = input<string | null>(null);\n\n public override ngOnInit(): void {\n super.ngOnInit();\n // Регистрируем view-колонку действий до первого рендера строк, чтобы\n // `displayedColumns()` мог на неё ссылаться без «column not found».\n // Cell/header присваиваем вручную — их ContentChild ещё не отработал.\n if (this.actionsColumnDef !== undefined && this.actionsCellDef !== undefined && this.actionsHeaderCellDef !== undefined) {\n this.actionsColumnDef.cell = this.actionsCellDef;\n this.actionsColumnDef.headerCell = this.actionsHeaderCellDef;\n this.addColumnDef(this.actionsColumnDef);\n }\n\n this.#columnSettings.start();\n this.#columnSettings\n .saved()\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((settings: IRtTable.ColumnSettings): void => this.applyColumnSettings(settings));\n }\n\n public override ngOnDestroy(): void {\n if (this.actionsColumnDef !== undefined) {\n this.removeColumnDef(this.actionsColumnDef);\n }\n this.#columnSettings.stop();\n super.ngOnDestroy();\n }\n\n /**\n * Переключает порядок по колонке: по возрастанию → по убыванию → без сортировки.\n * Выбранное состояние уходит наружу — выборку делает потребитель.\n */\n public toggleSort(propertyName: string): void {\n const selected: ISortModel<string> | null = nextSort(this.#sort(), propertyName);\n this.#sort.set(selected);\n this.sortChange.emit(selected);\n }\n\n /** Ячейка отбора сообщила новый набор условий — таблица отдаёт его наружу целиком. */\n public reportFilters(filters: ReadonlyArray<IFilterModel<string>>): void {\n this.filtersChange.emit(filters);\n }\n\n public applyColumnSettings(settings: IRtTable.ColumnSettings): void {\n this.#columnSettings.apply(settings);\n }\n\n /**\n * Пробрасывает `dataSource` в CdkTable и отдельно инвалидирует signals,\n * которые вычисляют loading/empty-состояния по plain CDK input.\n */\n public override set dataSource(dataSource: CdkTableDataSourceInput<TRow>) {\n super.dataSource = dataSource;\n this.#dataSourceVersion.update((version: number): number => version + 1);\n }\n\n /** Возвращает текущий источник данных, сохранённый базовым CdkTable. */\n public override get dataSource(): CdkTableDataSourceInput<TRow> {\n return super.dataSource;\n }\n\n /** Есть ли строки в `dataSource`; признак версии пересчитывает ответ при смене источника. */\n #hasData(): boolean {\n this.#dataSourceVersion();\n return hasRowsIn(this.dataSource);\n }\n}\n","<ng-container rtBlock=\"rt-table\">\n <ng-content select=\"caption\" />\n <ng-content select=\"colgroup, col\" />\n\n <ng-container cdkColumnDef=\"rtRowActions\">\n <th *cdkHeaderCellDef rtElem=\"actions-header\" cdk-header-cell aria-hidden=\"true\"></th>\n <td *cdkCellDef=\"let row\" rtElem=\"actions-cell\" qa-dataid=\"table-row-actions\" cdk-cell>\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"actions-float\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n </td>\n </ng-container>\n\n <ng-container headerRowOutlet />\n\n @if (showFilters()) {\n <tr rtElem=\"filter-row\" qa-dataid=\"table-filter-row\">\n @for (cell of filterCells(); track cell.key) {\n <th\n rtElem=\"filter-cell\"\n qa-dataid=\"table-filter-cell\"\n [rtMod]=\"{ actions: cell.actions }\"\n [attr.aria-hidden]=\"cell.actions || null\">\n @if (cell.filter) {\n <rt-table-filter-header\n [propertyName]=\"cell.key\"\n [filter]=\"cell.filter\"\n [filters]=\"filters()\"\n (filtersChange)=\"reportFilters($event)\" />\n }\n </th>\n }\n </tr>\n }\n\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <tr rtElem=\"skeleton-row\" qa-dataid=\"table-skeleton-row\">\n @for (col of displayedColumns(); track col) {\n <td rtElem=\"skeleton-cell\">\n <rt-skeleton rtElem=\"skeleton-bar\" />\n </td>\n }\n </tr>\n }\n }\n\n <ng-container rowOutlet />\n <ng-container noDataRowOutlet />\n <ng-container footerRowOutlet />\n\n @if (isEmpty()) {\n <tr rtElem=\"empty-row\" qa-dataid=\"table-empty-row\">\n <td rtElem=\"empty\" [attr.colspan]=\"displayedColumns().length || null\">\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n </td>\n </tr>\n }\n\n @if (showCards()) {\n <div rtElem=\"cards\" qa-dataid=\"table-cards\" role=\"list\">\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <article rtElem=\"card\" qa-dataid=\"table-skeleton-card\" [rtMod]=\"{ skeleton: true }\">\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n </article>\n }\n } @else if (isEmpty()) {\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n } @else {\n @for (row of cardRows(); track row; let index = $index) {\n <article\n rtElem=\"card\"\n qa-dataid=\"table-card\"\n role=\"listitem\"\n [rtTableCardActivation]=\"index\"\n [rtTableCardActivationEnabled]=\"clickable()\">\n @if (cardTemplate()?.template; as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n } @else {\n @for (col of cardColumns(); track col.key) {\n <div rtElem=\"card-field\" qa-dataid=\"table-card-field\" [attr.data-key]=\"col.key\">\n <span rtElem=\"card-label\" qa-dataid=\"table-card-label\">{{ col.label }}</span>\n <div rtElem=\"card-value\" qa-dataid=\"table-card-value\">\n <ng-container [ngTemplateOutlet]=\"col.cell\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </div>\n </div>\n }\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"card-actions\" qa-dataid=\"table-card-actions\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n }\n </article>\n }\n }\n </div>\n }\n</ng-container>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, InputSignal, Signal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { EListSortOrder, TListSortOrderType } from '@rt-tools/utils';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { ariaSortOf, TRtTableAriaSort, isColumnSortable, sortDirectionOf } from '../rt-table-sort.logic';\nimport { RtTableComponent } from '../rt-table.component';\n\nconst BEM_BLOCK: string = 'rt-table-sort-header';\n\n/** Иконка направления: без сортировки — обе стрелки, иначе стрелка выбранного порядка. */\nconst ICONS: Readonly<Record<TListSortOrderType | 'none', IRtIcon.Name>> = Object.freeze({\n none: 'sort-alt',\n [EListSortOrder.ASC]: 'arrow-up',\n [EListSortOrder.DESC]: 'arrow-down',\n});\n\n/**\n * Заголовок сортируемой колонки — атрибутом на ячейке шапки:\n * `<th *cdkHeaderCellDef cdk-header-cell rtSortHeader=\"checkIn\">Заезд</th>`.\n *\n * Подпись проецируется внутрь кнопки, и доступное имя кнопки берётся из неё — порядок\n * меняется не только мышью. Текущее направление читается с самой колонки через\n * `aria-sort`, а видно его по стрелке.\n *\n * Колонка сортируется, только когда помечена `sortable` в `[columnsConfig]` таблицы;\n * иначе заголовок остаётся обычной подписью. Элементная форма селектора нужна правилу\n * префиксов и в разметке не применяется: `aria-sort` принадлежит ячейке шапки.\n */\n@Component({\n selector: 'rt-table-sort-header, th[rtSortHeader]',\n templateUrl: './rt-table-sort-header.component.html',\n styleUrl: './rt-table-sort-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // rt-tools\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // components\n RtIconComponent,\n ],\n host: {\n class: BEM_BLOCK,\n '[attr.aria-sort]': 'ariaSort()',\n },\n})\nexport class RtTableSortHeaderComponent {\n readonly #table: RtTableComponent<unknown> = inject<RtTableComponent<unknown>>(RtTableComponent);\n\n /** Направление сортировки по этой колонке; `null` — сортирует другая либо никакая. */\n protected readonly direction: Signal<TListSortOrderType | null> = computed((): TListSortOrderType | null =>\n sortDirectionOf(this.#table.currentSort(), this.rtSortHeader())\n );\n\n protected readonly icon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => ICONS[this.direction() ?? 'none']);\n\n protected readonly sortable: Signal<boolean> = computed((): boolean =>\n isColumnSortable(this.#table.columnsConfig(), this.rtSortHeader())\n );\n\n /** Ключ колонки — тот же, что в `cdkColumnDef` и в `[columnsConfig]`. */\n public readonly rtSortHeader: InputSignal<string> = input.required<string>();\n\n public readonly ariaSort: Signal<TRtTableAriaSort> = computed((): TRtTableAriaSort =>\n ariaSortOf(this.#table.currentSort(), this.rtSortHeader())\n );\n\n protected onToggle(): void {\n this.#table.toggleSort(this.rtSortHeader());\n }\n}\n","<ng-template #label>\n <ng-content />\n</ng-template>\n\n<ng-container rtBlock=\"rt-table-sort-header\">\n @if (sortable()) {\n <button\n rtElem=\"button\"\n qa-dataid=\"table-sort-header\"\n type=\"button\"\n [attr.data-column]=\"rtSortHeader()\"\n [attr.data-direction]=\"direction()\"\n [rtMod]=\"{ active: direction() !== null }\"\n (click)=\"onToggle()\">\n <ng-container [ngTemplateOutlet]=\"label\" />\n <rt-icon rtElem=\"icon\" size=\"xs\" [name]=\"icon()\" />\n </button>\n } @else {\n <ng-container [ngTemplateOutlet]=\"label\" />\n }\n</ng-container>\n","import { Directive, output, OutputEmitterRef } from '@angular/core';\n\nimport { isFromInteractive } from './rt-table-row.logic';\n\n/**\n * Делает строку таблицы (`<tr cdk-row>`) активируемой — общий паттерн «клик по\n * строке открывает деталь/асайд». Инкапсулирует доступность: строка становится\n * focusable, активируется кликом и Enter/Space, наружу отдаёт `(activated)`.\n *\n * Клик/клавиша по интерактивному потомку (кнопка/ссылка/контрол) активацией\n * строки НЕ считается — иначе вложенные действия конфликтовали бы с переходом.\n * Роль строки не переопределяется (table-семантика для скрин-ридеров сохраняется).\n * Визуальный аффорданс (cursor/hover/focus-ring) включает `[clickable]` на rt-table.\n */\n@Directive({\n selector: '[rtTableRow]',\n host: {\n tabindex: '0',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onKey($event)',\n '(keydown.space)': 'onKey($event)',\n },\n})\nexport class RtTableRowDirective {\n public readonly activated: OutputEmitterRef<void> = output<void>();\n\n protected onClick(event: MouseEvent): void {\n if (isFromInteractive(event.target)) {\n return;\n }\n this.activated.emit();\n }\n\n protected onKey(event: Event): void {\n if (isFromInteractive(event.target)) {\n return;\n }\n // Space иначе проскроллит страницу — гасим дефолт перед активацией.\n event.preventDefault();\n this.activated.emit();\n }\n}\n","import { CdkDrag, CdkDragDrop, CdkDragHandle, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { inject, model, ChangeDetectionStrategy, Component, ModelSignal, Signal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } 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 { IRtTable } from '../rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table-settings-panel';\n\n/**\n * Презентационный редактор списка колонок таблицы: reorder (drag-drop) + видимость\n * (глаз). Locked-колонки всегда видимы и не перетаскиваются. Двусторонний `items` —\n * текущее состояние; контейнер (route-асайд настроек) владеет сигналом, читает его\n * для «Сохранить»/«Сбросить» и передаёт сюда через `[(items)]`.\n */\n@Component({\n selector: 'rt-table-settings-panel',\n templateUrl: './rt-table-settings-panel.component.html',\n styleUrl: './rt-table-settings-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // @angular/cdk\n CdkDrag,\n CdkDragHandle,\n CdkDropList,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTableSettingsPanelComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n public readonly items: ModelSignal<ReadonlyArray<IRtTable.ColumnSettingItem>> =\n model.required<ReadonlyArray<IRtTable.ColumnSettingItem>>();\n\n /** Reorder через drag-drop. Locked-строки drag-disabled; индексы — по всему списку. */\n protected onDrop(event: CdkDragDrop<ReadonlyArray<IRtTable.ColumnSettingItem>>): void {\n if (event.previousIndex === event.currentIndex) {\n return;\n }\n const next: IRtTable.ColumnSettingItem[] = [...this.items()];\n moveItemInArray(next, event.previousIndex, event.currentIndex);\n this.items.set(next);\n }\n\n /** Переключить видимость колонки (locked — нельзя). */\n protected onToggleHidden(key: string): void {\n this.items.update((items: ReadonlyArray<IRtTable.ColumnSettingItem>): ReadonlyArray<IRtTable.ColumnSettingItem> =>\n items.map((item: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem =>\n item.key === key && item.locked !== true ? { ...item, hidden: !item.hidden } : item\n )\n );\n }\n}\n","<ul rtBlock=\"rt-table-settings-panel\" rtElem=\"list\" qa-dataid=\"table-settings-list\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n @for (item of items(); track item.key) {\n <li\n rtElem=\"row\"\n qa-dataid=\"table-settings-row\"\n cdkDrag\n [attr.data-key]=\"item.key\"\n [rtMod]=\"{ locked: item.locked === true, hidden: item.hidden }\"\n [cdkDragDisabled]=\"item.locked === true\">\n @if (item.locked === true) {\n <span rtElem=\"handle\" rtMod=\"placeholder\" aria-hidden=\"true\"></span>\n } @else {\n <button rtElem=\"handle\" qa-dataid=\"table-settings-drag\" type=\"button\" cdkDragHandle [attr.aria-label]=\"t().uiDragColumn\">\n <rt-icon name=\"bars\" size=\"sm\" color=\"muted\" />\n </button>\n }\n\n <span rtElem=\"label\" qa-dataid=\"table-settings-label\">{{ item.label }}</span>\n\n <rt-icon-button\n rtElem=\"toggle\"\n qa-dataid=\"table-settings-toggle\"\n [icon]=\"item.hidden ? 'eye-slash' : 'eye'\"\n [ariaLabel]=\"item.hidden ? t().uiShowColumn : t().uiHideColumn\"\n [tooltip]=\"item.locked === true ? t().uiColumnLocked : item.hidden ? t().uiShow : t().uiHide\"\n [disabled]=\"item.locked === true\"\n (clicked)=\"onToggleHidden(item.key)\" />\n </li>\n }\n</ul>\n","import {\n computed,\n effect,\n inject,\n signal,\n ChangeDetectionStrategy,\n Component,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { Observable, of } from 'rxjs';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtAsideFooterComponent } from '@rt-tools/ui-kit-v2/aside';\nimport { RtAsideHeaderComponent } from '@rt-tools/ui-kit-v2/aside';\nimport { RtAsideComponent } from '@rt-tools/ui-kit-v2/aside';\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtContainerRightSidenavPanelDirective } from '@rt-tools/ui-kit-v2/container';\nimport { RtRouteAsideComponent } from '@rt-tools/ui-kit-v2/container';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtTableSettingsPanelComponent } from '../settings-panel/rt-table-settings-panel.component';\nimport { RtTableSettingsRegistry, type IRtTableSettingsRegistration } from '../rt-table-settings.registry';\nimport { IRtTable } from '../rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table-settings-aside';\n\n/**\n * Общий route-driven side-sheet настроек колонок для любой `rt-table`. Открывается\n * навигацией на `(ro:table-settings)`; какая таблица настраивается — берётся из\n * `RtTableSettingsRegistry.active()` (потребитель выставляет `setActive(tableId)`\n * перед навигацией). Create-mode: id в route нет (`tableId` — строка, числовой базой\n * не резолвится).\n *\n * Тело списка (drag-reorder + видимость) — переиспользуемый `rt-table-settings-panel`;\n * «Сохранить»/«Сбросить» живут в chrome асайда над локальным `items`, засеянным из\n * активной регистрации. Регистрируется в `routes.ts` каждого shell под `outlet: \"ro\"`.\n */\n@Component({\n selector: 'rt-table-settings-aside',\n templateUrl: './rt-table-settings-aside.component.html',\n styleUrls: ['./rt-table-settings-aside.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n RtAsideComponent,\n RtAsideFooterComponent,\n RtAsideHeaderComponent,\n RtButtonDirective,\n RtContainerRightSidenavPanelDirective,\n RtIconButtonComponent,\n RtTableSettingsPanelComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTableSettingsAsideComponent extends RtRouteAsideComponent<never> {\n readonly #registry: RtTableSettingsRegistry = inject(RtTableSettingsRegistry);\n\n /**\n * `active` на момент создания асайда: `null` — восстановление после F5\n * (`setActive` никто не звал), непустой id — штатное открытие потребителем.\n */\n readonly #initialActive: string | null = this.#registry.active();\n\n /** Регистрация активной таблицы (её колонки/дефолты/apply). Реактивна к реестру. */\n readonly #registration: Signal<IRtTableSettingsRegistration | null> = computed((): IRtTableSettingsRegistration | null => {\n const tableId: string | null = this.#registry.active();\n return tableId !== null ? this.#registry.get(tableId)() : null;\n });\n\n /** Рабочая копия списка колонок (сидится из регистрации, редактируется телом-панелью). */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly items: WritableSignal<ReadonlyArray<IRtTable.ColumnSettingItem>> = signal<ReadonlyArray<IRtTable.ColumnSettingItem>>(\n []\n );\n\n #seeded: boolean = false;\n\n /** Асайд восстановил `active` сам (после F5) — дальше живёт по штатным правилам. */\n #adopted: boolean = false;\n\n constructor() {\n super();\n // Фикс F-16: после F5 асайд инициализируется раньше `rt-table`, реестр в\n // этот момент пуст и `active` сброшен (root-сервис пересоздан). Вместо\n // самозакрытия на первом промахе ждём регистрацию: страница регистрирует\n // ровно одну настраиваемую таблицу — она и становится активной.\n if (this.#initialActive === null) {\n effect((): void => {\n // Усыновление одноразовое: после него асайд живёт по штатным\n // правилам (уход со страницы = закрытие), а не перепрыгивает\n // на таблицу следующей страницы.\n if (this.#adopted || this.#registry.active() !== null) {\n return;\n }\n const sole: string | null = this.#registry.soleTableId();\n if (sole !== null) {\n this.#adopted = true;\n this.#registry.setActive(sole);\n }\n });\n }\n effect((): void => {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n const panel: RtContainerRightSidenavPanelDirective | undefined = this.panel();\n if (panel === undefined || !panel.ready()) {\n return;\n }\n if (registration === null) {\n // Штатно открытый (или уже усыновивший таблицу) асайд закрывается,\n // когда регистрация исчезла — уход со страницы таблицы. Асайд,\n // восстановленный после F5, регистрацию ещё ЖДЁТ — не закрываемся.\n if (this.#initialActive !== null || this.#adopted) {\n this.onClose();\n }\n return;\n }\n if (!this.#seeded) {\n this.#seeded = true;\n this.items.set(\n registration.columns().map((c: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem => ({\n ...c,\n }))\n );\n }\n });\n }\n\n protected resolve(): Observable<never | null> {\n return of(null);\n }\n\n /** Сбросить рабочую копию к дефолтным колонкам из конфига. */\n protected onReset(): void {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n if (registration === null) {\n return;\n }\n this.items.set(registration.defaults().map((c: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem => ({ ...c })));\n }\n\n /** Применить настройки к таблице (через registry) и закрыть асайд. */\n protected onSave(): void {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n if (registration !== null) {\n const items: ReadonlyArray<IRtTable.ColumnSettingItem> = this.items();\n registration.apply({\n order: items.map((item: IRtTable.ColumnSettingItem): string => item.key),\n hidden: items\n .filter((item: IRtTable.ColumnSettingItem): boolean => item.hidden)\n .map((item: IRtTable.ColumnSettingItem): string => item.key),\n });\n }\n this.#registry.clearActive();\n this.onClose();\n }\n}\n","<ng-container rtContainerRightSidenavPanel #panel=\"rtContainerRightPanel\" (cancelled)=\"onCancel()\" (closed)=\"onClosed()\" />\n\n<rt-aside [ariaLabel]=\"t().uiColumnSettings\">\n <rt-aside-header [title]=\"t().uiColumnSettingsTitle\" (dismiss)=\"onClose()\">\n <rt-icon-button\n asideActions\n qa-dataid=\"table-settings-reset\"\n icon=\"undo\"\n variant=\"ghost\"\n [tooltip]=\"t().uiResetDefaults\"\n [ariaLabel]=\"t().uiResetDefaults\"\n (clicked)=\"onReset()\" />\n </rt-aside-header>\n\n <rt-table-settings-panel [(items)]=\"items\" />\n\n <rt-aside-footer>\n <button\n rtButton\n asideDismiss\n qa-dataid=\"table-settings-close\"\n type=\"button\"\n appearance=\"text\"\n [label]=\"t().uiClose\"\n [attr.aria-label]=\"t().uiClose\"\n (click)=\"onClose()\"></button>\n <button\n rtButton\n asidePrimary\n qa-dataid=\"table-settings-save\"\n type=\"button\"\n [label]=\"t().uiSave\"\n [attr.aria-label]=\"t().uiSave\"\n (click)=\"onSave()\"></button>\n </rt-aside-footer>\n</rt-aside>\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-table.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/table/copy-cell/rt-copy-cell.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/copy-cell/rt-copy-cell.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-sort.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-columns.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-filter.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/filter-header/rt-table-filter-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/filter-header/rt-table-filter-header.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-card.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-cards.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-card-activation.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.logic.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row-actions.pipe.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-settings.persistence.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-settings.registry.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-column-settings.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/rt-table.component.html","../../../projects/ui-kit-v2/src/lib/components/table/sort-header/rt-table-sort-header.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/sort-header/rt-table-sort-header.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-table-row.directive.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-panel/rt-table-settings-panel.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-panel/rt-table-settings-panel.component.html","../../../projects/ui-kit-v2/src/lib/components/table/settings-aside/rt-table-settings-aside.component.ts","../../../projects/ui-kit-v2/src/lib/components/table/settings-aside/rt-table-settings-aside.component.html","../../../projects/ui-kit-v2/src/lib/components/table/rt-tools-ui-kit-v2-table.ts"],"sourcesContent":["import { Clipboard } from '@angular/cdk/clipboard';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n signal,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nimport { TRtKitLabelKey, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtIconButton } from '@rt-tools/ui-kit-v2/icon-button';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtTooltipDirective } from '@rt-tools/ui-kit-v2/tooltip';\n\nconst BEM_BLOCK: string = 'rt-copy-cell';\n\n/** Значение для буфера: явная строка/число либо `null` (тогда берётся отображаемый текст). */\ntype TCopyValue = string | number | null;\n\n/**\n * Ключи подписей действия в покое и после копирования (tooltip и aria-label).\n *\n * Здесь ключи, а не готовый текст: константа вычисляется при загрузке чанка,\n * когда язык страницы ещё не выбран, — переводит сам компонент.\n */\nconst COPY_KEY: TRtKitLabelKey = 'uiCopy';\nconst COPIED_KEY: TRtKitLabelKey = 'uiCopied';\n\n/** Сколько держать состояние «скопировано» перед сбросом иконки/подписи. */\nconst RESET_DELAY_MS: number = 2000;\n\n/**\n * Ячейка с копированием в буфер — переиспользуемый примитив для `cdkCellDef`\n * (и не только). rt-table projection-driven: контент ячейки пишет\n * потребитель, поэтому копирование оформлено отдельным cell-level компонентом,\n * а не флагом на конфиге колонки.\n *\n * Потребитель проецирует отображаемый контент через `<ng-content>`. Что уйдёт в\n * буфер:\n * - если задан `[value]` — ровно он (нужно когда копируемое отличается от\n * отображаемого: для id-ячейки показываем `#123`, копируем `123`);\n * - если `[value]` не задан — берётся отображаемый текст (textContent\n * проецируемого контента, схлопнутые пробелы) — «копировать как показано»,\n * удобно для составных ячеек (`#7 — Имя`).\n *\n * По умолчанию кнопка скрыта и проявляется при наведении/фокусе (для плотных\n * таблиц). Вне таблиц (модалки, карточки) строки для hover нет — там\n * `revealOnHover=\"false\"` держит кнопку всегда видимой. Палитра кнопки —\n * через `variant` (по умолчанию `ghost`). После клика на `RESET_DELAY_MS`\n * иконка меняется `copy`→`check`, подпись — на «Скопировано».\n */\n@Component({\n selector: 'rt-copy-cell',\n templateUrl: './rt-copy-cell.component.html',\n styleUrls: ['./rt-copy-cell.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconButtonComponent,\n BlockDirective,\n ElemDirective,\n RtTooltipDirective,\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-copy-cell--static]': '!revealOnHover()',\n '(mouseenter)': 'measureTruncation()',\n '(focusin)': 'measureTruncation()',\n },\n})\nexport class RtCopyCellComponent {\n readonly #clipboard: Clipboard = inject(Clipboard);\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #host: ElementRef<HTMLElement> = inject(ElementRef);\n\n #resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly #copyLabel: Signal<string> = rtKitLabel(COPY_KEY);\n readonly #copiedLabel: Signal<string> = rtKitLabel(COPIED_KEY);\n\n protected readonly copied: WritableSignal<boolean> = signal(false);\n\n /**\n * Подсказка со значением целиком — только у обрезанного.\n *\n * У помещающегося она повторяла бы то, что человек и так читает, и всплывала бы над каждой\n * ячейкой таблицы; пустая строка директиву подсказки выключает.\n */\n protected readonly hint: WritableSignal<string> = signal('');\n\n protected readonly iconName: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => (this.copied() ? 'check' : 'copy'));\n\n protected readonly actionLabel: Signal<string> = computed((): string => (this.copied() ? this.#copiedLabel() : this.#copyLabel()));\n\n /**\n * Строка для буфера. Если не задана — копируется отображаемый текст\n * (textContent проецируемого контента). Число приводится к строке.\n */\n public readonly value: InputSignal<TCopyValue> = input<TCopyValue>(null);\n\n /** Палитра кнопки копирования. В таблицах — `ghost`; вне таблиц удобнее `secondary`. */\n public readonly variant: InputSignal<IRtIconButton.Variant> = input<IRtIconButton.Variant>('ghost');\n\n /**\n * Прятать кнопку до наведения/фокуса (поведение плотных таблиц). `false` —\n * кнопка всегда видима: нужно вне таблиц (модалки/карточки), где нет строки\n * для hover.\n */\n public readonly revealOnHover: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n constructor() {\n this.#destroyRef.onDestroy((): void => this.#clearTimer());\n }\n\n /**\n * Замер обрезки в момент наведения.\n *\n * Ширина известна только отрисованному узлу, а меняется она и от переезда столбца, и от\n * ширины окна: посчитанная один раз при заведении, она соврала бы при первом же изменении.\n */\n protected measureTruncation(): void {\n const content: HTMLElement | null = this.#host.nativeElement.querySelector(`.${BEM_BLOCK}__content`);\n const truncated: boolean = content !== null && content.scrollWidth > content.clientWidth;\n\n this.hint.set(truncated ? this.#displayedText() : '');\n }\n\n protected onCopy(event: MouseEvent): void {\n // Гасим всплытие, чтобы клик/Enter по кнопке не активировал кликабельную\n // строку (rtTableRow) и не дошёл до прочих row-level слушателей.\n event.stopPropagation();\n\n this.#clipboard.copy(this.#resolveText());\n this.copied.set(true);\n\n this.#clearTimer();\n this.#resetTimer = setTimeout((): void => this.copied.set(false), RESET_DELAY_MS);\n }\n\n /** Явный `value` приоритетнее; иначе — отображаемый текст со схлопнутыми пробелами. */\n #resolveText(): string {\n const explicit: TCopyValue = this.value();\n if (explicit !== null) {\n return String(explicit);\n }\n\n return this.#displayedText();\n }\n\n /** Отображаемый текст со схлопнутыми пробелами: он же уходит в подсказку обрезанного. */\n #displayedText(): string {\n const content: Element | null = this.#host.nativeElement.querySelector(`.${BEM_BLOCK}__content`);\n\n return (content?.textContent ?? '').replace(/\\s+/g, ' ').trim();\n }\n\n #clearTimer(): void {\n if (this.#resetTimer !== null) {\n clearTimeout(this.#resetTimer);\n this.#resetTimer = null;\n }\n }\n}\n","<ng-container rtBlock=\"rt-copy-cell\">\n <span rtElem=\"content\" qa-dataid=\"copy-cell-content\" [rtTooltip]=\"hint()\"><ng-content /></span>\n <rt-icon-button\n rtElem=\"button\"\n qa-dataid=\"copy-cell-button\"\n size=\"sm\"\n [icon]=\"iconName()\"\n [variant]=\"variant()\"\n [ariaLabel]=\"actionLabel()\"\n [tooltip]=\"actionLabel()\"\n (clicked)=\"onCopy($event)\" />\n</ng-container>\n","import { EListSortOrder, TListSortOrderType, ISortModel } from '@rt-tools/utils';\n\nimport { IRtTable } from './rt-table.model';\n\n/** Значение атрибута `aria-sort` заголовка: направление либо его отсутствие. */\nexport type TRtTableAriaSort = 'ascending' | 'descending' | 'none';\n\n/**\n * Следующее состояние сортировки при нажатии на заголовок колонки.\n *\n * Порядок кругов: по возрастанию → по убыванию → без сортировки. Третье состояние\n * нужно, чтобы пользователь мог вернуть исходный порядок, не перезагружая список.\n */\nexport function nextSort(current: ISortModel<string> | null, propertyName: string): ISortModel<string> | null {\n if (current === null || current.propertyName !== propertyName) {\n return { propertyName, sortDirection: EListSortOrder.ASC };\n }\n if (current.sortDirection === EListSortOrder.ASC) {\n return { propertyName, sortDirection: EListSortOrder.DESC };\n }\n\n return null;\n}\n\n/** Направление сортировки по этой колонке либо `null`, когда сортирует другая. */\nexport function sortDirectionOf(current: ISortModel<string> | null, propertyName: string): TListSortOrderType | null {\n return current !== null && current.propertyName === propertyName ? current.sortDirection : null;\n}\n\n/** Значение `aria-sort` заголовка: направление читается скринридером с самой колонки. */\nexport function ariaSortOf(current: ISortModel<string> | null, propertyName: string): TRtTableAriaSort {\n const direction: TListSortOrderType | null = sortDirectionOf(current, propertyName);\n if (direction === null) {\n return 'none';\n }\n\n return direction === EListSortOrder.ASC ? 'ascending' : 'descending';\n}\n\n/**\n * Сортируется ли колонка. Колонка, описанная в `columnsConfig`, сортируется только\n * по своему признаку; колонки, которой в конфиге нет, метаданных взять неоткуда —\n * объявлением служит сам заголовок.\n */\nexport function isColumnSortable(config: ReadonlyArray<IRtTable.ColumnConfig>, key: string): boolean {\n const column: IRtTable.ColumnConfig | undefined = config.find((candidate: IRtTable.ColumnConfig): boolean => candidate.key === key);\n\n return column === undefined ? true : column.sortable === true;\n}\n","import { IRtTable } from './rt-table.model';\n\n/** Имя внутренней «…»-колонки действий, добавляемой при `[showRowActions]`. */\nexport const RT_TABLE_ROW_ACTIONS_COLUMN: string = 'rtRowActions';\n\n/**\n * Колонки конфига без применённых настроек пользователя — источник для кнопки\n * «Сбросить» в панели. Закрытая колонка видима всегда: скрыть её панель не даёт.\n */\nexport function defaultColumnItems(config: ReadonlyArray<IRtTable.ColumnConfig>): ReadonlyArray<IRtTable.ColumnSettingItem> {\n return config.map((column: IRtTable.ColumnConfig): IRtTable.ColumnSettingItem => ({\n ...column,\n hidden: column.locked === true ? false : column.hidden === true,\n }));\n}\n\n/**\n * Разрешённые колонки настраиваемой таблицы: конфиг в применённом порядке с текущим\n * признаком скрытия.\n *\n * Порядок берётся из сохранённых настроек, а колонки, появившиеся в конфиге после\n * сохранения, встают в конец: настройки, снятые с прежнего состава, иначе прятали бы\n * новую колонку молча. Настроек нет — порядок и скрытие берутся из самого конфига.\n */\nexport function resolveColumns(\n config: ReadonlyArray<IRtTable.ColumnConfig>,\n settings: IRtTable.ColumnSettings | null\n): ReadonlyArray<IRtTable.ColumnSettingItem> {\n if (config.length === 0) {\n return [];\n }\n\n const byKey: Map<string, IRtTable.ColumnConfig> = new Map(\n config.map((column: IRtTable.ColumnConfig): [string, IRtTable.ColumnConfig] => [column.key, column])\n );\n\n const orderedKeys: ReadonlyArray<string> = settings\n ? [\n ...settings.order.filter((key: string): boolean => byKey.has(key)),\n ...config\n .filter((column: IRtTable.ColumnConfig): boolean => !settings.order.includes(column.key))\n .map((column: IRtTable.ColumnConfig): string => column.key),\n ]\n : config.map((column: IRtTable.ColumnConfig): string => column.key);\n\n const hiddenKeys: ReadonlySet<string> = new Set(\n settings\n ? settings.hidden\n : config\n .filter((column: IRtTable.ColumnConfig): boolean => column.hidden === true)\n .map((column: IRtTable.ColumnConfig): string => column.key)\n );\n\n return orderedKeys\n .map((key: string): IRtTable.ColumnConfig | undefined => byKey.get(key))\n .filter((column: IRtTable.ColumnConfig | undefined): column is IRtTable.ColumnConfig => column !== undefined)\n .map((column: IRtTable.ColumnConfig): IRtTable.ColumnSettingItem => ({\n ...column,\n hidden: column.locked === true ? false : hiddenKeys.has(column.key),\n }));\n}\n\n/**\n * Имена колонок для строк CDK: у настраиваемой таблицы — видимые в применённом порядке,\n * у остальных — то, что назвал вход `[columns]`. Колонка действий встаёт последней, когда\n * действия строки включены.\n */\nexport function displayedColumnKeys(\n resolved: ReadonlyArray<IRtTable.ColumnSettingItem>,\n legacyColumns: ReadonlyArray<string>,\n configurable: boolean,\n showRowActions: boolean\n): ReadonlyArray<string> {\n const base: ReadonlyArray<string> = configurable\n ? resolved\n .filter((column: IRtTable.ColumnSettingItem): boolean => !column.hidden)\n .map((column: IRtTable.ColumnSettingItem): string => column.key)\n : [...legacyColumns];\n\n return showRowActions ? [...base, RT_TABLE_ROW_ACTIONS_COLUMN] : [...base];\n}\n\n/**\n * Настройки панели, приведённые к конфигу: ключи закрытых колонок из списка скрытых\n * вычищаются. Панель их не предлагает, но настройки приезжают и из хранилища — снятые с\n * той поры, когда колонка закрытой ещё не была.\n */\nexport function withoutLockedHidden(\n config: ReadonlyArray<IRtTable.ColumnConfig>,\n settings: IRtTable.ColumnSettings\n): IRtTable.ColumnSettings {\n const lockedKeys: ReadonlySet<string> = new Set(\n config\n .filter((column: IRtTable.ColumnConfig): boolean => column.locked === true)\n .map((column: IRtTable.ColumnConfig): string => column.key)\n );\n\n return {\n order: [...settings.order],\n hidden: settings.hidden.filter((key: string): boolean => !lockedKeys.has(key)),\n };\n}\n","import { EFilterOperatorType, IFilterModel, TFilterOperatorType } from '@rt-tools/utils';\n\nimport { RT_TABLE_ROW_ACTIONS_COLUMN } from './rt-table-columns.logic';\nimport { IRtTable } from './rt-table.model';\n\n/** Значение условия в том виде, в каком оно хранится и сверяется. */\nexport type TRtTableFilterValue = string | number | boolean;\n\n/** Что приходит в ячейку от человека: дата приходит объектом, остальное — уже готовым значением. */\nexport type TRtTableFilterInput = TRtTableFilterValue | Date | null | undefined;\n\n/**\n * Значение в том виде, в каком оно хранится: дата — строкой.\n *\n * `Date` не равен строке никогда, и без приведения повторный выбор той же даты каждый раз\n * считался бы новым значением — а тогда статья «повтор того же значения не сообщает ничего»\n * не держалась бы именно там, где её проще всего нарушить.\n */\nexport function filterValueOf(value: TRtTableFilterInput): TRtTableFilterValue {\n return value instanceof Date ? value.toISOString() : (value ?? '');\n}\n\n/** Условие по этой колонке из набора либо `null`, когда колонка ничего не отбирает. */\nexport function filterOf(filters: readonly IFilterModel<string>[], propertyName: string): IFilterModel<string> | null {\n return filters.find((filter: IFilterModel<string>): boolean => filter.propertyName === propertyName) ?? null;\n}\n\n/**\n * Набор условий после перемены значения по одной колонке.\n *\n * Пустое значение снимает колонку с отбора, а не уходит пустым условием: условие без значения\n * просит потребителя ответить «подходит всё», и потребитель, прочитавший его буквально, не\n * вернёт ни одной строки.\n *\n * Возвращает прежний набор тем же объектом, когда менять нечего: по этому признаку ячейка и\n * решает, сообщать ли наружу.\n */\nexport function filtersWithValue(\n filters: readonly IFilterModel<string>[],\n propertyName: string,\n operatorType: TFilterOperatorType,\n value: TRtTableFilterValue\n): readonly IFilterModel<string>[] {\n const current: IFilterModel<string> | null = filterOf(filters, propertyName);\n\n if (value === '') {\n return current === null ? filters : filters.filter((filter: IFilterModel<string>): boolean => filter !== current);\n }\n\n if (current === null) {\n return [...filters, { propertyName, operatorType, value }];\n }\n\n if (current.value === value) {\n return filters;\n }\n\n return filters.map((filter: IFilterModel<string>): IFilterModel<string> => (filter === current ? { ...filter, value } : filter));\n}\n\n/**\n * Набор условий после перемены вида сравнения по одной колонке.\n *\n * Пока значения нет, менять вид сравнения не у чего: отбирать нечего, и набор условий не\n * изменился — значит, наружу ничего не уходит.\n */\nexport function filtersWithOperator(\n filters: readonly IFilterModel<string>[],\n propertyName: string,\n operatorType: TFilterOperatorType\n): readonly IFilterModel<string>[] {\n const current: IFilterModel<string> | null = filterOf(filters, propertyName);\n\n if (current === null || current.operatorType === operatorType) {\n return filters;\n }\n\n return filters.map((filter: IFilterModel<string>): IFilterModel<string> => (filter === current ? { ...filter, operatorType } : filter));\n}\n\n/** Вид сравнения, с которого колонка начинает: свой, первый разрешённый либо равенство. */\nexport function startOperatorOf(\n allowed: readonly TFilterOperatorType[] | undefined,\n start: TFilterOperatorType | undefined\n): TFilterOperatorType {\n if (start !== undefined) {\n return start;\n }\n\n return allowed !== undefined && allowed.length > 0 ? allowed[0] : EFilterOperatorType.EQUALS;\n}\n\n/**\n * Ячейки строки отбора: по ячейке на каждую показанную колонку, в том же порядке.\n *\n * У колонки без объявленного отбора ячейка пустая, и место своё она держит: убрать её значило бы\n * сдвинуть все следующие ячейки на одну колонку влево — поле города встало бы под шапкой цены.\n * Колонка действий строки приходит сюда тем же путём, последней, и отбора у неё нет никогда; её\n * ячейка помечена, чтобы строка отбора не дала ширины колонке, которая места не занимает.\n */\nexport function filterCellsOf(\n columns: ReadonlyArray<string>,\n config: ReadonlyArray<IRtTable.ColumnConfig>\n): ReadonlyArray<IRtTable.FilterCell> {\n return columns.map((key: string): IRtTable.FilterCell => {\n const column: IRtTable.ColumnConfig | undefined = config.find((item: IRtTable.ColumnConfig): boolean => item.key === key);\n\n return { key, filter: column?.filter ?? null, actions: key === RT_TABLE_ROW_ACTIONS_COLUMN };\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n InputSignal,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n output,\n untracked,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { EFilterOperatorType, IFilterModel, TFilterOperatorType } from '@rt-tools/utils';\n\nimport { TRtKitLabelKey } from '@rt-tools/ui-kit-v2/core';\nimport { rtKitLabel } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtDatePickerComponent } from '@rt-tools/ui-kit-v2/date-picker';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\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 { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { IRtSelect } from '@rt-tools/ui-kit-v2/select';\nimport { RtSelectComponent } from '@rt-tools/ui-kit-v2/select';\nimport {\n TRtTableFilterInput,\n TRtTableFilterValue,\n filterOf,\n filterValueOf,\n filtersWithOperator,\n filtersWithValue,\n startOperatorOf,\n} from '../rt-table-filter.logic';\nimport { IRtTable } from '../rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table-filter-header';\n\n/** Ключ подписи для каждого вида сравнения: имена операторов даёт словарь кита, а не шаблон. */\nconst OPERATOR_LABELS: Readonly<Record<TFilterOperatorType, TRtKitLabelKey>> = Object.freeze({\n [EFilterOperatorType.EQUALS]: 'uiFilterEquals',\n [EFilterOperatorType.NOT_EQUALS]: 'uiFilterNotEquals',\n [EFilterOperatorType.CONTAINS]: 'uiFilterContains',\n [EFilterOperatorType.STARTS_WITH]: 'uiFilterStartsWith',\n [EFilterOperatorType.ENDS_WITH]: 'uiFilterEndsWith',\n [EFilterOperatorType.GREATER_THAN]: 'uiFilterGreaterThan',\n [EFilterOperatorType.LESS_THAN]: 'uiFilterLessThan',\n});\n\n/**\n * Виды, у которых недописанного состояния нет вовсе: выбор и дата готовы в ту же минуту, что и\n * сделаны, и ждать ухода из поля значило бы задержать ответ на ровном месте. Текст и число ждут:\n * набор условий, уходящий на каждый знак, спрашивает сервер по букве.\n */\nconst INSTANT_KINDS: ReadonlySet<IRtTable.FilterKind> = new Set<IRtTable.FilterKind>(['select', 'date']);\n\n/** Одно и то же условие: колонка, вид сравнения и значение совпадают. */\nfunction sameFilter(a: IFilterModel<string> | null, b: IFilterModel<string> | null): boolean {\n if (a === null || b === null) {\n return a === b;\n }\n\n return a.propertyName === b.propertyName && a.operatorType === b.operatorType && a.value === b.value;\n}\n\n/** Один вид сравнения в списке: сам вид и его подпись из словаря. */\ninterface IOperatorView {\n readonly type: TFilterOperatorType;\n readonly label: string;\n}\n\n/** Виды сравнения по порядку: колонка разрешает своё подмножество, порядок берётся отсюда. */\nconst ALL_OPERATORS: readonly TFilterOperatorType[] = Object.freeze([\n EFilterOperatorType.EQUALS,\n EFilterOperatorType.NOT_EQUALS,\n EFilterOperatorType.CONTAINS,\n EFilterOperatorType.STARTS_WITH,\n EFilterOperatorType.ENDS_WITH,\n EFilterOperatorType.GREATER_THAN,\n EFilterOperatorType.LESS_THAN,\n]);\n\n/**\n * Отбор в шапке столбца таблицы.\n *\n * Стоит рядом с именем колонки: сужение, живущее в стороне от того, что сужает, не даёт увидеть,\n * какая колонка сузила список — человек читает короткий список и не узнаёт, почему он короткий.\n *\n * Своих полей не рисует ни одного: вид отбора решает, какую готовую часть кита позвать. Поля кита\n * ведутся формой, поэтому значение идёт через `FormControl`, а не входом со своим выходом.\n *\n * Наружу уходит весь набор условий, а не одно изменившееся: потребитель спрашивает сервер набором,\n * и, получив одно условие, держал бы вторую копию набора — две копии расходятся молча. Строк\n * семейство не отбирает: строки принадлежат тому, кто держит список.\n */\n@Component({\n selector: 'rt-table-filter-header',\n templateUrl: './rt-table-filter-header.component.html',\n styleUrl: './rt-table-filter-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n ReactiveFormsModule,\n\n // rt-tools\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // components\n RtDatePickerComponent,\n RtIconButtonComponent,\n RtInputComponent,\n RtInputNumberComponent,\n RtMenuItemComponent,\n RtPopoverDirective,\n RtSelectComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTableFilterHeaderComponent {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /**\n * Подпись каждого вида сравнения — своим сигналом словаря. Семь сигналов, а не один по\n * текущему виду: список показывает их все сразу, и подпись невыбранного вида нужна так же.\n */\n readonly #operatorLabels: Readonly<Record<TFilterOperatorType, Signal<string>>> = Object.freeze({\n [EFilterOperatorType.EQUALS]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.EQUALS]),\n [EFilterOperatorType.NOT_EQUALS]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.NOT_EQUALS]),\n [EFilterOperatorType.CONTAINS]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.CONTAINS]),\n [EFilterOperatorType.STARTS_WITH]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.STARTS_WITH]),\n [EFilterOperatorType.ENDS_WITH]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.ENDS_WITH]),\n [EFilterOperatorType.GREATER_THAN]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.GREATER_THAN]),\n [EFilterOperatorType.LESS_THAN]: rtKitLabel(OPERATOR_LABELS[EFilterOperatorType.LESS_THAN]),\n });\n\n /** Значение ведёт форма: поля кита берут его только так. */\n protected readonly control: FormControl<TRtTableFilterInput> = new FormControl<TRtTableFilterInput>('');\n\n /**\n * Условие по этой колонке либо `null`: по нему видно и значение, и вид сравнения. Сверяется по\n * содержимому, а не по ссылке: перемена соседней колонки приносит новый набор, и условие этой\n * колонки, пересобранное потребителем тем же, переменой не считается.\n */\n protected readonly own: Signal<IFilterModel<string> | null> = computed(\n (): IFilterModel<string> | null => filterOf(this.filters(), this.propertyName()),\n { equal: sameFilter }\n );\n\n /**\n * Вид сравнения, выбранный здесь, пока значения нет: условия ещё нет, и хранить выбор, кроме\n * самой ячейки, негде. Без него выбор терялся бы, и введённое значение уходило бы с видом по\n * умолчанию. Условие этой колонки, пришедшее снаружи, выбор сбрасывает — вид берётся из него.\n */\n protected readonly chosenOperator: WritableSignal<TFilterOperatorType | null> = linkedSignal<\n IFilterModel<string> | null,\n TFilterOperatorType | null\n >({ source: this.own, computation: (): TFilterOperatorType | null => null });\n\n protected readonly value: Signal<TRtTableFilterValue> = computed((): TRtTableFilterValue => this.own()?.value ?? '');\n\n /** Очистка видна только там, где есть что очищать. */\n protected readonly clearable: Signal<boolean> = computed((): boolean => this.value() !== '');\n\n protected readonly operator: Signal<TFilterOperatorType> = computed((): TFilterOperatorType => {\n const chosen: TFilterOperatorType | null = this.chosenOperator();\n\n if (chosen !== null) {\n return chosen;\n }\n\n const own: IFilterModel<string> | null = this.own();\n\n return own !== null ? own.operatorType : startOperatorOf(this.filter()?.operators, this.filter()?.startOperator);\n });\n\n /** Виды сравнения, которые разрешила колонка; молчит колонка — разрешены все. */\n protected readonly operators: Signal<readonly TFilterOperatorType[]> = computed((): readonly TFilterOperatorType[] => {\n const allowed: readonly TFilterOperatorType[] | undefined = this.filter()?.operators;\n\n return allowed !== undefined && allowed.length > 0 ? allowed : ALL_OPERATORS;\n });\n\n protected readonly chooseLabel: Signal<string> = rtKitLabel('uiFilterChoose');\n protected readonly valueLabel: Signal<string> = rtKitLabel('uiFilterValue');\n\n protected readonly clearLabel: Signal<string> = rtKitLabel('uiClear');\n protected readonly filtersLabel: Signal<string> = rtKitLabel('uiFilters');\n\n /** Список видов сравнения открыт в слое; выбор пункта закрывает его отсюда — сам пункт не умеет. */\n protected readonly operatorPopover: Signal<RtPopoverDirective | undefined> = viewChild(RtPopoverDirective);\n\n /** Список видов сравнения с подписями: шаблон читает готовое, а не зовёт словарь сам. */\n protected readonly operatorViews: Signal<readonly IOperatorView[]> = computed((): readonly IOperatorView[] =>\n this.operators().map((type: TFilterOperatorType): IOperatorView => ({ type, label: this.#operatorLabels[type]() }))\n );\n\n /** Подпись текущего вида сравнения — её несёт кнопка, открывающая список. */\n protected readonly operatorLabel: Signal<string> = computed((): string => this.#operatorLabels[this.operator()]());\n\n /**\n * Имя кнопки для скринридера: что она открывает и какой вид стоит сейчас. Одно «Фильтры»\n * не отличало бы кнопку одной колонки от другой и не говорило бы, какой вид выбран.\n */\n protected readonly operatorAriaLabel: Signal<string> = computed((): string => `${this.filtersLabel()}: ${this.operatorLabel()}`);\n\n /** Сообщает ли этот вид сразу: у выбора и даты недописанного состояния нет. */\n protected readonly instant: Signal<boolean> = computed((): boolean => INSTANT_KINDS.has(this.filter()?.kind ?? 'text'));\n\n protected readonly options: Signal<ReadonlyArray<IRtSelect.Option<string | number>>> = computed(\n (): ReadonlyArray<IRtSelect.Option<string | number>> =>\n (this.filter()?.options ?? []).map((option: IRtTable.FilterOption): IRtSelect.Option<string | number> => ({\n value: option.value,\n label: option.label,\n }))\n );\n\n /** Ключ колонки — тот же, что в `cdkColumnDef` и в `[columnsConfig]`. */\n public readonly propertyName: InputSignal<string> = input.required<string>();\n\n /**\n * Чем колонка отбирает. Объявляет колонка, а не угадывает значение; колонка, которая молчит,\n * не отбирает вовсе — решает это сама ячейка, а не тот, кто её ставит: иначе обещание держал\n * бы каждый потребитель по-своему.\n */\n public readonly filter: InputSignal<IRtTable.ColumnFilter | null> = input<IRtTable.ColumnFilter | null>(null);\n\n /** Текущий набор условий — весь, по всем колонкам сразу. */\n public readonly filters: InputSignal<readonly IFilterModel<string>[]> = input<readonly IFilterModel<string>[]>([]);\n\n public readonly filtersChange: OutputEmitterRef<readonly IFilterModel<string>[]> = output<readonly IFilterModel<string>[]>();\n\n constructor() {\n this.control.valueChanges\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((value: TRtTableFilterInput): void => this.#onValue(value));\n\n // Набор условий меняется и снаружи — соседняя колонка, очистка всех сразу. Поле идёт\n // следом, и запись в него молчит: иначе она вернулась бы сюда же переменой значения.\n effect((): void => {\n const value: TRtTableFilterValue = this.value();\n\n untracked((): void => {\n if (filterValueOf(this.control.value) !== value) {\n this.control.setValue(value, { emitEvent: false });\n }\n });\n });\n }\n\n protected onOperator(operatorType: TFilterOperatorType): void {\n this.operatorPopover()?.close();\n this.chosenOperator.set(operatorType);\n this.#report(filtersWithOperator(this.filters(), this.propertyName(), operatorType));\n }\n\n protected onClear(): void {\n const instant: boolean = this.instant();\n\n this.control.setValue('');\n\n // У мгновенного вида о снятии сообщила сама перемена значения; у остальных — здесь:\n // очистку нажали, ждать ухода из поля нечего.\n if (!instant) {\n this.onCommit();\n }\n }\n\n /** Уход из поля и Enter: набранное значение уходит наружу разом, а не по знаку. */\n protected onCommit(): void {\n this.#commit(this.control.value);\n }\n\n #onValue(value: TRtTableFilterInput): void {\n if (this.instant()) {\n this.#commit(value);\n }\n }\n\n #commit(value: TRtTableFilterInput): void {\n this.#report(filtersWithValue(this.filters(), this.propertyName(), this.operator(), filterValueOf(value)));\n }\n\n /**\n * Наружу уходит только изменившийся набор. Прежний приходит тем же объектом, и по этому\n * признаку видно, что менять было нечего: повтор того же значения и смена вида сравнения\n * без значения не сообщают ничего.\n */\n #report(next: readonly IFilterModel<string>[]): void {\n if (next !== this.filters()) {\n this.filtersChange.emit(next);\n }\n }\n}\n","<ng-container rtBlock=\"rt-table-filter-header\">\n @if (filter(); as columnFilter) {\n <!--\n Кнопка вида сравнения открывает список тех видов, которые разрешила колонка. Список\n объявлен внутри блока намеренно: `rtElem` берёт имя блока инъекцией у ближайшего предка\n с `rtBlock`, а у шаблона, объявленного снаружи, такого предка нет вовсе.\n -->\n <button\n type=\"button\"\n rtElem=\"operator\"\n qa-dataid=\"table-filter-operator\"\n [attr.aria-label]=\"operatorAriaLabel()\"\n [rtMod]=\"{ set: clearable() }\"\n [rtPopover]=\"operatorsTpl\">\n {{ operatorLabel() }}\n </button>\n\n <!--\n Набранное уходит наружу по уходу из поля и по Enter, а не по каждому знаку: набор условий,\n уходящий на букву, спрашивает сервер по букве. Выбор и дата сообщают сами — у них\n недописанного состояния нет.\n -->\n <div rtElem=\"value\" qa-dataid=\"table-filter-value\">\n @switch (columnFilter.kind) {\n @case ('number') {\n <rt-input-number\n qa-dataid=\"table-filter-number\"\n size=\"sm\"\n [placeholder]=\"valueLabel()\"\n [clearable]=\"false\"\n [formControl]=\"control\"\n (focusout)=\"onCommit()\"\n (keydown.enter)=\"onCommit()\" />\n }\n\n @case ('select') {\n <rt-select\n qa-dataid=\"table-filter-select\"\n size=\"sm\"\n [placeholder]=\"chooseLabel()\"\n [clearable]=\"false\"\n [options]=\"options()\"\n [formControl]=\"control\" />\n }\n\n @case ('date') {\n <rt-date-picker qa-dataid=\"table-filter-date\" size=\"sm\" [clearable]=\"false\" [formControl]=\"control\" />\n }\n\n @default {\n <rt-input\n qa-dataid=\"table-filter-text\"\n size=\"sm\"\n [placeholder]=\"valueLabel()\"\n [clearable]=\"false\"\n [formControl]=\"control\"\n (focusout)=\"onCommit()\"\n (keydown.enter)=\"onCommit()\" />\n }\n }\n </div>\n\n <!-- Очистка стоит в разметке только там, где есть что очищать. -->\n @if (clearable()) {\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"table-filter-clear\"\n variant=\"ghost\"\n icon=\"ico-close\"\n size=\"sm\"\n [ariaLabel]=\"clearLabel()\"\n (clicked)=\"onClear()\" />\n }\n\n <ng-template #operatorsTpl>\n <div rtElem=\"operators\" qa-dataid=\"table-filter-operators\" role=\"menu\">\n @for (view of operatorViews(); track view.type) {\n <rt-menu-item qa-dataid=\"table-filter-operator-item\" [label]=\"view.label\" (selected)=\"onOperator(view.type)\" />\n }\n </div>\n </ng-template>\n }\n</ng-container>\n","import { Directive, inject, input, InputSignal, TemplateRef } from '@angular/core';\n\n/**\n * Контекст шаблона `[rtTableCard]`: `$implicit` — строка таблицы.\n */\nexport interface IRtTableCardContext<TRow> {\n $implicit: TRow;\n}\n\n/**\n * Захватывает `<ng-template rtTableCard let-row>` — кастомную разметку карточки\n * строки для мобильного (узкого) режима `rt-table`. Когда задан, rt-table на\n * узком экране (≤1080px) рендерит эту разметку в `<article>` вместо\n * авто-карточки «label: value» по колонкам.\n *\n * Escape-hatch для страниц, которым нужна rich-карточка (составной primary-блок,\n * теги, произвольная раскладка), а не построчный список полей.\n *\n * @example\n * ```html\n * <rt-table #t=\"rtTable\" [dataSource]=\"rows\" ...>\n * ...колонки...\n * <ng-template rtTableCard [rtTableCardRowType]=\"rows\" let-row>\n * <div class=\"my-card-head\">{{ row.login }}</div>\n * </ng-template>\n * <tr cdk-row *cdkRowDef=\"let row; columns: t.displayedColumns()\"></tr>\n * </rt-table>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtTableCard]',\n})\nexport class RtTableCardDirective<TRow = unknown> {\n public readonly template: TemplateRef<IRtTableCardContext<TRow>> = inject<TemplateRef<IRtTableCardContext<TRow>>>(TemplateRef);\n\n /**\n * Type-carrier для вывода `TRow`: биндят тот же массив, что в `dataSource`.\n * Значение в рантайме не читается — служит только подсказкой типизации для\n * `let-row` (через `ngTemplateContextGuard`).\n */\n public readonly rtTableCardRowType: InputSignal<readonly TRow[]> = input<readonly TRow[]>([]);\n\n /** Type-guard: сужает контекст шаблона до строки таблицы при проверке шаблонов. */\n public static ngTemplateContextGuard<TRow>(\n _directive: RtTableCardDirective<TRow>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n context: unknown\n ): context is IRtTableCardContext<TRow> {\n return true;\n }\n}\n","import { CdkColumnDef } from '@angular/cdk/table';\nimport { TemplateRef } from '@angular/core';\n\nimport { IRtTableCardContext } from './rt-table-card.directive';\nimport { RT_TABLE_ROW_ACTIONS_COLUMN } from './rt-table-columns.logic';\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Поле авто-карточки узкого экрана: подпись колонки и её шаблон ячейки. Значение рисуется\n * тем же шаблоном, что и в строке таблицы, — второй разметки у карточки нет.\n */\nexport interface IRtTableCardColumn<TRow> {\n key: string;\n label: string;\n cell: TemplateRef<IRtTableCardContext<TRow>>;\n}\n\n/**\n * Строки, которые можно показать карточками. Источник данных таблицы бывает массивом,\n * потоком и своим объектом, а карточки строятся только по массиву: у остальных состав строк\n * известен лишь самой таблице, и брать его отсюда нечем.\n */\nexport function cardRowsOf<TRow>(dataSource: unknown): ReadonlyArray<TRow> {\n return Array.isArray(dataSource) ? (dataSource as ReadonlyArray<TRow>) : [];\n}\n\n/**\n * Есть ли строки в источнике данных. CdkTable принимает массив, поток и свой объект — точно\n * ответить можно только про массив. Для остальных ответ `true`: заглушку «пусто» и скелет там не\n * показываем, раз не можем знать наверняка.\n */\nexport function hasRowsIn(dataSource: unknown): boolean {\n return Array.isArray(dataSource) ? dataSource.length > 0 : true;\n}\n\n/**\n * Поля авто-карточки: видимые колонки, кроме колонки действий, с подписью из конфига и\n * шаблоном ячейки из объявления колонки. Колонка без шаблона ячейки пропускается — рисовать\n * её значение нечем.\n */\nexport function cardColumnsOf<TRow>(\n displayedColumns: ReadonlyArray<string>,\n columnDefs: ReadonlyArray<CdkColumnDef>,\n columnsConfig: ReadonlyArray<IRtTable.ColumnConfig>\n): ReadonlyArray<IRtTableCardColumn<TRow>> {\n const defsByName: Map<string, CdkColumnDef> = new Map(columnDefs.map((def: CdkColumnDef): [string, CdkColumnDef] => [def.name, def]));\n const labelByKey: Map<string, string> = new Map(\n columnsConfig.map((column: IRtTable.ColumnConfig): [string, string] => [column.key, column.label])\n );\n\n return displayedColumns\n .filter((key: string): boolean => key !== RT_TABLE_ROW_ACTIONS_COLUMN)\n .map((key: string): IRtTableCardColumn<TRow> | null => {\n const cell: TemplateRef<IRtTableCardContext<TRow>> | undefined = defsByName.get(key)?.cell?.template;\n\n return cell === undefined ? null : { key, cell, label: labelByKey.get(key) ?? key };\n })\n .filter((column: IRtTableCardColumn<TRow> | null): column is IRtTableCardColumn<TRow> => column !== null);\n}\n","/**\n * Узлы, нажатие по которым — своё действие, а не открытие строки или карточки: кнопка, ссылка,\n * поле и узлы с ролью кнопки или переключателя.\n */\nconst INTERACTIVE_SELECTOR: string = \"button, a, input, select, textarea, label, [role='button'], [role='switch']\";\n\n/**\n * Пришло ли событие из интерактивного узла внутри строки или карточки. Такое нажатие открытием\n * не считается — иначе вложенные действия спорили бы с переходом к записи.\n */\nexport function isFromInteractive(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest(INTERACTIVE_SELECTOR) !== null;\n}\n\n/**\n * Строка таблицы, которую показывает карточка с этим номером. Карточки строятся из того же массива,\n * что и строки, и в том же порядке, поэтому номер карточки — номер строки. Строки вложенной\n * таблицы в счёт не идут: берутся только строки, чья ближайшая таблица — эта.\n */\nexport function cardRowOf(host: Element, index: number): HTMLElement | null {\n const rows: HTMLElement[] = Array.from(host.querySelectorAll<HTMLElement>('.cdk-row')).filter(\n (row: HTMLElement): boolean => row.parentElement?.closest('rt-table, table[rt-table]') === host\n );\n return rows[index] ?? null;\n}\n","import { booleanAttribute, Directive, ElementRef, inject, input, InputSignal, InputSignalWithTransform } from '@angular/core';\n\nimport { cardRowOf, isFromInteractive } from './rt-table-row.logic';\n\n/** Один обработчик на нажатие, Enter и пробел */\nconst ACTIVATE: string = 'activate($event)';\n\n/**\n * Нажатие на карточку узкого экрана открывает запись так же, как нажатие на строку. Своего выхода у\n * карточки нет: нажатие, Enter и пробел уходят спрятанной строке с тем же номером, и срабатывает\n * тот же `(activated)`, что приложение вешает на строку через `rtTableRow`. Нажатие по кнопке,\n * ссылке или полю внутри карточки открытием не считается.\n *\n * Карточка отзывается и берёт фокус только при `clickable` таблицы — тот же вход включает вид\n * кликабельной строки.\n */\n@Directive({\n selector: '[rtTableCardActivation]',\n host: {\n '[attr.tabindex]': 'rtTableCardActivationEnabled() ? 0 : null',\n '(click)': ACTIVATE,\n '(keydown.enter)': ACTIVATE,\n '(keydown.space)': ACTIVATE,\n },\n})\nexport class RtTableCardActivationDirective {\n readonly #card: HTMLElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n /** Номер карточки — он же номер строки, которую она показывает */\n public readonly rtTableCardActivation: InputSignal<number> = input.required<number>();\n\n /** Карточка отзывается на нажатие */\n public readonly rtTableCardActivationEnabled: InputSignalWithTransform<boolean, unknown> = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n\n protected activate(event: Event): void {\n if (!this.rtTableCardActivationEnabled() || isFromInteractive(event.target)) {\n return;\n }\n if (event instanceof KeyboardEvent) {\n // Пробел иначе проскроллит страницу\n event.preventDefault();\n }\n const host: Element | null = this.#card.closest('rt-table, table[rt-table]');\n if (host !== null) {\n cardRowOf(host, this.rtTableCardActivation())?.click();\n }\n }\n}\n","import { Directive, inject, input, InputSignal, TemplateRef } from '@angular/core';\n\n/**\n * Контекст шаблона `[rtTableRowActions]`: `$implicit` — строка таблицы.\n */\nexport interface IRtTableRowActionsContext<TRow> {\n $implicit: TRow;\n}\n\n/**\n * Захватывает `<ng-template rtTableRowActions let-row>` — содержимое «…»-меню\n * действий строки. `rt-table` (`[showRowActions]`) рендерит этот шаблон в конце\n * каждой строки внутри `rt-menu`, прокидывая строку через `$implicit`.\n *\n * Тип `let-row` выводится из `[rtTableRowActionsRowType]` (передаётся тот же\n * массив, что в `dataSource`) — type-carrier, как `*ngFor` выводит тип из\n * `ngForOf`. В рантайме значение не используется.\n *\n * @example\n * ```html\n * <rt-table #t=\"rtTable\" [columns]=\"cols\" [showRowActions]=\"true\" [dataSource]=\"rows\" ...>\n * ...колонки...\n * <ng-template rtTableRowActions [rtTableRowActionsRowType]=\"rows\" let-row>\n * <rt-menu-item icon=\"ico-edit\" label=\"Редактировать\" (selected)=\"edit(row)\" />\n * </ng-template>\n * <tr cdk-header-row *cdkHeaderRowDef=\"t.displayedColumns()\"></tr>\n * <tr cdk-row *cdkRowDef=\"let row; columns: t.displayedColumns()\"></tr>\n * </rt-table>\n * ```\n */\n@Directive({\n selector: 'ng-template[rtTableRowActions]',\n})\nexport class RtTableRowActionsDirective<TRow = unknown> {\n public readonly template: TemplateRef<IRtTableRowActionsContext<TRow>> =\n inject<TemplateRef<IRtTableRowActionsContext<TRow>>>(TemplateRef);\n\n /**\n * Type-carrier для вывода `TRow`: биндят тот же массив, что в `dataSource`.\n * Значение в рантайме не читается — служит только подсказкой типизации для\n * `let-row` (через `ngTemplateContextGuard`). Имя совпадает с binding'ом —\n * без alias, чтобы не триггерить `no-input-rename`.\n */\n public readonly rtTableRowActionsRowType: InputSignal<readonly TRow[]> = input<readonly TRow[]>([]);\n\n /** Type-guard: сужает контекст шаблона до строки таблицы при проверке шаблонов. */\n public static ngTemplateContextGuard<TRow>(\n _directive: RtTableRowActionsDirective<TRow>,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- второй довод стража контекста шаблона стоит только в типе-предикате; убрать его нечем, подпись задаёт каркас\n context: unknown\n ): context is IRtTableRowActionsContext<TRow> {\n return true;\n }\n}\n","import { IRtTable } from './rt-table.model';\n\n/**\n * Есть ли у строки хотя бы одно доступное действие.\n *\n * Признак приходит предикатом от экрана, а не подсчётом отрисованных пунктов меню:\n * содержимое спроецированного шаблона известно только после отрисовки, и кнопка\n * успевала бы мигнуть на первом кадре.\n *\n * Предикат не задан — у строки есть действия: экран, который ничего не гейтит,\n * показывает кнопку меню, как и раньше.\n */\nexport function rowHasAvailableActions<TRow>(row: TRow, hasActions: IRtTable.RowActionsPredicate<TRow> | null): boolean {\n return hasActions === null ? true : hasActions(row);\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { rowHasAvailableActions } from './rt-table-row-actions.logic';\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Есть ли у строки доступные действия — гейт кнопки «…» в ячейке действий.\n *\n * Pure-pipe: пересчитывается только при смене строки или предиката, а не на каждом\n * цикле проверки. Значение приходит из контекста шаблона (строка таблицы), поэтому\n * `computed()` здесь неприменим.\n */\n@Pipe({ name: 'rtRowHasActions' })\nexport class RtRowHasActionsPipe implements PipeTransform {\n public transform<TRow>(row: TRow, hasActions: IRtTable.RowActionsPredicate<TRow> | null): boolean {\n return rowHasAvailableActions(row, hasActions);\n }\n}\n","import { DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { mergeMap, Observable, Subject } from 'rxjs';\n\nimport { IDBStorageService } from '@rt-tools/core';\n\nimport { ERtStorageKeys } from '@rt-tools/ui-kit-v2/core';\nimport { IRtTable } from './rt-table.model';\n\n/** Запрос на запись настроек колонок — то, что уезжает в объявленный поток записи. */\ninterface IRtTablePersistRequest {\n tableId: string;\n settings: IRtTable.ColumnSettings;\n}\n\n/** Ключ настроек одной таблицы в хранилище браузера. */\nfunction settingsKey(tableId: string): string {\n return `${ERtStorageKeys.TableColumnsPrefix}${tableId}`;\n}\n\n/**\n * Хранение настроек колонок одной таблицы.\n *\n * Запись объявлена одним потоком, а не подпиской в методе: запросы приходят по одному на\n * каждое движение панели настроек, и каждый из них — своя независимая запись. Зависимости\n * приходят доводами, потому что заводится это в конструкторе компонента, где внедрение уже\n * доступно, а сам класс службой не объявлен — он живёт ровно столько, сколько таблица.\n */\nexport class RtTableSettingsPersistence {\n readonly #storage: IDBStorageService<IRtTable.ColumnSettings>;\n readonly #requestsSource: Subject<IRtTablePersistRequest> = new Subject<IRtTablePersistRequest>();\n\n constructor(storage: IDBStorageService<IRtTable.ColumnSettings>, destroyRef: DestroyRef) {\n this.#storage = storage;\n this.#requestsSource\n .pipe(\n mergeMap((request: IRtTablePersistRequest): Observable<void> =>\n this.#storage.set(settingsKey(request.tableId), request.settings)\n ),\n takeUntilDestroyed(destroyRef)\n )\n .subscribe();\n }\n\n /** Сохранённые настройки этой таблицы. Записи может не быть — тогда применять нечего. */\n public load(tableId: string): Observable<IRtTable.ColumnSettings | undefined> {\n return this.#storage.get(settingsKey(tableId));\n }\n\n /** Кладёт настройки в очередь записи: сама запись идёт объявленным потоком. */\n public save(tableId: string, settings: IRtTable.ColumnSettings): void {\n this.#requestsSource.next({ tableId, settings });\n }\n}\n","import { computed, Injectable, Signal, signal, WritableSignal } from '@angular/core';\n\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Регистрация настраиваемой таблицы в реестре: её текущие/дефолтные колонки\n * (сигналы) + callback применения новых настроек (применяет к таблице и\n * персистит). Заполняется самой `rt-table`, читается route-асайдом настроек.\n */\nexport interface IRtTableSettingsRegistration {\n columns: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>>;\n defaults: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>>;\n apply: (settings: IRtTable.ColumnSettings) => void;\n}\n\n/**\n * Реестр настраиваемых таблиц — мост между `rt-table` (shared UI) и route-асайдом\n * настроек колонок, которые живут в разных ветках дерева и не видят друг друга\n * напрямую. `rt-table` регистрируется по `tableId` на init, снимается на destroy;\n * асайд читает регистрацию активной таблицы (`active()` выставляется при открытии).\n *\n * Реестр реактивный (`Map` живёт в сигнале): при F5 route-асайд инициализируется\n * раньше `rt-table`, и синхронный промах по пустому реестру не должен быть\n * финальным — асайд дожидается регистрации через `effect` (фикс F-16).\n */\n@Injectable({ providedIn: 'root' })\nexport class RtTableSettingsRegistry {\n readonly #registrations: WritableSignal<ReadonlyMap<string, IRtTableSettingsRegistration>> = signal<\n ReadonlyMap<string, IRtTableSettingsRegistration>\n >(new Map<string, IRtTableSettingsRegistration>());\n\n readonly #active: WritableSignal<string | null> = signal<string | null>(null);\n\n /** Id таблицы, чьи настройки сейчас открыты в асайде (или `null`). */\n public readonly active: Signal<string | null> = this.#active.asReadonly();\n\n /**\n * Id единственной зарегистрированной таблицы (или `null`, если их 0 или >1).\n * Нужен асайду для восстановления `active` после F5: сервис пересоздан,\n * `setActive` никто не звал, но открытая страница регистрирует ровно\n * одну настраиваемую таблицу.\n */\n public readonly soleTableId: Signal<string | null> = computed((): string | null => {\n const registrations: ReadonlyMap<string, IRtTableSettingsRegistration> = this.#registrations();\n if (registrations.size !== 1) {\n return null;\n }\n const first: string | undefined = registrations.keys().next().value;\n return first ?? null;\n });\n\n public register(tableId: string, registration: IRtTableSettingsRegistration): void {\n this.#registrations.update(\n (current: ReadonlyMap<string, IRtTableSettingsRegistration>): ReadonlyMap<string, IRtTableSettingsRegistration> => {\n const next: Map<string, IRtTableSettingsRegistration> = new Map(current);\n next.set(tableId, registration);\n return next;\n }\n );\n }\n\n public unregister(tableId: string): void {\n this.#registrations.update(\n (current: ReadonlyMap<string, IRtTableSettingsRegistration>): ReadonlyMap<string, IRtTableSettingsRegistration> => {\n const next: Map<string, IRtTableSettingsRegistration> = new Map(current);\n next.delete(tableId);\n return next;\n }\n );\n if (this.#active() === tableId) {\n this.#active.set(null);\n }\n }\n\n /** Реактивная регистрация таблицы: `null`, пока таблица не зарегистрировалась. */\n public get(tableId: string): Signal<IRtTableSettingsRegistration | null> {\n return computed((): IRtTableSettingsRegistration | null => this.#registrations().get(tableId) ?? null);\n }\n\n public setActive(tableId: string): void {\n this.#active.set(tableId);\n }\n\n public clearActive(): void {\n this.#active.set(null);\n }\n}\n","import { computed, DestroyRef, inject, Signal, signal, WritableSignal } from '@angular/core';\n\nimport { EMPTY, filter, Observable } from 'rxjs';\n\nimport { IDBStorageService } from '@rt-tools/core';\n\nimport { defaultColumnItems, resolveColumns, withoutLockedHidden } from './rt-table-columns.logic';\nimport { RtTableSettingsPersistence } from './rt-table-settings.persistence';\nimport { RtTableSettingsRegistry, type IRtTableSettingsRegistration } from './rt-table-settings.registry';\nimport { IRtTable } from './rt-table.model';\n\n/**\n * Настройка колонок одной таблицы: применённые настройки, объявление реестру, загрузка и запись.\n *\n * Лежит отдельно от компонента: это целое со своим состоянием, а компонент только отдаёт ему свои\n * входы и зовёт на старте и в конце жизни. Входы приезжают функциями, а не сигналами: поле с\n * этим классом заводится раньше, чем поля входов компонента, и читать их можно только позже.\n * Внедрение зовётся в конструкторе — класс заводится полем компонента, где оно доступно.\n * Подписку на сохранённые настройки держит компонент: подписка в методе здесь запрещена.\n */\nexport class RtTableColumnSettings {\n readonly #registry: RtTableSettingsRegistry = inject(RtTableSettingsRegistry);\n readonly #persistence: RtTableSettingsPersistence = new RtTableSettingsPersistence(\n inject<IDBStorageService<IRtTable.ColumnSettings>>(IDBStorageService),\n inject(DestroyRef)\n );\n\n readonly #config: () => ReadonlyArray<IRtTable.ColumnConfig>;\n readonly #tableId: () => string | null;\n\n /** Настройки колонок, применённые поверх конфига; `null` — умолчания конфига. */\n readonly #applied: WritableSignal<IRtTable.ColumnSettings | null> = signal<IRtTable.ColumnSettings | null>(null);\n\n /** Колонки конфига без настроек пользователя — с них панель начинает после сброса. */\n readonly #defaults: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>> = computed((): ReadonlyArray<IRtTable.ColumnSettingItem> =>\n defaultColumnItems(this.#config())\n );\n\n /** Ключ записи настроек. `null` — таблица не настраиваемая: нет ключа или конфига. */\n readonly #persistableTableId: Signal<string | null> = computed((): string | null => {\n const id: string | null = this.#tableId();\n return id !== null && this.#config().length > 0 ? id : null;\n });\n\n /** Разрешённые колонки в применённом порядке, с текущим признаком скрытости. */\n public readonly resolved: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>> = computed((): ReadonlyArray<IRtTable.ColumnSettingItem> =>\n resolveColumns(this.#config(), this.#applied())\n );\n\n /** Таблица настраиваемая: есть и конфиг колонок, и ключ таблицы. */\n public readonly canConfigure: Signal<boolean> = computed((): boolean => this.#config().length > 0 && this.#tableId() !== null);\n\n constructor(config: () => ReadonlyArray<IRtTable.ColumnConfig>, tableId: () => string | null) {\n this.#config = config;\n this.#tableId = tableId;\n }\n\n /** Объявить таблицу реестру: с этой минуты её настраивает панель. */\n public start(): void {\n this.#register();\n }\n\n /**\n * Сохранённые настройки таблицы. У ненастраиваемой таблицы и у таблицы без записи поток пуст:\n * применять нечего. Подписывается компонент — на старте своей жизни.\n */\n public saved(): Observable<IRtTable.ColumnSettings> {\n const persistedTableId: string | null = this.#persistableTableId();\n if (persistedTableId === null) {\n return EMPTY;\n }\n\n return this.#persistence\n .load(persistedTableId)\n .pipe(filter((settings: IRtTable.ColumnSettings | undefined): settings is IRtTable.ColumnSettings => settings !== undefined));\n }\n\n /** Снять таблицу с реестра в конце её жизни. */\n public stop(): void {\n const tableId: string | null = this.#tableId();\n if (tableId !== null) {\n this.#registry.unregister(tableId);\n }\n }\n\n /** Применить настройки: закреплённые колонки скрыть нельзя. */\n public apply(settings: IRtTable.ColumnSettings): void {\n this.#applied.set(withoutLockedHidden(this.#config(), settings));\n }\n\n /**\n * Объявляет таблицу реестру: её колонки, умолчания и приём применения настроек. Реестр —\n * мост к панели настроек, которую потребитель открывает переходом по адресу.\n */\n #register(): void {\n const tableId: string | null = this.#tableId();\n if (tableId === null || !this.canConfigure()) {\n return;\n }\n const registration: IRtTableSettingsRegistration = {\n columns: this.resolved,\n defaults: this.#defaults,\n apply: (settings: IRtTable.ColumnSettings): void => {\n this.apply(settings);\n this.#persist(settings);\n },\n };\n this.#registry.register(tableId, registration);\n }\n\n /** Сохраняет настройки колонок у настраиваемой таблицы; у прочих сохранять нечего. */\n #persist(settings: IRtTable.ColumnSettings): void {\n const tableId: string | null = this.#persistableTableId();\n if (tableId !== null) {\n this.#persistence.save(tableId, settings);\n }\n }\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport {\n CDK_TABLE,\n CdkCell,\n CdkCellDef,\n CdkColumnDef,\n CdkHeaderCell,\n CdkHeaderCellDef,\n CdkTable,\n CdkTableDataSourceInput,\n DataRowOutlet,\n FooterRowOutlet,\n HeaderRowOutlet,\n NoDataRowOutlet,\n} from '@angular/cdk/table';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n ElementRef,\n forwardRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n linkedSignal,\n numberAttribute,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n TemplateRef,\n ViewChild,\n WritableSignal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { IFilterModel, ISortModel } from '@rt-tools/utils';\n\nimport { TRtKitLabelKey, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { BreakpointsService } from '@rt-tools/ui-kit-v2/core';\n\nimport { RtEmptyStateComponent } from '@rt-tools/ui-kit-v2/empty-state';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtMenuComponent } from '@rt-tools/ui-kit-v2/menu';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtSkeletonComponent } from '@rt-tools/ui-kit-v2/skeleton';\nimport { RtSpinnerComponent } from '@rt-tools/ui-kit-v2/spinner';\nimport { RtTableFilterHeaderComponent } from './filter-header/rt-table-filter-header.component';\nimport { RtTableCardDirective } from './rt-table-card.directive';\nimport { cardColumnsOf, cardRowsOf, hasRowsIn, IRtTableCardColumn } from './rt-table-cards.logic';\nimport { RtTableCardActivationDirective } from './rt-table-card-activation.directive';\nimport { RtTableRowActionsDirective } from './rt-table-row-actions.directive';\nimport { RtRowHasActionsPipe } from './rt-table-row-actions.pipe';\nimport { RtTableColumnSettings } from './rt-table-column-settings';\nimport { displayedColumnKeys } from './rt-table-columns.logic';\nimport { filterCellsOf } from './rt-table-filter.logic';\nimport { nextSort } from './rt-table-sort.logic';\nimport { IRtTable } from './rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table';\n\nconst DEFAULT_SKELETON_ROWS: number = 5;\n/** Ключ подписи пустой таблицы: язык известен только после старта приложения */\nconst DEFAULT_EMPTY_KEY: TRtKitLabelKey = 'uiNoRows';\n\n/**\n * Таблица — стилизованная обёртка над `cdk-table` (`@angular/cdk/table`).\n *\n * Селектор работает и как element (`<rt-table>`), и как attribute на native `<table rt-table>`.\n * Native-вариант предпочтительнее — даёт правильную table-семантику для скрин-ридеров, но\n * наложения загрузки, пустого места и заглушек требуют element-варианта: `<div>` не валиден как\n * ребёнок `<table>`.\n *\n * Какие состояния таблица различает и чем рисует каждое — в заметке семьи рядом, `CONTEXT.md`.\n */\n@Component({\n selector: 'rt-table, table[rt-table]',\n exportAs: 'rtTable',\n templateUrl: './rt-table.component.html',\n styleUrl: './rt-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // @angular/cdk\n CdkCell,\n CdkCellDef,\n CdkColumnDef,\n CdkHeaderCell,\n CdkHeaderCellDef,\n DataRowOutlet,\n FooterRowOutlet,\n HeaderRowOutlet,\n NoDataRowOutlet,\n\n // @angular/common\n NgTemplateOutlet,\n\n // standalone components / directives\n RtEmptyStateComponent,\n RtMenuComponent,\n RtSkeletonComponent,\n RtSpinnerComponent,\n RtTableFilterHeaderComponent,\n RtTableCardActivationDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // pipes\n RtRowHasActionsPipe,\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n providers: [\n {\n provide: CDK_TABLE,\n useExisting: forwardRef((): typeof RtTableComponent => RtTableComponent),\n },\n ],\n host: {\n class: BEM_BLOCK,\n '[class.rt-table--density--compact]': \"density() === 'compact'\",\n '[class.rt-table--clickable]': 'clickable()',\n '[class.rt-table--loading]': 'isInitialLoading()',\n '[class.rt-table--fetching]': 'fetching()',\n '[class.rt-table--empty]': 'isEmpty()',\n '[class.rt-table--cards]': 'showCards()',\n '[attr.role]': 'hostRole',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-busy]': \"isInitialLoading() || fetching() ? 'true' : null\",\n },\n})\nexport class RtTableComponent<TRow> extends CdkTable<TRow> {\n readonly #t_uiNoRows: Signal<string> = rtKitLabel(DEFAULT_EMPTY_KEY);\n\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n readonly #breakpoints: BreakpointsService = inject(BreakpointsService);\n\n readonly #dataSourceVersion: WritableSignal<number> = signal<number>(0);\n\n /**\n * Выбранная сортировка. Заводится от входа `[sort]` и переключается заголовками:\n * таблица показывает порядок и без потребителя, который его слушает.\n */\n readonly #sort: WritableSignal<ISortModel<string> | null> = linkedSignal<ISortModel<string> | null>((): ISortModel<string> | null =>\n this.sort()\n );\n\n /** Настройка колонок: применённые настройки, реестр панели, загрузка и запись. */\n readonly #columnSettings: RtTableColumnSettings = new RtTableColumnSettings(\n (): ReadonlyArray<IRtTable.ColumnConfig> => this.columnsConfig(),\n (): string | null => this.tableId()\n );\n\n /** Колонка действий и её ячейки: регистрируются в CdkTable вручную — почему, сказано в `CONTEXT.md`. */\n // native-ok: сигнальный viewChild() резолвится после первой отрисовки строк, а колонка действий должна попасть в реестр CdkTable до неё\n @ViewChild(CdkColumnDef, { static: true })\n private readonly actionsColumnDef?: CdkColumnDef;\n\n // native-ok: то же, что у объявления колонки выше: def присваивается вручную в ngOnInit, до первой отрисовки\n @ViewChild(CdkCellDef, { static: true })\n private readonly actionsCellDef?: CdkCellDef;\n\n // native-ok: то же, что у объявления колонки выше: def присваивается вручную в ngOnInit, до первой отрисовки\n @ViewChild(CdkHeaderCellDef, { static: true })\n private readonly actionsHeaderCellDef?: CdkHeaderCellDef;\n\n /**\n * Роль хоста: у native `<table rt-table>` она есть от самого тега, а элементному\n * `<rt-table>` её ставим сами. Без неё скрин-ридер читает список строками текста: роли\n * строк и ячеек CDK проставляет сам, а роли самой таблицы у него нет, и проставленные\n * остаются висеть вне таблицы. Считается один раз — тег хоста по ходу жизни не меняется.\n */\n protected readonly hostRole: 'table' | null = (inject(ElementRef).nativeElement as HTMLElement).tagName === 'RT-TABLE' ? 'table' : null;\n\n /** `true` когда initial-load в полёте и entities ещё нет — рендерим skeleton rows. */\n protected readonly isInitialLoading: Signal<boolean> = computed((): boolean => this.loading() && this.#hasData() === false);\n\n /** `true` когда загрузка завершена и entities пустые — рендерим empty placeholder. */\n protected readonly isEmpty: Signal<boolean> = computed((): boolean => !this.loading() && !this.fetching() && this.#hasData() === false);\n\n /** Массив для `@for` — числа от 0 до skeletonRows-1, рендерим placeholder-rows. */\n protected readonly skeletonRowIndexes: Signal<ReadonlyArray<number>> = computed((): ReadonlyArray<number> =>\n Array.from({ length: this.skeletonRows() }, (_: unknown, i: number) => i)\n );\n\n /** Шаблон содержимого «…»-меню действий строки (`<ng-template rtTableRowActions>`). */\n protected readonly rowActions: Signal<RtTableRowActionsDirective | undefined> = contentChild(RtTableRowActionsDirective);\n\n /** Кастомный шаблон карточки мобильного режима (`<ng-template rtTableCard>`). Опционален. */\n protected readonly cardTemplate: Signal<RtTableCardDirective | undefined> = contentChild(RtTableCardDirective);\n\n /**\n * Все проецируемые потребителем `cdkColumnDef` — источник cell-шаблонов для\n * авто-карточек. «…»-колонка действий объявлена во view rt-table, поэтому в\n * этот content-query не попадает.\n */\n protected readonly columnDefs: Signal<ReadonlyArray<CdkColumnDef>> = contentChildren(CdkColumnDef, { descendants: true });\n\n /** Узкий вьюпорт (≤1080px): таблица прячется, строки рендерятся карточками. */\n protected readonly isNarrow: Signal<boolean> = this.#breakpoints.narrow;\n\n /** Карточки показываются только когда card-режим включён (`[cards]`) и экран узкий. */\n protected readonly showCards: Signal<boolean> = computed((): boolean => this.cards() && this.isNarrow());\n\n /**\n * Строки для карточек узкого экрана. Признак `#dataSourceVersion` пересчитывает список\n * при смене источника: CDK хранит его полем, а не сигналом.\n */\n protected readonly cardRows: Signal<ReadonlyArray<TRow>> = computed((): ReadonlyArray<TRow> => {\n this.#dataSourceVersion();\n\n return cardRowsOf<TRow>(this.dataSource);\n });\n\n /** Поля авто-карточки узкого экрана: видимые колонки с подписью и шаблоном ячейки. */\n protected readonly cardColumns: Signal<ReadonlyArray<IRtTableCardColumn<TRow>>> = computed(\n (): ReadonlyArray<IRtTableCardColumn<TRow>> => cardColumnsOf<TRow>(this.displayedColumns(), this.columnDefs(), this.columnsConfig())\n );\n\n /** ContentChild template для кастом empty-placeholder'а. Опционален; fallback — emptyMessage. */\n public readonly emptyTemplate: Signal<TemplateRef<unknown> | undefined> = contentChild('rtTableEmpty', { read: TemplateRef });\n\n /** ARIA-label корневого `<table>` (или `<rt-table>` элемента). */\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** Плотность: `\"compact\"` уменьшает padding и высоту ячеек. */\n public readonly density: InputSignal<IRtTable.Density> = input<IRtTable.Density>('default');\n\n /**\n * Мобильный card-режим на узком экране (≤1080px): таблица рендерится списком\n * карточек «поле: значение». Включён по умолчанию для всех списков. Отключать\n * (`[cards]=\"false\"`) для не-списочных таблиц — например, key-value quote-таблицы\n * внутри асайда, где карточки дублируют смысл.\n */\n public readonly cards: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /**\n * Строки кликабельны (открывают деталь/асайд). Включает визуальный аффорданс\n * (cursor/focus-ring); саму активацию + a11y обеспечивает директива\n * `rtTableRow` на `<tr cdk-row>`.\n */\n public readonly clickable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Initial-load в полёте. При `true` + пустых entities рендерит skeleton rows. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Re-fetch в полёте. При `true` рисует sticky overlay c rt-spinner поверх существующих rows. */\n public readonly fetching: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Имена колонок (тот же массив что в `*cdkRowDef columns: ...`). Нужен для skeleton row layout. */\n public readonly columns: InputSignal<ReadonlyArray<string>> = input<ReadonlyArray<string>>([]);\n\n /**\n * Метаданные колонок для настраиваемой таблицы: `[{key,label,hidden?,locked?}]`.\n * Когда задан — `displayedColumns()` вычисляется из него с учётом настроек\n * (видимость + порядок), а таблица получает панель настроек (при заданном `[tableId]`).\n * Пуст — таблица работает по legacy `[columns]` без панели.\n */\n public readonly columnsConfig: InputSignal<ReadonlyArray<IRtTable.ColumnConfig>> = input<ReadonlyArray<IRtTable.ColumnConfig>>([]);\n\n /**\n * Идентификатор таблицы для персиста настроек колонок (ключ в IndexedDB).\n * Без него панель настроек недоступна (`canConfigure()` = false).\n */\n public readonly tableId: InputSignal<string | null> = input<string | null>(null);\n\n /**\n * Добавляет в конец строки «…»-колонку действий (`rt-menu`). Содержимое меню —\n * через `<ng-template rtTableRowActions let-row>`; колонку нужно подключить\n * в row-def'ах через `displayedColumns()`.\n */\n public readonly showRowActions: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /**\n * Есть ли у строки доступные действия. Строка, которой нельзя сделать ничего,\n * кнопки «…» не показывает вовсе. Экран заполняет тем же признаком, которым\n * гейтит пункты меню; `null` — у всех строк действия есть.\n */\n public readonly rowHasActions: InputSignal<IRtTable.RowActionsPredicate<TRow> | null> =\n input<IRtTable.RowActionsPredicate<TRow> | null>(null);\n\n /**\n * Показывать ли строку отбора под шапкой. Таблица с отбором в настройке колонок не\n * становится таблицей с полями над строками сама: вторая строка шапки стоит высоты\n * экрана, и платить за неё решает потребитель.\n */\n public readonly showFilters: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Набор условий, по которому нарисованы ячейки отбора. Держит его потребитель. */\n public readonly filters: InputSignal<ReadonlyArray<IFilterModel<string>>> = input<ReadonlyArray<IFilterModel<string>>>([]);\n\n /** Набор условий изменился. Строки сужает потребитель — таблица только сообщает. */\n public readonly filtersChange: OutputEmitterRef<ReadonlyArray<IFilterModel<string>>> = output<ReadonlyArray<IFilterModel<string>>>();\n\n /** Выбранная сортировка: `null` — порядок задаёт источник данных. */\n public readonly sort: InputSignal<ISortModel<string> | null> = input<ISortModel<string> | null>(null);\n\n /** Пользователь переключил порядок заголовком. Саму выборку делает потребитель. */\n public readonly sortChange: OutputEmitterRef<ISortModel<string> | null> = output<ISortModel<string> | null>();\n\n /** Текущая сортировка — её читают заголовки колонок (`rtSortHeader`). */\n public readonly currentSort: Signal<ISortModel<string> | null> = this.#sort.asReadonly();\n\n /**\n * Разрешённые колонки настраиваемой таблицы: `[columnsConfig]` в применённом\n * порядке, с текущим флагом `hidden` (locked всегда видимы). Панель настроек\n * читает этот список для отрисовки; из него же строится `displayedColumns()`.\n * Пустой при отсутствии `[columnsConfig]` (legacy-режим).\n */\n public readonly resolvedColumns: Signal<ReadonlyArray<IRtTable.ColumnSettingItem>> = computed(\n (): ReadonlyArray<IRtTable.ColumnSettingItem> => this.#columnSettings.resolved()\n );\n\n /**\n * Колонки для `*cdkHeaderRowDef`/`*cdkRowDef`. При заданном `[columnsConfig]` —\n * видимые колонки в применённом порядке; иначе — legacy `[columns]`. Плюс\n * «…»-колонка действий в конце при `[showRowActions]`. Потребитель читает через\n * template-ref: `<rt-table #t=\"rtTable\" ...>` →\n * `*cdkRowDef=\"let row; columns: t.displayedColumns()\"`.\n */\n public readonly displayedColumns: Signal<ReadonlyArray<string>> = computed((): ReadonlyArray<string> =>\n displayedColumnKeys(this.resolvedColumns(), this.columns(), this.columnsConfig().length > 0, this.showRowActions())\n );\n\n /**\n * Ячейки строки отбора: по ячейке на каждую показанную колонку, в том же порядке. У\n * колонки без объявленного отбора ячейка пустая, но своё место держит — иначе ячейки\n * съезжают на соседние колонки. Колонка действий строки попадает сюда тем же путём:\n * `displayedColumns()` уже несёт её последней.\n */\n public readonly filterCells: Signal<ReadonlyArray<IRtTable.FilterCell>> = computed((): ReadonlyArray<IRtTable.FilterCell> =>\n filterCellsOf(this.displayedColumns(), this.columnsConfig())\n );\n\n /** `true` когда таблица настраиваемая: есть и `[columnsConfig]`, и `[tableId]`. */\n public readonly canConfigure: Signal<boolean> = this.#columnSettings.canConfigure;\n\n /** Сколько skeleton-строк рендерить во время initial-load. Default 5. */\n public readonly skeletonRows: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(DEFAULT_SKELETON_ROWS, {\n transform: numberAttribute,\n });\n\n /** Подпись пустой таблицы; пусто — берётся переведённое умолчание. */\n public readonly emptyMessage: InputSignal<string> = input<string>('');\n\n /** Своя подпись пустой таблицы важнее умолчания */\n public readonly emptyText: Signal<string> = computed((): string => this.emptyMessage() || this.#t_uiNoRows());\n\n /** Иконка дефолтного empty-placeholder'а (rt-empty-state). `null` — без иконки. */\n public readonly emptyIcon: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>('inbox');\n\n /** Описание под заголовком дефолтного empty-placeholder'а. Опционально. */\n public readonly emptyDescription: InputSignal<string | null> = input<string | null>(null);\n\n public override ngOnInit(): void {\n super.ngOnInit();\n // Регистрируем view-колонку действий до первого рендера строк, чтобы\n // `displayedColumns()` мог на неё ссылаться без «column not found».\n // Cell/header присваиваем вручную — их ContentChild ещё не отработал.\n if (this.actionsColumnDef !== undefined && this.actionsCellDef !== undefined && this.actionsHeaderCellDef !== undefined) {\n this.actionsColumnDef.cell = this.actionsCellDef;\n this.actionsColumnDef.headerCell = this.actionsHeaderCellDef;\n this.addColumnDef(this.actionsColumnDef);\n }\n\n this.#columnSettings.start();\n this.#columnSettings\n .saved()\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((settings: IRtTable.ColumnSettings): void => this.applyColumnSettings(settings));\n }\n\n public override ngOnDestroy(): void {\n if (this.actionsColumnDef !== undefined) {\n this.removeColumnDef(this.actionsColumnDef);\n }\n this.#columnSettings.stop();\n super.ngOnDestroy();\n }\n\n /**\n * Переключает порядок по колонке: по возрастанию → по убыванию → без сортировки.\n * Выбранное состояние уходит наружу — выборку делает потребитель.\n */\n public toggleSort(propertyName: string): void {\n const selected: ISortModel<string> | null = nextSort(this.#sort(), propertyName);\n this.#sort.set(selected);\n this.sortChange.emit(selected);\n }\n\n /** Ячейка отбора сообщила новый набор условий — таблица отдаёт его наружу целиком. */\n public reportFilters(filters: ReadonlyArray<IFilterModel<string>>): void {\n this.filtersChange.emit(filters);\n }\n\n public applyColumnSettings(settings: IRtTable.ColumnSettings): void {\n this.#columnSettings.apply(settings);\n }\n\n /**\n * Пробрасывает `dataSource` в CdkTable и отдельно инвалидирует signals,\n * которые вычисляют loading/empty-состояния по plain CDK input.\n */\n public override set dataSource(dataSource: CdkTableDataSourceInput<TRow>) {\n super.dataSource = dataSource;\n this.#dataSourceVersion.update((version: number): number => version + 1);\n }\n\n /** Возвращает текущий источник данных, сохранённый базовым CdkTable. */\n public override get dataSource(): CdkTableDataSourceInput<TRow> {\n return super.dataSource;\n }\n\n /** Есть ли строки в `dataSource`; признак версии пересчитывает ответ при смене источника. */\n #hasData(): boolean {\n this.#dataSourceVersion();\n return hasRowsIn(this.dataSource);\n }\n}\n","<ng-container rtBlock=\"rt-table\">\n <ng-content select=\"caption\" />\n <ng-content select=\"colgroup, col\" />\n\n <ng-container cdkColumnDef=\"rtRowActions\">\n <th *cdkHeaderCellDef rtElem=\"actions-header\" cdk-header-cell aria-hidden=\"true\"></th>\n <td *cdkCellDef=\"let row\" rtElem=\"actions-cell\" qa-dataid=\"table-row-actions\" cdk-cell>\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"actions-float\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n </td>\n </ng-container>\n\n <ng-container headerRowOutlet />\n\n @if (showFilters()) {\n <tr rtElem=\"filter-row\" qa-dataid=\"table-filter-row\">\n @for (cell of filterCells(); track cell.key) {\n <th\n rtElem=\"filter-cell\"\n qa-dataid=\"table-filter-cell\"\n [rtMod]=\"{ actions: cell.actions }\"\n [attr.aria-hidden]=\"cell.actions || null\">\n @if (cell.filter) {\n <rt-table-filter-header\n [propertyName]=\"cell.key\"\n [filter]=\"cell.filter\"\n [filters]=\"filters()\"\n (filtersChange)=\"reportFilters($event)\" />\n }\n </th>\n }\n </tr>\n }\n\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <tr rtElem=\"skeleton-row\" qa-dataid=\"table-skeleton-row\">\n @for (col of displayedColumns(); track col) {\n <td rtElem=\"skeleton-cell\">\n <rt-skeleton rtElem=\"skeleton-bar\" />\n </td>\n }\n </tr>\n }\n }\n\n <ng-container rowOutlet />\n <ng-container noDataRowOutlet />\n <ng-container footerRowOutlet />\n\n @if (isEmpty()) {\n <tr rtElem=\"empty-row\" qa-dataid=\"table-empty-row\">\n <td rtElem=\"empty\" [attr.colspan]=\"displayedColumns().length || null\">\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n </td>\n </tr>\n }\n\n @if (showCards()) {\n <div rtElem=\"cards\" qa-dataid=\"table-cards\" role=\"list\">\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <article rtElem=\"card\" qa-dataid=\"table-skeleton-card\" [rtMod]=\"{ skeleton: true }\">\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n </article>\n }\n } @else if (isEmpty()) {\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n } @else {\n @for (row of cardRows(); track row; let index = $index) {\n <article\n rtElem=\"card\"\n qa-dataid=\"table-card\"\n role=\"listitem\"\n [rtTableCardActivation]=\"index\"\n [rtTableCardActivationEnabled]=\"clickable()\">\n @if (cardTemplate()?.template; as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n } @else {\n @for (col of cardColumns(); track col.key) {\n <div rtElem=\"card-field\" qa-dataid=\"table-card-field\" [attr.data-key]=\"col.key\">\n <span rtElem=\"card-label\" qa-dataid=\"table-card-label\">{{ col.label }}</span>\n <div rtElem=\"card-value\" qa-dataid=\"table-card-value\">\n <ng-container [ngTemplateOutlet]=\"col.cell\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </div>\n </div>\n }\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"card-actions\" qa-dataid=\"table-card-actions\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n }\n </article>\n }\n }\n </div>\n }\n</ng-container>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, InputSignal, Signal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\nimport { EListSortOrder, TListSortOrderType } from '@rt-tools/utils';\n\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { ariaSortOf, TRtTableAriaSort, isColumnSortable, sortDirectionOf } from '../rt-table-sort.logic';\nimport { RtTableComponent } from '../rt-table.component';\n\nconst BEM_BLOCK: string = 'rt-table-sort-header';\n\n/** Иконка направления: без сортировки — обе стрелки, иначе стрелка выбранного порядка. */\nconst ICONS: Readonly<Record<TListSortOrderType | 'none', IRtIcon.Name>> = Object.freeze({\n none: 'sort-alt',\n [EListSortOrder.ASC]: 'arrow-up',\n [EListSortOrder.DESC]: 'arrow-down',\n});\n\n/**\n * Заголовок сортируемой колонки — атрибутом на ячейке шапки:\n * `<th *cdkHeaderCellDef cdk-header-cell rtSortHeader=\"checkIn\">Заезд</th>`.\n *\n * Подпись проецируется внутрь кнопки, и доступное имя кнопки берётся из неё — порядок\n * меняется не только мышью. Текущее направление читается с самой колонки через\n * `aria-sort`, а видно его по стрелке.\n *\n * Колонка сортируется, только когда помечена `sortable` в `[columnsConfig]` таблицы;\n * иначе заголовок остаётся обычной подписью. Элементная форма селектора нужна правилу\n * префиксов и в разметке не применяется: `aria-sort` принадлежит ячейке шапки.\n */\n@Component({\n selector: 'rt-table-sort-header, th[rtSortHeader]',\n templateUrl: './rt-table-sort-header.component.html',\n styleUrl: './rt-table-sort-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // angular\n NgTemplateOutlet,\n\n // rt-tools\n BlockDirective,\n ElemDirective,\n ModDirective,\n\n // components\n RtIconComponent,\n ],\n host: {\n class: BEM_BLOCK,\n '[attr.aria-sort]': 'ariaSort()',\n },\n})\nexport class RtTableSortHeaderComponent {\n readonly #table: RtTableComponent<unknown> = inject<RtTableComponent<unknown>>(RtTableComponent);\n\n /** Направление сортировки по этой колонке; `null` — сортирует другая либо никакая. */\n protected readonly direction: Signal<TListSortOrderType | null> = computed((): TListSortOrderType | null =>\n sortDirectionOf(this.#table.currentSort(), this.rtSortHeader())\n );\n\n protected readonly icon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name => ICONS[this.direction() ?? 'none']);\n\n protected readonly sortable: Signal<boolean> = computed((): boolean =>\n isColumnSortable(this.#table.columnsConfig(), this.rtSortHeader())\n );\n\n /** Ключ колонки — тот же, что в `cdkColumnDef` и в `[columnsConfig]`. */\n public readonly rtSortHeader: InputSignal<string> = input.required<string>();\n\n public readonly ariaSort: Signal<TRtTableAriaSort> = computed((): TRtTableAriaSort =>\n ariaSortOf(this.#table.currentSort(), this.rtSortHeader())\n );\n\n protected onToggle(): void {\n this.#table.toggleSort(this.rtSortHeader());\n }\n}\n","<ng-template #label>\n <ng-content />\n</ng-template>\n\n<ng-container rtBlock=\"rt-table-sort-header\">\n @if (sortable()) {\n <button\n rtElem=\"button\"\n qa-dataid=\"table-sort-header\"\n type=\"button\"\n [attr.data-column]=\"rtSortHeader()\"\n [attr.data-direction]=\"direction()\"\n [rtMod]=\"{ active: direction() !== null }\"\n (click)=\"onToggle()\">\n <ng-container [ngTemplateOutlet]=\"label\" />\n <rt-icon rtElem=\"icon\" size=\"xs\" [name]=\"icon()\" />\n </button>\n } @else {\n <ng-container [ngTemplateOutlet]=\"label\" />\n }\n</ng-container>\n","import { Directive, output, OutputEmitterRef } from '@angular/core';\n\nimport { isFromInteractive } from './rt-table-row.logic';\n\n/**\n * Делает строку таблицы (`<tr cdk-row>`) активируемой — общий паттерн «клик по\n * строке открывает деталь/асайд». Инкапсулирует доступность: строка становится\n * focusable, активируется кликом и Enter/Space, наружу отдаёт `(activated)`.\n *\n * Клик/клавиша по интерактивному потомку (кнопка/ссылка/контрол) активацией\n * строки НЕ считается — иначе вложенные действия конфликтовали бы с переходом.\n * Роль строки не переопределяется (table-семантика для скрин-ридеров сохраняется).\n * Визуальный аффорданс (cursor/hover/focus-ring) включает `[clickable]` на rt-table.\n */\n@Directive({\n selector: '[rtTableRow]',\n host: {\n tabindex: '0',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onKey($event)',\n '(keydown.space)': 'onKey($event)',\n },\n})\nexport class RtTableRowDirective {\n public readonly activated: OutputEmitterRef<void> = output<void>();\n\n protected onClick(event: MouseEvent): void {\n if (isFromInteractive(event.target)) {\n return;\n }\n this.activated.emit();\n }\n\n protected onKey(event: Event): void {\n if (isFromInteractive(event.target)) {\n return;\n }\n // Space иначе проскроллит страницу — гасим дефолт перед активацией.\n event.preventDefault();\n this.activated.emit();\n }\n}\n","import { CdkDrag, CdkDragDrop, CdkDragHandle, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { inject, model, ChangeDetectionStrategy, Component, ModelSignal, Signal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } 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 { IRtTable } from '../rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table-settings-panel';\n\n/**\n * Презентационный редактор списка колонок таблицы: reorder (drag-drop) + видимость\n * (глаз). Locked-колонки всегда видимы и не перетаскиваются. Двусторонний `items` —\n * текущее состояние; контейнер (route-асайд настроек) владеет сигналом, читает его\n * для «Сохранить»/«Сбросить» и передаёт сюда через `[(items)]`.\n */\n@Component({\n selector: 'rt-table-settings-panel',\n templateUrl: './rt-table-settings-panel.component.html',\n styleUrl: './rt-table-settings-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // @angular/cdk\n CdkDrag,\n CdkDragHandle,\n CdkDropList,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTableSettingsPanelComponent {\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n public readonly items: ModelSignal<ReadonlyArray<IRtTable.ColumnSettingItem>> =\n model.required<ReadonlyArray<IRtTable.ColumnSettingItem>>();\n\n /** Reorder через drag-drop. Locked-строки drag-disabled; индексы — по всему списку. */\n protected onDrop(event: CdkDragDrop<ReadonlyArray<IRtTable.ColumnSettingItem>>): void {\n if (event.previousIndex === event.currentIndex) {\n return;\n }\n const next: IRtTable.ColumnSettingItem[] = [...this.items()];\n moveItemInArray(next, event.previousIndex, event.currentIndex);\n this.items.set(next);\n }\n\n /** Переключить видимость колонки (locked — нельзя). */\n protected onToggleHidden(key: string): void {\n this.items.update((items: ReadonlyArray<IRtTable.ColumnSettingItem>): ReadonlyArray<IRtTable.ColumnSettingItem> =>\n items.map((item: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem =>\n item.key === key && item.locked !== true ? { ...item, hidden: !item.hidden } : item\n )\n );\n }\n}\n","<ul rtBlock=\"rt-table-settings-panel\" rtElem=\"list\" qa-dataid=\"table-settings-list\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n @for (item of items(); track item.key) {\n <li\n rtElem=\"row\"\n qa-dataid=\"table-settings-row\"\n cdkDrag\n [attr.data-key]=\"item.key\"\n [rtMod]=\"{ locked: item.locked === true, hidden: item.hidden }\"\n [cdkDragDisabled]=\"item.locked === true\">\n @if (item.locked === true) {\n <span rtElem=\"handle\" rtMod=\"placeholder\" aria-hidden=\"true\"></span>\n } @else {\n <button rtElem=\"handle\" qa-dataid=\"table-settings-drag\" type=\"button\" cdkDragHandle [attr.aria-label]=\"t().uiDragColumn\">\n <rt-icon name=\"bars\" size=\"sm\" color=\"muted\" />\n </button>\n }\n\n <span rtElem=\"label\" qa-dataid=\"table-settings-label\">{{ item.label }}</span>\n\n <rt-icon-button\n rtElem=\"toggle\"\n qa-dataid=\"table-settings-toggle\"\n [icon]=\"item.hidden ? 'eye-slash' : 'eye'\"\n [ariaLabel]=\"item.hidden ? t().uiShowColumn : t().uiHideColumn\"\n [tooltip]=\"item.locked === true ? t().uiColumnLocked : item.hidden ? t().uiShow : t().uiHide\"\n [disabled]=\"item.locked === true\"\n (clicked)=\"onToggleHidden(item.key)\" />\n </li>\n }\n</ul>\n","import {\n computed,\n effect,\n inject,\n signal,\n ChangeDetectionStrategy,\n Component,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { Observable, of } from 'rxjs';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap } from '@rt-tools/ui-kit-v2/core';\nimport { RtAsideFooterComponent } from '@rt-tools/ui-kit-v2/aside';\nimport { RtAsideHeaderComponent } from '@rt-tools/ui-kit-v2/aside';\nimport { RtAsideComponent } from '@rt-tools/ui-kit-v2/aside';\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtContainerRightSidenavPanelDirective } from '@rt-tools/ui-kit-v2/container';\nimport { RtRouteAsideComponent } from '@rt-tools/ui-kit-v2/container';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtTableSettingsPanelComponent } from '../settings-panel/rt-table-settings-panel.component';\nimport { RtTableSettingsRegistry, type IRtTableSettingsRegistration } from '../rt-table-settings.registry';\nimport { IRtTable } from '../rt-table.model';\n\nconst BEM_BLOCK: string = 'rt-table-settings-aside';\n\n/**\n * Общий route-driven side-sheet настроек колонок для любой `rt-table`. Открывается\n * навигацией на `(ro:table-settings)`; какая таблица настраивается — берётся из\n * `RtTableSettingsRegistry.active()` (потребитель выставляет `setActive(tableId)`\n * перед навигацией). Create-mode: id в route нет (`tableId` — строка, числовой базой\n * не резолвится).\n *\n * Тело списка (drag-reorder + видимость) — переиспользуемый `rt-table-settings-panel`;\n * «Сохранить»/«Сбросить» живут в chrome асайда над локальным `items`, засеянным из\n * активной регистрации. Регистрируется в `routes.ts` каждого shell под `outlet: \"ro\"`.\n */\n@Component({\n selector: 'rt-table-settings-aside',\n templateUrl: './rt-table-settings-aside.component.html',\n styleUrls: ['./rt-table-settings-aside.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n RtAsideComponent,\n RtAsideFooterComponent,\n RtAsideHeaderComponent,\n RtButtonDirective,\n RtContainerRightSidenavPanelDirective,\n RtIconButtonComponent,\n RtTableSettingsPanelComponent,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtTableSettingsAsideComponent extends RtRouteAsideComponent<never> {\n readonly #registry: RtTableSettingsRegistry = inject(RtTableSettingsRegistry);\n\n /**\n * `active` на момент создания асайда: `null` — восстановление после F5\n * (`setActive` никто не звал), непустой id — штатное открытие потребителем.\n */\n readonly #initialActive: string | null = this.#registry.active();\n\n /** Регистрация активной таблицы (её колонки/дефолты/apply). Реактивна к реестру. */\n readonly #registration: Signal<IRtTableSettingsRegistration | null> = computed((): IRtTableSettingsRegistration | null => {\n const tableId: string | null = this.#registry.active();\n return tableId !== null ? this.#registry.get(tableId)() : null;\n });\n\n /** Рабочая копия списка колонок (сидится из регистрации, редактируется телом-панелью). */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly items: WritableSignal<ReadonlyArray<IRtTable.ColumnSettingItem>> = signal<ReadonlyArray<IRtTable.ColumnSettingItem>>(\n []\n );\n\n #seeded: boolean = false;\n\n /** Асайд восстановил `active` сам (после F5) — дальше живёт по штатным правилам. */\n #adopted: boolean = false;\n\n constructor() {\n super();\n // Фикс F-16: после F5 асайд инициализируется раньше `rt-table`, реестр в\n // этот момент пуст и `active` сброшен (root-сервис пересоздан). Вместо\n // самозакрытия на первом промахе ждём регистрацию: страница регистрирует\n // ровно одну настраиваемую таблицу — она и становится активной.\n if (this.#initialActive === null) {\n effect((): void => {\n // Усыновление одноразовое: после него асайд живёт по штатным\n // правилам (уход со страницы = закрытие), а не перепрыгивает\n // на таблицу следующей страницы.\n if (this.#adopted || this.#registry.active() !== null) {\n return;\n }\n const sole: string | null = this.#registry.soleTableId();\n if (sole !== null) {\n this.#adopted = true;\n this.#registry.setActive(sole);\n }\n });\n }\n effect((): void => {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n const panel: RtContainerRightSidenavPanelDirective | undefined = this.panel();\n if (panel === undefined || !panel.ready()) {\n return;\n }\n if (registration === null) {\n // Штатно открытый (или уже усыновивший таблицу) асайд закрывается,\n // когда регистрация исчезла — уход со страницы таблицы. Асайд,\n // восстановленный после F5, регистрацию ещё ЖДЁТ — не закрываемся.\n if (this.#initialActive !== null || this.#adopted) {\n this.onClose();\n }\n return;\n }\n if (!this.#seeded) {\n this.#seeded = true;\n this.items.set(\n registration.columns().map((c: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem => ({\n ...c,\n }))\n );\n }\n });\n }\n\n protected resolve(): Observable<never | null> {\n return of(null);\n }\n\n /** Сбросить рабочую копию к дефолтным колонкам из конфига. */\n protected onReset(): void {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n if (registration === null) {\n return;\n }\n this.items.set(registration.defaults().map((c: IRtTable.ColumnSettingItem): IRtTable.ColumnSettingItem => ({ ...c })));\n }\n\n /** Применить настройки к таблице (через registry) и закрыть асайд. */\n protected onSave(): void {\n const registration: IRtTableSettingsRegistration | null = this.#registration();\n if (registration !== null) {\n const items: ReadonlyArray<IRtTable.ColumnSettingItem> = this.items();\n registration.apply({\n order: items.map((item: IRtTable.ColumnSettingItem): string => item.key),\n hidden: items\n .filter((item: IRtTable.ColumnSettingItem): boolean => item.hidden)\n .map((item: IRtTable.ColumnSettingItem): string => item.key),\n });\n }\n this.#registry.clearActive();\n this.onClose();\n }\n}\n","<ng-container rtContainerRightSidenavPanel #panel=\"rtContainerRightPanel\" (cancelled)=\"onCancel()\" (closed)=\"onClosed()\" />\n\n<rt-aside [ariaLabel]=\"t().uiColumnSettings\">\n <rt-aside-header [title]=\"t().uiColumnSettingsTitle\" (dismiss)=\"onClose()\">\n <rt-icon-button\n asideActions\n qa-dataid=\"table-settings-reset\"\n icon=\"undo\"\n variant=\"ghost\"\n [tooltip]=\"t().uiResetDefaults\"\n [ariaLabel]=\"t().uiResetDefaults\"\n (clicked)=\"onReset()\" />\n </rt-aside-header>\n\n <rt-table-settings-panel [(items)]=\"items\" />\n\n <rt-aside-footer>\n <button\n rtButton\n asideDismiss\n qa-dataid=\"table-settings-close\"\n type=\"button\"\n appearance=\"text\"\n [label]=\"t().uiClose\"\n [attr.aria-label]=\"t().uiClose\"\n (click)=\"onClose()\"></button>\n <button\n rtButton\n asidePrimary\n qa-dataid=\"table-settings-save\"\n type=\"button\"\n [label]=\"t().uiSave\"\n [attr.aria-label]=\"t().uiSave\"\n (click)=\"onSave()\"></button>\n </rt-aside-footer>\n</rt-aside>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["BEM_BLOCK"],"mappings":"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"}
|