@simplysm/angular 14.0.49 → 14.0.51

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 (134) hide show
  1. package/README.md +234 -225
  2. package/dist/controls/select/sd-select.js +3 -3
  3. package/dist/layout/dock/sd-dock-container.js +1 -1
  4. package/docs/bootstrap/provide-sd-angular.md +37 -0
  5. package/docs/bootstrap/sd-angular-config-provider.md +16 -0
  6. package/docs/directives/sd-command-directive.md +30 -0
  7. package/docs/directives/sd-events.md +25 -0
  8. package/docs/directives/sd-intersection-directive.md +36 -0
  9. package/docs/directives/sd-invalid.md +24 -0
  10. package/docs/directives/sd-resize-directive.md +42 -0
  11. package/docs/directives/sd-ripple.md +23 -0
  12. package/docs/directives/sd-router-link.md +38 -0
  13. package/docs/directives/sd-show-effect.md +18 -0
  14. package/docs/directives/sd-typed-template.md +69 -0
  15. package/docs/features/sd-address-search-modal.md +50 -0
  16. package/docs/features/sd-permission-table.md +20 -0
  17. package/docs/features/sd-shared-data-components.md +158 -0
  18. package/docs/features/sd-tiptap-editor.md +26 -0
  19. package/docs/{pipes.md → pipes/format-pipe.md} +14 -5
  20. package/docs/plugins/sd-global-error-handler.md +23 -0
  21. package/docs/{plugins.md → plugins/sd-option-event-plugin.md} +9 -12
  22. package/docs/provider-types/sd-menu.md +65 -0
  23. package/docs/provider-types/sd-modal-content-def.md +148 -0
  24. package/docs/provider-types/sd-toast-content-def.md +73 -0
  25. package/docs/provider-types/shared-data-base.md +59 -0
  26. package/docs/providers/sd-activated-modal-provider.md +34 -0
  27. package/docs/providers/sd-app-structure-provider.md +81 -0
  28. package/docs/providers/sd-busy-provider.md +18 -0
  29. package/docs/providers/sd-file-dialog-provider.md +40 -0
  30. package/docs/providers/sd-local-storage-provider.md +20 -0
  31. package/docs/providers/sd-modal-provider.md +67 -0
  32. package/docs/providers/sd-navigate-window-provider.md +18 -0
  33. package/docs/providers/sd-print-provider.md +25 -0
  34. package/docs/providers/sd-service-client-factory-provider.md +43 -0
  35. package/docs/providers/sd-shared-data-provider.md +64 -0
  36. package/docs/providers/sd-system-config-provider.md +46 -0
  37. package/docs/providers/sd-system-log-provider.md +18 -0
  38. package/docs/providers/sd-theme-provider.md +38 -0
  39. package/docs/providers/sd-toast-provider.md +65 -0
  40. package/docs/recipes/_common-rules.md +244 -0
  41. package/docs/recipes/crud-detail/extension-a-edit-save.md +230 -0
  42. package/docs/recipes/crud-detail/extension-b-delete-restore.md +142 -0
  43. package/docs/recipes/crud-detail/extension-c-modal-view.md +214 -0
  44. package/docs/recipes/crud-detail/extension-d-control-view.md +103 -0
  45. package/docs/recipes/crud-detail/extension-e-auxiliary.md +87 -0
  46. package/docs/recipes/crud-detail/extension-f-complex-detail.md +234 -0
  47. package/docs/recipes/crud-detail.md +184 -706
  48. package/docs/recipes/crud-list/extension-a-inline-edit.md +410 -0
  49. package/docs/recipes/crud-list/extension-b-selection.md +226 -0
  50. package/docs/recipes/crud-list/extension-c-inline-delete.md +87 -0
  51. package/docs/recipes/crud-list/extension-d-select-modal.md +207 -0
  52. package/docs/recipes/crud-list/extension-e-readonly-modal.md +165 -0
  53. package/docs/recipes/crud-list/extension-f-modal-edit.md +177 -0
  54. package/docs/recipes/crud-list/extension-g-excel.md +157 -0
  55. package/docs/recipes/crud-list.md +196 -787
  56. package/docs/recipes/data-select-button.md +185 -91
  57. package/docs/recipes/page-modal-container.md +168 -86
  58. package/docs/styling/classes.md +149 -0
  59. package/docs/styling/mixins.md +100 -0
  60. package/docs/styling/themes.md +35 -0
  61. package/docs/styling/variables.md +147 -0
  62. package/docs/{type-utilities.md → type-utilities/directive-input-signals.md} +17 -35
  63. package/docs/ui-data/sd-list.md +37 -0
  64. package/docs/ui-data/sd-sheet.md +227 -0
  65. package/docs/ui-form/sd-additional-button.md +26 -0
  66. package/docs/ui-form/sd-anchor.md +31 -0
  67. package/docs/ui-form/sd-button.md +105 -0
  68. package/docs/ui-form/sd-checkbox-group.md +39 -0
  69. package/docs/ui-form/sd-checkbox.md +81 -0
  70. package/docs/ui-form/sd-date-range-picker.md +27 -0
  71. package/docs/ui-form/sd-form.md +89 -0
  72. package/docs/ui-form/sd-modal-select-button.md +54 -0
  73. package/docs/ui-form/sd-numpad.md +26 -0
  74. package/docs/ui-form/sd-range.md +26 -0
  75. package/docs/ui-form/sd-select.md +68 -0
  76. package/docs/ui-form/sd-shared-data-select.md +52 -0
  77. package/docs/ui-form/sd-state-preset.md +37 -0
  78. package/docs/ui-form/sd-switch.md +27 -0
  79. package/docs/ui-form/sd-textarea.md +33 -0
  80. package/docs/ui-form/sd-textfield.md +145 -0
  81. package/docs/ui-layout/sd-dock-container.md +64 -0
  82. package/docs/ui-layout/sd-dock.md +37 -0
  83. package/docs/ui-layout/sd-gap.md +26 -0
  84. package/docs/{ui-layout.md → ui-layout/sd-kanban-board.md} +41 -85
  85. package/docs/ui-layout/sd-kanban-lane.md +34 -0
  86. package/docs/ui-layout/sd-kanban.md +29 -0
  87. package/docs/ui-navigation/sd-collapse.md +35 -0
  88. package/docs/ui-navigation/sd-pagination.md +26 -0
  89. package/docs/ui-navigation/sd-sidebar-container.md +49 -0
  90. package/docs/ui-navigation/sd-sidebar-menu.md +22 -0
  91. package/docs/ui-navigation/sd-sidebar-user.md +43 -0
  92. package/docs/ui-navigation/sd-tab.md +51 -0
  93. package/docs/ui-navigation/sd-topbar-container.md +97 -0
  94. package/docs/ui-navigation/sd-topbar-menu.md +23 -0
  95. package/docs/ui-navigation/sd-topbar-user.md +38 -0
  96. package/docs/ui-navigation/sd-topbar.md +30 -0
  97. package/docs/ui-overlay/sd-busy-container.md +69 -0
  98. package/docs/ui-overlay/sd-confirm-modal.md +30 -0
  99. package/docs/ui-overlay/sd-dropdown.md +40 -0
  100. package/docs/ui-overlay/sd-modal.md +34 -0
  101. package/docs/ui-overlay/sd-prompt-modal.md +30 -0
  102. package/docs/ui-overlay/sd-toast.md +35 -0
  103. package/docs/ui-visual/sd-barcode.md +36 -0
  104. package/docs/ui-visual/sd-calendar.md +34 -0
  105. package/docs/ui-visual/sd-echarts.md +32 -0
  106. package/docs/ui-visual/sd-label.md +24 -0
  107. package/docs/ui-visual/sd-note.md +23 -0
  108. package/docs/ui-visual/sd-progress.md +23 -0
  109. package/docs/utils/inject-routing-signals.md +161 -0
  110. package/docs/utils/inject-sd-system-config-resource.md +35 -0
  111. package/docs/utils/mark.md +43 -0
  112. package/docs/utils/selection-managers.md +96 -0
  113. package/docs/utils/set-safe-style.md +19 -0
  114. package/docs/utils/setup-functions.md +93 -0
  115. package/package.json +5 -5
  116. package/src/controls/select/sd-select.ts +3 -3
  117. package/src/core/modal/sd-modal.provider.ts +1 -1
  118. package/src/core/modal/sd-modal.ts +1 -1
  119. package/src/core/routing/menu-utils.ts +1 -1
  120. package/src/core/shared-data/sd-shared-data.provider.ts +7 -7
  121. package/src/data/shared-data/sd-shared-data-select.ts +2 -2
  122. package/src/layout/dock/sd-dock-container.ts +1 -1
  123. package/docs/bootstrap.md +0 -38
  124. package/docs/directives.md +0 -236
  125. package/docs/features.md +0 -154
  126. package/docs/provider-types.md +0 -283
  127. package/docs/providers.md +0 -379
  128. package/docs/styling.md +0 -222
  129. package/docs/ui-data.md +0 -333
  130. package/docs/ui-form.md +0 -502
  131. package/docs/ui-navigation.md +0 -303
  132. package/docs/ui-overlay.md +0 -157
  133. package/docs/ui-visual.md +0 -127
  134. package/docs/utils.md +0 -244
