@simplysm/angular 14.0.19 → 14.0.22

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 (143) hide show
  1. package/dist/core/provideSdAngular.js +1 -1
  2. package/dist/core/providers/sd-activated-modal.provider.d.ts +13 -0
  3. package/dist/core/providers/sd-activated-modal.provider.d.ts.map +1 -0
  4. package/dist/core/providers/sd-activated-modal.provider.js +15 -0
  5. package/dist/core/providers/sd-app-structure.provider.d.ts +3 -64
  6. package/dist/core/providers/sd-app-structure.provider.d.ts.map +1 -1
  7. package/dist/core/providers/sd-app-structure.provider.js +1 -252
  8. package/dist/core/providers/sd-app-structure.types.d.ts +52 -0
  9. package/dist/core/providers/sd-app-structure.types.d.ts.map +1 -0
  10. package/dist/core/providers/sd-app-structure.types.js +1 -0
  11. package/dist/core/providers/sd-app-structure.utils.d.ts +13 -0
  12. package/dist/core/providers/sd-app-structure.utils.d.ts.map +1 -0
  13. package/dist/core/providers/sd-app-structure.utils.js +250 -0
  14. package/dist/{ui/overlay/busy → core/providers}/sd-busy.provider.d.ts +1 -1
  15. package/dist/core/providers/sd-busy.provider.d.ts.map +1 -0
  16. package/dist/{ui/overlay/busy → core/providers}/sd-busy.provider.js +1 -1
  17. package/dist/core/providers/sd-print.provider.js +1 -1
  18. package/dist/core/providers/sd-service-client-factory.provider.js +1 -1
  19. package/dist/{ui/overlay/toast → core/providers}/sd-toast.provider.d.ts +1 -1
  20. package/dist/core/providers/sd-toast.provider.d.ts.map +1 -0
  21. package/dist/{ui/overlay/toast → core/providers}/sd-toast.provider.js +3 -3
  22. package/dist/core/types/select-modal-output-result.d.ts +8 -0
  23. package/dist/core/types/select-modal-output-result.d.ts.map +1 -0
  24. package/dist/core/types/select-modal-output-result.js +1 -0
  25. package/dist/core/utils/setups/setupCanDeactivate.js +1 -1
  26. package/dist/core/utils/useViewTitleSignal.js +1 -1
  27. package/dist/core/utils/useViewTypeSignal.js +1 -1
  28. package/dist/features/base/sd-base-container.control.js +1 -1
  29. package/dist/features/data-view/sd-data-detail.control.js +1 -1
  30. package/dist/features/data-view/sd-data-sheet.control.d.ts +24 -37
  31. package/dist/features/data-view/sd-data-sheet.control.d.ts.map +1 -1
  32. package/dist/features/data-view/sd-data-sheet.control.js +98 -152
  33. package/dist/features/data-view/sd-data-sheet.types.d.ts +17 -0
  34. package/dist/features/data-view/sd-data-sheet.types.d.ts.map +1 -0
  35. package/dist/features/data-view/sd-data-sheet.types.js +1 -0
  36. package/dist/{core/utils/setups → features/data-view}/setupCloserWhenSingleSelectionChange.d.ts +1 -1
  37. package/dist/features/data-view/setupCloserWhenSingleSelectionChange.d.ts.map +1 -0
  38. package/dist/features/data-view/useDataSheetExcelManager.d.ts +14 -0
  39. package/dist/features/data-view/useDataSheetExcelManager.d.ts.map +1 -0
  40. package/dist/features/data-view/useDataSheetExcelManager.js +31 -0
  41. package/dist/features/data-view/useDataSheetFilterManager.d.ts +13 -0
  42. package/dist/features/data-view/useDataSheetFilterManager.d.ts.map +1 -0
  43. package/dist/features/data-view/useDataSheetFilterManager.js +19 -0
  44. package/dist/features/data-view/useDataSheetInlineEditManager.d.ts +26 -0
  45. package/dist/features/data-view/useDataSheetInlineEditManager.d.ts.map +1 -0
  46. package/dist/features/data-view/useDataSheetInlineEditManager.js +54 -0
  47. package/dist/features/data-view/useDataSheetModalEditManager.d.ts +19 -0
  48. package/dist/features/data-view/useDataSheetModalEditManager.d.ts.map +1 -0
  49. package/dist/features/data-view/useDataSheetModalEditManager.js +44 -0
  50. package/dist/features/data-view/useDataSheetRefreshManager.d.ts +25 -0
  51. package/dist/features/data-view/useDataSheetRefreshManager.d.ts.map +1 -0
  52. package/dist/features/data-view/useDataSheetRefreshManager.js +50 -0
  53. package/dist/features/permission-table/sd-permission-table.control.d.ts +1 -1
  54. package/dist/features/permission-table/sd-permission-table.control.d.ts.map +1 -1
  55. package/dist/index.d.ts +12 -6
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +10 -5
  58. package/dist/ui/data/sheet/sd-sheet-config.modal.d.ts +1 -2
  59. package/dist/ui/data/sheet/sd-sheet-config.modal.d.ts.map +1 -1
  60. package/dist/ui/data/sheet/sd-sheet-config.modal.js +8 -11
  61. package/dist/ui/data/sheet/sd-sheet.control.d.ts +22 -30
  62. package/dist/ui/data/sheet/sd-sheet.control.d.ts.map +1 -1
  63. package/dist/ui/data/sheet/sd-sheet.control.js +52 -210
  64. package/dist/ui/data/sheet/useSheetCellStyling.d.ts +22 -0
  65. package/dist/ui/data/sheet/useSheetCellStyling.d.ts.map +1 -0
  66. package/dist/ui/data/sheet/useSheetCellStyling.js +95 -0
  67. package/dist/ui/data/sheet/useSheetColumnResizing.d.ts +17 -0
  68. package/dist/ui/data/sheet/useSheetColumnResizing.d.ts.map +1 -0
  69. package/dist/ui/data/sheet/useSheetColumnResizing.js +65 -0
  70. package/dist/ui/data/sheet/useSheetDisplayPipeline.d.ts +24 -0
  71. package/dist/ui/data/sheet/useSheetDisplayPipeline.d.ts.map +1 -0
  72. package/dist/ui/data/sheet/useSheetDisplayPipeline.js +52 -0
  73. package/dist/ui/form/button/sd-modal-select-button.control.d.ts +1 -7
  74. package/dist/ui/form/button/sd-modal-select-button.control.d.ts.map +1 -1
  75. package/dist/ui/form/button/sd-modal-select-button.control.js +1 -1
  76. package/dist/ui/form/choice/sd-state-preset.control.js +1 -1
  77. package/dist/ui/form/select/sd-select.control.d.ts +1 -1
  78. package/dist/ui/form/select/sd-select.control.d.ts.map +1 -1
  79. package/dist/ui/form/select/sd-select.control.js +23 -27
  80. package/dist/ui/layout/sd-gap.control.d.ts +1 -2
  81. package/dist/ui/layout/sd-gap.control.d.ts.map +1 -1
  82. package/dist/ui/layout/sd-gap.control.js +22 -24
  83. package/dist/ui/navigation/menu-utils.d.ts +2 -7
  84. package/dist/ui/navigation/menu-utils.d.ts.map +1 -1
  85. package/dist/ui/overlay/busy/sd-busy-container.control.d.ts +1 -1
  86. package/dist/ui/overlay/busy/sd-busy-container.control.d.ts.map +1 -1
  87. package/dist/ui/overlay/busy/sd-busy-container.control.js +1 -1
  88. package/dist/ui/overlay/modal/sd-confirm-modal.control.d.ts.map +1 -1
  89. package/dist/ui/overlay/modal/sd-confirm-modal.control.js +29 -23
  90. package/dist/ui/overlay/modal/sd-modal.control.js +1 -1
  91. package/dist/ui/overlay/modal/sd-modal.provider.d.ts +0 -10
  92. package/dist/ui/overlay/modal/sd-modal.provider.d.ts.map +1 -1
  93. package/dist/ui/overlay/modal/sd-modal.provider.js +1 -13
  94. package/dist/ui/overlay/modal/sd-prompt-modal.control.d.ts.map +1 -1
  95. package/dist/ui/overlay/modal/sd-prompt-modal.control.js +40 -33
  96. package/dist/ui/overlay/toast/sd-toast.control.d.ts +1 -1
  97. package/dist/ui/overlay/toast/sd-toast.control.d.ts.map +1 -1
  98. package/package.json +5 -5
  99. package/src/core/provideSdAngular.ts +1 -1
  100. package/src/core/providers/sd-activated-modal.provider.ts +12 -0
  101. package/src/core/providers/sd-app-structure.provider.ts +2 -405
  102. package/src/core/providers/sd-app-structure.types.ts +60 -0
  103. package/src/core/providers/sd-app-structure.utils.ts +350 -0
  104. package/src/{ui/overlay/busy → core/providers}/sd-busy.provider.ts +1 -1
  105. package/src/core/providers/sd-print.provider.ts +1 -1
  106. package/src/core/providers/sd-service-client-factory.provider.ts +1 -1
  107. package/src/{ui/overlay/toast → core/providers}/sd-toast.provider.ts +4 -4
  108. package/src/core/types/select-modal-output-result.ts +7 -0
  109. package/src/core/utils/setups/setupCanDeactivate.ts +1 -1
  110. package/src/core/utils/useViewTitleSignal.ts +1 -1
  111. package/src/core/utils/useViewTypeSignal.ts +1 -1
  112. package/src/features/base/sd-base-container.control.ts +1 -1
  113. package/src/features/data-view/sd-data-detail.control.ts +1 -1
  114. package/src/features/data-view/sd-data-sheet.control.ts +117 -216
  115. package/src/features/data-view/sd-data-sheet.types.ts +18 -0
  116. package/src/{core/utils/setups → features/data-view}/setupCloserWhenSingleSelectionChange.ts +1 -1
  117. package/src/features/data-view/useDataSheetExcelManager.ts +57 -0
  118. package/src/features/data-view/useDataSheetFilterManager.ts +30 -0
  119. package/src/features/data-view/useDataSheetInlineEditManager.ts +89 -0
  120. package/src/features/data-view/useDataSheetModalEditManager.ts +76 -0
  121. package/src/features/data-view/useDataSheetRefreshManager.ts +90 -0
  122. package/src/features/permission-table/sd-permission-table.control.ts +1 -1
  123. package/src/index.ts +17 -11
  124. package/src/ui/data/sheet/sd-sheet-config.modal.ts +7 -11
  125. package/src/ui/data/sheet/sd-sheet.control.ts +50 -238
  126. package/src/ui/data/sheet/useSheetCellStyling.ts +113 -0
  127. package/src/ui/data/sheet/useSheetColumnResizing.ts +92 -0
  128. package/src/ui/data/sheet/useSheetDisplayPipeline.ts +64 -0
  129. package/src/ui/form/button/sd-modal-select-button.control.ts +1 -8
  130. package/src/ui/form/choice/sd-state-preset.control.ts +1 -1
  131. package/src/ui/form/select/sd-select.control.ts +21 -26
  132. package/src/ui/layout/sd-gap.control.ts +17 -21
  133. package/src/ui/navigation/menu-utils.ts +3 -7
  134. package/src/ui/overlay/busy/sd-busy-container.control.ts +1 -1
  135. package/src/ui/overlay/modal/sd-confirm-modal.control.ts +8 -26
  136. package/src/ui/overlay/modal/sd-modal.control.ts +1 -1
  137. package/src/ui/overlay/modal/sd-modal.provider.ts +1 -10
  138. package/src/ui/overlay/modal/sd-prompt-modal.control.ts +17 -43
  139. package/src/ui/overlay/toast/sd-toast.control.ts +1 -1
  140. package/dist/core/utils/setups/setupCloserWhenSingleSelectionChange.d.ts.map +0 -1
  141. package/dist/ui/overlay/busy/sd-busy.provider.d.ts.map +0 -1
  142. package/dist/ui/overlay/toast/sd-toast.provider.d.ts.map +0 -1
  143. /package/dist/{core/utils/setups → features/data-view}/setupCloserWhenSingleSelectionChange.js +0 -0
