@rt-tools/ui-kit-v2 0.33.0 → 0.34.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.
Files changed (217) hide show
  1. package/README.md +4 -3
  2. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +1 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
  4. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +92 -5
  5. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
  6. package/fesm2022/rt-tools-ui-kit-v2-badge.mjs +191 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-badge.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +3 -2
  9. package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -1
  10. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +6 -1
  11. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
  12. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +35 -4
  13. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
  14. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +13 -4
  15. package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -1
  16. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +245 -60
  17. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
  18. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +30 -5
  19. package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
  20. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +113 -2
  21. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
  22. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +14 -3
  23. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
  24. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +17 -3
  25. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
  26. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +6 -3
  27. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
  28. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -2
  29. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
  30. package/fesm2022/rt-tools-ui-kit-v2-divider.mjs +112 -0
  31. package/fesm2022/rt-tools-ui-kit-v2-divider.mjs.map +1 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +1 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -1
  34. package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs +854 -0
  35. package/fesm2022/rt-tools-ui-kit-v2-drawer.mjs.map +1 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +16 -5
  37. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
  38. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +580 -65
  39. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
  40. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +203 -15
  41. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
  42. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +40 -8
  43. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
  44. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +1 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
  46. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +7 -3
  47. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
  48. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +53 -2
  49. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
  50. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +14 -4
  51. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -1
  52. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +6 -3
  53. package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -1
  54. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +16 -5
  55. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
  56. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +1 -0
  57. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
  58. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +14 -4
  59. package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -1
  60. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +3 -2
  61. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
  62. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +207 -7
  63. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
  64. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
  66. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +3 -2
  67. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
  68. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -0
  69. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
  70. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +3 -2
  71. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
  72. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +3 -2
  73. package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -1
  74. package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs +171 -0
  75. package/fesm2022/rt-tools-ui-kit-v2-progress-bar.mjs.map +1 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +176 -6
  77. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
  78. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +2 -1
  79. package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
  80. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +1 -0
  81. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
  82. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +142 -23
  83. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
  84. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +22 -9
  85. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
  86. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +3 -2
  87. package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
  88. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +105 -8
  89. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
  90. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +13 -2
  91. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
  92. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +609 -33
  93. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
  94. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +1 -0
  95. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
  96. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +45 -7
  97. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
  98. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +2 -2
  99. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
  100. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +11 -2
  101. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
  102. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +152 -11
  103. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
  104. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +199 -17
  105. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
  106. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +35 -5
  107. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
  108. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +14 -4
  109. package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -1
  110. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +6 -3
  111. package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -1
  112. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +21 -6
  113. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
  114. package/fesm2022/rt-tools-ui-kit-v2.mjs +4 -0
  115. package/package.json +17 -1
  116. package/src/assets/icons/volume-off.svg +2 -1
  117. package/src/lib/components/autocomplete/CONTEXT.md +25 -14
  118. package/src/lib/components/autocomplete/rt-autocomplete.component.scss +19 -0
  119. package/src/lib/components/badge/CONTEXT.md +33 -0
  120. package/src/lib/components/badge/rt-badge.directive.scss +104 -0
  121. package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +2 -2
  122. package/src/lib/components/button/CONTEXT.md +5 -0
  123. package/src/lib/components/button/rt-button.directive.scss +3 -1
  124. package/src/lib/components/checkbox/CONTEXT.md +15 -8
  125. package/src/lib/components/color-palette/rt-color-palette.component.scss +2 -2
  126. package/src/lib/components/container/CONTEXT.md +23 -6
  127. package/src/lib/components/container/rt-container.component.scss +90 -1
  128. package/src/lib/components/copy-value/CONTEXT.md +6 -5
  129. package/src/lib/components/copy-value/rt-copy-value.component.scss +16 -0
  130. package/src/lib/components/date-picker/rt-date-picker.component.scss +7 -0
  131. package/src/lib/components/date-range/rt-date-range.component.scss +7 -0
  132. package/src/lib/components/divider/CONTEXT.md +21 -0
  133. package/src/lib/components/divider/rt-divider.component.scss +34 -0
  134. package/src/lib/components/drawer/CONTEXT.md +73 -0
  135. package/src/lib/components/drawer/rt-drawer-container.component.scss +19 -0
  136. package/src/lib/components/drawer/rt-drawer.component.scss +168 -0
  137. package/src/lib/components/drawer/rt-resize-handle.component.scss +42 -0
  138. package/src/lib/components/dynamic-selector/CONTEXT.md +5 -0
  139. package/src/lib/components/expansion-panel/CONTEXT.md +32 -8
  140. package/src/lib/components/expansion-panel/rt-expansion-panel.component.scss +67 -2
  141. package/src/lib/components/field/CONTEXT.md +43 -0
  142. package/src/lib/components/field/rt-field-label-inside.scss +179 -0
  143. package/src/lib/components/field/rt-field.component.scss +51 -2
  144. package/src/lib/components/icon-button/CONTEXT.md +17 -15
  145. package/src/lib/components/icon-button/rt-icon-button.component.scss +3 -1
  146. package/src/lib/components/inline-edit/rt-inline-edit.component.scss +4 -4
  147. package/src/lib/components/input/CONTEXT.md +45 -11
  148. package/src/lib/components/input/rt-input-floating-label.scss +192 -0
  149. package/src/lib/components/input/rt-input-icons.scss +105 -0
  150. package/src/lib/components/input/rt-input.component.scss +91 -13
  151. package/src/lib/components/input-number/CONTEXT.md +7 -0
  152. package/src/lib/components/input-number/rt-input-number.component.scss +58 -1
  153. package/src/lib/components/menu/CONTEXT.md +1 -0
  154. package/src/lib/components/multiselect/CONTEXT.md +2 -1
  155. package/src/lib/components/multiselect/rt-multiselect.component.scss +7 -0
  156. package/src/lib/components/pagination/CONTEXT.md +3 -0
  157. package/src/lib/components/pagination/rt-pagination.component.scss +7 -0
  158. package/src/lib/components/progress-bar/CONTEXT.md +22 -0
  159. package/src/lib/components/progress-bar/rt-progress-bar.component.scss +77 -0
  160. package/src/lib/components/radio-button/CONTEXT.md +9 -0
  161. package/src/lib/components/radio-button/rt-radio-group.component.scss +13 -0
  162. package/src/lib/components/select/CONTEXT.md +28 -0
  163. package/src/lib/components/select/rt-select-clear.scss +88 -0
  164. package/src/lib/components/select/rt-select-floating-label.scss +155 -0
  165. package/src/lib/components/select/rt-select-material.scss +54 -0
  166. package/src/lib/components/select/rt-select.component.scss +54 -16
  167. package/src/lib/components/side-menu/CONTEXT.md +5 -0
  168. package/src/lib/components/speed-menu/rt-speed-menu.component.scss +5 -5
  169. package/src/lib/components/stepper/CONTEXT.md +13 -5
  170. package/src/lib/components/stepper/rt-stepper.component.scss +93 -0
  171. package/src/lib/components/tabs/CONTEXT.md +57 -9
  172. package/src/lib/components/tabs/rt-tabs.component.scss +201 -5
  173. package/src/lib/components/textarea/CONTEXT.md +12 -1
  174. package/src/lib/components/textarea/rt-textarea.component.scss +116 -1
  175. package/src/lib/components/toast/CONTEXT.md +23 -0
  176. package/src/lib/components/toast/rt-toast.component.scss +37 -0
  177. package/src/lib/components/toggle-button-group/CONTEXT.md +24 -4
  178. package/src/lib/components/toggle-button-group/rt-toggle-button-group-chips.scss +151 -0
  179. package/src/lib/components/toggle-button-group/rt-toggle-button-group.component.scss +35 -0
  180. package/src/lib/components/tooltip/CONTEXT.md +7 -1
  181. package/src/lib/components/tree/rt-tree.component.scss +2 -2
  182. package/src/styles/_color-scheme.scss +1 -1
  183. package/src/styles/_density.scss +48 -0
  184. package/src/styles/_index.scss +8 -0
  185. package/src/styles/_preset-material.scss +160 -70
  186. package/src/styles/_primitives.scss +1 -0
  187. package/src/styles/_semantic-navigation.scss +117 -0
  188. package/src/styles/_semantic.scss +29 -98
  189. package/src/styles/_theme-dark.scss +8 -0
  190. package/styles/tokens.css +2066 -1134
  191. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +34 -0
  192. package/types/rt-tools-ui-kit-v2-badge.d.ts +71 -0
  193. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +17 -3
  194. package/types/rt-tools-ui-kit-v2-container.d.ts +65 -9
  195. package/types/rt-tools-ui-kit-v2-copy-value.d.ts +11 -1
  196. package/types/rt-tools-ui-kit-v2-core.d.ts +109 -4
  197. package/types/rt-tools-ui-kit-v2-divider.d.ts +29 -0
  198. package/types/rt-tools-ui-kit-v2-drawer.d.ts +257 -0
  199. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +240 -25
  200. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +87 -3
  201. package/types/rt-tools-ui-kit-v2-field.d.ts +18 -1
  202. package/types/rt-tools-ui-kit-v2-form-control.d.ts +42 -4
  203. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +2 -1
  204. package/types/rt-tools-ui-kit-v2-input-number.d.ts +1 -0
  205. package/types/rt-tools-ui-kit-v2-input.d.ts +98 -4
  206. package/types/rt-tools-ui-kit-v2-progress-bar.d.ts +53 -0
  207. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +80 -1
  208. package/types/rt-tools-ui-kit-v2-select.d.ts +65 -1
  209. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +3 -0
  210. package/types/rt-tools-ui-kit-v2-stepper.d.ts +57 -4
  211. package/types/rt-tools-ui-kit-v2-tabs.d.ts +291 -6
  212. package/types/rt-tools-ui-kit-v2-textarea.d.ts +16 -0
  213. package/types/rt-tools-ui-kit-v2-toast.d.ts +38 -2
  214. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +83 -3
  215. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +17 -2
  216. package/types/rt-tools-ui-kit-v2.d.ts +4 -0
  217. package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-popup-frame.component.scss +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-drawer.mjs","names":["BEM_BLOCK","BEM_BLOCK"],"sources":["../../../projects/ui-kit-v2/src/lib/components/drawer/rt-drawer.model.ts","../../../projects/ui-kit-v2/src/lib/components/drawer/rt-resize-handle.component.ts","../../../projects/ui-kit-v2/src/lib/components/drawer/rt-resize-handle.component.html","../../../projects/ui-kit-v2/src/lib/components/drawer/rt-drawer.transition.ts","../../../projects/ui-kit-v2/src/lib/components/drawer/rt-drawer.component.ts","../../../projects/ui-kit-v2/src/lib/components/drawer/rt-drawer.component.html","../../../projects/ui-kit-v2/src/lib/components/drawer/rt-drawer-container.component.ts","../../../projects/ui-kit-v2/src/lib/components/drawer/rt-drawer-container.component.html"],"sourcesContent":["export namespace IRtDrawer {\n /** `side` — панель стоит рядом с содержимым и сужает его, `over` — ложится поверх содержимого. */\n export type Mode = 'side' | 'over';\n\n /** У какого края контейнера стоит панель. */\n export type Position = 'start' | 'end';\n\n /** Край панели, на котором стоит ручка ширины: тянуть его наружу — значит расширять панель. */\n export type Edge = 'start' | 'end';\n\n /** `clip` — содержимое обрезано краем панели и прокручивается в ней, `visible` — выходит за край. */\n export type Overflow = 'clip' | 'visible';\n\n /**\n * Куда панель ставит фокус на открытии. `true` — на саму панель и только поверх содержимого,\n * `false` — никуда, `'first-tabbable'` — на первый элемент обхода, другая строка — на узел по\n * CSS-селектору. Узел не нашёлся — фокус встаёт на панель.\n */\n export type AutoFocus = boolean | string;\n}\n\n/** Цель фокуса «сама панель» — пустая строка: селектора короче не бывает. */\nexport const FOCUS_PANEL: string = '';\n\n/** Строки, которые значат признак, а не селектор: так их пишет атрибут без привязки. */\nconst FOCUS_FLAGS: ReadonlyMap<string, boolean> = new Map<string, boolean>([\n ['', true],\n ['true', true],\n ['false', false],\n]);\n\n/**\n * Куда ставить фокус на открытии: `null` — никуда, {@link FOCUS_PANEL} — на панель,\n * `'first-tabbable'` — на первый элемент обхода, иначе — селектор. Пустой атрибут и строка\n * `'true'` значат `true`, строка `'false'` — `false`.\n */\nexport function autoFocusTarget(value: IRtDrawer.AutoFocus | null | undefined, over: boolean): string | null {\n if (typeof value === 'string' && !FOCUS_FLAGS.has(value)) {\n return value;\n }\n const flag: boolean = typeof value === 'string' ? FOCUS_FLAGS.get(value) === true : (value ?? true);\n\n return flag && over ? FOCUS_PANEL : null;\n}\n\n/** Ширина в пределах `[min, max]`; если границы перепутаны, верх уступает низу. */\nexport function clampWidth(width: number, min: number, max: number): number {\n return Math.min(Math.max(width, min), Math.max(min, max));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n output,\n OutputEmitterRef,\n signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { clampWidth, IRtDrawer } from './rt-drawer.model';\n\nconst BEM_BLOCK: string = 'rt-resize-handle';\n\n/** Шаг стрелки по умолчанию, в пикселях. */\nconst DEFAULT_STEP: number = 16;\n\ninterface IDragStart {\n readonly pointerId: number;\n readonly x: number;\n readonly width: number;\n}\n\n/**\n * Ручка ширины панели: узкая полоса на краю, которую тянут указателем или двигают стрелками.\n *\n * Ширину ручка не хранит. Она сообщает новую через `widthChange`, а владелец панели решает, принять\n * ли её. Значение всегда лежит в пределах `[min, max]`. `Home` и `End` ставят границы.\n *\n * Без `width` ручка берёт ширину панели, в которой стоит, в момент первого движения. Так панель\n * шириной по содержимому начинает тянуться с той ширины, которую видит человек.\n */\n@Component({\n selector: 'rt-resize-handle',\n templateUrl: './rt-resize-handle.component.html',\n styleUrl: './rt-resize-handle.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: BEM_BLOCK,\n role: 'separator',\n tabindex: '0',\n 'qa-dataid': 'resize-handle',\n 'aria-orientation': 'vertical',\n '[attr.aria-valuenow]': 'width()',\n '[attr.aria-valuemin]': 'min()',\n '[attr.aria-valuemax]': 'max()',\n '[attr.aria-label]': 'ariaLabel()',\n '[class.rt-resize-handle--edge--start]': \"edge() === 'start'\",\n '[class.rt-resize-handle--edge--end]': \"edge() === 'end'\",\n '[class.rt-resize-handle--dragging]': 'dragging()',\n '(pointerdown)': 'startDrag($event)',\n '(pointermove)': 'drag($event)',\n '(pointerup)': 'endDrag($event)',\n '(pointercancel)': 'endDrag($event)',\n // Захват указателя теряется и без отпускания — окно ушло из фокуса, жест системы. Без этого\n // ручка осталась бы в перетаскивании, а панель — без движения ширины.\n '(lostpointercapture)': 'onLostCapture($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class RtResizeHandleComponent {\n readonly #host: HTMLElement = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n #start: IDragStart | null = null;\n\n protected readonly dragging: WritableSignal<boolean> = signal(false);\n\n /** Текущая ширина панели; `null` — ручка измерит панель сама. */\n public readonly width: InputSignal<number | null> = input<number | null>(null);\n\n public readonly min: InputSignalWithTransform<number, unknown> = input(0, { transform: numberAttribute });\n\n public readonly max: InputSignalWithTransform<number, unknown> = input(Number.MAX_SAFE_INTEGER, { transform: numberAttribute });\n\n /** Сколько пикселей добавляет одно нажатие стрелки. */\n public readonly step: InputSignalWithTransform<number, unknown> = input(DEFAULT_STEP, { transform: numberAttribute });\n\n /** На каком краю панели стоит ручка: `start` у панели справа, `end` у панели слева. */\n public readonly edge: InputSignal<IRtDrawer.Edge> = input<IRtDrawer.Edge>('end');\n\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n public readonly widthChange: OutputEmitterRef<number> = output<number>();\n\n /** Тянуть начали: true, отпустили — false. Пока тянут, панель гасит свой переход ширины. */\n public readonly resizing: OutputEmitterRef<boolean> = output<boolean>();\n\n protected startDrag(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n event.preventDefault();\n this.#host.setPointerCapture?.(event.pointerId);\n this.#start = { pointerId: event.pointerId, x: event.clientX, width: this.#currentWidth() };\n this.dragging.set(true);\n this.resizing.emit(true);\n }\n\n protected drag(event: PointerEvent): void {\n const start: IDragStart | null = this.#start;\n\n if (start === null || start.pointerId !== event.pointerId) {\n return;\n }\n const shift: number = event.clientX - start.x;\n\n this.#report(start.width + (this.edge() === 'start' ? -shift : shift));\n }\n\n protected endDrag(event: PointerEvent): void {\n if (this.#start === null || this.#start.pointerId !== event.pointerId) {\n return;\n }\n this.#host.releasePointerCapture?.(event.pointerId);\n this.#start = null;\n this.dragging.set(false);\n this.resizing.emit(false);\n }\n\n /** Захват потерян без отпускания: перетаскивание кончается так же, как отпусканием. */\n protected onLostCapture(event: PointerEvent): void {\n this.endDrag(event);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const target: number | null = this.#keyTarget(event.key);\n\n if (target === null) {\n return;\n }\n event.preventDefault();\n this.#report(target);\n }\n\n #keyTarget(key: string): number | null {\n const grow: string = this.edge() === 'start' ? 'ArrowLeft' : 'ArrowRight';\n const shrink: string = this.edge() === 'start' ? 'ArrowRight' : 'ArrowLeft';\n\n switch (key) {\n case grow:\n return this.#currentWidth() + this.step();\n case shrink:\n return this.#currentWidth() - this.step();\n case 'Home':\n return this.min();\n case 'End':\n return this.max();\n default:\n return null;\n }\n }\n\n #report(width: number): void {\n const next: number = Math.round(clampWidth(width, this.min(), this.max()));\n\n if (next !== this.width()) {\n this.widthChange.emit(next);\n }\n }\n\n #currentWidth(): number {\n return this.width() ?? this.#host.parentElement?.getBoundingClientRect().width ?? this.min();\n }\n}\n","","/** Запас сверх длительности перехода, после которого ожидание `transitionend` снимается. */\nconst TRANSITION_BUFFER_MS: number = 80;\n\n/** Максимальная длительность transition'а элемента в мс; `0` если анимации нет. */\nexport function transitionDurationMs(win: Window | null, element: HTMLElement): number {\n const durationCss: string | undefined = win?.getComputedStyle(element).transitionDuration;\n if (durationCss === undefined || durationCss === '') {\n return 0;\n }\n const maxSeconds: number = durationCss.split(',').reduce((max: number, part: string): number => {\n const trimmed: string = part.trim();\n const seconds: number = trimmed.endsWith('ms') ? Number.parseFloat(trimmed) / 1000 : Number.parseFloat(trimmed);\n return Number.isNaN(seconds) ? max : Math.max(max, seconds);\n }, 0);\n return maxSeconds * 1000;\n}\n\n/**\n * Зовёт `callback` по окончании перехода одного свойства узла.\n *\n * Слушаем окончание одного свойства: на узле могут анимироваться и другие (opacity\n * backdrop'а, например) — это даст ложные срабатывания.\n */\nexport function listenTransitionEnd(win: Window | null, element: HTMLElement, property: string, callback: () => void): void {\n // Нет анимации (reduced-motion / `transition: none`) → `transitionend` не\n // придёт; teardown-callback (навигация `ro:null`) отрабатываем синхронно.\n const durationMs: number = transitionDurationMs(win, element);\n if (durationMs === 0) {\n callback();\n return;\n }\n\n // settled-гард делает transitionend и fallback-таймаут взаимно\n // идемпотентными — сработает и снимет listener только то, что раньше.\n let settled: boolean = false;\n\n const handler: (event: TransitionEvent) => void = (event: TransitionEvent): void => {\n if (event.propertyName !== property || event.target !== element || settled) {\n return;\n }\n settled = true;\n element.removeEventListener('transitionend', handler);\n callback();\n };\n element.addEventListener('transitionend', handler);\n\n // Страховка на случай пропущенного `transitionend` (лаг рендера).\n setTimeout((): void => {\n if (settled) {\n return;\n }\n settled = true;\n element.removeEventListener('transitionend', handler);\n callback();\n }, durationMs + TRANSITION_BUFFER_MS);\n}\n","import { CdkTrapFocus, FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n InputSignal,\n InputSignalWithTransform,\n model,\n ModelSignal,\n numberAttribute,\n output,\n OutputEmitterRef,\n signal,\n Signal,\n untracked,\n viewChild,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { listenTransitionEnd } from './rt-drawer.transition';\nimport { autoFocusTarget, clampWidth, FOCUS_PANEL, IRtDrawer } from './rt-drawer.model';\nimport { RtResizeHandleComponent } from './rt-resize-handle.component';\n\nconst BEM_BLOCK: string = 'rt-drawer';\n\n/** Ширина панели по умолчанию, в пикселях. */\nconst DEFAULT_WIDTH: number = 320;\n\nconst DEFAULT_MIN_WIDTH: number = 200;\n\nconst DEFAULT_MAX_WIDTH: number = 640;\n\n/**\n * Встраиваемая боковая панель внутри `rt-drawer-container`: рядом с содержимым страницы (`side`)\n * или поверх него (`over`).\n *\n * Панель живёт в странице, а не в оверлее: она занимает место внутри контейнера и не выходит за\n * его края. Этим она отличается от `rt-aside`, которая открывается над всем окном, и от правой\n * панели `rt-container`, которая принадлежит каркасу приложения.\n *\n * - `opened` — двусторонний вход: панель открывают владелец и сама панель, закрывают её\n * подложка и Escape в режиме `over`. С `disableClose` закрыть её может только владелец.\n * - `width` — двусторонний вход в пикселях. С `resizable` у внутреннего края стоит ручка, которой\n * ширину меняют указателем и стрелками в пределах `[minWidth, maxWidth]`.\n * - Закрытая панель остаётся в разметке и не принимает фокус: содержимое не создаётся заново на\n * каждом открытии.\n * - `openedStart` и `closedStart` приходят в момент смены `opened`, `afterOpened` и `afterClosed` —\n * после перехода ширины или сдвига; без движения — сразу.\n */\n@Component({\n selector: 'rt-drawer',\n templateUrl: './rt-drawer.component.html',\n styleUrl: './rt-drawer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CdkTrapFocus, BlockDirective, ElemDirective, ModDirective, RtResizeHandleComponent],\n host: {\n class: BEM_BLOCK,\n 'qa-dataid': 'drawer',\n },\n})\nexport class RtDrawerComponent {\n readonly #document: Document = inject(DOCUMENT);\n readonly #injector: Injector = inject(Injector);\n readonly #focusTrapFactory: FocusTrapFactory = inject(FocusTrapFactory);\n\n /** Первое чтение `opened` — исходное состояние, а не смена: о нём панель не сообщает. */\n #announced: boolean = false;\n\n /** Номер последней смены: ожидание конца перехода, обогнанное новой сменой, молчит. */\n #turn: number = 0;\n\n #destroyed: boolean = false;\n\n /** Узел, который держал фокус до открытия поверх: ему фокус и возвращается. */\n #focusBefore: HTMLElement | null = null;\n\n protected readonly panel: Signal<ElementRef<HTMLElement>> = viewChild.required<ElementRef<HTMLElement>>('panel');\n\n protected readonly resizing: WritableSignal<boolean> = signal(false);\n\n /** Ширина, которую панель рисует: вход, удержанный в пределах. */\n protected readonly shownWidth: Signal<number | null> = computed((): number | null => {\n const width: number | null = this.width();\n\n return width === null ? null : clampWidth(width, this.minWidth(), this.maxWidth());\n });\n\n /** Ширина по содержимому: у панели нет своей ширины, и тянуть ручкой нечего. */\n protected readonly autoWidth: Signal<boolean> = computed((): boolean => this.width() === null);\n\n protected readonly handleShown: Signal<boolean> = computed((): boolean => this.resizable() && !this.autoWidth());\n\n protected readonly backdropShown: Signal<boolean> = computed((): boolean => this.mode() === 'over' && this.hasBackdrop());\n\n /** Открытая панель поверх содержимого держит фокус в себе: Tab не уходит под подложку. */\n protected readonly trapFocus: Signal<boolean> = computed((): boolean => this.backdropShown() && this.opened());\n\n /** Ручка стоит у внутреннего края: у панели слева — справа от неё, и наоборот. */\n protected readonly handleEdge: Signal<IRtDrawer.Edge> = computed((): IRtDrawer.Edge => (this.position() === 'start' ? 'end' : 'start'));\n\n public readonly opened: ModelSignal<boolean> = model<boolean>(false);\n\n public readonly mode: InputSignal<IRtDrawer.Mode> = input<IRtDrawer.Mode>('side');\n\n public readonly position: InputSignal<IRtDrawer.Position> = input<IRtDrawer.Position>('start');\n\n /** Подложка под панелью в режиме `over`. В режиме `side` подложки нет никогда. */\n public readonly hasBackdrop: InputSignalWithTransform<boolean, unknown> = input(true, { transform: booleanAttribute });\n\n /** Подложка и Escape панель не закрывают: закрыть её может только владелец. */\n public readonly disableClose: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n /** Ширина в пикселях; `null` — панель шириной по содержимому, ручки ширины у неё нет. */\n public readonly width: ModelSignal<number | null> = model<number | null>(DEFAULT_WIDTH);\n\n public readonly minWidth: InputSignalWithTransform<number, unknown> = input(DEFAULT_MIN_WIDTH, { transform: numberAttribute });\n\n public readonly maxWidth: InputSignalWithTransform<number, unknown> = input(DEFAULT_MAX_WIDTH, { transform: numberAttribute });\n\n /** У внутреннего края панели стоит ручка ширины. */\n public readonly resizable: InputSignalWithTransform<boolean, unknown> = input(false, { transform: booleanAttribute });\n\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n\n /** `visible` — содержимое выходит за край панели: выезжающая вбок подпанель, ручка на краю. */\n public readonly overflow: InputSignal<IRtDrawer.Overflow> = input<IRtDrawer.Overflow>('clip');\n\n /** Куда встаёт фокус на открытии; по умолчанию — на панель, и только поверх содержимого. */\n public readonly autoFocus: InputSignal<IRtDrawer.AutoFocus> = input<IRtDrawer.AutoFocus>(true);\n\n public readonly openedStart: OutputEmitterRef<void> = output<void>();\n\n public readonly closedStart: OutputEmitterRef<void> = output<void>();\n\n public readonly afterOpened: OutputEmitterRef<void> = output<void>();\n\n public readonly afterClosed: OutputEmitterRef<void> = output<void>();\n\n /** Нажатие на подложку; приходит и с `disableClose`, до закрытия. */\n public readonly backdropClick: OutputEmitterRef<MouseEvent> = output<MouseEvent>();\n\n constructor() {\n // Поверх содержимого панель забирает фокус на открытии и отдаёт его на закрытии; рядом с\n // содержимым она часть страницы, и фокус остаётся там, где его поставил человек. Панель,\n // открытая с первой отрисовки, фокус не берёт: страница только загрузилась, и человек\n // ничего не открывал.\n effect((): void => {\n const opened: boolean = this.opened();\n\n untracked((): void => {\n if (!this.#announced) {\n this.#announce(opened);\n return;\n }\n if (opened) {\n this.#takeFocus();\n } else {\n this.#returnFocus();\n }\n this.#announce(opened);\n });\n });\n inject(DestroyRef).onDestroy((): void => {\n this.#destroyed = true;\n });\n }\n\n public open(): void {\n this.opened.set(true);\n }\n\n public close(): void {\n this.opened.set(false);\n }\n\n public toggle(): void {\n this.opened.update((opened: boolean): boolean => !opened);\n }\n\n protected onBackdrop(event: MouseEvent): void {\n this.backdropClick.emit(event);\n if (!this.disableClose()) {\n this.close();\n }\n }\n\n protected onEscape(event: Event): void {\n if (this.mode() !== 'over' || this.disableClose() || !this.opened()) {\n return;\n }\n event.stopPropagation();\n this.close();\n }\n\n protected onWidth(width: number): void {\n this.width.set(width);\n }\n\n #takeFocus(): void {\n const target: string | null = autoFocusTarget(this.autoFocus(), this.mode() === 'over');\n\n if (target === null) {\n return;\n }\n const active: Element | null = this.#document.activeElement;\n\n this.#focusBefore = active instanceof HTMLElement ? active : null;\n afterNextRender((): void => this.#focusInside(target), { injector: this.#injector });\n }\n\n /** Узел не нашёлся — фокус встаёт на саму панель: открытая панель его не теряет. */\n #focusInside(target: string): void {\n const panel: HTMLElement = this.panel().nativeElement;\n\n if (target === 'first-tabbable') {\n const lookup: FocusTrap = this.#focusTrapFactory.create(panel);\n const found: boolean = lookup.focusFirstTabbableElement({ preventScroll: true });\n\n lookup.destroy();\n if (!found) {\n panel.focus({ preventScroll: true });\n }\n return;\n }\n const node: HTMLElement | null = target === FOCUS_PANEL ? null : panel.querySelector<HTMLElement>(target);\n\n (node ?? panel).focus({ preventScroll: true });\n }\n\n /** Начало смены сообщается сразу, её конец — когда панель доехала. */\n #announce(opened: boolean): void {\n if (!this.#announced) {\n this.#announced = true;\n return;\n }\n this.#turn += 1;\n const turn: number = this.#turn;\n\n (opened ? this.openedStart : this.closedStart).emit();\n afterNextRender(\n (): void => {\n const panel: HTMLElement = this.panel().nativeElement;\n const property: string = this.mode() === 'over' ? 'transform' : 'inline-size';\n\n listenTransitionEnd(this.#document.defaultView, panel, property, (): void => {\n if (turn === this.#turn && !this.#destroyed) {\n (opened ? this.afterOpened : this.afterClosed).emit();\n }\n });\n },\n { injector: this.#injector }\n );\n }\n\n #returnFocus(): void {\n const before: HTMLElement | null = this.#focusBefore;\n const panel: HTMLElement = this.panel().nativeElement;\n\n this.#focusBefore = null;\n if (before !== null && panel.contains(this.#document.activeElement)) {\n before.focus({ preventScroll: true });\n }\n }\n}\n","<ng-container rtBlock=\"rt-drawer\">\n @if (backdropShown()) {\n <!-- Подложка закрывается и с клавиатуры: Escape в панели, которая держит фокус. Своя клавиша\n у подложки была бы второй точкой фокуса без названия. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <div rtElem=\"backdrop\" qa-dataid=\"drawer-backdrop\" [rtMod]=\"{ visible: opened() }\" (click)=\"onBackdrop($event)\"></div>\n }\n\n <aside\n #panel\n rtElem=\"panel\"\n qa-dataid=\"drawer-panel\"\n tabindex=\"-1\"\n [cdkTrapFocus]=\"trapFocus()\"\n [rtMod]=\"{\n mode: mode(),\n position: position(),\n opened: opened(),\n resizing: resizing(),\n overflow: overflow(),\n 'auto-width': autoWidth(),\n }\"\n [attr.inert]=\"opened() ? null : ''\"\n [attr.aria-label]=\"ariaLabel()\"\n [style.--rt-drawer-width.px]=\"shownWidth()\"\n (keydown.escape)=\"onEscape($event)\">\n <div rtElem=\"inner\">\n <ng-content />\n </div>\n\n @if (handleShown()) {\n <rt-resize-handle\n [width]=\"shownWidth()\"\n [min]=\"minWidth()\"\n [max]=\"maxWidth()\"\n [edge]=\"handleEdge()\"\n [ariaLabel]=\"ariaLabel()\"\n (widthChange)=\"onWidth($event)\"\n (resizing)=\"resizing.set($event)\" />\n }\n </aside>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\n\nconst BEM_BLOCK: string = 'rt-drawer-container';\n\n/**\n * Участок страницы с боковыми панелями: строка из содержимого и панелей `rt-drawer` у его краёв.\n *\n * Контейнер задаёт строку и обрезает всё, что выходит за его края: панель поверх содержимого\n * ложится внутри контейнера, а не над всей страницей. Высоту контейнеру даёт место, в которое его\n * поставили, — панель тянется на всю эту высоту.\n *\n * @example\n * ```html\n * <rt-drawer-container>\n * <rt-drawer resizable [(opened)]=\"filtersOpen\" [(width)]=\"filtersWidth\">…</rt-drawer>\n * <section>Отчёт</section>\n * </rt-drawer-container>\n * ```\n */\n@Component({\n selector: 'rt-drawer-container',\n templateUrl: './rt-drawer-container.component.html',\n styleUrl: './rt-drawer-container.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [BlockDirective, ElemDirective],\n host: {\n class: BEM_BLOCK,\n 'qa-dataid': 'drawer-container',\n },\n})\nexport class RtDrawerContainerComponent {}\n","<!-- Содержимое идёт в разметке первым: панели после него рисуются поверх его узлов с положением.\n На экране порядок задают сами панели — у каждой свой край строки. -->\n<ng-container rtBlock=\"rt-drawer-container\">\n <div rtElem=\"content\" qa-dataid=\"drawer-container-content\">\n <ng-content />\n </div>\n <ng-content select=\"rt-drawer\" />\n</ng-container>\n"],"mappings":"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"}
@@ -370,7 +370,7 @@ var RtDynamicListComponent = class RtDynamicListComponent {
370
370
  isSignal: true
371
371
  }],
372
372
  ngImport: i0,
373
- template: "<ng-container rtBlock=\"rt-dynamic-list\">\n @if (loading()) {\n <div rtElem=\"loader\" qa-dataid=\"dynamic-list-loader\">\n <rt-spinner />\n </div>\n } @else {\n @if (fetching()) {\n <div rtElem=\"veil\" qa-dataid=\"dynamic-list-veil\">\n <rt-spinner />\n </div>\n }\n\n @if (isToolbarShown()) {\n <div rtElem=\"toolbar\" qa-dataid=\"dynamic-list-toolbar\">\n @if (selectable() || selectorsTpl()) {\n <div rtElem=\"selectors\" qa-dataid=\"dynamic-list-selectors\">\n @if (selectable()) {\n <rt-checkbox\n qa-dataid=\"dynamic-list-select-all\"\n [ariaLabel]=\"t().uiSelectAll\"\n [ngModel]=\"allSelected()\"\n [indeterminate]=\"!allSelected() && someSelected()\"\n [disabled]=\"selectAllDisabled()\"\n (ngModelChange)=\"onSelectAll($event)\" />\n\n @if (selectedCount()) {\n <span rtElem=\"counter\" qa-dataid=\"dynamic-list-selected-count\">\n {{ selectedLabel() }}\n </span>\n }\n }\n\n @if (selectorsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"right\" qa-dataid=\"dynamic-list-right\">\n <div rtElem=\"actions\">\n @if (actionsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n\n @if (showClearFilters()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-clear-filters\"\n icon=\"filter-slash\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClearFilters\"\n [tooltip]=\"t().uiClearFilters\"\n [disabled]=\"!filtered()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-refresh\"\n icon=\"refresh\"\n size=\"sm\"\n [ariaLabel]=\"t().uiRefresh\"\n [tooltip]=\"t().uiRefresh\"\n (clicked)=\"refreshed.emit()\" />\n }\n\n @if (showColumnSettings()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-column-settings\"\n icon=\"sliders-v\"\n size=\"sm\"\n [ariaLabel]=\"t().uiColumnSettings\"\n [tooltip]=\"t().uiColumnSettings\"\n (clicked)=\"columnSettingsOpened.emit()\" />\n }\n </div>\n\n @if (showSearch()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"dynamic-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"t().uiSearch\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </div>\n }\n\n @if (empty()) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"dynamic-list-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyTitleText()\"\n [description]=\"emptyDescription()\">\n @if (emptyReason() === 'filter') {\n <button\n rtButton\n qa-dataid=\"dynamic-list-empty-clear\"\n type=\"button\"\n icon=\"filter-slash\"\n appearance=\"outlined\"\n size=\"sm\"\n [label]=\"t().uiClearFilters\"\n [attr.aria-label]=\"t().uiClearFilters\"\n (click)=\"onClearFilters()\"></button>\n }\n </rt-empty-state>\n } @else {\n <div rtElem=\"content\" qa-dataid=\"dynamic-list-content\">\n <ng-content />\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n rtElem=\"pagination\"\n qa-dataid=\"dynamic-list-pagination\"\n [pageModel]=\"pageModel()!\"\n [perPageOptions]=\"perPageOptions\"\n [loading]=\"fetching()\"\n (pageChange)=\"pageChange.emit($event)\"\n (perPageChange)=\"perPageChange.emit($event)\" />\n }\n }\n }\n</ng-container>\n",
373
+ template: "<ng-container rtBlock=\"rt-dynamic-list\">\n @if (loading()) {\n <div rtElem=\"loader\" qa-dataid=\"dynamic-list-loader\">\n <rt-spinner />\n </div>\n } @else {\n @if (fetching()) {\n <div rtElem=\"veil\" qa-dataid=\"dynamic-list-veil\">\n <rt-spinner />\n </div>\n }\n\n @if (isToolbarShown()) {\n <div rtElem=\"toolbar\" qa-dataid=\"dynamic-list-toolbar\">\n @if (selectable() || selectorsTpl()) {\n <div rtElem=\"selectors\" qa-dataid=\"dynamic-list-selectors\">\n @if (selectable()) {\n <rt-checkbox\n qa-dataid=\"dynamic-list-select-all\"\n [ariaLabel]=\"t().uiSelectAll\"\n [ngModel]=\"allSelected()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [indeterminate]=\"!allSelected() && someSelected()\"\n [disabled]=\"selectAllDisabled()\"\n (ngModelChange)=\"onSelectAll($event)\" />\n\n @if (selectedCount()) {\n <span rtElem=\"counter\" qa-dataid=\"dynamic-list-selected-count\">\n {{ selectedLabel() }}\n </span>\n }\n }\n\n @if (selectorsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"right\" qa-dataid=\"dynamic-list-right\">\n <div rtElem=\"actions\">\n @if (actionsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n\n @if (showClearFilters()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-clear-filters\"\n icon=\"filter-slash\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClearFilters\"\n [tooltip]=\"t().uiClearFilters\"\n [disabled]=\"!filtered()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-refresh\"\n icon=\"refresh\"\n size=\"sm\"\n [ariaLabel]=\"t().uiRefresh\"\n [tooltip]=\"t().uiRefresh\"\n (clicked)=\"refreshed.emit()\" />\n }\n\n @if (showColumnSettings()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-column-settings\"\n icon=\"sliders-v\"\n size=\"sm\"\n [ariaLabel]=\"t().uiColumnSettings\"\n [tooltip]=\"t().uiColumnSettings\"\n (clicked)=\"columnSettingsOpened.emit()\" />\n }\n </div>\n\n @if (showSearch()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"dynamic-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"t().uiSearch\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </div>\n }\n\n @if (empty()) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"dynamic-list-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyTitleText()\"\n [description]=\"emptyDescription()\">\n @if (emptyReason() === 'filter') {\n <button\n rtButton\n qa-dataid=\"dynamic-list-empty-clear\"\n type=\"button\"\n icon=\"filter-slash\"\n appearance=\"outlined\"\n size=\"sm\"\n [label]=\"t().uiClearFilters\"\n [attr.aria-label]=\"t().uiClearFilters\"\n (click)=\"onClearFilters()\"></button>\n }\n </rt-empty-state>\n } @else {\n <div rtElem=\"content\" qa-dataid=\"dynamic-list-content\">\n <ng-content />\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n rtElem=\"pagination\"\n qa-dataid=\"dynamic-list-pagination\"\n [pageModel]=\"pageModel()!\"\n [perPageOptions]=\"perPageOptions\"\n [loading]=\"fetching()\"\n (pageChange)=\"pageChange.emit($event)\"\n (perPageChange)=\"perPageChange.emit($event)\" />\n }\n }\n }\n</ng-container>\n",
374
374
  styles: ["@layer rt-kit.components{.rt-dynamic-list{--rt-dynamic-list-gap: var(--rt-space-4);--rt-dynamic-list-search-width: var(--rt-size-64);--rt-dynamic-list-veil-bg: var(--rt-color-bg-surface);position:relative;display:flex;flex-direction:column;block-size:100%;gap:var(--rt-dynamic-list-gap);inline-size:100%;min-block-size:0}.rt-dynamic-list__loader{display:flex;flex:1 1 auto;align-items:center;justify-content:center;padding:var(--rt-space-8)}.rt-dynamic-list__veil{position:absolute;z-index:1;display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-dynamic-list-veil-bg) 60%,transparent);inset:0}.rt-dynamic-list__toolbar{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__selectors{display:flex;flex:0 1 auto;align-items:center;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__counter{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-dynamic-list__right{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__actions{display:flex;flex:0 0 auto;align-items:center;gap:var(--rt-space-1)}.rt-dynamic-list__search{flex:1 1 auto;max-inline-size:var(--rt-dynamic-list-search-width);min-inline-size:0}.rt-dynamic-list__content{display:flex;overflow:auto;flex:1 1 auto;flex-direction:column;isolation:isolate;min-block-size:0}.rt-dynamic-list__empty{flex:1 1 auto}.rt-dynamic-list__pagination{flex:0 0 auto}@container rt-place (width <= 1080px){.rt-dynamic-list__right{flex-wrap:wrap}.rt-dynamic-list__search{max-inline-size:none}}@media(width<=1080px){:where(html:not(:has(.rt-container))) .rt-dynamic-list__right{flex-wrap:wrap}:where(html:not(:has(.rt-container))) .rt-dynamic-list__search{max-inline-size:none}}}\n"],
375
375
  dependencies: [
376
376
  {
@@ -446,8 +446,10 @@ var RtDynamicListComponent = class RtDynamicListComponent {
446
446
  "inputId",
447
447
  "ariaLabel",
448
448
  "disabled",
449
+ "checked",
449
450
  "indeterminate"
450
- ]
451
+ ],
452
+ outputs: ["checkedChange"]
451
453
  },
452
454
  {
453
455
  kind: "component",
@@ -497,8 +499,17 @@ var RtDynamicListComponent = class RtDynamicListComponent {
497
499
  "iconLeft",
498
500
  "iconRight",
499
501
  "passwordToggle",
500
- "autocomplete"
501
- ]
502
+ "autocomplete",
503
+ "maxlength",
504
+ "floatingLabel",
505
+ "iconLeftAction",
506
+ "iconRightAction",
507
+ "iconLeftDisabled",
508
+ "iconRightDisabled",
509
+ "iconLeftTooltip",
510
+ "iconRightTooltip"
511
+ ],
512
+ outputs: ["iconLeftClick", "iconRightClick"]
502
513
  },
503
514
  {
504
515
  kind: "component",
@@ -571,7 +582,7 @@ i0.ɵɵngDeclareClassMetadata({
571
582
  ElemDirective
572
583
  ],
573
584
  host: { class: BEM_BLOCK },
574
- template: "<ng-container rtBlock=\"rt-dynamic-list\">\n @if (loading()) {\n <div rtElem=\"loader\" qa-dataid=\"dynamic-list-loader\">\n <rt-spinner />\n </div>\n } @else {\n @if (fetching()) {\n <div rtElem=\"veil\" qa-dataid=\"dynamic-list-veil\">\n <rt-spinner />\n </div>\n }\n\n @if (isToolbarShown()) {\n <div rtElem=\"toolbar\" qa-dataid=\"dynamic-list-toolbar\">\n @if (selectable() || selectorsTpl()) {\n <div rtElem=\"selectors\" qa-dataid=\"dynamic-list-selectors\">\n @if (selectable()) {\n <rt-checkbox\n qa-dataid=\"dynamic-list-select-all\"\n [ariaLabel]=\"t().uiSelectAll\"\n [ngModel]=\"allSelected()\"\n [indeterminate]=\"!allSelected() && someSelected()\"\n [disabled]=\"selectAllDisabled()\"\n (ngModelChange)=\"onSelectAll($event)\" />\n\n @if (selectedCount()) {\n <span rtElem=\"counter\" qa-dataid=\"dynamic-list-selected-count\">\n {{ selectedLabel() }}\n </span>\n }\n }\n\n @if (selectorsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"right\" qa-dataid=\"dynamic-list-right\">\n <div rtElem=\"actions\">\n @if (actionsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n\n @if (showClearFilters()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-clear-filters\"\n icon=\"filter-slash\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClearFilters\"\n [tooltip]=\"t().uiClearFilters\"\n [disabled]=\"!filtered()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-refresh\"\n icon=\"refresh\"\n size=\"sm\"\n [ariaLabel]=\"t().uiRefresh\"\n [tooltip]=\"t().uiRefresh\"\n (clicked)=\"refreshed.emit()\" />\n }\n\n @if (showColumnSettings()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-column-settings\"\n icon=\"sliders-v\"\n size=\"sm\"\n [ariaLabel]=\"t().uiColumnSettings\"\n [tooltip]=\"t().uiColumnSettings\"\n (clicked)=\"columnSettingsOpened.emit()\" />\n }\n </div>\n\n @if (showSearch()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"dynamic-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"t().uiSearch\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </div>\n }\n\n @if (empty()) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"dynamic-list-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyTitleText()\"\n [description]=\"emptyDescription()\">\n @if (emptyReason() === 'filter') {\n <button\n rtButton\n qa-dataid=\"dynamic-list-empty-clear\"\n type=\"button\"\n icon=\"filter-slash\"\n appearance=\"outlined\"\n size=\"sm\"\n [label]=\"t().uiClearFilters\"\n [attr.aria-label]=\"t().uiClearFilters\"\n (click)=\"onClearFilters()\"></button>\n }\n </rt-empty-state>\n } @else {\n <div rtElem=\"content\" qa-dataid=\"dynamic-list-content\">\n <ng-content />\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n rtElem=\"pagination\"\n qa-dataid=\"dynamic-list-pagination\"\n [pageModel]=\"pageModel()!\"\n [perPageOptions]=\"perPageOptions\"\n [loading]=\"fetching()\"\n (pageChange)=\"pageChange.emit($event)\"\n (perPageChange)=\"perPageChange.emit($event)\" />\n }\n }\n }\n</ng-container>\n",
585
+ template: "<ng-container rtBlock=\"rt-dynamic-list\">\n @if (loading()) {\n <div rtElem=\"loader\" qa-dataid=\"dynamic-list-loader\">\n <rt-spinner />\n </div>\n } @else {\n @if (fetching()) {\n <div rtElem=\"veil\" qa-dataid=\"dynamic-list-veil\">\n <rt-spinner />\n </div>\n }\n\n @if (isToolbarShown()) {\n <div rtElem=\"toolbar\" qa-dataid=\"dynamic-list-toolbar\">\n @if (selectable() || selectorsTpl()) {\n <div rtElem=\"selectors\" qa-dataid=\"dynamic-list-selectors\">\n @if (selectable()) {\n <rt-checkbox\n qa-dataid=\"dynamic-list-select-all\"\n [ariaLabel]=\"t().uiSelectAll\"\n [ngModel]=\"allSelected()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [indeterminate]=\"!allSelected() && someSelected()\"\n [disabled]=\"selectAllDisabled()\"\n (ngModelChange)=\"onSelectAll($event)\" />\n\n @if (selectedCount()) {\n <span rtElem=\"counter\" qa-dataid=\"dynamic-list-selected-count\">\n {{ selectedLabel() }}\n </span>\n }\n }\n\n @if (selectorsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"right\" qa-dataid=\"dynamic-list-right\">\n <div rtElem=\"actions\">\n @if (actionsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n\n @if (showClearFilters()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-clear-filters\"\n icon=\"filter-slash\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClearFilters\"\n [tooltip]=\"t().uiClearFilters\"\n [disabled]=\"!filtered()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-refresh\"\n icon=\"refresh\"\n size=\"sm\"\n [ariaLabel]=\"t().uiRefresh\"\n [tooltip]=\"t().uiRefresh\"\n (clicked)=\"refreshed.emit()\" />\n }\n\n @if (showColumnSettings()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-column-settings\"\n icon=\"sliders-v\"\n size=\"sm\"\n [ariaLabel]=\"t().uiColumnSettings\"\n [tooltip]=\"t().uiColumnSettings\"\n (clicked)=\"columnSettingsOpened.emit()\" />\n }\n </div>\n\n @if (showSearch()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"dynamic-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"t().uiSearch\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </div>\n }\n\n @if (empty()) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"dynamic-list-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyTitleText()\"\n [description]=\"emptyDescription()\">\n @if (emptyReason() === 'filter') {\n <button\n rtButton\n qa-dataid=\"dynamic-list-empty-clear\"\n type=\"button\"\n icon=\"filter-slash\"\n appearance=\"outlined\"\n size=\"sm\"\n [label]=\"t().uiClearFilters\"\n [attr.aria-label]=\"t().uiClearFilters\"\n (click)=\"onClearFilters()\"></button>\n }\n </rt-empty-state>\n } @else {\n <div rtElem=\"content\" qa-dataid=\"dynamic-list-content\">\n <ng-content />\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n rtElem=\"pagination\"\n qa-dataid=\"dynamic-list-pagination\"\n [pageModel]=\"pageModel()!\"\n [perPageOptions]=\"perPageOptions\"\n [loading]=\"fetching()\"\n (pageChange)=\"pageChange.emit($event)\"\n (perPageChange)=\"perPageChange.emit($event)\" />\n }\n }\n }\n</ng-container>\n",
575
586
  styles: ["@layer rt-kit.components{.rt-dynamic-list{--rt-dynamic-list-gap: var(--rt-space-4);--rt-dynamic-list-search-width: var(--rt-size-64);--rt-dynamic-list-veil-bg: var(--rt-color-bg-surface);position:relative;display:flex;flex-direction:column;block-size:100%;gap:var(--rt-dynamic-list-gap);inline-size:100%;min-block-size:0}.rt-dynamic-list__loader{display:flex;flex:1 1 auto;align-items:center;justify-content:center;padding:var(--rt-space-8)}.rt-dynamic-list__veil{position:absolute;z-index:1;display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-dynamic-list-veil-bg) 60%,transparent);inset:0}.rt-dynamic-list__toolbar{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__selectors{display:flex;flex:0 1 auto;align-items:center;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__counter{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-dynamic-list__right{display:flex;flex:1 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--rt-space-2);min-inline-size:0}.rt-dynamic-list__actions{display:flex;flex:0 0 auto;align-items:center;gap:var(--rt-space-1)}.rt-dynamic-list__search{flex:1 1 auto;max-inline-size:var(--rt-dynamic-list-search-width);min-inline-size:0}.rt-dynamic-list__content{display:flex;overflow:auto;flex:1 1 auto;flex-direction:column;isolation:isolate;min-block-size:0}.rt-dynamic-list__empty{flex:1 1 auto}.rt-dynamic-list__pagination{flex:0 0 auto}@container rt-place (width <= 1080px){.rt-dynamic-list__right{flex-wrap:wrap}.rt-dynamic-list__search{max-inline-size:none}}@media(width<=1080px){:where(html:not(:has(.rt-container))) .rt-dynamic-list__right{flex-wrap:wrap}:where(html:not(:has(.rt-container))) .rt-dynamic-list__search{max-inline-size:none}}}\n"]
576
587
  }]
577
588
  }],
@@ -1 +1 @@
1
- {"version":3,"file":"rt-tools-ui-kit-v2-dynamic-list.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/dynamic-list/rt-dynamic-list.directives.ts","../../../projects/ui-kit-v2/src/lib/components/dynamic-list/rt-dynamic-list.component.ts","../../../projects/ui-kit-v2/src/lib/components/dynamic-list/rt-dynamic-list.component.html"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Маркеры частей панели инструментов — своим файлом, как у соседних семей.\n *\n * В имени класса стоит слово «Toolbar», хотя в разметке его нет: имя `RtDynamicListSelectorsDirective`\n * в дереве уже занято первым китом, и там оно означает другое — проводку состояния списка, а не\n * маркер стороны полосы. Два одинаковых имени в двух китах проверка дерева не пропускает.\n *\n * Каждый маркер держит свой шаблон и о списке не знает ничего: список читает маркеры среди своего\n * содержимого и берёт у них шаблон. Часть, которую потребитель не объявил, для списка просто\n * отсутствует.\n */\n\n/**\n * Левая сторона панели: то, чем человек отбирает записи.\n *\n * @example\n * ```html\n * <rt-dynamic-list>\n * <ng-container *rtDynamicListSelectors>\n * <rt-select [options]=\"stages()\" />\n * </ng-container>\n * </rt-dynamic-list>\n * ```\n */\n@Directive({\n selector: '[rtDynamicListSelectors]',\n})\nexport class RtDynamicListToolbarSelectorsDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Правая сторона панели: действия над разделом. Поле поиска стоит после них и остаётся за семьёй. */\n@Directive({\n selector: '[rtDynamicListActions]',\n})\nexport class RtDynamicListToolbarActionsDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n OnInit,\n output,\n OutputEmitterRef,\n Signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { filter, map } from 'rxjs';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\nimport { IPageModel, TNullable } from '@rt-tools/utils';\n\nimport { RT_KIT_LABELS, rtKitLabel, TRtKitLabelMap, TRtKitLabelParams } from '@rt-tools/ui-kit-v2/core';\nimport { searchDebounce } from '@rt-tools/ui-kit-v2/core';\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtCheckboxComponent } from '@rt-tools/ui-kit-v2/checkbox';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtEmptyStateComponent } from '@rt-tools/ui-kit-v2/empty-state';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtInputComponent } from '@rt-tools/ui-kit-v2/input';\nimport { RtPaginationComponent } from '@rt-tools/ui-kit-v2/pagination';\nimport { RtSpinnerComponent } from '@rt-tools/ui-kit-v2/spinner';\nimport { RtDynamicListToolbarActionsDirective, RtDynamicListToolbarSelectorsDirective } from './rt-dynamic-list.directives';\nimport { IRtDynamicList } from './rt-dynamic-list.model';\n\nconst BEM_BLOCK: string = 'rt-dynamic-list';\n\n/**\n * Размеры страницы, которые предлагает полоса страниц. Семья передаёт их полосе сама: по наименьшему\n * из них она решает, рисовать ли полосу, и то же решение принимает полоса у себя.\n */\nconst PER_PAGE_OPTIONS: ReadonlyArray<number> = [20, 50, 100];\n\n/**\n * Список записей со своей панелью инструментов.\n *\n * Полосу панели семья раскладывает сама, а не зовёт `rt-toolbar`: у того стороны объявлены\n * нешринкующимися, и на хозяине уже́ содержимого полоса раздаётся шире него и уезжает за край.\n * Семья кладёт в полосу готовые части кита — поле, кнопки, флажок, — а строит её сама.\n *\n * Семья ничего не рисует сама: поиск — поле кита, действия — его кнопки со значком, пустое место —\n * его пустое состояние, страницы — его нумерация. Сами записи проецируются: таблица между панелью\n * и страницами — потребителя, с его колонками, ячейками и действиями строки.\n *\n * Договорённость — `docs/specs/ui-kit-v2/dynamic-list/`.\n */\n@Component({\n selector: 'rt-dynamic-list',\n templateUrl: './rt-dynamic-list.component.html',\n styleUrls: ['./rt-dynamic-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n FormsModule,\n ReactiveFormsModule,\n\n // standalone components / directives\n RtButtonDirective,\n RtCheckboxComponent,\n RtEmptyStateComponent,\n RtIconButtonComponent,\n RtInputComponent,\n RtPaginationComponent,\n RtSpinnerComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtDynamicListComponent implements OnInit {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /**\n * Последнее, что знают и потребитель, и поле: отправленное потребителю или поставленное им самим.\n * Одно и то же дважды не спрашивается, а поставленное потребителем не возвращается ему эхом.\n */\n #lastSearch: string = '';\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly searchControl: FormControl<string> = new FormControl<string>('', { nonNullable: true });\n\n protected readonly perPageOptions: ReadonlyArray<number> = PER_PAGE_OPTIONS;\n\n protected readonly selectorsTpl: Signal<TNullable<RtDynamicListToolbarSelectorsDirective>> = contentChild(\n RtDynamicListToolbarSelectorsDirective\n );\n\n protected readonly actionsTpl: Signal<TNullable<RtDynamicListToolbarActionsDirective>> = contentChild(\n RtDynamicListToolbarActionsDirective\n );\n\n /** «Выбрано: N» — подпись с подстановкой, потому её берут не из карты, а вызовом. */\n protected readonly selectedLabel: Signal<string> = rtKitLabel(\n 'uiSelectedCount',\n computed((): TRtKitLabelParams => ({ count: this.selectedCount() }))\n );\n\n /** Отчего пусто. Отбор стоит — значит, записи убрал он, и человеку показывают дорогу назад. */\n protected readonly emptyReason: Signal<IRtDynamicList.EmptyReason> = computed((): IRtDynamicList.EmptyReason =>\n this.filtered() ? 'filter' : 'section'\n );\n\n /** Значок пустого места: под отбором — лупа, у пустого раздела — лоток. */\n protected readonly emptyIcon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name =>\n this.emptyReason() === 'filter' ? 'search' : 'inbox'\n );\n\n /** Подпись пустого места. Своя подпись потребителя сильнее обеих подписей кита. */\n protected readonly emptyTitleText: Signal<string> = computed((): string => {\n if (this.emptyTitle()) {\n return this.emptyTitle();\n }\n\n return this.emptyReason() === 'filter' ? this.t().uiNothingFound : this.t().uiNoRows;\n });\n\n /**\n * Полоса страниц рисуется, пока записей больше наименьшего размера страницы — то же правило, что у\n * самой полосы. Число страниц при нынешнем размере тут не решает: выбравший крупный размер, при\n * котором всё легло на одну страницу, иначе терял вместе с полосой и дорогу к размеру поменьше.\n */\n protected readonly isPaginationShown: Signal<boolean> = computed((): boolean => {\n const page: TNullable<IPageModel> = this.pageModel();\n\n if (!page || this.empty()) {\n return false;\n }\n\n return page.totalCount > Math.min(...PER_PAGE_OPTIONS);\n });\n\n /**\n * Есть ли в панели хоть что-нибудь. Полоса без единой части — это отступ над записями, и\n * место она забирает у них.\n */\n protected readonly isToolbarShown: Signal<boolean> = computed((): boolean =>\n [\n this.showSearch(),\n this.showRefresh(),\n this.showClearFilters(),\n this.showColumnSettings(),\n this.selectable(),\n !!this.selectorsTpl(),\n !!this.actionsTpl(),\n ].some((part: boolean): boolean => part)\n );\n\n /** Записи проецируются, и о числе страниц семья узнаёт только из модели страницы. */\n public readonly pageModel: InputSignal<TNullable<IPageModel>> = input<TNullable<IPageModel>>(null);\n\n /** Первая загрузка: вместо всего содержимого стоит вертушка. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Подгрузка поверх нарисованного: записи остаются на месте, вертушка стоит над ними. */\n public readonly fetching: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Записей нет вовсе. От пустого ответа под отбором отличается входом `filtered`. */\n public readonly empty: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Отбор стоит. Вместе с `empty` даёт вторую причину пустоты — ту, у которой есть дорога назад. */\n public readonly filtered: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Кнопка сброса отбора: показана у раздела с отбором, выключена, пока сбрасывать нечего. */\n public readonly showClearFilters: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly showRefresh: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly showColumnSettings: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly showSearch: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Выбор записей: флажок «выбрать все» и счётчик выбранного на левой стороне панели. */\n public readonly selectable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly allSelected: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly someSelected: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly selectAllDisabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly selectedCount: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(0, {\n transform: numberAttribute,\n });\n\n public readonly emptyTitle: InputSignal<string> = input<string>('');\n\n public readonly emptyDescription: InputSignal<string | null> = input<string | null>(null);\n\n /** Поиск потребителя: поле следует за ним при каждой смене и потребителю его не возвращает. */\n public readonly searchTerm: InputSignal<TNullable<string>> = input<TNullable<string>>('');\n\n public readonly searchChange: OutputEmitterRef<string> = output<string>();\n\n public readonly refreshed: OutputEmitterRef<void> = output<void>();\n\n public readonly filtersCleared: OutputEmitterRef<void> = output<void>();\n\n public readonly columnSettingsOpened: OutputEmitterRef<void> = output<void>();\n\n public readonly pageChange: OutputEmitterRef<number> = output<number>();\n\n public readonly perPageChange: OutputEmitterRef<number> = output<number>();\n\n public readonly allSelectedChange: OutputEmitterRef<boolean> = output<boolean>();\n\n constructor() {\n // Поиск потребителя ставится в поле, только когда он отличается от последнего, что список\n // отправил или поставил сам. Эхо отправленного — даже запоздалое, когда человек уже дописал\n // дальше, — поле не трогает: иначе оно стирало бы набранное и сбивало каретку.\n effect((): void => {\n const term: string = this.searchTerm() ?? '';\n\n untracked((): void => {\n if (term.trim() === this.#lastSearch) {\n return;\n }\n\n this.#lastSearch = term.trim();\n this.searchControl.setValue(term, { emitEvent: false });\n });\n });\n }\n\n public ngOnInit(): void {\n // Дебаунс непустого ввода; очистка крестиком применяется сразу — так же, как в списке\n // переписок: оператор один на кит, и два разных ожидания разошлись бы молча.\n this.searchControl.valueChanges\n .pipe(\n map((value: string): string => value.trim()),\n searchDebounce(),\n // Набранное, которое потребитель или сброс отбора успели заменить, уже не в поле.\n filter((value: string): boolean => value === this.searchControl.value.trim()),\n filter((value: string): boolean => value !== this.#lastSearch),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((value: string): void => {\n this.#lastSearch = value;\n this.searchChange.emit(value);\n });\n }\n\n protected onSelectAll(checked: boolean): void {\n this.allSelectedChange.emit(checked);\n }\n\n /**\n * Сброс отбора снимает и поиск: пустой ответ под поиском — тоже ответ под отбором, и дорога назад\n * без очистки поля вела бы к тому же пустому ответу. Поле очищается молча: `filtersCleared`\n * уже значит «и поиск снят», и отдельный пустой `searchChange` заставил бы потребителя\n * запрашивать список дважды.\n */\n protected onClearFilters(): void {\n this.#lastSearch = '';\n this.searchControl.setValue('', { emitEvent: false });\n this.filtersCleared.emit();\n }\n}\n","<ng-container rtBlock=\"rt-dynamic-list\">\n @if (loading()) {\n <div rtElem=\"loader\" qa-dataid=\"dynamic-list-loader\">\n <rt-spinner />\n </div>\n } @else {\n @if (fetching()) {\n <div rtElem=\"veil\" qa-dataid=\"dynamic-list-veil\">\n <rt-spinner />\n </div>\n }\n\n @if (isToolbarShown()) {\n <div rtElem=\"toolbar\" qa-dataid=\"dynamic-list-toolbar\">\n @if (selectable() || selectorsTpl()) {\n <div rtElem=\"selectors\" qa-dataid=\"dynamic-list-selectors\">\n @if (selectable()) {\n <rt-checkbox\n qa-dataid=\"dynamic-list-select-all\"\n [ariaLabel]=\"t().uiSelectAll\"\n [ngModel]=\"allSelected()\"\n [indeterminate]=\"!allSelected() && someSelected()\"\n [disabled]=\"selectAllDisabled()\"\n (ngModelChange)=\"onSelectAll($event)\" />\n\n @if (selectedCount()) {\n <span rtElem=\"counter\" qa-dataid=\"dynamic-list-selected-count\">\n {{ selectedLabel() }}\n </span>\n }\n }\n\n @if (selectorsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"right\" qa-dataid=\"dynamic-list-right\">\n <div rtElem=\"actions\">\n @if (actionsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n\n @if (showClearFilters()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-clear-filters\"\n icon=\"filter-slash\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClearFilters\"\n [tooltip]=\"t().uiClearFilters\"\n [disabled]=\"!filtered()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-refresh\"\n icon=\"refresh\"\n size=\"sm\"\n [ariaLabel]=\"t().uiRefresh\"\n [tooltip]=\"t().uiRefresh\"\n (clicked)=\"refreshed.emit()\" />\n }\n\n @if (showColumnSettings()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-column-settings\"\n icon=\"sliders-v\"\n size=\"sm\"\n [ariaLabel]=\"t().uiColumnSettings\"\n [tooltip]=\"t().uiColumnSettings\"\n (clicked)=\"columnSettingsOpened.emit()\" />\n }\n </div>\n\n @if (showSearch()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"dynamic-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"t().uiSearch\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </div>\n }\n\n @if (empty()) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"dynamic-list-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyTitleText()\"\n [description]=\"emptyDescription()\">\n @if (emptyReason() === 'filter') {\n <button\n rtButton\n qa-dataid=\"dynamic-list-empty-clear\"\n type=\"button\"\n icon=\"filter-slash\"\n appearance=\"outlined\"\n size=\"sm\"\n [label]=\"t().uiClearFilters\"\n [attr.aria-label]=\"t().uiClearFilters\"\n (click)=\"onClearFilters()\"></button>\n }\n </rt-empty-state>\n } @else {\n <div rtElem=\"content\" qa-dataid=\"dynamic-list-content\">\n <ng-content />\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n rtElem=\"pagination\"\n qa-dataid=\"dynamic-list-pagination\"\n [pageModel]=\"pageModel()!\"\n [perPageOptions]=\"perPageOptions\"\n [loading]=\"fetching()\"\n (pageChange)=\"pageChange.emit($event)\"\n (perPageChange)=\"perPageChange.emit($event)\" />\n }\n }\n }\n</ng-container>\n"],"mappings":"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"}
1
+ {"version":3,"file":"rt-tools-ui-kit-v2-dynamic-list.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/dynamic-list/rt-dynamic-list.directives.ts","../../../projects/ui-kit-v2/src/lib/components/dynamic-list/rt-dynamic-list.component.ts","../../../projects/ui-kit-v2/src/lib/components/dynamic-list/rt-dynamic-list.component.html"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Маркеры частей панели инструментов — своим файлом, как у соседних семей.\n *\n * В имени класса стоит слово «Toolbar», хотя в разметке его нет: имя `RtDynamicListSelectorsDirective`\n * в дереве уже занято первым китом, и там оно означает другое — проводку состояния списка, а не\n * маркер стороны полосы. Два одинаковых имени в двух китах проверка дерева не пропускает.\n *\n * Каждый маркер держит свой шаблон и о списке не знает ничего: список читает маркеры среди своего\n * содержимого и берёт у них шаблон. Часть, которую потребитель не объявил, для списка просто\n * отсутствует.\n */\n\n/**\n * Левая сторона панели: то, чем человек отбирает записи.\n *\n * @example\n * ```html\n * <rt-dynamic-list>\n * <ng-container *rtDynamicListSelectors>\n * <rt-select [options]=\"stages()\" />\n * </ng-container>\n * </rt-dynamic-list>\n * ```\n */\n@Directive({\n selector: '[rtDynamicListSelectors]',\n})\nexport class RtDynamicListToolbarSelectorsDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n\n/** Правая сторона панели: действия над разделом. Поле поиска стоит после них и остаётся за семьёй. */\n@Directive({\n selector: '[rtDynamicListActions]',\n})\nexport class RtDynamicListToolbarActionsDirective {\n public readonly templateRef: TemplateRef<void> = inject<TemplateRef<void>>(TemplateRef);\n}\n","import { BooleanInput, NumberInput } from '@angular/cdk/coercion';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n numberAttribute,\n OnInit,\n output,\n OutputEmitterRef,\n Signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { filter, map } from 'rxjs';\n\nimport { BlockDirective, ElemDirective } from '@rt-tools/core';\nimport { IPageModel, TNullable } from '@rt-tools/utils';\n\nimport { RT_KIT_LABELS, rtKitLabel, TRtKitLabelMap, TRtKitLabelParams } from '@rt-tools/ui-kit-v2/core';\nimport { searchDebounce } from '@rt-tools/ui-kit-v2/core';\nimport { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';\nimport { RtCheckboxComponent } from '@rt-tools/ui-kit-v2/checkbox';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtEmptyStateComponent } from '@rt-tools/ui-kit-v2/empty-state';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtInputComponent } from '@rt-tools/ui-kit-v2/input';\nimport { RtPaginationComponent } from '@rt-tools/ui-kit-v2/pagination';\nimport { RtSpinnerComponent } from '@rt-tools/ui-kit-v2/spinner';\nimport { RtDynamicListToolbarActionsDirective, RtDynamicListToolbarSelectorsDirective } from './rt-dynamic-list.directives';\nimport { IRtDynamicList } from './rt-dynamic-list.model';\n\nconst BEM_BLOCK: string = 'rt-dynamic-list';\n\n/**\n * Размеры страницы, которые предлагает полоса страниц. Семья передаёт их полосе сама: по наименьшему\n * из них она решает, рисовать ли полосу, и то же решение принимает полоса у себя.\n */\nconst PER_PAGE_OPTIONS: ReadonlyArray<number> = [20, 50, 100];\n\n/**\n * Список записей со своей панелью инструментов.\n *\n * Полосу панели семья раскладывает сама, а не зовёт `rt-toolbar`: у того стороны объявлены\n * нешринкующимися, и на хозяине уже́ содержимого полоса раздаётся шире него и уезжает за край.\n * Семья кладёт в полосу готовые части кита — поле, кнопки, флажок, — а строит её сама.\n *\n * Семья ничего не рисует сама: поиск — поле кита, действия — его кнопки со значком, пустое место —\n * его пустое состояние, страницы — его нумерация. Сами записи проецируются: таблица между панелью\n * и страницами — потребителя, с его колонками, ячейками и действиями строки.\n *\n * Договорённость — `docs/specs/ui-kit-v2/dynamic-list/`.\n */\n@Component({\n selector: 'rt-dynamic-list',\n templateUrl: './rt-dynamic-list.component.html',\n styleUrls: ['./rt-dynamic-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n NgTemplateOutlet,\n FormsModule,\n ReactiveFormsModule,\n\n // standalone components / directives\n RtButtonDirective,\n RtCheckboxComponent,\n RtEmptyStateComponent,\n RtIconButtonComponent,\n RtInputComponent,\n RtPaginationComponent,\n RtSpinnerComponent,\n BlockDirective,\n ElemDirective,\n ],\n host: { class: BEM_BLOCK },\n})\nexport class RtDynamicListComponent implements OnInit {\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n /**\n * Последнее, что знают и потребитель, и поле: отправленное потребителю или поставленное им самим.\n * Одно и то же дважды не спрашивается, а поставленное потребителем не возвращается ему эхом.\n */\n #lastSearch: string = '';\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly searchControl: FormControl<string> = new FormControl<string>('', { nonNullable: true });\n\n protected readonly perPageOptions: ReadonlyArray<number> = PER_PAGE_OPTIONS;\n\n protected readonly selectorsTpl: Signal<TNullable<RtDynamicListToolbarSelectorsDirective>> = contentChild(\n RtDynamicListToolbarSelectorsDirective\n );\n\n protected readonly actionsTpl: Signal<TNullable<RtDynamicListToolbarActionsDirective>> = contentChild(\n RtDynamicListToolbarActionsDirective\n );\n\n /** «Выбрано: N» — подпись с подстановкой, потому её берут не из карты, а вызовом. */\n protected readonly selectedLabel: Signal<string> = rtKitLabel(\n 'uiSelectedCount',\n computed((): TRtKitLabelParams => ({ count: this.selectedCount() }))\n );\n\n /** Отчего пусто. Отбор стоит — значит, записи убрал он, и человеку показывают дорогу назад. */\n protected readonly emptyReason: Signal<IRtDynamicList.EmptyReason> = computed((): IRtDynamicList.EmptyReason =>\n this.filtered() ? 'filter' : 'section'\n );\n\n /** Значок пустого места: под отбором — лупа, у пустого раздела — лоток. */\n protected readonly emptyIcon: Signal<IRtIcon.Name> = computed((): IRtIcon.Name =>\n this.emptyReason() === 'filter' ? 'search' : 'inbox'\n );\n\n /** Подпись пустого места. Своя подпись потребителя сильнее обеих подписей кита. */\n protected readonly emptyTitleText: Signal<string> = computed((): string => {\n if (this.emptyTitle()) {\n return this.emptyTitle();\n }\n\n return this.emptyReason() === 'filter' ? this.t().uiNothingFound : this.t().uiNoRows;\n });\n\n /**\n * Полоса страниц рисуется, пока записей больше наименьшего размера страницы — то же правило, что у\n * самой полосы. Число страниц при нынешнем размере тут не решает: выбравший крупный размер, при\n * котором всё легло на одну страницу, иначе терял вместе с полосой и дорогу к размеру поменьше.\n */\n protected readonly isPaginationShown: Signal<boolean> = computed((): boolean => {\n const page: TNullable<IPageModel> = this.pageModel();\n\n if (!page || this.empty()) {\n return false;\n }\n\n return page.totalCount > Math.min(...PER_PAGE_OPTIONS);\n });\n\n /**\n * Есть ли в панели хоть что-нибудь. Полоса без единой части — это отступ над записями, и\n * место она забирает у них.\n */\n protected readonly isToolbarShown: Signal<boolean> = computed((): boolean =>\n [\n this.showSearch(),\n this.showRefresh(),\n this.showClearFilters(),\n this.showColumnSettings(),\n this.selectable(),\n !!this.selectorsTpl(),\n !!this.actionsTpl(),\n ].some((part: boolean): boolean => part)\n );\n\n /** Записи проецируются, и о числе страниц семья узнаёт только из модели страницы. */\n public readonly pageModel: InputSignal<TNullable<IPageModel>> = input<TNullable<IPageModel>>(null);\n\n /** Первая загрузка: вместо всего содержимого стоит вертушка. */\n public readonly loading: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Подгрузка поверх нарисованного: записи остаются на месте, вертушка стоит над ними. */\n public readonly fetching: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Записей нет вовсе. От пустого ответа под отбором отличается входом `filtered`. */\n public readonly empty: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Отбор стоит. Вместе с `empty` даёт вторую причину пустоты — ту, у которой есть дорога назад. */\n public readonly filtered: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Кнопка сброса отбора: показана у раздела с отбором, выключена, пока сбрасывать нечего. */\n public readonly showClearFilters: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly showRefresh: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly showColumnSettings: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly showSearch: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Выбор записей: флажок «выбрать все» и счётчик выбранного на левой стороне панели. */\n public readonly selectable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly allSelected: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly someSelected: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly selectAllDisabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n public readonly selectedCount: InputSignalWithTransform<number, NumberInput> = input<number, NumberInput>(0, {\n transform: numberAttribute,\n });\n\n public readonly emptyTitle: InputSignal<string> = input<string>('');\n\n public readonly emptyDescription: InputSignal<string | null> = input<string | null>(null);\n\n /** Поиск потребителя: поле следует за ним при каждой смене и потребителю его не возвращает. */\n public readonly searchTerm: InputSignal<TNullable<string>> = input<TNullable<string>>('');\n\n public readonly searchChange: OutputEmitterRef<string> = output<string>();\n\n public readonly refreshed: OutputEmitterRef<void> = output<void>();\n\n public readonly filtersCleared: OutputEmitterRef<void> = output<void>();\n\n public readonly columnSettingsOpened: OutputEmitterRef<void> = output<void>();\n\n public readonly pageChange: OutputEmitterRef<number> = output<number>();\n\n public readonly perPageChange: OutputEmitterRef<number> = output<number>();\n\n public readonly allSelectedChange: OutputEmitterRef<boolean> = output<boolean>();\n\n constructor() {\n // Поиск потребителя ставится в поле, только когда он отличается от последнего, что список\n // отправил или поставил сам. Эхо отправленного — даже запоздалое, когда человек уже дописал\n // дальше, — поле не трогает: иначе оно стирало бы набранное и сбивало каретку.\n effect((): void => {\n const term: string = this.searchTerm() ?? '';\n\n untracked((): void => {\n if (term.trim() === this.#lastSearch) {\n return;\n }\n\n this.#lastSearch = term.trim();\n this.searchControl.setValue(term, { emitEvent: false });\n });\n });\n }\n\n public ngOnInit(): void {\n // Дебаунс непустого ввода; очистка крестиком применяется сразу — так же, как в списке\n // переписок: оператор один на кит, и два разных ожидания разошлись бы молча.\n this.searchControl.valueChanges\n .pipe(\n map((value: string): string => value.trim()),\n searchDebounce(),\n // Набранное, которое потребитель или сброс отбора успели заменить, уже не в поле.\n filter((value: string): boolean => value === this.searchControl.value.trim()),\n filter((value: string): boolean => value !== this.#lastSearch),\n takeUntilDestroyed(this.#destroyRef)\n )\n .subscribe((value: string): void => {\n this.#lastSearch = value;\n this.searchChange.emit(value);\n });\n }\n\n protected onSelectAll(checked: boolean): void {\n this.allSelectedChange.emit(checked);\n }\n\n /**\n * Сброс отбора снимает и поиск: пустой ответ под поиском — тоже ответ под отбором, и дорога назад\n * без очистки поля вела бы к тому же пустому ответу. Поле очищается молча: `filtersCleared`\n * уже значит «и поиск снят», и отдельный пустой `searchChange` заставил бы потребителя\n * запрашивать список дважды.\n */\n protected onClearFilters(): void {\n this.#lastSearch = '';\n this.searchControl.setValue('', { emitEvent: false });\n this.filtersCleared.emit();\n }\n}\n","<ng-container rtBlock=\"rt-dynamic-list\">\n @if (loading()) {\n <div rtElem=\"loader\" qa-dataid=\"dynamic-list-loader\">\n <rt-spinner />\n </div>\n } @else {\n @if (fetching()) {\n <div rtElem=\"veil\" qa-dataid=\"dynamic-list-veil\">\n <rt-spinner />\n </div>\n }\n\n @if (isToolbarShown()) {\n <div rtElem=\"toolbar\" qa-dataid=\"dynamic-list-toolbar\">\n @if (selectable() || selectorsTpl()) {\n <div rtElem=\"selectors\" qa-dataid=\"dynamic-list-selectors\">\n @if (selectable()) {\n <rt-checkbox\n qa-dataid=\"dynamic-list-select-all\"\n [ariaLabel]=\"t().uiSelectAll\"\n [ngModel]=\"allSelected()\"\n [ngModelOptions]=\"{ standalone: true }\"\n [indeterminate]=\"!allSelected() && someSelected()\"\n [disabled]=\"selectAllDisabled()\"\n (ngModelChange)=\"onSelectAll($event)\" />\n\n @if (selectedCount()) {\n <span rtElem=\"counter\" qa-dataid=\"dynamic-list-selected-count\">\n {{ selectedLabel() }}\n </span>\n }\n }\n\n @if (selectorsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n </div>\n }\n\n <div rtElem=\"right\" qa-dataid=\"dynamic-list-right\">\n <div rtElem=\"actions\">\n @if (actionsTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" />\n }\n\n @if (showClearFilters()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-clear-filters\"\n icon=\"filter-slash\"\n size=\"sm\"\n [ariaLabel]=\"t().uiClearFilters\"\n [tooltip]=\"t().uiClearFilters\"\n [disabled]=\"!filtered()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (showRefresh()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-refresh\"\n icon=\"refresh\"\n size=\"sm\"\n [ariaLabel]=\"t().uiRefresh\"\n [tooltip]=\"t().uiRefresh\"\n (clicked)=\"refreshed.emit()\" />\n }\n\n @if (showColumnSettings()) {\n <rt-icon-button\n qa-dataid=\"dynamic-list-column-settings\"\n icon=\"sliders-v\"\n size=\"sm\"\n [ariaLabel]=\"t().uiColumnSettings\"\n [tooltip]=\"t().uiColumnSettings\"\n (clicked)=\"columnSettingsOpened.emit()\" />\n }\n </div>\n\n @if (showSearch()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"dynamic-list-search\"\n iconLeft=\"search\"\n [placeholder]=\"t().uiSearch\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </div>\n }\n\n @if (empty()) {\n <rt-empty-state\n rtElem=\"empty\"\n qa-dataid=\"dynamic-list-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyTitleText()\"\n [description]=\"emptyDescription()\">\n @if (emptyReason() === 'filter') {\n <button\n rtButton\n qa-dataid=\"dynamic-list-empty-clear\"\n type=\"button\"\n icon=\"filter-slash\"\n appearance=\"outlined\"\n size=\"sm\"\n [label]=\"t().uiClearFilters\"\n [attr.aria-label]=\"t().uiClearFilters\"\n (click)=\"onClearFilters()\"></button>\n }\n </rt-empty-state>\n } @else {\n <div rtElem=\"content\" qa-dataid=\"dynamic-list-content\">\n <ng-content />\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n rtElem=\"pagination\"\n qa-dataid=\"dynamic-list-pagination\"\n [pageModel]=\"pageModel()!\"\n [perPageOptions]=\"perPageOptions\"\n [loading]=\"fetching()\"\n (pageChange)=\"pageChange.emit($event)\"\n (perPageChange)=\"perPageChange.emit($event)\" />\n }\n }\n }\n</ng-container>\n"],"mappings":"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"}