@simplysm/angular 14.0.10 → 14.0.12

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 (170) hide show
  1. package/README.md +8 -5
  2. package/dist/core/directives/sd-router-link.directive.js +2 -2
  3. package/dist/core/pipes/format.pipe.d.ts.map +1 -1
  4. package/dist/core/pipes/format.pipe.js +2 -0
  5. package/dist/core/plugins/commands/findTopOpenModalEl.d.ts +1 -1
  6. package/dist/core/plugins/commands/findTopOpenModalEl.d.ts.map +1 -1
  7. package/dist/core/plugins/commands/findTopOpenModalEl.js +2 -2
  8. package/dist/core/plugins/commands/sd-insert-command-event.plugin.d.ts +1 -0
  9. package/dist/core/plugins/commands/sd-insert-command-event.plugin.d.ts.map +1 -1
  10. package/dist/core/plugins/commands/sd-insert-command-event.plugin.js +4 -3
  11. package/dist/core/plugins/commands/sd-refresh-command-event.plugin.d.ts +1 -0
  12. package/dist/core/plugins/commands/sd-refresh-command-event.plugin.d.ts.map +1 -1
  13. package/dist/core/plugins/commands/sd-refresh-command-event.plugin.js +4 -3
  14. package/dist/core/plugins/commands/sd-save-command-event.plugin.d.ts +1 -0
  15. package/dist/core/plugins/commands/sd-save-command-event.plugin.d.ts.map +1 -1
  16. package/dist/core/plugins/commands/sd-save-command-event.plugin.js +4 -3
  17. package/dist/core/plugins/events/sd-intersection-event.plugin.d.ts.map +1 -1
  18. package/dist/core/plugins/events/sd-intersection-event.plugin.js +2 -3
  19. package/dist/core/plugins/events/sd-option-event.plugin.d.ts +1 -0
  20. package/dist/core/plugins/events/sd-option-event.plugin.d.ts.map +1 -1
  21. package/dist/core/plugins/events/sd-option-event.plugin.js +2 -1
  22. package/dist/core/plugins/sd-global-error-handler.plugin.d.ts.map +1 -1
  23. package/dist/core/plugins/sd-global-error-handler.plugin.js +3 -1
  24. package/dist/core/provideSdAngular.d.ts.map +1 -1
  25. package/dist/core/provideSdAngular.js +14 -4
  26. package/dist/core/providers/sd-app-structure.provider.d.ts.map +1 -1
  27. package/dist/core/providers/sd-app-structure.provider.js +8 -7
  28. package/dist/core/providers/sd-file-dialog.provider.d.ts.map +1 -1
  29. package/dist/core/providers/sd-file-dialog.provider.js +15 -7
  30. package/dist/core/providers/sd-local-storage.provider.d.ts.map +1 -1
  31. package/dist/core/providers/sd-local-storage.provider.js +6 -1
  32. package/dist/core/providers/sd-navigate-window.provider.js +4 -1
  33. package/dist/core/providers/sd-print.provider.js +2 -2
  34. package/dist/core/providers/sd-shared-data.provider.d.ts.map +1 -1
  35. package/dist/core/providers/sd-shared-data.provider.js +14 -3
  36. package/dist/core/utils/injectParent.js +9 -5
  37. package/dist/core/utils/setups/setupModelHook.d.ts.map +1 -1
  38. package/dist/core/utils/setups/setupModelHook.js +4 -1
  39. package/dist/core/utils/setups/setupRevealOnShow.d.ts.map +1 -1
  40. package/dist/core/utils/setups/setupRevealOnShow.js +3 -2
  41. package/dist/core/utils/useExpandingManager.d.ts.map +1 -1
  42. package/dist/core/utils/useExpandingManager.js +3 -2
  43. package/dist/core/utils/useSdSystemConfigResource.d.ts +1 -1
  44. package/dist/core/utils/useSdSystemConfigResource.d.ts.map +1 -1
  45. package/dist/core/utils/useSdSystemConfigResource.js +13 -12
  46. package/dist/core/utils/withBusy.d.ts +3 -0
  47. package/dist/core/utils/withBusy.d.ts.map +1 -0
  48. package/dist/core/utils/withBusy.js +9 -0
  49. package/dist/features/address/sd-address-search.modal.d.ts.map +1 -1
  50. package/dist/features/address/sd-address-search.modal.js +5 -2
  51. package/dist/features/data-view/sd-data-detail.control.d.ts +7 -4
  52. package/dist/features/data-view/sd-data-detail.control.d.ts.map +1 -1
  53. package/dist/features/data-view/sd-data-detail.control.js +75 -68
  54. package/dist/features/data-view/sd-data-sheet.control.d.ts +2 -0
  55. package/dist/features/data-view/sd-data-sheet.control.d.ts.map +1 -1
  56. package/dist/features/data-view/sd-data-sheet.control.js +134 -110
  57. package/dist/features/permission-table/sd-permission-table.control.d.ts +32 -0
  58. package/dist/features/permission-table/sd-permission-table.control.d.ts.map +1 -0
  59. package/dist/features/permission-table/sd-permission-table.control.js +467 -0
  60. package/dist/features/shared-data/matchesSearchText.d.ts +2 -0
  61. package/dist/features/shared-data/matchesSearchText.d.ts.map +1 -0
  62. package/dist/features/shared-data/matchesSearchText.js +11 -0
  63. package/dist/features/shared-data/sd-shared-data-select-button.control.d.ts +2 -2
  64. package/dist/features/shared-data/sd-shared-data-select-button.control.d.ts.map +1 -1
  65. package/dist/features/shared-data/sd-shared-data-select-list.control.d.ts +1 -0
  66. package/dist/features/shared-data/sd-shared-data-select-list.control.d.ts.map +1 -1
  67. package/dist/features/shared-data/sd-shared-data-select-list.control.js +16 -11
  68. package/dist/features/shared-data/sd-shared-data-select.control.d.ts +2 -1
  69. package/dist/features/shared-data/sd-shared-data-select.control.d.ts.map +1 -1
  70. package/dist/features/shared-data/sd-shared-data-select.control.js +45 -30
  71. package/dist/index.d.ts +5 -3
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +5 -2
  74. package/dist/ui/data/sheet/sd-sheet.control.d.ts +5 -2
  75. package/dist/ui/data/sheet/sd-sheet.control.d.ts.map +1 -1
  76. package/dist/ui/data/sheet/sd-sheet.control.js +48 -47
  77. package/dist/ui/data/sheet/types.d.ts +5 -1
  78. package/dist/ui/data/sheet/types.d.ts.map +1 -1
  79. package/dist/ui/data/sheet/useSheetCellAgent.d.ts.map +1 -1
  80. package/dist/ui/data/sheet/useSheetCellAgent.js +8 -4
  81. package/dist/ui/data/sheet/useSheetColumnFixing.d.ts +6 -0
  82. package/dist/ui/data/sheet/useSheetColumnFixing.d.ts.map +1 -1
  83. package/dist/ui/data/sheet/useSheetColumnFixing.js +6 -0
  84. package/dist/ui/form/editor/sd-tiptap-editor.control.d.ts +2 -2
  85. package/dist/ui/form/editor/sd-tiptap-editor.control.d.ts.map +1 -1
  86. package/dist/ui/form/editor/sd-tiptap-editor.control.js +15 -13
  87. package/dist/ui/form/input/sd-date-range.picker.d.ts.map +1 -1
  88. package/dist/ui/form/input/sd-date-range.picker.js +8 -1
  89. package/dist/ui/form/select/sd-select.control.d.ts.map +1 -1
  90. package/dist/ui/form/select/sd-select.control.js +20 -16
  91. package/dist/ui/layout/dock/sd-dock.control.js +4 -4
  92. package/dist/ui/navigation/pagination/sd-pagination.control.js +1 -1
  93. package/dist/ui/navigation/sidebar/sd-sidebar-menu.control.d.ts +7 -13
  94. package/dist/ui/navigation/sidebar/sd-sidebar-menu.control.d.ts.map +1 -1
  95. package/dist/ui/navigation/sidebar/sd-sidebar-menu.control.js +1 -1
  96. package/dist/ui/navigation/topbar/sd-topbar-menu.control.d.ts +7 -13
  97. package/dist/ui/navigation/topbar/sd-topbar-menu.control.d.ts.map +1 -1
  98. package/dist/ui/navigation/topbar/sd-topbar-menu.control.js +1 -1
  99. package/dist/ui/overlay/dropdown/sd-dropdown-popup.control.d.ts +0 -3
  100. package/dist/ui/overlay/dropdown/sd-dropdown-popup.control.d.ts.map +1 -1
  101. package/dist/ui/overlay/dropdown/sd-dropdown-popup.control.js +8 -21
  102. package/dist/ui/overlay/dropdown/sd-dropdown.control.d.ts +1 -1
  103. package/dist/ui/overlay/dropdown/sd-dropdown.control.d.ts.map +1 -1
  104. package/dist/ui/overlay/dropdown/sd-dropdown.control.js +19 -20
  105. package/dist/ui/overlay/modal/sd-modal.control.d.ts.map +1 -1
  106. package/dist/ui/overlay/modal/sd-modal.control.js +21 -5
  107. package/dist/ui/overlay/modal/sd-modal.provider.d.ts.map +1 -1
  108. package/dist/ui/overlay/modal/sd-modal.provider.js +12 -0
  109. package/dist/ui/overlay/toast/sd-toast.provider.d.ts +1 -0
  110. package/dist/ui/overlay/toast/sd-toast.provider.d.ts.map +1 -1
  111. package/dist/ui/overlay/toast/sd-toast.provider.js +16 -2
  112. package/dist/ui/visual/sd-barcode.control.d.ts +2 -2
  113. package/dist/ui/visual/sd-barcode.control.d.ts.map +1 -1
  114. package/dist/ui/visual/sd-barcode.control.js +25 -18
  115. package/dist/ui/visual/sd-progress.control.d.ts.map +1 -1
  116. package/dist/ui/visual/sd-progress.control.js +1 -1
  117. package/docs/core.md +19 -0
  118. package/docs/features.md +25 -0
  119. package/docs/ui-data.md +20 -4
  120. package/docs/ui-navigation.md +8 -44
  121. package/package.json +25 -25
  122. package/src/core/directives/sd-router-link.directive.ts +1 -1
  123. package/src/core/pipes/format.pipe.ts +1 -0
  124. package/src/core/plugins/commands/findTopOpenModalEl.ts +2 -2
  125. package/src/core/plugins/commands/sd-insert-command-event.plugin.ts +5 -3
  126. package/src/core/plugins/commands/sd-refresh-command-event.plugin.ts +5 -3
  127. package/src/core/plugins/commands/sd-save-command-event.plugin.ts +5 -3
  128. package/src/core/plugins/events/sd-intersection-event.plugin.ts +2 -3
  129. package/src/core/plugins/events/sd-option-event.plugin.ts +3 -1
  130. package/src/core/plugins/sd-global-error-handler.plugin.ts +4 -1
  131. package/src/core/provideSdAngular.ts +17 -4
  132. package/src/core/providers/sd-app-structure.provider.ts +7 -7
  133. package/src/core/providers/sd-file-dialog.provider.ts +18 -9
  134. package/src/core/providers/sd-local-storage.provider.ts +5 -1
  135. package/src/core/providers/sd-navigate-window.provider.ts +3 -3
  136. package/src/core/providers/sd-print.provider.ts +2 -2
  137. package/src/core/providers/sd-shared-data.provider.ts +14 -3
  138. package/src/core/utils/injectParent.ts +10 -6
  139. package/src/core/utils/setups/setupModelHook.ts +6 -1
  140. package/src/core/utils/setups/setupRevealOnShow.ts +3 -2
  141. package/src/core/utils/useExpandingManager.ts +4 -2
  142. package/src/core/utils/useSdSystemConfigResource.ts +13 -11
  143. package/src/core/utils/withBusy.ts +13 -0
  144. package/src/features/address/sd-address-search.modal.ts +5 -2
  145. package/src/features/data-view/sd-data-detail.control.ts +74 -51
  146. package/src/features/data-view/sd-data-sheet.control.ts +84 -60
  147. package/src/features/permission-table/sd-permission-table.control.ts +461 -0
  148. package/src/features/shared-data/matchesSearchText.ts +16 -0
  149. package/src/features/shared-data/sd-shared-data-select-button.control.ts +4 -4
  150. package/src/features/shared-data/sd-shared-data-select-list.control.ts +19 -11
  151. package/src/features/shared-data/sd-shared-data-select.control.ts +51 -31
  152. package/src/index.ts +7 -8
  153. package/src/ui/data/sheet/sd-sheet.control.ts +51 -48
  154. package/src/ui/data/sheet/types.ts +6 -1
  155. package/src/ui/data/sheet/useSheetCellAgent.ts +5 -3
  156. package/src/ui/data/sheet/useSheetColumnFixing.ts +6 -0
  157. package/src/ui/form/editor/sd-tiptap-editor.control.ts +14 -12
  158. package/src/ui/form/input/sd-date-range.picker.ts +7 -1
  159. package/src/ui/form/select/sd-select.control.ts +18 -14
  160. package/src/ui/layout/dock/sd-dock.control.ts +4 -4
  161. package/src/ui/navigation/pagination/sd-pagination.control.ts +1 -1
  162. package/src/ui/navigation/sidebar/sd-sidebar-menu.control.ts +7 -14
  163. package/src/ui/navigation/topbar/sd-topbar-menu.control.ts +7 -14
  164. package/src/ui/overlay/dropdown/sd-dropdown-popup.control.ts +2 -17
  165. package/src/ui/overlay/dropdown/sd-dropdown.control.ts +19 -19
  166. package/src/ui/overlay/modal/sd-modal.control.ts +21 -5
  167. package/src/ui/overlay/modal/sd-modal.provider.ts +13 -0
  168. package/src/ui/overlay/toast/sd-toast.provider.ts +14 -1
  169. package/src/ui/visual/sd-barcode.control.ts +18 -16
  170. package/src/ui/visual/sd-progress.control.ts +1 -1