@@ -0,0 +1,76 @@
1
+ import {
2
+ type OutputEmitterRef,
3
+ type Signal,
4
+ type WritableSignal,
5
+ inject,
6
+ } from "@angular/core";
7
+ import { SdToastProvider } from "../../core/providers/sd-toast.provider";
8
+ import { withBusy } from "../../core/utils/withBusy";
9
+ import type { ISelectModalOutputResult } from "../../core/types/select-modal-output-result";
10
+
11
+ export function useDataSheetModalEditManager<TItem, TKey>(options: {
12
+ busyCount: WritableSignal<number>;
13
+ canEdit: () => boolean;
14
+ selectedItemKeys: Signal<TKey[]>;
15
+ selectedItems: Signal<TItem[]>;
16
+ close: OutputEmitterRef<ISelectModalOutputResult<TItem>>;
17
+ refresh: () => Promise<void>;
18
+ getEditItemFn: () =>
19
+ | ((item?: TItem) => Promise<boolean | undefined> | boolean | undefined)
20
+ | undefined;
21
+ getToggleDeleteItemsFn: () =>
22
+ | ((del: boolean) => Promise<boolean>)
23
+ | undefined;
24
+ errorMessageFn: (err: unknown) => string;
25
+ }) {
26
+ const sdToast = inject(SdToastProvider);
27
+
28
+ async function doEditItem(item?: TItem): Promise<void> {
29
+ const editItemFn = options.getEditItemFn();
30
+ if (!editItemFn) return;
31
+
32
+ const result = await editItemFn(item);
33
+ if (!result) return;
34
+
35
+ await withBusy(options.busyCount, () =>
36
+ sdToast.try(async () => {
37
+ await options.refresh();
38
+ }),
39
+ );
40
+ }
41
+
42
+ async function doToggleDeleteItems(del: boolean): Promise<void> {
43
+ if (!options.canEdit()) return;
44
+ const toggleDeleteItemsFn = options.getToggleDeleteItemsFn();
45
+ if (!toggleDeleteItemsFn) return;
46
+
47
+ await withBusy(options.busyCount, () =>
48
+ sdToast.try(
49
+ async () => {
50
+ const result = await toggleDeleteItemsFn(del);
51
+ if (!result) return;
52
+
53
+ await options.refresh();
54
+ sdToast.success(`${del ? "삭제" : "복구"} 되었습니다.`);
55
+ },
56
+ (err) => options.errorMessageFn(err),
57
+ ),
58
+ );
59
+ }
60
+
61
+ function doModalConfirm(): void {
62
+ options.close.emit({
63
+ selectedItemKeys: options.selectedItemKeys(),
64
+ selectedItems: options.selectedItems(),
65
+ });
66
+ }
67
+
68
+ function doModalCancel(): void {
69
+ options.close.emit({
70
+ selectedItemKeys: [],
71
+ selectedItems: [],
72
+ });
73
+ }
74
+
75
+ return { doEditItem, doToggleDeleteItems, doModalConfirm, doModalCancel };
76
+ }
@@ -0,0 +1,90 @@
1
+ import { type Signal, type WritableSignal, effect, inject } from "@angular/core";
2
+ import { type ArrayOneWayDiffResult, obj } from "@simplysm/core-common";
3
+ import { SdToastProvider } from "../../core/providers/sd-toast.provider";
4
+ import { SdSharedDataProvider } from "../../core/providers/sd-shared-data.provider";
5
+ import { withBusy } from "../../core/utils/withBusy";
6
+ import type { ISdDataSheetSearchResult } from "./sd-data-sheet.types";
7
+
8
+ export function useDataSheetRefreshManager<
9
+ TItem,
10
+ TKey extends string | number | undefined,
11
+ >(options: {
12
+ busyCount: WritableSignal<number>;
13
+ initialized: WritableSignal<boolean>;
14
+ canUse: () => boolean;
15
+ items: WritableSignal<TItem[]>;
16
+ selectedItems: WritableSignal<TItem[]>;
17
+ pageLength: WritableSignal<number>;
18
+ summaryData: WritableSignal<Partial<TItem>>;
19
+ page: Signal<number>;
20
+ lastFilter: Signal<unknown>;
21
+ sortingDefs: Signal<unknown[]>;
22
+ getItemInfoFn: (item: TItem) => { key: TKey };
23
+ search: (
24
+ usePagination: boolean,
25
+ ) => Promise<ISdDataSheetSearchResult<TItem>> | ISdDataSheetSearchResult<TItem>;
26
+ prepareRefreshEffect?: () => void;
27
+ getDiffsExcludes: () => string[] | undefined;
28
+ }) {
29
+ const sdToast = inject(SdToastProvider);
30
+ const sdSharedData = inject(SdSharedDataProvider);
31
+ let itemsSnapshot: TItem[] = [];
32
+
33
+ async function refresh(): Promise<void> {
34
+ const result = await options.search(true);
35
+ options.items.set(result.items);
36
+ itemsSnapshot = obj.clone(result.items);
37
+
38
+ options.pageLength.set(result.pageLength ?? 0);
39
+ options.summaryData.set(result.summary ?? {});
40
+
41
+ const selectedKeySet = new Set(
42
+ options.selectedItems().map((sel) => options.getItemInfoFn(sel).key),
43
+ );
44
+ options.selectedItems.set(
45
+ options.items().filter((item) => selectedKeySet.has(options.getItemInfoFn(item).key)),
46
+ );
47
+ }
48
+
49
+ function getDiffs(): ArrayOneWayDiffResult<TItem>[] {
50
+ const diffsExcludes = options.getDiffsExcludes();
51
+ return options
52
+ .items()
53
+ .oneWayDiffs(
54
+ itemsSnapshot,
55
+ (item) => options.getItemInfoFn(item).key,
56
+ diffsExcludes ? { excludes: diffsExcludes } : undefined,
57
+ )
58
+ .filter((d) => d.type !== "same");
59
+ }
60
+
61
+ effect((onCleanup) => {
62
+ options.page();
63
+ options.lastFilter();
64
+ options.sortingDefs();
65
+ options.prepareRefreshEffect?.();
66
+
67
+ let cancelled = false;
68
+ onCleanup(() => {
69
+ cancelled = true;
70
+ });
71
+
72
+ queueMicrotask(async () => {
73
+ if (cancelled) return;
74
+ if (!options.canUse()) {
75
+ options.initialized.set(true);
76
+ return;
77
+ }
78
+
79
+ await withBusy(options.busyCount, () =>
80
+ sdToast.try(async () => {
81
+ await sdSharedData.wait();
82
+ await refresh();
83
+ }),
84
+ );
85
+ options.initialized.set(true);
86
+ });
87
+ });
88
+
89
+ return { refresh, getDiffs };
90
+ }
@@ -10,7 +10,7 @@ import {
10
10
  ViewEncapsulation,
11
11
  } from "@angular/core";
