@simplysm/angular 14.0.38 → 14.0.39

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 (59) hide show
  1. package/dist/controls/checkbox/sd-checkbox.d.ts +1 -1
  2. package/dist/controls/checkbox/sd-checkbox.d.ts.map +1 -1
  3. package/dist/controls/checkbox/sd-checkbox.js +8 -5
  4. package/dist/controls/checkbox/sd-switch.d.ts +3 -1
  5. package/dist/controls/checkbox/sd-switch.d.ts.map +1 -1
  6. package/dist/controls/checkbox/sd-switch.js +11 -5
  7. package/dist/controls/input/sd-textfield.d.ts.map +1 -1
  8. package/dist/controls/input/sd-textfield.js +1 -0
  9. package/dist/core/error-handler/sd-global-error-handler.plugin.d.ts.map +1 -1
  10. package/dist/core/error-handler/sd-global-error-handler.plugin.js +7 -2
  11. package/dist/core/modal/sd-modal.d.ts +2 -3
  12. package/dist/core/modal/sd-modal.d.ts.map +1 -1
  13. package/dist/core/modal/sd-modal.js +8 -9
  14. package/dist/core/modal/sd-modal.provider.d.ts +0 -1
  15. package/dist/core/modal/sd-modal.provider.d.ts.map +1 -1
  16. package/dist/core/modal/sd-modal.provider.js +1 -1
  17. package/dist/core/routing/sd-navigate-window.provider.d.ts.map +1 -1
  18. package/dist/core/routing/sd-navigate-window.provider.js +3 -1
  19. package/dist/core/setupModelHook.d.ts.map +1 -1
  20. package/dist/core/setupModelHook.js +18 -1
  21. package/dist/core/shared-data/sd-shared-data.provider.d.ts.map +1 -1
  22. package/dist/core/shared-data/sd-shared-data.provider.js +12 -3
  23. package/dist/data/data-detail/sd-data-detail.base.d.ts +1 -1
  24. package/dist/data/data-detail/sd-data-detail.base.d.ts.map +1 -1
  25. package/dist/data/data-detail/sd-data-detail.base.js +19 -20
  26. package/dist/data/data-sheet/sd-data-sheet.base.d.ts +0 -1
  27. package/dist/data/data-sheet/sd-data-sheet.base.d.ts.map +1 -1
  28. package/dist/data/data-sheet/sd-data-sheet.base.js +4 -12
  29. package/dist/data/getOrmDataEditToastErrorMessage.d.ts +2 -0
  30. package/dist/data/getOrmDataEditToastErrorMessage.d.ts.map +1 -0
  31. package/dist/data/getOrmDataEditToastErrorMessage.js +8 -0
  32. package/dist/data/permission-table/sd-permission-table.d.ts +1 -1
  33. package/dist/data/permission-table/sd-permission-table.d.ts.map +1 -1
  34. package/dist/data/permission-table/sd-permission-table.js +6 -5
  35. package/dist/features/editor/sd-tiptap-editor.d.ts.map +1 -1
  36. package/dist/features/editor/sd-tiptap-editor.js +3 -1
  37. package/dist/index.d.ts +1 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/layout/base-container/sd-base-container.d.ts +1 -0
  41. package/dist/layout/base-container/sd-base-container.d.ts.map +1 -1
  42. package/dist/layout/base-container/sd-base-container.js +5 -2
  43. package/package.json +6 -5
  44. package/src/controls/checkbox/sd-checkbox.ts +7 -3
  45. package/src/controls/checkbox/sd-switch.ts +8 -2
  46. package/src/controls/input/sd-textfield.ts +1 -0
  47. package/src/core/error-handler/sd-global-error-handler.plugin.ts +6 -2
  48. package/src/core/modal/sd-modal.provider.ts +1 -2
  49. package/src/core/modal/sd-modal.ts +5 -5
  50. package/src/core/routing/sd-navigate-window.provider.ts +3 -1
  51. package/src/core/setupModelHook.ts +21 -1
  52. package/src/core/shared-data/sd-shared-data.provider.ts +13 -2
  53. package/src/data/data-detail/sd-data-detail.base.ts +21 -24
  54. package/src/data/data-sheet/sd-data-sheet.base.ts +4 -15
  55. package/src/data/getOrmDataEditToastErrorMessage.ts +10 -0
  56. package/src/data/permission-table/sd-permission-table.ts +7 -6
  57. package/src/features/editor/sd-tiptap-editor.ts +2 -0
  58. package/src/index.ts +3 -0
  59. package/src/layout/base-container/sd-base-container.ts +4 -1
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  Directive,
3
3
  effect,