@@ -8,11 +8,15 @@ export function injectParent(type, options) {
8
8
  break;
9
9
  }
10
10
  const comp = lView[8];
11
- if (type == null) {
12
- return comp;
13
- }
14
- if (comp instanceof type) {
15
- return comp;
11
+ // 컴포넌트 인스턴스 검증: null, primitive, plain object({}) 건너뜀
12
+ // Angular 내부 슬롯 변경 시 잘못된 객체 반환을 방지하는 방어 코드
13
+ if (comp != null && typeof comp === "object" && comp.constructor !== Object) {
14
+ if (type == null) {
15
+ return comp;
16
+ }
17
+ if (comp instanceof type) {
18
+ return comp;
19
+ }
16
20
  }
17
21
  currentInjector = currentInjector.get(Injector, undefined, {
18
22
  skipSelf: true,
@@ -1 +1 @@
1
- {"version":3,"file":"setupModelHook.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/setups/setupModelHook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAEvF,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,EAC3D,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GACrD,IAAI,CAuBN"}
1
+ {"version":3,"file":"setupModelHook.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/setups/setupModelHook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAEvF,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,EAC3D,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GACrD,IAAI,CA4BN"}
@@ -1,7 +1,7 @@
1
1
  import { ErrorHandler, inject } from "@angular/core";
2
2
  export function setupModelHook(model, canFn) {
3
3
  const errorHandler = inject(ErrorHandler);
4
- const orgSet = model.set;
4
+ const orgSet = model.set.bind(model);
5
5
  model.set = (value) => {
6
6
  const canSet = canFn()(value);
7
7
  if (canSet === false) {
@@ -19,4 +19,7 @@ export function setupModelHook(model, canFn) {
19
19
  errorHandler.handleError(err);
20
20
  });
21
21
  };
22
+ model.update = (fn) => {
23
+ model.set(fn(model()));
24
+ };
22
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"setupRevealOnShow.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/setups/setupRevealOnShow.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,EAAE,MAAM;IACZ,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA,IAAI,CA0CN"}
1
+ {"version":3,"file":"setupRevealOnShow.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/setups/setupRevealOnShow.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,EAAE,MAAM;IACZ,IAAI,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA,IAAI,CA2CN"}
@@ -1,9 +1,10 @@
1
- import { effect, ElementRef, inject, untracked } from "@angular/core";
1
+ import { computed, effect, ElementRef, inject, untracked } from "@angular/core";
2
2
  export function setupRevealOnShow(optFn) {
3
3
  const elRef = inject(ElementRef);
4
+ const resolvedType = computed(() => optFn?.().type ?? "t2b", ...(ngDevMode ? [{ debugName: "resolvedType" }] : /* istanbul ignore next */ []));
4
5
  effect((onCleanup) => {
5
6
  const el = elRef.nativeElement;
6
- const type = untracked(() => optFn?.().type ?? "t2b");
7
+ const type = resolvedType();
7
8
  Object.assign(el.style, {
8
9
  opacity: "0",
9
10
  transform: type === "t2b" ? "translateY(-1em)" : "translateX(-1em)",
@@ -1 +1 @@
1
- {"version":3,"file":"useExpandingManager.d.ts","sourceRoot":"","sources":["../../../src/core/utils/useExpandingManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE;IAC9C,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACnB,aAAa,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC;IACjF,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;CAC3B,GAAG;IACF,YAAY,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,SAAS,IAAI,IAAI,CAAC;IAClB,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;CACjC,CA8FA"}
1
+ {"version":3,"file":"useExpandingManager.d.ts","sourceRoot":"","sources":["../../../src/core/utils/useExpandingManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE;IAC9C,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACnB,aAAa,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC;IACjF,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;CAC3B,GAAG;IACF,YAAY,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,SAAS,IAAI,IAAI,CAAC;IAClB,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;CACjC,CAgGA"}
@@ -23,11 +23,12 @@ export function useExpandingManager(binding) {
23
23
  const displayItems = computed(() => allDefs().map((d) => d.item), ...(ngDevMode ? [{ debugName: "displayItems" }] : /* istanbul ignore next */ []));
24
24
  const expandableDefs = computed(() => allDefs().filter((d) => d.hasChildren), ...(ngDevMode ? [{ debugName: "expandableDefs" }] : /* istanbul ignore next */ []));
25
25
  const hasExpandable = computed(() => expandableDefs().length > 0, ...(ngDevMode ? [{ debugName: "hasExpandable" }] : /* istanbul ignore next */ []));
26
+ const _expandedSet = computed(() => new Set(binding.expandedItems()), ...(ngDevMode ? [{ debugName: "_expandedSet" }] : /* istanbul ignore next */ []));
26
27
  const isAllExpanded = computed(() => {
27
28
  const expandable = expandableDefs();
28
29
  if (expandable.length === 0)
29
30
  return false;
30
- const expandedSet = new Set(binding.expandedItems());
31
+ const expandedSet = _expandedSet();
31
32
  return expandable.every((d) => expandedSet.has(d.item));
32
33
  }, ...(ngDevMode ? [{ debugName: "isAllExpanded" }] : /* istanbul ignore next */ []));
33
34
  const defMap = computed(() => {
@@ -57,7 +58,7 @@ export function useExpandingManager(binding) {
57
58
  const itemDef = map.get(item);
58
59
  if (itemDef == null)
59
60
  return false;
60
- const expandedSet = new Set(binding.expandedItems());
61
+ const expandedSet = _expandedSet();
61
62
  let current = itemDef.parentDef;
62
63
  while (current != null) {
63
64
  if (!expandedSet.has(current.item)) {
@@ -7,7 +7,7 @@ export declare function useSdSystemConfigResource<T>(options: {
7
7
  status: Signal<import("@angular/core").ResourceStatus>;
8
8
  hasValue: () => boolean;
9
9
  reload: () => boolean;
10
- set(value: T | undefined): void;
10
+ set: (value: T | undefined) => void;
11
11
  update(fn: (prev: T | undefined) => T | undefined): void;
12
12
  };
13
13
  //# sourceMappingURL=useSdSystemConfigResource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSdSystemConfigResource.d.ts","sourceRoot":"","sources":["../../../src/core/utils/useSdSystemConfigResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAG1G,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAAE;;;;;;eAoB1E,CAAC,GAAG,SAAS;eAUb,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS;EAKpD"}
1
+ {"version":3,"file":"useSdSystemConfigResource.d.ts","sourceRoot":"","sources":["../../../src/core/utils/useSdSystemConfigResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAG1G,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CAAE;;;;;;iBAcnE,CAAC,GAAG,SAAS;eAkBpB,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,SAAS;EAKpD"}
@@ -9,26 +9,27 @@ export function useSdSystemConfigResource(options) {
9
9
  loader: async ({ params: key }) => {
10
10
  return (await sdSystemConfig.getAsync(`${elTag}.${key}`));
11
11
  } });
12
+ function set(value) {
13
+ res.set(value);
14
+ const key = options.key();
15
+ if (key == null)
16
+ return;
17
+ queueMicrotask(() => {
18
+ sdSystemConfig.setAsync(`${elTag}.${key}`, value).catch((err) => {
19
+ errorHandler.handleError(err);
20
+ });
21
+ });
22
+ }
12
23
  return {
13
24
  value: res.value,
14
25
  isLoading: res.isLoading,
15
26
  status: res.status,
16
27
  hasValue: () => res.hasValue(),
17
28
  reload: () => res.reload(),
18
- set(value) {
19
- res.set(value);
20
- const key = options.key();
21
- if (key == null)
22
- return;
23
- queueMicrotask(() => {
24
- sdSystemConfig.setAsync(`${elTag}.${key}`, value).catch((err) => {
25
- errorHandler.handleError(err);
26
- });
27
- });
28
- },
29
+ set,
29
30
  update(fn) {
30
31
  const newValue = fn(res.value());
31
- this.set(newValue);
32
+ set(newValue);
32
33
  },
33
34
  };
34
35
  }
@@ -0,0 +1,3 @@
1
+ import type { WritableSignal } from "@angular/core";
2
+ export declare function withBusy(busyCount: WritableSignal<number>, fn: () => Promise<void>): Promise<void>;
3
+ //# sourceMappingURL=withBusy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withBusy.d.ts","sourceRoot":"","sources":["../../../src/core/utils/withBusy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,EACjC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACtB,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,9 @@
1
+ export async function withBusy(busyCount, fn) {
2
+ busyCount.update((v) => v + 1);
3
+ try {
4
+ await fn();
5
+ }
6
+ finally {
7
+ busyCount.update((v) => v - 1);
8
+ }
9
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sd-address-search.modal.d.ts","sourceRoot":"","sources":["../../../src/features/address/sd-address-search.modal.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EAKX,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;;AAwBzE,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,qBAYa,oBAAqB,YAAW,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM;IACrE,YAAY,0DAET;IAEH,KAAK,qDAAsB;IAE3B,WAAW,kDAAiB;IAE5B,QAAQ;YAIM,SAAS;yCAbZ,oBAAoB;2CAApB,oBAAoB;CAiEhC"}
1
+ {"version":3,"file":"sd-address-search.modal.d.ts","sourceRoot":"","sources":["../../../src/features/address/sd-address-search.modal.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EAKX,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;;AAwBzE,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,qBAYa,oBAAqB,YAAW,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM;IACrE,YAAY,0DAET;IAEH,KAAK,qDAAsB;IAE3B,WAAW,kDAAiB;IAE5B,QAAQ;YAIM,SAAS;yCAbZ,oBAAoB;2CAApB,oBAAoB;CAoEhC"}
@@ -13,7 +13,7 @@ export class SdAddressSearchModal {
13
13
  }
14
14
  async initAsync() {
15
15
  if (!document.getElementById("daum_address")) {
16
- await new Promise((resolve) => {
16
+ await new Promise((resolve, reject) => {
17
17
  const scriptEl = document.createElement("script");
18
18
  scriptEl.src = "//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js";
19
19
  scriptEl.setAttribute("id", "daum_address");
@@ -22,6 +22,9 @@ export class SdAddressSearchModal {
22
22
  resolve();
23
23
  });
24
24
  };
25
+ scriptEl.onerror = () => {
26
+ reject(new Error("주소 검색 스크립트를 불러올 수 없습니다."));
27
+ };
25
28
  document.head.appendChild(scriptEl);
26
29
  });
27
30
  }
@@ -31,7 +34,7 @@ export class SdAddressSearchModal {
31
34
  const addr = data.userSelectedType === "R" ? data.roadAddress : data.jibunAddress;
32
35
  let extraAddr = "";
33
36
  if (data.userSelectedType === "R") {
34
- if (data.bname !== "" && /[동로가]$/g.test(data.bname)) {
37
+ if (data.bname !== "" && /[동로가]$/.test(data.bname)) {
35
38
  extraAddr += data.bname;
36
39
  }
37
40
  if (data.buildingName !== "" && data.apartment === "Y") {
@@ -43,6 +43,7 @@ export declare abstract class AbsSdDataDetail<T extends object, R = boolean> imp
43
43
  permCheck?: boolean;
44
44
  hideNoChangeMessage?: boolean;
45
45
  }): Promise<void>;
46
+ private _getOrmDataEditToastErrorMessage;
46
47
  static ɵfac: i0.ɵɵFactoryDeclaration<AbsSdDataDetail<any, any>, never>;
47
48
  static ɵdir: i0.ɵɵDirectiveDeclaration<AbsSdDataDetail<any, any>, never, never, {}, { "close": "close"; }, never, never, true, never>;
48
49
  }
@@ -60,10 +61,12 @@ export declare class SdDataDetailControl {
60
61
  onRestoreButtonClick(): Promise<void>;
61
62
  onSubmitButtonClick(): void;
62
63
  onSubmit(): Promise<void>;
63
- protected readonly tablerDeviceFloppy = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"stroke-width:var(--ng-icon__stroke-width, 2)\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M6 4h10l4 4v10a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2\"></path><path d=\"M12 14m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0\"></path><path d=\"M14 4l0 4l-6 0l0 -4\"></path></svg>";
64
- protected readonly tablerRefresh = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"stroke-width:var(--ng-icon__stroke-width, 2)\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4\"></path><path d=\"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4\"></path></svg>";
65
- protected readonly tablerRestore = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"stroke-width:var(--ng-icon__stroke-width, 2)\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M3.06 13a9 9 0 1 0 .49 -4.087\"></path><path d=\"M3 4.001v5h5\"></path><path d=\"M12 12m-1 0a1 1 0 1 0 2 0a1 1 0 1 0 -2 0\"></path></svg>";
66
- protected readonly tablerEraser = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"stroke-width:var(--ng-icon__stroke-width, 2)\"><path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M19 20h-10.5l-4.21 -4.3a1 1 0 0 1 0 -1.41l10 -10a1 1 0 0 1 1.41 0l5 5a1 1 0 0 1 0 1.41l-9.2 9.3\"></path><path d=\"M18 13.3l-6.3 -6.3\"></path></svg>";
64
+ protected readonly icons: {
65
+ tablerDeviceFloppy: string;
66
+ tablerRefresh: string;
67
+ tablerRestore: string;
68
+ tablerEraser: string;
69
+ };
67
70
  static ɵfac: i0.ɵɵFactoryDeclaration<SdDataDetailControl, never>;
68
71
  static ɵcmp: i0.ɵɵComponentDeclaration<SdDataDetailControl, "sd-data-detail", never, {}, {}, ["toolTplRef", "prevTplRef", "contentTplRef", "nextTplRef"], never, true, never>;
69
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sd-data-detail.control.d.ts","sourceRoot":"","sources":["../../../src/features/data-view/sd-data-detail.control.ts"],"names":[],"mappings":"AACA,OAAO,EASL,KAAK,MAAM,EACX,WAAW,EAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAO,MAAM,uBAAuB,CAAC;AAStD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,0CAA0C,CAAC;;AAazE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAMD,8BACsB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,CACjE,YAAW,QAAQ,CAAC,CAAC,CAAC;IAItB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAE5B,oBAAoB,CAAC,IAAI,IAAI;IAE7B,QAAQ,CAAC,IAAI,IACT,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,qBAAqB,CAAA;KAAE,CAAC,GACjD;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,qBAAqB,CAAA;KAAE;IAE5C,YAAY,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS;IAEnE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS;IAIxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAE9D,QAAQ,sCAAiC;IAEzC,SAAS,iDAAa;IACtB,WAAW,6DAAyC;IACpD,WAAW,kDAAiB;IAC5B,KAAK,8CAAe;IACpB,YAAY,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,4CAAsB;IAE1B,QAAQ,4EAAwD;IAEhE,OAAO,CAAC,aAAa,CAAC,CAAI;;IAyB1B,kBAAkB;IAQZ,SAAS;IAYT,OAAO;IASP,cAAc,CAAC,GAAG,EAAE,OAAO;IAkB3B,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAE;yCA5GvD,eAAe;2CAAf,eAAe;CAwIpC;AAMD,qBA6Ja,mBAAmB;IAC9B,MAAM,gCAAwC;IAE9C,QAAQ,oCAAwC;IAEhD,UAAU,uCAAkD;IAC5D,UAAU,uCAAkD;IAC5D,aAAa,2BAA8D;IAC3E,UAAU,uCAAkD;IAE5D,iBAAiB,uCAAsD;;IAQjE,oBAAoB;IAIpB,mBAAmB;IAInB,oBAAoB;IAI1B,mBAAmB;IAIb,QAAQ;IAId,SAAS,CAAC,QAAQ,CAAC,kBAAkB,sdAAsB;IAC3D,SAAS,CAAC,QAAQ,CAAC,aAAa,gZAAiB;IACjD,SAAS,CAAC,QAAQ,CAAC,aAAa,waAAiB;IACjD,SAAS,CAAC,QAAQ,CAAC,YAAY,obAAgB;yCAzCpC,mBAAmB;2CAAnB,mBAAmB;CA0C/B"}
1
+ {"version":3,"file":"sd-data-detail.control.d.ts","sourceRoot":"","sources":["../../../src/features/data-view/sd-data-detail.control.ts"],"names":[],"mappings":"AACA,OAAO,EASL,KAAK,MAAM,EACX,WAAW,EAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAO,MAAM,uBAAuB,CAAC;AAUtD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,0CAA0C,CAAC;;AAazE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAMD,8BACsB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,CACjE,YAAW,QAAQ,CAAC,CAAC,CAAC;IAItB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAE5B,oBAAoB,CAAC,IAAI,IAAI;IAE7B,QAAQ,CAAC,IAAI,IACT,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,qBAAqB,CAAA;KAAE,CAAC,GACjD;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,qBAAqB,CAAA;KAAE;IAE5C,YAAY,CAAC,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS;IAEnE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS;IAIxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAE9D,QAAQ,sCAAiC;IAEzC,SAAS,iDAAa;IACtB,WAAW,6DAAyC;IACpD,WAAW,kDAAiB;IAC5B,KAAK,8CAAe;IACpB,YAAY,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,4CAAsB;IAE1B,QAAQ,4EAAwD;IAEhE,OAAO,CAAC,aAAa,CAAC,CAAI;;IAyB1B,kBAAkB;IAQZ,SAAS;IAYT,OAAO;IASP,cAAc,CAAC,GAAG,EAAE,OAAO;IAqB3B,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAE;IAmC3E,OAAO,CAAC,gCAAgC;yCAlJpB,eAAe;2CAAf,eAAe;CA4JpC;AAMD,qBA6Ja,mBAAmB;IAC9B,MAAM,gCAAwC;IAE9C,QAAQ,oCAAwC;IAEhD,UAAU,uCAAkD;IAC5D,UAAU,uCAAkD;IAC5D,aAAa,2BAA8D;IAC3E,UAAU,uCAAkD;IAE5D,iBAAiB,uCAAsD;;IAQjE,oBAAoB;IAIpB,mBAAmB;IAInB,oBAAoB;IAI1B,mBAAmB;IAIb,QAAQ;IAId,SAAS,CAAC,QAAQ,CAAC,KAAK;;;;;MAKtB;yCA3CS,mBAAmB;2CAAnB,mBAAmB;CA4C/B"}
@@ -7,6 +7,7 @@ import { SdSharedDataProvider } from "../../core/providers/sd-shared-data.provid
7
7
  import { injectParent } from "../../core/utils/injectParent";
8
8
  import { setupCanDeactivate } from "../../core/utils/setups/setupCanDeactivate";
9
9
  import { useViewTypeSignal } from "../../core/utils/useViewTypeSignal";
10
+ import { withBusy } from "../../core/utils/withBusy";
10
11
  import { SdButtonControl } from "../../ui/form/button/sd-button.control";
11
12
  import { SdAnchorControl } from "../../ui/form/button/sd-anchor.control";
12
13
  import { SdFormControl } from "../../ui/form/sd-form.control";
@@ -35,7 +36,7 @@ function SdDataDetailControl_ng_template_1_Conditional_0_Template(rf, ctx) { if
35
36
  const ctx_r2 = i0.ɵɵnextContext(2);
36
37
  i0.ɵɵproperty("theme", "link-primary");
37
38
  i0.ɵɵadvance();
38
- i0.ɵɵproperty("svg", ctx_r2.tablerDeviceFloppy);
39
+ i0.ɵɵproperty("svg", ctx_r2.icons.tablerDeviceFloppy);
39
40
  } }
40
41
  function SdDataDetailControl_ng_template_1_Template(rf, ctx) { if (rf & 1) {
41
42
  const _r1 = i0.ɵɵgetCurrentView();
@@ -53,7 +54,7 @@ function SdDataDetailControl_ng_template_1_Template(rf, ctx) { if (rf & 1) {
53
54
  i0.ɵɵadvance();
54
55
  i0.ɵɵproperty("theme", "link-info");
55
56
  i0.ɵɵadvance();
56
- i0.ɵɵproperty("svg", ctx_r2.tablerRefresh);
57
+ i0.ɵɵproperty("svg", ctx_r2.icons.tablerRefresh);
57
58
  } }
58
59
  function SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
59
60
  const _r5 = i0.ɵɵgetCurrentView();
@@ -75,11 +76,11 @@ function SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Condition
75
76
  const ctx_r2 = i0.ɵɵnextContext(4);
76
77
  i0.ɵɵproperty("theme", "primary");
77
78
  i0.ɵɵadvance();
78
- i0.ɵɵproperty("svg", ctx_r2.tablerDeviceFloppy);
79
+ i0.ɵɵproperty("svg", ctx_r2.icons.tablerDeviceFloppy);
79
80
  i0.ɵɵadvance(4);
80
81
  i0.ɵɵproperty("theme", "info");
81
82
  i0.ɵɵadvance();
82
- i0.ɵɵproperty("svg", ctx_r2.tablerRefresh);
83
+ i0.ɵɵproperty("svg", ctx_r2.icons.tablerRefresh);
83
84
  } }
84
85
  function SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
85
86
  const _r6 = i0.ɵɵgetCurrentView();
@@ -92,7 +93,7 @@ function SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Condition
92
93
  const ctx_r2 = i0.ɵɵnextContext(5);
93
94
  i0.ɵɵproperty("theme", "warning");
94
95
  i0.ɵɵadvance();
95
- i0.ɵɵproperty("svg", ctx_r2.tablerRestore);
96
+ i0.ɵɵproperty("svg", ctx_r2.icons.tablerRestore);
96
97
  } }
97
98
  function SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
98
99
  const _r7 = i0.ɵɵgetCurrentView();
@@ -105,24 +106,24 @@ function SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Condition
105
106
  const ctx_r2 = i0.ɵɵnextContext(5);
106
107
  i0.ɵɵproperty("theme", "danger");
107
108
  i0.ɵɵadvance();
108
- i0.ɵɵproperty("svg", ctx_r2.tablerEraser);
109
+ i0.ɵɵproperty("svg", ctx_r2.icons.tablerEraser);
109
110
  } }
110
111
  function SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
111
112
  i0.ɵɵconditionalCreate(0, SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Conditional_1_Conditional_0_Template, 3, 2, "sd-button", 6)(1, SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Conditional_1_Conditional_1_Template, 3, 2, "sd-button", 6);
112
113
  } if (rf & 2) {
113
- let tmp_7_0;
114
+ let tmp_8_0;
114
115
  const ctx_r2 = i0.ɵɵnextContext(4);
115
- i0.ɵɵconditional(((tmp_7_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_7_0.isDeleted) ? 0 : 1);
116
+ i0.ɵɵconditional(((tmp_8_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_8_0.isDeleted) ? 0 : 1);
116
117
  } }
117
118
  function SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
118
119
  i0.ɵɵconditionalCreate(0, SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Conditional_0_Template, 10, 4);
119
120
  i0.ɵɵconditionalCreate(1, SdDataDetailControl_ng_template_3_Conditional_1_Conditional_1_Conditional_1_Template, 2, 1);
120
121
  } if (rf & 2) {
121
- let tmp_7_0;
122
+ let tmp_8_0;
122
123
  const ctx_r2 = i0.ɵɵnextContext(3);
123
124
  i0.ɵɵconditional(ctx_r2.parent.submit ? 0 : -1);
124
125
  i0.ɵɵadvance();
125
- i0.ɵɵconditional(!((tmp_7_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_7_0.isNew) && ctx_r2.parent.toggleDelete && (!ctx_r2.parent.canDelete || ctx_r2.parent.canDelete()) ? 1 : -1);
126
+ i0.ɵɵconditional(!((tmp_8_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_8_0.isNew) && ctx_r2.parent.toggleDelete && (!ctx_r2.parent.canDelete || ctx_r2.parent.canDelete()) ? 1 : -1);
126
127
  } }
127
128
  function SdDataDetailControl_ng_template_3_Conditional_1_ng_template_2_Template(rf, ctx) { }
128
129
  function SdDataDetailControl_ng_template_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
@@ -158,9 +159,9 @@ function SdDataDetailControl_ng_template_3_Conditional_7_Conditional_2_Template(
158
159
  function SdDataDetailControl_ng_template_3_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
159
160
  i0.ɵɵtext(0);
160
161
  } if (rf & 2) {
161
- let tmp_6_0;
162
+ let tmp_7_0;
162
163
  const ctx_r2 = i0.ɵɵnextContext(3);
163
- i0.ɵɵtextInterpolate1(" (", (tmp_6_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_6_0.lastModifiedBy, ") ");
164
+ i0.ɵɵtextInterpolate1(" (", (tmp_7_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_7_0.lastModifiedBy, ") ");
164
165
  } }
165
166
  function SdDataDetailControl_ng_template_3_Conditional_7_Template(rf, ctx) { if (rf & 1) {
166
167
  i0.ɵɵelementStart(0, "div", 15);
@@ -169,14 +170,14 @@ function SdDataDetailControl_ng_template_3_Conditional_7_Template(rf, ctx) { if
169
170
  i0.ɵɵconditionalCreate(3, SdDataDetailControl_ng_template_3_Conditional_7_Conditional_3_Template, 1, 1);
170
171
  i0.ɵɵelementEnd();
171
172
  } if (rf & 2) {
172
- let tmp_6_0;
173
173
  let tmp_7_0;
174
+ let tmp_8_0;
174
175
  const ctx_r2 = i0.ɵɵnextContext(2);
175
176
  i0.ɵɵclassProp("bg-theme-gray-lightest", ctx_r2.parent.viewType() === "modal");
176
177
  i0.ɵɵadvance(2);
177
- i0.ɵɵconditional(((tmp_6_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_6_0.lastModifiedAt) ? 2 : -1);
178
+ i0.ɵɵconditional(((tmp_7_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_7_0.lastModifiedAt) ? 2 : -1);
178
179
  i0.ɵɵadvance();
179
- i0.ɵɵconditional(((tmp_7_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_7_0.lastModifiedBy) ? 3 : -1);
180
+ i0.ɵɵconditional(((tmp_8_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_8_0.lastModifiedBy) ? 3 : -1);
180
181
  } }
181
182
  function SdDataDetailControl_ng_template_3_Conditional_8_ng_template_1_Template(rf, ctx) { }
182
183
  function SdDataDetailControl_ng_template_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
@@ -193,15 +194,15 @@ function SdDataDetailControl_ng_template_3_Template(rf, ctx) { if (rf & 1) {
193
194
  i0.ɵɵelementStart(0, "div", 9);
194
195
  i0.ɵɵconditionalCreate(1, SdDataDetailControl_ng_template_3_Conditional_1_Template, 3, 2, "div", 10);
195
196
  i0.ɵɵconditionalCreate(2, SdDataDetailControl_ng_template_3_Conditional_2_Template, 2, 1, "div");
196
- i0.ɵɵelementStart(3, "div", 11)(4, "sd-form", 12, 2);
197
- i0.ɵɵlistener("submit", function SdDataDetailControl_ng_template_3_Template_sd_form_submit_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSubmit()); });
197
+ i0.ɵɵelementStart(3, "div", 11)(4, "sd-form", 12, 3);
198
+ i0.ɵɵlistener("formSubmit", function SdDataDetailControl_ng_template_3_Template_sd_form_formSubmit_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSubmit()); });
198
199
  i0.ɵɵtemplate(6, SdDataDetailControl_ng_template_3_ng_template_6_Template, 0, 0, "ng-template", 13);
199
200
  i0.ɵɵelementEnd()();
200
201
  i0.ɵɵconditionalCreate(7, SdDataDetailControl_ng_template_3_Conditional_7_Template, 4, 4, "div", 14);
201
202
  i0.ɵɵconditionalCreate(8, SdDataDetailControl_ng_template_3_Conditional_8_Template, 2, 1, "div");
202
203
  i0.ɵɵelementEnd();
203
204
  } if (rf & 2) {
204
- let tmp_7_0;
205
+ let tmp_8_0;
205
206
  const ctx_r2 = i0.ɵɵnextContext();
206
207
  i0.ɵɵadvance();
207
208
  i0.ɵɵconditional(ctx_r2.parent.viewType() === "control" && ctx_r2.parent.canEdit() || ctx_r2.toolTplRef() ? 1 : -1);
@@ -210,7 +211,7 @@ function SdDataDetailControl_ng_template_3_Template(rf, ctx) { if (rf & 1) {
210
211
  i0.ɵɵadvance(4);
211
212
  i0.ɵɵproperty("ngTemplateOutlet", ctx_r2.contentTplRef());
212
213
  i0.ɵɵadvance();
213
- i0.ɵɵconditional(((tmp_7_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_7_0.lastModifiedAt) || ((tmp_7_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_7_0.lastModifiedBy) ? 7 : -1);
214
+ i0.ɵɵconditional(((tmp_8_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_8_0.lastModifiedAt) || ((tmp_8_0 = ctx_r2.parent.dataInfo()) == null ? null : tmp_8_0.lastModifiedBy) ? 7 : -1);
214
215
  i0.ɵɵadvance();
215
216
  i0.ɵɵconditional(ctx_r2.nextTplRef() ? 8 : -1);
216
217
  } }
@@ -255,20 +256,20 @@ function SdDataDetailControl_Conditional_5_ng_template_0_Template(rf, ctx) { if
255
256
  i0.ɵɵadvance(2);
256
257
  i0.ɵɵproperty("size", "sm")("theme", "primary");
257
258
  } }
258
- function SdDataDetailControl_Conditional_5_ng_template_2_Template(rf, ctx) { if (rf & 1) {
259
+ function SdDataDetailControl_Conditional_5_Template(rf, ctx) { if (rf & 1) {
260
+ i0.ɵɵtemplate(0, SdDataDetailControl_Conditional_5_ng_template_0_Template, 5, 3, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor);
261
+ } }
262
+ function SdDataDetailControl_ng_template_6_Template(rf, ctx) { if (rf & 1) {
259
263
  const _r11 = i0.ɵɵgetCurrentView();
260
264
  i0.ɵɵelementStart(0, "sd-anchor", 20);
261
- i0.ɵɵlistener("click", function SdDataDetailControl_Conditional_5_ng_template_2_Template_sd_anchor_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onRefreshButtonClick()); });
265
+ i0.ɵɵlistener("click", function SdDataDetailControl_ng_template_6_Template_sd_anchor_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onRefreshButtonClick()); });
262
266
  i0.ɵɵelement(1, "ng-icon", 8);
263
267
  i0.ɵɵelementEnd();
264
268
  } if (rf & 2) {
265
- const ctx_r2 = i0.ɵɵnextContext(2);
269
+ const ctx_r2 = i0.ɵɵnextContext();
266
270
  i0.ɵɵproperty("theme", "gray");
267
271
  i0.ɵɵadvance();
268
- i0.ɵɵproperty("svg", ctx_r2.tablerRefresh);
269
- } }
270
- function SdDataDetailControl_Conditional_5_Template(rf, ctx) { if (rf & 1) {
271
- i0.ɵɵtemplate(0, SdDataDetailControl_Conditional_5_ng_template_0_Template, 5, 3, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor)(2, SdDataDetailControl_Conditional_5_ng_template_2_Template, 2, 2, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor);
272
+ i0.ɵɵproperty("svg", ctx_r2.icons.tablerRefresh);
272
273
  } }
273
274
  //#endregion
274
275
  //#region AbsSdDataDetail
@@ -294,12 +295,10 @@ export class AbsSdDataDetail {
294
295
  this.initialized.set(true);
295
296
  return;
296
297
  }
297
- this.busyCount.update((v) => v + 1);
298
- await this._sdToast.try(async () => {
298
+ await withBusy(this.busyCount, () => this._sdToast.try(async () => {
299
299
  await this._sdSharedData.wait();
300
300
  await this.refresh();
301
- });
302
- this.busyCount.update((v) => v - 1);
301
+ }));
303
302
  this.initialized.set(true);
304
303
  });
305
304
  });
@@ -317,11 +316,9 @@ export class AbsSdDataDetail {
317
316
  return;
318
317
  if (!this.checkIgnoreChanges())
319
318
  return;
320
- this.busyCount.update((v) => v + 1);
321
- await this._sdToast.try(async () => {
319
+ await withBusy(this.busyCount, () => this._sdToast.try(async () => {
322
320
  await this.refresh();
323
- });
324
- this.busyCount.update((v) => v - 1);
321
+ }));
325
322
  }
326
323
  async refresh() {
327
324
  const result = await this.load();
@@ -340,15 +337,13 @@ export class AbsSdDataDetail {
340
337
  return;
341
338
  if (!this.toggleDelete)
342
339
  return;
343
- this.busyCount.update((v) => v + 1);
344
- await this._sdToast.try(async () => {
340
+ await withBusy(this.busyCount, () => this._sdToast.try(async () => {
345
341
  const result = await this.toggleDelete(del);
346
342
  if (!result)
347
343
  return;
348
344
  this._sdToast.success(`${del ? "삭제" : "복구"}되었습니다.`);
349
345
  this.close.emit(result);
350
- });
351
- this.busyCount.update((v) => v - 1);
346
+ }, (err) => this._getOrmDataEditToastErrorMessage(err)));
352
347
  }
353
348
  async doSubmit(opt) {
354
349
  if (this.busyCount() > 0)
@@ -357,23 +352,32 @@ export class AbsSdDataDetail {
357
352
  return;
358
353
  if (!this.submit)
359
354
  return;
360
- if (!this.dataInfo()?.isNew &&
355
+ const dataInfo = this.dataInfo();
356
+ if (dataInfo == null)
357
+ return;
358
+ if (!dataInfo.isNew &&
361
359
  (this._dataSnapshot == null || obj.equal(this.data(), this._dataSnapshot))) {
362
360
  if (!opt?.hideNoChangeMessage) {
363
361
  this._sdToast.info("변경사항이 없습니다.");
364
362
  }
365
363
  return;
366
364
  }
367
- this.busyCount.update((v) => v + 1);
368
- await this._sdToast.try(async () => {
365
+ await withBusy(this.busyCount, () => this._sdToast.try(async () => {
369
366
  const result = await this.submit(this.data());
370
367
  if (!result)
371
368
  return;
372
369
  this._sdToast.success("저장되었습니다.");
373
370
  this.close.emit(result);
374
371
  await this.refresh();
375
- });
376
- this.busyCount.update((v) => v - 1);
372
+ }, (err) => this._getOrmDataEditToastErrorMessage(err)));
373
+ }
374
+ _getOrmDataEditToastErrorMessage(err) {
375
+ const message = err instanceof Error ? err.message : String(err);
376
+ if (message.includes("a parent row: a foreign key constraint") ||
377
+ message.includes("conflicted with the REFERENCE")) {
378
+ return "경고! 연결된 작업에 의한 처리 거부. 후속작업 확인 요망";
379
+ }
380
+ return message;
377
381
  }
378
382
  static ɵfac = function AbsSdDataDetail_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AbsSdDataDetail)(); };
379
383
  static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: AbsSdDataDetail, outputs: { close: "close" } });
@@ -411,10 +415,12 @@ export class SdDataDetailControl {
411
415
  async onSubmit() {
412
416
  await this.parent.doSubmit({ permCheck: true });
413
417
  }
414
- tablerDeviceFloppy = tablerDeviceFloppy;
415
- tablerRefresh = tablerRefresh;
416
- tablerRestore = tablerRestore;
417
- tablerEraser = tablerEraser;
418
+ icons = {
419
+ tablerDeviceFloppy,
420
+ tablerRefresh,
421
+ tablerRestore,
422
+ tablerEraser,
423
+ };
418
424
  static ɵfac = function SdDataDetailControl_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdDataDetailControl)(); };
419
425
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SdDataDetailControl, selectors: [["sd-data-detail"]], contentQueries: function SdDataDetailControl_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
420
426
  i0.ɵɵcontentQuerySignal(dirIndex, ctx.toolTplRef, _c0, 5, TemplateRef)(dirIndex, ctx.prevTplRef, _c1, 5, TemplateRef)(dirIndex, ctx.contentTplRef, _c2, 5, TemplateRef)(dirIndex, ctx.nextTplRef, _c3, 5, TemplateRef);
@@ -426,10 +432,11 @@ export class SdDataDetailControl {
426
432
  i0.ɵɵqueryAdvance(2);
427
433
  } }, hostBindings: function SdDataDetailControl_HostBindings(rf, ctx) { if (rf & 1) {
428
434
  i0.ɵɵlistener("sdRefreshCommand", function SdDataDetailControl_sdRefreshCommand_HostBindingHandler() { return ctx.onRefreshButtonClick(); })("sdSaveCommand", function SdDataDetailControl_sdSaveCommand_HostBindingHandler() { return ctx.onSubmitButtonClick(); });
429
- } }, decls: 6, vars: 6, consts: [["pageTopbarTpl", ""], ["contentTpl", ""], ["formCtrl", ""], ["modalBottomTpl", ""], ["modalActionTpl", ""], [3, "busy", "busyMessage", "viewType", "initialized", "restricted"], [3, "theme"], [3, "click", "theme"], [3, "svg"], [1, "flex-column", "fill"], [1, "p-default", "flex-row", "gap-default", "bdb", "bdb-theme-gray-lightest"], [1, "flex-fill"], [3, "submit"], [3, "ngTemplateOutlet"], [1, "p-sm-default", 3, "bg-theme-gray-lightest"], [1, "p-sm-default"], [1, "p-sm-default", "flex-row", "gap-sm"], [1, "flex-fill", "flex-row", "gap-sm", "main-align-end"], [3, "click", "size", "theme"], [3, "size", "theme"], ["title", "\uC0C8\uB85C\uACE0\uCE68(CTRL+ALT+L)", 1, "p-sm-default", 3, "click", "theme"]], template: function SdDataDetailControl_Template(rf, ctx) { if (rf & 1) {
435
+ } }, decls: 8, vars: 6, consts: [["pageTopbarTpl", ""], ["contentTpl", ""], ["modalActionTpl", ""], ["formCtrl", ""], ["modalBottomTpl", ""], [3, "busy", "busyMessage", "viewType", "initialized", "restricted"], [3, "theme"], [3, "click", "theme"], [3, "svg"], [1, "flex-column", "fill"], [1, "p-default", "flex-row", "gap-default", "bdb", "bdb-theme-gray-lightest"], [1, "flex-fill"], [3, "formSubmit"], [3, "ngTemplateOutlet"], [1, "p-sm-default", 3, "bg-theme-gray-lightest"], [1, "p-sm-default"], [1, "p-sm-default", "flex-row", "gap-sm"], [1, "flex-fill", "flex-row", "gap-sm", "main-align-end"], [3, "click", "size", "theme"], [3, "size", "theme"], ["title", "\uC0C8\uB85C\uACE0\uCE68(CTRL+ALT+L)", 1, "p-sm-default", 3, "click", "theme"]], template: function SdDataDetailControl_Template(rf, ctx) { if (rf & 1) {
430
436
  i0.ɵɵelementStart(0, "sd-base-container", 5);
431
437
  i0.ɵɵtemplate(1, SdDataDetailControl_ng_template_1_Template, 6, 3, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(3, SdDataDetailControl_ng_template_3_Template, 9, 5, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
432
- i0.ɵɵconditionalCreate(5, SdDataDetailControl_Conditional_5_Template, 4, 0);
438
+ i0.ɵɵconditionalCreate(5, SdDataDetailControl_Conditional_5_Template, 2, 0);
439
+ i0.ɵɵtemplate(6, SdDataDetailControl_ng_template_6_Template, 2, 2, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
433
440
  i0.ɵɵelementEnd();
434
441
  } if (rf & 2) {
435
442
  i0.ɵɵproperty("busy", ctx.parent.busyCount() > 0)("busyMessage", ctx.parent.busyMessage())("viewType", ctx.parent.viewType())("initialized", ctx.parent.initialized())("restricted", !ctx.parent.canUse());
@@ -474,13 +481,13 @@ export class SdDataDetailControl {
474
481
  <ng-template #pageTopbarTpl>
475
482
  @if (parent.canEdit() && parent.submit) {
476
483
  <sd-button [theme]="'link-primary'" (click)="onSubmitButtonClick()">
477
- <ng-icon [svg]="tablerDeviceFloppy" />
484
+ <ng-icon [svg]="icons.tablerDeviceFloppy" />
478
485
  저장
479
486
  <small>(CTRL+S)</small>
480
487
  </sd-button>
481
488
  }
482
489
  <sd-button [theme]="'link-info'" (click)="onRefreshButtonClick()">
483
- <ng-icon [svg]="tablerRefresh" />
490
+ <ng-icon [svg]="icons.tablerRefresh" />
484
491
  새로고침
485
492
  <small>(CTRL+ALT+L)</small>
486
493
  </sd-button>
@@ -493,12 +500,12 @@ export class SdDataDetailControl {
493
500
  @if (parent.viewType() === "control" && parent.canEdit()) {
494
501
  @if (parent.submit) {
495
502
  <sd-button [theme]="'primary'" (click)="onSubmitButtonClick()">
496
- <ng-icon [svg]="tablerDeviceFloppy" />
503
+ <ng-icon [svg]="icons.tablerDeviceFloppy" />
497
504
  저장
498
505
  <small>(CTRL+S)</small>
499
506
  </sd-button>
500
507
  <sd-button [theme]="'info'" (click)="onRefreshButtonClick()">
501
- <ng-icon [svg]="tablerRefresh" />
508
+ <ng-icon [svg]="icons.tablerRefresh" />
502
509
  새로고침
503
510
  <small>(CTRL+ALT+L)</small>
504
511
  </sd-button>
@@ -510,12 +517,12 @@ export class SdDataDetailControl {
510
517
  ) {
511
518
  @if (parent.dataInfo()?.isDeleted) {
512
519
  <sd-button [theme]="'warning'" (click)="onRestoreButtonClick()">
513
- <ng-icon [svg]="tablerRestore" />
520
+ <ng-icon [svg]="icons.tablerRestore" />
514
521
  복구
515
522
  </sd-button>
516
523
  } @else {
517
524
  <sd-button [theme]="'danger'" (click)="onDeleteButtonClick()">
518
- <ng-icon [svg]="tablerEraser" />
525
+ <ng-icon [svg]="icons.tablerEraser" />
519
526
  삭제
520
527
  </sd-button>
521
528
  }
@@ -533,7 +540,7 @@ export class SdDataDetailControl {
533
540
  }
534
541
 
535
542
  <div class="flex-fill">
536
- <sd-form #formCtrl (submit)="onSubmit()">
543
+ <sd-form #formCtrl (formSubmit)="onSubmit()">
537
544
  <ng-template [ngTemplateOutlet]="contentTplRef()" />
538
545
  </sd-form>
539
546
  </div>
@@ -587,20 +594,20 @@ export class SdDataDetailControl {
587
594
  </div>
588
595
  </div>
589
596
  </ng-template>
590
-
591
- <ng-template #modalActionTpl>
592
- <sd-anchor
593
- [theme]="'gray'"
594
- class="p-sm-default"
595
- (click)="onRefreshButtonClick()"
596
- title="새로고침(CTRL+ALT+L)"
597
- >
598
- <ng-icon [svg]="tablerRefresh" />
599
- </sd-anchor>
600
- </ng-template>
601
597
  }
598
+
599
+ <ng-template #modalActionTpl>
600
+ <sd-anchor
601
+ [theme]="'gray'"
602
+ class="p-sm-default"
603
+ (click)="onRefreshButtonClick()"
604
+ title="새로고침(CTRL+ALT+L)"
605
+ >
606
+ <ng-icon [svg]="icons.tablerRefresh" />
607
+ </sd-anchor>
608
+ </ng-template>
602
609
  </sd-base-container>
603
610
  `,
604
611
  }]
605
612
  }], () => [], { formCtrl: [{ type: i0.ViewChild, args: ["formCtrl", { isSignal: true }] }], toolTplRef: [{ type: i0.ContentChild, args: ["toolTpl", { ...{ read: TemplateRef }, isSignal: true }] }], prevTplRef: [{ type: i0.ContentChild, args: ["prevTpl", { ...{ read: TemplateRef }, isSignal: true }] }], contentTplRef: [{ type: i0.ContentChild, args: ["contentTpl", { ...{ read: TemplateRef }, isSignal: true }] }], nextTplRef: [{ type: i0.ContentChild, args: ["nextTpl", { ...{ read: TemplateRef }, isSignal: true }] }], modalActionTplRef: [{ type: i0.ViewChild, args: ["modalActionTpl", { ...{ read: TemplateRef }, isSignal: true }] }] }); })();
606
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SdDataDetailControl, { className: "SdDataDetailControl", filePath: "packages/angular/src/features/data-view/sd-data-detail.control.ts", lineNumber: 350, forbidOrphanRendering: true }); })();
613
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SdDataDetailControl, { className: "SdDataDetailControl", filePath: "packages/angular/src/features/data-view/sd-data-detail.control.ts", lineNumber: 371, forbidOrphanRendering: true }); })();
@@ -103,6 +103,8 @@ export declare class SdDataSheetControl {
103
103
  toolTplRef: Signal<TemplateRef<any> | undefined>;
104
104
  modalBottomTplRef: Signal<TemplateRef<any> | undefined>;
105
105
  columnControls: Signal<readonly SdDataSheetColumnDirective[]>;
106
+ modalActionTplRef: Signal<TemplateRef<any> | undefined>;
107
+ constructor();
106
108
  protected readonly icons: {
107
109
  tablerRefresh: string;
108
110
  tablerDeviceFloppy: string;