@@ -1,236 +0,0 @@
1
- # Directives
2
-
3
- ## `SdEvents`
4
-
5
- `.capture`, `.passive`, `.once` 수식어 및 커스텀 이벤트 바인딩을 지원하는 디렉티브. Angular 템플릿에서 해당 이벤트를 사용할 때 자동 매칭된다.
6
-
7
- ```typescript
8
- @Directive({
9
- selector: `[click.capture], [scroll.passive], ...`,
10
- })
11
- class SdEvents {
12
- // 클릭: click.capture, click.once, click.capture.once
13
- // 마우스: mousedown.capture, mouseup.capture, mouseover.capture, mouseout.capture
14
- // 키보드: keydown.capture, keyup.capture
15
- // 포커스: focus.capture, blur.capture
16
- // 폼: invalid.capture
17
- // 스크롤: scroll.capture, scroll.passive, scroll.capture.passive
18
- // 휠: wheel.passive, wheel.capture.passive
19
- // 터치: touchstart.passive, touchstart.capture.passive, touchmove.passive, touchmove.capture.passive, touchend.passive
20
- // 드래그: dragover.capture, dragenter.capture, dragleave.capture, drop.capture
21
- // 애니메이션: transitionend.once, animationend.once
22
- }
23
- ```
24
-
25
- > **NOTE:** `sdResize`, `sdSaveCommand`, `sdRefreshCommand`, `sdInsertCommand`는 `SdEvents`에서 분리되어 각각 `SdResizeDirective`, `SdIntersectionDirective`, `SdCommandDirective`로 독립 디렉티브로 제공된다.
26
-
27
- ## `SdRipple`
28
-
29
- 호스트 요소에 리플 효과를 추가하는 디렉티브.
30
-
31
- ```typescript
32
- @Directive({ selector: "[sdRipple]" })
33
- class SdRipple {
34
- enabled = input.required({ alias: "sdRipple", transform: booleanAttribute });
35
- }
36
- ```
37
-
38
- 사용법: `<div [sdRipple]="true">` 또는 `<div sdRipple>`
39
-
40
- ## `SdShowEffect`
41
-
42
- 뷰포트에 진입할 때 reveal 애니메이션을 적용하는 디렉티브. IntersectionObserver 사용.
43
-
44
- ```typescript
45
- @Directive({ selector: "[sdShowEffect]" })
46
- class SdShowEffect {
47
- enabled = input.required({ alias: "sdShowEffect", transform: booleanAttribute });
48
- sdShowEffectType = input<"l2r" | "t2b">("t2b");
49
- }
50
- ```
51
-
52
- | Input | Type | Default | Description |
53
- |-------|------|---------|-------------|
54
- | `sdShowEffect` | `boolean` | required | 효과 활성화 여부 |
55
- | `sdShowEffectType` | `"l2r" \| "t2b"` | `"t2b"` | 애니메이션 방향 (좌->우 / 위->아래) |
56
-
57
- ## `SdInvalid`
58
-
59
- 호스트 요소에 유효성 검증 표시기를 추가하는 디렉티브. 빨간 점 표시기와 숨겨진 input으로 구성.
60
-
61
- ```typescript
62
- @Directive({ selector: "[sdInvalid]" })
63
- class SdInvalid {
64
- invalidMessage = input.required<string>({ alias: "sdInvalid" });
65
- }
66
- ```
67
-
68
- 사용법: `<div [sdInvalid]="name이 비어있습니다">`. 메시지가 빈 문자열이면 유효, 비어있지 않으면 무효.
69
-
70
- ## `SdTypedTemplate`
71
-
72
- `ng-template`의 컨텍스트 타입을 지정하는 디렉티브. 타입 가드를 통해 템플릿 내부에서 정확한 타입을 사용할 수 있다.
73
-
74
- ```typescript
75
- @Directive({ selector: "ng-template[typed]" })
76
- class SdTypedTemplate<T> {
77
- typed = input.required<T>();
78
-
79
- static ngTemplateContextGuard<TypeToken>(
80
- _dir: SdTypedTemplate<TypeToken>,
81
- _ctx: unknown,
82
- ): _ctx is TypeToken;
83
- }
84
- ```
85
-
86
- 사용법:
87
- ```html
88
- <ng-template [typed]="typedVar" let-item>
89
- <!-- item의 타입이 typeof typedVar -->
90
- </ng-template>
91
- ```
92
-
93
- ## `SdItemOfTemplate`
94
-
95
- 항목 반복 템플릿의 컨텍스트 타입을 지정하는 디렉티브.
96
-
97
- ```typescript
98
- @Directive({ selector: "ng-template[itemOf]" })
99
- class SdItemOfTemplate<TItem> {
100
- itemOf = input.required<TItem[]>();
101
-
102
- static ngTemplateContextGuard<TContextItem>(
103
- _dir: SdItemOfTemplate<TContextItem>,
104
- _ctx: unknown,
105
- ): _ctx is SdItemOfTemplateContext<TContextItem>;
106
- }
107
- ```
108
-
109
- ## `SdItemOfTemplateContext`
110
-
111
- itemOf 템플릿 컨텍스트.
112
-
113
- ```typescript
114
- interface SdItemOfTemplateContext<TItem> {
115
- $implicit: TItem;
116
- item: TItem;
117
- index: number;
118
- depth: number;
119
- }
120
- ```
121
-
122
- | Field | Type | Description |
123
- |-------|------|-------------|
124
- | `$implicit` | `TItem` | 현재 항목 (let-item으로 접근) |
125
- | `item` | `TItem` | 현재 항목 (명시적 접근) |
126
- | `index` | `number` | 인덱스 |
127
- | `depth` | `number` | 깊이 (트리 구조에서 사용) |
128
-
129
- 사용법:
130
- ```html
131
- <ng-template [itemOf]="items()" let-item let-index="index">
132
- {{ item.name }}
133
- </ng-template>
134
- ```
135
-
136
- ## `SdCommandDirective`
137
-
138
- 키보드 단축키를 output 이벤트로 제공하는 디렉티브. `document` keydown을 감지하며, `shouldProcessCommandEvent()`로 최상위 모달만 이벤트 처리.
139
-
140
- ```typescript
141
- @Directive({ selector: "[sdRefreshCommand],[sdSaveCommand],[sdInsertCommand]" })
142
- class SdCommandDirective {
143
- sdRefreshCommand = output<KeyboardEvent>(); // Ctrl+Alt+L
144
- sdSaveCommand = output<KeyboardEvent>(); // Ctrl+S
145
- sdInsertCommand = output<KeyboardEvent>(); // Ctrl+Insert
146
- }
147
- ```
148
-
149
- 사용법: `<div (sdSaveCommand)="onSave($event)" (sdRefreshCommand)="onRefresh($event)">`
150
-
151
- ## `SdResizeDirective`
152
-
153
- ResizeObserver 기반 resize output 이벤트 디렉티브. `requestAnimationFrame`으로 디바운스.
154
-
155
- ```typescript
156
- @Directive({ selector: "[sdResize]" })
157
- class SdResizeDirective {
158
- sdResize = output<SdResizeEvent>();
159
- }
160
- ```
161
-
162
- 사용법: `<div (sdResize)="onResize($event)">`
163
-
164
- ## `SdResizeEvent`
165
-
166
- ```typescript
167
- interface SdResizeEvent {
168
- heightChanged: boolean;
169
- widthChanged: boolean;
170
- target: HTMLElement;
171
- contentRect: DOMRectReadOnly;
172
- }
173
- ```
174
-
175
- | Field | Type | Description |
176
- |-------|------|-------------|
177
- | `heightChanged` | `boolean` | 높이 변경 여부 |
178
- | `widthChanged` | `boolean` | 너비 변경 여부 |
179
- | `target` | `HTMLElement` | 대상 요소 |
180
- | `contentRect` | `DOMRectReadOnly` | 컨텐츠 영역 크기 |
181
-
182
- ## `SdIntersectionDirective`
183
-
184
- IntersectionObserver 기반 intersection output 이벤트 디렉티브.
185
-
186
- ```typescript
187
- @Directive({ selector: "[sdIntersection]" })
188
- class SdIntersectionDirective {
189
- sdIntersection = output<SdIntersectionEvent>();
190
- }
191
- ```
192
-
193
- 사용법: `<div (sdIntersection)="onIntersect($event)">`
194
-
195
- ## `SdIntersectionEvent`
196
-
197
- ```typescript
198
- interface SdIntersectionEvent {
199
- entry: IntersectionObserverEntry;
200
- }
201
- ```
202
-
203
- | Field | Type | Description |
204
- |-------|------|-------------|
205
- | `entry` | `IntersectionObserverEntry` | 마지막 IntersectionObserver 엔트리 |
206
-
207
- ## `SdRouterLink`
208
-
209
- 라우터 네비게이션 디렉티브. 일반 클릭은 라우터 네비게이션, Ctrl/Shift+클릭은 새 창, 팝업 윈도우에서는 팝업 형태로 열린다.
210
-
211
- ```typescript
212
- @Directive({
213
- selector: "[sdRouterLink]",
214
- host: {
215
- "[style.cursor]": "option() ? 'pointer' : ''",
216
- "(click)": "onClick($event)",
217
- },
218
- })
219
- class SdRouterLink {
220
- option = input<{
221
- link: string;
222
- params?: Record<string, string>;
223
- window?: { width?: number; height?: number };
224
- outletName?: string;
225
- queryParams?: Record<string, string>;
226
- } | undefined>(undefined, { alias: "sdRouterLink" });
227
- }
228
- ```
229
-
230
- | Input Field | Type | Description |
231
- |-------------|------|-------------|
232
- | `link` | `string` | 네비게이션 경로 |
233
- | `params` | `Record<string, string> \| undefined` | 라우터 파라미터 |
234
- | `window` | `{ width?, height? } \| undefined` | 팝업 윈도우 크기 (설정 시 팝업으로 열림) |
235
- | `outletName` | `string \| undefined` | named outlet |
236
- | `queryParams` | `Record<string, string> \| undefined` | 쿼리 파라미터 |
package/docs/features.md DELETED
@@ -1,154 +0,0 @@
1
- # Features
2
-
3
- ## `SdAddressSearchModal`
4
-
5
- Daum Postcode API를 사용한 주소 검색 모달. `SdModalContentDef<Address>`를 구현한다.
6
-
7
- ```typescript
8
- @Component({ selector: "sd-address-search-modal" })
9
- class SdAddressSearchModal implements SdModalContentDef<Address>, OnInit {
10
- close = output<Address>();
11
- initialized = signal(false);
12
- }
13
- ```
14
-
15
- ### `Address`
16
-
17
- ```typescript
18
- interface Address {
19
- postNumber: string | undefined;
20
- address: string | undefined;
21
- buildingName: string | undefined;
22
- }
23
- ```
24
-
25
- | Field | Type | Description |
26
- |-------|------|-------------|
27
- | `postNumber` | `string \| undefined` | 우편번호 |
28
- | `address` | `string \| undefined` | 주소 |
29
- | `buildingName` | `string \| undefined` | 건물명 |
30
-
31
- ## `SdPermissionTable`
32
-
33
- 권한 매트릭스 테이블. `SdPermission` 트리를 테이블로 렌더링하여 use/edit 체크박스를 표시한다.
34
-
35
- ```typescript
36
- @Component({ selector: "sd-permission-table" })
37
- class SdPermissionTable<TModule = unknown> {
38
- value = model<Record<string, boolean>>({});
39
- items = input<SdPermission<TModule>[]>([]);
40
- disabled = input(false, { transform: booleanAttribute });
41
- }
42
- ```
43
-
44
- | Input | Type | Default | Description |
45
- |-------|------|---------|-------------|
46
- | `value` | `Record<string, boolean>` | `{}` | 권한 레코드 (two-way). 키는 `codeChain.join(".") + ".use"` 또는 `".edit"` 형태 |
47
- | `items` | `SdPermission<TModule>[]` | `[]` | 권한 트리 |
48
- | `disabled` | `boolean` | `false` | 비활성화 |
49
-
50
- ## Data View Composition (Recipes)
51
-
52
- CRUD 리스트(시트) · 상세 폼 · 모달 선택 버튼은 추상 클래스 대신 **레시피 기반 직접 조립** 방식을 사용한다. `<sd-sheet>` + `<sd-form>` · `<sd-modal-select-button>` 등 표준 컴포넌트를 화면 코드가 직접 결합한다. 조립 레시피:
53
-
54
- - 리스트(시트): [recipes/crud-list.md](./recipes/crud-list.md)
55
- - 상세: [recipes/crud-detail.md](./recipes/crud-detail.md)
56
- - 선택 버튼: [recipes/data-select-button.md](./recipes/data-select-button.md)
57
- - 페이지/모달 컨테이너: [recipes/page-modal-container.md](./recipes/page-modal-container.md)
58
-
59
- ## Shared Data Controls
60
-
61
- ### `SdSharedDataSelect`
62
-
63
- 공유 데이터 드롭다운 선택 컴포넌트. 검색 기능 포함.
64
-
65
- ```typescript
66
- @Component({ selector: "sd-shared-data-select" })
67
- class SdSharedDataSelect<TItem extends SharedDataBase<string | number>, TMode extends keyof SelectModeValue<...>, TModal extends SdSelectModal<any>> {
68
- value = model<SelectModeValue<TItem["__valueKey"] | undefined>[TMode]>();
69
- items = input.required<TItem[]>();
70
- disabled = input(false, { transform: booleanAttribute });
71
- required = input(false, { transform: booleanAttribute });
72
- useUndefined = input(false, { transform: booleanAttribute });
73
- inset = input(false, { transform: booleanAttribute });
74
- inline = input(false, { transform: booleanAttribute });
75
- size = input<"sm" | "lg">();
76
- selectMode = input("single" as TMode);
77
- filterFn = input<(item: TItem, index: number, ...params: any[]) => boolean>();
78
- filterFnParams = input<any[]>();
79
- modal = input<SdSelectModalInfo<TModal>>();
80
- editModal = input<SdModalInfo<SdModalContentDef<boolean>>>();
81
- selectClass = input<string>();
82
- multiSelectionDisplayDirection = input<"vertical">();
83
- getIsHiddenFn = input<(item: TItem, index: number) => boolean>();
84
- getSearchTextFn = input<(item: TItem, index: number) => string>();
85
- displayOrderKeyProp = input<string>();
86
- }
87
- ```
88
-
89
- ### `SdSharedDataSelectButton`
90
-
91
- 공유 데이터 모달 선택 버튼. `<sd-modal-select-button>`을 컴포지션하여 공유 데이터 항목을 표시한다. `value` 또는 `items` 변경 시 내부에서 `items.filter(by __valueKey)`로 표시 항목이 자동 동기화된다.
92
-
93
- ```typescript
94
- @Component({ selector: "sd-shared-data-select-button" })
95
- class SdSharedDataSelectButton<TItem extends SharedDataBase<string | number>, TMode extends keyof SelectModeValue<string | number>, TModal extends SdSelectModal<any>> {
96
- value = model<SelectModeValue<string | number>[TMode]>();
97
- items = input<TItem[]>([]);
98
- modal = input.required<SdSelectModalInfo<TModal>>();
99
- selectMode = input<TMode>("single" as TMode);
100
- disabled = input(false, { transform: booleanAttribute });
101
- required = input(false, { transform: booleanAttribute });
102
- inset = input(false, { transform: booleanAttribute });
103
- size = input<"sm" | "lg">();
104
- }
105
- ```
106
-
107
- 상세 사용 예시: [recipes/data-select-button.md](./recipes/data-select-button.md) "패턴 2" 섹션.
108
-
109
- ### `SdSharedDataSelectList`
110
-
111
- 공유 데이터 목록형 선택 컴포넌트. 검색, 페이지네이션, 외부 링크 기능을 포함한다.
112
-
113
- ```typescript
114
- @Component({ selector: "sd-shared-data-select-list" })
115
- class SdSharedDataSelectList<TItem extends SharedDataBase<string | number>, TModal extends SdSelectModal<any>> {
116
- selectedItem = model<TItem>();
117
- canChangeFn = input<(item: TItem | undefined) => boolean | Promise<boolean>>(() => true);
118
- items = input.required<TItem[]>();
119
- selectedIcon = input<string>();
120
- useUndefined = input(false, { transform: booleanAttribute });
121
- filterFn = input<(item: TItem, index: number) => boolean>();
122
- modal = input<SdSelectModalInfo<TModal>>();
123
- header = input<string>();
124
- pageItemCount = input<number>();
125
- }
126
- ```
127
-
128
- | Input | Type | Default | Description |
129
- |-------|------|---------|-------------|
130
- | `selectedItem` | `TItem \| undefined` | - | 선택된 항목 (two-way) |
131
- | `canChangeFn` | `(item) => boolean \| Promise<boolean>` | `() => true` | 선택 변경 가능 여부 함수 |
132
- | `items` | `TItem[]` | required | 공유 데이터 항목 |
133
- | `selectedIcon` | `string \| undefined` | `undefined` | 선택됨 아이콘 |
134
- | `useUndefined` | `boolean` | `false` | undefined 항목 포함 |
135
- | `filterFn` | `((item, index) => boolean) \| undefined` | `undefined` | 필터 함수 |
136
- | `modal` | `SdSelectModalInfo<TModal> \| undefined` | `undefined` | 모달 선택 정보 |
137
- | `header` | `string \| undefined` | `undefined` | 헤더 텍스트 |
138
- | `pageItemCount` | `number \| undefined` | `undefined` | 페이지당 항목 수 |
139
-
140
- Content children:
141
- - `#headerTpl`: 헤더 커스텀 템플릿
142
- - `#filterTpl`: 필터 커스텀 템플릿
143
- - `SdItemOfTemplate`: 항목 커스텀 템플릿
144
- - `#undefinedTpl`: undefined 항목 커스텀 템플릿
145
-
146
- ### `matchesSearchText`
147
-
148
- 공백 구분 AND 조건 텍스트 검색 매칭 함수.
149
-
150
- ```typescript
151
- function matchesSearchText(itemText: string, searchQuery: string | undefined): boolean
152
- ```
153
-
154
- 모든 검색어(공백으로 분할)가 `itemText`에 포함되면 `true`. `searchQuery`가 undefined이거나 빈 문자열이면 항상 `true`.
@@ -1,283 +0,0 @@
1
- # Provider Types
2
-
3
- ## `SdMenu`
4
-
5
- 메뉴 트리 노드.
6
-
7
- ```typescript
8
- interface SdMenu {
9
- title: string;
10
- codeChain: string[];
11
- url?: string;
12
- icon?: string;
13
- children?: SdMenu[];
14
- }
15
- ```
16
-
17
- | Field | Type | Description |
18
- |-------|------|-------------|
19
- | `title` | `string` | 메뉴 제목 |
20
- | `codeChain` | `string[]` | 코드 체인 (루트부터 현재까지) |
21
- | `url` | `string \| undefined` | 외부 URL |
22
- | `icon` | `string \| undefined` | 아이콘 |
23
- | `children` | `SdMenu[] \| undefined` | 하위 메뉴 |
24
-
25
- ## `SdFlatMenu`
26
-
27
- 플랫 메뉴 항목 (리프만).
28
-
29
- ```typescript
30
- interface SdFlatMenu<TModule = unknown> {
31
- titleChain: string[];
32
- codeChain: string[];
33
- modulesChain: TModule[][];
34
- }
35
- ```
36
-
37
- | Field | Type | Description |
38
- |-------|------|-------------|
39
- | `titleChain` | `string[]` | 타이틀 체인 |
40
- | `codeChain` | `string[]` | 코드 체인 |
41
- | `modulesChain` | `TModule[][]` | 모듈 체인 |
42
-
43
- ## `SdPermission`
44
-
45
- 권한 트리 노드.
46
-
47
- ```typescript
48
- interface SdPermission<TModule = unknown> {
49
- title: string;
50
- codeChain: string[];
51
- modules: TModule[] | undefined;
52
- perms: ("use" | "edit")[] | undefined;
53
- children: SdPermission<TModule>[] | undefined;
54
- }
55
- ```
56
-
57
- | Field | Type | Description |
58
- |-------|------|-------------|
59
- | `title` | `string` | 권한 제목 |
60
- | `codeChain` | `string[]` | 코드 체인 |
61
- | `modules` | `TModule[] \| undefined` | 모듈 제한 |
62
- | `perms` | `("use" \| "edit")[] \| undefined` | 권한 목록 |
63
- | `children` | `SdPermission<TModule>[] \| undefined` | 하위 권한 |
64
-
65
- ## `SharedDataBase`
66
-
67
- 공유 데이터 기본 인터페이스. 모든 공유 데이터 항목이 구현해야 한다.
68
-
69
- ```typescript
70
- interface SharedDataBase<TKey extends string | number> {
71
- __valueKey: TKey;
72
- __searchText: string;
73
- __isHidden: boolean;
74
- __parentKey?: TKey;
75
- }
76
- ```
77
-
78
- | Field | Type | Description |
79
- |-------|------|-------------|
80
- | `__valueKey` | `TKey` | 고유 키 |
81
- | `__searchText` | `string` | 검색 대상 텍스트 |
82
- | `__isHidden` | `boolean` | 숨김 여부 |
83
- | `__parentKey` | `TKey \| undefined` | 부모 키 (트리 구조용) |
84
-
85
- ## `SharedDataInfo`
86
-
87
- 공유 데이터 등록 정보.
88
-
89
- ```typescript
90
- interface SharedDataInfo<T extends SharedDataBase<string | number>> {
91
- serviceKey: string;
92
- getter: (changeKeys?: (string | number)[]) => Promise<T[]>;
93
- filter?: unknown;
94
- orderBy?: (a: T, b: T) => number;
95
- }
96
- ```
97
-
98
- | Field | Type | Description |
99
- |-------|------|-------------|
100
- | `serviceKey` | `string` | ServiceClient 연결 키 |
101
- | `getter` | `(changeKeys?) => Promise<T[]>` | 데이터 조회 함수. changeKeys 전달 시 부분 조회 |
102
- | `filter` | `unknown` | 이벤트 필터 (같은 이름의 다른 필터 구분용) |
103
- | `orderBy` | `((a, b) => number) \| undefined` | 정렬 함수 |
104
-
105
- ## `SharedDataHandle`
106
-
107
- 공유 데이터 핸들. `getHandle()`이 반환하는 객체.
108
-
109
- ```typescript
110
- interface SharedDataHandle<T extends SharedDataBase<string | number>> {
111
- items: Signal<T[]>;
112
- get(key: T["__valueKey"] | undefined): T | undefined;
113
- }
114
- ```
115
-
116
- | Field | Type | Description |
117
- |-------|------|-------------|
118
- | `items` | `Signal<T[]>` | 데이터 항목 signal |
119
- | `get(key)` | `(key) => T \| undefined` | 키로 항목 조회 |
120
-
121
- ## `SdModalContentDef`
122
-
123
- 모달 컴포넌트가 구현해야 하는 인터페이스.
124
-
125
- ```typescript
126
- interface SdModalContentDef<O> {
127
- initialized: Signal<boolean>;
128
- close: OutputEmitterRef<O | undefined>;
129
- actionTplRef?: TemplateRef<any>;
130
- readonly _optionalModalInputs?: string;
131
- }
132
- ```
133
-
134
- | Field | Type | Description |
135
- |-------|------|-------------|
136
- | `initialized` | `Signal<boolean>` | 초기화 완료 여부 |
137
- | `close` | `OutputEmitterRef<O \| undefined>` | 닫기 output (결과 전달) |
138
- | `actionTplRef` | `TemplateRef<any> \| undefined` | 모달 헤더 액션 영역 템플릿 |
139
- | `_optionalModalInputs` | `string \| undefined` | optional로 취급할 input 키 목록 (리터럴 타입) |
140
-
141
- ## `SdModalInfo`
142
-
143
- 모달 생성 시 전달하는 정보.
144
-
145
- ```typescript
146
- interface SdModalInfo<T extends SdModalContentDef<any>, X extends keyof any = ""> {
147
- title: string;
148
- type: Type<T>;
149
- inputs: WithOptional<Omit<DirectiveInputSignals<T>, SdModalExcludeKeys | X>, ...>;
150
- }
151
- ```
152
-
153
- | Field | Type | Description |
154
- |-------|------|-------------|
155
- | `title` | `string` | 모달 제목 |
156
- | `type` | `Type<T>` | 모달 컴포넌트 타입 |
157
- | `inputs` | `object` | 컴포넌트 inputs (initialized, close, actionTplRef 제외) |
158
-
159
- ## `SdModalOptions`
160
-
161
- 모달 옵션.
162
-
163
- ```typescript
164
- interface SdModalOptions {
165
- key?: string;
166
- hideHeader?: boolean;
167
- hideCloseButton?: boolean;
168
- useCloseByBackdrop?: boolean;
169
- useCloseByEscapeKey?: boolean;
170
- float?: boolean;
171
- fill?: boolean;
172
- resizable?: boolean;
173
- movable?: boolean;
174
- position?: "bottom-right" | "top-right";
175
- minHeightPx?: number;
176
- minWidthPx?: number;
177
- heightPx?: number;
178
- widthPx?: number;
179
- headerStyle?: string;
180
- noFirstControlFocusing?: boolean;
181
- }
182
- ```
183
-
184
- | Field | Type | Description |
185
- |-------|------|-------------|
186
- | `key` | `string \| undefined` | 동일 키의 모달이 이미 열려 있으면 재사용 |
187
- | `hideHeader` | `boolean \| undefined` | 헤더 숨김 |
188
- | `hideCloseButton` | `boolean \| undefined` | 닫기 버튼 숨김 |
189
- | `useCloseByBackdrop` | `boolean \| undefined` | 배경 클릭으로 닫기 |
190
- | `useCloseByEscapeKey` | `boolean \| undefined` | ESC 키로 닫기 |
191
- | `float` | `boolean \| undefined` | 플로팅 모달 |
192
- | `fill` | `boolean \| undefined` | 전체 화면 채우기 |
193
- | `resizable` | `boolean \| undefined` | 크기 조절 가능 |
194
- | `movable` | `boolean \| undefined` | 이동 가능 |
195
- | `position` | `"bottom-right" \| "top-right" \| undefined` | 위치 프리셋 |
196
- | `minHeightPx` | `number \| undefined` | 최소 높이 (px) |
197
- | `minWidthPx` | `number \| undefined` | 최소 너비 (px) |
198
- | `heightPx` | `number \| undefined` | 높이 (px) |
199
- | `widthPx` | `number \| undefined` | 너비 (px) |
200
- | `headerStyle` | `string \| undefined` | 헤더 인라인 스타일 |
201
- | `noFirstControlFocusing` | `boolean \| undefined` | 첫 번째 컨트롤 자동 포커스 비활성화 |
202
-
203
- ## `SdToastContentDef`
204
-
205
- 커스텀 토스트 컴포넌트가 구현해야 하는 인터페이스.
206
-
207
- ```typescript
208
- interface SdToastContentDef<O> {
209
- close: OutputEmitterRef<O | undefined>;
210
- }
211
- ```
212
-
213
- ## `SdToastInput`
214
-
215
- 커스텀 토스트 생성 입력.
216
-
217
- ```typescript
218
- interface SdToastInput<T extends SdToastContentDef<any>> {
219
- type: Type<T>;
220
- inputs: Omit<DirectiveInputSignals<T>, "close">;
221
- }
222
- ```
223
-
224
- ## `SdToastSeverity`
225
-
226
- ```typescript
227
- type SdToastSeverity = "info" | "success" | "warning" | "danger";
228
- ```
229
-
230
- ## `SdToastTheme`
231
-
232
- ```typescript
233
- type SdToastTheme = "primary" | "secondary" | SdToastSeverity | "gray" | "blue-gray";
234
- ```
235
-
236
- ## `SdBusyType`
237
-
238
- ```typescript
239
- type SdBusyType = "spinner" | "bar" | "cube";
240
- ```
241
-
242
- ## `SdPrint`
243
-
244
- 인쇄 컴포넌트가 구현해야 하는 인터페이스.
245
-
246
- ```typescript
247
- interface SdPrint {
248
- initialized: Signal<boolean>;
249
- readonly _optionalPrintInputs?: string;
250
- }
251
- ```
252
-
253
- | Field | Type | Description |
254
- |-------|------|-------------|
255
- | `initialized` | `Signal<boolean>` | 초기화 완료 여부 (true 될 때까지 대기 후 인쇄) |
256
- | `_optionalPrintInputs` | `string \| undefined` | optional로 취급할 input 키 목록 |
257
-
258
- ## `SdPrintInput`
259
-
260
- 인쇄 생성 입력.
261
-
262
- ```typescript
263
- interface SdPrintInput<T, X extends keyof any = ""> {
264
- type: Type<T>;
265
- inputs: WithOptional<Omit<DirectiveInputSignals<T>, "_optionalPrintInputs" | X>, ...>;
266
- }
267
- ```
268
-
269
- ## `SelectModalOutputResult`
270
-
271
- 모달 선택 결과.
272
-
273
- ```typescript
274
- interface SelectModalOutputResult<T> {
275
- selectedItemKeys: any[];
276
- selectedItems: T[];
277
- }
278
- ```
279
-
280
- | Field | Type | Description |
281
- |-------|------|-------------|
282
- | `selectedItemKeys` | `any[]` | 선택된 항목 키 배열 |
283
- | `selectedItems` | `T[]` | 선택된 항목 배열 |