4
+ ErrorHandler,
4
5
  inject,
5
6
  output,
6
7
  signal,
@@ -15,6 +16,7 @@ import { injectViewTypeSignal } from "../../core/routing/injectViewTypeSignal";
15
16
  import { withBusy } from "../../core/withBusy";
16
17
  import { type SdModalContentDef } from "../../core/modal/sd-modal.provider";
17
18
  import { SdToastProvider } from "../../core/toast/sd-toast.provider";
19
+ import { getOrmDataEditToastErrorMessage } from "../getOrmDataEditToastErrorMessage";
18
20
 
19
21
  export interface SdDataDetailDataInfo {
20
22
  isNew: boolean;
@@ -47,6 +49,7 @@ export abstract class SdDataDetailBase<T extends object, R = boolean>
47
49
 
48
50
  private readonly _sdToast = inject(SdToastProvider);
49
51
  private readonly _sdSharedData = inject(SdSharedDataProvider);
52
+ private readonly _errorHandler = inject(ErrorHandler);
50
53
 
51
54
  viewType = injectViewTypeSignal(() => this);
52
55
 
@@ -72,20 +75,24 @@ export abstract class SdDataDetailBase<T extends object, R = boolean>
72
75
  });
73
76
 
74
77
  queueMicrotask(async () => {
75
- if (cancelled) return;
76
-
77
- if (!this.canUse()) {
78
+ try {
79
+ if (cancelled) return;
80
+
81
+ if (!this.canUse()) {
82
+ this.initialized.set(true);
83
+ return;
84
+ }
85
+
86
+ await withBusy(this.busyCount, () =>
87
+ this._sdToast.try(async () => {
88
+ await this._sdSharedData.wait();
89
+ await this.refresh();
90
+ }),
91
+ );
78
92
  this.initialized.set(true);
79
- return;
93
+ } catch (err) {
94
+ this._errorHandler.handleError(err);
80
95
  }
81
-
82
- await withBusy(this.busyCount, () =>
83
- this._sdToast.try(async () => {
84
- await this._sdSharedData.wait();
85
- await this.refresh();
86
- }),
87
- );
88
- this.initialized.set(true);
89
96
  });
90
97
  });
91
98
 
@@ -137,7 +144,7 @@ export abstract class SdDataDetailBase<T extends object, R = boolean>
137
144
 
138
145
  this.close.emit(result);
139
146
  },
140
- (err) => this._getOrmDataEditToastErrorMessage(err),
147
+ (err) => getOrmDataEditToastErrorMessage(err),
141
148
  ),
142
149
  );
143
150
  }
@@ -172,19 +179,9 @@ export abstract class SdDataDetailBase<T extends object, R = boolean>
172
179
 
173
180
  await this.refresh();
174
181
  },
175
- (err) => this._getOrmDataEditToastErrorMessage(err),
182
+ (err) => getOrmDataEditToastErrorMessage(err),
176
183
  ),
177
184
  );
178
185
  }
179
186
 
180
- private _getOrmDataEditToastErrorMessage(err: unknown) {
181
- const message = err instanceof Error ? err.message : String(err);
182
- if (
183
- message.includes("a parent row: a foreign key constraint") ||
184
- message.includes("conflicted with the REFERENCE")
185
- ) {
186
- return "경고! 연결된 작업에 의한 처리 거부. 후속작업 확인 요망";
187
- }
188
- return message;
189
- }
190
187
  }
