@simplysm/angular 14.0.42 → 14.0.43

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 (241) hide show
  1. package/dist/controls/button/sd-additional-button.js +1 -1
  2. package/dist/controls/button/sd-anchor.js +1 -1
  3. package/dist/controls/button/sd-button.js +1 -1
  4. package/dist/controls/button/sd-modal-select-button.d.ts +1 -1
  5. package/dist/controls/button/sd-modal-select-button.d.ts.map +1 -1
  6. package/dist/controls/button/sd-modal-select-button.js +8 -6
  7. package/dist/controls/checkbox/sd-checkbox-group-item.js +1 -1
  8. package/dist/controls/checkbox/sd-checkbox-group.js +1 -1
  9. package/dist/controls/checkbox/sd-checkbox.js +1 -1
  10. package/dist/controls/checkbox/sd-switch.js +1 -1
  11. package/dist/controls/collapse/sd-collapse-icon.d.ts.map +1 -1
  12. package/dist/controls/collapse/sd-collapse-icon.js +3 -3
  13. package/dist/controls/collapse/sd-collapse.d.ts +1 -1
  14. package/dist/controls/collapse/sd-collapse.d.ts.map +1 -1
  15. package/dist/controls/collapse/sd-collapse.js +8 -7
  16. package/dist/controls/dropdown/sd-dropdown-popup.d.ts +2 -0
  17. package/dist/controls/dropdown/sd-dropdown-popup.d.ts.map +1 -1
  18. package/dist/controls/dropdown/sd-dropdown-popup.js +21 -8
  19. package/dist/controls/dropdown/sd-dropdown.d.ts.map +1 -1
  20. package/dist/controls/dropdown/sd-dropdown.js +5 -16
  21. package/dist/controls/form/sd-form.js +1 -1
  22. package/dist/controls/gap/sd-gap.js +5 -5
  23. package/dist/controls/input/sd-date-range-picker.d.ts +1 -0
  24. package/dist/controls/input/sd-date-range-picker.d.ts.map +1 -1
  25. package/dist/controls/input/sd-date-range-picker.js +14 -19
  26. package/dist/controls/input/sd-numpad.js +3 -3
  27. package/dist/controls/input/sd-range.js +1 -1
  28. package/dist/controls/input/sd-textarea.js +2 -2
  29. package/dist/controls/input/sd-textfield-type-handlers.js +2 -2
  30. package/dist/controls/input/sd-textfield.js +9 -9
  31. package/dist/controls/list/sd-list-item.d.ts +0 -1
  32. package/dist/controls/list/sd-list-item.d.ts.map +1 -1
  33. package/dist/controls/list/sd-list-item.js +38 -38
  34. package/dist/controls/list/sd-list.d.ts.map +1 -1
  35. package/dist/controls/list/sd-list.js +3 -3
  36. package/dist/controls/pagination/sd-pagination.js +1 -1
  37. package/dist/controls/select/sd-select-button.d.ts.map +1 -1
  38. package/dist/controls/select/sd-select-button.js +4 -8
  39. package/dist/controls/select/sd-select-item.d.ts +3 -3
  40. package/dist/controls/select/sd-select-item.d.ts.map +1 -1
  41. package/dist/controls/select/sd-select-item.js +27 -20
  42. package/dist/controls/select/sd-select.d.ts +5 -4
  43. package/dist/controls/select/sd-select.d.ts.map +1 -1
  44. package/dist/controls/select/sd-select.js +20 -17
  45. package/dist/controls/tab/sd-tab-item.js +1 -1
  46. package/dist/controls/tab/sd-tab.js +1 -1
  47. package/dist/core/app-structure/sd-app-structure.utils.js +1 -1
  48. package/dist/core/busy/sd-busy-container.d.ts.map +1 -1
  49. package/dist/core/busy/sd-busy-container.js +62 -68
  50. package/dist/core/busy/sd-busy.provider.js +1 -1
  51. package/dist/core/commands/sd-command.d.ts +13 -0
  52. package/dist/core/commands/sd-command.d.ts.map +1 -0
  53. package/dist/core/commands/sd-command.js +52 -0
  54. package/dist/core/error-handler/sd-global-error-handler.plugin.js +1 -1
  55. package/dist/core/events/sd-events.d.ts +1 -6
  56. package/dist/core/events/sd-events.d.ts.map +1 -1
  57. package/dist/core/events/sd-events.js +3 -11
  58. package/dist/core/events/sd-intersection.d.ts +13 -0
  59. package/dist/core/events/sd-intersection.d.ts.map +1 -0
  60. package/dist/core/events/sd-intersection.js +27 -0
  61. package/dist/core/events/sd-resize.d.ts +16 -0
  62. package/dist/core/events/sd-resize.d.ts.map +1 -0
  63. package/dist/core/events/{sd-resize-event.plugin.js → sd-resize.js} +18 -20
  64. package/dist/core/file-dialog/sd-file-dialog.provider.js +1 -1
  65. package/dist/core/modal/injectDragResize.js +9 -9
  66. package/dist/core/modal/injectFocusTrap.js +1 -1
  67. package/dist/core/modal/sd-confirm-modal.js +1 -1
  68. package/dist/core/modal/sd-modal.d.ts +8 -1
  69. package/dist/core/modal/sd-modal.d.ts.map +1 -1
  70. package/dist/core/modal/sd-modal.js +135 -39
  71. package/dist/core/modal/sd-modal.provider.js +5 -5
  72. package/dist/core/modal/sd-prompt-modal.js +1 -1
  73. package/dist/core/provideSdAngular.d.ts.map +1 -1
  74. package/dist/core/provideSdAngular.js +0 -10
  75. package/dist/core/ripple/setupRipple.js +5 -5
  76. package/dist/core/routing/menu-utils.js +1 -1
  77. package/dist/core/routing/sd-navigate-window.provider.js +1 -1
  78. package/dist/core/routing/sd-router-link.js +1 -1
  79. package/dist/core/selection/setupCumulateSelectedKeys.js +3 -3
  80. package/dist/core/setupModelHook.js +1 -1
  81. package/dist/core/toast/sd-toast-container.d.ts +1 -1
  82. package/dist/core/toast/sd-toast-container.js +3 -7
  83. package/dist/core/toast/sd-toast.d.ts.map +1 -1
  84. package/dist/core/toast/sd-toast.js +27 -24
  85. package/dist/core/toast/sd-toast.provider.js +6 -6
  86. package/dist/core/validation/setupInvalid.js +2 -1
  87. package/dist/data/data-detail/sd-data-detail.d.ts +2 -1
  88. package/dist/data/data-detail/sd-data-detail.d.ts.map +1 -1
  89. package/dist/data/data-detail/sd-data-detail.js +37 -33
  90. package/dist/data/data-select-button/sd-data-select-button.js +1 -1
  91. package/dist/data/data-sheet/sd-data-sheet.d.ts +2 -1
  92. package/dist/data/data-sheet/sd-data-sheet.d.ts.map +1 -1
  93. package/dist/data/data-sheet/sd-data-sheet.js +30 -22
  94. package/dist/data/kanban/sd-kanban-board.js +1 -1
  95. package/dist/data/kanban/sd-kanban-lane.js +1 -1
  96. package/dist/data/kanban/sd-kanban.d.ts +1 -1
  97. package/dist/data/kanban/sd-kanban.d.ts.map +1 -1
  98. package/dist/data/kanban/sd-kanban.js +4 -4
  99. package/dist/data/permission-table/sd-permission-table.js +6 -6
  100. package/dist/data/shared-data/sd-shared-data-select-button.js +1 -1
  101. package/dist/data/shared-data/sd-shared-data-select-list.js +3 -3
  102. package/dist/data/shared-data/sd-shared-data-select.d.ts +1 -1
  103. package/dist/data/shared-data/sd-shared-data-select.d.ts.map +1 -1
  104. package/dist/data/shared-data/sd-shared-data-select.js +29 -54
  105. package/dist/data/sheet/injectSheetDomAccessor.d.ts +6 -2
  106. package/dist/data/sheet/injectSheetDomAccessor.d.ts.map +1 -1
  107. package/dist/data/sheet/injectSheetDomAccessor.js +27 -22
  108. package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts +10 -0
  109. package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts.map +1 -0
  110. package/dist/data/sheet/injectSheetSelectRowIndicator.js +55 -0
  111. package/dist/data/sheet/sd-sheet-config.modal.d.ts +18 -19
  112. package/dist/data/sheet/sd-sheet-config.modal.d.ts.map +1 -1
  113. package/dist/data/sheet/sd-sheet-config.modal.js +357 -217
  114. package/dist/data/sheet/sd-sheet.d.ts +27 -13
  115. package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
  116. package/dist/data/sheet/sd-sheet.js +609 -291
  117. package/dist/data/sheet/useSheetCellAgent.js +6 -6
  118. package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
  119. package/dist/data/sheet/useSheetCellStyling.js +4 -4
  120. package/dist/data/sheet/useSheetFocusIndicator.d.ts +7 -0
  121. package/dist/data/sheet/useSheetFocusIndicator.d.ts.map +1 -0
  122. package/dist/data/sheet/useSheetFocusIndicator.js +53 -0
  123. package/dist/data/sheet/useSheetLayoutEngine.js +1 -1
  124. package/dist/data/state-preset/sd-state-preset.d.ts.map +1 -1
  125. package/dist/data/state-preset/sd-state-preset.js +14 -14
  126. package/dist/features/address/sd-address-search.modal.js +3 -3
  127. package/dist/features/editor/sd-tiptap-editor.js +6 -6
  128. package/dist/features/editor/useTiptapToolbar.js +2 -2
  129. package/dist/features/theme/sd-theme-selector.js +1 -1
  130. package/dist/features/visual/sd-barcode.js +1 -1
  131. package/dist/features/visual/sd-calendar.js +2 -2
  132. package/dist/features/visual/sd-echarts.d.ts +2 -1
  133. package/dist/features/visual/sd-echarts.d.ts.map +1 -1
  134. package/dist/features/visual/sd-echarts.js +5 -3
  135. package/dist/features/visual/sd-label.js +1 -1
  136. package/dist/features/visual/sd-note.js +1 -1
  137. package/dist/features/visual/sd-progress.js +1 -1
  138. package/dist/index.d.ts +3 -5
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +3 -5
  141. package/dist/layout/base-container/sd-base-container.js +3 -3
  142. package/dist/layout/dock/sd-dock-container.js +1 -1
  143. package/dist/layout/dock/sd-dock.d.ts +3 -2
  144. package/dist/layout/dock/sd-dock.d.ts.map +1 -1
  145. package/dist/layout/dock/sd-dock.js +6 -4
  146. package/dist/layout/sidebar/sd-sidebar-container.js +5 -5
  147. package/dist/layout/sidebar/sd-sidebar-menu.d.ts.map +1 -1
  148. package/dist/layout/sidebar/sd-sidebar-menu.js +7 -6
  149. package/dist/layout/sidebar/sd-sidebar-user.js +1 -1
  150. package/dist/layout/sidebar/sd-sidebar.js +1 -1
  151. package/dist/layout/topbar/sd-topbar-container.js +1 -1
  152. package/dist/layout/topbar/sd-topbar-menu.d.ts.map +1 -1
  153. package/dist/layout/topbar/sd-topbar-menu.js +7 -7
  154. package/dist/layout/topbar/sd-topbar-user.js +1 -1
  155. package/dist/layout/topbar/sd-topbar.js +3 -3
  156. package/package.json +5 -5
  157. package/src/controls/button/sd-modal-select-button.ts +7 -2
  158. package/src/controls/collapse/sd-collapse-icon.ts +2 -2
  159. package/src/controls/collapse/sd-collapse.ts +4 -5
  160. package/src/controls/dropdown/sd-dropdown-popup.ts +15 -2
  161. package/src/controls/dropdown/sd-dropdown.ts +4 -16
  162. package/src/controls/gap/sd-gap.ts +4 -4
  163. package/src/controls/input/sd-date-range-picker.ts +13 -16
  164. package/src/controls/input/sd-numpad.ts +1 -1
  165. package/src/controls/input/sd-textarea.ts +1 -1
  166. package/src/controls/input/sd-textfield-type-handlers.ts +2 -2
  167. package/src/controls/input/sd-textfield.ts +6 -6
  168. package/src/controls/list/sd-list-item.ts +40 -26
  169. package/src/controls/list/sd-list.ts +2 -1
  170. package/src/controls/select/sd-select-button.ts +8 -11
  171. package/src/controls/select/sd-select-item.ts +35 -27
  172. package/src/controls/select/sd-select.ts +111 -41
  173. package/src/core/app-structure/sd-app-structure.utils.ts +1 -1
  174. package/src/core/busy/sd-busy-container.ts +235 -123
  175. package/src/core/busy/sd-busy.provider.ts +1 -1
  176. package/src/core/commands/sd-command.ts +46 -0
  177. package/src/core/error-handler/sd-global-error-handler.plugin.ts +1 -1
  178. package/src/core/events/sd-events.ts +1 -12
  179. package/src/core/events/sd-intersection.ts +29 -0
  180. package/src/core/events/{sd-resize-event.plugin.ts → sd-resize.ts} +17 -24
  181. package/src/core/file-dialog/sd-file-dialog.provider.ts +1 -1
  182. package/src/core/modal/injectDragResize.ts +9 -9
  183. package/src/core/modal/injectFocusTrap.ts +1 -1
  184. package/src/core/modal/sd-modal.provider.ts +5 -5
  185. package/src/core/modal/sd-modal.ts +119 -41
  186. package/src/core/provideSdAngular.ts +0 -10
  187. package/src/core/ripple/setupRipple.ts +5 -5
  188. package/src/core/routing/menu-utils.ts +1 -1
  189. package/src/core/routing/sd-navigate-window.provider.ts +1 -1
  190. package/src/core/routing/sd-router-link.ts +1 -1
  191. package/src/core/selection/setupCumulateSelectedKeys.ts +3 -3
  192. package/src/core/setupModelHook.ts +1 -1
  193. package/src/core/toast/sd-toast-container.ts +1 -1
  194. package/src/core/toast/sd-toast.provider.ts +6 -6
  195. package/src/core/toast/sd-toast.ts +25 -22
  196. package/src/core/validation/setupInvalid.ts +2 -1
  197. package/src/data/data-detail/sd-data-detail.ts +15 -11
  198. package/src/data/data-sheet/sd-data-sheet.ts +13 -15
  199. package/src/data/kanban/sd-kanban.ts +4 -5
  200. package/src/data/permission-table/sd-permission-table.ts +4 -4
  201. package/src/data/shared-data/sd-shared-data-select-list.ts +1 -1
  202. package/src/data/shared-data/sd-shared-data-select.ts +8 -27
  203. package/src/data/sheet/injectSheetDomAccessor.ts +37 -25
  204. package/src/data/sheet/injectSheetSelectRowIndicator.ts +69 -0
  205. package/src/data/sheet/sd-sheet-config.modal.ts +215 -191
  206. package/src/data/sheet/sd-sheet.ts +529 -209
  207. package/src/data/sheet/useSheetCellAgent.ts +8 -8
  208. package/src/data/sheet/useSheetCellStyling.ts +4 -8
  209. package/src/data/sheet/useSheetFocusIndicator.ts +66 -0
  210. package/src/data/sheet/useSheetLayoutEngine.ts +1 -1
  211. package/src/data/state-preset/sd-state-preset.ts +26 -13
  212. package/src/features/address/sd-address-search.modal.ts +1 -1
  213. package/src/features/editor/sd-tiptap-editor.ts +4 -4
  214. package/src/features/editor/useTiptapToolbar.ts +2 -2
  215. package/src/features/visual/sd-calendar.ts +1 -1
  216. package/src/features/visual/sd-echarts.ts +2 -0
  217. package/src/index.ts +4 -6
  218. package/src/layout/base-container/sd-base-container.ts +1 -1
  219. package/src/layout/dock/sd-dock.ts +3 -2
  220. package/src/layout/sidebar/sd-sidebar-container.ts +2 -2
  221. package/src/layout/sidebar/sd-sidebar-menu.ts +1 -3
  222. package/src/layout/topbar/sd-topbar-menu.ts +11 -15
  223. package/src/layout/topbar/sd-topbar.ts +1 -1
  224. package/dist/core/commands/sd-insert-command-event.plugin.d.ts +0 -11
  225. package/dist/core/commands/sd-insert-command-event.plugin.d.ts.map +0 -1
  226. package/dist/core/commands/sd-insert-command-event.plugin.js +0 -35
  227. package/dist/core/commands/sd-refresh-command-event.plugin.d.ts +0 -11
  228. package/dist/core/commands/sd-refresh-command-event.plugin.d.ts.map +0 -1
  229. package/dist/core/commands/sd-refresh-command-event.plugin.js +0 -38
  230. package/dist/core/commands/sd-save-command-event.plugin.d.ts +0 -11
  231. package/dist/core/commands/sd-save-command-event.plugin.d.ts.map +0 -1
  232. package/dist/core/commands/sd-save-command-event.plugin.js +0 -38
  233. package/dist/core/events/sd-intersection-event.plugin.d.ts +0 -13
  234. package/dist/core/events/sd-intersection-event.plugin.d.ts.map +0 -1
  235. package/dist/core/events/sd-intersection-event.plugin.js +0 -29
  236. package/dist/core/events/sd-resize-event.plugin.d.ts +0 -16
  237. package/dist/core/events/sd-resize-event.plugin.d.ts.map +0 -1
  238. package/src/core/commands/sd-insert-command-event.plugin.ts +0 -39
  239. package/src/core/commands/sd-refresh-command-event.plugin.ts +0 -44
  240. package/src/core/commands/sd-save-command-event.plugin.ts +0 -44
  241. package/src/core/events/sd-intersection-event.plugin.ts +0 -35
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  ChangeDetectionStrategy,
3
3
  Component,
