@simplysm/angular 14.0.1 → 14.0.5

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 (456) hide show
  1. package/README.md +318 -0
  2. package/dist/core/commons.d.ts +2 -0
  3. package/dist/core/commons.d.ts.map +1 -0
  4. package/dist/core/commons.js +4 -0
  5. package/dist/core/directives/sd-events.directive.js +7 -7
  6. package/dist/core/directives/sd-item-of-template.directive.d.ts +14 -0
  7. package/dist/core/directives/sd-item-of-template.directive.d.ts.map +1 -0
  8. package/dist/core/directives/sd-item-of-template.directive.js +17 -0
  9. package/dist/core/directives/sd-router-link.directive.d.ts +19 -0
  10. package/dist/core/directives/sd-router-link.directive.d.ts.map +1 -0
  11. package/dist/core/directives/sd-router-link.directive.js +64 -0
  12. package/dist/core/directives/sd-typed-template.directive.d.ts +8 -0
  13. package/dist/core/directives/sd-typed-template.directive.d.ts.map +1 -0
  14. package/dist/core/directives/sd-typed-template.directive.js +17 -0
  15. package/dist/core/pipes/format.pipe.d.ts +9 -0
  16. package/dist/core/pipes/format.pipe.d.ts.map +1 -0
  17. package/dist/core/pipes/format.pipe.js +43 -0
  18. package/dist/core/plugins/commands/findTopOpenModalEl.d.ts +8 -0
  19. package/dist/core/plugins/commands/findTopOpenModalEl.d.ts.map +1 -0
  20. package/dist/core/plugins/commands/findTopOpenModalEl.js +21 -0
  21. package/dist/core/plugins/commands/sd-insert-command-event.plugin.d.ts.map +1 -1
  22. package/dist/core/plugins/commands/sd-insert-command-event.plugin.js +4 -0
  23. package/dist/core/plugins/commands/sd-refresh-command-event.plugin.d.ts.map +1 -1
  24. package/dist/core/plugins/commands/sd-refresh-command-event.plugin.js +4 -0
  25. package/dist/core/plugins/commands/sd-save-command-event.plugin.d.ts.map +1 -1
  26. package/dist/core/plugins/commands/sd-save-command-event.plugin.js +4 -0
  27. package/dist/core/plugins/events/sd-resize-event.plugin.d.ts.map +1 -1
  28. package/dist/core/plugins/events/sd-resize-event.plugin.js +0 -18
  29. package/dist/core/plugins/sd-global-error-handler.plugin.d.ts +1 -0
  30. package/dist/core/plugins/sd-global-error-handler.plugin.d.ts.map +1 -1
  31. package/dist/core/plugins/sd-global-error-handler.plugin.js +23 -13
  32. package/dist/core/provideSdAngular.d.ts +5 -0
  33. package/dist/core/provideSdAngular.d.ts.map +1 -0
  34. package/dist/core/provideSdAngular.js +127 -0
  35. package/dist/core/providers/sd-angular-config.provider.d.ts +7 -0
  36. package/dist/core/providers/sd-angular-config.provider.d.ts.map +1 -0
  37. package/dist/core/providers/sd-angular-config.provider.js +11 -0
  38. package/dist/core/providers/sd-app-structure.provider.d.ts +79 -0
  39. package/dist/core/providers/sd-app-structure.provider.d.ts.map +1 -0
  40. package/dist/core/providers/sd-app-structure.provider.js +278 -0
  41. package/dist/core/providers/sd-file-dialog.provider.d.ts +8 -0
  42. package/dist/core/providers/sd-file-dialog.provider.d.ts.map +1 -0
  43. package/dist/core/providers/sd-file-dialog.provider.js +49 -0
  44. package/dist/core/providers/sd-local-storage.provider.d.ts +10 -0
  45. package/dist/core/providers/sd-local-storage.provider.d.ts.map +1 -0
  46. package/dist/core/providers/sd-local-storage.provider.js +24 -0
  47. package/dist/core/providers/sd-navigate-window.provider.d.ts +9 -0
  48. package/dist/core/providers/sd-navigate-window.provider.d.ts.map +1 -0
  49. package/dist/core/providers/sd-navigate-window.provider.js +33 -0
  50. package/dist/core/providers/sd-print.provider.d.ts +26 -0
  51. package/dist/core/providers/sd-print.provider.d.ts.map +1 -0
  52. package/dist/core/providers/sd-print.provider.js +142 -0
  53. package/dist/core/providers/sd-service-client-factory.provider.d.ts +19 -0
  54. package/dist/core/providers/sd-service-client-factory.provider.d.ts.map +1 -0
  55. package/dist/core/providers/sd-service-client-factory.provider.js +86 -0
  56. package/dist/core/providers/sd-shared-data.provider.d.ts +36 -0
  57. package/dist/core/providers/sd-shared-data.provider.d.ts.map +1 -0
  58. package/dist/core/providers/sd-shared-data.provider.js +119 -0
  59. package/dist/core/providers/sd-system-config.provider.d.ts +13 -0
  60. package/dist/core/providers/sd-system-config.provider.d.ts.map +1 -0
  61. package/dist/core/providers/sd-system-config.provider.js +29 -0
  62. package/dist/core/providers/sd-system-log.provider.d.ts +8 -0
  63. package/dist/core/providers/sd-system-log.provider.d.ts.map +1 -0
  64. package/dist/core/providers/sd-system-log.provider.js +23 -0
  65. package/dist/core/providers/sd-theme-provider.js +1 -1
  66. package/dist/core/utils/TDirectiveInputSignals.d.ts +29 -0
  67. package/dist/core/utils/TDirectiveInputSignals.d.ts.map +1 -0
  68. package/dist/core/utils/TDirectiveInputSignals.js +1 -0
  69. package/dist/core/utils/setups/setupCanDeactivate.d.ts +2 -0
  70. package/dist/core/utils/setups/setupCanDeactivate.d.ts.map +1 -0
  71. package/dist/core/utils/setups/setupCanDeactivate.js +28 -0
  72. package/dist/core/utils/setups/setupModelHook.d.ts +3 -0
  73. package/dist/core/utils/setups/setupModelHook.d.ts.map +1 -0
  74. package/dist/core/utils/setups/setupModelHook.js +18 -0
  75. package/dist/core/utils/useCurrentPageCodeSignal.d.ts +3 -0
  76. package/dist/core/utils/useCurrentPageCodeSignal.d.ts.map +1 -0
  77. package/dist/core/utils/useCurrentPageCodeSignal.js +13 -0
  78. package/dist/core/utils/useExpandingManager.d.ts +23 -0
  79. package/dist/core/utils/useExpandingManager.d.ts.map +1 -0
  80. package/dist/core/utils/useExpandingManager.js +86 -0
  81. package/dist/core/utils/useFullPageCodeSignal.d.ts +3 -0
  82. package/dist/core/utils/useFullPageCodeSignal.d.ts.map +1 -0
  83. package/dist/core/utils/useFullPageCodeSignal.js +13 -0
  84. package/dist/core/utils/useSdSystemConfigResource.d.ts +13 -0
  85. package/dist/core/utils/useSdSystemConfigResource.d.ts.map +1 -0
  86. package/dist/core/utils/useSdSystemConfigResource.js +31 -0
  87. package/dist/core/utils/useSelectionManager.d.ts +18 -0
  88. package/dist/core/utils/useSelectionManager.d.ts.map +1 -0
  89. package/dist/core/utils/useSelectionManager.js +89 -0
  90. package/dist/core/utils/useSortingManager.d.ts +17 -0
  91. package/dist/core/utils/useSortingManager.d.ts.map +1 -0
  92. package/dist/core/utils/useSortingManager.js +81 -0
  93. package/dist/core/utils/useViewTitleSignal.d.ts +3 -0
  94. package/dist/core/utils/useViewTitleSignal.d.ts.map +1 -0
  95. package/dist/core/utils/useViewTitleSignal.js +17 -0
  96. package/dist/core/utils/useViewTypeSignal.d.ts +4 -0
  97. package/dist/core/utils/useViewTypeSignal.d.ts.map +1 -0
  98. package/dist/core/utils/useViewTypeSignal.js +23 -0
  99. package/dist/index.d.ts +95 -0
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +115 -0
  102. package/dist/styles.css +1462 -722
  103. package/dist/ui/data/list/sd-list-item.control.d.ts +18 -0
  104. package/dist/ui/data/list/sd-list-item.control.d.ts.map +1 -0
  105. package/dist/ui/data/list/sd-list-item.control.js +130 -0
  106. package/dist/ui/data/list/sd-list.control.d.ts +7 -0
  107. package/dist/ui/data/list/sd-list.control.d.ts.map +1 -0
  108. package/dist/ui/data/list/sd-list.control.js +22 -0
  109. package/dist/ui/data/sheet/sd-sheet-column.directive.d.ts +18 -0
  110. package/dist/ui/data/sheet/sd-sheet-column.directive.d.ts.map +1 -0
  111. package/dist/ui/data/sheet/sd-sheet-column.directive.js +30 -0
  112. package/dist/ui/data/sheet/sd-sheet-config.modal.d.ts +39 -0
  113. package/dist/ui/data/sheet/sd-sheet-config.modal.d.ts.map +1 -0
  114. package/dist/ui/data/sheet/sd-sheet-config.modal.js +258 -0
  115. package/dist/ui/data/sheet/sd-sheet.control.d.ts +154 -0
  116. package/dist/ui/data/sheet/sd-sheet.control.d.ts.map +1 -0
  117. package/dist/ui/data/sheet/sd-sheet.control.js +846 -0
  118. package/dist/ui/data/sheet/types.d.ts +32 -0
  119. package/dist/ui/data/sheet/types.d.ts.map +1 -0
  120. package/dist/ui/data/sheet/types.js +1 -0
  121. package/dist/ui/data/sheet/useSheetCellAgent.d.ts +21 -0
  122. package/dist/ui/data/sheet/useSheetCellAgent.d.ts.map +1 -0
  123. package/dist/ui/data/sheet/useSheetCellAgent.js +245 -0
  124. package/dist/ui/data/sheet/useSheetColumnFixing.d.ts +9 -0
  125. package/dist/ui/data/sheet/useSheetColumnFixing.d.ts.map +1 -0
  126. package/dist/ui/data/sheet/useSheetColumnFixing.js +29 -0
  127. package/dist/ui/data/sheet/useSheetDomAccessor.d.ts +11 -0
  128. package/dist/ui/data/sheet/useSheetDomAccessor.d.ts.map +1 -0
  129. package/dist/ui/data/sheet/useSheetDomAccessor.js +55 -0
  130. package/dist/ui/data/sheet/useSheetLayoutEngine.d.ts +14 -0
  131. package/dist/ui/data/sheet/useSheetLayoutEngine.d.ts.map +1 -0
  132. package/dist/ui/data/sheet/useSheetLayoutEngine.js +126 -0
  133. package/dist/ui/form/button/sd-additional-button.control.d.ts +8 -0
  134. package/dist/ui/form/button/sd-additional-button.control.d.ts.map +1 -0
  135. package/dist/ui/form/button/sd-additional-button.control.js +38 -0
  136. package/dist/ui/form/button/sd-anchor.control.d.ts +8 -0
  137. package/dist/ui/form/button/sd-anchor.control.d.ts.map +1 -0
  138. package/dist/ui/form/button/sd-anchor.control.js +25 -0
  139. package/dist/ui/form/button/sd-button.control.d.ts +14 -0
  140. package/dist/ui/form/button/sd-button.control.d.ts.map +1 -0
  141. package/dist/ui/form/button/sd-button.control.js +49 -0
  142. package/dist/ui/form/button/sd-modal-select-button.control.d.ts +46 -0
  143. package/dist/ui/form/button/sd-modal-select-button.control.d.ts.map +1 -0
  144. package/dist/ui/form/button/sd-modal-select-button.control.js +149 -0
  145. package/dist/ui/form/checkbox/sd-checkbox-group-item.control.d.ts +12 -0
  146. package/dist/ui/form/checkbox/sd-checkbox-group-item.control.d.ts.map +1 -0
  147. package/dist/ui/form/checkbox/sd-checkbox-group-item.control.js +53 -0
  148. package/dist/ui/form/checkbox/sd-checkbox-group.control.d.ts +8 -0
  149. package/dist/ui/form/checkbox/sd-checkbox-group.control.d.ts.map +1 -0
  150. package/dist/ui/form/checkbox/sd-checkbox-group.control.js +26 -0
  151. package/dist/ui/form/checkbox/sd-checkbox.control.d.ts +19 -0
  152. package/dist/ui/form/checkbox/sd-checkbox.control.d.ts.map +1 -0
  153. package/dist/ui/form/checkbox/sd-checkbox.control.js +103 -0
  154. package/dist/ui/form/checkbox/sd-switch.control.d.ts +14 -0
  155. package/dist/ui/form/checkbox/sd-switch.control.d.ts.map +1 -0
  156. package/dist/ui/form/checkbox/sd-switch.control.js +54 -0
  157. package/dist/ui/form/choice/sd-state-preset.control.d.ts +24 -0
  158. package/dist/ui/form/choice/sd-state-preset.control.d.ts.map +1 -0
  159. package/dist/ui/form/choice/sd-state-preset.control.js +134 -0
  160. package/dist/ui/form/editor/sd-tiptap-editor.control.d.ts +35 -0
  161. package/dist/ui/form/editor/sd-tiptap-editor.control.d.ts.map +1 -0
  162. package/dist/ui/form/editor/sd-tiptap-editor.control.js +480 -0
  163. package/dist/ui/form/input/sd-date-range.picker.d.ts +13 -0
  164. package/dist/ui/form/input/sd-date-range.picker.d.ts.map +1 -0
  165. package/dist/ui/form/input/sd-date-range.picker.js +125 -0
  166. package/dist/ui/form/input/sd-numpad.control.d.ts +18 -0
  167. package/dist/ui/form/input/sd-numpad.control.d.ts.map +1 -0
  168. package/dist/ui/form/input/sd-numpad.control.js +241 -0
  169. package/dist/ui/form/input/sd-range.control.d.ts +13 -0
  170. package/dist/ui/form/input/sd-range.control.d.ts.map +1 -0
  171. package/dist/ui/form/input/sd-range.control.js +53 -0
  172. package/dist/ui/form/input/sd-textarea.control.d.ts +23 -0
  173. package/dist/ui/form/input/sd-textarea.control.d.ts.map +1 -0
  174. package/dist/ui/form/input/sd-textarea.control.js +132 -0
  175. package/dist/ui/form/input/sd-textfield-type-handlers.d.ts +46 -0
  176. package/dist/ui/form/input/sd-textfield-type-handlers.d.ts.map +1 -0
  177. package/dist/ui/form/input/sd-textfield-type-handlers.js +336 -0
  178. package/dist/ui/form/input/sd-textfield.control.d.ts +39 -0
  179. package/dist/ui/form/input/sd-textfield.control.d.ts.map +1 -0
  180. package/dist/ui/form/input/sd-textfield.control.js +211 -0
  181. package/dist/ui/form/sd-form.control.d.ts +13 -0
  182. package/dist/ui/form/sd-form.control.d.ts.map +1 -0
  183. package/dist/ui/form/sd-form.control.js +60 -0
  184. package/dist/ui/form/select/sd-select-button.control.d.ts +7 -0
  185. package/dist/ui/form/select/sd-select-button.control.d.ts.map +1 -0
  186. package/dist/ui/form/select/sd-select-button.control.js +25 -0
  187. package/dist/ui/form/select/sd-select-item.control.d.ts +18 -0
  188. package/dist/ui/form/select/sd-select-item.control.d.ts.map +1 -0
  189. package/dist/ui/form/select/sd-select-item.control.js +103 -0
  190. package/dist/ui/form/select/sd-select.control.d.ts +45 -0
  191. package/dist/ui/form/select/sd-select.control.d.ts.map +1 -0
  192. package/dist/ui/form/select/sd-select.control.js +430 -0
  193. package/dist/ui/layout/dock/sd-dock-container.control.d.ts +12 -0
  194. package/dist/ui/layout/dock/sd-dock-container.control.d.ts.map +1 -0
  195. package/dist/ui/layout/dock/sd-dock-container.control.js +96 -0
  196. package/dist/ui/layout/dock/sd-dock.control.d.ts +17 -0
  197. package/dist/ui/layout/dock/sd-dock.control.d.ts.map +1 -0
  198. package/dist/ui/layout/dock/sd-dock.control.js +111 -0
  199. package/dist/ui/layout/kanban/sd-kanban-board.control.d.ts +24 -0
  200. package/dist/ui/layout/kanban/sd-kanban-board.control.d.ts.map +1 -0
  201. package/dist/ui/layout/kanban/sd-kanban-board.control.js +37 -0
  202. package/dist/ui/layout/kanban/sd-kanban-lane.control.d.ts +29 -0
  203. package/dist/ui/layout/kanban/sd-kanban-lane.control.d.ts.map +1 -0
  204. package/dist/ui/layout/kanban/sd-kanban-lane.control.js +223 -0
  205. package/dist/ui/layout/kanban/sd-kanban.control.d.ts +32 -0
  206. package/dist/ui/layout/kanban/sd-kanban.control.d.ts.map +1 -0
  207. package/dist/ui/layout/kanban/sd-kanban.control.js +147 -0
  208. package/dist/ui/layout/sd-card.directive.d.ts +6 -0
  209. package/dist/ui/layout/sd-card.directive.d.ts.map +1 -0
  210. package/dist/ui/layout/sd-card.directive.js +16 -0
  211. package/dist/ui/layout/sd-gap.control.d.ts +13 -0
  212. package/dist/ui/layout/sd-gap.control.d.ts.map +1 -0
  213. package/dist/ui/layout/sd-gap.control.js +44 -0
  214. package/dist/ui/layout/sd-pane.directive.d.ts +6 -0
  215. package/dist/ui/layout/sd-pane.directive.d.ts.map +1 -0
  216. package/dist/ui/layout/sd-pane.directive.js +17 -0
  217. package/dist/ui/layout/view/sd-view-item.control.d.ts +9 -0
  218. package/dist/ui/layout/view/sd-view-item.control.d.ts.map +1 -0
  219. package/dist/ui/layout/view/sd-view-item.control.js +25 -0
  220. package/dist/ui/layout/view/sd-view.control.d.ts +8 -0
  221. package/dist/ui/layout/view/sd-view.control.d.ts.map +1 -0
  222. package/dist/ui/layout/view/sd-view.control.js +23 -0
  223. package/dist/ui/navigation/collapse/sd-collapse-icon.control.d.ts +13 -0
  224. package/dist/ui/navigation/collapse/sd-collapse-icon.control.d.ts.map +1 -0
  225. package/dist/ui/navigation/collapse/sd-collapse-icon.control.js +33 -0
  226. package/dist/ui/navigation/collapse/sd-collapse.control.d.ts +14 -0
  227. package/dist/ui/navigation/collapse/sd-collapse.control.d.ts.map +1 -0
  228. package/dist/ui/navigation/collapse/sd-collapse.control.js +59 -0
  229. package/dist/ui/navigation/menu-utils.d.ts +13 -0
  230. package/dist/ui/navigation/menu-utils.d.ts.map +1 -0
  231. package/dist/ui/navigation/menu-utils.js +18 -0
  232. package/dist/ui/navigation/pagination/sd-pagination.control.d.ts +24 -0
  233. package/dist/ui/navigation/pagination/sd-pagination.control.d.ts.map +1 -0
  234. package/dist/ui/navigation/pagination/sd-pagination.control.js +137 -0
  235. package/dist/ui/navigation/sidebar/sd-sidebar-container.control.d.ts +11 -0
  236. package/dist/ui/navigation/sidebar/sd-sidebar-container.control.d.ts.map +1 -0
  237. package/dist/ui/navigation/sidebar/sd-sidebar-container.control.js +46 -0
  238. package/dist/ui/navigation/sidebar/sd-sidebar-menu.control.d.ts +28 -0
  239. package/dist/ui/navigation/sidebar/sd-sidebar-menu.control.d.ts.map +1 -0
  240. package/dist/ui/navigation/sidebar/sd-sidebar-menu.control.js +159 -0
  241. package/dist/ui/navigation/sidebar/sd-sidebar-user.control.d.ts +16 -0
  242. package/dist/ui/navigation/sidebar/sd-sidebar-user.control.d.ts.map +1 -0
  243. package/dist/ui/navigation/sidebar/sd-sidebar-user.control.js +109 -0
  244. package/dist/ui/navigation/sidebar/sd-sidebar.control.d.ts +8 -0
  245. package/dist/ui/navigation/sidebar/sd-sidebar.control.d.ts.map +1 -0
  246. package/dist/ui/navigation/sidebar/sd-sidebar.control.js +24 -0
  247. package/dist/ui/navigation/tab/sd-tab-item.control.d.ts +10 -0
  248. package/dist/ui/navigation/tab/sd-tab-item.control.d.ts.map +1 -0
  249. package/dist/ui/navigation/tab/sd-tab-item.control.js +31 -0
  250. package/dist/ui/navigation/tab/sd-tab.control.d.ts +7 -0
  251. package/dist/ui/navigation/tab/sd-tab.control.d.ts.map +1 -0
  252. package/dist/ui/navigation/tab/sd-tab.control.js +18 -0
  253. package/dist/ui/navigation/tab/sd-tabview-item.control.d.ts +10 -0
  254. package/dist/ui/navigation/tab/sd-tabview-item.control.d.ts.map +1 -0
  255. package/dist/ui/navigation/tab/sd-tabview-item.control.js +26 -0
  256. package/dist/ui/navigation/tab/sd-tabview.control.d.ts +9 -0
  257. package/dist/ui/navigation/tab/sd-tabview.control.d.ts.map +1 -0
  258. package/dist/ui/navigation/tab/sd-tabview.control.js +67 -0
  259. package/dist/ui/navigation/topbar/sd-topbar-container.control.d.ts +6 -0
  260. package/dist/ui/navigation/topbar/sd-topbar-container.control.d.ts.map +1 -0
  261. package/dist/ui/navigation/topbar/sd-topbar-container.control.js +17 -0
  262. package/dist/ui/navigation/topbar/sd-topbar-menu.control.d.ts +29 -0
  263. package/dist/ui/navigation/topbar/sd-topbar-menu.control.d.ts.map +1 -0
  264. package/dist/ui/navigation/topbar/sd-topbar-menu.control.js +245 -0
  265. package/dist/ui/navigation/topbar/sd-topbar-user.control.d.ts +13 -0
  266. package/dist/ui/navigation/topbar/sd-topbar-user.control.d.ts.map +1 -0
  267. package/dist/ui/navigation/topbar/sd-topbar-user.control.js +77 -0
  268. package/dist/ui/navigation/topbar/sd-topbar.control.d.ts +12 -0
  269. package/dist/ui/navigation/topbar/sd-topbar.control.d.ts.map +1 -0
  270. package/dist/ui/navigation/topbar/sd-topbar.control.js +59 -0
  271. package/dist/ui/overlay/busy/sd-busy-container.control.d.ts +14 -0
  272. package/dist/ui/overlay/busy/sd-busy-container.control.d.ts.map +1 -0
  273. package/dist/ui/overlay/busy/sd-busy-container.control.js +119 -0
  274. package/dist/ui/overlay/busy/sd-busy.provider.d.ts +16 -0
  275. package/dist/ui/overlay/busy/sd-busy.provider.d.ts.map +1 -0
  276. package/dist/ui/overlay/busy/sd-busy.provider.js +43 -0
  277. package/dist/ui/overlay/dropdown/sd-dropdown-popup.control.d.ts +11 -0
  278. package/dist/ui/overlay/dropdown/sd-dropdown-popup.control.d.ts.map +1 -0
  279. package/dist/ui/overlay/dropdown/sd-dropdown-popup.control.js +43 -0
  280. package/dist/ui/overlay/dropdown/sd-dropdown.control.d.ts +27 -0
  281. package/dist/ui/overlay/dropdown/sd-dropdown.control.d.ts.map +1 -0
  282. package/dist/ui/overlay/dropdown/sd-dropdown.control.js +284 -0
  283. package/dist/ui/overlay/modal/sd-confirm-modal.control.d.ts +17 -0
  284. package/dist/ui/overlay/modal/sd-confirm-modal.control.d.ts.map +1 -0
  285. package/dist/ui/overlay/modal/sd-confirm-modal.control.js +51 -0
  286. package/dist/ui/overlay/modal/sd-modal.control.d.ts +51 -0
  287. package/dist/ui/overlay/modal/sd-modal.control.d.ts.map +1 -0
  288. package/dist/ui/overlay/modal/sd-modal.control.js +411 -0
  289. package/dist/ui/overlay/modal/sd-modal.provider.d.ts +65 -0
  290. package/dist/ui/overlay/modal/sd-modal.provider.d.ts.map +1 -0
  291. package/dist/ui/overlay/modal/sd-modal.provider.js +146 -0
  292. package/dist/ui/overlay/modal/sd-prompt-modal.control.d.ts +19 -0
  293. package/dist/ui/overlay/modal/sd-prompt-modal.control.d.ts.map +1 -0
  294. package/dist/ui/overlay/modal/sd-prompt-modal.control.js +71 -0
  295. package/dist/ui/overlay/toast/sd-toast-container.control.d.ts +7 -0
  296. package/dist/ui/overlay/toast/sd-toast-container.control.d.ts.map +1 -0
  297. package/dist/ui/overlay/toast/sd-toast-container.control.js +20 -0
  298. package/dist/ui/overlay/toast/sd-toast.control.d.ts +14 -0
  299. package/dist/ui/overlay/toast/sd-toast.control.d.ts.map +1 -0
  300. package/dist/ui/overlay/toast/sd-toast.control.js +79 -0
  301. package/dist/ui/overlay/toast/sd-toast.provider.d.ts +45 -0
  302. package/dist/ui/overlay/toast/sd-toast.provider.d.ts.map +1 -0
  303. package/dist/ui/overlay/toast/sd-toast.provider.js +219 -0
  304. package/dist/ui/visual/sd-barcode.control.d.ts +11 -0
  305. package/dist/ui/visual/sd-barcode.control.d.ts.map +1 -0
  306. package/dist/ui/visual/sd-barcode.control.js +35 -0
  307. package/dist/ui/visual/sd-calendar.control.d.ts +20 -0
  308. package/dist/ui/visual/sd-calendar.control.d.ts.map +1 -0
  309. package/dist/ui/visual/sd-calendar.control.js +189 -0
  310. package/dist/ui/visual/sd-echarts.control.d.ts +13 -0
  311. package/dist/ui/visual/sd-echarts.control.d.ts.map +1 -0
  312. package/dist/ui/visual/sd-echarts.control.js +55 -0
  313. package/dist/ui/visual/sd-label.control.d.ts +9 -0
  314. package/dist/ui/visual/sd-label.control.d.ts.map +1 -0
  315. package/dist/ui/visual/sd-label.control.js +27 -0
  316. package/dist/ui/visual/sd-note.control.d.ts +9 -0
  317. package/dist/ui/visual/sd-note.control.d.ts.map +1 -0
  318. package/dist/ui/visual/sd-note.control.js +26 -0
  319. package/dist/ui/visual/sd-progress.control.d.ts +10 -0
  320. package/dist/ui/visual/sd-progress.control.d.ts.map +1 -0
  321. package/dist/ui/visual/sd-progress.control.js +38 -0
  322. package/docs/commons-and-configuration.md +34 -0
  323. package/docs/data-display-components.md +146 -0
  324. package/docs/directives.md +158 -0
  325. package/docs/event-plugins.md +109 -0
  326. package/docs/form-components.md +362 -0
  327. package/docs/hooks-and-utilities.md +175 -0
  328. package/docs/layout-components.md +140 -0
  329. package/docs/navigation-components.md +200 -0
  330. package/docs/overlay-components.md +193 -0
  331. package/docs/pipes.md +25 -0
  332. package/docs/providers.md +448 -0
  333. package/docs/setup-functions.md +66 -0
  334. package/docs/visual-components.md +89 -0
  335. package/package.json +37 -18
  336. package/scss/commons/_mixins.scss +34 -0
  337. package/scss/commons/_styles.scss +27 -68
  338. package/scss/commons/_variables.scss +7 -0
  339. package/scss/controls/_card.scss +29 -0
  340. package/scss/controls/_flex.scss +38 -0
  341. package/scss/controls/_form-box.scss +49 -0
  342. package/scss/controls/_form-table.scss +45 -0
  343. package/scss/controls/_grid.scss +36 -0
  344. package/scss/controls/_table.scss +99 -0
  345. package/scss/styles.scss +7 -0
  346. package/scss/themes/_variables-dark.scss +2 -0
  347. package/src/core/commons.ts +4 -0
  348. package/src/core/directives/sd-events.directive.ts +7 -7
  349. package/src/core/directives/sd-item-of-template.directive.ts +23 -0
  350. package/src/core/directives/sd-router-link.directive.ts +81 -0
  351. package/src/core/directives/sd-typed-template.directive.ts +16 -0
  352. package/src/core/pipes/format.pipe.ts +37 -0
  353. package/src/core/plugins/commands/findTopOpenModalEl.ts +23 -0
  354. package/src/core/plugins/commands/sd-insert-command-event.plugin.ts +4 -0
  355. package/src/core/plugins/commands/sd-refresh-command-event.plugin.ts +4 -0
  356. package/src/core/plugins/commands/sd-save-command-event.plugin.ts +4 -0
  357. package/src/core/plugins/events/sd-resize-event.plugin.ts +0 -22
  358. package/src/core/plugins/sd-global-error-handler.plugin.ts +22 -13
  359. package/src/core/provideSdAngular.ts +154 -0
  360. package/src/core/providers/sd-angular-config.provider.ts +6 -0
  361. package/src/core/providers/sd-app-structure.provider.ts +446 -0
  362. package/src/core/providers/sd-file-dialog.provider.ts +49 -0
  363. package/src/core/providers/sd-local-storage.provider.ts +21 -0
  364. package/src/core/providers/sd-navigate-window.provider.ts +44 -0
  365. package/src/core/providers/sd-print.provider.ts +189 -0
  366. package/src/core/providers/sd-service-client-factory.provider.ts +98 -0
  367. package/src/core/providers/sd-shared-data.provider.ts +179 -0
  368. package/src/core/providers/sd-system-config.provider.ts +28 -0
  369. package/src/core/providers/sd-system-log.provider.ts +19 -0
  370. package/src/core/providers/sd-theme-provider.ts +1 -1
  371. package/src/core/utils/TDirectiveInputSignals.ts +34 -0
  372. package/src/core/utils/setups/setupCanDeactivate.ts +34 -0
  373. package/src/core/utils/setups/setupModelHook.ts +26 -0
  374. package/src/core/utils/useCurrentPageCodeSignal.ts +16 -0
  375. package/src/core/utils/useExpandingManager.ts +117 -0
  376. package/src/core/utils/useFullPageCodeSignal.ts +24 -0
  377. package/src/core/utils/useSdSystemConfigResource.ts +36 -0
  378. package/src/core/utils/useSelectionManager.ts +104 -0
  379. package/src/core/utils/useSortingManager.ts +89 -0
  380. package/src/core/utils/useViewTitleSignal.ts +21 -0
  381. package/src/core/utils/useViewTypeSignal.ts +33 -0
  382. package/src/index.ts +209 -0
  383. package/src/scss.d.ts +1 -0
  384. package/src/ui/data/list/sd-list-item.control.ts +143 -0
  385. package/src/ui/data/list/sd-list.control.ts +41 -0
  386. package/src/ui/data/sheet/sd-sheet-column.directive.ts +26 -0
  387. package/src/ui/data/sheet/sd-sheet-config.modal.ts +252 -0
  388. package/src/ui/data/sheet/sd-sheet.control.ts +766 -0
  389. package/src/ui/data/sheet/types.ts +37 -0
  390. package/src/ui/data/sheet/useSheetCellAgent.ts +267 -0
  391. package/src/ui/data/sheet/useSheetColumnFixing.ts +37 -0
  392. package/src/ui/data/sheet/useSheetDomAccessor.ts +62 -0
  393. package/src/ui/data/sheet/useSheetLayoutEngine.ts +143 -0
  394. package/src/ui/form/button/sd-additional-button.control.ts +100 -0
  395. package/src/ui/form/button/sd-anchor.control.ts +67 -0
  396. package/src/ui/form/button/sd-button.control.ts +209 -0
  397. package/src/ui/form/button/sd-modal-select-button.control.ts +237 -0
  398. package/src/ui/form/checkbox/sd-checkbox-group-item.control.ts +51 -0
  399. package/src/ui/form/checkbox/sd-checkbox-group.control.ts +24 -0
  400. package/src/ui/form/checkbox/sd-checkbox.control.ts +305 -0
  401. package/src/ui/form/checkbox/sd-switch.control.ts +145 -0
  402. package/src/ui/form/choice/sd-state-preset.control.ts +173 -0
  403. package/src/ui/form/editor/sd-tiptap-editor.control.ts +474 -0
  404. package/src/ui/form/input/sd-date-range.picker.ts +98 -0
  405. package/src/ui/form/input/sd-numpad.control.ts +178 -0
  406. package/src/ui/form/input/sd-range.control.ts +59 -0
  407. package/src/ui/form/input/sd-textarea.control.ts +221 -0
  408. package/src/ui/form/input/sd-textfield-type-handlers.ts +445 -0
  409. package/src/ui/form/input/sd-textfield.control.ts +395 -0
  410. package/src/ui/form/sd-form.control.ts +52 -0
  411. package/src/ui/form/select/sd-select-button.control.ts +43 -0
  412. package/src/ui/form/select/sd-select-item.control.ts +143 -0
  413. package/src/ui/form/select/sd-select.control.ts +412 -0
  414. package/src/ui/layout/dock/sd-dock-container.control.ts +100 -0
  415. package/src/ui/layout/dock/sd-dock.control.ts +171 -0
  416. package/src/ui/layout/kanban/sd-kanban-board.control.ts +74 -0
  417. package/src/ui/layout/kanban/sd-kanban-lane.control.ts +210 -0
  418. package/src/ui/layout/kanban/sd-kanban.control.ts +227 -0
  419. package/src/ui/layout/sd-card.directive.ts +10 -0
  420. package/src/ui/layout/sd-gap.control.ts +63 -0
  421. package/src/ui/layout/sd-pane.directive.ts +11 -0
  422. package/src/ui/layout/view/sd-view-item.control.ts +45 -0
  423. package/src/ui/layout/view/sd-view.control.ts +31 -0
  424. package/src/ui/navigation/collapse/sd-collapse-icon.control.ts +51 -0
  425. package/src/ui/navigation/collapse/sd-collapse.control.ts +75 -0
  426. package/src/ui/navigation/menu-utils.ts +36 -0
  427. package/src/ui/navigation/pagination/sd-pagination.control.ts +125 -0
  428. package/src/ui/navigation/sidebar/sd-sidebar-container.control.ts +92 -0
  429. package/src/ui/navigation/sidebar/sd-sidebar-menu.control.ts +129 -0
  430. package/src/ui/navigation/sidebar/sd-sidebar-user.control.ts +84 -0
  431. package/src/ui/navigation/sidebar/sd-sidebar.control.ts +67 -0
  432. package/src/ui/navigation/tab/sd-tab-item.control.ts +55 -0
  433. package/src/ui/navigation/tab/sd-tab.control.ts +25 -0
  434. package/src/ui/navigation/tab/sd-tabview-item.control.ts +48 -0
  435. package/src/ui/navigation/tab/sd-tabview.control.ts +39 -0
  436. package/src/ui/navigation/topbar/sd-topbar-container.control.ts +22 -0
  437. package/src/ui/navigation/topbar/sd-topbar-menu.control.ts +165 -0
  438. package/src/ui/navigation/topbar/sd-topbar-user.control.ts +58 -0
  439. package/src/ui/navigation/topbar/sd-topbar.control.ts +94 -0
  440. package/src/ui/overlay/busy/sd-busy-container.control.ts +243 -0
  441. package/src/ui/overlay/busy/sd-busy.provider.ts +55 -0
  442. package/src/ui/overlay/dropdown/sd-dropdown-popup.control.ts +110 -0
  443. package/src/ui/overlay/dropdown/sd-dropdown.control.ts +310 -0
  444. package/src/ui/overlay/modal/sd-confirm-modal.control.ts +66 -0
  445. package/src/ui/overlay/modal/sd-modal.control.ts +362 -0
  446. package/src/ui/overlay/modal/sd-modal.provider.ts +216 -0
  447. package/src/ui/overlay/modal/sd-prompt-modal.control.ts +92 -0
  448. package/src/ui/overlay/toast/sd-toast-container.control.ts +58 -0
  449. package/src/ui/overlay/toast/sd-toast.control.ts +123 -0
  450. package/src/ui/overlay/toast/sd-toast.provider.ts +302 -0
  451. package/src/ui/visual/sd-barcode.control.ts +62 -0
  452. package/src/ui/visual/sd-calendar.control.ts +188 -0
  453. package/src/ui/visual/sd-echarts.control.ts +73 -0
  454. package/src/ui/visual/sd-label.control.ts +66 -0
  455. package/src/ui/visual/sd-note.control.ts +66 -0
  456. package/src/ui/visual/sd-progress.control.ts +88 -0