@@ -25,6 +25,7 @@ import { injectDataSheetRefreshManager } from "./injectDataSheetRefreshManager";
25
25
  import { injectDataSheetInlineEditManager } from "./injectDataSheetInlineEditManager";
26
26
  import { injectDataSheetModalEditManager } from "./injectDataSheetModalEditManager";
27
27
  import { injectDataSheetExcelManager } from "./injectDataSheetExcelManager";
28
+ import { getOrmDataEditToastErrorMessage } from "../getOrmDataEditToastErrorMessage";
28
29
 
29
30
  export type {
30
31
  SdDataSheetItemPropInfo,
@@ -197,7 +198,7 @@ export abstract class SdDataSheetBase<
197
198
  refresh: () => this._refreshMgr.refresh(),
198
199
  getNewItemFn: () => this.newItem?.bind(this),
199
200
  getSubmitFn: () => this.submit?.bind(this),
200
- errorMessageFn: (err) => this._getOrmDataEditToastErrorMessage(err),
201
+ errorMessageFn: (err) => getOrmDataEditToastErrorMessage(err),
201
202
  });
202
203
 
203
204
  //-- modal edit composable
@@ -210,7 +211,7 @@ export abstract class SdDataSheetBase<
210
211
  refresh: () => this._refreshMgr.refresh(),
211
212
  getEditItemFn: () => this.editItem?.bind(this),
212
213
  getToggleDeleteItemsFn: () => this.toggleDeleteItems?.bind(this),
213
- errorMessageFn: (err) => this._getOrmDataEditToastErrorMessage(err),
214
+ errorMessageFn: (err) => getOrmDataEditToastErrorMessage(err),
214
215
  });
215
216
 
216
217
  //-- excel composable
@@ -220,7 +221,7 @@ export abstract class SdDataSheetBase<
220
221
  refresh: () => this._refreshMgr.refresh(),
221
222
  getDownloadExcelFn: () => this.downloadExcel?.bind(this),
222
223
  getUploadExcelFn: () => this.uploadExcel?.bind(this),
223
- errorMessageFn: (err) => this._getOrmDataEditToastErrorMessage(err),
224
+ errorMessageFn: (err) => getOrmDataEditToastErrorMessage(err),
224
225
  });
225
226
 
226
227
  setupCanDeactivate(() => this.viewType() === "modal" || this.checkIgnoreChanges());
@@ -290,16 +291,4 @@ export abstract class SdDataSheetBase<
290
291
  await this._excelMgr.doUploadExcel();
291
292
  }
292
293
 
293
- //-- private
294
-
295
- private _getOrmDataEditToastErrorMessage(err: unknown) {
296
- const message = err instanceof Error ? err.message : String(err);
297
- if (
298
- message.includes("a parent row: a foreign key constraint") ||
299
- message.includes("conflicted with the REFERENCE")
300
- ) {
301
- return "경고! 연결된 작업에 의한 처리 거부. 후속작업 확인 요망";
302
- }
303
- return message;
304
- }
305
294
  }
