@simplysm/angular 14.0.42 → 14.0.44

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
@@ -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
  }
@@ -125,9 +125,9 @@ export class SdModalProvider {
125
125
 
126
126
  // 6. 옵션 바인딩
127
127
  modalRef.setInput("title", modal.title);
128
- if (options !== undefined) {
128
+ if (options != null) {
129
129
  for (const [key, value] of Object.entries(options)) {
130
- if (value !== undefined && key !== "noFirstControlFocusing") {
130
+ if (value != null && key !== "noFirstControlFocusing") {
131
131
  modalRef.setInput(key, value);
132
132
  }
133
133
  }
@@ -174,7 +174,7 @@ export class SdModalProvider {
174
174
  // 컨텐츠 영역에서 첫 탭 이동 가능 요소 검색
175
175
  const contentEl = modalEl.querySelector("._content");
176
176
  const firstTabbable = contentEl?.findFirstTabbableChild();
177
- if (firstTabbable !== undefined) {
177
+ if (firstTabbable != null) {
178
178
  firstTabbable.focus();
179
179
  } else {
180
180
  dialogEl.focus();
@@ -197,7 +197,7 @@ export class SdModalProvider {
197
197
 
198
198
  const doDestroy = () => {
199
199
  // DOM에서 제거
200
- if (modalEl.parentNode !== null) {
200
+ if (modalEl.parentNode != null) {
201
201
  modalEl.parentNode.removeChild(modalEl);
202
202
  }
203
203
 
@@ -211,7 +211,7 @@ export class SdModalProvider {
211
211
  this.modalCount.update((v) => v - 1);
212
212
 
213
213
  // 포커스 복귀
214
- if (prevActiveEl !== null && prevActiveEl.isConnected) {
214
+ if (prevActiveEl != null && prevActiveEl.isConnected) {
215
215
  prevActiveEl.focus();
216
216
  }
217
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
56
  <div class="_header" (mousedown)="onHeaderMouseDown($event)" [style]="headerStyle()">
42
- <span class="_title">{{ title() }}</span>
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
 
@@ -329,16 +366,16 @@ export class SdModal {
329
366
  // widthPx/heightPx를 dialog 스타일에 적용
330
367
  effect(() => {
331
368
  const dialogEl = this._getDialogEl();
332
- if (dialogEl === null) return;
369
+ if (dialogEl == null) return;
333
370
 
334
371
  const w = this.widthPx();
335
372
  const h = this.heightPx();
336
- if (w !== undefined) {
373
+ if (w != null) {
337
374
  dialogEl.style.width = `${w}px`;
338
375
  } else {
339
376
  dialogEl.style.width = "";
340
377
  }
341
- if (h !== undefined) {
378
+ if (h != null) {
342
379
  dialogEl.style.height = `${h}px`;
343
380
  } else {
344
381
  dialogEl.style.height = "";
@@ -348,11 +385,10 @@ export class SdModal {
348
385
  // key 기반 설정 복원
349
386
  effect(() => {
350
387
  const k = this.key();
351
- if (k === undefined || this._sdSystemConfig == null) return;
388
+ if (k == null || this._sdSystemConfig == null) return;
352
389
 
353
390
  void this._restoreConfig(k).catch((err) => this._errorHandler.handleError(err));
354
391
  });
355
-
356
392
  }
357
393
 
358
394
  onResizeMouseDown(event: MouseEvent, dir: string): void {
@@ -362,7 +398,7 @@ export class SdModal {
362
398
 
363
399
  onHeaderMouseDown(event: MouseEvent): void {
364
400
  if (!this.movable()) return;
365
- if ((event.target as HTMLElement).closest("button") !== null) return;
401
+ if ((event.target as HTMLElement).closest("button, sd-anchor") != null) return;
366
402
  event.preventDefault();
367
403
  this._dragResize.startDrag(event);
368
404
  }
@@ -389,8 +425,30 @@ export class SdModal {
389
425
  this._bringToFront();
390
426
  }
391
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
+
392
450
  private _requestClose(): void {
393
- if (this._sdActivatedModal !== null && !this._sdActivatedModal.canDeactivateFn()) {
451
+ if (this._sdActivatedModal != null && !this._sdActivatedModal.canDeactivateFn()) {
394
452
  return;
395
453
  }
396
454
  void this._saveConfig().catch((err) => this._errorHandler.handleError(err));
@@ -413,16 +471,36 @@ export class SdModal {
413
471
  hostEl.style.zIndex = String(maxZ + 1);
414
472
  }
415
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
+
416
494
  private _getDialogEl(): HTMLElement | null {
417
495
  return this._elRef.nativeElement.querySelector("._dialog");
418
496
  }
419
497
 
420
498
  private async _saveConfig(): Promise<void> {
421
499
  const k = this.key();
422
- if (k === undefined || this._sdSystemConfig == null) return;
500
+ if (k == null || this._sdSystemConfig == null) return;
423
501
 
424
502
  const dialogEl = this._getDialogEl();
425
- if (dialogEl === null) return;
503
+ if (dialogEl == null) return;
426
504
 
427
505
  const config: Record<string, string> = {};
428
506
  if (dialogEl.style.width !== "") config["width"] = dialogEl.style.width;
@@ -442,11 +520,11 @@ export class SdModal {
442
520
  if (config == null) return;
443
521
 
444
522
  const dialogEl = this._getDialogEl();
445
- if (dialogEl === null) return;
523
+ if (dialogEl == null) return;
446
524
 
447
- if (config["width"] !== undefined) dialogEl.style.width = config["width"];
448
- if (config["height"] !== undefined) dialogEl.style.height = config["height"];
449
- if (config["left"] !== undefined) dialogEl.style.left = config["left"];
450
- 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"];
451
529
  }
452
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);