@rt-tools/ui-kit-v2 0.23.3 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs +142 -71
- package/fesm2022/rt-tools-ui-kit-v2-accordion.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +467 -231
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs +260 -91
- package/fesm2022/rt-tools-ui-kit-v2-ai-run-status.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs +80 -46
- package/fesm2022/rt-tools-ui-kit-v2-aside-section.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +984 -697
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +452 -210
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs +143 -52
- package/fesm2022/rt-tools-ui-kit-v2-bar-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs +158 -83
- package/fesm2022/rt-tools-ui-kit-v2-bottom-sheet.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs +335 -0
- package/fesm2022/rt-tools-ui-kit-v2-breadcrumbs.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs +437 -363
- package/fesm2022/rt-tools-ui-kit-v2-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +430 -149
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-card.mjs +155 -71
- package/fesm2022/rt-tools-ui-kit-v2-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-carousel.mjs +155 -0
- package/fesm2022/rt-tools-ui-kit-v2-carousel.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs +215 -110
- package/fesm2022/rt-tools-ui-kit-v2-checkbox.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs +158 -75
- package/fesm2022/rt-tools-ui-kit-v2-collapsible-text.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs +769 -0
- package/fesm2022/rt-tools-ui-kit-v2-color-palette.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs +462 -253
- package/fesm2022/rt-tools-ui-kit-v2-confirm-popover.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs +1276 -1316
- package/fesm2022/rt-tools-ui-kit-v2-container.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +185 -80
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +2321 -2619
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs +100 -44
- package/fesm2022/rt-tools-ui-kit-v2-counter-row.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +290 -155
- package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +2097 -858
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +2247 -1176
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +1043 -705
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +810 -525
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs +158 -138
- package/fesm2022/rt-tools-ui-kit-v2-delta-view.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +177 -67
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +550 -477
- package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs +185 -168
- package/fesm2022/rt-tools-ui-kit-v2-dot-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs +116 -43
- package/fesm2022/rt-tools-ui-kit-v2-download-link.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +585 -0
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +755 -259
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +3266 -1115
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs +190 -55
- package/fesm2022/rt-tools-ui-kit-v2-empty-state.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs +283 -103
- package/fesm2022/rt-tools-ui-kit-v2-expansion-panel.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs +393 -177
- package/fesm2022/rt-tools-ui-kit-v2-field.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +399 -207
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs +288 -212
- package/fesm2022/rt-tools-ui-kit-v2-file-drop.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs +262 -116
- package/fesm2022/rt-tools-ui-kit-v2-file-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs +57 -31
- package/fesm2022/rt-tools-ui-kit-v2-file-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +258 -90
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs +249 -215
- package/fesm2022/rt-tools-ui-kit-v2-form-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-header.mjs +199 -71
- package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs +231 -0
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree-selector.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +336 -0
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +451 -162
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs +931 -686
- package/fesm2022/rt-tools-ui-kit-v2-icon.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs +664 -491
- package/fesm2022/rt-tools-ui-kit-v2-image-cropper.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +574 -222
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs +150 -36
- package/fesm2022/rt-tools-ui-kit-v2-info-item.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +606 -0
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +461 -355
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +338 -143
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs +135 -48
- package/fesm2022/rt-tools-ui-kit-v2-live-badge.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-logo.mjs +166 -92
- package/fesm2022/rt-tools-ui-kit-v2-logo.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs +118 -56
- package/fesm2022/rt-tools-ui-kit-v2-markdown-text.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +1054 -527
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs +230 -104
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs +210 -70
- package/fesm2022/rt-tools-ui-kit-v2-money-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +532 -311
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs +125 -50
- package/fesm2022/rt-tools-ui-kit-v2-night-grid.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-note.mjs +73 -43
- package/fesm2022/rt-tools-ui-kit-v2-note.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs +161 -53
- package/fesm2022/rt-tools-ui-kit-v2-notifications-bell.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +491 -310
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +374 -174
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +202 -159
- package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-popover.mjs +438 -309
- package/fesm2022/rt-tools-ui-kit-v2-popover.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs +295 -0
- package/fesm2022/rt-tools-ui-kit-v2-profile-menu.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs +135 -45
- package/fesm2022/rt-tools-ui-kit-v2-prompt-suggestion.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs +293 -171
- package/fesm2022/rt-tools-ui-kit-v2-radio-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-radius.mjs +62 -55
- package/fesm2022/rt-tools-ui-kit-v2-radius.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +3379 -1466
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs +114 -116
- package/fesm2022/rt-tools-ui-kit-v2-ripple.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs +406 -299
- package/fesm2022/rt-tools-ui-kit-v2-scroll-area.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs +137 -36
- package/fesm2022/rt-tools-ui-kit-v2-section-nav.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +687 -468
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +2195 -1569
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs +187 -48
- package/fesm2022/rt-tools-ui-kit-v2-skeleton-wrapper.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs +242 -122
- package/fesm2022/rt-tools-ui-kit-v2-skeleton.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +439 -0
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs +218 -69
- package/fesm2022/rt-tools-ui-kit-v2-spinner.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs +292 -91
- package/fesm2022/rt-tools-ui-kit-v2-split-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +225 -138
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs +150 -116
- package/fesm2022/rt-tools-ui-kit-v2-stepper.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +2462 -1583
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs +647 -346
- package/fesm2022/rt-tools-ui-kit-v2-tabs.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +335 -121
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs +217 -84
- package/fesm2022/rt-tools-ui-kit-v2-textarea.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +151 -72
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +697 -226
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs +92 -38
- package/fesm2022/rt-tools-ui-kit-v2-timeline.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +752 -338
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs +310 -129
- package/fesm2022/rt-tools-ui-kit-v2-toggle-button-group.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs +286 -158
- package/fesm2022/rt-tools-ui-kit-v2-toggle-switch.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +270 -134
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs +322 -202
- package/fesm2022/rt-tools-ui-kit-v2-tooltip.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +908 -0
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +785 -0
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -0
- package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs +118 -63
- package/fesm2022/rt-tools-ui-kit-v2-welcome-dialog.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +783 -262
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +633 -294
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2.mjs +100 -103
- package/package.json +45 -1
- package/src/assets/icons/collapse-all.svg +9 -0
- package/src/assets/icons/expand-all.svg +9 -0
- package/src/assets/icons-material/collapse-all.fill.svg +5 -0
- package/src/assets/icons-material/collapse-all.svg +5 -0
- package/src/assets/icons-material/expand-all.fill.svg +5 -0
- package/src/assets/icons-material/expand-all.svg +5 -0
- package/src/assets/icons-material/undo.fill.svg +5 -0
- package/src/assets/icons-material/undo.svg +5 -0
- package/src/lib/components/bottom-sheet/CONTEXT.md +20 -2
- package/src/lib/components/bottom-sheet/rt-bottom-sheet.component.scss +36 -1
- package/src/lib/components/breadcrumbs/CONTEXT.md +37 -0
- package/src/lib/components/breadcrumbs/rt-breadcrumbs.component.scss +205 -0
- package/src/lib/components/carousel/CONTEXT.md +42 -0
- package/src/lib/components/carousel/rt-carousel.component.scss +117 -0
- package/src/lib/components/checkbox/CONTEXT.md +3 -0
- package/src/lib/components/checkbox/rt-checkbox.component.scss +9 -3
- package/src/lib/components/color-palette/CONTEXT.md +49 -0
- package/src/lib/components/color-palette/picker/rt-color-picker.component.scss +161 -0
- package/src/lib/components/color-palette/rt-color-palette.component.scss +132 -0
- package/src/lib/components/draggable-tree/CONTEXT.md +54 -0
- package/src/lib/components/draggable-tree/rt-draggable-tree.component.scss +219 -0
- package/src/lib/components/hybrid-tree/CONTEXT.md +31 -0
- package/src/lib/components/hybrid-tree-selector/CONTEXT.md +25 -0
- package/src/lib/components/icon-button/CONTEXT.md +3 -0
- package/src/lib/components/inline-edit/CONTEXT.md +41 -0
- package/src/lib/components/inline-edit/rt-inline-edit.component.scss +274 -0
- package/src/lib/components/popover/CONTEXT.md +3 -0
- package/src/lib/components/profile-menu/CONTEXT.md +32 -0
- package/src/lib/components/profile-menu/rt-profile-menu.component.scss +104 -0
- package/src/lib/components/speed-menu/CONTEXT.md +34 -0
- package/src/lib/components/speed-menu/rt-speed-menu.component.scss +118 -0
- package/src/lib/components/tag/rt-tag.component.scss +12 -0
- package/src/lib/components/thread-list/CONTEXT.md +1 -0
- package/src/lib/components/thread-list/rt-thread-list.component.scss +2 -1
- package/src/lib/components/toolbar/CONTEXT.md +9 -4
- package/src/lib/components/toolbar/rt-toolbar.component.scss +10 -2
- package/src/lib/components/tooltip/CONTEXT.md +8 -1
- package/src/lib/components/tree/CONTEXT.md +66 -0
- package/src/lib/components/tree/rt-tree.component.scss +313 -0
- package/src/lib/components/tree-selector/CONTEXT.md +47 -0
- package/src/lib/components/tree-selector/rt-tree-selector.component.scss +121 -0
- package/src/styles/_primitives.scss +4 -0
- package/src/styles/_semantic.scss +5 -0
- package/styles/tokens.css +43 -0
- package/types/rt-tools-ui-kit-v2-accordion.d.ts +31 -24
- package/types/rt-tools-ui-kit-v2-action-bar.d.ts +112 -91
- package/types/rt-tools-ui-kit-v2-ai-run-status.d.ts +64 -40
- package/types/rt-tools-ui-kit-v2-aside-section.d.ts +13 -10
- package/types/rt-tools-ui-kit-v2-aside.d.ts +268 -206
- package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +102 -61
- package/types/rt-tools-ui-kit-v2-bar-list.d.ts +39 -27
- package/types/rt-tools-ui-kit-v2-bottom-sheet.d.ts +31 -20
- package/types/rt-tools-ui-kit-v2-breadcrumbs.d.ts +89 -0
- package/types/rt-tools-ui-kit-v2-button.d.ts +119 -59
- package/types/rt-tools-ui-kit-v2-calendar.d.ts +151 -86
- package/types/rt-tools-ui-kit-v2-card.d.ts +42 -21
- package/types/rt-tools-ui-kit-v2-carousel.d.ts +76 -0
- package/types/rt-tools-ui-kit-v2-checkbox.d.ts +48 -24
- package/types/rt-tools-ui-kit-v2-collapsible-text.d.ts +28 -20
- package/types/rt-tools-ui-kit-v2-color-palette.d.ts +208 -0
- package/types/rt-tools-ui-kit-v2-confirm-popover.d.ts +104 -47
- package/types/rt-tools-ui-kit-v2-container.d.ts +278 -221
- package/types/rt-tools-ui-kit-v2-copy-value.d.ts +39 -24
- package/types/rt-tools-ui-kit-v2-core.d.ts +862 -865
- package/types/rt-tools-ui-kit-v2-counter-row.d.ts +20 -12
- package/types/rt-tools-ui-kit-v2-counter.d.ts +70 -38
- package/types/rt-tools-ui-kit-v2-data-list.d.ts +429 -264
- package/types/rt-tools-ui-kit-v2-data-table.d.ts +500 -351
- package/types/rt-tools-ui-kit-v2-date-picker.d.ts +164 -138
- package/types/rt-tools-ui-kit-v2-date-range.d.ts +102 -84
- package/types/rt-tools-ui-kit-v2-delta-view.d.ts +16 -13
- package/types/rt-tools-ui-kit-v2-detail-list.d.ts +23 -16
- package/types/rt-tools-ui-kit-v2-dialog.d.ts +130 -101
- package/types/rt-tools-ui-kit-v2-dot-field.d.ts +10 -13
- package/types/rt-tools-ui-kit-v2-download-link.d.ts +22 -17
- package/types/rt-tools-ui-kit-v2-draggable-tree.d.ts +132 -0
- package/types/rt-tools-ui-kit-v2-dynamic-list.d.ts +185 -96
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +904 -404
- package/types/rt-tools-ui-kit-v2-empty-state.d.ts +48 -19
- package/types/rt-tools-ui-kit-v2-expansion-panel.d.ts +67 -39
- package/types/rt-tools-ui-kit-v2-field.d.ts +90 -49
- package/types/rt-tools-ui-kit-v2-file-card.d.ts +115 -75
- package/types/rt-tools-ui-kit-v2-file-drop.d.ts +75 -48
- package/types/rt-tools-ui-kit-v2-file-input.d.ts +53 -36
- package/types/rt-tools-ui-kit-v2-file-list.d.ts +5 -8
- package/types/rt-tools-ui-kit-v2-filter-control.d.ts +83 -49
- package/types/rt-tools-ui-kit-v2-form-control.d.ts +102 -74
- package/types/rt-tools-ui-kit-v2-header.d.ts +40 -22
- package/types/rt-tools-ui-kit-v2-hybrid-tree-selector.d.ts +14 -0
- package/types/rt-tools-ui-kit-v2-hybrid-tree.d.ts +72 -0
- package/types/rt-tools-ui-kit-v2-icon-button.d.ts +190 -90
- package/types/rt-tools-ui-kit-v2-icon.d.ts +160 -129
- package/types/rt-tools-ui-kit-v2-image-cropper.d.ts +151 -111
- package/types/rt-tools-ui-kit-v2-image-upload.d.ts +159 -85
- package/types/rt-tools-ui-kit-v2-info-item.d.ts +26 -13
- package/types/rt-tools-ui-kit-v2-inline-edit.d.ts +194 -0
- package/types/rt-tools-ui-kit-v2-input-number.d.ts +102 -53
- package/types/rt-tools-ui-kit-v2-input.d.ts +82 -43
- package/types/rt-tools-ui-kit-v2-live-badge.d.ts +30 -17
- package/types/rt-tools-ui-kit-v2-logo.d.ts +49 -32
- package/types/rt-tools-ui-kit-v2-markdown-text.d.ts +26 -17
- package/types/rt-tools-ui-kit-v2-menu.d.ts +272 -155
- package/types/rt-tools-ui-kit-v2-message.d.ts +59 -33
- package/types/rt-tools-ui-kit-v2-money-list.d.ts +36 -18
- package/types/rt-tools-ui-kit-v2-multiselect.d.ts +114 -80
- package/types/rt-tools-ui-kit-v2-night-grid.d.ts +34 -25
- package/types/rt-tools-ui-kit-v2-note.d.ts +12 -9
- package/types/rt-tools-ui-kit-v2-notifications-bell.d.ts +37 -16
- package/types/rt-tools-ui-kit-v2-page-header.d.ts +218 -150
- package/types/rt-tools-ui-kit-v2-pagination.d.ts +99 -63
- package/types/rt-tools-ui-kit-v2-photo-viewer.d.ts +61 -66
- package/types/rt-tools-ui-kit-v2-popover.d.ts +116 -55
- package/types/rt-tools-ui-kit-v2-profile-menu.d.ts +103 -0
- package/types/rt-tools-ui-kit-v2-prompt-suggestion.d.ts +26 -16
- package/types/rt-tools-ui-kit-v2-radio-button.d.ts +85 -43
- package/types/rt-tools-ui-kit-v2-radius.d.ts +18 -15
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +931 -590
- package/types/rt-tools-ui-kit-v2-ripple.d.ts +28 -25
- package/types/rt-tools-ui-kit-v2-scroll-area.d.ts +60 -58
- package/types/rt-tools-ui-kit-v2-section-nav.d.ts +32 -22
- package/types/rt-tools-ui-kit-v2-select.d.ts +182 -139
- package/types/rt-tools-ui-kit-v2-side-menu.d.ts +452 -349
- package/types/rt-tools-ui-kit-v2-skeleton-wrapper.d.ts +53 -20
- package/types/rt-tools-ui-kit-v2-skeleton.d.ts +55 -26
- package/types/rt-tools-ui-kit-v2-speed-menu.d.ts +131 -0
- package/types/rt-tools-ui-kit-v2-spinner.d.ts +56 -28
- package/types/rt-tools-ui-kit-v2-split-button.d.ts +96 -55
- package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +88 -60
- package/types/rt-tools-ui-kit-v2-stepper.d.ts +50 -37
- package/types/rt-tools-ui-kit-v2-table.d.ts +631 -480
- package/types/rt-tools-ui-kit-v2-tabs.d.ts +198 -113
- package/types/rt-tools-ui-kit-v2-tag.d.ts +106 -53
- package/types/rt-tools-ui-kit-v2-textarea.d.ts +48 -25
- package/types/rt-tools-ui-kit-v2-theme-toggle.d.ts +28 -26
- package/types/rt-tools-ui-kit-v2-thread-list.d.ts +154 -94
- package/types/rt-tools-ui-kit-v2-timeline.d.ts +30 -28
- package/types/rt-tools-ui-kit-v2-toast.d.ts +174 -98
- package/types/rt-tools-ui-kit-v2-toggle-button-group.d.ts +132 -86
- package/types/rt-tools-ui-kit-v2-toggle-switch.d.ts +88 -50
- package/types/rt-tools-ui-kit-v2-toolbar.d.ts +30 -27
- package/types/rt-tools-ui-kit-v2-tooltip.d.ts +65 -41
- package/types/rt-tools-ui-kit-v2-tree-selector.d.ts +257 -0
- package/types/rt-tools-ui-kit-v2-tree.d.ts +282 -0
- package/types/rt-tools-ui-kit-v2-welcome-dialog.d.ts +21 -24
- package/types/rt-tools-ui-kit-v2-workspace-details.d.ts +195 -124
- package/types/rt-tools-ui-kit-v2-workspace.d.ts +122 -79
- package/types/rt-tools-ui-kit-v2.d.ts +100 -90
- package/fesm2022/rt-tools-ui-kit-v2.mjs.map +0 -1
|
@@ -1,220 +1,254 @@
|
|
|
1
|
-
import * as i0 from
|
|
2
|
-
import {
|
|
3
|
-
import { takeUntilDestroyed } from
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { DestroyRef, Directive, booleanAttribute, computed, inject, input, signal } from "@angular/core";
|
|
3
|
+
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
|
4
|
+
import { NgControl, Validators } from "@angular/forms";
|
|
5
|
+
const PRISTINE_STATE = {
|
|
6
|
+
invalid: false,
|
|
7
|
+
errors: null,
|
|
8
|
+
required: false,
|
|
9
|
+
interacted: false
|
|
10
|
+
};
|
|
9
11
|
function emitsEvents(control) {
|
|
10
|
-
|
|
12
|
+
return typeof control.events?.pipe === "function";
|
|
11
13
|
}
|
|
12
|
-
/** Состояние формы, снятое с контрола любого рода. */
|
|
13
14
|
function stateOf(control) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
class RtFormControlBase {
|
|
22
|
-
#ngControl;
|
|
23
|
-
#destroyRef;
|
|
24
|
-
#onChange;
|
|
25
|
-
#onTouched;
|
|
26
|
-
// Состояние, которым управляет родительский rt-field (через публичные сеттеры):
|
|
27
|
-
// авто-id для связки label[for], read-only режим, зеркало ошибок/required.
|
|
28
|
-
#controlIdAssigned;
|
|
29
|
-
#readonlyAssigned;
|
|
30
|
-
/**
|
|
31
|
-
* Обязательность, объявленная полем. Шаблонная форма валидатора на контрол не кладёт, и без
|
|
32
|
-
* этого признака её обязательное поле не получало бы ни звёздочки, ни ошибки.
|
|
33
|
-
*/
|
|
34
|
-
#requiredAssigned;
|
|
35
|
-
/** Состояние, разосланное прежней привязкой: её контрол сигналами не читается. */
|
|
36
|
-
#pushedState;
|
|
37
|
-
/**
|
|
38
|
-
* Контрол сигнальной привязки. Его состояние не рассылается, а читается геттерами, и
|
|
39
|
-
* внутри геттеров стоят вызовы сигналов формы — то есть из `computed` оно реактивно.
|
|
40
|
-
*/
|
|
41
|
-
#signalControl;
|
|
42
|
-
/** Отключение, назначенное формой через CVA (`setDisabledState`). */
|
|
43
|
-
#disabledByForm;
|
|
44
|
-
/** Состояние формы: у сигнальной привязки читается, у прежней берётся разосланное. */
|
|
45
|
-
#state;
|
|
46
|
-
/**
|
|
47
|
-
* Пустое поле, обязательное по слову rt-field, которого уже коснулись. Валидатор формы здесь
|
|
48
|
-
* не нужен: его ошибку контрол и так получает от формы.
|
|
49
|
-
*/
|
|
50
|
-
#missingRequired;
|
|
51
|
-
constructor() {
|
|
52
|
-
this.#ngControl = inject(NgControl, { self: true, optional: true });
|
|
53
|
-
this.#destroyRef = inject(DestroyRef);
|
|
54
|
-
this.#onChange = () => undefined;
|
|
55
|
-
this.#onTouched = () => undefined;
|
|
56
|
-
// Состояние, которым управляет родительский rt-field (через публичные сеттеры):
|
|
57
|
-
// авто-id для связки label[for], read-only режим, зеркало ошибок/required.
|
|
58
|
-
this.#controlIdAssigned = signal(null, /* @ts-ignore */
|
|
59
|
-
...(ngDevMode ? [{ debugName: "#controlIdAssigned" }] : /* istanbul ignore next */ []));
|
|
60
|
-
this.#readonlyAssigned = signal(false, /* @ts-ignore */
|
|
61
|
-
...(ngDevMode ? [{ debugName: "#readonlyAssigned" }] : /* istanbul ignore next */ []));
|
|
62
|
-
/**
|
|
63
|
-
* Обязательность, объявленная полем. Шаблонная форма валидатора на контрол не кладёт, и без
|
|
64
|
-
* этого признака её обязательное поле не получало бы ни звёздочки, ни ошибки.
|
|
65
|
-
*/
|
|
66
|
-
this.#requiredAssigned = signal(false, /* @ts-ignore */
|
|
67
|
-
...(ngDevMode ? [{ debugName: "#requiredAssigned" }] : /* istanbul ignore next */ []));
|
|
68
|
-
/** Состояние, разосланное прежней привязкой: её контрол сигналами не читается. */
|
|
69
|
-
this.#pushedState = signal(PRISTINE_STATE, /* @ts-ignore */
|
|
70
|
-
...(ngDevMode ? [{ debugName: "#pushedState" }] : /* istanbul ignore next */ []));
|
|
71
|
-
/**
|
|
72
|
-
* Контрол сигнальной привязки. Его состояние не рассылается, а читается геттерами, и
|
|
73
|
-
* внутри геттеров стоят вызовы сигналов формы — то есть из `computed` оно реактивно.
|
|
74
|
-
*/
|
|
75
|
-
this.#signalControl = signal(null, /* @ts-ignore */
|
|
76
|
-
...(ngDevMode ? [{ debugName: "#signalControl" }] : /* istanbul ignore next */ []));
|
|
77
|
-
/** Отключение, назначенное формой через CVA (`setDisabledState`). */
|
|
78
|
-
this.#disabledByForm = signal(false, /* @ts-ignore */
|
|
79
|
-
...(ngDevMode ? [{ debugName: "#disabledByForm" }] : /* istanbul ignore next */ []));
|
|
80
|
-
/**
|
|
81
|
-
* Отключение: вход и форма — два независимых источника, поле отключено,
|
|
82
|
-
* если так сказал любой из них. Сводить их в один signal нельзя: форма
|
|
83
|
-
* зовёт `setDisabledState` при связывании контрола, то есть раньше, чем
|
|
84
|
-
* поле впервые обновит своё вью, и мирроринг входа затирал бы её слово —
|
|
85
|
-
* контрол, созданный отключённым, оказывался бы редактируемым.
|
|
86
|
-
*/
|
|
87
|
-
this.isDisabled = computed(() => this.disabled() || this.#disabledByForm(), /* @ts-ignore */
|
|
88
|
-
...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
|
|
89
|
-
/** Состояние формы: у сигнальной привязки читается, у прежней берётся разосланное. */
|
|
90
|
-
this.#state = computed(() => {
|
|
91
|
-
const control = this.#signalControl();
|
|
92
|
-
return control === null ? this.#pushedState() : stateOf(control);
|
|
93
|
-
}, /* @ts-ignore */
|
|
94
|
-
...(ngDevMode ? [{ debugName: "#state" }] : /* istanbul ignore next */ []));
|
|
95
|
-
/**
|
|
96
|
-
* Пустое поле, обязательное по слову rt-field, которого уже коснулись. Валидатор формы здесь
|
|
97
|
-
* не нужен: его ошибку контрол и так получает от формы.
|
|
98
|
-
*/
|
|
99
|
-
this.#missingRequired = computed(() => this.#requiredAssigned() && !this.#state().required && this.#state().interacted && !this.hasValue(), /* @ts-ignore */
|
|
100
|
-
...(ngDevMode ? [{ debugName: "#missingRequired" }] : /* istanbul ignore next */ []));
|
|
101
|
-
this.isInvalid = computed(() => this.#state().invalid || this.#missingRequired(), /* @ts-ignore */
|
|
102
|
-
...(ngDevMode ? [{ debugName: "isInvalid" }] : /* istanbul ignore next */ []));
|
|
103
|
-
/** Видимость кнопки очистки: включена, есть значение, поле активно. */
|
|
104
|
-
this.showClearButton = computed(() => this.clearable() && this.hasValue() && !this.isDisabled(), /* @ts-ignore */
|
|
105
|
-
...(ngDevMode ? [{ debugName: "showClearButton" }] : /* istanbul ignore next */ []));
|
|
106
|
-
this.size = input('md', /* @ts-ignore */
|
|
107
|
-
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
108
|
-
this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
109
|
-
this.controlId = input(null, /* @ts-ignore */
|
|
110
|
-
...(ngDevMode ? [{ debugName: "controlId" }] : /* istanbul ignore next */ []));
|
|
111
|
-
this.ariaLabel = input(null, /* @ts-ignore */
|
|
112
|
-
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
113
|
-
this.clearable = input(true, { ...(ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
114
|
-
/**
|
|
115
|
-
* Видимая resting-рамка контрола. По умолчанию `true` — рамка видна на обеих
|
|
116
|
-
* темах. `false` снимает только resting-рамку; focus/invalid состояния свою
|
|
117
|
-
* рамку показывают всё равно, read-only остаётся плоским.
|
|
118
|
-
*/
|
|
119
|
-
this.bordered = input(true, { ...(ngDevMode ? { debugName: "bordered" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
120
|
-
/** Итоговый id поля: явный input важнее авто-id, назначенного rt-field. */
|
|
121
|
-
this.effectiveControlId = computed(() => this.controlId() ?? this.#controlIdAssigned(), /* @ts-ignore */
|
|
122
|
-
...(ngDevMode ? [{ debugName: "effectiveControlId" }] : /* istanbul ignore next */ []));
|
|
123
|
-
/** Read-only режим (плоский текст вместо контрола); включается rt-field'ом. */
|
|
124
|
-
this.isReadonly = this.#readonlyAssigned.asReadonly();
|
|
125
|
-
/** Публичный invalid для rt-field (touched/dirty учтён в состоянии). */
|
|
126
|
-
this.invalid = computed(() => this.isInvalid(), /* @ts-ignore */
|
|
127
|
-
...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
|
|
128
|
-
/** Текущие ошибки связанного контрола — источник текста ошибки в rt-field. */
|
|
129
|
-
this.errors = computed(() => this.#state().errors ?? (this.#missingRequired() ? { required: true } : null), /* @ts-ignore */
|
|
130
|
-
...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
|
|
131
|
-
/** Обязателен ли контрол — по валидатору формы или по слову rt-field. Для авто-«*». */
|
|
132
|
-
this.required = computed(() => this.#state().required || this.#requiredAssigned(), /* @ts-ignore */
|
|
133
|
-
...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
|
|
134
|
-
this.value = signal(this.getEmptyValue(), /* @ts-ignore */
|
|
135
|
-
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
136
|
-
// Self-inject NgControl + ручная привязка valueAccessor: доступ к
|
|
137
|
-
// control.invalid/touched без NG_VALUE_ACCESSOR provider'а (тот
|
|
138
|
-
// спровоцировал бы NG0200 cycle при self-reference).
|
|
139
|
-
if (this.#ngControl !== null) {
|
|
140
|
-
this.#ngControl.valueAccessor = this;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
ngOnInit() {
|
|
144
|
-
const control = this.#ngControl?.control ?? null;
|
|
145
|
-
if (control === null) {
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
// Контрол, который состояния не рассылает, — переходник сигнальной формы: событий у
|
|
149
|
-
// него нет вовсе, и подписка на них роняла поле из запуска вместе со всем поддеревом
|
|
150
|
-
// разметки. Состояние у него читается геттерами, поэтому берётся вычислением.
|
|
151
|
-
if (!emitsEvents(control)) {
|
|
152
|
-
this.#signalControl.set(control);
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
// Авто-подсветка invalid + зеркало ошибок/required для rt-field.
|
|
156
|
-
this.#pushedState.set(stateOf(control));
|
|
157
|
-
control.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {
|
|
158
|
-
this.#pushedState.set(stateOf(control));
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
writeValue(value) {
|
|
162
|
-
this.value.set(value ?? this.getEmptyValue());
|
|
163
|
-
}
|
|
164
|
-
registerOnChange(fn) {
|
|
165
|
-
this.#onChange = fn;
|
|
166
|
-
}
|
|
167
|
-
registerOnTouched(fn) {
|
|
168
|
-
this.#onTouched = fn;
|
|
169
|
-
}
|
|
170
|
-
setDisabledState(isDisabled) {
|
|
171
|
-
this.#disabledByForm.set(isDisabled);
|
|
172
|
-
}
|
|
173
|
-
/** Назначить авто-id (rt-field), когда у контрола нет явного controlId. */
|
|
174
|
-
assignControlId(id) {
|
|
175
|
-
this.#controlIdAssigned.set(id);
|
|
176
|
-
}
|
|
177
|
-
/** Включить/выключить read-only режим — вызывает родительский rt-field. */
|
|
178
|
-
setReadonly(value) {
|
|
179
|
-
this.#readonlyAssigned.set(value);
|
|
180
|
-
}
|
|
181
|
-
/** Объявить контрол обязательным — вызывает родительский rt-field. */
|
|
182
|
-
setRequired(value) {
|
|
183
|
-
this.#requiredAssigned.set(value);
|
|
184
|
-
}
|
|
185
|
-
/** Очистка значения по кнопке-крестику + возврат фокуса в поле. */
|
|
186
|
-
clear(event) {
|
|
187
|
-
event?.stopPropagation();
|
|
188
|
-
if (this.isDisabled()) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
this.clearValue();
|
|
192
|
-
this.#onChange(this.value());
|
|
193
|
-
this.#onTouched();
|
|
194
|
-
this.focusAfterClear();
|
|
195
|
-
}
|
|
196
|
-
/** Сбрасывает значение к пустому. Поля с display-сигналом расширяют. */
|
|
197
|
-
clearValue() {
|
|
198
|
-
this.value.set(this.getEmptyValue());
|
|
199
|
-
}
|
|
200
|
-
/** Прокидывает change наружу — для обработчиков пользовательского ввода. */
|
|
201
|
-
emitChange(value) {
|
|
202
|
-
this.#onChange(value);
|
|
203
|
-
}
|
|
204
|
-
/** Помечает контрол touched — для blur/close-обработчиков. */
|
|
205
|
-
markTouched() {
|
|
206
|
-
this.#onTouched();
|
|
207
|
-
}
|
|
208
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RtFormControlBase, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
209
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: RtFormControlBase, isStandalone: true, inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, controlId: { classPropertyName: "controlId", publicName: "controlId", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
15
|
+
return {
|
|
16
|
+
invalid: !!control.invalid && (control.touched || control.dirty),
|
|
17
|
+
errors: control.errors,
|
|
18
|
+
required: control.hasValidator(Validators.required),
|
|
19
|
+
interacted: control.touched || control.dirty
|
|
20
|
+
};
|
|
210
21
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
22
|
+
var RtFormControlBase = class RtFormControlBase {
|
|
23
|
+
#ngControl;
|
|
24
|
+
#destroyRef;
|
|
25
|
+
#onChange;
|
|
26
|
+
#onTouched;
|
|
27
|
+
#controlIdAssigned;
|
|
28
|
+
#readonlyAssigned;
|
|
29
|
+
#requiredAssigned;
|
|
30
|
+
#pushedState;
|
|
31
|
+
#signalControl;
|
|
32
|
+
#disabledByForm;
|
|
33
|
+
#state;
|
|
34
|
+
#missingRequired;
|
|
35
|
+
constructor() {
|
|
36
|
+
this.#ngControl = inject(NgControl, {
|
|
37
|
+
self: true,
|
|
38
|
+
optional: true
|
|
39
|
+
});
|
|
40
|
+
this.#destroyRef = inject(DestroyRef);
|
|
41
|
+
this.#onChange = () => void 0;
|
|
42
|
+
this.#onTouched = () => void 0;
|
|
43
|
+
this.#controlIdAssigned = signal(null, ...ngDevMode ? [{ debugName: "#controlIdAssigned" }] : /* istanbul ignore next */ []);
|
|
44
|
+
this.#readonlyAssigned = signal(false, ...ngDevMode ? [{ debugName: "#readonlyAssigned" }] : /* istanbul ignore next */ []);
|
|
45
|
+
this.#requiredAssigned = signal(false, ...ngDevMode ? [{ debugName: "#requiredAssigned" }] : /* istanbul ignore next */ []);
|
|
46
|
+
this.#pushedState = signal(PRISTINE_STATE, ...ngDevMode ? [{ debugName: "#pushedState" }] : /* istanbul ignore next */ []);
|
|
47
|
+
this.#signalControl = signal(null, ...ngDevMode ? [{ debugName: "#signalControl" }] : /* istanbul ignore next */ []);
|
|
48
|
+
this.#disabledByForm = signal(false, ...ngDevMode ? [{ debugName: "#disabledByForm" }] : /* istanbul ignore next */ []);
|
|
49
|
+
this.isDisabled = computed(() => this.disabled() || this.#disabledByForm(), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
|
|
50
|
+
this.#state = computed(() => {
|
|
51
|
+
const control = this.#signalControl();
|
|
52
|
+
return control === null ? this.#pushedState() : stateOf(control);
|
|
53
|
+
}, ...ngDevMode ? [{ debugName: "#state" }] : /* istanbul ignore next */ []);
|
|
54
|
+
this.#missingRequired = computed(() => this.#requiredAssigned() && !this.#state().required && this.#state().interacted && !this.hasValue(), ...ngDevMode ? [{ debugName: "#missingRequired" }] : /* istanbul ignore next */ []);
|
|
55
|
+
this.isInvalid = computed(() => this.#state().invalid || this.#missingRequired(), ...ngDevMode ? [{ debugName: "isInvalid" }] : /* istanbul ignore next */ []);
|
|
56
|
+
this.showClearButton = computed(() => this.clearable() && this.hasValue() && !this.isDisabled(), ...ngDevMode ? [{ debugName: "showClearButton" }] : /* istanbul ignore next */ []);
|
|
57
|
+
this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
|
|
58
|
+
this.disabled = input(false, {
|
|
59
|
+
...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
|
|
60
|
+
transform: booleanAttribute
|
|
61
|
+
});
|
|
62
|
+
this.controlId = input(null, ...ngDevMode ? [{ debugName: "controlId" }] : /* istanbul ignore next */ []);
|
|
63
|
+
this.ariaLabel = input(null, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
|
|
64
|
+
this.clearable = input(true, {
|
|
65
|
+
...ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {},
|
|
66
|
+
transform: booleanAttribute
|
|
67
|
+
});
|
|
68
|
+
this.bordered = input(true, {
|
|
69
|
+
...ngDevMode ? { debugName: "bordered" } : /* istanbul ignore next */ {},
|
|
70
|
+
transform: booleanAttribute
|
|
71
|
+
});
|
|
72
|
+
this.effectiveControlId = computed(() => this.controlId() ?? this.#controlIdAssigned(), ...ngDevMode ? [{ debugName: "effectiveControlId" }] : /* istanbul ignore next */ []);
|
|
73
|
+
this.isReadonly = this.#readonlyAssigned.asReadonly();
|
|
74
|
+
this.invalid = computed(() => this.isInvalid(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
|
|
75
|
+
this.errors = computed(() => this.#state().errors ?? (this.#missingRequired() ? { required: true } : null), ...ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []);
|
|
76
|
+
this.required = computed(() => this.#state().required || this.#requiredAssigned(), ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
|
|
77
|
+
this.value = signal(this.getEmptyValue(), ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
|
|
78
|
+
if (this.#ngControl !== null) this.#ngControl.valueAccessor = this;
|
|
79
|
+
}
|
|
80
|
+
ngOnInit() {
|
|
81
|
+
const control = this.#ngControl?.control ?? null;
|
|
82
|
+
if (control === null) return;
|
|
83
|
+
if (!emitsEvents(control)) {
|
|
84
|
+
this.#signalControl.set(control);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.#pushedState.set(stateOf(control));
|
|
88
|
+
control.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {
|
|
89
|
+
this.#pushedState.set(stateOf(control));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
writeValue(value) {
|
|
93
|
+
this.value.set(value ?? this.getEmptyValue());
|
|
94
|
+
}
|
|
95
|
+
registerOnChange(fn) {
|
|
96
|
+
this.#onChange = fn;
|
|
97
|
+
}
|
|
98
|
+
registerOnTouched(fn) {
|
|
99
|
+
this.#onTouched = fn;
|
|
100
|
+
}
|
|
101
|
+
setDisabledState(isDisabled) {
|
|
102
|
+
this.#disabledByForm.set(isDisabled);
|
|
103
|
+
}
|
|
104
|
+
assignControlId(id) {
|
|
105
|
+
this.#controlIdAssigned.set(id);
|
|
106
|
+
}
|
|
107
|
+
setReadonly(value) {
|
|
108
|
+
this.#readonlyAssigned.set(value);
|
|
109
|
+
}
|
|
110
|
+
setRequired(value) {
|
|
111
|
+
this.#requiredAssigned.set(value);
|
|
112
|
+
}
|
|
113
|
+
clear(event) {
|
|
114
|
+
event?.stopPropagation();
|
|
115
|
+
if (this.isDisabled()) return;
|
|
116
|
+
this.clearValue();
|
|
117
|
+
this.#onChange(this.value());
|
|
118
|
+
this.#onTouched();
|
|
119
|
+
this.focusAfterClear();
|
|
120
|
+
}
|
|
121
|
+
clearValue() {
|
|
122
|
+
this.value.set(this.getEmptyValue());
|
|
123
|
+
}
|
|
124
|
+
emitChange(value) {
|
|
125
|
+
this.#onChange(value);
|
|
126
|
+
}
|
|
127
|
+
markTouched() {
|
|
128
|
+
this.#onTouched();
|
|
129
|
+
}
|
|
130
|
+
static {
|
|
131
|
+
this.ɵfac = i0.ɵɵngDeclareFactory({
|
|
132
|
+
minVersion: "12.0.0",
|
|
133
|
+
version: "22.2.2",
|
|
134
|
+
ngImport: i0,
|
|
135
|
+
type: RtFormControlBase,
|
|
136
|
+
deps: [],
|
|
137
|
+
target: i0.ɵɵFactoryTarget.Directive
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
static {
|
|
141
|
+
this.ɵdir = i0.ɵɵngDeclareDirective({
|
|
142
|
+
minVersion: "17.1.0",
|
|
143
|
+
version: "22.2.2",
|
|
144
|
+
type: RtFormControlBase,
|
|
145
|
+
isStandalone: true,
|
|
146
|
+
inputs: {
|
|
147
|
+
size: {
|
|
148
|
+
classPropertyName: "size",
|
|
149
|
+
publicName: "size",
|
|
150
|
+
isSignal: true,
|
|
151
|
+
isRequired: false,
|
|
152
|
+
transformFunction: null
|
|
153
|
+
},
|
|
154
|
+
disabled: {
|
|
155
|
+
classPropertyName: "disabled",
|
|
156
|
+
publicName: "disabled",
|
|
157
|
+
isSignal: true,
|
|
158
|
+
isRequired: false,
|
|
159
|
+
transformFunction: null
|
|
160
|
+
},
|
|
161
|
+
controlId: {
|
|
162
|
+
classPropertyName: "controlId",
|
|
163
|
+
publicName: "controlId",
|
|
164
|
+
isSignal: true,
|
|
165
|
+
isRequired: false,
|
|
166
|
+
transformFunction: null
|
|
167
|
+
},
|
|
168
|
+
ariaLabel: {
|
|
169
|
+
classPropertyName: "ariaLabel",
|
|
170
|
+
publicName: "ariaLabel",
|
|
171
|
+
isSignal: true,
|
|
172
|
+
isRequired: false,
|
|
173
|
+
transformFunction: null
|
|
174
|
+
},
|
|
175
|
+
clearable: {
|
|
176
|
+
classPropertyName: "clearable",
|
|
177
|
+
publicName: "clearable",
|
|
178
|
+
isSignal: true,
|
|
179
|
+
isRequired: false,
|
|
180
|
+
transformFunction: null
|
|
181
|
+
},
|
|
182
|
+
bordered: {
|
|
183
|
+
classPropertyName: "bordered",
|
|
184
|
+
publicName: "bordered",
|
|
185
|
+
isSignal: true,
|
|
186
|
+
isRequired: false,
|
|
187
|
+
transformFunction: null
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
ngImport: i0
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
195
|
+
minVersion: "12.0.0",
|
|
196
|
+
version: "22.2.2",
|
|
197
|
+
ngImport: i0,
|
|
198
|
+
type: RtFormControlBase,
|
|
199
|
+
decorators: [{ type: Directive }],
|
|
200
|
+
ctorParameters: () => [],
|
|
201
|
+
propDecorators: {
|
|
202
|
+
size: [{
|
|
203
|
+
type: i0.Input,
|
|
204
|
+
args: [{
|
|
205
|
+
isSignal: true,
|
|
206
|
+
alias: "size",
|
|
207
|
+
required: false
|
|
208
|
+
}]
|
|
209
|
+
}],
|
|
210
|
+
disabled: [{
|
|
211
|
+
type: i0.Input,
|
|
212
|
+
args: [{
|
|
213
|
+
isSignal: true,
|
|
214
|
+
alias: "disabled",
|
|
215
|
+
required: false
|
|
216
|
+
}]
|
|
217
|
+
}],
|
|
218
|
+
controlId: [{
|
|
219
|
+
type: i0.Input,
|
|
220
|
+
args: [{
|
|
221
|
+
isSignal: true,
|
|
222
|
+
alias: "controlId",
|
|
223
|
+
required: false
|
|
224
|
+
}]
|
|
225
|
+
}],
|
|
226
|
+
ariaLabel: [{
|
|
227
|
+
type: i0.Input,
|
|
228
|
+
args: [{
|
|
229
|
+
isSignal: true,
|
|
230
|
+
alias: "ariaLabel",
|
|
231
|
+
required: false
|
|
232
|
+
}]
|
|
233
|
+
}],
|
|
234
|
+
clearable: [{
|
|
235
|
+
type: i0.Input,
|
|
236
|
+
args: [{
|
|
237
|
+
isSignal: true,
|
|
238
|
+
alias: "clearable",
|
|
239
|
+
required: false
|
|
240
|
+
}]
|
|
241
|
+
}],
|
|
242
|
+
bordered: [{
|
|
243
|
+
type: i0.Input,
|
|
244
|
+
args: [{
|
|
245
|
+
isSignal: true,
|
|
246
|
+
alias: "bordered",
|
|
247
|
+
required: false
|
|
248
|
+
}]
|
|
249
|
+
}]
|
|
250
|
+
}
|
|
251
|
+
});
|
|
219
252
|
export { RtFormControlBase };
|
|
220
|
-
|
|
253
|
+
|
|
254
|
+
//# sourceMappingURL=rt-tools-ui-kit-v2-form-control.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-form-control.mjs","sources":["../../../projects/ui-kit-v2/src/lib/components/form-control/rt-form-control.base.ts","../../../projects/ui-kit-v2/src/lib/components/form-control/rt-tools-ui-kit-v2-form-control.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validators } from '@angular/forms';\n\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\n\n/**\n * Базовый класс input-семейства common/ui. Владеет единым CVA-ядром:\n * - self-injected `NgControl` + ручная привязка `valueAccessor` (без\n * `NG_VALUE_ACCESSOR` provider — иначе NG0200 cycle при self-reference),\n * что даёт доступ к `control.invalid/touched` для авто-подсветки ошибки;\n * - сигнал значения `value`, состояния `isDisabled`/`isInvalid` (отключение\n * складывается из входа `disabled` и слова формы — см. `isDisabled`);\n * - общие инпуты `size`/`disabled`/`controlId`/`ariaLabel`/`clearable`;\n * - оркестрацию очистки (`clear`) через абстрактные хуки конкретного поля.\n *\n * Конкретные поля реализуют `getEmptyValue`/`hasValue`/`focusAfterClear`. Поля\n * с отдельным display-состоянием (autocomplete, input-number) дополнительно\n * переопределяют `writeValue`/`clearValue`, синхронизируя свой display-сигнал.\n */\n/**\n * Состояние формы, каким его видит поле: негодность, ошибки и обязательность.\n *\n * Собрано одной записью затем, что источников у него два и говорят они по-разному. Прежняя\n * привязка рассылает состояние событиями контрола, сигнальная — не рассылает вовсе и отдаёт\n * его чтениями своего переходника. Порознь эти два пути дали бы полю два набора сигналов, и\n * обёртке пришлось бы знать, какой из них живой.\n */\ninterface IControlState {\n invalid: boolean;\n errors: ValidationErrors | null;\n required: boolean;\n /** Касались ли контрола или правили его: до этого пустое обязательное поле не краснеет. */\n interacted: boolean;\n}\n\n/** Состояние поля, которому форма ещё ничего не сказала. */\nconst PRISTINE_STATE: IControlState = { invalid: false, errors: null, required: false, interacted: false };\n\n/** Рассылает ли контрол своё состояние. Переходник сигнальной формы — не рассылает. */\nfunction emitsEvents(control: AbstractControl): boolean {\n return typeof (control.events as { pipe?: unknown } | undefined)?.pipe === 'function';\n}\n\n/** Состояние формы, снятое с контрола любого рода. */\nfunction stateOf(control: AbstractControl): IControlState {\n return {\n invalid: !!control.invalid && (control.touched || control.dirty),\n errors: control.errors,\n required: control.hasValidator(Validators.required),\n interacted: control.touched || control.dirty,\n };\n}\n\n@Directive()\nexport abstract class RtFormControlBase<TValue> implements ControlValueAccessor, OnInit {\n readonly #ngControl: NgControl | null = inject(NgControl, { self: true, optional: true });\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n #onChange: (value: TValue) => void = (): void => undefined;\n #onTouched: () => void = (): void => undefined;\n\n // Состояние, которым управляет родительский rt-field (через публичные сеттеры):\n // авто-id для связки label[for], read-only режим, зеркало ошибок/required.\n readonly #controlIdAssigned: WritableSignal<string | null> = signal<string | null>(null);\n readonly #readonlyAssigned: WritableSignal<boolean> = signal<boolean>(false);\n /**\n * Обязательность, объявленная полем. Шаблонная форма валидатора на контрол не кладёт, и без\n * этого признака её обязательное поле не получало бы ни звёздочки, ни ошибки.\n */\n readonly #requiredAssigned: WritableSignal<boolean> = signal<boolean>(false);\n /** Состояние, разосланное прежней привязкой: её контрол сигналами не читается. */\n readonly #pushedState: WritableSignal<IControlState> = signal<IControlState>(PRISTINE_STATE);\n /**\n * Контрол сигнальной привязки. Его состояние не рассылается, а читается геттерами, и\n * внутри геттеров стоят вызовы сигналов формы — то есть из `computed` оно реактивно.\n */\n readonly #signalControl: WritableSignal<AbstractControl | null> = signal<AbstractControl | null>(null);\n /** Отключение, назначенное формой через CVA (`setDisabledState`). */\n readonly #disabledByForm: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly value: WritableSignal<TValue>;\n /**\n * Отключение: вход и форма — два независимых источника, поле отключено,\n * если так сказал любой из них. Сводить их в один signal нельзя: форма\n * зовёт `setDisabledState` при связывании контрола, то есть раньше, чем\n * поле впервые обновит своё вью, и мирроринг входа затирал бы её слово —\n * контрол, созданный отключённым, оказывался бы редактируемым.\n */\n protected readonly isDisabled: Signal<boolean> = computed((): boolean => this.disabled() || this.#disabledByForm());\n /** Состояние формы: у сигнальной привязки читается, у прежней берётся разосланное. */\n readonly #state: Signal<IControlState> = computed((): IControlState => {\n const control: AbstractControl | null = this.#signalControl();\n return control === null ? this.#pushedState() : stateOf(control);\n });\n\n /**\n * Пустое поле, обязательное по слову rt-field, которого уже коснулись. Валидатор формы здесь\n * не нужен: его ошибку контрол и так получает от формы.\n */\n readonly #missingRequired: Signal<boolean> = computed(\n (): boolean => this.#requiredAssigned() && !this.#state().required && this.#state().interacted && !this.hasValue()\n );\n\n protected readonly isInvalid: Signal<boolean> = computed((): boolean => this.#state().invalid || this.#missingRequired());\n\n /** Видимость кнопки очистки: включена, есть значение, поле активно. */\n protected readonly showClearButton: Signal<boolean> = computed(\n (): boolean => this.clearable() && this.hasValue() && !this.isDisabled()\n );\n\n /** Есть ли в поле значение — гейт видимости крестика. */\n protected abstract readonly hasValue: Signal<boolean>;\n\n public readonly size: InputSignal<IRtInput.Size> = input<IRtInput.Size>('md');\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly controlId: InputSignal<string | null> = input<string | null>(null);\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n public readonly clearable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /**\n * Видимая resting-рамка контрола. По умолчанию `true` — рамка видна на обеих\n * темах. `false` снимает только resting-рамку; focus/invalid состояния свою\n * рамку показывают всё равно, read-only остаётся плоским.\n */\n public readonly bordered: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Итоговый id поля: явный input важнее авто-id, назначенного rt-field. */\n public readonly effectiveControlId: Signal<string | null> = computed(\n (): string | null => this.controlId() ?? this.#controlIdAssigned()\n );\n\n /** Read-only режим (плоский текст вместо контрола); включается rt-field'ом. */\n public readonly isReadonly: Signal<boolean> = this.#readonlyAssigned.asReadonly();\n\n /** Публичный invalid для rt-field (touched/dirty учтён в состоянии). */\n public readonly invalid: Signal<boolean> = computed((): boolean => this.isInvalid());\n\n /** Текущие ошибки связанного контрола — источник текста ошибки в rt-field. */\n public readonly errors: Signal<ValidationErrors | null> = computed(\n (): ValidationErrors | null => this.#state().errors ?? (this.#missingRequired() ? { required: true } : null)\n );\n\n /** Обязателен ли контрол — по валидатору формы или по слову rt-field. Для авто-«*». */\n public readonly required: Signal<boolean> = computed((): boolean => this.#state().required || this.#requiredAssigned());\n\n /** Текст read-only представления. Реализуется конкретным контролом. */\n public abstract readonly displayText: Signal<string>;\n\n constructor() {\n this.value = signal<TValue>(this.getEmptyValue());\n // Self-inject NgControl + ручная привязка valueAccessor: доступ к\n // control.invalid/touched без NG_VALUE_ACCESSOR provider'а (тот\n // спровоцировал бы NG0200 cycle при self-reference).\n if (this.#ngControl !== null) {\n this.#ngControl.valueAccessor = this;\n }\n }\n\n public ngOnInit(): void {\n const control: AbstractControl | null = this.#ngControl?.control ?? null;\n if (control === null) {\n return;\n }\n // Контрол, который состояния не рассылает, — переходник сигнальной формы: событий у\n // него нет вовсе, и подписка на них роняла поле из запуска вместе со всем поддеревом\n // разметки. Состояние у него читается геттерами, поэтому берётся вычислением.\n if (!emitsEvents(control)) {\n this.#signalControl.set(control);\n return;\n }\n // Авто-подсветка invalid + зеркало ошибок/required для rt-field.\n this.#pushedState.set(stateOf(control));\n control.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((): void => {\n this.#pushedState.set(stateOf(control));\n });\n }\n\n public writeValue(value: TValue | null): void {\n this.value.set(value ?? this.getEmptyValue());\n }\n\n public registerOnChange(fn: (value: TValue) => void): void {\n this.#onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.#disabledByForm.set(isDisabled);\n }\n\n /** Назначить авто-id (rt-field), когда у контрола нет явного controlId. */\n public assignControlId(id: string): void {\n this.#controlIdAssigned.set(id);\n }\n\n /** Включить/выключить read-only режим — вызывает родительский rt-field. */\n public setReadonly(value: boolean): void {\n this.#readonlyAssigned.set(value);\n }\n\n /** Объявить контрол обязательным — вызывает родительский rt-field. */\n public setRequired(value: boolean): void {\n this.#requiredAssigned.set(value);\n }\n\n /** Очистка значения по кнопке-крестику + возврат фокуса в поле. */\n protected clear(event?: Event): void {\n event?.stopPropagation();\n if (this.isDisabled()) {\n return;\n }\n this.clearValue();\n this.#onChange(this.value());\n this.#onTouched();\n this.focusAfterClear();\n }\n\n /** Сбрасывает значение к пустому. Поля с display-сигналом расширяют. */\n protected clearValue(): void {\n this.value.set(this.getEmptyValue());\n }\n\n /** Прокидывает change наружу — для обработчиков пользовательского ввода. */\n protected emitChange(value: TValue): void {\n this.#onChange(value);\n }\n\n /** Помечает контрол touched — для blur/close-обработчиков. */\n protected markTouched(): void {\n this.#onTouched();\n }\n\n /** Пустое значение поля (тип-специфично: \"\", null, []). */\n protected abstract getEmptyValue(): TValue;\n\n /** Возврат фокуса после очистки (в input или на trigger-кнопку). */\n protected abstract focusAfterClear(): void;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-form-control.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/form-control/rt-form-control.base.ts"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n InputSignal,\n InputSignalWithTransform,\n OnInit,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AbstractControl, ControlValueAccessor, NgControl, ValidationErrors, Validators } from '@angular/forms';\n\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\n\n/**\n * Базовый класс input-семейства common/ui. Владеет единым CVA-ядром:\n * - self-injected `NgControl` + ручная привязка `valueAccessor` (без\n * `NG_VALUE_ACCESSOR` provider — иначе NG0200 cycle при self-reference),\n * что даёт доступ к `control.invalid/touched` для авто-подсветки ошибки;\n * - сигнал значения `value`, состояния `isDisabled`/`isInvalid` (отключение\n * складывается из входа `disabled` и слова формы — см. `isDisabled`);\n * - общие инпуты `size`/`disabled`/`controlId`/`ariaLabel`/`clearable`;\n * - оркестрацию очистки (`clear`) через абстрактные хуки конкретного поля.\n *\n * Конкретные поля реализуют `getEmptyValue`/`hasValue`/`focusAfterClear`. Поля\n * с отдельным display-состоянием (autocomplete, input-number) дополнительно\n * переопределяют `writeValue`/`clearValue`, синхронизируя свой display-сигнал.\n */\n/**\n * Состояние формы, каким его видит поле: негодность, ошибки и обязательность.\n *\n * Собрано одной записью затем, что источников у него два и говорят они по-разному. Прежняя\n * привязка рассылает состояние событиями контрола, сигнальная — не рассылает вовсе и отдаёт\n * его чтениями своего переходника. Порознь эти два пути дали бы полю два набора сигналов, и\n * обёртке пришлось бы знать, какой из них живой.\n */\ninterface IControlState {\n invalid: boolean;\n errors: ValidationErrors | null;\n required: boolean;\n /** Касались ли контрола или правили его: до этого пустое обязательное поле не краснеет. */\n interacted: boolean;\n}\n\n/** Состояние поля, которому форма ещё ничего не сказала. */\nconst PRISTINE_STATE: IControlState = { invalid: false, errors: null, required: false, interacted: false };\n\n/** Рассылает ли контрол своё состояние. Переходник сигнальной формы — не рассылает. */\nfunction emitsEvents(control: AbstractControl): boolean {\n return typeof (control.events as { pipe?: unknown } | undefined)?.pipe === 'function';\n}\n\n/** Состояние формы, снятое с контрола любого рода. */\nfunction stateOf(control: AbstractControl): IControlState {\n return {\n invalid: !!control.invalid && (control.touched || control.dirty),\n errors: control.errors,\n required: control.hasValidator(Validators.required),\n interacted: control.touched || control.dirty,\n };\n}\n\n@Directive()\nexport abstract class RtFormControlBase<TValue> implements ControlValueAccessor, OnInit {\n readonly #ngControl: NgControl | null = inject(NgControl, { self: true, optional: true });\n readonly #destroyRef: DestroyRef = inject(DestroyRef);\n\n #onChange: (value: TValue) => void = (): void => undefined;\n #onTouched: () => void = (): void => undefined;\n\n // Состояние, которым управляет родительский rt-field (через публичные сеттеры):\n // авто-id для связки label[for], read-only режим, зеркало ошибок/required.\n readonly #controlIdAssigned: WritableSignal<string | null> = signal<string | null>(null);\n readonly #readonlyAssigned: WritableSignal<boolean> = signal<boolean>(false);\n /**\n * Обязательность, объявленная полем. Шаблонная форма валидатора на контрол не кладёт, и без\n * этого признака её обязательное поле не получало бы ни звёздочки, ни ошибки.\n */\n readonly #requiredAssigned: WritableSignal<boolean> = signal<boolean>(false);\n /** Состояние, разосланное прежней привязкой: её контрол сигналами не читается. */\n readonly #pushedState: WritableSignal<IControlState> = signal<IControlState>(PRISTINE_STATE);\n /**\n * Контрол сигнальной привязки. Его состояние не рассылается, а читается геттерами, и\n * внутри геттеров стоят вызовы сигналов формы — то есть из `computed` оно реактивно.\n */\n readonly #signalControl: WritableSignal<AbstractControl | null> = signal<AbstractControl | null>(null);\n /** Отключение, назначенное формой через CVA (`setDisabledState`). */\n readonly #disabledByForm: WritableSignal<boolean> = signal<boolean>(false);\n\n protected readonly value: WritableSignal<TValue>;\n /**\n * Отключение: вход и форма — два независимых источника, поле отключено,\n * если так сказал любой из них. Сводить их в один signal нельзя: форма\n * зовёт `setDisabledState` при связывании контрола, то есть раньше, чем\n * поле впервые обновит своё вью, и мирроринг входа затирал бы её слово —\n * контрол, созданный отключённым, оказывался бы редактируемым.\n */\n protected readonly isDisabled: Signal<boolean> = computed((): boolean => this.disabled() || this.#disabledByForm());\n /** Состояние формы: у сигнальной привязки читается, у прежней берётся разосланное. */\n readonly #state: Signal<IControlState> = computed((): IControlState => {\n const control: AbstractControl | null = this.#signalControl();\n return control === null ? this.#pushedState() : stateOf(control);\n });\n\n /**\n * Пустое поле, обязательное по слову rt-field, которого уже коснулись. Валидатор формы здесь\n * не нужен: его ошибку контрол и так получает от формы.\n */\n readonly #missingRequired: Signal<boolean> = computed(\n (): boolean => this.#requiredAssigned() && !this.#state().required && this.#state().interacted && !this.hasValue()\n );\n\n protected readonly isInvalid: Signal<boolean> = computed((): boolean => this.#state().invalid || this.#missingRequired());\n\n /** Видимость кнопки очистки: включена, есть значение, поле активно. */\n protected readonly showClearButton: Signal<boolean> = computed(\n (): boolean => this.clearable() && this.hasValue() && !this.isDisabled()\n );\n\n /** Есть ли в поле значение — гейт видимости крестика. */\n protected abstract readonly hasValue: Signal<boolean>;\n\n public readonly size: InputSignal<IRtInput.Size> = input<IRtInput.Size>('md');\n public readonly disabled: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n public readonly controlId: InputSignal<string | null> = input<string | null>(null);\n public readonly ariaLabel: InputSignal<string | null> = input<string | null>(null);\n public readonly clearable: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /**\n * Видимая resting-рамка контрола. По умолчанию `true` — рамка видна на обеих\n * темах. `false` снимает только resting-рамку; focus/invalid состояния свою\n * рамку показывают всё равно, read-only остаётся плоским.\n */\n public readonly bordered: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(true, {\n transform: booleanAttribute,\n });\n\n /** Итоговый id поля: явный input важнее авто-id, назначенного rt-field. */\n public readonly effectiveControlId: Signal<string | null> = computed(\n (): string | null => this.controlId() ?? this.#controlIdAssigned()\n );\n\n /** Read-only режим (плоский текст вместо контрола); включается rt-field'ом. */\n public readonly isReadonly: Signal<boolean> = this.#readonlyAssigned.asReadonly();\n\n /** Публичный invalid для rt-field (touched/dirty учтён в состоянии). */\n public readonly invalid: Signal<boolean> = computed((): boolean => this.isInvalid());\n\n /** Текущие ошибки связанного контрола — источник текста ошибки в rt-field. */\n public readonly errors: Signal<ValidationErrors | null> = computed(\n (): ValidationErrors | null => this.#state().errors ?? (this.#missingRequired() ? { required: true } : null)\n );\n\n /** Обязателен ли контрол — по валидатору формы или по слову rt-field. Для авто-«*». */\n public readonly required: Signal<boolean> = computed((): boolean => this.#state().required || this.#requiredAssigned());\n\n /** Текст read-only представления. Реализуется конкретным контролом. */\n public abstract readonly displayText: Signal<string>;\n\n constructor() {\n this.value = signal<TValue>(this.getEmptyValue());\n // Self-inject NgControl + ручная привязка valueAccessor: доступ к\n // control.invalid/touched без NG_VALUE_ACCESSOR provider'а (тот\n // спровоцировал бы NG0200 cycle при self-reference).\n if (this.#ngControl !== null) {\n this.#ngControl.valueAccessor = this;\n }\n }\n\n public ngOnInit(): void {\n const control: AbstractControl | null = this.#ngControl?.control ?? null;\n if (control === null) {\n return;\n }\n // Контрол, который состояния не рассылает, — переходник сигнальной формы: событий у\n // него нет вовсе, и подписка на них роняла поле из запуска вместе со всем поддеревом\n // разметки. Состояние у него читается геттерами, поэтому берётся вычислением.\n if (!emitsEvents(control)) {\n this.#signalControl.set(control);\n return;\n }\n // Авто-подсветка invalid + зеркало ошибок/required для rt-field.\n this.#pushedState.set(stateOf(control));\n control.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((): void => {\n this.#pushedState.set(stateOf(control));\n });\n }\n\n public writeValue(value: TValue | null): void {\n this.value.set(value ?? this.getEmptyValue());\n }\n\n public registerOnChange(fn: (value: TValue) => void): void {\n this.#onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.#onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.#disabledByForm.set(isDisabled);\n }\n\n /** Назначить авто-id (rt-field), когда у контрола нет явного controlId. */\n public assignControlId(id: string): void {\n this.#controlIdAssigned.set(id);\n }\n\n /** Включить/выключить read-only режим — вызывает родительский rt-field. */\n public setReadonly(value: boolean): void {\n this.#readonlyAssigned.set(value);\n }\n\n /** Объявить контрол обязательным — вызывает родительский rt-field. */\n public setRequired(value: boolean): void {\n this.#requiredAssigned.set(value);\n }\n\n /** Очистка значения по кнопке-крестику + возврат фокуса в поле. */\n protected clear(event?: Event): void {\n event?.stopPropagation();\n if (this.isDisabled()) {\n return;\n }\n this.clearValue();\n this.#onChange(this.value());\n this.#onTouched();\n this.focusAfterClear();\n }\n\n /** Сбрасывает значение к пустому. Поля с display-сигналом расширяют. */\n protected clearValue(): void {\n this.value.set(this.getEmptyValue());\n }\n\n /** Прокидывает change наружу — для обработчиков пользовательского ввода. */\n protected emitChange(value: TValue): void {\n this.#onChange(value);\n }\n\n /** Помечает контрол touched — для blur/close-обработчиков. */\n protected markTouched(): void {\n this.#onTouched();\n }\n\n /** Пустое значение поля (тип-специфично: \"\", null, []). */\n protected abstract getEmptyValue(): TValue;\n\n /** Возврат фокуса после очистки (в input или на trigger-кнопку). */\n protected abstract focusAfterClear(): void;\n}\n"],"mappings":"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"}
|