4
- computed,
4
+ effect,
5
+ forwardRef,
5
6
  input,
6
- linkedSignal,
7
7
  output,
8
8
  signal,
9
9
  ViewEncapsulation,
@@ -11,238 +11,262 @@ import {
11
11
  import type { SdModalContentDef } from "../../core/modal/sd-modal.provider";
12
12
  import type { SdSheetConfig } from "./types";
13
13
  import type { SdSheetColumn } from "./sd-sheet-column";
14
+ import { SdSheet } from "./sd-sheet";
15
+ import { SdSheetColumn as SdSheetColumnDir } from "./sd-sheet-column";
16
+ import { SdSheetColumnCellTemplate } from "./sd-sheet-column-cell-template";
14
17
  import { SdButton } from "../../controls/button/sd-button";
15
18
  import { SdCheckbox } from "../../controls/checkbox/sd-checkbox";
19
+ import { SdTextfield } from "../../controls/input/sd-textfield";
20
+ import { SdAnchor } from "../../controls/button/sd-anchor";
21
+ import { SdBusyContainer } from "../../core/busy/sd-busy-container";
16
22
  import { NgIcon } from "@ng-icons/core";
17
- import { tablerArrowUp, tablerArrowDown } from "@ng-icons/tabler-icons";
23
+ import { tablerChevronUp, tablerChevronDown, tablerX } from "@ng-icons/tabler-icons";
24
+ import { mark } from "../../core/mark";
18
25
 
19
26
  interface ConfigItem {
20
27
  key: string;
21
28
  header: string;
29
+ disableResizing: boolean;
22
30
  fixed: boolean;
23
31
  hidden: boolean;
24
- width: string;
25
- ordering: number;
32
+ width: string | undefined;
33
+ ordering: number | undefined;
26
34
  }
27
35
 
28
36
  @Component({
29
37
  selector: "sd-sheet-config-modal",
30
38
  changeDetection: ChangeDetectionStrategy.OnPush,
31
39
  encapsulation: ViewEncapsulation.None,
32
- imports: [SdButton, SdCheckbox, NgIcon],
40
+ imports: [
41
+ forwardRef(() => SdSheet),
42
+ SdSheetColumnDir,
43
+ SdSheetColumnCellTemplate,
44
+ SdButton,
45
+ SdCheckbox,
46
+ SdTextfield,
47
+ SdAnchor,
48
+ SdBusyContainer,
49
+ NgIcon,
50
+ ],
33
51
  template: `
34
- <div class="_sd-sheet-config-modal">
35
- <table class="_config-table">
36
- <thead>
37
- <tr>
38
- <th>Fix</th>
39
- <th>Order</th>
40
- <th>Header</th>
41
- <th>Width</th>
42
- <th>Hidden</th>
43
- </tr>
44
- </thead>
45
- <tbody>
46
- @for (item of _items(); track item.key; let idx = $index) {
47
- <tr>
48
- <td>
49
- <sd-checkbox
50
- [value]="item.fixed"
51
- (click)="onFixedToggle(idx)"
52
- [inline]="true"
53
- [inset]="true"
54
- />
55
- </td>
56
- <td class="_order-col">
57
- <sd-button
58
- [disabled]="!canMoveUp(idx)"
59
- (click)="onMoveUp(idx)"
60
- >
61
- <ng-icon [svg]="_icons.tablerArrowUp" />
62
- </sd-button>
63
- <sd-button
64
- [disabled]="!canMoveDown(idx)"
65
- (click)="onMoveDown(idx)"
66
- >
67
- <ng-icon [svg]="_icons.tablerArrowDown" />
68
- </sd-button>
69
- </td>
70
- <td>{{ item.header }}</td>
71
- <td>
72
- <input
73
- type="text"
74
- class="_width-input"
75
- [value]="item.width"
76
- (input)="onWidthChange(idx, $event)"
77
- />
78
- </td>
79
- <td>
80
- <sd-checkbox
81
- [value]="item.hidden"
82
- (click)="onHiddenToggle(idx)"
83
- [inline]="true"
84
- [inset]="true"
85
- />
86
- </td>
87
- </tr>
88
- }
89
- </tbody>
90
- </table>
91
- <div class="_actions">
92
- <sd-button [theme]="'primary'" (click)="onOk()">OK</sd-button>
93
- <sd-button (click)="onCancel()">Cancel</sd-button>
94
- <sd-button (click)="onReset()">Reset</sd-button>
95
- </div>
96
- </div>
97
- `,
98
- styles: [
99
- /* language=SCSS */ `
100
- sd-sheet-config-modal {
101
- display: block;
102
- padding: var(--gap-default);
103
-
104
- > ._sd-sheet-config-modal {
105
- > ._config-table {
106
- width: 100%;
107
- border-collapse: collapse;
108
- margin-bottom: var(--gap-default);
109
-
110
- th,
111
- td {
112
- border: 1px solid var(--trans-lighter);
113
- padding: var(--gap-sm) var(--gap-default);
114
- text-align: left;
115
- }
116
-
117
- th {
118
- background: var(--theme-secondary-lightest);
119
- font-weight: bold;
120
- }
52
+ <sd-busy-container [busy]="!initialized()">
53
+ @if (initialized()) {
54
+ <div class="flex-fill p-default">
55
+ <sd-sheet
56
+ [key]="sheetKey() + '-config'"
57
+ [items]="items()"
58
+ [trackByFn]="trackByFn"
59
+ [hideConfigBar]="true"
60
+ >
61
+ <sd-sheet-column
62
+ [key]="'fixed'"
63
+ [header]="'Fix'"
64
+ [disableSorting]="true"
65
+ [disableResizing]="true"
66
+ >
67
+ <ng-template [cell]="items()" let-item="item">
68
+ <div style="text-align: center">
69
+ <sd-checkbox
70
+ [size]="'sm'"
71
+ [inset]="true"
72
+ [(value)]="item.fixed"
73
+ (valueChange)="mark(items)"
74
+ />
75
+ </div>
76
+ </ng-template>
77
+ </sd-sheet-column>
78
+ <sd-sheet-column
79
+ [key]="'ordering'"
80
+ [header]="'Order'"
81
+ [disableSorting]="true"
82
+ [disableResizing]="true"
83
+ >
84
+ <ng-template [cell]="items()" let-item="item" let-index="index">
85
+ <div class="p-xs-sm" style="text-align: center">
86
+ <sd-anchor
87
+ [disabled]="index === 0 || (!item.fixed && items()[index - 1].fixed)"
88
+ (click)="onMoveUp(item)"
89
+ >
90
+ <ng-icon [svg]="tablerChevronUp" />
91
+ </sd-anchor>
92
+ <sd-anchor
93
+ [disabled]="index === items().length - 1 || (item.fixed && !items()[index + 1].fixed)"
94
+ (click)="onMoveDown(item)"
95
+ >
96
+ <ng-icon [svg]="tablerChevronDown" />
97
+ </sd-anchor>
98
+ </div>
99
+ </ng-template>
100
+ </sd-sheet-column>
101
+ <sd-sheet-column [key]="'header'" [header]="'Header'" [disableSorting]="true">
102
+ <ng-template [cell]="items()" let-item="item">
103
+ <div class="p-xs-sm">
104
+ {{ item.header }}
105
+ </div>
106
+ </ng-template>
107
+ </sd-sheet-column>
108
+ <sd-sheet-column
109
+ [key]="'width'"
110
+ [header]="'Width'"
111
+ [disableSorting]="true"
112
+ [width]="'60px'"
113
+ >
114
+ <ng-template [cell]="items()" let-item="item">
115
+ @if (!item.disableResizing) {
116
+ <sd-textfield
117
+ [type]="'text'"
118
+ [size]="'sm'"
119
+ [inset]="true"
120
+ [(value)]="item.width"
121
+ (valueChange)="mark(items)"
122
+ />
123
+ }
124
+ </ng-template>
125
+ </sd-sheet-column>
126
+ <sd-sheet-column
127
+ [key]="'hidden'"
128
+ [header]="'Hidden'"
129
+ [disableSorting]="true"
130
+ [disableResizing]="true"
131
+ >
132
+ <ng-template [cell]="items()" let-item="item">
133
+ <div style="text-align: center">
134
+ <sd-checkbox
135
+ [size]="'sm'"
136
+ [inset]="true"
137
+ [(value)]="item.hidden"
138
+ (valueChange)="mark(items)"
139
+ [icon]="tablerX"
140
+ [theme]="'danger'"
141
+ />
142
+ </div>
143
+ </ng-template>
144
+ </sd-sheet-column>
145
+ </sd-sheet>
146
+ </div>
121
147
 
122
- ._order-col {
123
- white-space: nowrap;
124
- }
125
-
126
- ._width-input {
127
- width: 80px;
128
- padding: 2px 4px;
129
- border: 1px solid var(--trans-lighter);
130
- }
131
- }
132
-
133
- > ._actions {
134
- display: flex;
135
- justify-content: flex-end;
136
- gap: var(--gap-sm);
137
- }
138
- }
148
+ <div class="p-sm-default flex-row gap-sm bdt bdt-theme-gray-lightest">
149
+ <div class="flex-fill align-start">
150
+ <sd-button
151
+ [size]="'sm'"
152
+ [inline]="true"
153
+ [theme]="'warning'"
154
+ [buttonStyle]="'min-width: 60px;'"
155
+ (click)="onResetClick()"
156
+ >
157
+ Reset
158
+ </sd-button>
159
+ </div>
160
+ <sd-button
161
+ [size]="'sm'"
162
+ [theme]="'success'"
163
+ [buttonStyle]="'min-width: 60px;'"
164
+ (click)="onOkClick()"
165
+ >
166
+ OK
167
+ </sd-button>
168
+ <sd-button
169
+ [size]="'sm'"
170
+ [buttonStyle]="'min-width: 60px;'"
171
+ (click)="onCancelClick()"
172
+ >
173
+ Cancel
174
+ </sd-button>
175
+ </div>
139
176
  }
140
- `,
141
- ],
177
+ </sd-busy-container>
178
+ `,
142
179
  })
143
180
  export class SdSheetConfigModal implements SdModalContentDef<SdSheetConfig | undefined> {
144
- initialized = signal(true);
181
+ initialized = signal(false);
145
182
  close = output<SdSheetConfig | undefined>();
146
183
 
184
+ sheetKey = input.required<string>();
147
185
  controls = input.required<readonly SdSheetColumn[]>();
148
186
  config = input.required<SdSheetConfig | undefined>();
149
187
 
150
- _icons = { tablerArrowUp, tablerArrowDown };
188
+ items = signal<ConfigItem[]>([]);
151
189
 
152
- private readonly _initialItems = computed((): ConfigItem[] => {
153
- const cfg = this.config();
154
- const controls = this.controls();
155
- return controls
156
- .map((ctrl): ConfigItem => {
157
- const key = ctrl.key();
158
- const cfgCol = cfg?.columnRecord[key];
159
- return {
160
- key,
161
- header: Array.isArray(ctrl.header()) ? (ctrl.header() as string[]).join(" > ") : (ctrl.header() as string),
162
- fixed: cfgCol?.fixed ?? ctrl.fixed(),
163
- hidden: cfgCol?.hidden ?? ctrl.hidden(),
164
- width: cfgCol?.width ?? ctrl.width() ?? "",
165
- ordering: cfgCol?.ordering ?? ctrl.ordering(),
166
- };
167
- })
168
- .sort((a, b) => a.ordering - b.ordering);
169
- });
190
+ trackByFn = (item: ConfigItem): string => item.key;
170
191
 
171
- _items = linkedSignal<ConfigItem[]>(() => this._initialItems());
192
+ protected readonly tablerChevronUp = tablerChevronUp;
193
+ protected readonly tablerChevronDown = tablerChevronDown;
194
+ protected readonly tablerX = tablerX;
195
+ protected readonly mark = mark;
172
196
 
173
- onFixedToggle(idx: number): void {
174
- const items = [...this._items()];
175
- items[idx] = { ...items[idx], fixed: !items[idx].fixed };
176
- this._items.set(items);
177
- }
197
+ constructor() {
198
+ effect(() => {
199
+ const cfg = this.config();
200
+ const items = this.controls()
201
+ .map((ctrl): ConfigItem => {
202
+ const key = ctrl.key();
203
+ const cfgCol = cfg?.columnRecord[key];
204
+ return {
205
+ key,
206
+ header: Array.isArray(ctrl.header())
207
+ ? (ctrl.header() as string[]).join(" > ")
208
+ : (ctrl.header() as string),
209
+ disableResizing: ctrl.disableResizing(),
210
+ fixed: cfgCol?.fixed ?? ctrl.fixed(),
211
+ hidden: cfgCol?.hidden ?? ctrl.hidden(),
212
+ width: cfgCol?.width ?? ctrl.width(),
213
+ ordering: cfgCol?.ordering ?? ctrl.ordering(),
214
+ };
215
+ })
216
+ .orderBy((i) => i.ordering ?? 0)
217
+ .orderBy((i) => (i.fixed ? 0 : 1));
178
218
 
179
- onHiddenToggle(idx: number): void {
180
- const items = [...this._items()];
181
- items[idx] = { ...items[idx], hidden: !items[idx].hidden };
182
- this._items.set(items);
219
+ this.items.set(items);
220
+ this.initialized.set(true);
221
+ });
183
222
  }
184
223
 
185
- onWidthChange(idx: number, event: Event): void {
186
- const inputEl = event.target as HTMLInputElement;
187
- const items = [...this._items()];
188
- items[idx] = { ...items[idx], width: inputEl.value };
189
- this._items.set(items);
190
- }
191
-
192
- canMoveUp(idx: number): boolean {
193
- if (idx <= 0) return false;
194
- const items = this._items();
195
- const current = items[idx];
196
- const above = items[idx - 1];
197
- // Cannot move non-fixed above fixed
198
- if (!current.fixed && above.fixed) return false;
199
- return true;
200
- }
201
-
202
- canMoveDown(idx: number): boolean {
203
- const items = this._items();
204
- if (idx >= items.length - 1) return false;
205
- const current = items[idx];
206
- const below = items[idx + 1];
207
- // Cannot move fixed below non-fixed
208
- if (current.fixed && !below.fixed) return false;
209
- return true;
210
- }
211
-
212
- onMoveUp(idx: number): void {
213
- if (!this.canMoveUp(idx)) return;
214
- const items = [...this._items()];
215
- [items[idx - 1], items[idx]] = [items[idx], items[idx - 1]];
216
- this._items.set(items);
224
+ onMoveUp(item: ConfigItem): void {
225
+ this.items.update((v) => {
226
+ const r = [...v];
227
+ const index = r.indexOf(item);
228
+ r.splice(index, 1);
229
+ r.splice(index - 1, 0, item);
230
+ for (let i = 0; i < r.length; i++) {
231
+ r[i].ordering = i;
232
+ }
233
+ return r;
234
+ });
217
235
  }
218
236
 
219
- onMoveDown(idx: number): void {
220
- if (!this.canMoveDown(idx)) return;
221
- const items = [...this._items()];
222
- [items[idx], items[idx + 1]] = [items[idx + 1], items[idx]];
223
- this._items.set(items);
237
+ onMoveDown(item: ConfigItem): void {
238
+ this.items.update((v) => {
239
+ const r = [...v];
240
+ const index = r.indexOf(item);
241
+ r.splice(index, 1);
242
+ r.splice(index + 1, 0, item);
243
+ for (let i = 0; i < r.length; i++) {
244
+ r[i].ordering = i;
245
+ }
246
+ return r;
247
+ });
224
248
  }
225
249
 
226
- onOk(): void {
227
- const items = this._items();
228
- const columnRecord: SdSheetConfig["columnRecord"] = {};
229
- for (let i = 0; i < items.length; i++) {
230
- const item = items[i];
231
- columnRecord[item.key] = {
250
+ onOkClick(): void {
251
+ const result: SdSheetConfig = { columnRecord: {} };
252
+ for (const item of this.items()) {
253
+ result.columnRecord[item.key] = {
232
254
  fixed: item.fixed,
255
+ width: item.width,
256
+ ordering: item.ordering,
233
257
  hidden: item.hidden,
234
- width: item.width !== "" ? item.width : undefined,
235
- ordering: i,
236
258
  };
237
259
  }
238
- this.close.emit({ columnRecord });
260
+ this.close.emit(result);
239
261
  }
240
262
 
241
- onCancel(): void {
263
+ onCancelClick(): void {
242
264
  this.close.emit(undefined);
243
265
  }
244
266
 
245
- onReset(): void {
246
- this.close.emit({ columnRecord: {} });
267
+ onResetClick(): void {
268
+ if (confirm("설정값이 모두 초기화 됩니다.")) {
269
+ this.close.emit({ columnRecord: {} });
270
+ }
247
271
  }
248
272
  }