@simplysm/sd-claude 14.0.46 → 14.0.48
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.
- package/{claude/references/sd-simplysm14/sd-claude/usage.md → README.md} +2 -2
- package/claude/rules/sd-claude-rules.md +27 -9
- package/claude/rules/sd-options.md +11 -6
- package/claude/sd-subagent-start.sh +6 -0
- package/claude/settings.json +1 -12
- package/claude/skills/sd-check/SKILL.md +18 -9
- package/claude/skills/sd-claude-docs/SKILL.md +29 -58
- package/claude/skills/sd-claude-docs/references/package-claudemd.md +12 -0
- package/claude/skills/sd-claude-docs/references/package-doc-gen.md +22 -12
- package/claude/skills/sd-debug/SKILL.md +5 -3
- package/claude/skills/sd-deliverable/SKILL.md +0 -1
- package/claude/skills/sd-dev/SKILL.md +14 -9
- package/claude/skills/sd-doc-extract/SKILL.md +7 -9
- package/claude/skills/sd-doc-extract/_common.py +8 -1
- package/claude/skills/sd-doc-extract/_extract_docx.py +74 -34
- package/claude/skills/sd-doc-extract/_extract_pdf.py +12 -1
- package/claude/skills/sd-doc-extract/_extract_pptx.py +103 -23
- package/claude/skills/sd-doc-extract/_extract_xlsb.py +93 -4
- package/claude/skills/sd-doc-extract/_extract_xlsx.py +98 -36
- package/claude/skills/sd-doc-extract/extract.py +22 -3
- package/claude/skills/sd-inner-clarify/SKILL.md +78 -0
- package/claude/skills/sd-inner-debug/SKILL.md +1 -1
- package/claude/skills/sd-inner-review/SKILL.md +13 -0
- package/claude/skills/sd-plan/SKILL.md +50 -17
- package/claude/skills/sd-prompt/SKILL.md +180 -178
- package/claude/skills/sd-prompt/references/eval-runner.md +5 -31
- package/claude/skills/sd-prompt/references/sd-eval-env-template.md +23 -0
- package/claude/skills/sd-refactor/SKILL.md +2 -2
- package/claude/skills/sd-tdd/SKILL.md +46 -10
- package/claude/skills/sd-use/SKILL.md +84 -80
- package/claude/skills/sd-wbs/SKILL.md +85 -27
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/assets.md +2 -3
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/hooks.md +7 -6
- package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/scripts.md +1 -9
- package/package.json +3 -2
- package/scripts/sync.mjs +4 -2
- package/claude/references/sd-simplysm14/angular/docs/bootstrap.md +0 -48
- package/claude/references/sd-simplysm14/angular/docs/directives.md +0 -236
- package/claude/references/sd-simplysm14/angular/docs/features.md +0 -379
- package/claude/references/sd-simplysm14/angular/docs/pipes.md +0 -32
- package/claude/references/sd-simplysm14/angular/docs/plugins.md +0 -37
- package/claude/references/sd-simplysm14/angular/docs/provider-types.md +0 -283
- package/claude/references/sd-simplysm14/angular/docs/providers.md +0 -370
- package/claude/references/sd-simplysm14/angular/docs/styling.md +0 -222
- package/claude/references/sd-simplysm14/angular/docs/type-utilities.md +0 -250
- package/claude/references/sd-simplysm14/angular/docs/ui-data.md +0 -275
- package/claude/references/sd-simplysm14/angular/docs/ui-form.md +0 -490
- package/claude/references/sd-simplysm14/angular/docs/ui-layout.md +0 -140
- package/claude/references/sd-simplysm14/angular/docs/ui-navigation.md +0 -241
- package/claude/references/sd-simplysm14/angular/docs/ui-overlay.md +0 -157
- package/claude/references/sd-simplysm14/angular/docs/ui-visual.md +0 -127
- package/claude/references/sd-simplysm14/angular/docs/utils.md +0 -295
- package/claude/references/sd-simplysm14/angular/usage.md +0 -489
- package/claude/references/sd-simplysm14/capacitor-plugin-auto-update/usage.md +0 -182
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/file-operations.md +0 -154
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/permissions.md +0 -84
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/storage-paths.md +0 -107
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/types.md +0 -83
- package/claude/references/sd-simplysm14/capacitor-plugin-file-system/usage.md +0 -133
- package/claude/references/sd-simplysm14/capacitor-plugin-intent/usage.md +0 -203
- package/claude/references/sd-simplysm14/capacitor-plugin-usb-storage/usage.md +0 -258
- package/claude/references/sd-simplysm14/core-browser/usage.md +0 -306
- package/claude/references/sd-simplysm14/core-common/docs/errors.md +0 -82
- package/claude/references/sd-simplysm14/core-common/docs/extensions.md +0 -167
- package/claude/references/sd-simplysm14/core-common/docs/features.md +0 -136
- package/claude/references/sd-simplysm14/core-common/docs/types.md +0 -245
- package/claude/references/sd-simplysm14/core-common/docs/utils.md +0 -591
- package/claude/references/sd-simplysm14/core-common/usage.md +0 -255
- package/claude/references/sd-simplysm14/core-node/docs/child-process.md +0 -182
- package/claude/references/sd-simplysm14/core-node/docs/features.md +0 -214
- package/claude/references/sd-simplysm14/core-node/docs/file-system.md +0 -509
- package/claude/references/sd-simplysm14/core-node/docs/file-watching.md +0 -139
- package/claude/references/sd-simplysm14/core-node/docs/logging.md +0 -180
- package/claude/references/sd-simplysm14/core-node/docs/path.md +0 -176
- package/claude/references/sd-simplysm14/core-node/docs/utilities-cpx.md +0 -194
- package/claude/references/sd-simplysm14/core-node/docs/utilities-fsx.md +0 -469
- package/claude/references/sd-simplysm14/core-node/docs/utilities-pathx.md +0 -151
- package/claude/references/sd-simplysm14/core-node/docs/worker-threads.md +0 -334
- package/claude/references/sd-simplysm14/core-node/docs/worker.md +0 -205
- package/claude/references/sd-simplysm14/core-node/usage.md +0 -259
- package/claude/references/sd-simplysm14/excel/docs/core-classes.md +0 -443
- package/claude/references/sd-simplysm14/excel/docs/types.md +0 -455
- package/claude/references/sd-simplysm14/excel/docs/utilities.md +0 -194
- package/claude/references/sd-simplysm14/excel/docs/wrapper.md +0 -73
- package/claude/references/sd-simplysm14/excel/usage.md +0 -134
- package/claude/references/sd-simplysm14/lint/usage.md +0 -130
- package/claude/references/sd-simplysm14/orm-common/docs/core.md +0 -188
- package/claude/references/sd-simplysm14/orm-common/docs/expression.md +0 -190
- package/claude/references/sd-simplysm14/orm-common/docs/models.md +0 -17
- package/claude/references/sd-simplysm14/orm-common/docs/query-builder.md +0 -97
- package/claude/references/sd-simplysm14/orm-common/docs/queryable-executable.md +0 -250
- package/claude/references/sd-simplysm14/orm-common/docs/schema-builders.md +0 -364
- package/claude/references/sd-simplysm14/orm-common/docs/types.md +0 -522
- package/claude/references/sd-simplysm14/orm-common/usage.md +0 -229
- package/claude/references/sd-simplysm14/orm-node/docs/connections.md +0 -137
- package/claude/references/sd-simplysm14/orm-node/docs/core.md +0 -131
- package/claude/references/sd-simplysm14/orm-node/docs/types.md +0 -173
- package/claude/references/sd-simplysm14/orm-node/usage.md +0 -143
- package/claude/references/sd-simplysm14/sd-cli/usage.md +0 -782
- package/claude/references/sd-simplysm14/service-client/docs/features.md +0 -217
- package/claude/references/sd-simplysm14/service-client/docs/main.md +0 -148
- package/claude/references/sd-simplysm14/service-client/docs/protocol.md +0 -53
- package/claude/references/sd-simplysm14/service-client/docs/transport.md +0 -131
- package/claude/references/sd-simplysm14/service-client/docs/types.md +0 -129
- package/claude/references/sd-simplysm14/service-client/usage.md +0 -202
- package/claude/references/sd-simplysm14/service-common/docs/app-structure.md +0 -175
- package/claude/references/sd-simplysm14/service-common/docs/events.md +0 -64
- package/claude/references/sd-simplysm14/service-common/docs/protocol.md +0 -331
- package/claude/references/sd-simplysm14/service-common/docs/service-types.md +0 -90
- package/claude/references/sd-simplysm14/service-common/docs/types.md +0 -19
- package/claude/references/sd-simplysm14/service-common/usage.md +0 -154
- package/claude/references/sd-simplysm14/service-server/docs/auth.md +0 -64
- package/claude/references/sd-simplysm14/service-server/docs/core.md +0 -174
- package/claude/references/sd-simplysm14/service-server/docs/legacy.md +0 -25
- package/claude/references/sd-simplysm14/service-server/docs/main.md +0 -88
- package/claude/references/sd-simplysm14/service-server/docs/protocol.md +0 -33
- package/claude/references/sd-simplysm14/service-server/docs/services.md +0 -94
- package/claude/references/sd-simplysm14/service-server/docs/transport-http.md +0 -93
- package/claude/references/sd-simplysm14/service-server/docs/transport-socket.md +0 -119
- package/claude/references/sd-simplysm14/service-server/docs/types.md +0 -36
- package/claude/references/sd-simplysm14/service-server/docs/utils.md +0 -22
- package/claude/references/sd-simplysm14/service-server/usage.md +0 -171
- package/claude/references/sd-simplysm14/storage/usage.md +0 -301
- package/claude/references/sd-simplysm14.md +0 -35
- package/claude/rules/sd-clarify.md +0 -23
- package/claude/sd-session-start.sh +0 -10
- /package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/cli.md +0 -0
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
# Features
|
|
2
|
-
|
|
3
|
-
## `SdBaseContainer`
|
|
4
|
-
|
|
5
|
-
페이지/모달/뷰 공통 레이아웃 컨테이너. `currViewType()`에 따라 page(topbar 포함), modal(bottom 슬롯 포함), control(raw content) 중 하나를 렌더링한다.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
@Component({ selector: "sd-base-container" })
|
|
9
|
-
class SdBaseContainer {
|
|
10
|
-
contentTplRef = contentChild.required("contentTpl", { read: TemplateRef });
|
|
11
|
-
pageTopbarTplRef = contentChild("pageTopbarTpl", { read: TemplateRef });
|
|
12
|
-
modalBottomTplRef = contentChild("modalBottomTpl", { read: TemplateRef });
|
|
13
|
-
|
|
14
|
-
viewType = input<SdViewType>();
|
|
15
|
-
currViewType: Signal<SdViewType>; // viewType ?? parentViewType
|
|
16
|
-
header = input<string>();
|
|
17
|
-
modalOrPageTitle: Signal<string>; // header ?? 모달 타이틀 ?? 앱 구조 타이틀
|
|
18
|
-
|
|
19
|
-
initialized = input<boolean | undefined>(undefined);
|
|
20
|
-
restricted = input(false, { transform: booleanAttribute });
|
|
21
|
-
busy = input(false, { transform: booleanAttribute });
|
|
22
|
-
busyMessage = input<string>();
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
| Input | Type | Default | Description |
|
|
27
|
-
|-------|------|---------|-------------|
|
|
28
|
-
| `viewType` | `SdViewType \| undefined` | `undefined` | 뷰 타입 오버라이드 |
|
|
29
|
-
| `header` | `string \| undefined` | `undefined` | 헤더 타이틀 오버라이드 |
|
|
30
|
-
| `initialized` | `boolean \| undefined` | `undefined` | `false`면 컨텐츠 숨김, `undefined`면 표시 |
|
|
31
|
-
| `restricted` | `boolean` | `false` | `true`면 권한 없음 메시지 표시 |
|
|
32
|
-
| `busy` | `boolean` | `false` | busy 상태 |
|
|
33
|
-
| `busyMessage` | `string \| undefined` | `undefined` | busy 메시지 |
|
|
34
|
-
|
|
35
|
-
Content children:
|
|
36
|
-
- `#contentTpl` (required): 메인 컨텐츠 템플릿
|
|
37
|
-
- `#pageTopbarTpl`: 페이지 모드에서 탑바에 추가할 템플릿
|
|
38
|
-
- `#modalBottomTpl`: 모달 모드에서 하단에 추가할 템플릿
|
|
39
|
-
|
|
40
|
-
## `SdAddressSearchModal`
|
|
41
|
-
|
|
42
|
-
Daum Postcode API를 사용한 주소 검색 모달. `SdModalContentDef<Address>`를 구현한다.
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
@Component({ selector: "sd-address-search-modal" })
|
|
46
|
-
class SdAddressSearchModal implements SdModalContentDef<Address>, OnInit {
|
|
47
|
-
close = output<Address>();
|
|
48
|
-
initialized = signal(false);
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### `Address`
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
interface Address {
|
|
56
|
-
postNumber: string | undefined;
|
|
57
|
-
address: string | undefined;
|
|
58
|
-
buildingName: string | undefined;
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
| Field | Type | Description |
|
|
63
|
-
|-------|------|-------------|
|
|
64
|
-
| `postNumber` | `string \| undefined` | 우편번호 |
|
|
65
|
-
| `address` | `string \| undefined` | 주소 |
|
|
66
|
-
| `buildingName` | `string \| undefined` | 건물명 |
|
|
67
|
-
|
|
68
|
-
## `SdPermissionTable`
|
|
69
|
-
|
|
70
|
-
권한 매트릭스 테이블. `SdPermission` 트리를 테이블로 렌더링하여 use/edit 체크박스를 표시한다.
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
@Component({ selector: "sd-permission-table" })
|
|
74
|
-
class SdPermissionTable<TModule = unknown> {
|
|
75
|
-
value = model<Record<string, boolean>>({});
|
|
76
|
-
items = input<SdPermission<TModule>[]>([]);
|
|
77
|
-
disabled = input(false, { transform: booleanAttribute });
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
| Input | Type | Default | Description |
|
|
82
|
-
|-------|------|---------|-------------|
|
|
83
|
-
| `value` | `Record<string, boolean>` | `{}` | 권한 레코드 (two-way). 키는 `codeChain.join(".") + ".use"` 또는 `".edit"` 형태 |
|
|
84
|
-
| `items` | `SdPermission<TModule>[]` | `[]` | 권한 트리 |
|
|
85
|
-
| `disabled` | `boolean` | `false` | 비활성화 |
|
|
86
|
-
|
|
87
|
-
## Data View Abstractions
|
|
88
|
-
|
|
89
|
-
### `SdDataSheetBase`
|
|
90
|
-
|
|
91
|
-
데이터 시트 CRUD 추상 클래스. 소비 프로젝트에서 상속하여 구현한다. `SdSelectModal<TItem>`을 구현하므로 모달 선택에도 사용 가능.
|
|
92
|
-
|
|
93
|
-
```typescript
|
|
94
|
-
@Directive()
|
|
95
|
-
abstract class SdDataSheetBase<
|
|
96
|
-
TFilter extends Record<string, any>,
|
|
97
|
-
TItem,
|
|
98
|
-
TKey extends string | number | undefined,
|
|
99
|
-
> implements SdSelectModal<TItem> {
|
|
100
|
-
// 필수 구현
|
|
101
|
-
abstract canUse: Signal<boolean>;
|
|
102
|
-
abstract canEdit: Signal<boolean>;
|
|
103
|
-
abstract editMode: "inline" | "modal" | undefined;
|
|
104
|
-
abstract selectMode: InputSignal<"single" | "multi" | undefined>;
|
|
105
|
-
abstract bindFilter(): TFilter;
|
|
106
|
-
abstract itemPropInfo: SdDataSheetItemPropInfo<TItem>;
|
|
107
|
-
abstract getItemInfoFn: (item: TItem) => SdDataSheetItemInfo<TKey>;
|
|
108
|
-
abstract search(usePagination: boolean): Promise<SdDataSheetSearchResult<TItem>> | SdDataSheetSearchResult<TItem>;
|
|
109
|
-
|
|
110
|
-
// 선택적 구현
|
|
111
|
-
hideTool?: Signal<boolean>;
|
|
112
|
-
diffsExcludes?: string[];
|
|
113
|
-
prepareRefreshEffect?(): void;
|
|
114
|
-
editItem?(item?: TItem): Promise<boolean | undefined> | boolean | undefined;
|
|
115
|
-
toggleDeleteItems?(del: boolean): Promise<boolean>;
|
|
116
|
-
newItem?(): Promise<TItem> | TItem;
|
|
117
|
-
submit?(diffs: ArrayOneWayDiffResult<TItem>[]): Promise<boolean> | boolean;
|
|
118
|
-
downloadExcel?(items: TItem[]): Promise<void> | void;
|
|
119
|
-
uploadExcel?(file: File): Promise<void> | void;
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### `SdDataSheet`
|
|
124
|
-
|
|
125
|
-
데이터 시트 presentation 컴포넌트. `SdDataSheetBase`의 상속자를 부모로 자동 감지하여 렌더링한다.
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
@Component({ selector: "sd-data-sheet" })
|
|
129
|
-
class SdDataSheet { }
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### `SdDataSheetColumn`
|
|
133
|
-
|
|
134
|
-
데이터 시트 컬럼. `SdSheetColumn`를 확장하여 `edit` input을 추가한다.
|
|
135
|
-
|
|
136
|
-
```typescript
|
|
137
|
-
@Directive({ selector: "sd-data-sheet-column" })
|
|
138
|
-
class SdDataSheetColumn extends SdSheetColumn {
|
|
139
|
-
edit = input(false, { transform: booleanAttribute });
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### `SdDataSheetItemPropInfo`
|
|
144
|
-
|
|
145
|
-
```typescript
|
|
146
|
-
interface SdDataSheetItemPropInfo<I> {
|
|
147
|
-
isDeleted: (keyof I & string) | undefined;
|
|
148
|
-
lastModifiedAt: (keyof I & string) | undefined;
|
|
149
|
-
lastModifiedBy: (keyof I & string) | undefined;
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
| Field | Type | Description |
|
|
154
|
-
|-------|------|-------------|
|
|
155
|
-
| `isDeleted` | `keyof I \| undefined` | 삭제 여부 프로퍼티 키 |
|
|
156
|
-
| `lastModifiedAt` | `keyof I \| undefined` | 최종 수정일시 프로퍼티 키 |
|
|
157
|
-
| `lastModifiedBy` | `keyof I \| undefined` | 최종 수정자 프로퍼티 키 |
|
|
158
|
-
|
|
159
|
-
### `SdDataSheetItemInfo`
|
|
160
|
-
|
|
161
|
-
```typescript
|
|
162
|
-
interface SdDataSheetItemInfo<K> {
|
|
163
|
-
key: K;
|
|
164
|
-
canSelect: boolean;
|
|
165
|
-
canEdit: boolean;
|
|
166
|
-
canDelete: boolean;
|
|
167
|
-
}
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
| Field | Type | Description |
|
|
171
|
-
|-------|------|-------------|
|
|
172
|
-
| `key` | `K` | 항목 키 |
|
|
173
|
-
| `canSelect` | `boolean` | 선택 가능 여부 |
|
|
174
|
-
| `canEdit` | `boolean` | 편집 가능 여부 |
|
|
175
|
-
| `canDelete` | `boolean` | 삭제 가능 여부 |
|
|
176
|
-
|
|
177
|
-
### `SdDataSheetSearchResult`
|
|
178
|
-
|
|
179
|
-
```typescript
|
|
180
|
-
interface SdDataSheetSearchResult<I> {
|
|
181
|
-
items: I[];
|
|
182
|
-
pageLength?: number;
|
|
183
|
-
summary?: Partial<I>;
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
| Field | Type | Description |
|
|
188
|
-
|-------|------|-------------|
|
|
189
|
-
| `items` | `I[]` | 조회된 항목 |
|
|
190
|
-
| `pageLength` | `number \| undefined` | 총 페이지 수 |
|
|
191
|
-
| `summary` | `Partial<I> \| undefined` | 요약 행 데이터 |
|
|
192
|
-
|
|
193
|
-
### `SdDataDetailBase`
|
|
194
|
-
|
|
195
|
-
상세 폼 추상 클래스. 모달로 표시되며, `SdModalContentDef<R>`을 구현한다.
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
@Directive()
|
|
199
|
-
abstract class SdDataDetailBase<T extends object, R = boolean> implements SdModalContentDef<R> {
|
|
200
|
-
// 필수 구현
|
|
201
|
-
abstract canUse: Signal<boolean>;
|
|
202
|
-
abstract canEdit: Signal<boolean>;
|
|
203
|
-
abstract load(): Promise<{ data: T; info: SdDataDetailDataInfo }> | { data: T; info: SdDataDetailDataInfo };
|
|
204
|
-
|
|
205
|
-
// 선택적 구현
|
|
206
|
-
canDelete?: Signal<boolean>;
|
|
207
|
-
prepareRefreshEffect?(): void;
|
|
208
|
-
toggleDelete?(del: boolean): Promise<R | undefined> | R | undefined;
|
|
209
|
-
submit?(data: T): Promise<R | undefined> | R | undefined;
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### `SdDataDetail`
|
|
214
|
-
|
|
215
|
-
상세 폼 presentation 컴포넌트.
|
|
216
|
-
|
|
217
|
-
```typescript
|
|
218
|
-
@Component({ selector: "sd-data-detail" })
|
|
219
|
-
class SdDataDetail { }
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### `SdDataDetailDataInfo`
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
interface SdDataDetailDataInfo {
|
|
226
|
-
isNew: boolean;
|
|
227
|
-
isDeleted: boolean;
|
|
228
|
-
lastModifiedAt: DateTime | undefined;
|
|
229
|
-
lastModifiedBy: string | undefined;
|
|
230
|
-
}
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
| Field | Type | Description |
|
|
234
|
-
|-------|------|-------------|
|
|
235
|
-
| `isNew` | `boolean` | 신규 여부 |
|
|
236
|
-
| `isDeleted` | `boolean` | 삭제 여부 |
|
|
237
|
-
| `lastModifiedAt` | `DateTime \| undefined` | 최종 수정일시 |
|
|
238
|
-
| `lastModifiedBy` | `string \| undefined` | 최종 수정자 |
|
|
239
|
-
|
|
240
|
-
### `SdDataSelectButtonBase`
|
|
241
|
-
|
|
242
|
-
모달 기반 선택 버튼 추상 클래스.
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
@Directive()
|
|
246
|
-
abstract class SdDataSelectButtonBase<TItem extends object, TKey, TMode extends keyof SelectModeValue<TKey>> {
|
|
247
|
-
abstract modal: Signal<SdSelectModalInfo<SdSelectModal<any>>>;
|
|
248
|
-
abstract load(keys: TKey[]): Promise<TItem[]> | TItem[];
|
|
249
|
-
|
|
250
|
-
value = model<SelectModeValue<TKey>[TMode]>();
|
|
251
|
-
disabled = input(false, { transform: booleanAttribute });
|
|
252
|
-
required = input(false, { transform: booleanAttribute });
|
|
253
|
-
inset = input(false, { transform: booleanAttribute });
|
|
254
|
-
size = input<"sm" | "lg">();
|
|
255
|
-
selectMode = input<TMode>("single" as TMode);
|
|
256
|
-
}
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
| Input/Model | Type | Default | Description |
|
|
260
|
-
|-------------|------|---------|-------------|
|
|
261
|
-
| `value` | `SelectModeValue<TKey>[TMode]` | - | 선택된 값 (two-way) |
|
|
262
|
-
| `disabled` | `boolean` | `false` | 비활성화 |
|
|
263
|
-
| `required` | `boolean` | `false` | 필수 |
|
|
264
|
-
| `inset` | `boolean` | `false` | 삽입 스타일 |
|
|
265
|
-
| `size` | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
|
|
266
|
-
| `selectMode` | `TMode` | `"single"` | 선택 모드 |
|
|
267
|
-
|
|
268
|
-
### `SdDataSelectButton`
|
|
269
|
-
|
|
270
|
-
선택 버튼 presentation 컴포넌트.
|
|
271
|
-
|
|
272
|
-
```typescript
|
|
273
|
-
@Component({ selector: "sd-data-select-button" })
|
|
274
|
-
class SdDataSelectButton { }
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
## Shared Data Controls
|
|
278
|
-
|
|
279
|
-
### `SdSharedDataSelect`
|
|
280
|
-
|
|
281
|
-
공유 데이터 드롭다운 선택 컴포넌트. 검색 기능 포함.
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
@Component({ selector: "sd-shared-data-select" })
|
|
285
|
-
class SdSharedDataSelect<TItem extends SharedDataBase<string | number>, TMode extends keyof SelectModeValue<...>, TModal extends SdSelectModal<any>> {
|
|
286
|
-
value = model<SelectModeValue<TItem["__valueKey"] | undefined>[TMode]>();
|
|
287
|
-
items = input.required<TItem[]>();
|
|
288
|
-
disabled = input(false, { transform: booleanAttribute });
|
|
289
|
-
required = input(false, { transform: booleanAttribute });
|
|
290
|
-
useUndefined = input(false, { transform: booleanAttribute });
|
|
291
|
-
inset = input(false, { transform: booleanAttribute });
|
|
292
|
-
inline = input(false, { transform: booleanAttribute });
|
|
293
|
-
size = input<"sm" | "lg">();
|
|
294
|
-
selectMode = input("single" as TMode);
|
|
295
|
-
filterFn = input<(item: TItem, index: number, ...params: any[]) => boolean>();
|
|
296
|
-
filterFnParams = input<any[]>();
|
|
297
|
-
modal = input<SdSelectModalInfo<TModal>>();
|
|
298
|
-
editModal = input<SdModalInfo<SdModalContentDef<boolean>>>();
|
|
299
|
-
selectClass = input<string>();
|
|
300
|
-
multiSelectionDisplayDirection = input<"vertical">();
|
|
301
|
-
getIsHiddenFn = input<(item: TItem, index: number) => boolean>();
|
|
302
|
-
getSearchTextFn = input<(item: TItem, index: number) => string>();
|
|
303
|
-
displayOrderKeyProp = input<string>();
|
|
304
|
-
}
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
### `SdSharedDataSelectButton`
|
|
308
|
-
|
|
309
|
-
공유 데이터 모달 선택 버튼. `SdDataSelectButton`을 래핑하여 공유 데이터 항목을 표시한다.
|
|
310
|
-
|
|
311
|
-
```typescript
|
|
312
|
-
@Component({ selector: "sd-shared-data-select-button" })
|
|
313
|
-
class SdSharedDataSelectButton<TItem extends SharedDataBase<...>, TMode extends keyof SelectModeValue<...>, TModal extends SdSelectModal<any>> {
|
|
314
|
-
items = input<TItem[]>([]);
|
|
315
|
-
modal = input.required<SdSelectModalInfo<TModal>>();
|
|
316
|
-
}
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
### `SdSharedDataSelectList`
|
|
320
|
-
|
|
321
|
-
공유 데이터 목록형 선택 컴포넌트. 검색, 페이지네이션, 외부 링크 기능을 포함한다.
|
|
322
|
-
|
|
323
|
-
```typescript
|
|
324
|
-
@Component({ selector: "sd-shared-data-select-list" })
|
|
325
|
-
class SdSharedDataSelectList<TItem extends SharedDataBase<string | number>, TModal extends SdSelectModal<any>> {
|
|
326
|
-
selectedItem = model<TItem>();
|
|
327
|
-
canChangeFn = input<(item: TItem | undefined) => boolean | Promise<boolean>>(() => true);
|
|
328
|
-
items = input.required<TItem[]>();
|
|
329
|
-
selectedIcon = input<string>();
|
|
330
|
-
useUndefined = input(false, { transform: booleanAttribute });
|
|
331
|
-
filterFn = input<(item: TItem, index: number) => boolean>();
|
|
332
|
-
modal = input<SdSelectModalInfo<TModal>>();
|
|
333
|
-
header = input<string>();
|
|
334
|
-
pageItemCount = input<number>();
|
|
335
|
-
}
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
| Input | Type | Default | Description |
|
|
339
|
-
|-------|------|---------|-------------|
|
|
340
|
-
| `selectedItem` | `TItem \| undefined` | - | 선택된 항목 (two-way) |
|
|
341
|
-
| `canChangeFn` | `(item) => boolean \| Promise<boolean>` | `() => true` | 선택 변경 가능 여부 함수 |
|
|
342
|
-
| `items` | `TItem[]` | required | 공유 데이터 항목 |
|
|
343
|
-
| `selectedIcon` | `string \| undefined` | `undefined` | 선택됨 아이콘 |
|
|
344
|
-
| `useUndefined` | `boolean` | `false` | undefined 항목 포함 |
|
|
345
|
-
| `filterFn` | `((item, index) => boolean) \| undefined` | `undefined` | 필터 함수 |
|
|
346
|
-
| `modal` | `SdSelectModalInfo<TModal> \| undefined` | `undefined` | 모달 선택 정보 |
|
|
347
|
-
| `header` | `string \| undefined` | `undefined` | 헤더 텍스트 |
|
|
348
|
-
| `pageItemCount` | `number \| undefined` | `undefined` | 페이지당 항목 수 |
|
|
349
|
-
|
|
350
|
-
Content children:
|
|
351
|
-
- `#headerTpl`: 헤더 커스텀 템플릿
|
|
352
|
-
- `#filterTpl`: 필터 커스텀 템플릿
|
|
353
|
-
- `SdItemOfTemplate`: 항목 커스텀 템플릿
|
|
354
|
-
- `#undefinedTpl`: undefined 항목 커스텀 템플릿
|
|
355
|
-
|
|
356
|
-
### `matchesSearchText`
|
|
357
|
-
|
|
358
|
-
공백 구분 AND 조건 텍스트 검색 매칭 함수.
|
|
359
|
-
|
|
360
|
-
```typescript
|
|
361
|
-
function matchesSearchText(itemText: string, searchQuery: string | undefined): boolean
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
모든 검색어(공백으로 분할)가 `itemText`에 포함되면 `true`. `searchQuery`가 undefined이거나 빈 문자열이면 항상 `true`.
|
|
365
|
-
|
|
366
|
-
## `getOrmDataEditToastErrorMessage`
|
|
367
|
-
|
|
368
|
-
ORM 편집 에러 메시지를 사용자 친화적인 한국어 메시지로 변환한다. FK 제약 위반 등 DB 에러 메시지를 감지하여 적절한 메시지를 반환한다.
|
|
369
|
-
|
|
370
|
-
```typescript
|
|
371
|
-
function getOrmDataEditToastErrorMessage(err: unknown): string
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
| 감지 조건 | 반환 메시지 |
|
|
375
|
-
|-----------|-------------|
|
|
376
|
-
| FK 제약 위반 (`a parent row: a foreign key constraint` 또는 `conflicted with the REFERENCE`) | `"경고! 연결된 작업에 의한 처리 거부. 후속작업 확인 요망"` |
|
|
377
|
-
| 그 외 | `err.message` (또는 `String(err)`) |
|
|
378
|
-
|
|
379
|
-
`SdDataSheetBase`, `SdDataDetailBase` 내부에서 사용되며, 소비 코드에서 직접 사용할 수도 있다.
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Pipes
|
|
2
|
-
|
|
3
|
-
## `FormatPipe`
|
|
4
|
-
|
|
5
|
-
DateTime, DateOnly, string 값을 포맷팅하는 파이프. 파이프명: `format`
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
@Pipe({ name: "format" })
|
|
9
|
-
class FormatPipe implements PipeTransform {
|
|
10
|
-
transform(value: string | DateTime | DateOnly | undefined, format: string): string;
|
|
11
|
-
}
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
### DateTime / DateOnly
|
|
15
|
-
|
|
16
|
-
`value.toFormatString(format)`을 호출한다.
|
|
17
|
-
|
|
18
|
-
```html
|
|
19
|
-
{{ someDateTime | format: "yyyy-MM-dd HH:mm" }}
|
|
20
|
-
{{ someDateOnly | format: "yyyy년 MM월 dd일" }}
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
### String
|
|
24
|
-
|
|
25
|
-
format 문자열에서 `X` 문자를 값의 문자로 치환한다. `|`로 구분된 여러 포맷 중 길이가 일치하는 것을 사용한다.
|
|
26
|
-
|
|
27
|
-
```html
|
|
28
|
-
<!-- "01012345678" → "010-1234-5678" -->
|
|
29
|
-
{{ phone | format: "XXX-XXXX-XXXX|XX-XXX-XXXX|XX-XXXX-XXXX" }}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
`undefined` 또는 `null` 입력 시 빈 문자열 반환.
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# Plugins
|
|
2
|
-
|
|
3
|
-
Angular의 `EventManagerPlugin`을 확장하여 커스텀 이벤트 옵션을 지원한다. `provideSdAngular()`에서 `SdOptionEventPlugin`만 자동 등록된다.
|
|
4
|
-
|
|
5
|
-
> **NOTE:** 이전 버전의 커맨드 플러그인(`sdSaveCommand`, `sdRefreshCommand`, `sdInsertCommand`)과 옵저버 플러그인(`sdResize`, `sdIntersection`)은 디렉티브로 대체되었다. 자세한 내용은 [directives.md](./directives.md)의 `SdCommandDirective`, `SdResizeDirective`, `SdIntersectionDirective` 항목을 참고한다.
|
|
6
|
-
|
|
7
|
-
## Option Plugin
|
|
8
|
-
|
|
9
|
-
### `SdOptionEventPlugin`
|
|
10
|
-
|
|
11
|
-
`.capture`, `.passive`, `.once` 이벤트 수식어 플러그인. 네이티브 DOM 이벤트에 addEventListener options를 적용한다.
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
class SdOptionEventPlugin extends EventManagerPlugin {
|
|
15
|
-
supports(eventName: string): boolean; // /\.(capture|passive|once)/ 매칭
|
|
16
|
-
}
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
사용법: `(scroll.passive)="onScroll($event)"`, `(click.capture.once)="onClick($event)"`
|
|
20
|
-
|
|
21
|
-
## Error Handler
|
|
22
|
-
|
|
23
|
-
### `SdGlobalErrorHandlerPlugin`
|
|
24
|
-
|
|
25
|
-
글로벌 에러 핸들러. Angular의 `ErrorHandler`를 구현하여 PromiseRejectionEvent, ErrorEvent, Error 등을 처리한다.
|
|
26
|
-
|
|
27
|
-
```typescript
|
|
28
|
-
class SdGlobalErrorHandlerPlugin implements ErrorHandler {
|
|
29
|
-
handleError(event: any): false;
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
에러 발생 시:
|
|
34
|
-
1. `SdSystemLogProvider.writeAsync()`로 로그 기록
|
|
35
|
-
2. 전체 화면 에러 메시지 표시 (검은 배경 + 흰 텍스트)
|
|
36
|
-
3. `ApplicationRef.destroy()` 호출하여 앱 정지
|
|
37
|
-
4. 클릭 시 페이지 리로드 (프로덕션에서는 `location.hash = "/"` 후 리로드)
|