@simplysm/angular 14.0.37 → 14.0.38

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 (55) hide show
  1. package/dist/controls/dropdown/sd-dropdown.js +8 -8
  2. package/dist/controls/input/{sd-date-range.picker.d.ts → sd-date-range-picker.d.ts} +1 -1
  3. package/dist/controls/input/{sd-date-range.picker.d.ts.map → sd-date-range-picker.d.ts.map} +1 -1
  4. package/dist/controls/input/{sd-date-range.picker.js → sd-date-range-picker.js} +1 -1
  5. package/dist/core/modal/sd-activated-modal.provider.d.ts +1 -1
  6. package/dist/core/modal/sd-activated-modal.provider.d.ts.map +1 -1
  7. package/dist/core/modal/sd-activated-modal.provider.js +1 -1
  8. package/dist/core/modal/sd-modal.js +1 -1
  9. package/dist/core/modal/sd-modal.provider.d.ts.map +1 -1
  10. package/dist/core/modal/sd-modal.provider.js +13 -5
  11. package/dist/core/routing/setupCanDeactivate.js +1 -1
  12. package/dist/core/selection/useSelectionManager.d.ts.map +1 -1
  13. package/dist/core/selection/useSelectionManager.js +4 -3
  14. package/dist/data/data-detail/sd-data-detail.base.d.ts.map +1 -1
  15. package/dist/data/data-detail/sd-data-detail.base.js +7 -1
  16. package/dist/data/data-sheet/injectDataSheetExcelManager.js +1 -1
  17. package/dist/data/data-sheet/injectDataSheetModalEditManager.js +1 -1
  18. package/dist/data/data-sheet/sd-data-sheet.base.d.ts +1 -1
  19. package/dist/data/data-sheet/sd-data-sheet.base.d.ts.map +1 -1
  20. package/dist/data/data-sheet/sd-data-sheet.base.js +1 -1
  21. package/dist/data/shared-data/sd-shared-data-select.d.ts +1 -0
  22. package/dist/data/shared-data/sd-shared-data-select.d.ts.map +1 -1
  23. package/dist/data/shared-data/sd-shared-data-select.js +15 -7
  24. package/dist/data/sheet/injectSheetColumnResizing.d.ts.map +1 -1
  25. package/dist/data/sheet/injectSheetColumnResizing.js +1 -0
  26. package/dist/data/state-preset/sd-state-preset.d.ts.map +1 -1
  27. package/dist/data/state-preset/sd-state-preset.js +4 -0
  28. package/dist/features/address/sd-address-search.modal.d.ts +2 -1
  29. package/dist/features/address/sd-address-search.modal.d.ts.map +1 -1
  30. package/dist/features/address/sd-address-search.modal.js +69 -23
  31. package/dist/features/visual/sd-barcode.d.ts.map +1 -1
  32. package/dist/features/visual/sd-barcode.js +10 -5
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +1 -1
  35. package/dist/layout/dock/sd-dock.d.ts.map +1 -1
  36. package/dist/layout/dock/sd-dock.js +1 -0
  37. package/package.json +7 -7
  38. package/src/controls/dropdown/sd-dropdown.ts +8 -8
  39. package/src/core/modal/sd-activated-modal.provider.ts +1 -1
  40. package/src/core/modal/sd-modal.provider.ts +12 -5
  41. package/src/core/modal/sd-modal.ts +1 -1
  42. package/src/core/routing/setupCanDeactivate.ts +1 -1
  43. package/src/core/selection/useSelectionManager.ts +5 -3
  44. package/src/data/data-detail/sd-data-detail.base.ts +8 -1
  45. package/src/data/data-sheet/injectDataSheetExcelManager.ts +1 -1
  46. package/src/data/data-sheet/injectDataSheetModalEditManager.ts +1 -1
  47. package/src/data/data-sheet/sd-data-sheet.base.ts +1 -1
  48. package/src/data/shared-data/sd-shared-data-select.ts +24 -13
  49. package/src/data/sheet/injectSheetColumnResizing.ts +2 -0
  50. package/src/data/state-preset/sd-state-preset.ts +6 -0
  51. package/src/features/address/sd-address-search.modal.ts +75 -31
  52. package/src/features/visual/sd-barcode.ts +9 -5
  53. package/src/index.ts +1 -1
  54. package/src/layout/dock/sd-dock.ts +2 -0
  55. /package/src/controls/input/{sd-date-range.picker.ts → sd-date-range-picker.ts} +0 -0