12
12
  import { obj } from "@simplysm/core-common";
13
- import type { ISdPermission } from "../../core/providers/sd-app-structure.provider";
13
+ import type { ISdPermission } from "../../core/providers/sd-app-structure.types";
14
14
  import { SdCheckboxControl } from "../../ui/form/checkbox/sd-checkbox.control";
15
15
  import { SdCollapseIconControl } from "../../ui/navigation/collapse/sd-collapse-icon.control";
16
16
  import { SdTypedTemplateDirective } from "../../core/directives/sd-typed-template.directive";
package/src/index.ts CHANGED
@@ -32,14 +32,16 @@ export { SdAngularConfigProvider } from "./core/providers/sd-angular-config.prov
32
32
  export { SdSystemLogProvider } from "./core/providers/sd-system-log.provider";
33
33
  export {
34
34
  SdAppStructureProvider,
35
- SdAppStructureUtils,
36
35
  usePermsSignal,
37
- type TSdAppStructureItem,
38
- type ISdMenu,
39
- type ISdFlatMenu,
40
- type ISdPermission,
41
- type ISdFlatPermission,
42
36
  } from "./core/providers/sd-app-structure.provider";
37
+ export { SdAppStructureUtils } from "./core/providers/sd-app-structure.utils";
38
+ export type {
39
+ TSdAppStructureItem,
40
+ ISdMenu,
41
+ ISdFlatMenu,
42
+ ISdPermission,
43
+ ISdFlatPermission,
44
+ } from "./core/providers/sd-app-structure.types";
43
45
  export { SdFileDialogProvider } from "./core/providers/sd-file-dialog.provider";
