@rt-tools/ui-kit-v2 0.17.0 → 0.18.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 (276) hide show
  1. package/README.md +18 -0
  2. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +79 -0
  3. package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -0
  4. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +227 -0
  5. package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -0
  6. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +47 -0
  7. package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -0
  8. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +702 -0
  9. package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -0
  10. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +214 -0
  11. package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -0
  12. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +53 -0
  13. package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -0
  14. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +88 -0
  15. package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -0
  16. package/fesm2022/rt-tools-ui-kit-v2-button.mjs +365 -0
  17. package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -0
  18. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +152 -0
  19. package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -0
  20. package/fesm2022/rt-tools-ui-kit-v2-card.mjs +72 -0
  21. package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -0
  22. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +111 -0
  23. package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -0
  24. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +76 -0
  25. package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -0
  26. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +255 -0
  27. package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -0
  28. package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1326 -0
  29. package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -0
  30. package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2590 -0
  31. package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -0
  32. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +45 -0
  33. package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -0
  34. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +158 -0
  35. package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -0
  36. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +894 -0
  37. package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -0
  38. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +1217 -0
  39. package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -0
  40. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +779 -0
  41. package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -0
  42. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +573 -0
  43. package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -0
  44. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +141 -0
  45. package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -0
  46. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +68 -0
  47. package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -0
  48. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +478 -0
  49. package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -0
  50. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +183 -0
  51. package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -0
  52. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +44 -0
  53. package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -0
  54. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +260 -0
  55. package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -0
  56. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +937 -0
  57. package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -0
  58. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +56 -0
  59. package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -0
  60. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +107 -0
  61. package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -0
  62. package/fesm2022/rt-tools-ui-kit-v2-field.mjs +183 -0
  63. package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -0
  64. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +219 -0
  65. package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -0
  66. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +214 -0
  67. package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -0
  68. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +117 -0
  69. package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -0
  70. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +32 -0
  71. package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -0
  72. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +91 -0
  73. package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -0
  74. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +220 -0
  75. package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -0
  76. package/fesm2022/rt-tools-ui-kit-v2-header.mjs +72 -0
  77. package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -0
  78. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +163 -0
  79. package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -0
  80. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +674 -0
  81. package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -0
  82. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +540 -0
  83. package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -0
  84. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +227 -0
  85. package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -0
  86. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +37 -0
  87. package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -0
  88. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +361 -0
  89. package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -0
  90. package/fesm2022/rt-tools-ui-kit-v2-input.mjs +143 -0
  91. package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -0
  92. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +49 -0
  93. package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -0
  94. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +97 -0
  95. package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -0
  96. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +57 -0
  97. package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -0
  98. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +537 -0
  99. package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -0
  100. package/fesm2022/rt-tools-ui-kit-v2-message.mjs +105 -0
  101. package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -0
  102. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +71 -0
  103. package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -0
  104. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +315 -0
  105. package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -0
  106. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +51 -0
  107. package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -0
  108. package/fesm2022/rt-tools-ui-kit-v2-note.mjs +44 -0
  109. package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -0
  110. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +54 -0
  111. package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -0
  112. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +339 -0
  113. package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -0
  114. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +187 -0
  115. package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -0
  116. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +170 -0
  117. package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -0
  118. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +312 -0
  119. package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -0
  120. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +174 -0
  121. package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -0
  122. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +56 -0
  123. package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -0
  124. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +118 -0
  125. package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -0
  126. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +290 -0
  127. package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -0
  128. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +37 -0
  129. package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -0
  130. package/fesm2022/rt-tools-ui-kit-v2-select.mjs +495 -0
  131. package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -0
  132. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +1493 -0
  133. package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -0
  134. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +49 -0
  135. package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -0
  136. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +123 -0
  137. package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -0
  138. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +70 -0
  139. package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -0
  140. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +92 -0
  141. package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -0
  142. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +147 -0
  143. package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -0
  144. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +117 -0
  145. package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -0
  146. package/fesm2022/rt-tools-ui-kit-v2-table.mjs +1636 -0
  147. package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -0
  148. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +350 -0
  149. package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -0
  150. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +122 -0
  151. package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -0
  152. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +85 -0
  153. package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -0
  154. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +73 -0
  155. package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -0
  156. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +196 -0
  157. package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -0
  158. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +39 -0
  159. package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -0
  160. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +338 -0
  161. package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -0
  162. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +132 -0
  163. package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -0
  164. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +162 -0
  165. package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -0
  166. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +135 -0
  167. package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -0
  168. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +214 -0
  169. package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -0
  170. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +64 -0
  171. package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -0
  172. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +263 -0
  173. package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -0
  174. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +296 -0
  175. package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -0
  176. package/fesm2022/rt-tools-ui-kit-v2.mjs +91 -23819
  177. package/fesm2022/rt-tools-ui-kit-v2.mjs.map +1 -1
  178. package/package.json +349 -1
  179. package/rt-tools-ui-kit-v2-0.18.0.tgz +0 -0
  180. package/src/lib/components/dot-field/CONTEXT.md +31 -0
  181. package/src/lib/components/dot-field/rt-dot-field.component.scss +20 -0
  182. package/src/lib/components/dot-field/stories/component/CONTEXT.md +14 -0
  183. package/src/lib/components/dot-field/stories/component/test-dot-field.component.scss +31 -0
  184. package/src/lib/components/field/CONTEXT.md +18 -2
  185. package/src/lib/components/select/rt-select.component.scss +4 -0
  186. package/src/styles/_semantic.scss +1 -1
  187. package/styles/tokens.css +8 -8
  188. package/types/rt-tools-ui-kit-v2-accordion.d.ts +30 -0
  189. package/types/rt-tools-ui-kit-v2-action-bar.d.ts +140 -0
  190. package/types/rt-tools-ui-kit-v2-aside-section.d.ts +25 -0
  191. package/types/rt-tools-ui-kit-v2-aside.d.ts +436 -0
  192. package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +78 -0
  193. package/types/rt-tools-ui-kit-v2-bar-list.d.ts +41 -0
  194. package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +20 -0
  195. package/types/rt-tools-ui-kit-v2-button.d.ts +76 -0
  196. package/types/rt-tools-ui-kit-v2-calendar.d.ts +96 -0
  197. package/types/rt-tools-ui-kit-v2-card.d.ts +38 -0
  198. package/types/rt-tools-ui-kit-v2-checkbox.d.ts +46 -0
  199. package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +20 -0
  200. package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +85 -0
  201. package/types/rt-tools-ui-kit-v2-container.d.ts +425 -0
  202. package/types/rt-tools-ui-kit-v2-core.d.ts +1222 -0
  203. package/types/rt-tools-ui-kit-v2-counter-row.d.ts +22 -0
  204. package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -0
  205. package/types/rt-tools-ui-kit-v2-data-list.d.ts +334 -0
  206. package/types/rt-tools-ui-kit-v2-data-table.d.ts +494 -0
  207. package/types/rt-tools-ui-kit-v2-date-picker.d.ts +181 -0
  208. package/types/rt-tools-ui-kit-v2-date-range.d.ts +98 -0
  209. package/types/rt-tools-ui-kit-v2-delta-view.d.ts +20 -0
  210. package/types/rt-tools-ui-kit-v2-detail-list.d.ts +33 -0
  211. package/types/rt-tools-ui-kit-v2-dialog.d.ts +287 -0
  212. package/types/rt-tools-ui-kit-v2-dot-field.d.ts +17 -0
  213. package/types/rt-tools-ui-kit-v2-download-link.d.ts +17 -0
  214. package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +139 -0
  215. package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +384 -0
  216. package/types/rt-tools-ui-kit-v2-empty-state.d.ts +29 -0
  217. package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +57 -0
  218. package/types/rt-tools-ui-kit-v2-field.d.ts +82 -0
  219. package/types/rt-tools-ui-kit-v2-file-card.d.ts +114 -0
  220. package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -0
  221. package/types/rt-tools-ui-kit-v2-file-input.d.ts +48 -0
  222. package/types/rt-tools-ui-kit-v2-file-list.d.ts +13 -0
  223. package/types/rt-tools-ui-kit-v2-filter-control.d.ts +72 -0
  224. package/types/rt-tools-ui-kit-v2-form-control.d.ts +74 -0
  225. package/types/rt-tools-ui-kit-v2-header.d.ts +40 -0
  226. package/types/rt-tools-ui-kit-v2-icon-button.d.ts +113 -0
  227. package/types/rt-tools-ui-kit-v2-icon.d.ts +238 -0
  228. package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +168 -0
  229. package/types/rt-tools-ui-kit-v2-image-upload.d.ts +102 -0
  230. package/types/rt-tools-ui-kit-v2-info-item.d.ts +13 -0
  231. package/types/rt-tools-ui-kit-v2-input-number.d.ts +67 -0
  232. package/types/rt-tools-ui-kit-v2-input.d.ts +54 -0
  233. package/types/rt-tools-ui-kit-v2-live-badge.d.ts +23 -0
  234. package/types/rt-tools-ui-kit-v2-logo.d.ts +58 -0
  235. package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +30 -0
  236. package/types/rt-tools-ui-kit-v2-menu.d.ts +217 -0
  237. package/types/rt-tools-ui-kit-v2-message.d.ts +56 -0
  238. package/types/rt-tools-ui-kit-v2-money-list.d.ts +34 -0
  239. package/types/rt-tools-ui-kit-v2-multiselect.d.ts +93 -0
  240. package/types/rt-tools-ui-kit-v2-night-grid.d.ts +39 -0
  241. package/types/rt-tools-ui-kit-v2-note.d.ts +21 -0
  242. package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +23 -0
  243. package/types/rt-tools-ui-kit-v2-page-header.d.ts +173 -0
  244. package/types/rt-tools-ui-kit-v2-pagination.d.ts +64 -0
  245. package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +98 -0
  246. package/types/rt-tools-ui-kit-v2-popover.d.ts +79 -0
  247. package/types/rt-tools-ui-kit-v2-radio-button.d.ts +61 -0
  248. package/types/rt-tools-ui-kit-v2-radius.d.ts +37 -0
  249. package/types/rt-tools-ui-kit-v2-ripple.d.ts +39 -0
  250. package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +91 -0
  251. package/types/rt-tools-ui-kit-v2-section-nav.d.ts +23 -0
  252. package/types/rt-tools-ui-kit-v2-select.d.ts +215 -0
  253. package/types/rt-tools-ui-kit-v2-side-menu.d.ts +483 -0
  254. package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +32 -0
  255. package/types/rt-tools-ui-kit-v2-skeleton.d.ts +41 -0
  256. package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -0
  257. package/types/rt-tools-ui-kit-v2-split-button.d.ts +72 -0
  258. package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +81 -0
  259. package/types/rt-tools-ui-kit-v2-stepper.d.ts +51 -0
  260. package/types/rt-tools-ui-kit-v2-table.d.ts +739 -0
  261. package/types/rt-tools-ui-kit-v2-tabs.d.ts +153 -0
  262. package/types/rt-tools-ui-kit-v2-tag.d.ts +70 -0
  263. package/types/rt-tools-ui-kit-v2-textarea.d.ts +36 -0
  264. package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +43 -0
  265. package/types/rt-tools-ui-kit-v2-thread-list.d.ts +111 -0
  266. package/types/rt-tools-ui-kit-v2-timeline.d.ts +35 -0
  267. package/types/rt-tools-ui-kit-v2-toast.d.ts +103 -0
  268. package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +109 -0
  269. package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +85 -0
  270. package/types/rt-tools-ui-kit-v2-toolbar.d.ts +66 -0
  271. package/types/rt-tools-ui-kit-v2-tooltip.d.ts +74 -0
  272. package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +33 -0
  273. package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +128 -0
  274. package/types/rt-tools-ui-kit-v2-workspace.d.ts +84 -0
  275. package/types/rt-tools-ui-kit-v2.d.ts +87 -9599
  276. package/rt-tools-ui-kit-v2-0.17.0.tgz +0 -0
