@simplysm/angular 14.0.41 → 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 (256) 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 +2 -4
  12. package/dist/controls/collapse/sd-collapse-icon.d.ts.map +1 -1
  13. package/dist/controls/collapse/sd-collapse-icon.js +7 -7
  14. package/dist/controls/collapse/sd-collapse.d.ts +1 -1
  15. package/dist/controls/collapse/sd-collapse.d.ts.map +1 -1
  16. package/dist/controls/collapse/sd-collapse.js +8 -7
  17. package/dist/controls/dropdown/sd-dropdown-popup.d.ts +2 -0
  18. package/dist/controls/dropdown/sd-dropdown-popup.d.ts.map +1 -1
  19. package/dist/controls/dropdown/sd-dropdown-popup.js +21 -8
  20. package/dist/controls/dropdown/sd-dropdown.d.ts.map +1 -1
  21. package/dist/controls/dropdown/sd-dropdown.js +5 -16
  22. package/dist/controls/form/sd-form.js +1 -1
  23. package/dist/controls/gap/sd-gap.js +5 -5
  24. package/dist/controls/input/sd-date-range-picker.d.ts +1 -0
  25. package/dist/controls/input/sd-date-range-picker.d.ts.map +1 -1
  26. package/dist/controls/input/sd-date-range-picker.js +14 -19
  27. package/dist/controls/input/sd-numpad.js +3 -3
  28. package/dist/controls/input/sd-range.js +1 -1
  29. package/dist/controls/input/sd-textarea.js +2 -2
  30. package/dist/controls/input/sd-textfield-type-handlers.js +2 -2
  31. package/dist/controls/input/sd-textfield.js +9 -9
  32. package/dist/controls/list/sd-list-item.d.ts +0 -1
  33. package/dist/controls/list/sd-list-item.d.ts.map +1 -1
  34. package/dist/controls/list/sd-list-item.js +38 -38
  35. package/dist/controls/list/sd-list.d.ts.map +1 -1
  36. package/dist/controls/list/sd-list.js +3 -3
  37. package/dist/controls/pagination/sd-pagination.js +1 -1
  38. package/dist/controls/select/sd-select-button.d.ts.map +1 -1
  39. package/dist/controls/select/sd-select-button.js +4 -8
  40. package/dist/controls/select/sd-select-item.d.ts +3 -3
  41. package/dist/controls/select/sd-select-item.d.ts.map +1 -1
  42. package/dist/controls/select/sd-select-item.js +27 -20
  43. package/dist/controls/select/sd-select.d.ts +5 -4
  44. package/dist/controls/select/sd-select.d.ts.map +1 -1
  45. package/dist/controls/select/sd-select.js +20 -17
  46. package/dist/controls/tab/sd-tab-item.js +1 -1
  47. package/dist/controls/tab/sd-tab.js +1 -1
  48. package/dist/core/app-structure/sd-app-structure.utils.js +1 -1
  49. package/dist/core/busy/sd-busy-container.d.ts.map +1 -1
  50. package/dist/core/busy/sd-busy-container.js +62 -68
  51. package/dist/core/busy/sd-busy.provider.js +1 -1
  52. package/dist/core/commands/sd-command.d.ts +13 -0
  53. package/dist/core/commands/sd-command.d.ts.map +1 -0
  54. package/dist/core/commands/sd-command.js +52 -0
  55. package/dist/core/error-handler/sd-global-error-handler.plugin.js +1 -1
  56. package/dist/core/events/sd-events.d.ts +1 -6
  57. package/dist/core/events/sd-events.d.ts.map +1 -1
  58. package/dist/core/events/sd-events.js +3 -11
  59. package/dist/core/events/sd-intersection.d.ts +13 -0
  60. package/dist/core/events/sd-intersection.d.ts.map +1 -0
  61. package/dist/core/events/sd-intersection.js +27 -0
  62. package/dist/core/events/sd-resize.d.ts +16 -0
  63. package/dist/core/events/sd-resize.d.ts.map +1 -0
  64. package/dist/core/events/{sd-resize-event.plugin.js → sd-resize.js} +18 -20
  65. package/dist/core/file-dialog/sd-file-dialog.provider.js +1 -1
  66. package/dist/core/modal/injectDragResize.js +9 -9
  67. package/dist/core/modal/injectFocusTrap.js +1 -1
  68. package/dist/core/modal/sd-confirm-modal.js +1 -1
  69. package/dist/core/modal/sd-modal.d.ts +9 -1
  70. package/dist/core/modal/sd-modal.d.ts.map +1 -1
  71. package/dist/core/modal/sd-modal.js +140 -42
  72. package/dist/core/modal/sd-modal.provider.d.ts +1 -0
  73. package/dist/core/modal/sd-modal.provider.d.ts.map +1 -1
  74. package/dist/core/modal/sd-modal.provider.js +5 -5
  75. package/dist/core/modal/sd-prompt-modal.js +1 -1
  76. package/dist/core/provideSdAngular.d.ts.map +1 -1
  77. package/dist/core/provideSdAngular.js +0 -10
  78. package/dist/core/ripple/setupRipple.js +5 -5
  79. package/dist/core/routing/menu-utils.js +1 -1
  80. package/dist/core/routing/sd-navigate-window.provider.js +1 -1
  81. package/dist/core/routing/sd-router-link.js +1 -1
  82. package/dist/core/selection/setupCumulateSelectedKeys.js +3 -3
  83. package/dist/core/setupModelHook.js +1 -1
  84. package/dist/core/toast/sd-toast-container.d.ts +1 -1
  85. package/dist/core/toast/sd-toast-container.js +3 -7
  86. package/dist/core/toast/sd-toast.d.ts.map +1 -1
  87. package/dist/core/toast/sd-toast.js +27 -24
  88. package/dist/core/toast/sd-toast.provider.js +6 -6
  89. package/dist/core/validation/setupInvalid.js +2 -1
  90. package/dist/data/data-detail/sd-data-detail.d.ts +2 -1
  91. package/dist/data/data-detail/sd-data-detail.d.ts.map +1 -1
  92. package/dist/data/data-detail/sd-data-detail.js +37 -33
  93. package/dist/data/data-select-button/sd-data-select-button.js +1 -1
  94. package/dist/data/data-sheet/sd-data-sheet.d.ts +2 -1
  95. package/dist/data/data-sheet/sd-data-sheet.d.ts.map +1 -1
  96. package/dist/data/data-sheet/sd-data-sheet.js +99 -59
  97. package/dist/data/kanban/sd-kanban-board.js +1 -1
  98. package/dist/data/kanban/sd-kanban-lane.js +1 -1
  99. package/dist/data/kanban/sd-kanban.d.ts +1 -1
  100. package/dist/data/kanban/sd-kanban.d.ts.map +1 -1
  101. package/dist/data/kanban/sd-kanban.js +4 -4
  102. package/dist/data/permission-table/sd-permission-table.js +6 -6
  103. package/dist/data/shared-data/sd-shared-data-select-button.js +1 -1
  104. package/dist/data/shared-data/sd-shared-data-select-list.js +3 -3
  105. package/dist/data/shared-data/sd-shared-data-select.d.ts +1 -1
  106. package/dist/data/shared-data/sd-shared-data-select.d.ts.map +1 -1
  107. package/dist/data/shared-data/sd-shared-data-select.js +29 -54
  108. package/dist/data/sheet/injectSheetDomAccessor.d.ts +6 -2
  109. package/dist/data/sheet/injectSheetDomAccessor.d.ts.map +1 -1
  110. package/dist/data/sheet/injectSheetDomAccessor.js +27 -22
  111. package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts +10 -0
  112. package/dist/data/sheet/injectSheetSelectRowIndicator.d.ts.map +1 -0
  113. package/dist/data/sheet/injectSheetSelectRowIndicator.js +55 -0
  114. package/dist/data/sheet/sd-sheet-column-cell-template.d.ts +9 -0
  115. package/dist/data/sheet/sd-sheet-column-cell-template.d.ts.map +1 -0
  116. package/dist/data/sheet/sd-sheet-column-cell-template.js +17 -0
  117. package/dist/data/sheet/sd-sheet-column.d.ts +10 -7
  118. package/dist/data/sheet/sd-sheet-column.d.ts.map +1 -1
  119. package/dist/data/sheet/sd-sheet-column.js +10 -6
  120. package/dist/data/sheet/sd-sheet-config.modal.d.ts +19 -20
  121. package/dist/data/sheet/sd-sheet-config.modal.d.ts.map +1 -1
  122. package/dist/data/sheet/sd-sheet-config.modal.js +357 -217
  123. package/dist/data/sheet/sd-sheet.d.ts +30 -15
  124. package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
  125. package/dist/data/sheet/sd-sheet.js +617 -274
  126. package/dist/data/sheet/types.d.ts +2 -0
  127. package/dist/data/sheet/types.d.ts.map +1 -1
  128. package/dist/data/sheet/useSheetCellAgent.js +6 -6
  129. package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
  130. package/dist/data/sheet/useSheetCellStyling.js +11 -5
  131. package/dist/data/sheet/useSheetFocusIndicator.d.ts +7 -0
  132. package/dist/data/sheet/useSheetFocusIndicator.d.ts.map +1 -0
  133. package/dist/data/sheet/useSheetFocusIndicator.js +53 -0
  134. package/dist/data/sheet/useSheetLayoutEngine.d.ts.map +1 -1
  135. package/dist/data/sheet/useSheetLayoutEngine.js +3 -1
  136. package/dist/data/state-preset/sd-state-preset.d.ts.map +1 -1
  137. package/dist/data/state-preset/sd-state-preset.js +14 -14
  138. package/dist/features/address/sd-address-search.modal.js +3 -3
  139. package/dist/features/editor/sd-tiptap-editor.js +6 -6
  140. package/dist/features/editor/useTiptapToolbar.js +2 -2
  141. package/dist/features/theme/sd-theme-selector.js +1 -1
  142. package/dist/features/visual/sd-barcode.js +1 -1
  143. package/dist/features/visual/sd-calendar.js +2 -2
  144. package/dist/features/visual/sd-echarts.d.ts +2 -1
  145. package/dist/features/visual/sd-echarts.d.ts.map +1 -1
  146. package/dist/features/visual/sd-echarts.js +5 -3
  147. package/dist/features/visual/sd-label.js +1 -1
  148. package/dist/features/visual/sd-note.js +1 -1
  149. package/dist/features/visual/sd-progress.js +1 -1
  150. package/dist/index.d.ts +5 -6
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +4 -5
  153. package/dist/layout/base-container/sd-base-container.js +3 -3
  154. package/dist/layout/dock/sd-dock-container.js +1 -1
  155. package/dist/layout/dock/sd-dock.d.ts +3 -2
  156. package/dist/layout/dock/sd-dock.d.ts.map +1 -1
  157. package/dist/layout/dock/sd-dock.js +6 -4
  158. package/dist/layout/sidebar/sd-sidebar-container.js +5 -5
  159. package/dist/layout/sidebar/sd-sidebar-menu.d.ts.map +1 -1
  160. package/dist/layout/sidebar/sd-sidebar-menu.js +7 -6
  161. package/dist/layout/sidebar/sd-sidebar-user.js +1 -1
  162. package/dist/layout/sidebar/sd-sidebar.js +1 -1
  163. package/dist/layout/topbar/sd-topbar-container.js +1 -1
  164. package/dist/layout/topbar/sd-topbar-menu.d.ts.map +1 -1
  165. package/dist/layout/topbar/sd-topbar-menu.js +7 -7
  166. package/dist/layout/topbar/sd-topbar-user.js +1 -1
  167. package/dist/layout/topbar/sd-topbar.js +3 -3
  168. package/package.json +6 -6
  169. package/src/controls/button/sd-modal-select-button.ts +7 -2
  170. package/src/controls/collapse/sd-collapse-icon.ts +3 -4
  171. package/src/controls/collapse/sd-collapse.ts +4 -5
  172. package/src/controls/dropdown/sd-dropdown-popup.ts +15 -2
  173. package/src/controls/dropdown/sd-dropdown.ts +4 -16
  174. package/src/controls/gap/sd-gap.ts +4 -4
  175. package/src/controls/input/sd-date-range-picker.ts +13 -16
  176. package/src/controls/input/sd-numpad.ts +1 -1
  177. package/src/controls/input/sd-textarea.ts +1 -1
  178. package/src/controls/input/sd-textfield-type-handlers.ts +2 -2
  179. package/src/controls/input/sd-textfield.ts +6 -6
  180. package/src/controls/list/sd-list-item.ts +40 -26
  181. package/src/controls/list/sd-list.ts +2 -1
  182. package/src/controls/select/sd-select-button.ts +8 -11
  183. package/src/controls/select/sd-select-item.ts +35 -27
  184. package/src/controls/select/sd-select.ts +111 -41
  185. package/src/core/app-structure/sd-app-structure.utils.ts +1 -1
  186. package/src/core/busy/sd-busy-container.ts +235 -123
  187. package/src/core/busy/sd-busy.provider.ts +1 -1
  188. package/src/core/commands/sd-command.ts +46 -0
  189. package/src/core/error-handler/sd-global-error-handler.plugin.ts +1 -1
  190. package/src/core/events/sd-events.ts +1 -12
  191. package/src/core/events/sd-intersection.ts +29 -0
  192. package/src/core/events/{sd-resize-event.plugin.ts → sd-resize.ts} +17 -24
  193. package/src/core/file-dialog/sd-file-dialog.provider.ts +1 -1
  194. package/src/core/modal/injectDragResize.ts +9 -9
  195. package/src/core/modal/injectFocusTrap.ts +1 -1
  196. package/src/core/modal/sd-modal.provider.ts +6 -5
  197. package/src/core/modal/sd-modal.ts +121 -42
  198. package/src/core/provideSdAngular.ts +0 -10
  199. package/src/core/ripple/setupRipple.ts +5 -5
  200. package/src/core/routing/menu-utils.ts +1 -1
  201. package/src/core/routing/sd-navigate-window.provider.ts +1 -1
  202. package/src/core/routing/sd-router-link.ts +1 -1
  203. package/src/core/selection/setupCumulateSelectedKeys.ts +3 -3
  204. package/src/core/setupModelHook.ts +1 -1
  205. package/src/core/toast/sd-toast-container.ts +1 -1
  206. package/src/core/toast/sd-toast.provider.ts +6 -6
  207. package/src/core/toast/sd-toast.ts +25 -22
  208. package/src/core/validation/setupInvalid.ts +2 -1
  209. package/src/data/data-detail/sd-data-detail.ts +15 -11
  210. package/src/data/data-sheet/sd-data-sheet.ts +27 -20
  211. package/src/data/kanban/sd-kanban.ts +4 -5
  212. package/src/data/permission-table/sd-permission-table.ts +4 -4
  213. package/src/data/shared-data/sd-shared-data-select-list.ts +1 -1
  214. package/src/data/shared-data/sd-shared-data-select.ts +8 -27
  215. package/src/data/sheet/injectSheetDomAccessor.ts +37 -25
  216. package/src/data/sheet/injectSheetSelectRowIndicator.ts +69 -0
  217. package/src/data/sheet/sd-sheet-column-cell-template.ts +17 -0
  218. package/src/data/sheet/sd-sheet-column.ts +12 -5
  219. package/src/data/sheet/sd-sheet-config.modal.ts +215 -191
  220. package/src/data/sheet/sd-sheet.ts +534 -203
  221. package/src/data/sheet/types.ts +2 -0
  222. package/src/data/sheet/useSheetCellAgent.ts +8 -8
  223. package/src/data/sheet/useSheetCellStyling.ts +9 -9
  224. package/src/data/sheet/useSheetFocusIndicator.ts +66 -0
  225. package/src/data/sheet/useSheetLayoutEngine.ts +3 -1
  226. package/src/data/state-preset/sd-state-preset.ts +26 -13
  227. package/src/features/address/sd-address-search.modal.ts +1 -1
  228. package/src/features/editor/sd-tiptap-editor.ts +4 -4
  229. package/src/features/editor/useTiptapToolbar.ts +2 -2
  230. package/src/features/visual/sd-calendar.ts +1 -1
  231. package/src/features/visual/sd-echarts.ts +2 -0
  232. package/src/index.ts +6 -7
  233. package/src/layout/base-container/sd-base-container.ts +1 -1
  234. package/src/layout/dock/sd-dock.ts +3 -2
  235. package/src/layout/sidebar/sd-sidebar-container.ts +2 -2
  236. package/src/layout/sidebar/sd-sidebar-menu.ts +1 -3
  237. package/src/layout/topbar/sd-topbar-menu.ts +11 -15
  238. package/src/layout/topbar/sd-topbar.ts +1 -1
  239. package/dist/core/commands/sd-insert-command-event.plugin.d.ts +0 -11
  240. package/dist/core/commands/sd-insert-command-event.plugin.d.ts.map +0 -1
  241. package/dist/core/commands/sd-insert-command-event.plugin.js +0 -35
  242. package/dist/core/commands/sd-refresh-command-event.plugin.d.ts +0 -11
  243. package/dist/core/commands/sd-refresh-command-event.plugin.d.ts.map +0 -1
  244. package/dist/core/commands/sd-refresh-command-event.plugin.js +0 -38
  245. package/dist/core/commands/sd-save-command-event.plugin.d.ts +0 -11
  246. package/dist/core/commands/sd-save-command-event.plugin.d.ts.map +0 -1
  247. package/dist/core/commands/sd-save-command-event.plugin.js +0 -38
  248. package/dist/core/events/sd-intersection-event.plugin.d.ts +0 -13
  249. package/dist/core/events/sd-intersection-event.plugin.d.ts.map +0 -1
  250. package/dist/core/events/sd-intersection-event.plugin.js +0 -29
  251. package/dist/core/events/sd-resize-event.plugin.d.ts +0 -16
  252. package/dist/core/events/sd-resize-event.plugin.d.ts.map +0 -1
  253. package/src/core/commands/sd-insert-command-event.plugin.ts +0 -39
  254. package/src/core/commands/sd-refresh-command-event.plugin.ts +0 -44
  255. package/src/core/commands/sd-save-command-event.plugin.ts +0 -44
  256. package/src/core/events/sd-intersection-event.plugin.ts +0 -35