@@ -152,18 +152,18 @@ export class SdDropdown {
152
152
  return;
153
153
  contentEl.repaint();
154
154
  const rect = contentEl.getBoundingClientRect();
155
- const isPlaceBottom = window.innerHeight < rect.top * 2;
156
- const isPlaceRight = window.innerWidth < rect.left * 2;
155
+ const shouldPlaceAbove = window.innerHeight < rect.top * 2;
156
+ const shouldPlaceLeft = window.innerWidth < rect.left * 2;
157
157
  const gap = 2;
158
- const topPos = isPlaceBottom ? undefined : rect.bottom + gap;
159
- const bottomPos = isPlaceBottom ? window.innerHeight - rect.top : undefined;
160
- const leftPos = isPlaceRight ? undefined : rect.left;
161
- const rightPos = isPlaceRight ? window.innerWidth - rect.right : undefined;
158
+ const topPos = shouldPlaceAbove ? undefined : rect.bottom + gap;
159
+ const bottomPos = shouldPlaceAbove ? window.innerHeight - rect.top : undefined;
160
+ const leftPos = shouldPlaceLeft ? undefined : rect.left;
161
+ const rightPos = shouldPlaceLeft ? window.innerWidth - rect.right : undefined;
162
162
  // Calculate available space for popup
163
- const availableHeight = isPlaceBottom
163
+ const availableHeight = shouldPlaceAbove
164
164
  ? rect.top - gap
165
165
  : window.innerHeight - rect.bottom - gap;
166
- const availableWidth = isPlaceRight ? rect.right : window.innerWidth - rect.left;
166
+ const availableWidth = shouldPlaceLeft ? rect.right : window.innerWidth - rect.left;
167
167
  Object.assign(popupEl.style, {
168
168
  top: topPos !== undefined ? topPos + "px" : "",
169
169
  bottom: bottomPos !== undefined ? bottomPos + "px" : "",
@@ -10,4 +10,4 @@ export declare class SdDateRangePicker {
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<SdDateRangePicker, never>;
11
11
  static ɵcmp: i0.ɵɵComponentDeclaration<SdDateRangePicker, "sd-date-range-picker", never, { "periodType": { "alias": "periodType"; "required": false; "isSignal": true; }; "from": { "alias": "from"; "required": false; "isSignal": true; }; "to": { "alias": "to"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, { "periodType": "periodTypeChange"; "from": "fromChange"; "to": "toChange"; }, never, never, true, never>;
12
12
  }
13
- //# sourceMappingURL=sd-date-range.picker.d.ts.map
13
+ //# sourceMappingURL=sd-date-range-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sd-date-range.picker.d.ts","sourceRoot":"","sources":["../../../src/controls/input/sd-date-range.picker.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;;AAEjD,qBA+Ca,iBAAiB;IAC5B,UAAU,wDAAiC;IAC3C,IAAI,4DAAqB;IACzB,EAAE,4DAAqB;IAEvB,QAAQ,qEAAiD;IAEzD,2BAA2B,IAAI,IAAI;IAenC,qBAAqB,IAAI,IAAI;yCAtBlB,iBAAiB;2CAAjB,iBAAiB;CA2C7B"}
1
+ {"version":3,"file":"sd-date-range-picker.d.ts","sourceRoot":"","sources":["../../../src/controls/input/sd-date-range-picker.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;;AAEjD,qBA+Ca,iBAAiB;IAC5B,UAAU,wDAAiC;IAC3C,IAAI,4DAAqB;IACzB,EAAE,4DAAqB;IAEvB,QAAQ,qEAAiD;IAEzD,2BAA2B,IAAI,IAAI;IAenC,qBAAqB,IAAI,IAAI;yCAtBlB,iBAAiB;2CAAjB,iBAAiB;CA2C7B"}
@@ -130,4 +130,4 @@ export class SdDateRangePicker {
130
130
  }
131
131
  `, styles: ["sd-date-range-picker {\n display: flex;\n align-items: center;\n flex-direction: row;\n gap: var(--gap-sm);\n}\n@supports not (appearance: auto) {\n sd-date-range-picker {\n gap: 0;\n }\n sd-date-range-picker > * + * {\n margin-left: var(--gap-sm);\n }\n sd-date-range-picker.gap-xxs {\n gap: 0;\n }\n sd-date-range-picker.gap-xxs > * + * {\n margin-left: var(--gap-xxs);\n }\n sd-date-range-picker.gap-xs {\n gap: 0;\n }\n sd-date-range-picker.gap-xs > * + * {\n margin-left: var(--gap-xs);\n }\n sd-date-range-picker.gap-sm {\n gap: 0;\n }\n sd-date-range-picker.gap-sm > * + * {\n margin-left: var(--gap-sm);\n }\n sd-date-range-picker.gap-default {\n gap: 0;\n }\n sd-date-range-picker.gap-default > * + * {\n margin-left: var(--gap-default);\n }\n sd-date-range-picker.gap-lg {\n gap: 0;\n }\n sd-date-range-picker.gap-lg > * + * {\n margin-left: var(--gap-lg);\n }\n sd-date-range-picker.gap-xl {\n gap: 0;\n }\n sd-date-range-picker.gap-xl > * + * {\n margin-left: var(--gap-xl);\n }\n sd-date-range-picker.gap-xxl {\n gap: 0;\n }\n sd-date-range-picker.gap-xxl > * + * {\n margin-left: var(--gap-xxl);\n }\n sd-date-range-picker.gap-0 {\n gap: 0;\n }\n sd-date-range-picker.gap-0 > * + * {\n margin-left: var(--gap-0);\n }\n sd-date-range-picker.gap-auto {\n gap: 0;\n }\n sd-date-range-picker.gap-auto > * + * {\n margin-left: var(--gap-auto);\n }\n}"] }]
132
132
  }], null, { periodType: [{ type: i0.Input, args: [{ isSignal: true, alias: "periodType", required: false }] }, { type: i0.Output, args: ["periodTypeChange"] }], from: [{ type: i0.Input, args: [{ isSignal: true, alias: "from", required: false }] }, { type: i0.Output, args: ["fromChange"] }], to: [{ type: i0.Input, args: [{ isSignal: true, alias: "to", required: false }] }, { type: i0.Output, args: ["toChange"] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }] }); })();
133
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SdDateRangePicker, { className: "SdDateRangePicker", filePath: "packages/angular/src/controls/input/sd-date-range.picker.ts", lineNumber: 62, forbidOrphanRendering: true }); })();
133
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SdDateRangePicker, { className: "SdDateRangePicker", filePath: "packages/angular/src/controls/input/sd-date-range-picker.ts", lineNumber: 62, forbidOrphanRendering: true }); })();
@@ -6,7 +6,7 @@ import * as i0 from "@angular/core";
6
6
  export declare class SdActivatedModalProvider<T extends SdModalContentDef<any> = SdModalContentDef<any>> {
7
7
  modalComponent: import("@angular/core").WritableSignal<any>;
8
8
  contentComponent: import("@angular/core").WritableSignal<T | undefined>;
9
- canDeactiveFn: () => boolean;
9
+ canDeactivateFn: () => boolean;
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<SdActivatedModalProvider<any>, never>;
11
11
  static ɵprov: i0.ɵɵInjectableDeclaration<SdActivatedModalProvider<any>>;
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sd-activated-modal.provider.d.ts","sourceRoot":"","sources":["../../../src/core/modal/sd-activated-modal.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;;AAE7D;;GAEG;AACH,qBACa,wBAAwB,CAAC,CAAC,SAAS,iBAAiB,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC;IAC7F,cAAc,8CAA0B;IACxC,gBAAgB,wDAAoC;IACpD,aAAa,EAAE,MAAM,OAAO,CAAc;yCAH/B,wBAAwB;6CAAxB,wBAAwB;CAIpC"}
1
+ {"version":3,"file":"sd-activated-modal.provider.d.ts","sourceRoot":"","sources":["../../../src/core/modal/sd-activated-modal.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;;AAE7D;;GAEG;AACH,qBACa,wBAAwB,CAAC,CAAC,SAAS,iBAAiB,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC;IAC7F,cAAc,8CAA0B;IACxC,gBAAgB,wDAAoC;IACpD,eAAe,EAAE,MAAM,OAAO,CAAc;yCAHjC,wBAAwB;6CAAxB,wBAAwB;CAIpC"}
@@ -6,7 +6,7 @@ import * as i0 from "@angular/core";
6
6
  export class SdActivatedModalProvider {
7
7
  modalComponent = signal(undefined, ...(ngDevMode ? [{ debugName: "modalComponent" }] : /* istanbul ignore next */ []));
8
8
  contentComponent = signal(undefined, ...(ngDevMode ? [{ debugName: "contentComponent" }] : /* istanbul ignore next */ []));
9
- canDeactiveFn = () => true;
9
+ canDeactivateFn = () => true;
10
10
  static ɵfac = function SdActivatedModalProvider_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdActivatedModalProvider)(); };
11
11
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SdActivatedModalProvider, factory: SdActivatedModalProvider.ɵfac });
12
12
  }
@@ -174,7 +174,7 @@ export class SdModal {
174
174
  this._bringToFront();
175
175
  }
176
176
  _requestClose() {
177
- if (this._activatedModal !== null && !this._activatedModal.canDeactiveFn()) {
177
+ if (this._activatedModal !== null && !this._activatedModal.canDeactivateFn()) {
178
178
  return;
179
179
  }
180
180
  void this._saveConfig();
@@ -1 +1 @@
1
- {"version":3,"file":"sd-modal.provider.d.ts","sourceRoot":"","sources":["../../../src/core/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,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAGpC,OAAO,wBAAwB,CAAC;;AAEhC;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,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;IAChC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,KAAK,kBAAkB,GAAG,aAAa,GAAG,OAAO,GAAG,cAAc,GAAG,sBAAsB,CAAC;AAC5F,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GACrF,CAAC,GACD,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,GAAG,EAAE;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,MAAM,EAAE,YAAY,CAClB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC,EACtD,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC,CACtF,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,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,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,iBAAiB,CAAC,GAAG,CAAC,EAC9C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAmJzD,OAAO,CAAC,aAAa;yCA7JV,eAAe;6CAAf,eAAe;CAwK3B"}
1
+ {"version":3,"file":"sd-modal.provider.d.ts","sourceRoot":"","sources":["../../../src/core/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,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAGpC,OAAO,wBAAwB,CAAC;;AAEhC;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,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;IAChC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,KAAK,kBAAkB,GAAG,aAAa,GAAG,OAAO,GAAG,cAAc,GAAG,sBAAsB,CAAC;AAC5F,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC,SAAS,MAAM,CAAA;CAAE,GACrF,CAAC,GACD,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,GAAG,EAAE;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,MAAM,EAAE,YAAY,CAClB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC,EACtD,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC,CACtF,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,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,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,iBAAiB,CAAC,GAAG,CAAC,EAC9C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IA0JzD,OAAO,CAAC,aAAa;yCApKV,eAAe;6CAAf,eAAe;CA+K3B"}
@@ -14,7 +14,7 @@ export class SdModalProvider {
14
14
  _injector = inject(Injector);
15
15
  modalCount = signal(0, ...(ngDevMode ? [{ debugName: "modalCount" }] : /* istanbul ignore next */ []));
16
16
  async showAsync(modal, options) {
17
- return new Promise((resolve) => {
17
+ return new Promise((resolve, reject) => {
18
18
  // 1. modalCount 증가
19
19
  this.modalCount.update((v) => v + 1);
20
20
  // 2. SdActivatedModalProvider 인스턴스 생성
@@ -24,10 +24,18 @@ export class SdModalProvider {
24
24
  providers: [{ provide: SdActivatedModalProvider, useValue: activatedModal }],
25
25
  parent: this._injector,
26
26
  });
27
- const contentRef = createComponent(modal.type, {
28
- environmentInjector: this._envInjector,
29
- elementInjector: contentInjector,
30
- });
27
+ let contentRef;
28
+ try {
29
+ contentRef = createComponent(modal.type, {
30
+ environmentInjector: this._envInjector,
31
+ elementInjector: contentInjector,
32
+ });
33
+ }
34
+ catch (err) {
35
+ this.modalCount.update((v) => v - 1);
36
+ reject(err);
37
+ return;
38
+ }
31
39
  // 4. setInput으로 inputs 바인딩
32
40
  for (const [key, value] of Object.entries(modal.inputs)) {
33
41
  contentRef.setInput(key, value);
@@ -6,7 +6,7 @@ export function setupCanDeactivate(fn) {
6
6
  const activatedRoute = inject(ActivatedRoute, { optional: true });
7
7
  const elRef = inject(ElementRef);
8
8
  if (activatedModal != null) {
9
- activatedModal.canDeactiveFn = fn;
9
+ activatedModal.canDeactivateFn = fn;
10
10
  return;
11
11
  }
12
12
  if (activatedRoute) {
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectionManager.d.ts","sourceRoot":"","sources":["../../../src/core/selection/useSelectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE3E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE;IAC9C,YAAY,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1B,aAAa,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IACnD,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;CAC1E,GAAG;IACF,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,aAAa,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAClD,cAAc,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,SAAS,IAAI,IAAI,CAAC;IAClB,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC;CAC9B,CAsFA"}
1
+ {"version":3,"file":"useSelectionManager.d.ts","sourceRoot":"","sources":["../../../src/core/selection/useSelectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE3E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE;IAC9C,YAAY,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1B,aAAa,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IACnD,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;CAC1E,GAAG;IACF,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,aAAa,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAClD,cAAc,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,SAAS,IAAI,IAAI,CAAC;IAClB,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC;CAC9B,CAwFA"}
@@ -9,12 +9,13 @@ export function useSelectionManager(options) {
9
9
  const hasSelectable = computed(() => {
10
10
  return options.selectMode() != null;
11
11
  }, ...(ngDevMode ? [{ debugName: "hasSelectable" }] : /* istanbul ignore next */ []));
12
+ const selectedItemsSet = computed(() => new Set(options.selectedItems()), ...(ngDevMode ? [{ debugName: "selectedItemsSet" }] : /* istanbul ignore next */ []));
12
13
  const isAllSelected = computed(() => {
13
14
  const items = selectableItems();
14
15
  if (items.length === 0)
15
16
  return false;
16
- const selectedSet = new Set(options.selectedItems());
17
- return items.every((item) => selectedSet.has(item));
17
+ const set = selectedItemsSet();
18
+ return items.every((item) => set.has(item));
18
19
  }, ...(ngDevMode ? [{ debugName: "isAllSelected" }] : /* istanbul ignore next */ []));
19
20
  function getSelectable(item) {
20
21
  const mode = options.selectMode();
@@ -73,7 +74,7 @@ export function useSelectionManager(options) {
73
74
  }
74
75
  }
75
76
  function isSelected(item) {
76
- return options.selectedItems().includes(item);
77
+ return selectedItemsSet().has(item);
77
78
  }
78
79
  return {
79
80
  hasSelectable,
@@ -1 +1 @@
1
- {"version":3,"file":"sd-data-detail.base.d.ts","sourceRoot":"","sources":["../../../src/data/data-detail/sd-data-detail.base.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,MAAM,EACX,WAAW,EACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAO,MAAM,uBAAuB,CAAC;AAMtD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;;AAG5E,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,8BACsB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,CAClE,YAAW,iBAAiB,CAAC,CAAC,CAAC;IAI/B,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,oBAAoB,CAAA;KAAE,CAAC,GAChD;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,oBAAoB,CAAA;KAAE;IAE3C,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,qCAAoC;IAE5C,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,2EAAuD;IAE/D,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,gBAAgB;2CAAhB,gBAAgB;CA4JrC"}
1
+ {"version":3,"file":"sd-data-detail.base.d.ts","sourceRoot":"","sources":["../../../src/data/data-detail/sd-data-detail.base.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,MAAM,EACX,WAAW,EACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAO,MAAM,uBAAuB,CAAC;AAMtD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;;AAG5E,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,8BACsB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,CAClE,YAAW,iBAAiB,CAAC,CAAC,CAAC;IAI/B,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,oBAAoB,CAAA;KAAE,CAAC,GAChD;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,oBAAoB,CAAA;KAAE;IAE3C,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,qCAAoC;IAE5C,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,2EAAuD;IAE/D,OAAO,CAAC,aAAa,CAAC,CAAI;;IAgC1B,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;yCAzJpB,gBAAgB;2CAAhB,gBAAgB;CAmKrC"}
@@ -23,9 +23,15 @@ export class SdDataDetailBase {
23
23
  dataInfo = signal(undefined, ...(ngDevMode ? [{ debugName: "dataInfo" }] : /* istanbul ignore next */ []));
24
24
  _dataSnapshot;
25
25
  constructor() {
26
- effect(() => {
26
+ effect((onCleanup) => {
27
27
  this.prepareRefreshEffect?.();
28
+ let cancelled = false;
29
+ onCleanup(() => {
30
+ cancelled = true;
31
+ });
28
32
  queueMicrotask(async () => {
33
+ if (cancelled)
34
+ return;
29
35
  if (!this.canUse()) {
30
36
  this.initialized.set(true);
31
37
  return;
@@ -24,7 +24,7 @@ export function injectDataSheetExcelManager(options) {
24
24
  await withBusy(options.busyCount, () => sdToast.try(async () => {
25
25
  await uploadExcelFn(file);
26
26
  await options.refresh();
27
- sdToast.success("엑셀 업로드가 완료 되었습니다.");
27
+ sdToast.success("엑셀 업로드가 완료되었습니다.");
28
28
  }, (err) => options.errorMessageFn(err)));
29
29
  }
30
30
  return { doDownloadExcel, doUploadExcel };
@@ -25,7 +25,7 @@ export function injectDataSheetModalEditManager(options) {
25
25
  if (!result)
26
26
  return;
27
27
  await options.refresh();
28
- sdToast.success(`${del ? "삭제" : "복구"} 되었습니다.`);
28
+ sdToast.success(`${del ? "삭제" : "복구"}되었습니다.`);
29
29
  }, (err) => options.errorMessageFn(err)));
30
30
  }
31
31
  function doModalConfirm() {
@@ -29,7 +29,7 @@ export declare abstract class SdDataSheetBase<TFilter extends Record<string, any
29
29
  private readonly _inlineEditMgr;
30
30
  private readonly _modalEditMgr;
31
31
  private readonly _excelMgr;
32
- key: string | undefined;
32
+ key: string;
33
33
  viewType: Signal<import("../..").SdViewType>;
34
34
  busyCount: WritableSignal<number>;
35
35
  busyMessage: WritableSignal<string | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"sd-data-sheet.base.d.ts","sourceRoot":"","sources":["../../../src/data/data-sheet/sd-data-sheet.base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-data-sheet.base.d.ts","sourceRoot":"","sources":["../../../src/data/data-sheet/sd-data-sheet.base.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ export class SdDataSheetBase {
21
21
  _modalEditMgr;
22
22
  _excelMgr;
23
23
  //-- shared state (D1: class 소유)
24
- key = reflectComponentType(this.constructor)?.selector;
24
+ key = reflectComponentType(this.constructor)?.selector ?? this.constructor.name;
25
25
  viewType = injectViewTypeSignal(() => this);
26
26
  busyCount = signal(0, ...(ngDevMode ? [{ debugName: "busyCount" }] : /* istanbul ignore next */ []));
27
27
  busyMessage = signal(undefined, ...(ngDevMode ? [{ debugName: "busyMessage" }] : /* istanbul ignore next */ []));
@@ -39,6 +39,7 @@ export declare class SdSharedDataSelect<TItem extends SharedDataBase<string | nu
39
39
  getItemSelectable(item: TItem, _index: number, depth: number): boolean;
40
40
  getItemVisible(item: TItem, index: number): boolean;
41
41
  isIncludeSearchText(item: TItem, _index: number): boolean;
42
+ private readonly _sortedChildrenMap;
42
43
  getChildren: (item: SharedDataBase<string | number>) => TItem[];
43
44
  onUndefinedClick(): void;
44
45
  onModalButtonClick(event: MouseEvent): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"sd-shared-data-select.d.ts","sourceRoot":"","sources":["../../../src/data/shared-data/sd-shared-data-select.ts"],"names":[],"mappings":"AACA,OAAO,EAWL,WAAW,EAIZ,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AACrF,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIjF,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAClB,MAAM,8CAA8C,CAAC;;AAKtD,qBAwGa,kBAAkB,CAC7B,KAAK,SAAS,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,EAC7C,KAAK,SAAS,MAAM,eAAe,CAAC,KAAK,CAAC,EAC1C,MAAM,SAAS,aAAa,CAAC,GAAG,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IAEnD,KAAK,2GAAoE;IAEzE,KAAK,+CAA6B;IAElC,QAAQ,qEAAiD;IACzD,QAAQ,qEAAiD;IACzD,YAAY,qEAAiD;IAC7D,KAAK,qEAAiD;IACtD,MAAM,qEAAiD;IAEvD,IAAI,+DAAwB;IAC5B,UAAU,6CAA4B;IACtC,QAAQ,8CAAgB,KAAK,SAAS,MAAM,aAAa,GAAG,EAAE,KAAK,OAAO,eAAI;IAC9E,cAAc,yDAAkB;IAEhC,KAAK,6EAAsC;IAC3C,SAAS,+FAAoD;IAE7D,WAAW,0DAAmB;IAC9B,8BAA8B,8DAAuB;IACrD,aAAa,6CAAgB,KAAK,SAAS,MAAM,KAAK,OAAO,EAE3D;IACF,eAAe,6CAAgB,KAAK,SAAS,MAAM,KAAK,MAAM,EAE5D;IACF,mBAAmB,0DAAmB;IAEtC,UAAU,0FAGR;IACF,eAAe,gEAEZ;IAEH,UAAU,6DAAyC;IAEnD,cAAc,0CAA+D;IAE7E,YAAY,0CAEV;IAEF,kBAAkB,4FAcf;IAEH,gBAAgB,0CAyBb;IAEH,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAsCnC;IAEH,YAAY,wCAKT;;IAgBH,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAMtE,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAcnD,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAIzD,WAAW,GAAI,MAAM,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,KAAG,KAAK,EAAE,CAiB5D;IAEF,gBAAgB,IAAI,IAAI;IAIlB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpD,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9D,SAAS,CAAC,QAAQ,CAAC,YAAY,yXAAgB;IAC/C,SAAS,CAAC,QAAQ,CAAC,UAAU,geAAc;yCA/OhC,kBAAkB;2CAAlB,kBAAkB;CAgP9B"}
1
+ {"version":3,"file":"sd-shared-data-select.d.ts","sourceRoot":"","sources":["../../../src/data/shared-data/sd-shared-data-select.ts"],"names":[],"mappings":"AACA,OAAO,EAWL,WAAW,EAIZ,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AACrF,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIjF,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAClB,MAAM,8CAA8C,CAAC;;AAKtD,qBAwGa,kBAAkB,CAC7B,KAAK,SAAS,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,EAC7C,KAAK,SAAS,MAAM,eAAe,CAAC,KAAK,CAAC,EAC1C,MAAM,SAAS,aAAa,CAAC,GAAG,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuB;IAEnD,KAAK,2GAAoE;IAEzE,KAAK,+CAA6B;IAElC,QAAQ,qEAAiD;IACzD,QAAQ,qEAAiD;IACzD,YAAY,qEAAiD;IAC7D,KAAK,qEAAiD;IACtD,MAAM,qEAAiD;IAEvD,IAAI,+DAAwB;IAC5B,UAAU,6CAA4B;IACtC,QAAQ,8CAAgB,KAAK,SAAS,MAAM,aAAa,GAAG,EAAE,KAAK,OAAO,eAAI;IAC9E,cAAc,yDAAkB;IAEhC,KAAK,6EAAsC;IAC3C,SAAS,+FAAoD;IAE7D,WAAW,0DAAmB;IAC9B,8BAA8B,8DAAuB;IACrD,aAAa,6CAAgB,KAAK,SAAS,MAAM,KAAK,OAAO,EAE3D;IACF,eAAe,6CAAgB,KAAK,SAAS,MAAM,KAAK,MAAM,EAE5D;IACF,mBAAmB,0DAAmB;IAEtC,UAAU,0FAGR;IACF,eAAe,gEAEZ;IAEH,UAAU,6DAAyC;IAEnD,cAAc,0CAA+D;IAE7E,YAAY,0CAEV;IAEF,kBAAkB,4FAcf;IAEH,gBAAgB,0CAyBb;IAEH,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAsCnC;IAEH,YAAY,wCAKT;;IAgBH,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAMtE,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAcnD,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAIzD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAqBhC;IAEH,WAAW,GAAI,MAAM,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,KAAG,KAAK,EAAE,CAK5D;IAEF,gBAAgB,IAAI,IAAI;IAIlB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpD,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9D,SAAS,CAAC,QAAQ,CAAC,YAAY,yXAAgB;IAC/C,SAAS,CAAC,QAAQ,CAAC,UAAU,geAAc;yCA1PhC,kBAAkB;2CAAlB,kBAAkB;CA2P9B"}
@@ -245,12 +245,16 @@ export class SdSharedDataSelect {
245
245
  isIncludeSearchText(item, _index) {
246
246
  return this._searchTextMatchCache().get(item.__valueKey) ?? false;
247
247
  }
248
- getChildren = (item) => {
249
- let result = this.itemByParentKeyMap()?.get(item.__valueKey) ??
250
- [];
248
+ _sortedChildrenMap = computed(() => {
249
+ const parentMap = this.itemByParentKeyMap();
250
+ if (parentMap == null)
251
+ return undefined;
251
252
  const orderProp = this.displayOrderKeyProp();
252
- if (orderProp != null) {
253
- result = [...result].sort((a, b) => {
253
+ if (orderProp == null)
254
+ return parentMap;
255
+ const sorted = new Map();
256
+ for (const [key, children] of parentMap) {
257
+ sorted.set(key, [...children].sort((a, b) => {
254
258
  const aVal = a[orderProp];
255
259
  const bVal = b[orderProp];
256
260
  if (aVal < bVal)
@@ -258,9 +262,13 @@ export class SdSharedDataSelect {
258
262
  if (aVal > bVal)
259
263
  return 1;
260
264
  return 0;
261
- });
265
+ }));
262
266
  }
263
- return result;
267
+ return sorted;
268
+ }, ...(ngDevMode ? [{ debugName: "_sortedChildrenMap" }] : /* istanbul ignore next */ []));
269
+ getChildren = (item) => {
270
+ return (this._sortedChildrenMap()?.get(item.__valueKey) ??
271
+ []);
264
272
  };
265
273
  onUndefinedClick() {
266
274
  this.value.set(undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"injectSheetColumnResizing.d.ts","sourceRoot":"","sources":["../../../src/data/sheet/injectSheetColumnResizing.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,WAAW,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;IACvD,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;QACzC,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;KACjC,CAAC;CACH;;;;yBAsB6B,UAAU,UAAU,gBAAgB,KAAG,IAAI;wBAwC5C,UAAU,UAAU,gBAAgB,KAAG,IAAI;EAmBvE"}
1
+ {"version":3,"file":"injectSheetColumnResizing.d.ts","sourceRoot":"","sources":["../../../src/data/sheet/injectSheetColumnResizing.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,WAAW,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;IACvD,cAAc,EAAE;QACd,KAAK,EAAE,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;QACzC,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;KACjC,CAAC;CACH;;;;yBAsB6B,UAAU,UAAU,gBAAgB,KAAG,IAAI;wBA0C5C,UAAU,UAAU,gBAAgB,KAAG,IAAI;EAmBvE"}
@@ -15,6 +15,7 @@ export function injectSheetColumnResizing(options) {
15
15
  options.configResource.set({ ...current, columnRecord });
16
16
  }
17
17
  function onMousedown(event, colDef) {
18
+ resizingCleanup?.();
18
19
  event.preventDefault();
19
20
  event.stopPropagation();
20
21
  const container = options.domAccessor.getContainer();
@@ -1 +1 @@
1
- {"version":3,"file":"sd-state-preset.d.ts","sourceRoot":"","sources":["../../../src/data/state-preset/sd-state-preset.ts"],"names":[],"mappings":";AAmBA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,qBA6Ea,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IAEpD,GAAG,8CAA4B;IAC/B,KAAK,2CAAgB;IACrB,IAAI,+DAAwB;IAE5B,SAAS,CAAC,QAAQ,CAAC,UAAU,wZAAc;IAC3C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,sdAAsB;IAC3D,SAAS,CAAC,QAAQ,CAAC,OAAO,yVAAW;IAErC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAE7B;IAEH,QAAQ,qDAAsD;IAExD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAM7C,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IASrC,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;yCAvDjD,aAAa;2CAAb,aAAa;CAuEzB"}
1
+ {"version":3,"file":"sd-state-preset.d.ts","sourceRoot":"","sources":["../../../src/data/state-preset/sd-state-preset.ts"],"names":[],"mappings":";AAmBA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,qBA6Ea,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2B;IAEpD,GAAG,8CAA4B;IAC/B,KAAK,2CAAgB;IACrB,IAAI,+DAAwB;IAE5B,SAAS,CAAC,QAAQ,CAAC,UAAU,wZAAc;IAC3C,SAAS,CAAC,QAAQ,CAAC,kBAAkB,sdAAsB;IAC3D,SAAS,CAAC,QAAQ,CAAC,OAAO,yVAAW;IAErC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAE7B;IAEH,QAAQ,qDAAsD;IAExD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BjC,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAM7C,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IASrC,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;yCA7DjD,aAAa;2CAAb,aAAa;CA6EzB"}
@@ -58,6 +58,10 @@ export class SdStatePreset {
58
58
  if (name == null)
59
59
  return;
60
60
  const currentPresets = this._presets();
61
+ if (currentPresets.some((p) => p.name === name)) {
62
+ this._sdToast.warning("이미 존재하는 프리셋 이름입니다.");
63
+ return;
64
+ }
61
65
  const newPreset = {
62
66
  name,
63
67
  state: obj.clone(this.state()),
@@ -8,9 +8,10 @@ export interface Address {
8
8
  buildingName: string | undefined;
9
9
  }
10
10
  export declare class SdAddressSearchModal implements SdModalContentDef<Address>, OnInit {
11
- contentElRef: import("@angular/core").Signal<ElementRef<HTMLElement>>;
11
+ contentElRef: import("@angular/core").Signal<ElementRef<HTMLElement> | undefined>;
12
12
  close: import("@angular/core").OutputEmitterRef<Address>;
13
13
  initialized: import("@angular/core").WritableSignal<boolean>;
14
+ errorMessage: import("@angular/core").WritableSignal<string | null>;
14
15
  ngOnInit(): void;
15
16
  private _initAsync;
16
17
  static ɵfac: i0.ɵɵFactoryDeclaration<SdAddressSearchModal, never>;
@@ -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,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;;AAwB5E,MAAM,WAAW,OAAO;IACtB,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,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM;IAC7E,YAAY,0DAET;IAEH,KAAK,oDAAqB;IAE1B,WAAW,kDAAiB;IAE5B,QAAQ;YAIM,UAAU;yCAbb,oBAAoB;2CAApB,oBAAoB;CAoEhC"}
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,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;;AA0B5E,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AA+CD,qBAgBa,oBAAqB,YAAW,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM;IAC7E,YAAY,sEAET;IAEH,KAAK,oDAAqB;IAE1B,WAAW,kDAAiB;IAC5B,YAAY,wDAA+B;IAE3C,QAAQ;YAIM,UAAU;yCAdb,oBAAoB;2CAApB,oBAAoB;CA6DhC"}
@@ -2,33 +2,73 @@ import { ChangeDetectionStrategy, Component, ElementRef, output, signal, viewChi
2
2
  import { SdBusyContainer } from "../../core/busy/sd-busy-container";
3
3
  import * as i0 from "@angular/core";
4
4
  const _c0 = ["content"];
5
- export class SdAddressSearchModal {
6
- contentElRef = viewChild.required("content", {
7
- read: ElementRef,
5
+ function SdAddressSearchModal_Conditional_1_Template(rf, ctx) { if (rf & 1) {
6
+ i0.ɵɵelementStart(0, "div", 2);
7
+ i0.ɵɵtext(1);
8
+ i0.ɵɵelementEnd();
9
+ } if (rf & 2) {
10
+ const ctx_r0 = i0.ɵɵnextContext();
11
+ i0.ɵɵadvance();
12
+ i0.ɵɵtextInterpolate(ctx_r0.errorMessage());
13
+ } }
14
+ function SdAddressSearchModal_Conditional_2_Template(rf, ctx) { if (rf & 1) {
15
+ i0.ɵɵelement(0, "div", 3, 0);
16
+ } }
17
+ function loadDaumPostcodeScript() {
18
+ const existing = document.getElementById("daum_address");
19
+ if (existing != null) {
20
+ if (typeof daum !== "undefined") {
21
+ return Promise.resolve();
22
+ }
23
+ return new Promise((resolve, reject) => {
24
+ existing.addEventListener("load", () => {
25
+ daum.postcode.load(() => {
26
+ resolve();
27
+ });
28
+ }, { once: true });
29
+ existing.addEventListener("error", () => {
30
+ existing.remove();
31
+ reject(new Error("주소 검색 스크립트를 불러올 수 없습니다."));
32
+ }, { once: true });
33
+ });
34
+ }
35
+ return new Promise((resolve, reject) => {
36
+ const scriptEl = document.createElement("script");
37
+ scriptEl.src = "//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js";
38
+ scriptEl.setAttribute("id", "daum_address");
39
+ scriptEl.onload = () => {
40
+ daum.postcode.load(() => {
41
+ resolve();
42
+ });
43
+ };
44
+ scriptEl.onerror = () => {
45
+ scriptEl.remove();
46
+ reject(new Error("주소 검색 스크립트를 불러올 수 없습니다."));
47
+ };
48
+ document.head.appendChild(scriptEl);
8
49
  });
50
+ }
51
+ export class SdAddressSearchModal {
52
+ contentElRef = viewChild("content", { ...(ngDevMode ? { debugName: "contentElRef" } : /* istanbul ignore next */ {}), read: ElementRef });
9
53
  close = output();
10
54
  initialized = signal(false, ...(ngDevMode ? [{ debugName: "initialized" }] : /* istanbul ignore next */ []));
55
+ errorMessage = signal(null, ...(ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []));
11
56
  ngOnInit() {
12
57
  void this._initAsync();
13
58
  }
14
59
  async _initAsync() {
15
- if (!document.getElementById("daum_address")) {
16
- await new Promise((resolve, reject) => {
17
- const scriptEl = document.createElement("script");
18
- scriptEl.src = "//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js";
19
- scriptEl.setAttribute("id", "daum_address");
20
- scriptEl.onload = () => {
21
- daum.postcode.load(() => {
22
- resolve();
23
- });
24
- };
25
- scriptEl.onerror = () => {
26
- reject(new Error("주소 검색 스크립트를 불러올 수 없습니다."));
27
- };
28
- document.head.appendChild(scriptEl);
29
- });
60
+ try {
61
+ await loadDaumPostcodeScript();
62
+ }
63
+ catch (err) {
64
+ this.errorMessage.set(err instanceof Error ? err.message : String(err));
65
+ this.initialized.set(true);
66
+ return;
30
67
  }
31
- const contentEl = this.contentElRef().nativeElement;
68
+ const contentElRef = this.contentElRef();
69
+ if (contentElRef == null)
70
+ return;
71
+ const contentEl = contentElRef.nativeElement;
32
72
  new daum.Postcode({
33
73
  oncomplete: (data) => {
34
74
  const addr = data.userSelectedType === "R" ? data.roadAddress : data.jibunAddress;
@@ -63,12 +103,14 @@ export class SdAddressSearchModal {
63
103
  i0.ɵɵviewQuerySignal(ctx.contentElRef, _c0, 5, ElementRef);
64
104
  } if (rf & 2) {
65
105
  i0.ɵɵqueryAdvance();
66
- } }, outputs: { close: "close" }, decls: 3, vars: 1, consts: [["content", ""], [3, "busy"], [2, "min-height", "100px"]], template: function SdAddressSearchModal_Template(rf, ctx) { if (rf & 1) {
106
+ } }, outputs: { close: "close" }, decls: 3, vars: 2, consts: [["content", ""], [3, "busy"], [1, "_error"], [2, "min-height", "100px"]], template: function SdAddressSearchModal_Template(rf, ctx) { if (rf & 1) {
67
107
  i0.ɵɵelementStart(0, "sd-busy-container", 1);
68
- i0.ɵɵelement(1, "div", 2, 0);
108
+ i0.ɵɵconditionalCreate(1, SdAddressSearchModal_Conditional_1_Template, 2, 1, "div", 2)(2, SdAddressSearchModal_Conditional_2_Template, 2, 0, "div", 3);
69
109
  i0.ɵɵelementEnd();
70
110
  } if (rf & 2) {
71
111
  i0.ɵɵproperty("busy", !ctx.initialized());
112
+ i0.ɵɵadvance();
113
+ i0.ɵɵconditional(ctx.errorMessage() !== null ? 1 : 2);
72
114
  } }, dependencies: [SdBusyContainer], encapsulation: 2, changeDetection: 0 });
73
115
  }
74
116
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SdAddressSearchModal, [{
@@ -81,11 +123,15 @@ export class SdAddressSearchModal {
81
123
  imports: [SdBusyContainer],
82
124
  template: `
83
125
  <sd-busy-container [busy]="!initialized()">
84
- <div #content style="min-height: 100px;"></div>
126
+ @if (errorMessage() !== null) {
127
+ <div class="_error">{{ errorMessage() }}</div>
128
+ } @else {
129
+ <div #content style="min-height: 100px;"></div>
130
+ }
85
131
  </sd-busy-container>
86
132
  `,
87
133
  }]
88
134
  }], null, { contentElRef: [{ type: i0.ViewChild, args: ["content", { ...{
89
135
  read: ElementRef,
90
136
  }, isSignal: true }] }], close: [{ type: i0.Output, args: ["close"] }] }); })();
91
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SdAddressSearchModal, { className: "SdAddressSearchModal", filePath: "packages/angular/src/features/address/sd-address-search.modal.ts", lineNumber: 54, forbidOrphanRendering: true }); })();
137
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SdAddressSearchModal, { className: "SdAddressSearchModal", filePath: "packages/angular/src/features/address/sd-address-search.modal.ts", lineNumber: 105, forbidOrphanRendering: true }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"sd-barcode.d.ts","sourceRoot":"","sources":["../../../src/features/visual/sd-barcode.ts"],"names":[],"mappings":";AAWA,qBAUa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IAEnD,IAAI,mDAAiC;IACrC,KAAK,0DAAmB;IAIxB,SAAS,CAAC,eAAe,+EAUtB;yCAlBQ,SAAS;2CAAT,SAAS;CAmBrB;AAED,MAAM,MAAM,WAAW,GACnB,SAAS,GAAG,WAAW,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GACpE,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAC/D,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GACpE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,iBAAiB,GACjE,0BAA0B,GAAG,wBAAwB,GAAG,iCAAiC,GACzF,gBAAgB,GAAG,yBAAyB,GAAG,aAAa,GAAG,sBAAsB,GACrF,gBAAgB,GAAG,yBAAyB,GAAG,oBAAoB,GAAG,6BAA6B,GACnG,kBAAkB,GAAG,2BAA2B,GAAG,eAAe,GAAG,YAAY,GACjF,uBAAuB,GAAG,gCAAgC,GAAG,SAAS,GAAG,OAAO,GAChF,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,GAAG,eAAe,GACzF,SAAS,GAAG,kBAAkB,GAAG,QAAQ,GAAG,eAAe,GAAG,0BAA0B,GACxF,iBAAiB,GAAG,aAAa,GAAG,YAAY,GAAG,wBAAwB,GAAG,WAAW,GACzF,QAAQ,GAAG,eAAe,GAAG,gBAAgB,GAAG,aAAa,GAAG,YAAY,GAAG,gBAAgB,GAC/F,2BAA2B,GAAG,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAC1F,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GACvF,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,GACnF,aAAa,GAAG,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,eAAe,GAC9E,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK,GACpF,QAAQ,GAAG,qBAAqB,GAAG,KAAK,GAAG,wBAAwB,GAAG,WAAW,GACjF,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAChF,MAAM,GAAG,eAAe,GAAG,MAAM,GAAG,eAAe,CAAC"}
1
+ {"version":3,"file":"sd-barcode.d.ts","sourceRoot":"","sources":["../../../src/features/visual/sd-barcode.ts"],"names":[],"mappings":";AAWA,qBAUa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IAEnD,IAAI,mDAAiC;IACrC,KAAK,0DAAmB;IAIxB,SAAS,CAAC,eAAe,+EActB;yCAtBQ,SAAS;2CAAT,SAAS;CAuBrB;AAED,MAAM,MAAM,WAAW,GACnB,SAAS,GAAG,WAAW,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GACpE,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAC/D,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GACpE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,iBAAiB,GACjE,0BAA0B,GAAG,wBAAwB,GAAG,iCAAiC,GACzF,gBAAgB,GAAG,yBAAyB,GAAG,aAAa,GAAG,sBAAsB,GACrF,gBAAgB,GAAG,yBAAyB,GAAG,oBAAoB,GAAG,6BAA6B,GACnG,kBAAkB,GAAG,2BAA2B,GAAG,eAAe,GAAG,YAAY,GACjF,uBAAuB,GAAG,gCAAgC,GAAG,SAAS,GAAG,OAAO,GAChF,gBAAgB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,GAAG,eAAe,GACzF,SAAS,GAAG,kBAAkB,GAAG,QAAQ,GAAG,eAAe,GAAG,0BAA0B,GACxF,iBAAiB,GAAG,aAAa,GAAG,YAAY,GAAG,wBAAwB,GAAG,WAAW,GACzF,QAAQ,GAAG,eAAe,GAAG,gBAAgB,GAAG,aAAa,GAAG,YAAY,GAAG,gBAAgB,GAC/F,2BAA2B,GAAG,iBAAiB,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAC1F,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GACvF,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,GACnF,aAAa,GAAG,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,eAAe,GAC9E,YAAY,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK,GACpF,QAAQ,GAAG,qBAAqB,GAAG,KAAK,GAAG,wBAAwB,GAAG,WAAW,GACjF,QAAQ,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAChF,MAAM,GAAG,eAAe,GAAG,MAAM,GAAG,eAAe,CAAC"}
@@ -13,11 +13,16 @@ export class SdBarcode {
13
13
  if (text == null || text === "") {
14
14
  return "";
15
15
  }
16
- const svg = bwipjs.toSVG({
17
- bcid: this.type(),
18
- text,
19
- });
20
- return this._sanitizer.bypassSecurityTrustHtml(svg);
16
+ try {
17
+ const svg = bwipjs.toSVG({
18
+ bcid: this.type(),
19
+ text,
20
+ });
21
+ return this._sanitizer.bypassSecurityTrustHtml(svg);
22
+ }
23
+ catch {
24
+ return "";
25
+ }
21
26
  }, ...(ngDevMode ? [{ debugName: "_trustedSvgHtml" }] : /* istanbul ignore next */ []));
22
27
  static ɵfac = function SdBarcode_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SdBarcode)(); };
23
28
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SdBarcode, selectors: [["sd-barcode"]], inputs: { type: [1, "type"], value: [1, "value"] }, decls: 1, vars: 1, consts: [[3, "innerHTML"]], template: function SdBarcode_Template(rf, ctx) { if (rf & 1) {
package/dist/index.d.ts CHANGED
@@ -69,7 +69,7 @@ export { type SdTextfieldTypes, sdTextfieldTypes } from "./controls/input/sd-tex
69
69
  export { SdTextarea } from "./controls/input/sd-textarea";
70
70
  export { SdNumpad } from "./controls/input/sd-numpad";
71
71
  export { SdRange } from "./controls/input/sd-range";
72
- export { SdDateRangePicker } from "./controls/input/sd-date-range.picker";
72
+ export { SdDateRangePicker } from "./controls/input/sd-date-range-picker";
73
73
  export { SdCheckbox } from "./controls/checkbox/sd-checkbox";
74
74
  export { SdSwitch } from "./controls/checkbox/sd-switch";
75
75
  export { SdCheckboxGroup } from "./controls/checkbox/sd-checkbox-group";
package/dist/index.js CHANGED
@@ -87,7 +87,7 @@ export { sdTextfieldTypes } from "./controls/input/sd-textfield-type-handlers";
87
87
  export { SdTextarea } from "./controls/input/sd-textarea";
88
88
  export { SdNumpad } from "./controls/input/sd-numpad";
89
89
  export { SdRange } from "./controls/input/sd-range";
90
- export { SdDateRangePicker } from "./controls/input/sd-date-range.picker";
90
+ export { SdDateRangePicker } from "./controls/input/sd-date-range-picker";
91
91
  // controls/checkbox
92
92
  export { SdCheckbox } from "./controls/checkbox/sd-checkbox";
93
93
  export { SdSwitch } from "./controls/checkbox/sd-switch";
@@ -1 +1 @@
1
- {"version":3,"file":"sd-dock.d.ts","sourceRoot":"","sources":["../../../src/layout/dock/sd-dock.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;;AAE9E,qBAyEa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAElD,OAAO,CAAC,YAAY,CAA2B;IAE/C,GAAG,0DAAmB;IACtB,QAAQ,2EAAqD;IAC7D,SAAS,qEAAiD;IAE1D,IAAI,iDAAa;IAEjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsE;;IAoB9F,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAI/C,YAAY,CAAC,KAAK,EAAE,aAAa;IASjC,oBAAoB,CAAC,KAAK,EAAE,UAAU;yCA7C3B,MAAM;2CAAN,MAAM;CA+FlB"}
1
+ {"version":3,"file":"sd-dock.d.ts","sourceRoot":"","sources":["../../../src/layout/dock/sd-dock.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;;AAE9E,qBAyEa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAElD,OAAO,CAAC,YAAY,CAA2B;IAE/C,GAAG,0DAAmB;IACtB,QAAQ,2EAAqD;IAC7D,SAAS,qEAAiD;IAE1D,IAAI,iDAAa;IAEjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsE;;IAoB9F,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAI/C,YAAY,CAAC,KAAK,EAAE,aAAa;IASjC,oBAAoB,CAAC,KAAK,EAAE,UAAU;yCA7C3B,MAAM;2CAAN,MAAM;CAiGlB"}
@@ -45,6 +45,7 @@ export class SdDock {
45
45
  }
46
46
  }
47
47
  onResizeBarMousedown(event) {
48
+ this._dragCleanup?.();
48
49
  const thisEl = this._elRef.nativeElement;
49
50
  const startX = event.clientX;
50
51
  const startY = event.clientY;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/angular",
3
- "version": "14.0.37",
3
+ "version": "14.0.38",
4
4
  "description": "심플리즘 패키지 - Angular",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",
@@ -30,8 +30,8 @@
30
30
  "@angular/platform-browser": "^21.2.8",
31
31
  "@angular/router": "^21.2.8",
32
32
  "@angular/service-worker": "^21.2.8",
33
- "@ng-icons/core": "^33.2.0",
34
- "@ng-icons/tabler-icons": "^33.2.0",
33
+ "@ng-icons/core": "^33.2.1",
34
+ "@ng-icons/tabler-icons": "^33.2.1",
35
35
  "@tiptap/core": "^3.22.3",
36
36
  "@tiptap/extension-color": "^3.22.3",
37
37
  "@tiptap/extension-document": "^3.22.3",
@@ -49,10 +49,10 @@
49
49
  "jspdf": "^4.2.1",
50
50
  "rxjs": "^7.8.2",
51
51
  "tabbable": "^6.4.0",
52
- "@simplysm/core-browser": "14.0.37",
53
- "@simplysm/core-common": "14.0.37",
54
- "@simplysm/service-client": "14.0.37",
55
- "@simplysm/service-common": "14.0.37"
52
+ "@simplysm/core-browser": "14.0.38",
53
+ "@simplysm/core-common": "14.0.38",
54
+ "@simplysm/service-client": "14.0.38",
55
+ "@simplysm/service-common": "14.0.38"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@angular/compiler": "^21.2.8",
@@ -199,20 +199,20 @@ export class SdDropdown {
199
199
 
200
200
  const rect = contentEl.getBoundingClientRect();
201
201
 
202
- const isPlaceBottom = window.innerHeight < rect.top * 2;
203
- const isPlaceRight = window.innerWidth < rect.left * 2;
202
+ const shouldPlaceAbove = window.innerHeight < rect.top * 2;
203
+ const shouldPlaceLeft = window.innerWidth < rect.left * 2;
204
204
 
205
205
  const gap = 2;
206
- const topPos = isPlaceBottom ? undefined : rect.bottom + gap;
207
- const bottomPos = isPlaceBottom ? window.innerHeight - rect.top : undefined;
208
- const leftPos = isPlaceRight ? undefined : rect.left;
209
- const rightPos = isPlaceRight ? window.innerWidth - rect.right : undefined;
206
+ const topPos = shouldPlaceAbove ? undefined : rect.bottom + gap;
207
+ const bottomPos = shouldPlaceAbove ? window.innerHeight - rect.top : undefined;
208
+ const leftPos = shouldPlaceLeft ? undefined : rect.left;
209
+ const rightPos = shouldPlaceLeft ? window.innerWidth - rect.right : undefined;
210
210
 
211
211
  // Calculate available space for popup
212
- const availableHeight = isPlaceBottom
212
+ const availableHeight = shouldPlaceAbove
213
213
  ? rect.top - gap
214
214
  : window.innerHeight - rect.bottom - gap;
215
- const availableWidth = isPlaceRight ? rect.right : window.innerWidth - rect.left;
215
+ const availableWidth = shouldPlaceLeft ? rect.right : window.innerWidth - rect.left;
216
216
 
217
217
  Object.assign(popupEl.style, {
218
218
  top: topPos !== undefined ? topPos + "px" : "",
@@ -8,5 +8,5 @@ import type { SdModalContentDef } from "./sd-modal.provider";
8
8
  export class SdActivatedModalProvider<T extends SdModalContentDef<any> = SdModalContentDef<any>> {
9
9
  modalComponent = signal<any>(undefined);
10
10
  contentComponent = signal<T | undefined>(undefined);
11
- canDeactiveFn: () => boolean = () => true;
11
+ canDeactivateFn: () => boolean = () => true;
12
12
  }
@@ -86,7 +86,7 @@ export class SdModalProvider {
86
86
  modal: SdModalInfo<T>,
87
87
  options?: SdModalOptions,
88
88
  ): Promise<Parameters<T["close"]["emit"]>[0] | undefined> {
89
- return new Promise<Parameters<T["close"]["emit"]>[0] | undefined>((resolve) => {
89
+ return new Promise<Parameters<T["close"]["emit"]>[0] | undefined>((resolve, reject) => {
90
90
  // 1. modalCount 증가
91
91
  this.modalCount.update((v) => v + 1);
92
92
 
@@ -99,10 +99,17 @@ export class SdModalProvider {
99
99
  parent: this._injector,
100
100
  });
101
101
 
102
- const contentRef: ComponentRef<T> = createComponent(modal.type, {
103
- environmentInjector: this._envInjector,
104
- elementInjector: contentInjector,
105
- });
102
+ let contentRef: ComponentRef<T>;
103
+ try {
104
+ contentRef = createComponent(modal.type, {
105
+ environmentInjector: this._envInjector,
106
+ elementInjector: contentInjector,
107
+ });
108
+ } catch (err) {
109
+ this.modalCount.update((v) => v - 1);
110
+ reject(err);
111
+ return;
112
+ }
106
113
 
107
114
  // 4. setInput으로 inputs 바인딩
108
115
  for (const [key, value] of Object.entries(modal.inputs as Record<string, unknown>)) {
@@ -389,7 +389,7 @@ export class SdModal {
389
389
  }
390
390
 
391
391
  private _requestClose(): void {
392
- if (this._activatedModal !== null && !this._activatedModal.canDeactiveFn()) {
392
+ if (this._activatedModal !== null && !this._activatedModal.canDeactivateFn()) {
393
393
  return;
394
394
  }
395
395
  void this._saveConfig();
@@ -8,7 +8,7 @@ export function setupCanDeactivate(fn: () => boolean): void {
8
8
  const elRef = inject(ElementRef);
9
9
 
10
10
  if (activatedModal != null) {
11
- activatedModal.canDeactiveFn = fn;
11
+ activatedModal.canDeactivateFn = fn;
12
12
  return;
13
13
  }
14
14
 
@@ -26,11 +26,13 @@ export function useSelectionManager<T>(options: {
26
26
  return options.selectMode() != null;
27
27
  });
28
28
 
29
+ const selectedItemsSet = computed(() => new Set(options.selectedItems()));
30
+
29
31
  const isAllSelected = computed(() => {
30
32
  const items = selectableItems();
31
33
  if (items.length === 0) return false;
32
- const selectedSet = new Set(options.selectedItems());
33
- return items.every((item) => selectedSet.has(item));
34
+ const set = selectedItemsSet();
35
+ return items.every((item) => set.has(item));
34
36
  });
35
37
 
36
38
  function getSelectable(item: T): true | string | undefined {
@@ -87,7 +89,7 @@ export function useSelectionManager<T>(options: {
87
89
  }
88
90
 
89
91
  function isSelected(item: T): boolean {
90
- return options.selectedItems().includes(item);
92
+ return selectedItemsSet().has(item);
91
93
  }
92
94
 
93
95
  return {
@@ -63,10 +63,17 @@ export abstract class SdDataDetailBase<T extends object, R = boolean>
63
63
  private _dataSnapshot?: T;
64
64
 
65
65
  constructor() {
66
- effect(() => {
66
+ effect((onCleanup) => {
67
67
  this.prepareRefreshEffect?.();
68
68
 
69
+ let cancelled = false;
70
+ onCleanup(() => {
71
+ cancelled = true;
72
+ });
73
+
69
74
  queueMicrotask(async () => {
75
+ if (cancelled) return;
76
+
70
77
  if (!this.canUse()) {
71
78
  this.initialized.set(true);
72
79
  return;
@@ -46,7 +46,7 @@ export function injectDataSheetExcelManager<TItem>(options: {
46
46
  async () => {
47
47
  await uploadExcelFn(file);
48
48
  await options.refresh();
49
- sdToast.success("엑셀 업로드가 완료 되었습니다.");
49
+ sdToast.success("엑셀 업로드가 완료되었습니다.");
50
50
  },
51
51
  (err) => options.errorMessageFn(err),
52
52
  ),
@@ -51,7 +51,7 @@ export function injectDataSheetModalEditManager<TItem, TKey>(options: {
51
51
  if (!result) return;
52
52
 
53
53
  await options.refresh();
54
- sdToast.success(`${del ? "삭제" : "복구"} 되었습니다.`);
54
+ sdToast.success(`${del ? "삭제" : "복구"}되었습니다.`);
55
55
  },
56
56
  (err) => options.errorMessageFn(err),
57
57
  ),
@@ -84,7 +84,7 @@ export abstract class SdDataSheetBase<
84
84
  private readonly _excelMgr: ReturnType<typeof injectDataSheetExcelManager<TItem>>;
85
85
 
86
86
  //-- shared state (D1: class 소유)
87
- key = reflectComponentType(this.constructor as any)?.selector;
87
+ key = reflectComponentType(this.constructor as any)?.selector ?? this.constructor.name;
88
88
 
89
89
  viewType = injectViewTypeSignal(() => this);
90
90
 
@@ -321,23 +321,34 @@ export class SdSharedDataSelect<
321
321
  return this._searchTextMatchCache().get(item.__valueKey) ?? false;
322
322
  }
323
323
 
324
- getChildren = (item: SharedDataBase<string | number>): TItem[] => {
325
- let result =
326
- this.itemByParentKeyMap()?.get(item.__valueKey as TItem["__valueKey"]) ??
327
- [];
324
+ private readonly _sortedChildrenMap = computed(() => {
325
+ const parentMap = this.itemByParentKeyMap();
326
+ if (parentMap == null) return undefined;
328
327
 
329
328
  const orderProp = this.displayOrderKeyProp();
330
- if (orderProp != null) {
331
- result = [...result].sort((a, b) => {
332
- const aVal = (a as any)[orderProp];
333
- const bVal = (b as any)[orderProp];
334
- if (aVal < bVal) return -1;
335
- if (aVal > bVal) return 1;
336
- return 0;
337
- });
329
+ if (orderProp == null) return parentMap;
330
+
331
+ const sorted = new Map<TItem["__valueKey"] | undefined, TItem[]>();
332
+ for (const [key, children] of parentMap) {
333
+ sorted.set(
334
+ key,
335
+ [...children].sort((a, b) => {
336
+ const aVal = (a as any)[orderProp];
337
+ const bVal = (b as any)[orderProp];
338
+ if (aVal < bVal) return -1;
339
+ if (aVal > bVal) return 1;
340
+ return 0;
341
+ }),
342
+ );
338
343
  }
344
+ return sorted;
345
+ });
339
346
 
340
- return result;
347
+ getChildren = (item: SharedDataBase<string | number>): TItem[] => {
348
+ return (
349
+ this._sortedChildrenMap()?.get(item.__valueKey as TItem["__valueKey"]) ??
350
+ []
351
+ );
341
352
  };
342
353
 
343
354
  onUndefinedClick(): void {
@@ -31,6 +31,8 @@ export function injectSheetColumnResizing(options: {
31
31
  }
32
32
 
33
33
  function onMousedown(event: MouseEvent, colDef: SdSheetColumnDef): void {
34
+ resizingCleanup?.();
35
+
34
36
  event.preventDefault();
35
37
  event.stopPropagation();
36
38
 
@@ -130,6 +130,12 @@ export class SdStatePreset {
130
130
  if (name == null) return;
131
131
 
132
132
  const currentPresets = this._presets();
133
+
134
+ if (currentPresets.some((p) => p.name === name)) {
135
+ this._sdToast.warning("이미 존재하는 프리셋 이름입니다.");
136
+ return;
137
+ }
138
+
133
139
  const newPreset: SdStatePresetDef = {
134
140
  name,
135
141
  state: obj.clone(this.state()),
@@ -11,17 +11,19 @@ import type { OnInit } from "@angular/core";
11
11
  import { SdBusyContainer } from "../../core/busy/sd-busy-container";
12
12
  import type { SdModalContentDef } from "../../core/modal/sd-modal.provider";
13
13
 
14
- declare const daum: {
15
- postcode: {
16
- load(callback: () => void): void;
17
- };
18
- Postcode: new (options: {
19
- oncomplete: (data: DaumPostcodeData) => void;
20
- onresize: (size: { height: number }) => void;
21
- width: string;
22
- height: string;
23
- }) => { embed(el: HTMLElement, options: { autoClose: boolean }): void };
24
- };
14
+ declare const daum:
15
+ | {
16
+ postcode: {
17
+ load(callback: () => void): void;
18
+ };
19
+ Postcode: new (options: {
20
+ oncomplete: (data: DaumPostcodeData) => void;
21
+ onresize: (size: { height: number }) => void;
22
+ width: string;
23
+ height: string;
24
+ }) => { embed(el: HTMLElement, options: { autoClose: boolean }): void };
25
+ }
26
+ | undefined;
25
27
 
26
28
  interface DaumPostcodeData {
27
29
  zonecode: string;
@@ -39,6 +41,51 @@ export interface Address {
39
41
  buildingName: string | undefined;
40
42
  }
41
43
 
44
+ function loadDaumPostcodeScript(): Promise<void> {
45
+ const existing = document.getElementById("daum_address");
46
+ if (existing != null) {
47
+ if (typeof daum !== "undefined") {
48
+ return Promise.resolve();
49
+ }
50
+ return new Promise<void>((resolve, reject) => {
51
+ existing.addEventListener(
52
+ "load",
53
+ () => {
54
+ daum!.postcode.load(() => {
55
+ resolve();
56
+ });
57
+ },
58
+ { once: true },
59
+ );
60
+ existing.addEventListener(
61
+ "error",
62
+ () => {
63
+ existing.remove();
64
+ reject(new Error("주소 검색 스크립트를 불러올 수 없습니다."));
65
+ },
66
+ { once: true },
67
+ );
68
+ });
69
+ }
70
+
71
+ return new Promise<void>((resolve, reject) => {
72
+ const scriptEl = document.createElement("script");
73
+ scriptEl.src = "//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js";
74
+ scriptEl.setAttribute("id", "daum_address");
75
+
76
+ scriptEl.onload = (): void => {
77
+ daum!.postcode.load(() => {
78
+ resolve();
79
+ });
80
+ };
81
+ scriptEl.onerror = (): void => {
82
+ scriptEl.remove();
83
+ reject(new Error("주소 검색 스크립트를 불러올 수 없습니다."));
84
+ };
85
+ document.head.appendChild(scriptEl);
86
+ });
87
+ }
88
+
42
89
  @Component({
43
90
  selector: "sd-address-search-modal",
44
91
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -47,45 +94,42 @@ export interface Address {
47
94
  imports: [SdBusyContainer],
48
95
  template: `
49
96
  <sd-busy-container [busy]="!initialized()">
50
- <div #content style="min-height: 100px;"></div>
97
+ @if (errorMessage() !== null) {
98
+ <div class="_error">{{ errorMessage() }}</div>
99
+ } @else {
100
+ <div #content style="min-height: 100px;"></div>
101
+ }
51
102
  </sd-busy-container>
52
103
  `,
53
104
  })
54
105
  export class SdAddressSearchModal implements SdModalContentDef<Address>, OnInit {
55
- contentElRef = viewChild.required<"content", ElementRef<HTMLElement>>("content", {
106
+ contentElRef = viewChild<"content", ElementRef<HTMLElement>>("content", {
56
107
  read: ElementRef,
57
108
  });
58
109
 
59
110
  close = output<Address>();
60
111
 
61
112
  initialized = signal(false);
113
+ errorMessage = signal<string | null>(null);
62
114
 
63
115
  ngOnInit() {
64
116
  void this._initAsync();
65
117
  }
66
118
 
67
119
  private async _initAsync() {
68
- if (!document.getElementById("daum_address")) {
69
- await new Promise<void>((resolve, reject) => {
70
- const scriptEl = document.createElement("script");
71
- scriptEl.src = "//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js";
72
- scriptEl.setAttribute("id", "daum_address");
73
-
74
- scriptEl.onload = (): void => {
75
- daum.postcode.load(() => {
76
- resolve();
77
- });
78
- };
79
- scriptEl.onerror = (): void => {
80
- reject(new Error("주소 검색 스크립트를 불러올 수 없습니다."));
81
- };
82
- document.head.appendChild(scriptEl);
83
- });
120
+ try {
121
+ await loadDaumPostcodeScript();
122
+ } catch (err) {
123
+ this.errorMessage.set(err instanceof Error ? err.message : String(err));
124
+ this.initialized.set(true);
125
+ return;
84
126
  }
85
127
 
86
- const contentEl = this.contentElRef().nativeElement;
128
+ const contentElRef = this.contentElRef();
129
+ if (contentElRef == null) return;
130
+ const contentEl = contentElRef.nativeElement;
87
131
 
88
- new daum.Postcode({
132
+ new daum!.Postcode({
89
133
  oncomplete: (data: DaumPostcodeData): void => {
90
134
  const addr = data.userSelectedType === "R" ? data.roadAddress : data.jibunAddress;
91
135
 
@@ -32,11 +32,15 @@ export class SdBarcode {
32
32
  if (text == null || text === "") {
33
33
  return "";
34
34
  }
35
- const svg = bwipjs.toSVG({
36
- bcid: this.type(),
37
- text,
38
- });
39
- return this._sanitizer.bypassSecurityTrustHtml(svg);
35
+ try {
36
+ const svg = bwipjs.toSVG({
37
+ bcid: this.type(),
38
+ text,
39
+ });
40
+ return this._sanitizer.bypassSecurityTrustHtml(svg);
41
+ } catch {
42
+ return "";
43
+ }
40
44
  });
41
45
  }
42
46
 
package/src/index.ts CHANGED
@@ -159,7 +159,7 @@ export { type SdTextfieldTypes, sdTextfieldTypes } from "./controls/input/sd-tex
159
159
  export { SdTextarea } from "./controls/input/sd-textarea";
160
160
  export { SdNumpad } from "./controls/input/sd-numpad";
161
161
  export { SdRange } from "./controls/input/sd-range";
162
- export { SdDateRangePicker } from "./controls/input/sd-date-range.picker";
162
+ export { SdDateRangePicker } from "./controls/input/sd-date-range-picker";
163
163
 
164
164
  // controls/checkbox
165
165
  export { SdCheckbox } from "./controls/checkbox/sd-checkbox";
@@ -132,6 +132,8 @@ export class SdDock {
132
132
  }
133
133
 
134
134
  onResizeBarMousedown(event: MouseEvent) {
135
+ this._dragCleanup?.();
136
+
135
137
  const thisEl = this._elRef.nativeElement;
136
138
 
137
139
  const startX = event.clientX;