@@ -0,0 +1,411 @@
1
+ import { ChangeDetectionStrategy, Component, effect, ElementRef, inject, input, model, output, ViewEncapsulation, } from "@angular/core";
2
+ import { isTabbable } from "tabbable";
3
+ import { NgTemplateOutlet } from "@angular/common";
4
+ import { SdActivatedModalProvider } from "./sd-modal.provider";
5
+ import { SdSystemConfigProvider } from "../../../core/providers/sd-system-config.provider";
6
+ import "@simplysm/core-browser";
7
+ import * as i0 from "@angular/core";
8
+ const _c0 = ["*"];
9
+ function SdModalControl_Conditional_2_Conditional_3_ng_container_0_Template(rf, ctx) { if (rf & 1) {
10
+ i0.ɵɵelementContainer(0);
11
+ } }
12
+ function SdModalControl_Conditional_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
13
+ i0.ɵɵtemplate(0, SdModalControl_Conditional_2_Conditional_3_ng_container_0_Template, 1, 0, "ng-container", 7);
14
+ } if (rf & 2) {
15
+ const ctx_r1 = i0.ɵɵnextContext(2);
16
+ i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.actionTplRef());
17
+ } }
18
+ function SdModalControl_Conditional_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
19
+ const _r3 = i0.ɵɵgetCurrentView();
20
+ i0.ɵɵelementStart(0, "button", 8);
21
+ i0.ɵɵlistener("click", function SdModalControl_Conditional_2_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onCloseButtonClick()); });
22
+ i0.ɵɵtext(1, "\u00D7");
23
+ i0.ɵɵelementEnd();
24
+ } }
25
+ function SdModalControl_Conditional_2_Template(rf, ctx) { if (rf & 1) {
26
+ const _r1 = i0.ɵɵgetCurrentView();
27
+ i0.ɵɵelementStart(0, "div", 4);
28
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_2_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onHeaderMouseDown($event)); });
29
+ i0.ɵɵelementStart(1, "span", 5);
30
+ i0.ɵɵtext(2);
31
+ i0.ɵɵelementEnd();
32
+ i0.ɵɵconditionalCreate(3, SdModalControl_Conditional_2_Conditional_3_Template, 1, 1, "ng-container");
33
+ i0.ɵɵconditionalCreate(4, SdModalControl_Conditional_2_Conditional_4_Template, 2, 0, "button", 6);
34
+ i0.ɵɵelementEnd();
35
+ } if (rf & 2) {
36
+ const ctx_r1 = i0.ɵɵnextContext();
37
+ i0.ɵɵadvance(2);
38
+ i0.ɵɵtextInterpolate(ctx_r1.title());
39
+ i0.ɵɵadvance();
40
+ i0.ɵɵconditional(ctx_r1.actionTplRef() ? 3 : -1);
41
+ i0.ɵɵadvance();
42
+ i0.ɵɵconditional(!ctx_r1.hideCloseButton() ? 4 : -1);
43
+ } }
44
+ function SdModalControl_Conditional_5_Template(rf, ctx) { if (rf & 1) {
45
+ const _r4 = i0.ɵɵgetCurrentView();
46
+ i0.ɵɵelementStart(0, "div", 9);
47
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_5_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeMouseDown($event, "top")); });
48
+ i0.ɵɵelementEnd();
49
+ i0.ɵɵelementStart(1, "div", 10);
50
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_5_Template_div_mousedown_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeMouseDown($event, "bottom")); });
51
+ i0.ɵɵelementEnd();
52
+ i0.ɵɵelementStart(2, "div", 11);
53
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_5_Template_div_mousedown_2_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeMouseDown($event, "left")); });
54
+ i0.ɵɵelementEnd();
55
+ i0.ɵɵelementStart(3, "div", 12);
56
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_5_Template_div_mousedown_3_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeMouseDown($event, "right")); });
57
+ i0.ɵɵelementEnd();
58
+ i0.ɵɵelementStart(4, "div", 13);
59
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_5_Template_div_mousedown_4_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeMouseDown($event, "top-left")); });
60
+ i0.ɵɵelementEnd();
61
+ i0.ɵɵelementStart(5, "div", 14);
62
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_5_Template_div_mousedown_5_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeMouseDown($event, "top-right")); });
63
+ i0.ɵɵelementEnd();
64
+ i0.ɵɵelementStart(6, "div", 15);
65
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_5_Template_div_mousedown_6_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeMouseDown($event, "bottom-left")); });
66
+ i0.ɵɵelementEnd();
67
+ i0.ɵɵelementStart(7, "div", 16);
68
+ i0.ɵɵlistener("mousedown", function SdModalControl_Conditional_5_Template_div_mousedown_7_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResizeMouseDown($event, "bottom-right")); });
69
+ i0.ɵɵelementEnd();
70
+ } }
71
+ export class SdModalControl {
72
+ _elRef = inject((ElementRef));
73
+ _activatedModal = inject(SdActivatedModalProvider, { optional: true });
74
+ _systemConfig = inject(SdSystemConfigProvider, { optional: true });
75
+ open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
76
+ key = input(undefined, ...(ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []));
77
+ title = input("", ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
78
+ hideHeader = input(false, ...(ngDevMode ? [{ debugName: "hideHeader" }] : /* istanbul ignore next */ []));
79
+ hideCloseButton = input(false, ...(ngDevMode ? [{ debugName: "hideCloseButton" }] : /* istanbul ignore next */ []));
80
+ useCloseByBackdrop = input(true, ...(ngDevMode ? [{ debugName: "useCloseByBackdrop" }] : /* istanbul ignore next */ []));
81
+ useCloseByEscapeKey = input(true, ...(ngDevMode ? [{ debugName: "useCloseByEscapeKey" }] : /* istanbul ignore next */ []));
82
+ float = input(false, ...(ngDevMode ? [{ debugName: "float" }] : /* istanbul ignore next */ []));
83
+ fill = input(false, ...(ngDevMode ? [{ debugName: "fill" }] : /* istanbul ignore next */ []));
84
+ resizable = input(false, ...(ngDevMode ? [{ debugName: "resizable" }] : /* istanbul ignore next */ []));
85
+ movable = input(false, ...(ngDevMode ? [{ debugName: "movable" }] : /* istanbul ignore next */ []));
86
+ position = input(undefined, ...(ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []));
87
+ minHeightPx = input(undefined, ...(ngDevMode ? [{ debugName: "minHeightPx" }] : /* istanbul ignore next */ []));
88
+ minWidthPx = input(undefined, ...(ngDevMode ? [{ debugName: "minWidthPx" }] : /* istanbul ignore next */ []));
89
+ heightPx = input(undefined, ...(ngDevMode ? [{ debugName: "heightPx" }] : /* istanbul ignore next */ []));
90
+ widthPx = input(undefined, ...(ngDevMode ? [{ debugName: "widthPx" }] : /* istanbul ignore next */ []));
91
+ headerStyle = input(undefined, ...(ngDevMode ? [{ debugName: "headerStyle" }] : /* istanbul ignore next */ []));
92
+ noFirstControlFocusing = input(false, ...(ngDevMode ? [{ debugName: "noFirstControlFocusing" }] : /* istanbul ignore next */ []));
93
+ actionTplRef = input(undefined, ...(ngDevMode ? [{ debugName: "actionTplRef" }] : /* istanbul ignore next */ []));
94
+ closeRequest = output();
95
+ _dragState;
96
+ _resizeState;
97
+ _onDocumentMouseMove;
98
+ _onDocumentMouseUp;
99
+ constructor() {
100
+ // widthPx/heightPx를 dialog 스타일에 적용
101
+ effect(() => {
102
+ const dialogEl = this._getDialogEl();
103
+ if (dialogEl === null)
104
+ return;
105
+ const w = this.widthPx();
106
+ const h = this.heightPx();
107
+ if (w !== undefined) {
108
+ dialogEl.style.width = `${w}px`;
109
+ }
110
+ if (h !== undefined) {
111
+ dialogEl.style.height = `${h}px`;
112
+ }
113
+ });
114
+ // key 기반 설정 복원
115
+ effect(() => {
116
+ const k = this.key();
117
+ if (k === undefined || this._systemConfig == null)
118
+ return;
119
+ void this._restoreConfig(k);
120
+ });
121
+ // mousemove/mouseup을 document에 등록 (리사이즈 & 드래그 공용)
122
+ this._onDocumentMouseMove = (event) => {
123
+ if (this._resizeState !== undefined) {
124
+ this._applyResize(event);
125
+ }
126
+ if (this._dragState !== undefined) {
127
+ this._applyDrag(event);
128
+ }
129
+ };
130
+ this._onDocumentMouseUp = () => {
131
+ const hadState = this._resizeState !== undefined || this._dragState !== undefined;
132
+ this._resizeState = undefined;
133
+ this._dragState = undefined;
134
+ document.removeEventListener("mousemove", this._onDocumentMouseMove);
135
+ document.removeEventListener("mouseup", this._onDocumentMouseUp);
136
+ if (hadState) {
137
+ void this._saveConfig();
138
+ }
139
+ };
140
+ }
141
+ onResizeMouseDown(event, dir) {
142
+ event.preventDefault();
143
+ const dialogEl = this._getDialogEl();
144
+ if (dialogEl === null)
145
+ return;
146
+ this._resizeState = {
147
+ dir,
148
+ startX: event.clientX,
149
+ startY: event.clientY,
150
+ startWidth: dialogEl.offsetWidth,
151
+ startHeight: dialogEl.offsetHeight,
152
+ startLeft: dialogEl.offsetLeft,
153
+ startTop: dialogEl.offsetTop,
154
+ };
155
+ document.addEventListener("mousemove", this._onDocumentMouseMove);
156
+ document.addEventListener("mouseup", this._onDocumentMouseUp);
157
+ }
158
+ onHeaderMouseDown(event) {
159
+ if (!this.movable())
160
+ return;
161
+ if (event.target.closest("button") !== null)
162
+ return;
163
+ event.preventDefault();
164
+ const dialogEl = this._getDialogEl();
165
+ if (dialogEl === null)
166
+ return;
167
+ this._dragState = {
168
+ startX: event.clientX,
169
+ startY: event.clientY,
170
+ startLeft: dialogEl.offsetLeft,
171
+ startTop: dialogEl.offsetTop,
172
+ };
173
+ document.addEventListener("mousemove", this._onDocumentMouseMove);
174
+ document.addEventListener("mouseup", this._onDocumentMouseUp);
175
+ }
176
+ onBackdropClick() {
177
+ if (!this.useCloseByBackdrop())
178
+ return;
179
+ this._requestClose();
180
+ }
181
+ onCloseButtonClick() {
182
+ this._requestClose();
183
+ }
184
+ onDialogKeydown(event) {
185
+ if (event.key === "Escape") {
186
+ if (!this.useCloseByEscapeKey())
187
+ return;
188
+ this._requestClose();
189
+ }
190
+ else if (event.key === "Tab") {
191
+ this._handleTabTrap(event);
192
+ }
193
+ }
194
+ onDialogFocus() {
195
+ this._bringToFront();
196
+ }
197
+ _requestClose() {
198
+ if (this._activatedModal !== null && !this._activatedModal.canDeactivefn()) {
199
+ return;
200
+ }
201
+ void this._saveConfig();
202
+ this.closeRequest.emit();
203
+ }
204
+ _handleTabTrap(event) {
205
+ const hostEl = this._elRef.nativeElement;
206
+ const focusableElements = this._getTabbableElements(hostEl);
207
+ if (focusableElements.length === 0)
208
+ return;
209
+ const first = focusableElements[0];
210
+ const last = focusableElements[focusableElements.length - 1];
211
+ if (event.shiftKey) {
212
+ // Shift+Tab: 첫 요소에서 → 마지막 요소로
213
+ if (document.activeElement === first) {
214
+ event.preventDefault();
215
+ last.focus();
216
+ }
217
+ }
218
+ else {
219
+ // Tab: 마지막 요소에서 → 첫 요소로
220
+ if (document.activeElement === last) {
221
+ event.preventDefault();
222
+ first.focus();
223
+ }
224
+ }
225
+ }
226
+ _getTabbableElements(container) {
227
+ const result = [];
228
+ const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT);
229
+ let node = walker.nextNode();
230
+ while (node !== null) {
231
+ if (node instanceof HTMLElement && isTabbable(node)) {
232
+ result.push(node);
233
+ }
234
+ node = walker.nextNode();
235
+ }
236
+ return result;
237
+ }
238
+ _bringToFront() {
239
+ const hostEl = this._elRef.nativeElement;
240
+ const allModals = document.body.findAll("sd-modal");
241
+ let maxZ = 4000;
242
+ for (const m of allModals) {
243
+ if (m === hostEl)
244
+ continue;
245
+ const z = parseInt(m.style.zIndex || "0", 10);
246
+ if (z > maxZ) {
247
+ maxZ = z;
248
+ }
249
+ }
250
+ hostEl.style.zIndex = String(maxZ + 1);
251
+ }
252
+ _getDialogEl() {
253
+ return this._elRef.nativeElement.querySelector("._dialog");
254
+ }
255
+ _applyResize(event) {
256
+ const state = this._resizeState;
257
+ if (state === undefined)
258
+ return;
259
+ const dialogEl = this._getDialogEl();
260
+ if (dialogEl === null)
261
+ return;
262
+ const dx = event.clientX - state.startX;
263
+ const dy = event.clientY - state.startY;
264
+ const minW = this.minWidthPx() ?? 0;
265
+ const minH = this.minHeightPx() ?? 0;
266
+ let newWidth = state.startWidth;
267
+ let newHeight = state.startHeight;
268
+ let newLeft = state.startLeft;
269
+ let newTop = state.startTop;
270
+ if (state.dir.includes("right")) {
271
+ newWidth = Math.max(state.startWidth + dx, minW);
272
+ }
273
+ if (state.dir.includes("left")) {
274
+ const proposed = state.startWidth - dx;
275
+ if (proposed >= minW) {
276
+ newWidth = proposed;
277
+ newLeft = state.startLeft + dx;
278
+ }
279
+ }
280
+ if (state.dir.includes("bottom")) {
281
+ newHeight = Math.max(state.startHeight + dy, minH);
282
+ }
283
+ if (state.dir.includes("top")) {
284
+ const proposed = state.startHeight - dy;
285
+ if (proposed >= minH) {
286
+ newHeight = proposed;
287
+ newTop = state.startTop + dy;
288
+ }
289
+ }
290
+ dialogEl.style.width = `${newWidth}px`;
291
+ dialogEl.style.height = `${newHeight}px`;
292
+ dialogEl.style.left = `${newLeft}px`;
293
+ dialogEl.style.top = `${newTop}px`;
294
+ }
295
+ _applyDrag(event) {
296
+ const state = this._dragState;
297
+ if (state === undefined)
298
+ return;
299
+ const dialogEl = this._getDialogEl();
300
+ if (dialogEl === null)
301
+ return;
302
+ const dx = event.clientX - state.startX;
303
+ const dy = event.clientY - state.startY;
304
+ dialogEl.style.left = `${state.startLeft + dx}px`;
305
+ dialogEl.style.top = `${state.startTop + dy}px`;
306
+ }
307
+ async _saveConfig() {
308
+ const k = this.key();
309
+ if (k === undefined || this._systemConfig == null)
310
+ return;
311
+ const dialogEl = this._getDialogEl();
312
+ if (dialogEl === null)
313
+ return;
314
+ const config = {};
315
+ if (dialogEl.style.width !== "")
316
+ config["width"] = dialogEl.style.width;
317
+ if (dialogEl.style.height !== "")
318
+ config["height"] = dialogEl.style.height;
319
+ if (dialogEl.style.left !== "")
320
+ config["left"] = dialogEl.style.left;
321
+ if (dialogEl.style.top !== "")
322
+ config["top"] = dialogEl.style.top;
323
+ await this._systemConfig.setAsync(`sd-modal.${k}`, config);
324
+ }
325
+ async _restoreConfig(k) {
326
+ if (this._systemConfig == null)
327
+ return;
328
+ const config = (await this._systemConfig.getAsync(`sd-modal.${k}`));
329
+ if (config == null)
330
+ return;
331
+ const dialogEl = this._getDialogEl();
332
+ if (dialogEl === null)
333
+ return;
334
+ if (config["width"] !== undefined)
335
+ dialogEl.style.width = config["width"];
336
+ if (config["height"] !== undefined)
337
+ dialogEl.style.height = config["height"];
338
+ if (config["left"] !== undefined)
339
+ dialogEl.style.left = config["left"];
340
+ if (config["top"] !== undefined)
341
+ dialogEl.style.top = config["top"];
342
+ }
343
+ static ɵfac = function SdModalControl_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdModalControl)(); };
344
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SdModalControl, selectors: [["sd-modal"]], hostVars: 4, hostBindings: function SdModalControl_HostBindings(rf, ctx) { if (rf & 2) {
345
+ i0.ɵɵattribute("data-sd-open", ctx.open() || undefined)("data-sd-float", ctx.float() || undefined)("data-sd-fill", ctx.fill() || undefined)("data-sd-position", ctx.position() || undefined);
346
+ } }, inputs: { open: [1, "open"], key: [1, "key"], title: [1, "title"], hideHeader: [1, "hideHeader"], hideCloseButton: [1, "hideCloseButton"], useCloseByBackdrop: [1, "useCloseByBackdrop"], useCloseByEscapeKey: [1, "useCloseByEscapeKey"], float: [1, "float"], fill: [1, "fill"], resizable: [1, "resizable"], movable: [1, "movable"], position: [1, "position"], minHeightPx: [1, "minHeightPx"], minWidthPx: [1, "minWidthPx"], heightPx: [1, "heightPx"], widthPx: [1, "widthPx"], headerStyle: [1, "headerStyle"], noFirstControlFocusing: [1, "noFirstControlFocusing"], actionTplRef: [1, "actionTplRef"] }, outputs: { open: "openChange", closeRequest: "closeRequest" }, ngContentSelectors: _c0, decls: 6, vars: 2, consts: [[1, "_backdrop", 3, "mousedown"], ["tabindex", "-1", 1, "_dialog", 3, "keydown", "focus"], [1, "_header"], [1, "_content"], [1, "_header", 3, "mousedown"], [1, "_title"], [1, "_close-btn"], [4, "ngTemplateOutlet"], [1, "_close-btn", 3, "click"], ["data-resize-dir", "top", 1, "_resize-handle", "_resize-top", 3, "mousedown"], ["data-resize-dir", "bottom", 1, "_resize-handle", "_resize-bottom", 3, "mousedown"], ["data-resize-dir", "left", 1, "_resize-handle", "_resize-left", 3, "mousedown"], ["data-resize-dir", "right", 1, "_resize-handle", "_resize-right", 3, "mousedown"], ["data-resize-dir", "top-left", 1, "_resize-handle", "_resize-top-left", 3, "mousedown"], ["data-resize-dir", "top-right", 1, "_resize-handle", "_resize-top-right", 3, "mousedown"], ["data-resize-dir", "bottom-left", 1, "_resize-handle", "_resize-bottom-left", 3, "mousedown"], ["data-resize-dir", "bottom-right", 1, "_resize-handle", "_resize-bottom-right", 3, "mousedown"]], template: function SdModalControl_Template(rf, ctx) { if (rf & 1) {
347
+ i0.ɵɵprojectionDef();
348
+ i0.ɵɵelementStart(0, "div", 0);
349
+ i0.ɵɵlistener("mousedown", function SdModalControl_Template_div_mousedown_0_listener() { return ctx.onBackdropClick(); });
350
+ i0.ɵɵelementEnd();
351
+ i0.ɵɵelementStart(1, "div", 1);
352
+ i0.ɵɵlistener("keydown", function SdModalControl_Template_div_keydown_1_listener($event) { return ctx.onDialogKeydown($event); })("focus", function SdModalControl_Template_div_focus_1_listener() { return ctx.onDialogFocus(); });
353
+ i0.ɵɵconditionalCreate(2, SdModalControl_Conditional_2_Template, 5, 3, "div", 2);
354
+ i0.ɵɵelementStart(3, "div", 3);
355
+ i0.ɵɵprojection(4);
356
+ i0.ɵɵelementEnd();
357
+ i0.ɵɵconditionalCreate(5, SdModalControl_Conditional_5_Template, 8, 0);
358
+ i0.ɵɵelementEnd();
359
+ } if (rf & 2) {
360
+ i0.ɵɵadvance(2);
361
+ i0.ɵɵconditional(!ctx.hideHeader() ? 2 : -1);
362
+ i0.ɵɵadvance(3);
363
+ i0.ɵɵconditional(ctx.resizable() ? 5 : -1);
364
+ } }, dependencies: [NgTemplateOutlet], encapsulation: 2, changeDetection: 0 });
365
+ }
366
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdModalControl, [{
367
+ type: Component,
368
+ args: [{
369
+ selector: "sd-modal",
370
+ changeDetection: ChangeDetectionStrategy.OnPush,
371
+ encapsulation: ViewEncapsulation.None,
372
+ standalone: true,
373
+ imports: [NgTemplateOutlet],
374
+ host: {
375
+ "[attr.data-sd-open]": "open() || undefined",
376
+ "[attr.data-sd-float]": "float() || undefined",
377
+ "[attr.data-sd-fill]": "fill() || undefined",
378
+ "[attr.data-sd-position]": "position() || undefined",
379
+ },
380
+ template: `
381
+ <div class="_backdrop" (mousedown)="onBackdropClick()"></div>
382
+ <div class="_dialog" tabindex="-1"
383
+ (keydown)="onDialogKeydown($event)"
384
+ (focus)="onDialogFocus()">
385
+ @if (!hideHeader()) {
386
+ <div class="_header" (mousedown)="onHeaderMouseDown($event)">
387
+ <span class="_title">{{ title() }}</span>
388
+ @if (actionTplRef()) {
389
+ <ng-container *ngTemplateOutlet="actionTplRef()!" />
390
+ }
391
+ @if (!hideCloseButton()) {
392
+ <button class="_close-btn" (click)="onCloseButtonClick()">×</button>
393
+ }
394
+ </div>
395
+ }
396
+ <div class="_content"><ng-content /></div>
397
+ @if (resizable()) {
398
+ <div class="_resize-handle _resize-top" data-resize-dir="top" (mousedown)="onResizeMouseDown($event, 'top')"></div>
399
+ <div class="_resize-handle _resize-bottom" data-resize-dir="bottom" (mousedown)="onResizeMouseDown($event, 'bottom')"></div>
400
+ <div class="_resize-handle _resize-left" data-resize-dir="left" (mousedown)="onResizeMouseDown($event, 'left')"></div>
401
+ <div class="_resize-handle _resize-right" data-resize-dir="right" (mousedown)="onResizeMouseDown($event, 'right')"></div>
402
+ <div class="_resize-handle _resize-top-left" data-resize-dir="top-left" (mousedown)="onResizeMouseDown($event, 'top-left')"></div>
403
+ <div class="_resize-handle _resize-top-right" data-resize-dir="top-right" (mousedown)="onResizeMouseDown($event, 'top-right')"></div>
404
+ <div class="_resize-handle _resize-bottom-left" data-resize-dir="bottom-left" (mousedown)="onResizeMouseDown($event, 'bottom-left')"></div>
405
+ <div class="_resize-handle _resize-bottom-right" data-resize-dir="bottom-right" (mousedown)="onResizeMouseDown($event, 'bottom-right')"></div>
406
+ }
407
+ </div>
408
+ `,
409
+ }]
410
+ }], () => [], { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], hideHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideHeader", required: false }] }], hideCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideCloseButton", required: false }] }], useCloseByBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "useCloseByBackdrop", required: false }] }], useCloseByEscapeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "useCloseByEscapeKey", required: false }] }], float: [{ type: i0.Input, args: [{ isSignal: true, alias: "float", required: false }] }], fill: [{ type: i0.Input, args: [{ isSignal: true, alias: "fill", required: false }] }], resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizable", required: false }] }], movable: [{ type: i0.Input, args: [{ isSignal: true, alias: "movable", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], minHeightPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "minHeightPx", required: false }] }], minWidthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "minWidthPx", required: false }] }], heightPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "heightPx", required: false }] }], widthPx: [{ type: i0.Input, args: [{ isSignal: true, alias: "widthPx", required: false }] }], headerStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerStyle", required: false }] }], noFirstControlFocusing: [{ type: i0.Input, args: [{ isSignal: true, alias: "noFirstControlFocusing", required: false }] }], actionTplRef: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionTplRef", required: false }] }], closeRequest: [{ type: i0.Output, args: ["closeRequest"] }] }); })();
411
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SdModalControl, { className: "SdModalControl", filePath: "packages/angular/src/ui/overlay/modal/sd-modal.control.ts", lineNumber: 61 }); })();
@@ -0,0 +1,65 @@
1
+ import { type OutputEmitterRef, type Signal, type TemplateRef, type Type } from "@angular/core";
2
+ import type { TDirectiveInputSignals } from "../../../core/utils/TDirectiveInputSignals";
3
+ import "@simplysm/core-browser";
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * 모달 컴포넌트가 구현해야 하는 인터페이스
7
+ */
8
+ export interface ISdModal<O> {
9
+ initialized: Signal<boolean>;
10
+ close: OutputEmitterRef<O | undefined>;
11
+ actionTplRef?: TemplateRef<any>;
12
+ }
13
+ /**
14
+ * 모달 생성 시 전달하는 정보
15
+ */
16
+ export interface ISdModalInfo<T extends ISdModal<any>> {
17
+ title: string;
18
+ type: Type<T>;
19
+ inputs: Omit<TDirectiveInputSignals<T>, "initialized" | "close" | "actionTplRef">;
20
+ }
21
+ /**
22
+ * 모달 옵션
23
+ */
24
+ export interface ISdModalOptions {
25
+ key?: string;
26
+ hideHeader?: boolean;
27
+ hideCloseButton?: boolean;
28
+ useCloseByBackdrop?: boolean;
29
+ useCloseByEscapeKey?: boolean;
30
+ float?: boolean;
31
+ fill?: boolean;
32
+ resizable?: boolean;
33
+ movable?: boolean;
34
+ position?: "bottom-right" | "top-right";
35
+ minHeightPx?: number;
36
+ minWidthPx?: number;
37
+ heightPx?: number;
38
+ widthPx?: number;
39
+ headerStyle?: string;
40
+ noFirstControlFocusing?: boolean;
41
+ }
42
+ /**
43
+ * 모달 내부에서 inject하여 사용하는 프로바이더
44
+ */
45
+ export declare class SdActivatedModalProvider<T extends ISdModal<any> = ISdModal<any>> {
46
+ modalComponent: import("@angular/core").WritableSignal<any>;
47
+ contentComponent: import("@angular/core").WritableSignal<T | undefined>;
48
+ canDeactivefn: () => boolean;
49
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdActivatedModalProvider<any>, never>;
50
+ static ɵprov: i0.ɵɵInjectableDeclaration<SdActivatedModalProvider<any>>;
51
+ }
52
+ /**
53
+ * 모달을 프로그래밍 방식으로 생성하는 프로바이더
54
+ */
55
+ export declare class SdModalProvider {
56
+ private readonly _appRef;
57
+ private readonly _envInjector;
58
+ private readonly _injector;
59
+ modalCount: import("@angular/core").WritableSignal<number>;
60
+ showAsync<T extends ISdModal<any>>(modal: ISdModalInfo<T>, options?: ISdModalOptions): Promise<Parameters<T["close"]["emit"]>[0] | undefined>;
61
+ private _assignZIndex;
62
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdModalProvider, never>;
63
+ static ɵprov: i0.ɵɵInjectableDeclaration<SdModalProvider>;
64
+ }
65
+ //# sourceMappingURL=sd-modal.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-modal.provider.d.ts","sourceRoot":"","sources":["..\\..\\..\\..\\src\\ui\\overlay\\modal\\sd-modal.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,IAAI,EACV,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAEzF,OAAO,wBAAwB,CAAC;;AAEhC;;GAEG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,KAAK,EAAE,gBAAgB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,GAAG,cAAc,CAAC,CAAC;CACnF;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,GAAG,WAAW,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,qBACa,wBAAwB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;IAC3E,cAAc,8CAA0B;IACxC,gBAAgB,wDAAoC;IACpD,aAAa,EAAE,MAAM,OAAO,CAAc;yCAH/B,wBAAwB;6CAAxB,wBAAwB;CAIpC;AAED;;GAEG;AACH,qBACa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAE9C,UAAU,iDAAa;IAEjB,SAAS,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,EACrC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAwHzD,OAAO,CAAC,aAAa;yCAlIV,eAAe;6CAAf,eAAe;CA6I3B"}
@@ -0,0 +1,146 @@
1
+ import { ApplicationRef, createComponent, EnvironmentInjector, inject, Injectable, Injector, signal, } from "@angular/core";
2
+ import { outputToObservable } from "@angular/core/rxjs-interop";
3
+ import { Subscription } from "rxjs";
4
+ import { SdModalControl } from "./sd-modal.control";
5
+ import "@simplysm/core-browser";
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * 모달 내부에서 inject하여 사용하는 프로바이더
9
+ */
10
+ export class SdActivatedModalProvider {
11
+ modalComponent = signal(undefined, ...(ngDevMode ? [{ debugName: "modalComponent" }] : /* istanbul ignore next */ []));
12
+ contentComponent = signal(undefined, ...(ngDevMode ? [{ debugName: "contentComponent" }] : /* istanbul ignore next */ []));
13
+ canDeactivefn = () => true;
14
+ static ɵfac = function SdActivatedModalProvider_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdActivatedModalProvider)(); };
15
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SdActivatedModalProvider, factory: SdActivatedModalProvider.ɵfac });
16
+ }
17
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdActivatedModalProvider, [{
18
+ type: Injectable
19
+ }], null, null); })();
20
+ /**
21
+ * 모달을 프로그래밍 방식으로 생성하는 프로바이더
22
+ */
23
+ export class SdModalProvider {
24
+ _appRef = inject(ApplicationRef);
25
+ _envInjector = inject(EnvironmentInjector);
26
+ _injector = inject(Injector);
27
+ modalCount = signal(0, ...(ngDevMode ? [{ debugName: "modalCount" }] : /* istanbul ignore next */ []));
28
+ async showAsync(modal, options) {
29
+ return new Promise((resolve) => {
30
+ // 1. modalCount 증가
31
+ this.modalCount.update((v) => v + 1);
32
+ // 2. SdActivatedModalProvider 인스턴스 생성
33
+ const activatedModal = new SdActivatedModalProvider();
34
+ // 3. 컨텐츠 컴포넌트 생성 (elementInjector에 SdActivatedModalProvider 주입)
35
+ const contentInjector = Injector.create({
36
+ providers: [{ provide: SdActivatedModalProvider, useValue: activatedModal }],
37
+ parent: this._injector,
38
+ });
39
+ const contentRef = createComponent(modal.type, {
40
+ environmentInjector: this._envInjector,
41
+ elementInjector: contentInjector,
42
+ });
43
+ // 4. setInput으로 inputs 바인딩
44
+ for (const [key, value] of Object.entries(modal.inputs)) {
45
+ contentRef.setInput(key, value);
46
+ }
47
+ // 5. SdModalControl 생성 (projectableNodes로 컨텐츠 삽입)
48
+ const modalRef = createComponent(SdModalControl, {
49
+ environmentInjector: this._envInjector,
50
+ elementInjector: contentInjector,
51
+ projectableNodes: [[contentRef.location.nativeElement]],
52
+ });
53
+ // 6. 옵션 바인딩
54
+ modalRef.setInput("title", modal.title);
55
+ if (options !== undefined) {
56
+ for (const [key, value] of Object.entries(options)) {
57
+ if (value !== undefined) {
58
+ modalRef.setInput(key, value);
59
+ }
60
+ }
61
+ }
62
+ // 7. SdActivatedModalProvider에 컴포넌트 참조 설정
63
+ activatedModal.modalComponent.set(modalRef.instance);
64
+ activatedModal.contentComponent.set(contentRef.instance);
65
+ // 8. appRef에 뷰 등록 + body에 삽입
66
+ this._appRef.attachView(contentRef.hostView);
67
+ this._appRef.attachView(modalRef.hostView);
68
+ document.body.appendChild(modalRef.location.nativeElement);
69
+ // 9. open 설정 + z-index
70
+ modalRef.instance.open.set(true);
71
+ this._assignZIndex(modalRef.location.nativeElement);
72
+ // 10. 포커스 저장 및 설정
73
+ const prevActiveEl = document.activeElement;
74
+ // 지연된 포커스 설정 (DOM 삽입 후 렌더링 완료 대기)
75
+ queueMicrotask(() => {
76
+ const modalEl = modalRef.location.nativeElement;
77
+ const dialogEl = modalEl.querySelector("._dialog");
78
+ if (dialogEl == null)
79
+ return;
80
+ if (options?.noFirstControlFocusing === true) {
81
+ dialogEl.focus();
82
+ }
83
+ else {
84
+ // 컨텐츠 영역에서 첫 포커스 가능 요소 검색
85
+ const contentEl = modalEl.querySelector("._content");
86
+ const firstFocusable = contentEl?.findFirstFocusableChild();
87
+ if (firstFocusable !== undefined) {
88
+ firstFocusable.focus();
89
+ }
90
+ else {
91
+ dialogEl.focus();
92
+ }
93
+ }
94
+ });
95
+ // cleanup 함수
96
+ let closeSub;
97
+ let closeRequestSub;
98
+ const cleanup = (result) => {
99
+ closeSub?.unsubscribe();
100
+ closeRequestSub?.unsubscribe();
101
+ // DOM에서 제거
102
+ const modalEl = modalRef.location.nativeElement;
103
+ if (modalEl.parentNode !== null) {
104
+ modalEl.parentNode.removeChild(modalEl);
105
+ }
106
+ // 뷰 분리 + 파괴
107
+ this._appRef.detachView(modalRef.hostView);
108
+ this._appRef.detachView(contentRef.hostView);
109
+ modalRef.destroy();
110
+ contentRef.destroy();
111
+ // modalCount 감소
112
+ this.modalCount.update((v) => v - 1);
113
+ // 포커스 복귀
114
+ if (prevActiveEl !== null && prevActiveEl.isConnected) {
115
+ prevActiveEl.focus();
116
+ }
117
+ resolve(result);
118
+ };
119
+ // 10. close output 구독 (컨텐츠 컴포넌트가 직접 close.emit 호출)
120
+ closeSub = outputToObservable(contentRef.instance.close).subscribe((result) => {
121
+ cleanup(result);
122
+ });
123
+ // 12. SdModalControl의 closeRequest 구독 (배경 클릭, ESC, 닫기 버튼)
124
+ closeRequestSub = outputToObservable(modalRef.instance.closeRequest).subscribe(() => {
125
+ cleanup(undefined);
126
+ });
127
+ });
128
+ }
129
+ _assignZIndex(el) {
130
+ const allModals = document.body.findAll("sd-modal");
131
+ let maxZ = 4000;
132
+ for (const m of allModals) {
133
+ const z = parseInt(m.style.zIndex || "0", 10);
134
+ if (z > maxZ) {
135
+ maxZ = z;
136
+ }
137
+ }
138
+ el.style.zIndex = String(maxZ + 1);
139
+ }
140
+ static ɵfac = function SdModalProvider_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdModalProvider)(); };
141
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SdModalProvider, factory: SdModalProvider.ɵfac, providedIn: "root" });
142
+ }
143
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdModalProvider, [{
144
+ type: Injectable,
145
+ args: [{ providedIn: "root" }]
146
+ }], null, null); })();
@@ -0,0 +1,19 @@
1
+ import type { ISdModal } from "./sd-modal.provider";
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * 범용 프롬프트 모달.
5
+ * ISdModal<string> 구현. message를 표시하고, 텍스트 입력 후 확인/취소.
6
+ * 확인 시 입력값 emit, 취소 시 undefined emit.
7
+ */
8
+ export declare class SdPromptModalControl implements ISdModal<string> {
9
+ initialized: import("@angular/core").WritableSignal<boolean>;
10
+ close: import("@angular/core").OutputEmitterRef<string | undefined>;
11
+ message: import("@angular/core").InputSignal<string>;
12
+ _inputValue: import("@angular/core").WritableSignal<string>;
13
+ onInputChange(event: Event): void;
14
+ onConfirm(): void;
15
+ onCancel(): void;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<SdPromptModalControl, never>;
17
+ static ɵcmp: i0.ɵɵComponentDeclaration<SdPromptModalControl, "sd-prompt-modal", never, { "message": { "alias": "message"; "required": true; "isSignal": true; }; }, { "close": "close"; }, never, never, true, never>;
18
+ }
19
+ //# sourceMappingURL=sd-prompt-modal.control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-prompt-modal.control.d.ts","sourceRoot":"","sources":["..\\..\\..\\..\\src\\ui\\overlay\\modal\\sd-prompt-modal.control.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;;AAGpD;;;;GAIG;AACH,qBAoDa,oBAAqB,YAAW,QAAQ,CAAC,MAAM,CAAC;IAC3D,WAAW,kDAAgB;IAC3B,KAAK,+DAAgC;IAErC,OAAO,8CAA4B;IAEnC,WAAW,iDAAc;IAEzB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKjC,SAAS,IAAI,IAAI;IAOjB,QAAQ,IAAI,IAAI;yCApBL,oBAAoB;2CAApB,oBAAoB;CAuBhC"}