@@ -30,10 +30,10 @@ export function injectDragResize(opt: DragResizeOptions): {
30
30
  | undefined;
31
31
 
32
32
  function applyDrag(event: MouseEvent): void {
33
- if (dragState === undefined) return;
33
+ if (dragState == null) return;
34
34
 
35
35
  const dialogEl = opt.getDialogEl();
36
- if (dialogEl === null) return;
36
+ if (dialogEl == null) return;
37
37
 
38
38
  const dx = event.clientX - dragState.startX;
39
39
  const dy = event.clientY - dragState.startY;
@@ -43,10 +43,10 @@ export function injectDragResize(opt: DragResizeOptions): {
43
43
  }
44
44
 
45
45
  function applyResize(event: MouseEvent): void {
46
- if (resizeState === undefined) return;
46
+ if (resizeState == null) return;
47
47
 
48
48
  const dialogEl = opt.getDialogEl();
49
- if (dialogEl === null) return;
49
+ if (dialogEl == null) return;
50
50
 
51
51
  const dx = event.clientX - resizeState.startX;
52
52
  const dy = event.clientY - resizeState.startY;
@@ -86,16 +86,16 @@ export function injectDragResize(opt: DragResizeOptions): {
86
86
  }
87
87
 
88
88
  function onDocumentMouseMove(event: MouseEvent): void {
89
- if (resizeState !== undefined) {
89
+ if (resizeState != null) {
90
90
  applyResize(event);
91
91
  }
92
- if (dragState !== undefined) {
92
+ if (dragState != null) {
93
93
  applyDrag(event);
94
94
  }
95
95
  }
96
96
 
97
97
  function onDocumentMouseUp(): void {
98
- const hadState = resizeState !== undefined || dragState !== undefined;
98
+ const hadState = resizeState != null || dragState != null;
99
99
  resizeState = undefined;
100
100
  dragState = undefined;
101
101
  document.removeEventListener("mousemove", onDocumentMouseMove);
@@ -114,7 +114,7 @@ export function injectDragResize(opt: DragResizeOptions): {
114
114
 
115
115
  function startDrag(event: MouseEvent): void {
116
116
  const dialogEl = opt.getDialogEl();
117
- if (dialogEl === null) return;
117
+ if (dialogEl == null) return;
118
118
 
119
119
  const dialogRect = dialogEl.getBoundingClientRect();
120
120
  const parentRect = getParentRect(dialogEl);
@@ -131,7 +131,7 @@ export function injectDragResize(opt: DragResizeOptions): {
131
131
 
132
132
  function startResize(event: MouseEvent, dir: string): void {
133
133
  const dialogEl = opt.getDialogEl();
134
- if (dialogEl === null) return;
134
+ if (dialogEl == null) return;
135
135
 
136
136
  const dialogRect = dialogEl.getBoundingClientRect();
137
137
  const parentRect = getParentRect(dialogEl);
@@ -10,7 +10,7 @@ export function injectFocusTrap(): {
10
10
  const result: HTMLElement[] = [];
11
11
  const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT);
12
12
  let node = walker.nextNode();
13
- while (node !== null) {
13
+ while (node != null) {
14
14
  if (node instanceof HTMLElement && isTabbable(node)) {
15
15
  result.push(node);
16
16
  }
@@ -56,6 +56,7 @@ export interface SdModalOptions {
56
56
  key?: string;
57
57
  hideHeader?: boolean;
58
58
  hideCloseButton?: boolean;
59
+ headerStyle?: string;
59
60
  useCloseByBackdrop?: boolean;
60
61
  useCloseByEscapeKey?: boolean;
61
62
  float?: boolean;
@@ -124,9 +125,9 @@ export class SdModalProvider {
124
125
 
125
126
  // 6. 옵션 바인딩
126
127
  modalRef.setInput("title", modal.title);
127
- if (options !== undefined) {
128
+ if (options != null) {
128
129
  for (const [key, value] of Object.entries(options)) {
129
- if (value !== undefined && key !== "noFirstControlFocusing") {
130
+ if (value != null && key !== "noFirstControlFocusing") {
130
131
  modalRef.setInput(key, value);
131
132
  }
132
133
  }
@@ -173,7 +174,7 @@ export class SdModalProvider {
173
174
  // 컨텐츠 영역에서 첫 탭 이동 가능 요소 검색
174
175
  const contentEl = modalEl.querySelector("._content");
175
176
  const firstTabbable = contentEl?.findFirstTabbableChild();
176
- if (firstTabbable !== undefined) {
177
+ if (firstTabbable != null) {
177
178
  firstTabbable.focus();
178
179
  } else {
179
180
  dialogEl.focus();
@@ -196,7 +197,7 @@ export class SdModalProvider {
196
197
 
197
198
  const doDestroy = () => {
198
199
  // DOM에서 제거
199
- if (modalEl.parentNode !== null) {
200
+ if (modalEl.parentNode != null) {
200
201
  modalEl.parentNode.removeChild(modalEl);
201
202
  }
202
203
 
@@ -210,7 +211,7 @@ export class SdModalProvider {
210
211
  this.modalCount.update((v) => v - 1);
211
212
 
212
213
  // 포커스 복귀
213
- if (prevActiveEl !== null && prevActiveEl.isConnected) {
214
+ if (prevActiveEl != null && prevActiveEl.isConnected) {
214
215
  prevActiveEl.focus();
215
216
  }
216
217
 
@@ -18,6 +18,8 @@ import { SdActivatedModalProvider } from "./sd-activated-modal.provider";
18
18
  import { SdSystemConfigProvider } from "../config/sd-system-config.provider";
19
19
  import { injectFocusTrap } from "./injectFocusTrap";
20
20
  import { injectDragResize } from "./injectDragResize";
21
+ import { SdAnchor } from "../../controls/button/sd-anchor";
22
+ import { SdResizeDirective, type SdResizeEvent } from "../events/sd-resize";
21
23
  import "@simplysm/core-browser";
22
24
 
23
25
  @Component({
@@ -25,39 +27,86 @@ import "@simplysm/core-browser";
25
27
  changeDetection: ChangeDetectionStrategy.OnPush,
26
28
  encapsulation: ViewEncapsulation.None,
27
29
  standalone: true,
28
- imports: [NgTemplateOutlet, NgIcon],
30
+ imports: [NgTemplateOutlet, NgIcon, SdAnchor, SdResizeDirective],
31
+ hostDirectives: [{ directive: SdResizeDirective, outputs: ["sdResize"] }],
29
32
  host: {
30
33
  "[attr.data-sd-open]": "open() || undefined",
31
34
  "[attr.data-sd-float]": "float() || undefined",
32
35
  "[attr.data-sd-fill]": "fill() || undefined",
33
36
  "[attr.data-sd-position]": "position() || undefined",
37
+ "(sdResize)": "onHostResize($event)",
38
+ "(window:resize)": "onWindowResize()",
34
39
  },
35
40
  template: `
36
- <div class="_backdrop" (mousedown)="onBackdropClick()"></div>
37
- <div class="_dialog" tabindex="-1"
38
- (keydown)="onDialogKeydown($event)"
39
- (focus)="onDialogFocus()">
41
+ <div
42
+ class="_backdrop"
43
+ tabindex="-1"
44
+ role="button"
45
+ (click)="onBackdropClick()"
46
+ (keydown.enter)="onBackdropClick()"
47
+ ></div>
48
+ <div
49
+ class="_dialog"
50
+ tabindex="-1"
51
+ (keydown)="onDialogKeydown($event)"
52
+ (focus)="onDialogFocus()"
53
+ (sdResize)="onDialogResize($event)"
54
+ >
40
55
  @if (!hideHeader()) {
41
- <div class="_header" (mousedown)="onHeaderMouseDown($event)">
42
- <span class="_title">{{ title() }}</span>
56
+ <div class="_header" (mousedown)="onHeaderMouseDown($event)" [style]="headerStyle()">
57
+ <h5 class="_title">{{ title() }}</h5>
43
58
  @if (actionTplRef()) {
44
59
  <ng-container *ngTemplateOutlet="actionTplRef()!" />
45
60
  }
46
61
  @if (!hideCloseButton()) {
47
- <button class="_close-btn" (click)="onCloseButtonClick()"><ng-icon [svg]="tablerX" /></button>
62
+ <sd-anchor [theme]="'gray'" class="_close-btn" (click)="onCloseButtonClick()">
63
+ <ng-icon [svg]="tablerX" />
64
+ </sd-anchor>
48
65
  }
49
66
  </div>
50
67
  }
51
68
  <div class="_content"><ng-content /></div>
52
69
  @if (resizable()) {
53
- <div class="_resize-handle _resize-top" data-resize-dir="top" (mousedown)="onResizeMouseDown($event, 'top')"></div>
54
- <div class="_resize-handle _resize-bottom" data-resize-dir="bottom" (mousedown)="onResizeMouseDown($event, 'bottom')"></div>
55
- <div class="_resize-handle _resize-left" data-resize-dir="left" (mousedown)="onResizeMouseDown($event, 'left')"></div>
56
- <div class="_resize-handle _resize-right" data-resize-dir="right" (mousedown)="onResizeMouseDown($event, 'right')"></div>
57
- <div class="_resize-handle _resize-top-left" data-resize-dir="top-left" (mousedown)="onResizeMouseDown($event, 'top-left')"></div>
58
- <div class="_resize-handle _resize-top-right" data-resize-dir="top-right" (mousedown)="onResizeMouseDown($event, 'top-right')"></div>
59
- <div class="_resize-handle _resize-bottom-left" data-resize-dir="bottom-left" (mousedown)="onResizeMouseDown($event, 'bottom-left')"></div>
60
- <div class="_resize-handle _resize-bottom-right" data-resize-dir="bottom-right" (mousedown)="onResizeMouseDown($event, 'bottom-right')"></div>
70
+ <div
71
+ class="_resize-handle _resize-top"
72
+ data-resize-dir="top"
73
+ (mousedown)="onResizeMouseDown($event, 'top')"
74
+ ></div>
75
+ <div
76
+ class="_resize-handle _resize-bottom"
77
+ data-resize-dir="bottom"
78
+ (mousedown)="onResizeMouseDown($event, 'bottom')"
79
+ ></div>
80
+ <div
81
+ class="_resize-handle _resize-left"
82
+ data-resize-dir="left"
83
+ (mousedown)="onResizeMouseDown($event, 'left')"
84
+ ></div>
85
+ <div
86
+ class="_resize-handle _resize-right"
87
+ data-resize-dir="right"
88
+ (mousedown)="onResizeMouseDown($event, 'right')"
89
+ ></div>
90
+ <div
91
+ class="_resize-handle _resize-top-left"
92
+ data-resize-dir="top-left"
93
+ (mousedown)="onResizeMouseDown($event, 'top-left')"
94
+ ></div>
95
+ <div
96
+ class="_resize-handle _resize-top-right"
97
+ data-resize-dir="top-right"
98
+ (mousedown)="onResizeMouseDown($event, 'top-right')"
99
+ ></div>
100
+ <div
101
+ class="_resize-handle _resize-bottom-left"
102
+ data-resize-dir="bottom-left"
103
+ (mousedown)="onResizeMouseDown($event, 'bottom-left')"
104
+ ></div>
105
+ <div
106
+ class="_resize-handle _resize-bottom-right"
107
+ data-resize-dir="bottom-right"
108
+ (mousedown)="onResizeMouseDown($event, 'bottom-right')"
109
+ ></div>
61
110
  }
62
111
  </div>
63
112
  `,
@@ -117,19 +166,7 @@ import "@simplysm/core-browser";
117
166
  }
118
167
 
119
168
  > ._close-btn {
120
- display: flex;
121
- align-items: center;
122
- justify-content: center;
123
169
  padding: var(--gap-sm) var(--gap-default);
124
- border: none;
125
- background: transparent;
126
- cursor: pointer;
127
- font-size: inherit;
128
- color: inherit;
129
-
130
- &:hover {
131
- background: var(--trans-lightest);
132
- }
133
170
  }
134
171
  }
135
172
 
@@ -297,6 +334,7 @@ export class SdModal {
297
334
  title = input("");
298
335
  hideHeader = input(false);
299
336
  hideCloseButton = input(false);
337
+ headerStyle = input<string | undefined>(undefined);
300
338
  useCloseByBackdrop = input(true);
301
339
  useCloseByEscapeKey = input(true);
302
340
  float = input(false);
@@ -328,16 +366,16 @@ export class SdModal {
328
366
  // widthPx/heightPx를 dialog 스타일에 적용
329
367
  effect(() => {
330
368
  const dialogEl = this._getDialogEl();
331
- if (dialogEl === null) return;
369
+ if (dialogEl == null) return;
332
370
 
333
371
  const w = this.widthPx();
334
372
  const h = this.heightPx();
335
- if (w !== undefined) {
373
+ if (w != null) {
336
374
  dialogEl.style.width = `${w}px`;
337
375
  } else {
338
376
  dialogEl.style.width = "";
339
377
  }
340
- if (h !== undefined) {
378
+ if (h != null) {
341
379
  dialogEl.style.height = `${h}px`;
342
380
  } else {
343
381
  dialogEl.style.height = "";
@@ -347,11 +385,10 @@ export class SdModal {
347
385
  // key 기반 설정 복원
348
386
  effect(() => {
349
387
  const k = this.key();
350
- if (k === undefined || this._sdSystemConfig == null) return;
388
+ if (k == null || this._sdSystemConfig == null) return;
351
389
 
352
390
  void this._restoreConfig(k).catch((err) => this._errorHandler.handleError(err));
353
391
  });
354
-
355
392
  }
356
393
 
357
394
  onResizeMouseDown(event: MouseEvent, dir: string): void {
@@ -361,7 +398,7 @@ export class SdModal {
361
398
 
362
399
  onHeaderMouseDown(event: MouseEvent): void {
363
400
  if (!this.movable()) return;
364
- if ((event.target as HTMLElement).closest("button") !== null) return;
401
+ if ((event.target as HTMLElement).closest("button, sd-anchor") != null) return;
365
402
  event.preventDefault();
366
403
  this._dragResize.startDrag(event);
367
404
  }
@@ -388,8 +425,30 @@ export class SdModal {
388
425
  this._bringToFront();
389
426
  }
390
427
 
428
+ onHostResize(event: SdResizeEvent): void {
429
+ if (event.heightChanged) this._calcHeight();
430
+ if (event.widthChanged) this._calcWidth();
431
+ }
432
+
433
+ onDialogResize(event: SdResizeEvent): void {
434
+ if (event.heightChanged) this._calcHeight();
435
+ if (event.widthChanged) this._calcWidth();
436
+ }
437
+
438
+ onWindowResize(): void {
439
+ const dialogEl = this._getDialogEl();
440
+ if (dialogEl == null) return;
441
+ const hostEl = this._elRef.nativeElement;
442
+ if (dialogEl.offsetLeft > hostEl.offsetWidth - 100) {
443
+ dialogEl.style.left = hostEl.offsetWidth - 100 + "px";
444
+ }
445
+ if (dialogEl.offsetTop > hostEl.offsetHeight - 100) {
446
+ dialogEl.style.top = hostEl.offsetHeight - 100 + "px";
447
+ }
448
+ }
449
+
391
450
  private _requestClose(): void {
392
- if (this._sdActivatedModal !== null && !this._sdActivatedModal.canDeactivateFn()) {
451
+ if (this._sdActivatedModal != null && !this._sdActivatedModal.canDeactivateFn()) {
393
452
  return;
394
453
  }
395
454
  void this._saveConfig().catch((err) => this._errorHandler.handleError(err));
@@ -412,16 +471,36 @@ export class SdModal {
412
471
  hostEl.style.zIndex = String(maxZ + 1);
413
472
  }
414
473
 
474
+ private _calcHeight(): void {
475
+ const dialogEl = this._getDialogEl();
476
+ if (dialogEl == null) return;
477
+ const style = getComputedStyle(this._elRef.nativeElement);
478
+ const paddingTop = style.paddingTop === "" ? 0 : parseInt(style.paddingTop, 10) || 0;
479
+ if (dialogEl.offsetHeight > this._elRef.nativeElement.offsetHeight - paddingTop) {
480
+ dialogEl.style.maxHeight = "100%";
481
+ dialogEl.style.height = "100%";
482
+ }
483
+ }
484
+
485
+ private _calcWidth(): void {
486
+ const dialogEl = this._getDialogEl();
487
+ if (dialogEl == null) return;
488
+ if (dialogEl.offsetWidth > this._elRef.nativeElement.offsetWidth) {
489
+ dialogEl.style.maxWidth = "100%";
490
+ dialogEl.style.width = "100%";
491
+ }
492
+ }
493
+
415
494
  private _getDialogEl(): HTMLElement | null {
416
495
  return this._elRef.nativeElement.querySelector("._dialog");
417
496
  }
418
497
 
419
498
  private async _saveConfig(): Promise<void> {
420
499
  const k = this.key();
421
- if (k === undefined || this._sdSystemConfig == null) return;
500
+ if (k == null || this._sdSystemConfig == null) return;
422
501
 
423
502
  const dialogEl = this._getDialogEl();
424
- if (dialogEl === null) return;
503
+ if (dialogEl == null) return;
425
504
 
426
505
  const config: Record<string, string> = {};
427
506
  if (dialogEl.style.width !== "") config["width"] = dialogEl.style.width;
@@ -441,11 +520,11 @@ export class SdModal {
441
520
  if (config == null) return;
442
521
 
443
522
  const dialogEl = this._getDialogEl();
444
- if (dialogEl === null) return;
523
+ if (dialogEl == null) return;
445
524
 
446
- if (config["width"] !== undefined) dialogEl.style.width = config["width"];
447
- if (config["height"] !== undefined) dialogEl.style.height = config["height"];
448
- if (config["left"] !== undefined) dialogEl.style.left = config["left"];
449
- if (config["top"] !== undefined) dialogEl.style.top = config["top"];
525
+ if (config["width"] != null) dialogEl.style.width = config["width"];
526
+ if (config["height"] != null) dialogEl.style.height = config["height"];
527
+ if (config["left"] != null) dialogEl.style.left = config["left"];
528
+ if (config["top"] != null) dialogEl.style.top = config["top"];
450
529
  }
451
530
  }
@@ -27,11 +27,6 @@ import { SdAngularConfigProvider } from "./config/sd-angular-config.provider";
27
27
  import { SdThemeProvider } from "../features/theme/sd-theme-provider";
28
28
  import { SdLocalStorageProvider } from "./config/sd-local-storage.provider";
29
29
  import { SdGlobalErrorHandlerPlugin } from "./error-handler/sd-global-error-handler.plugin";
30
- import { SdSaveCommandEventPlugin } from "./commands/sd-save-command-event.plugin";
31
- import { SdRefreshCommandEventPlugin } from "./commands/sd-refresh-command-event.plugin";
32
- import { SdInsertCommandEventPlugin } from "./commands/sd-insert-command-event.plugin";
33
- import { SdResizeEventPlugin } from "./events/sd-resize-event.plugin";
34
- import { SdIntersectionEventPlugin } from "./events/sd-intersection-event.plugin";
35
30
  import { SdOptionEventPlugin } from "./events/sd-option-event.plugin";
36
31
 
37
32
  export function provideSdAngular(opt: { clientName: string }): EnvironmentProviders {
@@ -109,11 +104,6 @@ export function provideSdAngular(opt: { clientName: string }): EnvironmentProvid
109
104
  return provider;
110
105
  },
111
106
  },
112
- { provide: EVENT_MANAGER_PLUGINS, useClass: SdSaveCommandEventPlugin, multi: true },
113
- { provide: EVENT_MANAGER_PLUGINS, useClass: SdRefreshCommandEventPlugin, multi: true },
114
- { provide: EVENT_MANAGER_PLUGINS, useClass: SdInsertCommandEventPlugin, multi: true },
115
- { provide: EVENT_MANAGER_PLUGINS, useClass: SdResizeEventPlugin, multi: true },
116
- { provide: EVENT_MANAGER_PLUGINS, useClass: SdIntersectionEventPlugin, multi: true },
117
107
  { provide: EVENT_MANAGER_PLUGINS, useClass: SdOptionEventPlugin, multi: true },
118
108
  { provide: ErrorHandler, useClass: SdGlobalErrorHandlerPlugin },
119
109
  provideZonelessChangeDetection(),
@@ -14,7 +14,7 @@ export function setupRipple(enableFn?: () => boolean): void {
14
14
  let indicatorEl: HTMLElement | undefined;
15
15
 
16
16
  const onPointerDown = (event: PointerEvent): void => {
17
- if (enableFn !== undefined && !enableFn()) return;
17
+ if (enableFn != null && !enableFn()) return;
18
18
 
19
19
  const rect = el.getBoundingClientRect();
20
20
  const size = Math.max(rect.width, rect.height);
@@ -22,7 +22,7 @@ export function setupRipple(enableFn?: () => boolean): void {
22
22
  const x = event.clientX - rect.left;
23
23
  const y = event.clientY - rect.top;
24
24
 
25
- if (indicatorEl !== undefined) {
25
+ if (indicatorEl != null) {
26
26
  indicatorEl.remove();
27
27
  }
28
28
 
@@ -45,21 +45,21 @@ export function setupRipple(enableFn?: () => boolean): void {
45
45
  el.appendChild(indicatorEl);
46
46
 
47
47
  indicatorEl.ontransitionend = (ev: TransitionEvent) => {
48
- if (ev.propertyName === "opacity" && indicatorEl !== undefined) {
48
+ if (ev.propertyName === "opacity" && indicatorEl != null) {
49
49
  indicatorEl.remove();
50
50
  indicatorEl = undefined;
51
51
  }
52
52
  };
53
53
 
54
54
  requestAnimationFrame(() => {
55
- if (indicatorEl !== undefined) {
55
+ if (indicatorEl != null) {
56
56
  indicatorEl.style.transform = "scale(1)";
57
57
  }
58
58
  });
59
59
  };
60
60
 
61
61
  const onPointerUp = (): void => {
62
- if (indicatorEl !== undefined) {
62
+ if (indicatorEl != null) {
63
63
  indicatorEl.style.opacity = "0";
64
64
  }
65
65
  };
@@ -5,7 +5,7 @@ export type { SdMenu } from "../app-structure/sd-app-structure.types";
5
5
  export function getMenuRouterLinkOption(
6
6
  menu: SdMenu,
7
7
  ): { link: string; queryParams: Record<string, string> | undefined } | undefined {
8
- if (menu.children !== undefined || menu.url != null) {
8
+ if (menu.children != null || menu.url != null) {
9
9
  return undefined;
10
10
  }
11
11
 
@@ -34,7 +34,7 @@ export class SdNavigateWindowProvider {
34
34
  });
35
35
  }
36
36
  } else {
37
- const paramStr = params !== undefined ? new URLSearchParams(params).toString() : "";
37
+ const paramStr = params != null ? new URLSearchParams(params).toString() : "";
38
38
  const suffix = paramStr !== "" ? `;${paramStr}` : "";
39
39
  window.open(
40
40
  `${location.pathname}#${navigate}${suffix}`,
@@ -55,7 +55,7 @@ export class SdRouterLink {
55
55
  ? "?" + new URLSearchParams(option.queryParams).toString()
56
56
  : "";
57
57
  this._sdNavigateWindow.open(option.link + qp, option.params);
58
- } else if (option.outletName === undefined) {
58
+ } else if (option.outletName == null) {
59
59
  await this._router.navigate(
60
60
  [option.link, ...(option.params ? [option.params] : [])],
61
61
  option.queryParams ? { queryParams: option.queryParams } : undefined,
@@ -15,11 +15,11 @@ export function setupCumulateSelectedKeys<TItem, TKey>(options: {
15
15
  if (selectedItems.length === 0) return;
16
16
 
17
17
  const itemKeySet = new Set(
18
- items.map((item) => options.keySelectorFn(item)).filter((k) => k !== undefined),
18
+ items.map((item) => options.keySelectorFn(item)).filter((k) => k != null),
19
19
  );
20
20
  const filtered = selectedItems.filter((item) => {
21
21
  const key = options.keySelectorFn(item);
22
- return key !== undefined && itemKeySet.has(key);
22
+ return key != null && itemKeySet.has(key);
23
23
  });
24
24
 
25
25
  if (filtered.length !== selectedItems.length) {
@@ -32,7 +32,7 @@ export function setupCumulateSelectedKeys<TItem, TKey>(options: {
32
32
  const selectedItems = options.selectedItems();
33
33
  const keys = selectedItems
34
34
  .map((item) => options.keySelectorFn(item))
35
- .filter((k): k is TKey => k !== undefined);
35
+ .filter((k): k is TKey => k != null);
36
36
  options.selectedItemKeys.set(keys);
37
37
  });
38
38
  }
@@ -44,7 +44,7 @@ export function setupModelHook<T, S extends WritableSignal<T>>(
44
44
  void canSet
45
45
  .then((allowed) => {
46
46
  if (allowed !== false) {
47
- orgSet(fn(model()));
47
+ orgSet(value);
48
48
  }
49
49
  })
50
50
  .catch((err) => {
@@ -14,7 +14,7 @@ import {
14
14
  host: {
15
15
  "[attr.data-sd-overlap]": "overlap() || undefined",
16
16
  },
17
- template: `<ng-content />`,
17
+ template: "",
18
18
  styles: [
19
19
  /* language=SCSS */ `
20
20
  @use "../../../scss/commons/variables";
@@ -48,14 +48,14 @@ export class SdToastProvider {
48
48
 
49
49
  constructor() {
50
50
  effect(() => {
51
- if (this._containerRef !== undefined) {
51
+ if (this._containerRef != null) {
52
52
  this._containerRef.setInput("overlap", this.overlap());
53
53
  }
54
54
  });
55
55
  }
56
56
 
57
57
  private _getContainerRef(): ComponentRef<SdToastContainer> {
58
- if (this._containerRef === undefined) {
58
+ if (this._containerRef == null) {
59
59
  this._containerRef = createComponent(SdToastContainer, {
60
60
  environmentInjector: this._envInjector,
61
61
  });
@@ -158,7 +158,7 @@ export class SdToastProvider {
158
158
  throw err;
159
159
  }
160
160
 
161
- const message = messageFn !== undefined ? messageFn(err) : err.message;
161
+ const message = messageFn != null ? messageFn(err) : err.message;
162
162
  this.danger(message);
163
163
  await this._sdSystemLog.writeAsync("error", err.stack ?? err.message);
164
164
  return undefined;
@@ -177,7 +177,7 @@ export class SdToastProvider {
177
177
  }
178
178
 
179
179
  // beforeShowFn 콜백
180
- if (this.beforeShowFn !== undefined) {
180
+ if (this.beforeShowFn != null) {
181
181
  this.beforeShowFn(theme);
182
182
  }
183
183
 
@@ -299,14 +299,14 @@ export class SdToastProvider {
299
299
 
300
300
  // 연결된 contentRef 파괴
301
301
  const contentRef = this._contentRefs.get(toastRef);
302
- if (contentRef !== undefined) {
302
+ if (contentRef != null) {
303
303
  this._contentRefs.delete(toastRef);
304
304
  this._appRef.detachView(contentRef.hostView);
305
305
  contentRef.destroy();
306
306
  }
307
307
 
308
308
  const el = toastRef.location.nativeElement as HTMLElement;
309
- if (el.parentNode !== null) {
309
+ if (el.parentNode != null) {
310
310
  el.parentNode.removeChild(el);
311
311
  }
312
312
  this._appRef.detachView(toastRef.hostView);