@@ -0,0 +1,894 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Directive, inject, DestroyRef, computed, signal, input, booleanAttribute, output, contentChild, TemplateRef, effect, untracked, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, afterNextRender, viewChild, Injector } from '@angular/core';
3
+ import { NgTemplateOutlet, TitleCasePipe, DOCUMENT } from '@angular/common';
4
+ import * as i1 from '@angular/forms';
5
+ import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';
6
+ import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
7
+ import { timer, Subject } from 'rxjs';
8
+ import { tap, debounce, map, filter, exhaustMap, take, switchMap } from 'rxjs/operators';
9
+ import { BlockDirective, ElemDirective, ModDirective, BreakStringPipe } from '@rt-tools/core';
10
+ import { rtKitLabel, RT_PRESET_MATERIAL_CLASS, rtKitDefault, RT_DATA_TABLE_PRESET_FROM_HOST } from '@rt-tools/ui-kit-v2/core';
11
+ import { RtCheckboxComponent } from '@rt-tools/ui-kit-v2/checkbox';
12
+ import { dataTableIconName, dataTableWithPageEntities, dataTableWithEntity, dataTableWithoutPageEntities, RtDataTableConfigService, RtDataTableIconDirective, RtDataTableComponent, RtDataTableAdditionalRowActionsDirective, RtDataTableCustomCellsDirective, RtDataTableRowActionsDirective, dataTableKeysOf, dataTablePresetEntities, dataTableAnyOnPage, dataTableAllOnPage } from '@rt-tools/ui-kit-v2/data-table';
13
+ import { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';
14
+ import { RtInputComponent } from '@rt-tools/ui-kit-v2/input';
15
+ import { RtToolbarComponent, RtToolbarLeftDirective, RtToolbarRightDirective } from '@rt-tools/ui-kit-v2/toolbar';
16
+ import { CdkDrag, CdkDragHandle, CdkDropList } from '@angular/cdk/drag-drop';
17
+ import { RtAsideRef, RT_ASIDE_DATA, RtAsideComponent, RtAsideFooterComponent, RtAsideHeaderComponent, RtAsideService } from '@rt-tools/ui-kit-v2/aside';
18
+ import { RtButtonDirective } from '@rt-tools/ui-kit-v2/button';
19
+ import { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';
20
+ import { RtToggleSwitchComponent } from '@rt-tools/ui-kit-v2/toggle-switch';
21
+ import { transformArrayInput } from '@rt-tools/utils';
22
+ import { RtEmptyStateComponent } from '@rt-tools/ui-kit-v2/empty-state';
23
+ import { RtSpinnerComponent } from '@rt-tools/ui-kit-v2/spinner';
24
+ import { RtPaginationComponent } from '@rt-tools/ui-kit-v2/pagination';
25
+
26
+ /** Селекторы приложения в панели действий: они стоят рядом с «отметить все». */
27
+ class RtDataListToolbarSelectorsDirective {
28
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListToolbarSelectorsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
29
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtDataListToolbarSelectorsDirective, isStandalone: true, selector: "[rtDataListToolbarSelectors]", ngImport: i0 }); }
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListToolbarSelectorsDirective, decorators: [{
32
+ type: Directive,
33
+ args: [{
34
+ selector: '[rtDataListToolbarSelectors]',
35
+ }]
36
+ }] });
37
+ /** Действия приложения в панели: они стоят перед кнопками кита и отделены от них чертой. */
38
+ class RtDataListToolbarActionsDirective {
39
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListToolbarActionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
40
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtDataListToolbarActionsDirective, isStandalone: true, selector: "[rtDataListToolbarActions]", ngImport: i0 }); }
41
+ }
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListToolbarActionsDirective, decorators: [{
43
+ type: Directive,
44
+ args: [{
45
+ selector: '[rtDataListToolbarActions]',
46
+ }]
47
+ }] });
48
+
49
+ const BEM_BLOCK$2 = 'rt-data-list-toolbar';
50
+ /** Набранное уходит приложению через эту задержку; очистка поля уходит сразу. */
51
+ const SEARCH_DELAY_MS = 500;
52
+ /** Значок кнопки — по имени первого кита: перечень соответствий кита даёт ему рисунок. */
53
+ function iconOf(glyph, fallback) {
54
+ return dataTableIconName(glyph) ?? fallback;
55
+ }
56
+ /**
57
+ * Панель действий списка `rt-data-list` — панель первого кита без Material.
58
+ *
59
+ * Слева — «отметить все» либо счётчик отмеченных и селекторы приложения, справа — действия
60
+ * приложения, снятие отбора, обновление, настройка колонок и поиск. Своего состояния панель не
61
+ * ведёт: обо всём, кроме набранного в поиске, она просит приложение.
62
+ */
63
+ class RtDataListToolbarComponent {
64
+ #destroyRef;
65
+ /**
66
+ * Последнее, что знают и приложение, и поле: отправленное приложению или поставленное им самим.
67
+ * Одно и то же дважды не спрашивается, а поставленное приложением не возвращается ему эхом.
68
+ */
69
+ #lastSearch;
70
+ /** Набранное в поиске: поле — не сигнал, и без этой записи пересчёта по нему не будет. */
71
+ #searchText;
72
+ /** В поле уже набирали — тогда на заглушке оно остаётся видимым и пустым. */
73
+ #isSearchTouched;
74
+ constructor() {
75
+ this.#destroyRef = inject(DestroyRef);
76
+ /**
77
+ * Последнее, что знают и приложение, и поле: отправленное приложению или поставленное им самим.
78
+ * Одно и то же дважды не спрашивается, а поставленное приложением не возвращается ему эхом.
79
+ */
80
+ this.#lastSearch = '';
81
+ this.clearFiltersLabel = rtKitLabel('dataListClearFilters');
82
+ this.refreshLabel = rtKitLabel('dataListRefresh');
83
+ this.tableConfigLabel = rtKitLabel('dataListTableConfig');
84
+ this.searchPlaceholder = rtKitLabel('dataListSearchPlaceholder');
85
+ this.selectAllLabel = rtKitLabel('dataListSelectAll');
86
+ this.selectedLabel = rtKitLabel('dataListSelected', computed(() => ({ count: this.selectedEntitiesCount() })));
87
+ this.clearFiltersIcon = iconOf('block', 'ban');
88
+ this.refreshIcon = iconOf('sync', 'sync');
89
+ this.tableConfigIcon = iconOf('view_column', 'table');
90
+ this.searchIcon = iconOf('search', 'search');
91
+ /** Набранное в поиске: поле — не сигнал, и без этой записи пересчёта по нему не будет. */
92
+ this.#searchText = signal('', /* @ts-ignore */
93
+ ...(ngDevMode ? [{ debugName: "#searchText" }] : /* istanbul ignore next */ []));
94
+ /** В поле уже набирали — тогда на заглушке оно остаётся видимым и пустым. */
95
+ this.#isSearchTouched = signal(false, /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "#isSearchTouched" }] : /* istanbul ignore next */ []));
97
+ /**
98
+ * Поле поиска видно, пока есть строки, а на заглушке — только когда поиск был: в поле что-то
99
+ * набирали или приложение само поставило непустой поиск, не нашедший строк.
100
+ */
101
+ this.isSearchShown = computed(() => !this.isPlaceholderShown() || !!this.#searchText() || this.#isSearchTouched() || !!this.searchTerm()?.trim(), /* @ts-ignore */
102
+ ...(ngDevMode ? [{ debugName: "isSearchShown" }] : /* istanbul ignore next */ []));
103
+ this.hasSelectors = computed(() => this.isMultiSelect() || !!this.toolbarSelectorsTpl(), /* @ts-ignore */
104
+ ...(ngDevMode ? [{ debugName: "hasSelectors" }] : /* istanbul ignore next */ []));
105
+ /** Вид поля поиска: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */
106
+ this.searchAppearance = input('outline', /* @ts-ignore */
107
+ ...(ngDevMode ? [{ debugName: "searchAppearance" }] : /* istanbul ignore next */ []));
108
+ this.isFiltersShown = input(false, { ...(ngDevMode ? { debugName: "isFiltersShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
109
+ /** Условий отбора нет — снимать нечего, и кнопка недоступна. */
110
+ this.isFiltersEmpty = input(true, { ...(ngDevMode ? { debugName: "isFiltersEmpty" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
111
+ this.isRefreshButtonShown = input(true, { ...(ngDevMode ? { debugName: "isRefreshButtonShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
112
+ this.isTableConfigButtonShown = input(true, { ...(ngDevMode ? { debugName: "isTableConfigButtonShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
113
+ this.isPlaceholderShown = input(false, { ...(ngDevMode ? { debugName: "isPlaceholderShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
114
+ /** Контурные значки кнопок полосы — очистки отбора, обновления и настройки колонок, как у первого кита. */
115
+ this.isToolbarActionsIconsOutlined = input(true, { ...(ngDevMode ? { debugName: "isToolbarActionsIconsOutlined" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
116
+ /** Поиск приложения: поле следует за ним при каждой смене, а не только при первом рисовании. */
117
+ this.searchTerm = input('', /* @ts-ignore */
118
+ ...(ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []));
119
+ this.searchChange = output();
120
+ this.refreshAction = output();
121
+ this.clearFiltersAction = output();
122
+ this.openConfigAction = output();
123
+ this.toolbarSelectorsTpl = contentChild(RtDataListToolbarSelectorsDirective, { ...(ngDevMode ? { debugName: "toolbarSelectorsTpl" } : /* istanbul ignore next */ {}), read: TemplateRef });
124
+ this.toolbarActionsTpl = contentChild(RtDataListToolbarActionsDirective, { ...(ngDevMode ? { debugName: "toolbarActionsTpl" } : /* istanbul ignore next */ {}), read: TemplateRef });
125
+ /** Состояние выбора; его ставит директива выбора списка. */
126
+ this.isMultiSelect = signal(false, /* @ts-ignore */
127
+ ...(ngDevMode ? [{ debugName: "isMultiSelect" }] : /* istanbul ignore next */ []));
128
+ this.isSelectAllSelectorShown = signal(true, /* @ts-ignore */
129
+ ...(ngDevMode ? [{ debugName: "isSelectAllSelectorShown" }] : /* istanbul ignore next */ []));
130
+ this.isSelectAllSelectorDisabled = signal(false, /* @ts-ignore */
131
+ ...(ngDevMode ? [{ debugName: "isSelectAllSelectorDisabled" }] : /* istanbul ignore next */ []));
132
+ this.isAllEntitiesSelected = signal(false, /* @ts-ignore */
133
+ ...(ngDevMode ? [{ debugName: "isAllEntitiesSelected" }] : /* istanbul ignore next */ []));
134
+ this.isAllEntitiesIndeterminate = signal(false, /* @ts-ignore */
135
+ ...(ngDevMode ? [{ debugName: "isAllEntitiesIndeterminate" }] : /* istanbul ignore next */ []));
136
+ this.selectedEntitiesCount = signal(0, /* @ts-ignore */
137
+ ...(ngDevMode ? [{ debugName: "selectedEntitiesCount" }] : /* istanbul ignore next */ []));
138
+ this.searchControl = new FormControl(null);
139
+ /** Отметить все записи; метод ставит директива выбора списка. */
140
+ this.onToggleAllEntities = () => undefined;
141
+ /* Поиск приложения ставится в поле, только когда он отличается от последнего, что панель
142
+ отправила или поставила сама. Эхо отправленного — даже запоздалое, когда человек уже
143
+ дописал дальше, — поле не трогает: иначе оно стирало бы набранное и сбивало каретку. */
144
+ effect(() => {
145
+ const term = this.searchTerm() ?? '';
146
+ untracked(() => {
147
+ if (term.trim() === this.#lastSearch) {
148
+ return;
149
+ }
150
+ this.#lastSearch = term.trim();
151
+ this.searchControl.setValue(term, { emitEvent: false });
152
+ this.#searchText.set(term);
153
+ });
154
+ });
155
+ /* Набранное уходит приложению, когда человек перестал печатать; пустое — сразу, иначе
156
+ очистка поля ждала бы полсекунды. Одно и то же дважды не спрашивается. */
157
+ this.searchControl.valueChanges
158
+ .pipe(tap((value) => {
159
+ this.#searchText.set(value ?? '');
160
+ this.#isSearchTouched.set(true);
161
+ }), debounce((value) => timer(value ? SEARCH_DELAY_MS : 0)), map((value) => (value ?? '').trim()),
162
+ // Набранное, которое приложение успело заменить своим поиском, уже не в поле.
163
+ filter((value) => value === (this.searchControl.value ?? '').trim()), filter((value) => value !== this.#lastSearch), takeUntilDestroyed(this.#destroyRef))
164
+ .subscribe((value) => {
165
+ this.#lastSearch = value;
166
+ this.searchChange.emit(value);
167
+ });
168
+ }
169
+ onRefresh() {
170
+ this.refreshAction.emit();
171
+ }
172
+ onClearFilters() {
173
+ this.clearFiltersAction.emit();
174
+ }
175
+ onOpenConfig() {
176
+ this.openConfigAction.emit();
177
+ }
178
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
179
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtDataListToolbarComponent, isStandalone: true, selector: "rt-data-list-toolbar", inputs: { searchAppearance: { classPropertyName: "searchAppearance", publicName: "searchAppearance", isSignal: true, isRequired: false, transformFunction: null }, isFiltersShown: { classPropertyName: "isFiltersShown", publicName: "isFiltersShown", isSignal: true, isRequired: false, transformFunction: null }, isFiltersEmpty: { classPropertyName: "isFiltersEmpty", publicName: "isFiltersEmpty", isSignal: true, isRequired: false, transformFunction: null }, isRefreshButtonShown: { classPropertyName: "isRefreshButtonShown", publicName: "isRefreshButtonShown", isSignal: true, isRequired: false, transformFunction: null }, isTableConfigButtonShown: { classPropertyName: "isTableConfigButtonShown", publicName: "isTableConfigButtonShown", isSignal: true, isRequired: false, transformFunction: null }, isPlaceholderShown: { classPropertyName: "isPlaceholderShown", publicName: "isPlaceholderShown", isSignal: true, isRequired: false, transformFunction: null }, isToolbarActionsIconsOutlined: { classPropertyName: "isToolbarActionsIconsOutlined", publicName: "isToolbarActionsIconsOutlined", isSignal: true, isRequired: false, transformFunction: null }, searchTerm: { classPropertyName: "searchTerm", publicName: "searchTerm", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { searchChange: "searchChange", refreshAction: "refreshAction", clearFiltersAction: "clearFiltersAction", openConfigAction: "openConfigAction" }, host: { classAttribute: "rt-data-list-toolbar" }, queries: [{ propertyName: "toolbarSelectorsTpl", first: true, predicate: RtDataListToolbarSelectorsDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "toolbarActionsTpl", first: true, predicate: RtDataListToolbarActionsDirective, descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: "<ng-container rtBlock=\"rt-data-list-toolbar\">\n <rt-toolbar>\n @if (hasSelectors() && !isPlaceholderShown()) {\n <ng-container *rtToolbarLeft>\n <div rtElem=\"selectors\">\n @if (isMultiSelect()) {\n @if (isSelectAllSelectorShown()) {\n <rt-checkbox\n qa-dataid=\"data-list-select-all\"\n [ariaLabel]=\"selectAllLabel()\"\n [disabled]=\"isSelectAllSelectorDisabled()\"\n [indeterminate]=\"isAllEntitiesIndeterminate() && !isAllEntitiesSelected()\"\n [ngModel]=\"isAllEntitiesSelected()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onToggleAllEntities($event)\">\n {{ selectAllLabel() }}\n </rt-checkbox>\n } @else {\n <span rtElem=\"counter\" qa-dataid=\"data-list-selected-count\">{{ selectedLabel() }}</span>\n }\n }\n\n @if (toolbarSelectorsTpl(); as selectors) {\n <ng-container [ngTemplateOutlet]=\"selectors\" />\n }\n </div>\n </ng-container>\n }\n\n <ng-container *rtToolbarRight>\n <div rtElem=\"right\">\n <div rtElem=\"actions\">\n @if (toolbarActionsTpl(); as actions) {\n <ng-container [ngTemplateOutlet]=\"actions\" />\n\n <span rtElem=\"divider\"></span>\n }\n\n @if (isFiltersShown()) {\n <rt-icon-button\n qa-dataid=\"data-list-clear-filters\"\n variant=\"ghost\"\n [iconFill]=\"!isToolbarActionsIconsOutlined()\"\n [icon]=\"clearFiltersIcon\"\n [ariaLabel]=\"clearFiltersLabel()\"\n [tooltip]=\"clearFiltersLabel()\"\n [disabled]=\"isFiltersEmpty()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (isRefreshButtonShown()) {\n <rt-icon-button\n qa-dataid=\"data-list-refresh\"\n variant=\"ghost\"\n [iconFill]=\"!isToolbarActionsIconsOutlined()\"\n [icon]=\"refreshIcon\"\n [ariaLabel]=\"refreshLabel()\"\n [tooltip]=\"refreshLabel()\"\n (clicked)=\"onRefresh()\" />\n }\n\n @if (isTableConfigButtonShown()) {\n <rt-icon-button\n qa-dataid=\"data-list-table-config\"\n variant=\"ghost\"\n [iconFill]=\"!isToolbarActionsIconsOutlined()\"\n [icon]=\"tableConfigIcon\"\n [ariaLabel]=\"tableConfigLabel()\"\n [tooltip]=\"tableConfigLabel()\"\n (clicked)=\"onOpenConfig()\" />\n }\n </div>\n\n @if (isSearchShown()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"data-list-search\"\n size=\"sm\"\n [appearance]=\"searchAppearance()\"\n [iconLeft]=\"searchIcon\"\n [placeholder]=\"searchPlaceholder()\"\n [ariaLabel]=\"searchPlaceholder()\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </ng-container>\n </rt-toolbar>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-data-list-toolbar{--rt-data-list-toolbar-divider-width: var(--rt-border-width-thin);display:block;width:100%;margin-bottom:var(--rt-list-toolbar-gap)}.rt-data-list-toolbar .rt-toolbar{--rt-toolbar-padding-top: var(--rt-list-toolbar-padding-top);--rt-toolbar-padding-bottom: var(--rt-list-toolbar-padding-bottom)}.rt-data-list-toolbar__selectors{display:flex;align-items:center;gap:var(--rt-space-md)}.rt-data-list-toolbar__selectors .rt-checkbox{--rt-checkbox-color-label: var(--rt-list-selector-label-color)}.rt-data-list-toolbar__counter{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-data-list-toolbar__right{display:flex;width:100%;align-items:center;justify-content:flex-end;gap:var(--rt-space-md)}.rt-data-list-toolbar__actions{display:flex;align-items:center;gap:var(--rt-list-action-gap)}.rt-data-list-toolbar__actions rt-icon-button{--rt-icon-button-color: var(--rt-list-action-color)}.rt-data-list-toolbar__actions .rt-icon-button{--rt-icon-button-radius: var(--rt-list-action-radius);--rt-icon-button-shadow: var(--rt-list-action-shadow);--rt-icon-button-shadow-hover: var(--rt-list-action-shadow-hover);--rt-icon-button-color-hover: var(--rt-list-action-color-hover);--rt-icon-button-color-bg-hover: var(--rt-list-action-color-bg-hover)}.rt-data-list-toolbar__actions .rt-icon-button__icon{min-width:var(--rt-list-action-icon-size);min-height:var(--rt-list-action-icon-size)}.rt-data-list-toolbar__divider{height:var(--rt-list-action-divider-height);border-left:var(--rt-data-list-toolbar-divider-width) solid var(--rt-color-border-subtle)}.rt-data-list-toolbar .rt-toolbar__bar--right{flex-grow:1}.rt-data-list-toolbar__search{--rt-input-height-sm: var(--rt-list-search-height);--rt-input-radius: var(--rt-list-search-radius);--rt-input-color-border: var(--rt-list-search-color-border);--rt-input-color-bg: var(--rt-list-search-color-bg);--rt-input-padding-x: var(--rt-list-search-padding-x);--rt-input-gap: var(--rt-list-search-gap);--rt-input-font-size: var(--rt-list-search-font-size);--rt-input-icon-size: var(--rt-list-search-icon-size);--rt-input-icon-color: var(--rt-list-search-icon-color);--rt-input-color-text-placeholder: var(--rt-list-search-color-placeholder);min-width:0;flex:0 1 var(--rt-list-search-width);contain:inline-size}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-toolbar__search .rt-input{--rt-input-fill-radius: var(--rt-list-search-radius)}@media(width<=1080px){.rt-data-list-toolbar__right{flex-wrap:wrap}.rt-data-list-toolbar__search{flex-basis:100%}}}\n"], dependencies: [{ kind: "component", type:
180
+ // components
181
+ RtCheckboxComponent, selector: "rt-checkbox", inputs: ["inputId", "ariaLabel", "disabled", "indeterminate"] }, { kind: "component", type: RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtInputComponent, selector: "rt-input", inputs: ["appearance", "type", "placeholder", "iconLeft", "iconRight", "passwordToggle", "autocomplete"] }, { kind: "component", type: RtToolbarComponent, selector: "rt-toolbar", inputs: ["dense"] }, { kind: "directive", type:
182
+ // directives
183
+ BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: RtToolbarLeftDirective, selector: "[rtToolbarLeft]" }, { kind: "directive", type: RtToolbarRightDirective, selector: "[rtToolbarRight]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
184
+ }
185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListToolbarComponent, decorators: [{
186
+ type: Component,
187
+ args: [{ selector: 'rt-data-list-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
188
+ // components
189
+ RtCheckboxComponent,
190
+ RtIconButtonComponent,
191
+ RtInputComponent,
192
+ RtToolbarComponent,
193
+ // directives
194
+ BlockDirective,
195
+ ElemDirective,
196
+ FormsModule,
197
+ ModDirective,
198
+ NgTemplateOutlet,
199
+ ReactiveFormsModule,
200
+ RtToolbarLeftDirective,
201
+ RtToolbarRightDirective,
202
+ ], host: { class: BEM_BLOCK$2 }, template: "<ng-container rtBlock=\"rt-data-list-toolbar\">\n <rt-toolbar>\n @if (hasSelectors() && !isPlaceholderShown()) {\n <ng-container *rtToolbarLeft>\n <div rtElem=\"selectors\">\n @if (isMultiSelect()) {\n @if (isSelectAllSelectorShown()) {\n <rt-checkbox\n qa-dataid=\"data-list-select-all\"\n [ariaLabel]=\"selectAllLabel()\"\n [disabled]=\"isSelectAllSelectorDisabled()\"\n [indeterminate]=\"isAllEntitiesIndeterminate() && !isAllEntitiesSelected()\"\n [ngModel]=\"isAllEntitiesSelected()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onToggleAllEntities($event)\">\n {{ selectAllLabel() }}\n </rt-checkbox>\n } @else {\n <span rtElem=\"counter\" qa-dataid=\"data-list-selected-count\">{{ selectedLabel() }}</span>\n }\n }\n\n @if (toolbarSelectorsTpl(); as selectors) {\n <ng-container [ngTemplateOutlet]=\"selectors\" />\n }\n </div>\n </ng-container>\n }\n\n <ng-container *rtToolbarRight>\n <div rtElem=\"right\">\n <div rtElem=\"actions\">\n @if (toolbarActionsTpl(); as actions) {\n <ng-container [ngTemplateOutlet]=\"actions\" />\n\n <span rtElem=\"divider\"></span>\n }\n\n @if (isFiltersShown()) {\n <rt-icon-button\n qa-dataid=\"data-list-clear-filters\"\n variant=\"ghost\"\n [iconFill]=\"!isToolbarActionsIconsOutlined()\"\n [icon]=\"clearFiltersIcon\"\n [ariaLabel]=\"clearFiltersLabel()\"\n [tooltip]=\"clearFiltersLabel()\"\n [disabled]=\"isFiltersEmpty()\"\n (clicked)=\"onClearFilters()\" />\n }\n\n @if (isRefreshButtonShown()) {\n <rt-icon-button\n qa-dataid=\"data-list-refresh\"\n variant=\"ghost\"\n [iconFill]=\"!isToolbarActionsIconsOutlined()\"\n [icon]=\"refreshIcon\"\n [ariaLabel]=\"refreshLabel()\"\n [tooltip]=\"refreshLabel()\"\n (clicked)=\"onRefresh()\" />\n }\n\n @if (isTableConfigButtonShown()) {\n <rt-icon-button\n qa-dataid=\"data-list-table-config\"\n variant=\"ghost\"\n [iconFill]=\"!isToolbarActionsIconsOutlined()\"\n [icon]=\"tableConfigIcon\"\n [ariaLabel]=\"tableConfigLabel()\"\n [tooltip]=\"tableConfigLabel()\"\n (clicked)=\"onOpenConfig()\" />\n }\n </div>\n\n @if (isSearchShown()) {\n <div rtElem=\"search\">\n <rt-input\n qa-dataid=\"data-list-search\"\n size=\"sm\"\n [appearance]=\"searchAppearance()\"\n [iconLeft]=\"searchIcon\"\n [placeholder]=\"searchPlaceholder()\"\n [ariaLabel]=\"searchPlaceholder()\"\n [formControl]=\"searchControl\" />\n </div>\n }\n </div>\n </ng-container>\n </rt-toolbar>\n</ng-container>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-data-list-toolbar{--rt-data-list-toolbar-divider-width: var(--rt-border-width-thin);display:block;width:100%;margin-bottom:var(--rt-list-toolbar-gap)}.rt-data-list-toolbar .rt-toolbar{--rt-toolbar-padding-top: var(--rt-list-toolbar-padding-top);--rt-toolbar-padding-bottom: var(--rt-list-toolbar-padding-bottom)}.rt-data-list-toolbar__selectors{display:flex;align-items:center;gap:var(--rt-space-md)}.rt-data-list-toolbar__selectors .rt-checkbox{--rt-checkbox-color-label: var(--rt-list-selector-label-color)}.rt-data-list-toolbar__counter{color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-data-list-toolbar__right{display:flex;width:100%;align-items:center;justify-content:flex-end;gap:var(--rt-space-md)}.rt-data-list-toolbar__actions{display:flex;align-items:center;gap:var(--rt-list-action-gap)}.rt-data-list-toolbar__actions rt-icon-button{--rt-icon-button-color: var(--rt-list-action-color)}.rt-data-list-toolbar__actions .rt-icon-button{--rt-icon-button-radius: var(--rt-list-action-radius);--rt-icon-button-shadow: var(--rt-list-action-shadow);--rt-icon-button-shadow-hover: var(--rt-list-action-shadow-hover);--rt-icon-button-color-hover: var(--rt-list-action-color-hover);--rt-icon-button-color-bg-hover: var(--rt-list-action-color-bg-hover)}.rt-data-list-toolbar__actions .rt-icon-button__icon{min-width:var(--rt-list-action-icon-size);min-height:var(--rt-list-action-icon-size)}.rt-data-list-toolbar__divider{height:var(--rt-list-action-divider-height);border-left:var(--rt-data-list-toolbar-divider-width) solid var(--rt-color-border-subtle)}.rt-data-list-toolbar .rt-toolbar__bar--right{flex-grow:1}.rt-data-list-toolbar__search{--rt-input-height-sm: var(--rt-list-search-height);--rt-input-radius: var(--rt-list-search-radius);--rt-input-color-border: var(--rt-list-search-color-border);--rt-input-color-bg: var(--rt-list-search-color-bg);--rt-input-padding-x: var(--rt-list-search-padding-x);--rt-input-gap: var(--rt-list-search-gap);--rt-input-font-size: var(--rt-list-search-font-size);--rt-input-icon-size: var(--rt-list-search-icon-size);--rt-input-icon-color: var(--rt-list-search-icon-color);--rt-input-color-text-placeholder: var(--rt-list-search-color-placeholder);min-width:0;flex:0 1 var(--rt-list-search-width);contain:inline-size}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-toolbar__search .rt-input{--rt-input-fill-radius: var(--rt-list-search-radius)}@media(width<=1080px){.rt-data-list-toolbar__right{flex-wrap:wrap}.rt-data-list-toolbar__search{flex-basis:100%}}}\n"] }]
203
+ }], ctorParameters: () => [], propDecorators: { searchAppearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchAppearance", required: false }] }], isFiltersShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isFiltersShown", required: false }] }], isFiltersEmpty: [{ type: i0.Input, args: [{ isSignal: true, alias: "isFiltersEmpty", required: false }] }], isRefreshButtonShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isRefreshButtonShown", required: false }] }], isTableConfigButtonShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isTableConfigButtonShown", required: false }] }], isPlaceholderShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isPlaceholderShown", required: false }] }], isToolbarActionsIconsOutlined: [{ type: i0.Input, args: [{ isSignal: true, alias: "isToolbarActionsIconsOutlined", required: false }] }], searchTerm: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchTerm", required: false }] }], searchChange: [{ type: i0.Output, args: ["searchChange"] }], refreshAction: [{ type: i0.Output, args: ["refreshAction"] }], clearFiltersAction: [{ type: i0.Output, args: ["clearFiltersAction"] }], openConfigAction: [{ type: i0.Output, args: ["openConfigAction"] }], toolbarSelectorsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDataListToolbarSelectorsDirective), { ...{
204
+ read: TemplateRef,
205
+ }, isSignal: true }] }], toolbarActionsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDataListToolbarActionsDirective), { ...{
206
+ read: TemplateRef,
207
+ }, isSignal: true }] }] } });
208
+
209
+ /** Размеры страницы, которые предлагает первый кит. */
210
+ const DATA_LIST_PAGE_SIZES = [10, 20, 40, 50];
211
+ /** Страниц всего при этом размере страницы. */
212
+ function dataListPageCount(totalCount, pageSize) {
213
+ return pageSize > 0 ? Math.ceil(totalCount / pageSize) : 0;
214
+ }
215
+ /**
216
+ * Предлагаемые размеры страницы: размер годится, пока его половина не больше числа записей.
217
+ * Нынешний размер предлагается всегда — иначе список показывал бы размер, которого нет в списке.
218
+ */
219
+ function dataListPageSizes(page) {
220
+ return DATA_LIST_PAGE_SIZES.filter((size) => size / 2 <= page.totalCount || size === page.pageSize);
221
+ }
222
+ /**
223
+ * Новая страница при смене размера: человек остаётся на том же расстоянии от конца списка —
224
+ * приём первого кита.
225
+ */
226
+ function dataListPageAfterSizeChange(page, pageSize) {
227
+ const nextTotal = dataListPageCount(page.totalCount, pageSize);
228
+ const previousTotal = dataListPageCount(page.totalCount, page.pageSize);
229
+ const correction = Math.floor(((previousTotal - page.pageNumber) * page.pageSize) / pageSize);
230
+ return { pageNumber: nextTotal - correction, pageSize };
231
+ }
232
+
233
+ const breakString = new BreakStringPipe();
234
+ const titleCase = new TitleCasePipe();
235
+ /**
236
+ * Колонки — в пункты готового редактора списка колонок кита. Подпись берётся так же, как её
237
+ * берёт первый кит: имя для настроек, а без него — имя свойства, разбитое по словам и с
238
+ * заглавных: `userIcon` → «User Icon».
239
+ */
240
+ function dataListSettingItems(columns) {
241
+ return columns.map((column) => {
242
+ const propName = String(column.propName);
243
+ const isNamed = !!column.displayName?.length && column.displayName !== propName;
244
+ return {
245
+ key: propName,
246
+ label: isNamed ? String(column.displayName) : titleCase.transform(breakString.transform(propName)),
247
+ hidden: !!column.hidden,
248
+ };
249
+ });
250
+ }
251
+ /** Обратно: порядок и видимость из пунктов редактора — в описания колонок. */
252
+ function dataListColumnsFromItems(columns, items) {
253
+ const byKey = new Map(columns.map((column) => [String(column.propName), column]));
254
+ return items.flatMap((item, index) => {
255
+ const column = byKey.get(item.key);
256
+ return column ? [{ ...column, hidden: item.hidden, orderIndex: index }] : [];
257
+ });
258
+ }
259
+ /** Слепок настройки: порядок колонок, их видимость и два признака полос прокрутки. */
260
+ function dataListSettingsShape(config) {
261
+ return JSON.stringify([
262
+ config.isVerticalScrollbarShown,
263
+ config.isHorizontalScrollbarShown,
264
+ config.columns.map((column) => [String(column.propName), !!column.hidden]),
265
+ ]);
266
+ }
267
+ /** В панели что-то изменилось: порядок колонок, их видимость или признаки полос прокрутки. */
268
+ function dataListSettingsChanged(saved, current) {
269
+ return dataListSettingsShape(saved) !== dataListSettingsShape(current);
270
+ }
271
+ /**
272
+ * Колонка перетащена на новое место — новый порядок пунктов. Индексы — по всему списку, как их
273
+ * отдаёт перетаскивание; место, совпавшее со старым, возвращает тот же список.
274
+ */
275
+ function dataListMoveItem(items, from, to) {
276
+ if (from === to || !items[from]) {
277
+ return items;
278
+ }
279
+ const next = [...items];
280
+ const moved = next.splice(from, 1)[0];
281
+ next.splice(Math.min(Math.max(to, 0), next.length), 0, moved);
282
+ return next;
283
+ }
284
+ /** Видимость колонки переключена кнопкой-глазом. Закреплённую колонку кнопка не трогает. */
285
+ function dataListToggleHidden(items, key) {
286
+ return items.map((item) => item.key === key && item.locked !== true ? { ...item, hidden: !item.hidden } : item);
287
+ }
288
+
289
+ const BEM_BLOCK$1 = 'rt-data-list-settings-aside';
290
+ /**
291
+ * Панель настройки колонок списка `rt-data-list` — панель первого кита без Material.
292
+ *
293
+ * Панель поднимает служба боковых панелей кита; настройку она получает её же данными и отдаёт
294
+ * обратно закрытием. Сам список колонок рисует готовый редактор кита — перетаскивание и глаз у
295
+ * него уже есть. Сохранение недоступно, пока в панели ничего не изменилось; отмена не меняет
296
+ * ничего.
297
+ */
298
+ class RtDataListSettingsAsideComponent {
299
+ #host;
300
+ #asideRef;
301
+ /** Настройка, с которой панель открыли: с ней же сверяется, изменилось ли что-нибудь. */
302
+ #saved;
303
+ constructor() {
304
+ this.#host = inject(ElementRef);
305
+ this.#asideRef = inject(RtAsideRef);
306
+ /** Настройка, с которой панель открыли: с ней же сверяется, изменилось ли что-нибудь. */
307
+ this.#saved = inject(RT_ASIDE_DATA);
308
+ this.title = rtKitLabel('dataListSettingsTitle');
309
+ this.hint = rtKitLabel('dataListSettingsHint');
310
+ this.verticalLabel = rtKitLabel('dataListVerticalScrollbar');
311
+ this.horizontalLabel = rtKitLabel('dataListHorizontalScrollbar');
312
+ this.saveLabel = rtKitLabel('uiSave');
313
+ this.cancelLabel = rtKitLabel('uiDiscardChanges');
314
+ this.dragLabel = rtKitLabel('uiDragColumn');
315
+ this.showColumnLabel = rtKitLabel('uiShowColumn');
316
+ this.hideColumnLabel = rtKitLabel('uiHideColumn');
317
+ this.showLabel = rtKitLabel('uiShow');
318
+ this.hideLabel = rtKitLabel('uiHide');
319
+ this.items = signal(dataListSettingItems(this.#saved.columns), /* @ts-ignore */
320
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
321
+ this.isVerticalScrollbarShown = signal(this.#saved.isVerticalScrollbarShown, /* @ts-ignore */
322
+ ...(ngDevMode ? [{ debugName: "isVerticalScrollbarShown" }] : /* istanbul ignore next */ []));
323
+ this.isHorizontalScrollbarShown = signal(this.#saved.isHorizontalScrollbarShown, /* @ts-ignore */
324
+ ...(ngDevMode ? [{ debugName: "isHorizontalScrollbarShown" }] : /* istanbul ignore next */ []));
325
+ this.config = computed(() => ({
326
+ isVerticalScrollbarShown: this.isVerticalScrollbarShown(),
327
+ isHorizontalScrollbarShown: this.isHorizontalScrollbarShown(),
328
+ columns: dataListColumnsFromItems(this.#saved.columns, this.items()),
329
+ }), /* @ts-ignore */
330
+ ...(ngDevMode ? [{ debugName: "config" }] : /* istanbul ignore next */ []));
331
+ /**
332
+ * Класс тянутой плашки. Её наложение переносит в конец страницы, вне панели, и вид первого
333
+ * кита, который панель получила классом набора на наложении, туда не доходит: плашка несёт
334
+ * класс на себе. Предок с классом известен только после первой отрисовки.
335
+ */
336
+ this.dragPreviewClass = signal('', /* @ts-ignore */
337
+ ...(ngDevMode ? [{ debugName: "dragPreviewClass" }] : /* istanbul ignore next */ []));
338
+ this.isChanged = computed(() => dataListSettingsChanged(this.#saved, this.config()), /* @ts-ignore */
339
+ ...(ngDevMode ? [{ debugName: "isChanged" }] : /* istanbul ignore next */ []));
340
+ afterNextRender(() => {
341
+ if (this.#host.nativeElement.closest(`.${RT_PRESET_MATERIAL_CLASS}`) !== null) {
342
+ this.dragPreviewClass.set(RT_PRESET_MATERIAL_CLASS);
343
+ }
344
+ });
345
+ }
346
+ onDrop(event) {
347
+ this.items.set(dataListMoveItem(this.items(), event.previousIndex, event.currentIndex));
348
+ }
349
+ onToggleHidden(key) {
350
+ this.items.set(dataListToggleHidden(this.items(), key));
351
+ }
352
+ onSave() {
353
+ this.#asideRef.close(this.config());
354
+ }
355
+ onCancel() {
356
+ this.#asideRef.close();
357
+ }
358
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListSettingsAsideComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
359
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtDataListSettingsAsideComponent, isStandalone: true, selector: "rt-data-list-settings-aside", host: { classAttribute: "rt-data-list-settings-aside" }, ngImport: i0, template: "<rt-aside size=\"md\" [ariaLabel]=\"title()\">\n <!-- \u041F\u043E\u0434\u043F\u0438\u0441\u044C \u0441\u0442\u043E\u0438\u0442 \u0432 \u0448\u0430\u043F\u043A\u0435 \u043F\u043E\u0434 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u043C, \u043A\u0430\u043A \u0443 \u043F\u0430\u043D\u0435\u043B\u0438 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043A\u0438\u0442\u0430. -->\n <rt-aside-header [title]=\"title()\" [subtitle]=\"hint()\" />\n\n <ng-container rtBlock=\"rt-data-list-settings-aside\">\n <div rtElem=\"switches\">\n <div rtElem=\"switch-row\">\n <rt-toggle-switch\n qa-dataid=\"data-list-settings-vertical\"\n [ariaLabel]=\"verticalLabel()\"\n [ngModel]=\"isVerticalScrollbarShown()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"isVerticalScrollbarShown.set($event)\" />\n <span rtElem=\"switch-label\" qa-dataid=\"data-list-settings-vertical-label\" [rtMod]=\"{ on: isVerticalScrollbarShown() }\">\n {{ verticalLabel() }}\n </span>\n </div>\n\n <div rtElem=\"switch-row\">\n <rt-toggle-switch\n qa-dataid=\"data-list-settings-horizontal\"\n [ariaLabel]=\"horizontalLabel()\"\n [ngModel]=\"isHorizontalScrollbarShown()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"isHorizontalScrollbarShown.set($event)\" />\n <span rtElem=\"switch-label\" qa-dataid=\"data-list-settings-horizontal-label\" [rtMod]=\"{ on: isHorizontalScrollbarShown() }\">\n {{ horizontalLabel() }}\n </span>\n </div>\n </div>\n\n <!-- \u041A\u043E\u043B\u043E\u043D\u043A\u0438 \u2014 \u043F\u043B\u0430\u0448\u043A\u0430\u043C\u0438 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043A\u0438\u0442\u0430: \u0440\u0443\u0447\u043A\u0430 \u2725 \u0438 \u0447\u0435\u0440\u0442\u0430, \u0438\u043C\u044F, \u0447\u0435\u0440\u0442\u0430 \u0438 \u0433\u043B\u0430\u0437. \u041E\u0431\u0449\u0430\u044F \u043F\u0430\u043D\u0435\u043B\u044C\n \u043A\u043E\u043B\u043E\u043D\u043E\u043A \u043A\u0438\u0442\u0430 \u0440\u0438\u0441\u0443\u0435\u0442 \u0432\u0438\u0434 \u0432\u0442\u043E\u0440\u043E\u0433\u043E \u043A\u0438\u0442\u0430, \u0438 \u0435\u0451 \u0440\u0438\u0441\u0443\u0435\u0442 \u0435\u0433\u043E \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0442\u0430\u0431\u043B\u0438\u0446\u0430. -->\n <ul rtElem=\"columns\" qa-dataid=\"data-list-settings-columns\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n @for (item of items(); track item.key) {\n <li\n rtElem=\"column\"\n qa-dataid=\"data-list-settings-column\"\n cdkDrag\n [cdkDragPreviewClass]=\"dragPreviewClass()\"\n [attr.data-key]=\"item.key\"\n [rtMod]=\"{ hidden: item.hidden, locked: item.locked === true }\"\n [cdkDragDisabled]=\"item.locked === true\">\n <button\n rtElem=\"handle\"\n qa-dataid=\"data-list-settings-drag\"\n type=\"button\"\n cdkDragHandle\n [disabled]=\"item.locked === true\"\n [attr.aria-label]=\"dragLabel()\">\n <rt-icon name=\"arrows\" size=\"sm\" />\n </button>\n\n <span rtElem=\"column-label\" qa-dataid=\"data-list-settings-column-label\">{{ item.label }}</span>\n\n <rt-icon-button\n rtElem=\"toggle\"\n qa-dataid=\"data-list-settings-toggle\"\n variant=\"ghost\"\n [icon]=\"item.hidden ? 'eye-slash' : 'eye'\"\n [ariaLabel]=\"item.hidden ? showColumnLabel() : hideColumnLabel()\"\n [tooltip]=\"item.hidden ? showLabel() : hideLabel()\"\n [disabled]=\"item.locked === true\"\n (clicked)=\"onToggleHidden(item.key)\" />\n </li>\n }\n </ul>\n </ng-container>\n\n <!-- \u0411\u043B\u043E\u043A \u0441\u0442\u043E\u0438\u0442 \u043D\u0430\u0434 \u043F\u043E\u0434\u0432\u0430\u043B\u043E\u043C, \u0447\u0442\u043E\u0431\u044B \u043A\u043D\u043E\u043F\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u0432\u0437\u044F\u043B\u0430 \u0441\u0432\u043E\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442: \u043F\u043E\u0434\u043F\u0438\u0441\u044C \u043F\u0440\u043E\u043F\u0438\u0441\u043D\u044B\u043C\u0438,\n \u043A\u0430\u043A \u0432 \u043F\u043E\u0434\u0432\u0430\u043B\u0435 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043A\u0438\u0442\u0430. -->\n <ng-container rtBlock=\"rt-data-list-settings-aside\" ngProjectAs=\"rt-aside-footer\">\n <rt-aside-footer>\n <!-- \u041F\u043E\u0434\u043F\u0438\u0441\u044C \u043A\u043D\u043E\u043F\u043A\u0435 \u0440\u0438\u0441\u0443\u0435\u0442 \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0430 \u043A\u0438\u0442\u0430, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0442\u0435\u043B\u043E \u043F\u0443\u0441\u0442\u043E\u0435. -->\n <button\n rtButton\n asideDismiss\n type=\"button\"\n appearance=\"text\"\n qa-dataid=\"data-list-settings-cancel\"\n [label]=\"cancelLabel()\"\n (click)=\"onCancel()\">\n <!-- empty: label is drawn by the directive -->\n </button>\n\n <button\n rtButton\n rtElem=\"save\"\n asidePrimary\n type=\"button\"\n qa-dataid=\"data-list-settings-save\"\n [label]=\"saveLabel()\"\n [disabled]=\"!isChanged()\"\n (click)=\"onSave()\">\n <!-- empty: label is drawn by the directive -->\n </button>\n </rt-aside-footer>\n </ng-container>\n</rt-aside>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-data-list-settings-aside{display:flex;flex-direction:column;gap:var(--rt-space-md)}.rt-data-list-settings-aside__switches{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-data-list-settings-aside__switch-row{display:flex;align-items:center;gap:var(--rt-space-md)}.rt-data-list-settings-aside__switch-label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm)}.rt-data-list-settings-aside__save{text-transform:uppercase}.rt-data-list-settings-aside__columns{display:flex;flex-direction:column;padding:0;margin:0;gap:var(--rt-space-sm);list-style:none}.rt-data-list-settings-aside__column{--rt-data-list-settings-aside-radius: var(--rt-radius-md);--rt-data-list-settings-aside-divider-width: var(--rt-border-width-thin);--rt-data-list-settings-aside-drag-shadow: var(--rt-shadow-lg);--rt-data-list-settings-aside-drag-duration: var(--rt-duration-base);--rt-data-list-settings-aside-padding-start: 0;--rt-data-list-settings-aside-padding-end: var(--rt-space-sm);--rt-data-list-settings-aside-color: var(--rt-color-text-primary);display:flex;align-items:center;border-radius:var(--rt-data-list-settings-aside-radius);background-color:var(--rt-list-settings-item-bg);color:var(--rt-data-list-settings-aside-color);gap:var(--rt-space-sm);padding-inline:var(--rt-data-list-settings-aside-padding-start) var(--rt-data-list-settings-aside-padding-end)}.rt-data-list-settings-aside__column--hidden{--rt-data-list-settings-aside-color: var(--rt-color-text-muted)}.rt-data-list-settings-aside__column.cdk-drag-preview{box-sizing:border-box;box-shadow:var(--rt-data-list-settings-aside-drag-shadow)}.rt-data-list-settings-aside__column.cdk-drag-placeholder{opacity:0}.rt-data-list-settings-aside__column.cdk-drag-animating{transition:transform var(--rt-data-list-settings-aside-drag-duration) ease-out}.rt-data-list-settings-aside__columns.cdk-drop-list-dragging .rt-data-list-settings-aside__column:not(.cdk-drag-placeholder){transition:transform var(--rt-data-list-settings-aside-drag-duration) ease-out}.rt-data-list-settings-aside__handle{display:inline-flex;align-items:center;align-self:stretch;justify-content:center;padding:0 var(--rt-space-sm);border:none;border-right:var(--rt-data-list-settings-aside-divider-width) solid var(--rt-color-border-subtle);background:transparent;color:inherit;cursor:grab}.rt-data-list-settings-aside__handle:disabled{cursor:default}.rt-data-list-settings-aside__column-label{overflow:hidden;min-width:0;flex:1 1 auto;font-size:var(--rt-text-sm);text-overflow:ellipsis;white-space:nowrap}.rt-data-list-settings-aside__toggle{border-left:var(--rt-data-list-settings-aside-divider-width) solid var(--rt-color-border-subtle);padding-inline-start:var(--rt-space-sm)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside{--rt-aside-inset: var(--rt-space-xl);--rt-aside-content-gap: var(--rt-space-xl);--rt-data-list-settings-aside-control-size: 36px;--rt-data-list-settings-aside-back-icon-size: 24px;--rt-data-list-settings-aside-header-height: 96px}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-header{--rt-aside-header-title-size: var(--rt-text-2xl);--rt-aside-header-title-weight: var(--rt-font-weight-semibold);--rt-aside-header-subtitle-size: var(--rt-text-md);--rt-aside-header-gap: var(--rt-space-md);--rt-aside-header-min-height: var(--rt-data-list-settings-aside-header-height)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-header__back .rt-icon-button{--rt-icon-button-size-step: var(--rt-data-list-settings-aside-control-size);--rt-icon-button-color: var(--rt-list-settings-icon-color);--rt-icon-button-radius: var(--rt-radius-full)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-header__back .rt-icon{min-width:var(--rt-data-list-settings-aside-back-icon-size);min-height:var(--rt-data-list-settings-aside-back-icon-size)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-footer{--rt-aside-footer-border-width: 0}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-footer__content{justify-content:flex-end;gap:var(--rt-space-md)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-footer .rt-button{--rt-btn-height: var(--rt-data-list-settings-aside-control-size);--rt-btn-radius: var(--rt-radius-full);--rt-btn-padding: 0 var(--rt-space-6);--rt-btn-font-size: var(--rt-text-sm)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-footer .rt-button--text{--rt-btn-padding: 0 var(--rt-space-sm)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-toggle-switch{--rt-toggle-track-width: 48px;--rt-toggle-track-height: 24px;--rt-toggle-thumb-size: 20px;--rt-toggle-thumb-inset: 2px;--rt-toggle-thumb-travel: 24px}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-data-list-settings-aside__switches{gap:var(--rt-space-xl)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-data-list-settings-aside__switch-label{color:var(--rt-color-text-muted)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-data-list-settings-aside__switch-label--on{color:var(--rt-color-text-primary)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *){--rt-data-list-settings-aside-radius: var(--rt-list-settings-item-radius);--rt-data-list-settings-aside-drag-shadow: var(--rt-shadow-xl);--rt-data-list-settings-aside-column-height: 48px;--rt-data-list-settings-aside-control-size: 36px;--rt-data-list-settings-aside-icon-size: 18px;--rt-data-list-settings-aside-padding-start: var(--rt-space-xs);--rt-data-list-settings-aside-padding-end: var(--rt-space-xs);--rt-data-list-settings-aside-color: var(--rt-color-text-primary);min-height:var(--rt-data-list-settings-aside-column-height);font-size:var(--rt-text-md)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__handle{min-width:calc(var(--rt-data-list-settings-aside-control-size) + 2 * var(--rt-space-xs));height:var(--rt-data-list-settings-aside-control-size);align-self:center;padding:0 var(--rt-space-xs);border-right-color:var(--rt-color-border-strong);color:var(--rt-list-settings-icon-color);margin-inline-end:var(--rt-space-xs)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__handle .rt-icon{min-width:var(--rt-data-list-settings-aside-icon-size);min-height:var(--rt-data-list-settings-aside-icon-size)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__column-label{font-size:var(--rt-text-md)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__toggle{border-left:none;padding-inline-start:0}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__toggle .rt-icon-button{--rt-icon-button-size-step: var(--rt-data-list-settings-aside-control-size);--rt-icon-button-color: var(--rt-list-settings-icon-color)}}.rt-data-list-settings-aside__column.cdk-drag-preview{background-color:var(--rt-list-settings-item-bg);color:var(--rt-data-list-settings-aside-color);padding-inline:var(--rt-data-list-settings-aside-padding-start) var(--rt-data-list-settings-aside-padding-end)}\n"], dependencies: [{ kind: "component", type:
360
+ // components
361
+ RtAsideComponent, selector: "rt-aside", inputs: ["size", "contentLayout", "width", "ariaLabel", "requestError", "trapFocus", "pending"] }, { kind: "component", type: RtAsideFooterComponent, selector: "rt-aside-footer" }, { kind: "component", type: RtAsideHeaderComponent, selector: "rt-aside-header", inputs: ["title", "overline", "subtitle", "badges", "closable", "loading"], outputs: ["dismiss"] }, { kind: "component", type: RtIconButtonComponent, selector: "rt-icon-button", inputs: ["icon", "glyph", "ariaLabel", "variant", "iconColor", "iconFill", "size", "iconSize", "type", "tooltip", "tabIndex", "loading", "disabled", "active", "indicator"], outputs: ["clicked"] }, { kind: "component", type: RtIconComponent, selector: "rt-icon", inputs: ["name", "glyph", "size", "color", "fill", "spin", "rotate"] }, { kind: "component", type: RtToggleSwitchComponent, selector: "rt-toggle-switch", inputs: ["inputId", "ariaLabel", "label", "size", "iconOff", "iconOn", "disabled"] }, { kind: "directive", type:
362
+ // directives
363
+ BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ModDirective, selector: "[rtMod]" }, { kind: "directive", type: RtButtonDirective, selector: "button[rtButton], a[rtButton]", inputs: ["label", "icon", "iconPos", "theme", "appearance", "size", "loading", "loadingIcon", "loadingLabel", "pressed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
364
+ }
365
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListSettingsAsideComponent, decorators: [{
366
+ type: Component,
367
+ args: [{ selector: 'rt-data-list-settings-aside', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
368
+ // components
369
+ RtAsideComponent,
370
+ RtAsideFooterComponent,
371
+ RtAsideHeaderComponent,
372
+ RtIconButtonComponent,
373
+ RtIconComponent,
374
+ RtToggleSwitchComponent,
375
+ // directives
376
+ BlockDirective,
377
+ CdkDrag,
378
+ CdkDragHandle,
379
+ CdkDropList,
380
+ ElemDirective,
381
+ FormsModule,
382
+ ModDirective,
383
+ RtButtonDirective,
384
+ ], host: { class: BEM_BLOCK$1 }, template: "<rt-aside size=\"md\" [ariaLabel]=\"title()\">\n <!-- \u041F\u043E\u0434\u043F\u0438\u0441\u044C \u0441\u0442\u043E\u0438\u0442 \u0432 \u0448\u0430\u043F\u043A\u0435 \u043F\u043E\u0434 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u043C, \u043A\u0430\u043A \u0443 \u043F\u0430\u043D\u0435\u043B\u0438 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043A\u0438\u0442\u0430. -->\n <rt-aside-header [title]=\"title()\" [subtitle]=\"hint()\" />\n\n <ng-container rtBlock=\"rt-data-list-settings-aside\">\n <div rtElem=\"switches\">\n <div rtElem=\"switch-row\">\n <rt-toggle-switch\n qa-dataid=\"data-list-settings-vertical\"\n [ariaLabel]=\"verticalLabel()\"\n [ngModel]=\"isVerticalScrollbarShown()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"isVerticalScrollbarShown.set($event)\" />\n <span rtElem=\"switch-label\" qa-dataid=\"data-list-settings-vertical-label\" [rtMod]=\"{ on: isVerticalScrollbarShown() }\">\n {{ verticalLabel() }}\n </span>\n </div>\n\n <div rtElem=\"switch-row\">\n <rt-toggle-switch\n qa-dataid=\"data-list-settings-horizontal\"\n [ariaLabel]=\"horizontalLabel()\"\n [ngModel]=\"isHorizontalScrollbarShown()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"isHorizontalScrollbarShown.set($event)\" />\n <span rtElem=\"switch-label\" qa-dataid=\"data-list-settings-horizontal-label\" [rtMod]=\"{ on: isHorizontalScrollbarShown() }\">\n {{ horizontalLabel() }}\n </span>\n </div>\n </div>\n\n <!-- \u041A\u043E\u043B\u043E\u043D\u043A\u0438 \u2014 \u043F\u043B\u0430\u0448\u043A\u0430\u043C\u0438 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043A\u0438\u0442\u0430: \u0440\u0443\u0447\u043A\u0430 \u2725 \u0438 \u0447\u0435\u0440\u0442\u0430, \u0438\u043C\u044F, \u0447\u0435\u0440\u0442\u0430 \u0438 \u0433\u043B\u0430\u0437. \u041E\u0431\u0449\u0430\u044F \u043F\u0430\u043D\u0435\u043B\u044C\n \u043A\u043E\u043B\u043E\u043D\u043E\u043A \u043A\u0438\u0442\u0430 \u0440\u0438\u0441\u0443\u0435\u0442 \u0432\u0438\u0434 \u0432\u0442\u043E\u0440\u043E\u0433\u043E \u043A\u0438\u0442\u0430, \u0438 \u0435\u0451 \u0440\u0438\u0441\u0443\u0435\u0442 \u0435\u0433\u043E \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u0442\u0430\u0431\u043B\u0438\u0446\u0430. -->\n <ul rtElem=\"columns\" qa-dataid=\"data-list-settings-columns\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n @for (item of items(); track item.key) {\n <li\n rtElem=\"column\"\n qa-dataid=\"data-list-settings-column\"\n cdkDrag\n [cdkDragPreviewClass]=\"dragPreviewClass()\"\n [attr.data-key]=\"item.key\"\n [rtMod]=\"{ hidden: item.hidden, locked: item.locked === true }\"\n [cdkDragDisabled]=\"item.locked === true\">\n <button\n rtElem=\"handle\"\n qa-dataid=\"data-list-settings-drag\"\n type=\"button\"\n cdkDragHandle\n [disabled]=\"item.locked === true\"\n [attr.aria-label]=\"dragLabel()\">\n <rt-icon name=\"arrows\" size=\"sm\" />\n </button>\n\n <span rtElem=\"column-label\" qa-dataid=\"data-list-settings-column-label\">{{ item.label }}</span>\n\n <rt-icon-button\n rtElem=\"toggle\"\n qa-dataid=\"data-list-settings-toggle\"\n variant=\"ghost\"\n [icon]=\"item.hidden ? 'eye-slash' : 'eye'\"\n [ariaLabel]=\"item.hidden ? showColumnLabel() : hideColumnLabel()\"\n [tooltip]=\"item.hidden ? showLabel() : hideLabel()\"\n [disabled]=\"item.locked === true\"\n (clicked)=\"onToggleHidden(item.key)\" />\n </li>\n }\n </ul>\n </ng-container>\n\n <!-- \u0411\u043B\u043E\u043A \u0441\u0442\u043E\u0438\u0442 \u043D\u0430\u0434 \u043F\u043E\u0434\u0432\u0430\u043B\u043E\u043C, \u0447\u0442\u043E\u0431\u044B \u043A\u043D\u043E\u043F\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u0432\u0437\u044F\u043B\u0430 \u0441\u0432\u043E\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442: \u043F\u043E\u0434\u043F\u0438\u0441\u044C \u043F\u0440\u043E\u043F\u0438\u0441\u043D\u044B\u043C\u0438,\n \u043A\u0430\u043A \u0432 \u043F\u043E\u0434\u0432\u0430\u043B\u0435 \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u043A\u0438\u0442\u0430. -->\n <ng-container rtBlock=\"rt-data-list-settings-aside\" ngProjectAs=\"rt-aside-footer\">\n <rt-aside-footer>\n <!-- \u041F\u043E\u0434\u043F\u0438\u0441\u044C \u043A\u043D\u043E\u043F\u043A\u0435 \u0440\u0438\u0441\u0443\u0435\u0442 \u0434\u0438\u0440\u0435\u043A\u0442\u0438\u0432\u0430 \u043A\u0438\u0442\u0430, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0442\u0435\u043B\u043E \u043F\u0443\u0441\u0442\u043E\u0435. -->\n <button\n rtButton\n asideDismiss\n type=\"button\"\n appearance=\"text\"\n qa-dataid=\"data-list-settings-cancel\"\n [label]=\"cancelLabel()\"\n (click)=\"onCancel()\">\n <!-- empty: label is drawn by the directive -->\n </button>\n\n <button\n rtButton\n rtElem=\"save\"\n asidePrimary\n type=\"button\"\n qa-dataid=\"data-list-settings-save\"\n [label]=\"saveLabel()\"\n [disabled]=\"!isChanged()\"\n (click)=\"onSave()\">\n <!-- empty: label is drawn by the directive -->\n </button>\n </rt-aside-footer>\n </ng-container>\n</rt-aside>\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-data-list-settings-aside{display:flex;flex-direction:column;gap:var(--rt-space-md)}.rt-data-list-settings-aside__switches{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-data-list-settings-aside__switch-row{display:flex;align-items:center;gap:var(--rt-space-md)}.rt-data-list-settings-aside__switch-label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm)}.rt-data-list-settings-aside__save{text-transform:uppercase}.rt-data-list-settings-aside__columns{display:flex;flex-direction:column;padding:0;margin:0;gap:var(--rt-space-sm);list-style:none}.rt-data-list-settings-aside__column{--rt-data-list-settings-aside-radius: var(--rt-radius-md);--rt-data-list-settings-aside-divider-width: var(--rt-border-width-thin);--rt-data-list-settings-aside-drag-shadow: var(--rt-shadow-lg);--rt-data-list-settings-aside-drag-duration: var(--rt-duration-base);--rt-data-list-settings-aside-padding-start: 0;--rt-data-list-settings-aside-padding-end: var(--rt-space-sm);--rt-data-list-settings-aside-color: var(--rt-color-text-primary);display:flex;align-items:center;border-radius:var(--rt-data-list-settings-aside-radius);background-color:var(--rt-list-settings-item-bg);color:var(--rt-data-list-settings-aside-color);gap:var(--rt-space-sm);padding-inline:var(--rt-data-list-settings-aside-padding-start) var(--rt-data-list-settings-aside-padding-end)}.rt-data-list-settings-aside__column--hidden{--rt-data-list-settings-aside-color: var(--rt-color-text-muted)}.rt-data-list-settings-aside__column.cdk-drag-preview{box-sizing:border-box;box-shadow:var(--rt-data-list-settings-aside-drag-shadow)}.rt-data-list-settings-aside__column.cdk-drag-placeholder{opacity:0}.rt-data-list-settings-aside__column.cdk-drag-animating{transition:transform var(--rt-data-list-settings-aside-drag-duration) ease-out}.rt-data-list-settings-aside__columns.cdk-drop-list-dragging .rt-data-list-settings-aside__column:not(.cdk-drag-placeholder){transition:transform var(--rt-data-list-settings-aside-drag-duration) ease-out}.rt-data-list-settings-aside__handle{display:inline-flex;align-items:center;align-self:stretch;justify-content:center;padding:0 var(--rt-space-sm);border:none;border-right:var(--rt-data-list-settings-aside-divider-width) solid var(--rt-color-border-subtle);background:transparent;color:inherit;cursor:grab}.rt-data-list-settings-aside__handle:disabled{cursor:default}.rt-data-list-settings-aside__column-label{overflow:hidden;min-width:0;flex:1 1 auto;font-size:var(--rt-text-sm);text-overflow:ellipsis;white-space:nowrap}.rt-data-list-settings-aside__toggle{border-left:var(--rt-data-list-settings-aside-divider-width) solid var(--rt-color-border-subtle);padding-inline-start:var(--rt-space-sm)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside{--rt-aside-inset: var(--rt-space-xl);--rt-aside-content-gap: var(--rt-space-xl);--rt-data-list-settings-aside-control-size: 36px;--rt-data-list-settings-aside-back-icon-size: 24px;--rt-data-list-settings-aside-header-height: 96px}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-header{--rt-aside-header-title-size: var(--rt-text-2xl);--rt-aside-header-title-weight: var(--rt-font-weight-semibold);--rt-aside-header-subtitle-size: var(--rt-text-md);--rt-aside-header-gap: var(--rt-space-md);--rt-aside-header-min-height: var(--rt-data-list-settings-aside-header-height)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-header__back .rt-icon-button{--rt-icon-button-size-step: var(--rt-data-list-settings-aside-control-size);--rt-icon-button-color: var(--rt-list-settings-icon-color);--rt-icon-button-radius: var(--rt-radius-full)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-header__back .rt-icon{min-width:var(--rt-data-list-settings-aside-back-icon-size);min-height:var(--rt-data-list-settings-aside-back-icon-size)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-footer{--rt-aside-footer-border-width: 0}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-footer__content{justify-content:flex-end;gap:var(--rt-space-md)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-footer .rt-button{--rt-btn-height: var(--rt-data-list-settings-aside-control-size);--rt-btn-radius: var(--rt-radius-full);--rt-btn-padding: 0 var(--rt-space-6);--rt-btn-font-size: var(--rt-text-sm)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-aside-footer .rt-button--text{--rt-btn-padding: 0 var(--rt-space-sm)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-toggle-switch{--rt-toggle-track-width: 48px;--rt-toggle-track-height: 24px;--rt-toggle-thumb-size: 20px;--rt-toggle-thumb-inset: 2px;--rt-toggle-thumb-travel: 24px}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-data-list-settings-aside__switches{gap:var(--rt-space-xl)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-data-list-settings-aside__switch-label{color:var(--rt-color-text-muted)}:is(.rt-preset-material,[data-preset=material]) .rt-data-list-settings-aside .rt-data-list-settings-aside__switch-label--on{color:var(--rt-color-text-primary)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *){--rt-data-list-settings-aside-radius: var(--rt-list-settings-item-radius);--rt-data-list-settings-aside-drag-shadow: var(--rt-shadow-xl);--rt-data-list-settings-aside-column-height: 48px;--rt-data-list-settings-aside-control-size: 36px;--rt-data-list-settings-aside-icon-size: 18px;--rt-data-list-settings-aside-padding-start: var(--rt-space-xs);--rt-data-list-settings-aside-padding-end: var(--rt-space-xs);--rt-data-list-settings-aside-color: var(--rt-color-text-primary);min-height:var(--rt-data-list-settings-aside-column-height);font-size:var(--rt-text-md)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__handle{min-width:calc(var(--rt-data-list-settings-aside-control-size) + 2 * var(--rt-space-xs));height:var(--rt-data-list-settings-aside-control-size);align-self:center;padding:0 var(--rt-space-xs);border-right-color:var(--rt-color-border-strong);color:var(--rt-list-settings-icon-color);margin-inline-end:var(--rt-space-xs)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__handle .rt-icon{min-width:var(--rt-data-list-settings-aside-icon-size);min-height:var(--rt-data-list-settings-aside-icon-size)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__column-label{font-size:var(--rt-text-md)}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__toggle{border-left:none;padding-inline-start:0}.rt-data-list-settings-aside__column:is(.rt-preset-material,.rt-preset-material *,[data-preset=material] *) .rt-data-list-settings-aside__toggle .rt-icon-button{--rt-icon-button-size-step: var(--rt-data-list-settings-aside-control-size);--rt-icon-button-color: var(--rt-list-settings-icon-color)}}.rt-data-list-settings-aside__column.cdk-drag-preview{background-color:var(--rt-list-settings-item-bg);color:var(--rt-data-list-settings-aside-color);padding-inline:var(--rt-data-list-settings-aside-padding-start) var(--rt-data-list-settings-aside-padding-end)}\n"] }]
385
+ }], ctorParameters: () => [] });
386
+
387
+ /** Отметки и исключения после смены страницы: пришедшие строки отмечаются, кроме исключённых. */
388
+ function dataListSelectedAfterPage(selected, page, excluded, keyExp) {
389
+ const excludedKeys = excluded.map((entity) => entity[keyExp]);
390
+ return dataTableWithPageEntities(selected, page, keyExp).filter((entity) => !excludedKeys.includes(entity[keyExp]));
391
+ }
392
+ /** Исключения после отметки или снятия одной записи под «отметить все». */
393
+ function dataListExcludedAfterEntity(excluded, entity, checked, keyExp) {
394
+ return dataTableWithEntity(excluded, entity, !checked, keyExp);
395
+ }
396
+ /** Исключения после отметки всей страницы под «отметить все»: её записи уходят из исключений. */
397
+ function dataListExcludedAfterPageMarked(excluded, page, keyExp) {
398
+ return dataTableWithoutPageEntities(excluded, page, keyExp);
399
+ }
400
+ /** Исключения после снятия всей страницы под «отметить все»: её записи становятся исключениями. */
401
+ function dataListExcludedAfterPageUnmarked(excluded, page, keyExp) {
402
+ return dataTableWithPageEntities(excluded, page, keyExp);
403
+ }
404
+
405
+ /** Шаблоны пользовательских ячеек списка: они уезжают в его таблицу. */
406
+ class RtDataListCustomCellsDirective {
407
+ constructor() {
408
+ this.cellsTemplates = input.required({ ...(ngDevMode ? { debugName: "cellsTemplates" } : /* istanbul ignore next */ {}), alias: 'rtDataListCustomCells' });
409
+ }
410
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListCustomCellsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
411
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtDataListCustomCellsDirective, isStandalone: true, selector: "[rtDataListCustomCells]", inputs: { cellsTemplates: { classPropertyName: "cellsTemplates", publicName: "rtDataListCustomCells", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
412
+ }
413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListCustomCellsDirective, decorators: [{
414
+ type: Directive,
415
+ args: [{
416
+ selector: '[rtDataListCustomCells]',
417
+ }]
418
+ }], propDecorators: { cellsTemplates: [{ type: i0.Input, args: [{ isSignal: true, alias: "rtDataListCustomCells", required: true }] }] } });
419
+ /** Пункты меню строки списка. */
420
+ class RtDataListRowActionsDirective {
421
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListRowActionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
422
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtDataListRowActionsDirective, isStandalone: true, selector: "[rtDataListRowActions]", ngImport: i0 }); }
423
+ }
424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListRowActionsDirective, decorators: [{
425
+ type: Directive,
426
+ args: [{
427
+ selector: '[rtDataListRowActions]',
428
+ }]
429
+ }] });
430
+ /** Действия строки рядом с кнопкой меню. */
431
+ class RtDataListAdditionalRowActionsDirective {
432
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListAdditionalRowActionsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
433
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.6", type: RtDataListAdditionalRowActionsDirective, isStandalone: true, selector: "[rtDataListAdditionalRowActions]", ngImport: i0 }); }
434
+ }
435
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListAdditionalRowActionsDirective, decorators: [{
436
+ type: Directive,
437
+ args: [{
438
+ selector: '[rtDataListAdditionalRowActions]',
439
+ }]
440
+ }] });
441
+
442
+ function dataListScrollbarStandard(isVerticalShown, isHorizontalShown) {
443
+ if (isVerticalShown && isHorizontalShown) {
444
+ return { width: null, color: null };
445
+ }
446
+ if (!isVerticalShown && !isHorizontalShown) {
447
+ return { width: 'none', color: null };
448
+ }
449
+ return { width: 'auto', color: 'auto' };
450
+ }
451
+
452
+ const BEM_BLOCK = 'rt-data-list';
453
+ /** Показанная полоса прокрутки — ступень размеров кита, та же, что в основе его полос. */
454
+ const SCROLLBAR_SIZE = 'var(--rt-size-3)';
455
+ /** Скрытая полоса — нулевой размер: прокрутка остаётся, видно её не будет. */
456
+ const SCROLLBAR_HIDDEN = '0';
457
+ /** Свойства полос прокрутки, которые список ставит на корень страницы и снимает, уходя. */
458
+ const SCROLLBAR_PROPERTIES = [
459
+ '--rt-data-table-scrollbar-vertical-width',
460
+ '--rt-data-table-scrollbar-horizontal-height',
461
+ '--rt-data-table-scrollbar-width',
462
+ '--rt-data-table-scrollbar-color',
463
+ ];
464
+ /** Сколько живых списков держат полосы на корне каждой страницы: снимает их только последний. */
465
+ const SCROLLBAR_HOLDERS = new WeakMap();
466
+ /**
467
+ * Список записей первого кита во втором: панель действий, таблица, полоса страниц, заглушка
468
+ * пустого списка и вид загрузки.
469
+ *
470
+ * Своего состояния список не ведёт вовсе: страницу, порядок, условия отбора и поиск он просит у
471
+ * приложения. Службу настроек колонок объявляет и наполняет само приложение — список её только
472
+ * читает и пишет в неё сохранённое панелью, которую поднимает службой боковых панелей кита.
473
+ */
474
+ class RtDataListComponent {
475
+ #destroyRef;
476
+ #asideService;
477
+ /* Вид считается из настроек при объявлении входа: вход в разметке по-прежнему перебивает всё. */
478
+ #look;
479
+ #appearance;
480
+ #filterAppearance;
481
+ #configService;
482
+ #pageRoot;
483
+ /**
484
+ * Нажатия на «настроить колонки». Панель открывается объявленным потоком, а `exhaustMap`
485
+ * держит одну открытую: второе нажатие при открытой панели открывать нечего — приём первого
486
+ * кита, там иначе настройку сохраняла та панель, что закрылась последней.
487
+ */
488
+ #openSettingsSource;
489
+ constructor() {
490
+ this.#destroyRef = inject(DestroyRef);
491
+ this.#asideService = inject(RtAsideService);
492
+ /* Вид считается из настроек при объявлении входа: вход в разметке по-прежнему перебивает всё. */
493
+ this.#look = rtKitDefault('dataTable', (it) => it.look, 'material');
494
+ this.#appearance = rtKitDefault('dataList', (it) => it.appearance, 'fill');
495
+ this.#filterAppearance = rtKitDefault('dataList', (it) => it.filterAppearance, 'outline');
496
+ this.#configService = inject(RtDataTableConfigService);
497
+ this.#pageRoot = inject(DOCUMENT).documentElement;
498
+ /**
499
+ * Нажатия на «настроить колонки». Панель открывается объявленным потоком, а `exhaustMap`
500
+ * держит одну открытую: второе нажатие при открытой панели открывать нечего — приём первого
501
+ * кита, там иначе настройку сохраняла та панель, что закрылась последней.
502
+ */
503
+ this.#openSettingsSource = new Subject();
504
+ this.placeholderLabel = rtKitLabel('dataListPlaceholder');
505
+ /** Заглушку показывают, когда нет ни строк, ни условий отбора. */
506
+ this.isPlaceholderShown = computed(() => !this.entities().length && !this.filterModel().length, /* @ts-ignore */
507
+ ...(ngDevMode ? [{ debugName: "isPlaceholderShown" }] : /* istanbul ignore next */ []));
508
+ this.isFiltersEmpty = computed(() => !this.filterModel().length, /* @ts-ignore */
509
+ ...(ngDevMode ? [{ debugName: "isFiltersEmpty" }] : /* istanbul ignore next */ []));
510
+ /** Размеры страницы, которые предлагает полоса: те же, что у первого кита. */
511
+ this.pageSizes = computed(() => dataListPageSizes(this.pageModel()), /* @ts-ignore */
512
+ ...(ngDevMode ? [{ debugName: "pageSizes" }] : /* istanbul ignore next */ []));
513
+ /**
514
+ * Вид семьи. Материальный набор стоит на самом узле, а не на странице: семья выглядит как первый
515
+ * кит, где бы её ни поставили, и соседи на странице своего вида не теряют.
516
+ */
517
+ this.look = input(this.#look, /* @ts-ignore */
518
+ ...(ngDevMode ? [{ debugName: "look" }] : /* istanbul ignore next */ []));
519
+ /** Вид поля поиска, как `appearance` списка первого кита; умолчание берётся из настроек кита. */
520
+ this.appearance = input(this.#appearance, /* @ts-ignore */
521
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
522
+ /**
523
+ * Вид полей отбора: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. От
524
+ * `appearance` он не зависит: у первого кита поля отбора обведены, какой бы ни был поиск.
525
+ */
526
+ this.filterAppearance = input(this.#filterAppearance, /* @ts-ignore */
527
+ ...(ngDevMode ? [{ debugName: "filterAppearance" }] : /* istanbul ignore next */ []));
528
+ /** Контурные значки кнопок полосы: очистки отбора, обновления и настройки колонок, как у первого кита. */
529
+ this.isToolbarActionsIconsOutlined = input(true, { ...(ngDevMode ? { debugName: "isToolbarActionsIconsOutlined" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
530
+ this.tableConfigStorageKey = input.required(/* @ts-ignore */
531
+ ...(ngDevMode ? [{ debugName: "tableConfigStorageKey" }] : /* istanbul ignore next */ []));
532
+ this.entities = input.required({ ...(ngDevMode ? { debugName: "entities" } : /* istanbul ignore next */ {}), transform: transformArrayInput });
533
+ this.pageModel = input.required(/* @ts-ignore */
534
+ ...(ngDevMode ? [{ debugName: "pageModel" }] : /* istanbul ignore next */ []));
535
+ this.currentSortModel = input.required(/* @ts-ignore */
536
+ ...(ngDevMode ? [{ debugName: "currentSortModel" }] : /* istanbul ignore next */ []));
537
+ this.searchTerm = input('', /* @ts-ignore */
538
+ ...(ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []));
539
+ /** Условия отбора: их ключ — имя свойства колонки, а не ключ записи, как и у таблицы. */
540
+ this.filterModel = input([], { ...(ngDevMode ? { debugName: "filterModel" } : /* istanbul ignore next */ {}), transform: transformArrayInput });
541
+ this.keyExp = input('id', /* @ts-ignore */
542
+ ...(ngDevMode ? [{ debugName: "keyExp" }] : /* istanbul ignore next */ []));
543
+ /** Первая загрузка: вместо списка крутилка. */
544
+ this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
545
+ /** Дозагрузка: строки остаются, а поверх них крутилка с подложкой. */
546
+ this.fetching = input(false, { ...(ngDevMode ? { debugName: "fetching" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
547
+ this.isTableRowsClickable = input(false, { ...(ngDevMode ? { debugName: "isTableRowsClickable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
548
+ this.isFiltersShown = input(false, { ...(ngDevMode ? { debugName: "isFiltersShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
549
+ this.isRefreshButtonShown = input(true, { ...(ngDevMode ? { debugName: "isRefreshButtonShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
550
+ this.isTableConfigButtonShown = input(true, { ...(ngDevMode ? { debugName: "isTableConfigButtonShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
551
+ /**
552
+ * Признак полосы страниц: выключенный убирает полосу из разметки, включённый оставляет её
553
+ * правилам самой полосы. Первый кит признак принимал и никуда не передавал.
554
+ */
555
+ this.isPaginationShown = input(true, { ...(ngDevMode ? { debugName: "isPaginationShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
556
+ this.sortChange = output();
557
+ this.filterChange = output();
558
+ this.pageModelChange = output();
559
+ this.searchChange = output();
560
+ this.refresh = output();
561
+ this.clearFiltersAction = output();
562
+ this.rowClick = output();
563
+ this.rowDoubleClick = output();
564
+ this.toolbarSelectorsTpl = contentChild(RtDataListToolbarSelectorsDirective, { ...(ngDevMode ? { debugName: "toolbarSelectorsTpl" } : /* istanbul ignore next */ {}), read: TemplateRef });
565
+ this.toolbarActionsTpl = contentChild(RtDataListToolbarActionsDirective, { ...(ngDevMode ? { debugName: "toolbarActionsTpl" } : /* istanbul ignore next */ {}), read: TemplateRef });
566
+ this.customCellsTpl = contentChild(RtDataListCustomCellsDirective, /* @ts-ignore */
567
+ ...(ngDevMode ? [{ debugName: "customCellsTpl" }] : /* istanbul ignore next */ []));
568
+ this.rowActionsTpl = contentChild(RtDataListRowActionsDirective, { ...(ngDevMode ? { debugName: "rowActionsTpl" } : /* istanbul ignore next */ {}), read: TemplateRef });
569
+ this.additionalRowActionsTpl = contentChild(RtDataListAdditionalRowActionsDirective, { ...(ngDevMode ? { debugName: "additionalRowActionsTpl" } : /* istanbul ignore next */ {}), read: TemplateRef });
570
+ /**
571
+ * Шаблон значка приложения — он уезжает в таблицу списка.
572
+ *
573
+ * Родовой тип здесь по умолчанию, а не тип записи списка, и это не упрощение: шаблон-посредник
574
+ * внутри разметки объявлен той же директивой, а родового довода разметка ей не даёт — она
575
+ * ставит его по умолчанию. Объявленное здесь по типу записи расходится с ним, и сборка
576
+ * библиотеки отказывает на выводе шаблона. Приложение своего значка не теряет: его собственный
577
+ * шаблон объявлен той же директивой и тем же умолчанием.
578
+ */
579
+ this.iconTpl = contentChild(RtDataTableIconDirective, /* @ts-ignore */
580
+ ...(ngDevMode ? [{ debugName: "iconTpl" }] : /* istanbul ignore next */ []));
581
+ /** Панель действий и таблица: их состояние ставит директива выбора списка. */
582
+ this.toolbarRef = viewChild(RtDataListToolbarComponent, /* @ts-ignore */
583
+ ...(ngDevMode ? [{ debugName: "toolbarRef" }] : /* istanbul ignore next */ []));
584
+ this.tableRef = viewChild(RtDataTableComponent, /* @ts-ignore */
585
+ ...(ngDevMode ? [{ debugName: "tableRef" }] : /* istanbul ignore next */ []));
586
+ /* Размер полос прокрутки ставится на корень страницы, а не на список: приём первого
587
+ кита — выбор, сохранённый одним списком, достаётся каждому списку страницы. Скрытая
588
+ полоса — это нулевой размер, а не запрет прокрутки: содержимое по-прежнему ездит. */
589
+ effect(() => {
590
+ const config = this.#configService.tableConfig();
591
+ this.#pageRoot.style.setProperty('--rt-data-table-scrollbar-vertical-width', config.isVerticalScrollbarShown ? SCROLLBAR_SIZE : SCROLLBAR_HIDDEN);
592
+ this.#pageRoot.style.setProperty('--rt-data-table-scrollbar-horizontal-height', config.isHorizontalScrollbarShown ? SCROLLBAR_SIZE : SCROLLBAR_HIDDEN);
593
+ const standard = dataListScrollbarStandard(config.isVerticalScrollbarShown, config.isHorizontalScrollbarShown);
594
+ this.#setOrRemove('--rt-data-table-scrollbar-width', standard.width);
595
+ this.#setOrRemove('--rt-data-table-scrollbar-color', standard.color);
596
+ });
597
+ /* Последний ушедший список уносит выбор с корня: иначе полосы, скрытые настройкой списка,
598
+ оставались бы скрытыми у каждой таблицы страницы и после него. Пока на странице живёт
599
+ другой список, свойства остаются — они общие для всех списков страницы. */
600
+ SCROLLBAR_HOLDERS.set(this.#pageRoot, (SCROLLBAR_HOLDERS.get(this.#pageRoot) ?? 0) + 1);
601
+ this.#destroyRef.onDestroy(() => {
602
+ const left = (SCROLLBAR_HOLDERS.get(this.#pageRoot) ?? 1) - 1;
603
+ SCROLLBAR_HOLDERS.set(this.#pageRoot, left);
604
+ if (left > 0) {
605
+ return;
606
+ }
607
+ SCROLLBAR_PROPERTIES.forEach((property) => {
608
+ this.#pageRoot.style.removeProperty(property);
609
+ });
610
+ });
611
+ this.#openSettingsSource
612
+ .pipe(exhaustMap(() => this.#asideService
613
+ .open(RtDataListSettingsAsideComponent, {
614
+ data: this.#configService.tableConfig(),
615
+ position: 'right',
616
+ // Панель и подложка под ней живут поверх страницы, вне списка, и вид списка
617
+ // до них сам не доходит: класс набора они получают от того, кто их открыл.
618
+ panelClass: this.look() === 'material' ? RT_PRESET_MATERIAL_CLASS : [],
619
+ backdropClass: this.look() === 'material' ? ['rt-aside-backdrop', RT_PRESET_MATERIAL_CLASS] : 'rt-aside-backdrop',
620
+ })
621
+ .afterClosed()), filter(Boolean), takeUntilDestroyed(this.#destroyRef))
622
+ .subscribe((config) => {
623
+ this.#configService.updateConfig(this.tableConfigStorageKey(), config);
624
+ });
625
+ }
626
+ onOpenSettings() {
627
+ this.#openSettingsSource.next();
628
+ }
629
+ onSortChange(sortModel) {
630
+ this.sortChange.emit(sortModel);
631
+ }
632
+ onFilterChange(filterModel) {
633
+ this.filterChange.emit(filterModel);
634
+ }
635
+ onPageNumber(pageNumber) {
636
+ this.pageModelChange.emit({ pageNumber });
637
+ }
638
+ /** Новый размер страницы: человек остаётся на том же расстоянии от конца списка, как в первом ките. */
639
+ onPageSize(pageSize) {
640
+ this.pageModelChange.emit(dataListPageAfterSizeChange(this.pageModel(), pageSize));
641
+ }
642
+ onSearchChange(search) {
643
+ this.searchChange.emit(search);
644
+ }
645
+ onRefresh() {
646
+ this.refresh.emit();
647
+ }
648
+ onClearFilters() {
649
+ this.clearFiltersAction.emit();
650
+ }
651
+ onRowClick(event) {
652
+ this.rowClick.emit(event);
653
+ }
654
+ onRowDoubleClick(row) {
655
+ this.rowDoubleClick.emit(row);
656
+ }
657
+ #setOrRemove(property, value) {
658
+ if (value === null) {
659
+ this.#pageRoot.style.removeProperty(property);
660
+ return;
661
+ }
662
+ this.#pageRoot.style.setProperty(property, value);
663
+ }
664
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
665
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RtDataListComponent, isStandalone: true, selector: "rt-data-list", inputs: { look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, filterAppearance: { classPropertyName: "filterAppearance", publicName: "filterAppearance", isSignal: true, isRequired: false, transformFunction: null }, isToolbarActionsIconsOutlined: { classPropertyName: "isToolbarActionsIconsOutlined", publicName: "isToolbarActionsIconsOutlined", isSignal: true, isRequired: false, transformFunction: null }, tableConfigStorageKey: { classPropertyName: "tableConfigStorageKey", publicName: "tableConfigStorageKey", isSignal: true, isRequired: true, transformFunction: null }, entities: { classPropertyName: "entities", publicName: "entities", isSignal: true, isRequired: true, transformFunction: null }, pageModel: { classPropertyName: "pageModel", publicName: "pageModel", isSignal: true, isRequired: true, transformFunction: null }, currentSortModel: { classPropertyName: "currentSortModel", publicName: "currentSortModel", isSignal: true, isRequired: true, transformFunction: null }, searchTerm: { classPropertyName: "searchTerm", publicName: "searchTerm", isSignal: true, isRequired: false, transformFunction: null }, filterModel: { classPropertyName: "filterModel", publicName: "filterModel", isSignal: true, isRequired: false, transformFunction: null }, keyExp: { classPropertyName: "keyExp", publicName: "keyExp", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, fetching: { classPropertyName: "fetching", publicName: "fetching", isSignal: true, isRequired: false, transformFunction: null }, isTableRowsClickable: { classPropertyName: "isTableRowsClickable", publicName: "isTableRowsClickable", isSignal: true, isRequired: false, transformFunction: null }, isFiltersShown: { classPropertyName: "isFiltersShown", publicName: "isFiltersShown", isSignal: true, isRequired: false, transformFunction: null }, isRefreshButtonShown: { classPropertyName: "isRefreshButtonShown", publicName: "isRefreshButtonShown", isSignal: true, isRequired: false, transformFunction: null }, isTableConfigButtonShown: { classPropertyName: "isTableConfigButtonShown", publicName: "isTableConfigButtonShown", isSignal: true, isRequired: false, transformFunction: null }, isPaginationShown: { classPropertyName: "isPaginationShown", publicName: "isPaginationShown", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sortChange: "sortChange", filterChange: "filterChange", pageModelChange: "pageModelChange", searchChange: "searchChange", refresh: "refresh", clearFiltersAction: "clearFiltersAction", rowClick: "rowClick", rowDoubleClick: "rowDoubleClick" }, host: { properties: { "class.rt-preset-material": "look() === 'material'" }, classAttribute: "rt-data-list" }, providers: [{ provide: RT_DATA_TABLE_PRESET_FROM_HOST, useValue: true }], queries: [{ propertyName: "toolbarSelectorsTpl", first: true, predicate: RtDataListToolbarSelectorsDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "toolbarActionsTpl", first: true, predicate: RtDataListToolbarActionsDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "customCellsTpl", first: true, predicate: RtDataListCustomCellsDirective, descendants: true, isSignal: true }, { propertyName: "rowActionsTpl", first: true, predicate: RtDataListRowActionsDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "additionalRowActionsTpl", first: true, predicate: RtDataListAdditionalRowActionsDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "iconTpl", first: true, predicate: RtDataTableIconDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "toolbarRef", first: true, predicate: RtDataListToolbarComponent, descendants: true, isSignal: true }, { propertyName: "tableRef", first: true, predicate: RtDataTableComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (loading()) {\n <div rtBlock=\"rt-data-list\" rtElem=\"loading\" qa-dataid=\"data-list-loading\">\n <rt-spinner />\n </div>\n} @else {\n <ng-container rtBlock=\"rt-data-list\">\n @if (fetching()) {\n <div rtElem=\"fetching\" qa-dataid=\"data-list-fetching\">\n <rt-spinner />\n </div>\n }\n\n <rt-data-list-toolbar\n [isFiltersShown]=\"isFiltersShown()\"\n [isFiltersEmpty]=\"isFiltersEmpty()\"\n [isRefreshButtonShown]=\"isRefreshButtonShown()\"\n [isTableConfigButtonShown]=\"isTableConfigButtonShown()\"\n [isPlaceholderShown]=\"isPlaceholderShown()\"\n [searchTerm]=\"searchTerm()\"\n [searchAppearance]=\"appearance()\"\n [isToolbarActionsIconsOutlined]=\"isToolbarActionsIconsOutlined()\"\n (searchChange)=\"onSearchChange($event)\"\n (refreshAction)=\"onRefresh()\"\n (clearFiltersAction)=\"onClearFilters()\"\n (openConfigAction)=\"onOpenSettings()\">\n @if (toolbarSelectorsTpl(); as selectors) {\n <ng-container *rtDataListToolbarSelectors>\n <ng-container [ngTemplateOutlet]=\"selectors\" />\n </ng-container>\n }\n\n @if (toolbarActionsTpl(); as actions) {\n <ng-container *rtDataListToolbarActions>\n <ng-container [ngTemplateOutlet]=\"actions\" />\n </ng-container>\n }\n </rt-data-list-toolbar>\n\n @if (isPlaceholderShown()) {\n <div rtElem=\"placeholder\" qa-dataid=\"data-list-placeholder\">\n <rt-empty-state icon=\"search\" [title]=\"placeholderLabel()\" />\n </div>\n } @else {\n <div rtElem=\"content\">\n <rt-data-table\n [look]=\"look()\"\n [keyExp]=\"keyExp()\"\n [entities]=\"entities()\"\n [currentSortModel]=\"currentSortModel()\"\n [filterModel]=\"filterModel()\"\n [isFiltersShown]=\"isFiltersShown()\"\n [isTableRowsClickable]=\"isTableRowsClickable()\"\n [filterAppearance]=\"filterAppearance()\"\n (sortChange)=\"onSortChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (rowClick)=\"onRowClick($event)\"\n (rowDoubleClick)=\"onRowDoubleClick($event)\">\n @if (customCellsTpl(); as cells) {\n <ng-container [rtDataTableCustomCells]=\"cells.cellsTemplates()\" />\n }\n\n @if (rowActionsTpl(); as actions) {\n <ng-template rtDataTableRowActions let-row>\n <ng-container [ngTemplateOutlet]=\"actions\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </ng-template>\n }\n\n @if (additionalRowActionsTpl(); as additional) {\n <ng-template rtDataTableAdditionalRowActions let-row>\n <ng-container [ngTemplateOutlet]=\"additional\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </ng-template>\n }\n\n @if (iconTpl(); as icon) {\n <ng-template rtDataTableIcon let-name let-column=\"column\" let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"icon.template\"\n [ngTemplateOutletContext]=\"{ $implicit: name, column: column, row: row }\" />\n </ng-template>\n }\n </rt-data-table>\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n [pageModel]=\"pageModel()\"\n [perPageOptions]=\"pageSizes()\"\n [numbering]=\"look() === 'material' ? 'seven' : 'neighbours'\"\n [prevIcon]=\"look() === 'material' ? 'arrow-left' : 'chevron-left'\"\n [nextIcon]=\"look() === 'material' ? 'arrow-right' : 'chevron-right'\"\n (pageChange)=\"onPageNumber($event)\"\n (perPageChange)=\"onPageSize($event)\" />\n }\n }\n </ng-container>\n}\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-data-list{position:relative;display:flex;width:100%;height:100%;min-height:0;flex-direction:column}.rt-data-list__loading,.rt-data-list__placeholder{display:flex;min-height:var(--rt-list-placeholder-min-height);flex-grow:var(--rt-list-placeholder-grow);align-items:center;justify-content:center}.rt-data-list__placeholder .rt-empty-state{--rt-empty-state-icon-wrap-size: var(--rt-list-empty-icon-wrap-size);--rt-empty-state-icon-wrap-bg: var(--rt-list-empty-icon-wrap-bg);--rt-empty-state-icon-size: var(--rt-list-empty-icon-size);--rt-empty-state-title-size: var(--rt-list-empty-title-size);--rt-empty-state-title-weight: var(--rt-list-empty-title-weight)}.rt-data-list__fetching{position:absolute;z-index:var(--rt-z-sticky);display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-color-bg-page) 60%,transparent);inset:0}.rt-data-list__content{display:flex;overflow:hidden;min-height:0;flex-direction:column;flex-grow:1;isolation:isolate}}\n"], dependencies: [{ kind: "component", type:
666
+ // components
667
+ RtPaginationComponent, selector: "rt-pagination", inputs: ["pageModel", "perPageOptions", "prevIcon", "nextIcon", "numbering", "loading"], outputs: ["pageChange", "perPageChange"] }, { kind: "component", type: RtDataListToolbarComponent, selector: "rt-data-list-toolbar", inputs: ["searchAppearance", "isFiltersShown", "isFiltersEmpty", "isRefreshButtonShown", "isTableConfigButtonShown", "isPlaceholderShown", "isToolbarActionsIconsOutlined", "searchTerm"], outputs: ["searchChange", "refreshAction", "clearFiltersAction", "openConfigAction"] }, { kind: "component", type: RtDataTableComponent, selector: "rt-data-table", inputs: ["look", "filterAppearance", "isTableRowsClickable", "keyExp", "entities", "currentSortModel", "filterModel", "isFiltersShown"], outputs: ["rowClick", "rowDoubleClick", "sortChange", "filterChange"] }, { kind: "component", type: RtEmptyStateComponent, selector: "rt-empty-state", inputs: ["icon", "glyph", "title", "description", "framed"] }, { kind: "component", type: RtSpinnerComponent, selector: "rt-spinner", inputs: ["diameter", "color", "appearance", "overlay", "backdrop", "plate"] }, { kind: "directive", type:
668
+ // directives
669
+ BlockDirective, selector: "[rtBlock]", inputs: ["rtMod"] }, { kind: "directive", type: ElemDirective, selector: "[rtElem]", inputs: ["rtMod"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RtDataListToolbarActionsDirective, selector: "[rtDataListToolbarActions]" }, { kind: "directive", type: RtDataListToolbarSelectorsDirective, selector: "[rtDataListToolbarSelectors]" }, { kind: "directive", type: RtDataTableAdditionalRowActionsDirective, selector: "[rtDataTableAdditionalRowActions]" }, { kind: "directive", type: RtDataTableCustomCellsDirective, selector: "[rtDataTableCustomCells]", inputs: ["rtDataTableCustomCells"] }, { kind: "directive", type: RtDataTableIconDirective, selector: "ng-template[rtDataTableIcon]", exportAs: ["rtDataTableIcon"] }, { kind: "directive", type: RtDataTableRowActionsDirective, selector: "[rtDataTableRowActions]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
670
+ }
671
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListComponent, decorators: [{
672
+ type: Component,
673
+ args: [{ selector: 'rt-data-list', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
674
+ // components
675
+ RtPaginationComponent,
676
+ RtDataListToolbarComponent,
677
+ RtDataTableComponent,
678
+ RtEmptyStateComponent,
679
+ RtSpinnerComponent,
680
+ // directives
681
+ BlockDirective,
682
+ ElemDirective,
683
+ NgTemplateOutlet,
684
+ RtDataListToolbarActionsDirective,
685
+ RtDataListToolbarSelectorsDirective,
686
+ RtDataTableAdditionalRowActionsDirective,
687
+ RtDataTableCustomCellsDirective,
688
+ RtDataTableIconDirective,
689
+ RtDataTableRowActionsDirective,
690
+ ], host: { class: BEM_BLOCK, '[class.rt-preset-material]': "look() === 'material'" }, providers: [{ provide: RT_DATA_TABLE_PRESET_FROM_HOST, useValue: true }], template: "@if (loading()) {\n <div rtBlock=\"rt-data-list\" rtElem=\"loading\" qa-dataid=\"data-list-loading\">\n <rt-spinner />\n </div>\n} @else {\n <ng-container rtBlock=\"rt-data-list\">\n @if (fetching()) {\n <div rtElem=\"fetching\" qa-dataid=\"data-list-fetching\">\n <rt-spinner />\n </div>\n }\n\n <rt-data-list-toolbar\n [isFiltersShown]=\"isFiltersShown()\"\n [isFiltersEmpty]=\"isFiltersEmpty()\"\n [isRefreshButtonShown]=\"isRefreshButtonShown()\"\n [isTableConfigButtonShown]=\"isTableConfigButtonShown()\"\n [isPlaceholderShown]=\"isPlaceholderShown()\"\n [searchTerm]=\"searchTerm()\"\n [searchAppearance]=\"appearance()\"\n [isToolbarActionsIconsOutlined]=\"isToolbarActionsIconsOutlined()\"\n (searchChange)=\"onSearchChange($event)\"\n (refreshAction)=\"onRefresh()\"\n (clearFiltersAction)=\"onClearFilters()\"\n (openConfigAction)=\"onOpenSettings()\">\n @if (toolbarSelectorsTpl(); as selectors) {\n <ng-container *rtDataListToolbarSelectors>\n <ng-container [ngTemplateOutlet]=\"selectors\" />\n </ng-container>\n }\n\n @if (toolbarActionsTpl(); as actions) {\n <ng-container *rtDataListToolbarActions>\n <ng-container [ngTemplateOutlet]=\"actions\" />\n </ng-container>\n }\n </rt-data-list-toolbar>\n\n @if (isPlaceholderShown()) {\n <div rtElem=\"placeholder\" qa-dataid=\"data-list-placeholder\">\n <rt-empty-state icon=\"search\" [title]=\"placeholderLabel()\" />\n </div>\n } @else {\n <div rtElem=\"content\">\n <rt-data-table\n [look]=\"look()\"\n [keyExp]=\"keyExp()\"\n [entities]=\"entities()\"\n [currentSortModel]=\"currentSortModel()\"\n [filterModel]=\"filterModel()\"\n [isFiltersShown]=\"isFiltersShown()\"\n [isTableRowsClickable]=\"isTableRowsClickable()\"\n [filterAppearance]=\"filterAppearance()\"\n (sortChange)=\"onSortChange($event)\"\n (filterChange)=\"onFilterChange($event)\"\n (rowClick)=\"onRowClick($event)\"\n (rowDoubleClick)=\"onRowDoubleClick($event)\">\n @if (customCellsTpl(); as cells) {\n <ng-container [rtDataTableCustomCells]=\"cells.cellsTemplates()\" />\n }\n\n @if (rowActionsTpl(); as actions) {\n <ng-template rtDataTableRowActions let-row>\n <ng-container [ngTemplateOutlet]=\"actions\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </ng-template>\n }\n\n @if (additionalRowActionsTpl(); as additional) {\n <ng-template rtDataTableAdditionalRowActions let-row>\n <ng-container [ngTemplateOutlet]=\"additional\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </ng-template>\n }\n\n @if (iconTpl(); as icon) {\n <ng-template rtDataTableIcon let-name let-column=\"column\" let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"icon.template\"\n [ngTemplateOutletContext]=\"{ $implicit: name, column: column, row: row }\" />\n </ng-template>\n }\n </rt-data-table>\n </div>\n\n @if (isPaginationShown()) {\n <rt-pagination\n [pageModel]=\"pageModel()\"\n [perPageOptions]=\"pageSizes()\"\n [numbering]=\"look() === 'material' ? 'seven' : 'neighbours'\"\n [prevIcon]=\"look() === 'material' ? 'arrow-left' : 'chevron-left'\"\n [nextIcon]=\"look() === 'material' ? 'arrow-right' : 'chevron-right'\"\n (pageChange)=\"onPageNumber($event)\"\n (perPageChange)=\"onPageSize($event)\" />\n }\n }\n </ng-container>\n}\n", styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-data-list{position:relative;display:flex;width:100%;height:100%;min-height:0;flex-direction:column}.rt-data-list__loading,.rt-data-list__placeholder{display:flex;min-height:var(--rt-list-placeholder-min-height);flex-grow:var(--rt-list-placeholder-grow);align-items:center;justify-content:center}.rt-data-list__placeholder .rt-empty-state{--rt-empty-state-icon-wrap-size: var(--rt-list-empty-icon-wrap-size);--rt-empty-state-icon-wrap-bg: var(--rt-list-empty-icon-wrap-bg);--rt-empty-state-icon-size: var(--rt-list-empty-icon-size);--rt-empty-state-title-size: var(--rt-list-empty-title-size);--rt-empty-state-title-weight: var(--rt-list-empty-title-weight)}.rt-data-list__fetching{position:absolute;z-index:var(--rt-z-sticky);display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--rt-color-bg-page) 60%,transparent);inset:0}.rt-data-list__content{display:flex;overflow:hidden;min-height:0;flex-direction:column;flex-grow:1;isolation:isolate}}\n"] }]
691
+ }], ctorParameters: () => [], propDecorators: { look: [{ type: i0.Input, args: [{ isSignal: true, alias: "look", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], filterAppearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterAppearance", required: false }] }], isToolbarActionsIconsOutlined: [{ type: i0.Input, args: [{ isSignal: true, alias: "isToolbarActionsIconsOutlined", required: false }] }], tableConfigStorageKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableConfigStorageKey", required: true }] }], entities: [{ type: i0.Input, args: [{ isSignal: true, alias: "entities", required: true }] }], pageModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageModel", required: true }] }], currentSortModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentSortModel", required: true }] }], searchTerm: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchTerm", required: false }] }], filterModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterModel", required: false }] }], keyExp: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyExp", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], fetching: [{ type: i0.Input, args: [{ isSignal: true, alias: "fetching", required: false }] }], isTableRowsClickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isTableRowsClickable", required: false }] }], isFiltersShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isFiltersShown", required: false }] }], isRefreshButtonShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isRefreshButtonShown", required: false }] }], isTableConfigButtonShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isTableConfigButtonShown", required: false }] }], isPaginationShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isPaginationShown", required: false }] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], filterChange: [{ type: i0.Output, args: ["filterChange"] }], pageModelChange: [{ type: i0.Output, args: ["pageModelChange"] }], searchChange: [{ type: i0.Output, args: ["searchChange"] }], refresh: [{ type: i0.Output, args: ["refresh"] }], clearFiltersAction: [{ type: i0.Output, args: ["clearFiltersAction"] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], rowDoubleClick: [{ type: i0.Output, args: ["rowDoubleClick"] }], toolbarSelectorsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDataListToolbarSelectorsDirective), { ...{
692
+ read: TemplateRef,
693
+ }, isSignal: true }] }], toolbarActionsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDataListToolbarActionsDirective), { ...{
694
+ read: TemplateRef,
695
+ }, isSignal: true }] }], customCellsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDataListCustomCellsDirective), { isSignal: true }] }], rowActionsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDataListRowActionsDirective), { ...{ read: TemplateRef }, isSignal: true }] }], additionalRowActionsTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDataListAdditionalRowActionsDirective), { ...{ read: TemplateRef }, isSignal: true }] }], iconTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => RtDataTableIconDirective), { isSignal: true }] }], toolbarRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => RtDataListToolbarComponent), { isSignal: true }] }], tableRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => RtDataTableComponent), { isSignal: true }] }] } });
696
+
697
+ /**
698
+ * Выбор записей списка `rt-data-list` — выбор первого кита вместе с «отметить все».
699
+ *
700
+ * «Отметить все» в разведённом виде отмечает и те страницы, которые ещё не приходили: пришедшая
701
+ * страница отмечается сама, а снятая запись уходит в исключения и приходит неотмеченной каждый
702
+ * раз. Приложение читает и отмеченные записи, и исключения — действие над всеми записями оно
703
+ * отправляет как «все, кроме этих».
704
+ */
705
+ class RtDataListSelectorsDirective {
706
+ #destroyRef;
707
+ #injector;
708
+ #list;
709
+ #selectedEntities;
710
+ #excludedEntities;
711
+ #isAllEntitiesSelected;
712
+ #isPageEntitiesSelected;
713
+ #isPageEntitiesIndeterminate;
714
+ #isAcrossPagesEnabled;
715
+ constructor() {
716
+ this.#destroyRef = inject(DestroyRef);
717
+ this.#injector = inject(Injector);
718
+ this.#list = inject(RtDataListComponent);
719
+ this.#selectedEntities = signal([], /* @ts-ignore */
720
+ ...(ngDevMode ? [{ debugName: "#selectedEntities" }] : /* istanbul ignore next */ []));
721
+ this.#excludedEntities = signal([], /* @ts-ignore */
722
+ ...(ngDevMode ? [{ debugName: "#excludedEntities" }] : /* istanbul ignore next */ []));
723
+ this.#isAllEntitiesSelected = signal(false, /* @ts-ignore */
724
+ ...(ngDevMode ? [{ debugName: "#isAllEntitiesSelected" }] : /* istanbul ignore next */ []));
725
+ this.#isPageEntitiesSelected = signal(false, /* @ts-ignore */
726
+ ...(ngDevMode ? [{ debugName: "#isPageEntitiesSelected" }] : /* istanbul ignore next */ []));
727
+ this.#isPageEntitiesIndeterminate = signal(false, /* @ts-ignore */
728
+ ...(ngDevMode ? [{ debugName: "#isPageEntitiesIndeterminate" }] : /* istanbul ignore next */ []));
729
+ this.#isAcrossPagesEnabled = signal(false, /* @ts-ignore */
730
+ ...(ngDevMode ? [{ debugName: "#isAcrossPagesEnabled" }] : /* istanbul ignore next */ []));
731
+ this.isMultiSelect = input(true, { ...(ngDevMode ? { debugName: "isMultiSelect" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
732
+ /** «Отметить все» отмечает и не пришедшие страницы; приложение может это выключить. */
733
+ this.isMultiSelectExtendedMod = input(true, { ...(ngDevMode ? { debugName: "isMultiSelectExtendedMod" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
734
+ this.isSelectAllSelectorShown = input(true, { ...(ngDevMode ? { debugName: "isSelectAllSelectorShown" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
735
+ this.isSelectorsColumnDisabled = input(false, { ...(ngDevMode ? { debugName: "isSelectorsColumnDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
736
+ this.selectedEntitiesKeys = input([], { ...(ngDevMode ? { debugName: "selectedEntitiesKeys" } : /* istanbul ignore next */ {}), transform: transformArrayInput });
737
+ this.selectedEntities = this.#selectedEntities.asReadonly();
738
+ this.excludedEntities = this.#excludedEntities.asReadonly();
739
+ this.selectedEntitiesIds = computed(() => dataTableKeysOf(this.selectedEntities(), this.#keyExp()), /* @ts-ignore */
740
+ ...(ngDevMode ? [{ debugName: "selectedEntitiesIds" }] : /* istanbul ignore next */ []));
741
+ this.excludedEntitiesIds = computed(() => dataTableKeysOf(this.excludedEntities(), this.#keyExp()), /* @ts-ignore */
742
+ ...(ngDevMode ? [{ debugName: "excludedEntitiesIds" }] : /* istanbul ignore next */ []));
743
+ this.isAllEntitiesSelected = this.#isAllEntitiesSelected.asReadonly();
744
+ this.isPageEntitiesSelected = this.#isPageEntitiesSelected.asReadonly();
745
+ this.isPageEntitiesIndeterminate = this.#isPageEntitiesIndeterminate.asReadonly();
746
+ /** Отмечены все записи, включая не пришедшие страницы. */
747
+ this.isAcrossPagesEnabled = this.#isAcrossPagesEnabled.asReadonly();
748
+ /** Тот же признак под именем первого кита: приложение, читавшее его там, переезжает без правок. */
749
+ this.isMultiSelectExtendedModEnabled = this.isAcrossPagesEnabled;
750
+ /* Отметки ведёт директива, а рисуют их панель действий и таблица списка. */
751
+ effect(() => {
752
+ const table = this.#list.tableRef();
753
+ if (table) {
754
+ table.isSelectorsColumnShown.set(true);
755
+ table.isMultiSelect.set(this.isMultiSelect());
756
+ table.isSelectorsColumnDisabled.set(this.isSelectorsColumnDisabled());
757
+ table.selectedEntitiesIds.set(this.selectedEntitiesIds());
758
+ table.isPageEntitiesSelected.set(this.isPageEntitiesSelected());
759
+ table.isPageEntitiesIndeterminate.set(this.isPageEntitiesIndeterminate());
760
+ table.onToggleEntity = (entity, checked) => this.toggleEntity(entity, checked);
761
+ table.onTogglePageEntities = (checked) => this.togglePageEntities(checked);
762
+ }
763
+ });
764
+ effect(() => {
765
+ const toolbar = this.#list.toolbarRef();
766
+ if (toolbar) {
767
+ toolbar.isMultiSelect.set(this.isMultiSelect());
768
+ toolbar.isSelectAllSelectorShown.set(this.isSelectAllSelectorShown());
769
+ toolbar.isSelectAllSelectorDisabled.set(this.isSelectorsColumnDisabled());
770
+ toolbar.isAllEntitiesSelected.set(this.isAllEntitiesSelected());
771
+ toolbar.isAllEntitiesIndeterminate.set(!!this.selectedEntities().length);
772
+ toolbar.selectedEntitiesCount.set(this.selectedEntities().length);
773
+ toolbar.onToggleAllEntities = (checked) => this.toggleAllEntities(checked);
774
+ }
775
+ });
776
+ }
777
+ ngOnInit() {
778
+ /* Пришла страница: под «отметить все» её строки отмечаются сами, кроме исключённых. */
779
+ toObservable(this.#list.entities, { injector: this.#injector })
780
+ .pipe(takeUntilDestroyed(this.#destroyRef))
781
+ .subscribe((page) => {
782
+ if (this.isAcrossPagesEnabled()) {
783
+ this.#selectedEntities.update((selected) => dataListSelectedAfterPage(selected, page, this.excludedEntities(), this.#keyExp()));
784
+ this.#isAllEntitiesSelected.set(!this.excludedEntities().length);
785
+ }
786
+ this.setExistingEntitiesState();
787
+ });
788
+ /* Отметки, названные заранее, ставятся один раз: к первым непустым строкам. */
789
+ toObservable(this.#list.entities, { injector: this.#injector })
790
+ .pipe(filter((entities) => !!entities.length), take(1), switchMap(() => toObservable(this.selectedEntitiesKeys, { injector: this.#injector }).pipe(filter((keys) => !!keys.length), take(1))), takeUntilDestroyed(this.#destroyRef))
791
+ .subscribe(() => {
792
+ this.#selectedEntities.set(dataTablePresetEntities(this.#list.entities(), this.selectedEntitiesKeys(), this.#keyExp()));
793
+ this.setExistingEntitiesState();
794
+ });
795
+ }
796
+ /** «Отметить все»: отмечает все пришедшие строки, а в разведённом виде — и будущие страницы. */
797
+ toggleAllEntities(checked) {
798
+ /* «Отметить все», поставленное заново, начинает с чистого листа: исключения прошлого
799
+ раза иначе приходили бы неотмеченными и под новым «все». */
800
+ if (checked) {
801
+ this.#excludedEntities.set([]);
802
+ }
803
+ this.#isAllEntitiesSelected.set(checked);
804
+ if (this.isMultiSelectExtendedMod()) {
805
+ this.#isAcrossPagesEnabled.set(checked);
806
+ }
807
+ this.#selectedEntities.set(checked ? [...this.#list.entities()] : []);
808
+ this.#isPageEntitiesSelected.set(checked);
809
+ this.#isPageEntitiesIndeterminate.set(checked);
810
+ }
811
+ /** Отметить или снять все строки показанной страницы. */
812
+ togglePageEntities(checked) {
813
+ const page = this.#list.entities();
814
+ this.#isPageEntitiesSelected.set(checked);
815
+ this.#selectedEntities.update((selected) => checked
816
+ ? dataTableWithPageEntities(selected, page, this.#keyExp())
817
+ : dataTableWithoutPageEntities(selected, page, this.#keyExp()));
818
+ if (this.isAcrossPagesEnabled()) {
819
+ this.#excludedEntities.update((excluded) => checked
820
+ ? dataListExcludedAfterPageMarked(excluded, page, this.#keyExp())
821
+ : dataListExcludedAfterPageUnmarked(excluded, page, this.#keyExp()));
822
+ }
823
+ this.#isAllEntitiesSelected.set(this.isAcrossPagesEnabled() && checked && !this.excludedEntities().length);
824
+ this.#isPageEntitiesIndeterminate.set(dataTableAnyOnPage(page, this.selectedEntitiesIds(), this.#keyExp()));
825
+ }
826
+ /** Отметить или снять одну запись; под «отметить все» снятая уходит в исключения. */
827
+ toggleEntity(entity, checked) {
828
+ if (!this.isMultiSelect()) {
829
+ this.#selectedEntities.set([entity]);
830
+ return;
831
+ }
832
+ this.#selectedEntities.update((selected) => dataTableWithEntity(selected, entity, checked, this.#keyExp()));
833
+ if (this.isAcrossPagesEnabled()) {
834
+ this.#excludedEntities.update((excluded) => dataListExcludedAfterEntity(excluded, entity, checked, this.#keyExp()));
835
+ this.#isAllEntitiesSelected.set(!this.excludedEntities().length);
836
+ }
837
+ else if (!checked) {
838
+ this.#isAllEntitiesSelected.set(false);
839
+ }
840
+ else {
841
+ // Отметка записи без «отметить все» этого признака не касается.
842
+ }
843
+ this.#updatePageState();
844
+ }
845
+ /** Снять все отметки; исключения остаются до отдельной просьбы приложения. */
846
+ clearSelectedList() {
847
+ this.#selectedEntities.set([]);
848
+ this.#isPageEntitiesSelected.set(false);
849
+ this.#isPageEntitiesIndeterminate.set(false);
850
+ this.#isAllEntitiesSelected.set(false);
851
+ this.#isAcrossPagesEnabled.set(false);
852
+ }
853
+ /** Очистить исключения. */
854
+ clearExcludedList() {
855
+ this.#excludedEntities.set([]);
856
+ }
857
+ /** Пересчитать флажок страницы по показанным строкам. */
858
+ setExistingEntitiesState() {
859
+ const page = this.#list.entities();
860
+ const keys = this.selectedEntitiesIds();
861
+ this.#isPageEntitiesSelected.set(dataTableAllOnPage(page, keys, this.#keyExp()));
862
+ this.#isPageEntitiesIndeterminate.set(dataTableAnyOnPage(page, keys, this.#keyExp()));
863
+ }
864
+ #updatePageState() {
865
+ const page = this.#list.entities();
866
+ const keys = this.selectedEntitiesIds();
867
+ if (keys.length) {
868
+ this.#isPageEntitiesSelected.set(dataTableAllOnPage(page, keys, this.#keyExp()));
869
+ this.#isPageEntitiesIndeterminate.set(true);
870
+ }
871
+ else {
872
+ this.#isPageEntitiesSelected.set(false);
873
+ this.#isPageEntitiesIndeterminate.set(dataTableAnyOnPage(page, keys, this.#keyExp()));
874
+ }
875
+ }
876
+ #keyExp() {
877
+ return this.#list.keyExp();
878
+ }
879
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListSelectorsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
880
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtDataListSelectorsDirective, isStandalone: true, selector: "rt-data-list[rtDataListSelectors]", inputs: { isMultiSelect: { classPropertyName: "isMultiSelect", publicName: "isMultiSelect", isSignal: true, isRequired: false, transformFunction: null }, isMultiSelectExtendedMod: { classPropertyName: "isMultiSelectExtendedMod", publicName: "isMultiSelectExtendedMod", isSignal: true, isRequired: false, transformFunction: null }, isSelectAllSelectorShown: { classPropertyName: "isSelectAllSelectorShown", publicName: "isSelectAllSelectorShown", isSignal: true, isRequired: false, transformFunction: null }, isSelectorsColumnDisabled: { classPropertyName: "isSelectorsColumnDisabled", publicName: "isSelectorsColumnDisabled", isSignal: true, isRequired: false, transformFunction: null }, selectedEntitiesKeys: { classPropertyName: "selectedEntitiesKeys", publicName: "selectedEntitiesKeys", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
881
+ }
882
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtDataListSelectorsDirective, decorators: [{
883
+ type: Directive,
884
+ args: [{
885
+ selector: 'rt-data-list[rtDataListSelectors]',
886
+ }]
887
+ }], ctorParameters: () => [], propDecorators: { isMultiSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "isMultiSelect", required: false }] }], isMultiSelectExtendedMod: [{ type: i0.Input, args: [{ isSignal: true, alias: "isMultiSelectExtendedMod", required: false }] }], isSelectAllSelectorShown: [{ type: i0.Input, args: [{ isSignal: true, alias: "isSelectAllSelectorShown", required: false }] }], isSelectorsColumnDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isSelectorsColumnDisabled", required: false }] }], selectedEntitiesKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedEntitiesKeys", required: false }] }] } });
888
+
889
+ /**
890
+ * Generated bundle index. Do not edit.
891
+ */
892
+
893
+ export { DATA_LIST_PAGE_SIZES, RtDataListAdditionalRowActionsDirective, RtDataListComponent, RtDataListCustomCellsDirective, RtDataListRowActionsDirective, RtDataListSelectorsDirective, RtDataListSettingsAsideComponent, RtDataListToolbarActionsDirective, RtDataListToolbarComponent, RtDataListToolbarSelectorsDirective, dataListColumnsFromItems, dataListExcludedAfterEntity, dataListExcludedAfterPageMarked, dataListExcludedAfterPageUnmarked, dataListMoveItem, dataListPageAfterSizeChange, dataListPageCount, dataListPageSizes, dataListSelectedAfterPage, dataListSettingItems, dataListSettingsChanged, dataListToggleHidden };
894
+ //# sourceMappingURL=rt-tools-ui-kit-v2-data-list.mjs.map