44
46
  export { SdLocalStorageProvider } from "./core/providers/sd-local-storage.provider";
45
47
  export { SdSystemConfigProvider } from "./core/providers/sd-system-config.provider";
@@ -58,7 +60,7 @@ export { useViewTitleSignal } from "./core/utils/useViewTitleSignal";
58
60
  export { useViewTypeSignal, type TSdViewType } from "./core/utils/useViewTypeSignal";
59
61
  export { setupCanDeactivate } from "./core/utils/setups/setupCanDeactivate";
60
62
  export { setupCumulateSelectedKeys } from "./core/utils/setups/setupCumulateSelectedKeys";
61
- export { setupCloserWhenSingleSelectionChange } from "./core/utils/setups/setupCloserWhenSingleSelectionChange";
63
+ export { setupCloserWhenSingleSelectionChange } from "./features/data-view/setupCloserWhenSingleSelectionChange";
62
64
  export {
63
65
  useExpandingManager,
64
66
  type IExpandItemDef,
@@ -100,6 +102,7 @@ export {
100
102
  export { SdSharedDataSelectControl } from "./features/shared-data/sd-shared-data-select.control";
101
103
  export { SdSharedDataSelectButtonControl } from "./features/shared-data/sd-shared-data-select-button.control";
102
104
  export { SdSharedDataSelectListControl } from "./features/shared-data/sd-shared-data-select-list.control";
105
+ export { matchesSearchText } from "./features/shared-data/matchesSearchText";
103
106
 
104
107
  // ui/layout
105
108
  export { SdDockContainerControl } from "./ui/layout/dock/sd-dock-container.control";
@@ -125,9 +128,9 @@ export { SdAdditionalButtonControl } from "./ui/form/button/sd-additional-button
125
128
  export {
126
129
  SdModalSelectButtonControl,
127
130
  type ISdSelectModal,
128
- type ISelectModalOutputResult,
129
131
  type TSdSelectModalInfo,
130
132
  } from "./ui/form/button/sd-modal-select-button.control";
133
+ export type { ISelectModalOutputResult } from "./core/types/select-modal-output-result";
131
134
 
132
135
  // ui/form/input
133
136
  export { SdTextfieldControl } from "./ui/form/input/sd-textfield.control";
@@ -170,6 +173,9 @@ export { SdTabItemControl } from "./ui/navigation/tab/sd-tab-item.control";
170
173
  export { SdTabviewControl } from "./ui/navigation/tab/sd-tabview.control";
171
174
  export { SdTabviewItemControl } from "./ui/navigation/tab/sd-tabview-item.control";
172
175
 
176
+ // ui/navigation/menu
177
+ export { getMenuRouterLinkOption, getIsMenuSelected } from "./ui/navigation/menu-utils";
178
+
173
179
  // ui/navigation/pagination
174
180
  export { SdPaginationControl } from "./ui/navigation/pagination/sd-pagination.control";
175
181
 
@@ -223,11 +229,11 @@ export { SdDropdownPopupControl } from "./ui/overlay/dropdown/sd-dropdown-popup.
223
229
  export { SdModalControl } from "./ui/overlay/modal/sd-modal.control";
224
230
  export {
225
231
  SdModalProvider,
226
- SdActivatedModalProvider,
227
232
  type ISdModal,
228
233
  type ISdModalInfo,
229
234
  type ISdModalOptions,
230
235
  } from "./ui/overlay/modal/sd-modal.provider";
236
+ export { SdActivatedModalProvider } from "./core/providers/sd-activated-modal.provider";
231
237
  export { SdPromptModalControl } from "./ui/overlay/modal/sd-prompt-modal.control";
232
238
  export { SdConfirmModalControl } from "./ui/overlay/modal/sd-confirm-modal.control";
233
239
 
@@ -240,14 +246,14 @@ export {
240
246
  type TSdToastTheme,
241
247
  type ISdToast,
242
248
  type ISdToastInput,
243
- } from "./ui/overlay/toast/sd-toast.provider";
249
+ } from "./core/providers/sd-toast.provider";
244
250
 
245
251
  // ui/overlay/busy
246
252
  export { SdBusyContainerControl } from "./ui/overlay/busy/sd-busy-container.control";
247
253
  export {
248
254
  SdBusyProvider,
249
255
  type TSdBusyType,
250
- } from "./ui/overlay/busy/sd-busy.provider";
256
+ } from "./core/providers/sd-busy.provider";
251
257
 