@@ -0,0 +1,10 @@
1
+ export function getOrmDataEditToastErrorMessage(err: unknown): string {
2
+ const message = err instanceof Error ? err.message : String(err);
3
+ if (
4
+ message.includes("a parent row: a foreign key constraint") ||
5
+ message.includes("conflicted with the REFERENCE")
6
+ ) {
7
+ return "경고! 연결된 작업에 의한 처리 거부. 후속작업 확인 요망";
8
+ }
9
+ return message;
10
+ }
@@ -215,7 +215,7 @@ export class SdPermissionTable<TModule> {
215
215
  items = input<SdPermission<TModule>[]>([]);
216
216
  disabled = input(false, { transform: booleanAttribute });
217
217
 
218
- collapsedItems = signal(new Set<SdPermission<TModule>>());
218
+ collapsedItems = signal(new Set<string>());
219
219
 
220
220
  depthLength = computed(() => {
221
221
  return this._getDepthLength(this.items(), 0);
@@ -347,7 +347,7 @@ export class SdPermissionTable<TModule> {
347
347
  }
348
348
 
349
349
  getIsPermCollapsed(item: SdPermission<TModule>): boolean {
350
- return this.collapsedItems().has(item);
350
+ return this.collapsedItems().has(item.codeChain.join("."));
351
351
  }
352
352
 
353
353
  getAllChildren(item: SdPermission<TModule>): SdPermission<TModule>[] {
@@ -367,15 +367,16 @@ export class SdPermissionTable<TModule> {
367
367
  }
368
368
 
369
369
  onPermCollapseToggle(item: SdPermission<TModule>) {
370
+ const key = item.codeChain.join(".");
370
371
  this.collapsedItems.update((v) => {
371
372
  const r = new Set(v);
372
- if (r.has(item)) {
373
- r.delete(item);
373
+ if (r.has(key)) {
374
+ r.delete(key);
374
375
  } else {
375
- r.add(item);
376
+ r.add(key);
376
377
  const allChildren = this.getAllChildren(item);
377
378
  for (const allChild of allChildren) {
378
- r.add(allChild);
379
+ r.add(allChild.codeChain.join("."));
379
380
  }
380
381
  }
381
382
  return r;
@@ -22,6 +22,7 @@ import Color from "@tiptap/extension-color";
22
22
  import Highlight from "@tiptap/extension-highlight";
23
23
  import TextAlign from "@tiptap/extension-text-align";
24
24
  import Image from "@tiptap/extension-image";
25
+ import Underline from "@tiptap/extension-underline";
25
26
  import Placeholder from "@tiptap/extension-placeholder";
26
27
  import { useTiptapToolbar } from "./useTiptapToolbar";
27
28
 
@@ -32,6 +33,7 @@ const DEFAULT_EXTENSIONS: AnyExtension[] = [
32
33
  Highlight.configure({ multicolor: true }),
33
34
  TextAlign.configure({ types: ["heading", "paragraph"] }),
34
35
  Image.configure({ inline: false, allowBase64: true }),
36
+ Underline,
35
37
  ];
36
38
 
37
39
  @Component({
package/src/index.ts CHANGED
@@ -252,6 +252,9 @@ export {
252
252
  type SdDataDetailDataInfo,
253
253
  } from "./data/data-detail/sd-data-detail.base";
254
254
 
255
+ // data/utils
256
+ export { getOrmDataEditToastErrorMessage } from "./data/getOrmDataEditToastErrorMessage";
257
+
255
258
  // data/data-select-button
256
259
  export { SdDataSelectButton } from "./data/data-select-button/sd-data-select-button";
257
260
  export { SdDataSelectButtonBase } from "./data/data-select-button/sd-data-select-button.base";
@@ -22,6 +22,7 @@ import {
22
22
  type SdViewType,
23
23
  } from "../../core/routing/injectViewTypeSignal";
24
24
  import { injectParent } from "../../core/injectParent";
25
+ import { SdSystemLogProvider } from "../../core/config/sd-system-log.provider";
25
26
  import { NgIcon } from "@ng-icons/core";
26
27
  import { tablerAlertTriangle } from "@ng-icons/tabler-icons";
27
28
 
@@ -81,6 +82,7 @@ import { tablerAlertTriangle } from "@ng-icons/tabler-icons";
81
82
  export class SdBaseContainer {
82
83
  private readonly _sdActivatedModal = inject(SdActivatedModalProvider, { optional: true });
83
84
  private readonly _sdAppStructure = inject(SdAppStructureProvider);
85
+ private readonly _systemLog = inject(SdSystemLogProvider);
84
86
 
85
87
  private readonly _parent = injectParent();
86
88
 
@@ -104,7 +106,8 @@ export class SdBaseContainer {
104
106
  this._sdActivatedModal?.modalComponent()?.title() ??
105
107
  this._sdAppStructure.getTitleByFullCode(this._currPageCode?.() ?? this._fullPageCode())
106
108
  );
107
- } catch {
109
+ } catch (err) {
110
+ void this._systemLog.writeAsync("warn", `modalOrPageTitle 계산 중 에러: ${String(err)}`);
108
111
  return "";
109
112
  }
110
113
  });