252
258
  // core/providers (integration)
253
259
  export {
@@ -3,6 +3,7 @@ import {
3
3
  Component,
4
4
  computed,
5
5
  input,
6
+ linkedSignal,
6
7
  output,
7
8
  signal,
8
9
  ViewEncapsulation,
@@ -28,7 +29,6 @@ interface IConfigItem {
28
29
  selector: "sd-sheet-config-modal",
29
30
  changeDetection: ChangeDetectionStrategy.OnPush,
30
31
  encapsulation: ViewEncapsulation.None,
31
- standalone: true,
32
32
  imports: [SdButtonControl, SdCheckboxControl, NgIcon],
33
33
  template: `
34
34
  <div class="_sd-sheet-config-modal">
@@ -168,29 +168,25 @@ export class SdSheetConfigModal implements ISdModal<ISdSheetConfig | undefined>
168
168
  .sort((a, b) => a.ordering - b.ordering);
169
169
  });
170
170
 
171
- private readonly _editItems = signal<IConfigItem[] | undefined>(undefined);
172
-
173
- _items = computed((): IConfigItem[] => {
174
- return this._editItems() ?? this._initialItems();
175
- });
171
+ _items = linkedSignal<IConfigItem[]>(() => this._initialItems());
176
172
 
177
173
  onFixedToggle(idx: number): void {
178
174
  const items = [...this._items()];
179
175
  items[idx] = { ...items[idx], fixed: !items[idx].fixed };
180
- this._editItems.set(items);
176
+ this._items.set(items);
181
177
  }
182
178
 
183
179
  onHiddenToggle(idx: number): void {
184
180
  const items = [...this._items()];
185
181
  items[idx] = { ...items[idx], hidden: !items[idx].hidden };
186
- this._editItems.set(items);
182
+ this._items.set(items);
187
183
  }
188
184
 
189
185
  onWidthChange(idx: number, event: Event): void {
190
186
  const inputEl = event.target as HTMLInputElement;
191
187
  const items = [...this._items()];
192
188
  items[idx] = { ...items[idx], width: inputEl.value };
193
- this._editItems.set(items);
189
+ this._items.set(items);
194
190
  }
195
191
 
196
192
  canMoveUp(idx: number): boolean {
@@ -217,14 +213,14 @@ export class SdSheetConfigModal implements ISdModal<ISdSheetConfig | undefined>
217
213
  if (!this.canMoveUp(idx)) return;
218
214
  const items = [...this._items()];
219
215
  [items[idx - 1], items[idx]] = [items[idx], items[idx - 1]];
220
- this._editItems.set(items);
216
+ this._items.set(items);
221
217
  }
222
218
 
223
219
  onMoveDown(idx: number): void {
224
220
  if (!this.canMoveDown(idx)) return;
225
221
  const items = [...this._items()];
226
222
  [items[idx], items[idx + 1]] = [items[idx + 1], items[idx]];
227
- this._editItems.set(items);
223
+ this._items.set(items);
228
224
  }
229
225
 
230
226
  onOk(): void {