@simplysm/sd-claude 14.0.91 → 14.0.93
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/README.md +7 -6
- package/claude/references/sd-simplysm14/apis/angular/README.md +59 -39
- package/claude/references/sd-simplysm14/apis/angular/controls.md +119 -186
- package/claude/references/sd-simplysm14/apis/angular/crud.md +70 -31
- package/claude/references/sd-simplysm14/apis/angular/directives.md +55 -57
- package/claude/references/sd-simplysm14/apis/angular/features.md +86 -105
- package/claude/references/sd-simplysm14/apis/angular/infra.md +48 -57
- package/claude/references/sd-simplysm14/apis/angular/layout.md +37 -47
- package/claude/references/sd-simplysm14/apis/angular/overlay.md +82 -74
- package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +61 -50
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +74 -57
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +63 -72
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +23 -18
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +21 -19
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +23 -18
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +72 -32
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +18 -18
- package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +29 -29
- package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +41 -41
- package/claude/references/sd-simplysm14/apis/core-common/README.md +97 -90
- package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +75 -51
- package/claude/references/sd-simplysm14/apis/core-common/collection-ext.md +81 -0
- package/claude/references/sd-simplysm14/apis/core-common/errors.md +27 -29
- package/claude/references/sd-simplysm14/apis/core-common/obj.md +44 -45
- package/claude/references/sd-simplysm14/apis/core-common/serialization.md +34 -33
- package/claude/references/sd-simplysm14/apis/core-common/value-types.md +86 -0
- package/claude/references/sd-simplysm14/apis/core-node/README.md +6 -6
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +3 -0
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +2 -2
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +1 -1
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +2 -2
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +6 -3
- package/claude/references/sd-simplysm14/apis/excel/README.md +10 -10
- package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +4 -2
- package/claude/references/sd-simplysm14/apis/excel/utils.md +1 -1
- package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +6 -6
- package/claude/references/sd-simplysm14/apis/lint/README.md +6 -32
- package/claude/references/sd-simplysm14/apis/lint/recommended.md +60 -0
- package/claude/references/sd-simplysm14/apis/lint/rules.md +17 -17
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +15 -6
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +68 -102
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +75 -89
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +87 -99
- package/claude/references/sd-simplysm14/apis/orm-common/schema.md +110 -147
- package/claude/references/sd-simplysm14/apis/orm-common/types.md +48 -51
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +8 -13
- package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +5 -5
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +9 -6
- package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +9 -8
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +23 -19
- package/claude/references/sd-simplysm14/apis/service-client/README.md +20 -12
- package/claude/references/sd-simplysm14/apis/service-client/orm.md +6 -6
- package/claude/references/sd-simplysm14/apis/service-client/transport.md +1 -1
- package/claude/references/sd-simplysm14/apis/service-common/README.md +35 -32
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +23 -22
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +23 -23
- package/claude/references/sd-simplysm14/apis/service-server/README.md +51 -43
- package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +6 -6
- package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +31 -21
- package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +8 -8
- package/claude/references/sd-simplysm14/apis/storage/README.md +55 -49
- package/claude/references/sd-simplysm14/manuals/client-component.md +843 -740
- package/claude/references/sd-simplysm14/manuals/client-crud.md +8 -0
- package/claude/references/sd-simplysm14/manuals/client-demo.md +6 -16
- package/claude/references/sd-simplysm14/manuals/client-shared-data.md +26 -0
- package/claude/references/sd-simplysm14/manuals/logging.md +1 -1
- package/claude/references/sd-simplysm14/manuals/orm.md +15 -1
- package/claude/rules/sd-design-rules.md +7 -0
- package/claude/sd-system-prompt.md +5 -8
- package/claude/skills/sd-debug/SKILL.md +43 -0
- package/claude/skills/sd-debug/workflow.js +390 -0
- package/claude/skills/sd-demo/SKILL.md +18 -20
- package/claude/skills/sd-dev/SKILL.md +127 -24
- package/claude/skills/sd-docs/SKILL.md +5 -3
- package/claude/skills/sd-docs/references/subagent-prompt.md +2 -3
- package/claude/skills/sd-impl/SKILL.md +18 -18
- package/claude/skills/sd-manual/SKILL.md +1 -0
- package/claude/skills/sd-review/SKILL.md +24 -18
- package/claude/skills/sd-review/workflow.js +324 -0
- package/claude/skills/sd-spec/SKILL.md +96 -679
- package/claude/skills/sd-spec/references/example-spec.md +28 -50
- package/claude/skills/sd-spec/references/format-analyze.md +232 -0
- package/claude/skills/sd-spec/references/format-design.md +248 -0
- package/claude/skills/sd-spec/workflow-analyze.js +615 -0
- package/claude/skills/sd-spec/workflow-design.js +667 -0
- package/claude/skills/sd-unpack/scripts/handlers/office_com.py +5 -1
- package/package.json +1 -1
- package/scripts/postinstall.mjs +157 -18
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +0 -68
- package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +0 -77
- package/claude/references/sd-simplysm14/apis/core-common/datetime.md +0 -86
- package/claude/skills/sd-skill/SKILL.md +0 -245
- package/claude/skills/sd-skill/scripts/run_eval.py +0 -380
|
@@ -1,41 +1,80 @@
|
|
|
1
|
-
# @simplysm/angular — CRUD 화면
|
|
1
|
+
# @simplysm/angular — CRUD 화면 골격
|
|
2
2
|
|
|
3
|
-
목록/단건 화면의 표준 컨테이너 골격. `sd-base-container`(공통 셸) 위에 `sd-crud-list`(목록), `sd-crud-detail`(단건)이 얹힘. 표준 시그널(ready/initialized/busyCount/viewType)·page/modal/control 컨텍스트별
|
|
3
|
+
목록/단건 화면의 표준 컨테이너 골격. `sd-base-container`(공통 셸) 위에 `sd-crud-list`(목록), `sd-crud-detail`(단건)이 얹힘. 표준 시그널(ready/initialized/busyCount/viewType)·page/modal/control 컨텍스트별 탑바·하단바 자동 구성·CTRL+S 저장을 내장. 화면 데이터 흐름·시그널 전파 규약은 client-component.md / client-crud.md 를 따름.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 표준 시그널 (3 컴포넌트 공통)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
세 컴포넌트 모두 화면 표준 시그널을 입력/모델로 받음:
|
|
8
|
+
- `ready: model<boolean>` — 자식이 데이터 로드를 시작해도 되는 시점. 컨테이너가 공유데이터 로드 완료 후 true 로 set.
|
|
9
|
+
- `initialized: input<boolean>` — 첫 데이터 로드 완료 여부(자식이 set 한 값을 받음). true 가 되어야 본문 렌더.
|
|
10
|
+
- `busyCount: model<number>` — 진행 중 비동기 작업 수. 0 보다 크면 busy 표시.
|
|
11
|
+
- `restricted: input<boolean>` — 권한 없음. true 면 "사용권한이 없습니다" 안내만 표시.
|
|
12
|
+
- `viewType: input.required<SdViewType>` — page/modal/control 컨텍스트(`injectViewTypeSignal()` 전달). page 면 탑바를, modal 이면 하단 확인/취소를 구성.
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
- `initialized: input<boolean>` — 첫 로드 완료 여부. true 여야 콘텐츠 렌더(아니면 busy).
|
|
11
|
-
- `busyCount: model<number>` — 진행 중 작업 수(>0 이면 busy). 자식과 양방향.
|
|
12
|
-
- `restricted: input<boolean>` — true 면 콘텐츠 대신 "사용권한 없음" 안내 표시. `[restricted]="!perms().includes('use')"`.
|
|
13
|
-
- `viewType: input.required<SdViewType>` — page/modal/control. page 면 탑바 + 제목 표시. `injectViewTypeSignal()` 결과 전달.
|
|
14
|
-
- 슬롯: `#topbarTpl`(page 탑바 우측), `#commandTpl`(상단 명령줄), `#contentTpl`(본문), `#bottomCommandTpl`(하단 명령줄).
|
|
15
|
-
- 사용: view 합성의 루트(client-component.md). 직접 화면을 list/detail 없이 짤 때 사용.
|
|
14
|
+
## SdBaseContainer
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
selector `sd-base-container`. 모든 화면의 공통 셸(busy·권한 안내·page 탑바·콘텐츠/명령 슬롯).
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
- 위 표준 시그널 + 슬롯: `#topbarTpl`(page 탑바 추가 영역), `#commandTpl`(상단 명령 줄), `#contentTpl`(본문), `#bottomCommandTpl`(하단 명령 줄).
|
|
19
|
+
- 생성자에서 `SdSharedDataProvider` 가 있으면 그 로드 완료(`wait()`)를 기다린 뒤 `ready` 를 true 로 set.
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
- 페이징/정렬: `currentPage: model<number>`, `totalPageCount: input<number>`(서버 페이징), `itemsPerPage: input<number>`(클라 페이징), `visiblePageCount: input<number>`(기본 10), `sorts: model<SortingDef[]>`. 서버/클라 페이징 택일은 client-component.md.
|
|
28
|
-
- `trackByFn: input.required<(item: TItem) => TKey>` — 행 키 함수.
|
|
29
|
-
- 출력: `filterSubmit: output()`(검색 폼 submit), `submit: output()`(저장 폼 submit/CTRL+S), `create: output()`(등록), `delete: output<TItem[]>`(선택/행 삭제), `restore: output<TItem[]>`(복구).
|
|
30
|
-
- 슬롯: `#commandTpl`(상단 추가 버튼), `#filterTpl`(검색 폼 항목), `#toolTpl`(시트 위 도구 버튼), `#bottomCommandTpl`(하단), 그리고 직속 `<sd-sheet-column>`.
|
|
31
|
-
- 사용(client-crud.md): `<sd-crud-list [key]="'goods'" [items]="items()" [(selectedKeys)]="selectedKeys" [trackByFn]="trackByFn" [viewType]="viewType()" ... (create)="onCreate()" (delete)="onDelete($event)"><ng-template #filterTpl>...</ng-template><sd-sheet-column .../></sd-crud-list>`.
|
|
21
|
+
```html
|
|
22
|
+
<sd-base-container [(ready)]="ready" [initialized]="initialized()" [(busyCount)]="busyCount"
|
|
23
|
+
[restricted]="!perms().includes('use')" [viewType]="viewType()">
|
|
24
|
+
<ng-template #contentTpl>...</ng-template>
|
|
25
|
+
</sd-base-container>
|
|
26
|
+
```
|
|
32
27
|
|
|
33
|
-
##
|
|
28
|
+
## SdCrudList<TItem, TKey>
|
|
34
29
|
|
|
35
|
-
|
|
30
|
+
selector `sd-crud-list`. 검색폼·등록/삭제/복원 버튼·시트·페이지네이션을 갖춘 목록 골격. 직속 자식 `<sd-sheet-column>` 들을 내부 시트로 투영. `Ctrl+S` 로 저장 명령.
|
|
36
31
|
|
|
37
|
-
|
|
38
|
-
- `readonly: input<boolean>` — true 면
|
|
39
|
-
- `
|
|
40
|
-
-
|
|
41
|
-
-
|
|
32
|
+
추가 입력:
|
|
33
|
+
- `readonly: input<boolean>` — 읽기 전용. true 면 등록/삭제/저장 버튼 숨김.
|
|
34
|
+
- `inlineEdit: input<boolean>` — 시트 셀 인라인 편집 + 저장 버튼 노출(기본 true). `readonly` 면 무시.
|
|
35
|
+
- `selectMode: "single"|"multi"` — 선택 모드. 모달 선택 시 하단 확인/해제 버튼 구성.
|
|
36
|
+
- `key: input.required<string>` — 시트 컬럼 구성 영속화 키.
|
|
37
|
+
- `items: input<TItem[]>` — 행 데이터.
|
|
38
|
+
- `selectedKeys: model<NonNullable<TKey>[]>` — 선택 키.
|
|
39
|
+
- `currDeletedItems: input<TItem[]>` — 삭제 표시 행(복원 대상 판정).
|
|
40
|
+
- `currentPage: model<number>`, `totalPageCount`/`itemsPerPage`/`visiblePageCount: input<number>` — 페이징(서버 페이징은 `totalPageCount`, 클라 페이징은 `itemsPerPage`).
|
|
41
|
+
- `sorts: model<SortingDef[]>` — 정렬 상태.
|
|
42
|
+
- `trackByFn: input.required<(item) => TKey>` — 행 키 함수.
|
|
43
|
+
- `getItemSelectableFn: input<(item) => boolean | string>` — 행 선택 가능 여부(문자열 반환 시 불가 사유). 내부 시트로 전달.
|
|
44
|
+
|
|
45
|
+
출력:
|
|
46
|
+
- `filterSubmit: output` — 검색폼 제출(조회).
|
|
47
|
+
- `submit: output` — 인라인 편집 저장(Ctrl+S/저장 버튼).
|
|
48
|
+
- `create: output` — 등록 버튼.
|
|
49
|
+
- `delete: output<TItem[]>` — 선택 행 삭제(선택 항목 전달).
|
|
50
|
+
- `restore: output<TItem[]>` — 선택된 삭제 행 복원.
|
|
51
|
+
|
|
52
|
+
슬롯: `#filterTpl`(검색 폼 항목), `#commandTpl`/`#bottomCommandTpl`(명령 줄), `#toolTpl`(도구 줄).
|
|
53
|
+
|
|
54
|
+
```html
|
|
55
|
+
<sd-crud-list [viewType]="viewType()" [key]="'goods-list'" [(selectedKeys)]="selectedKeys"
|
|
56
|
+
[items]="items()" [trackByFn]="trackByFn" [totalPageCount]="pageLength()" [(currentPage)]="page"
|
|
57
|
+
(filterSubmit)="onFilterSubmit()" (create)="onCreate()" (delete)="onDelete($event)">
|
|
58
|
+
<ng-template #filterTpl>...</ng-template>
|
|
59
|
+
<sd-sheet-column [key]="'name'" [header]="'이름'">
|
|
60
|
+
<ng-template [cell]="items()" let-item="item"><div class="p-xs-sm">{{ item.name }}</div></ng-template>
|
|
61
|
+
</sd-sheet-column>
|
|
62
|
+
</sd-crud-list>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## SdCrudDetail
|
|
66
|
+
|
|
67
|
+
selector `sd-crud-detail`. 단건 편집 골격(폼 + 저장 명령).
|
|
68
|
+
|
|
69
|
+
추가 입력/출력:
|
|
70
|
+
- `readonly: input<boolean>` — 읽기 전용(저장 버튼 숨김).
|
|
71
|
+
- `submit: output` — 저장(폼 제출/저장 버튼).
|
|
72
|
+
- 슬롯: `#commandTpl`(상단 명령), `#contentTpl`(폼 본문), `#bottomCommandTpl`(하단 명령).
|
|
73
|
+
- `onSaveButtonClick()` — 내부 폼의 `requestSubmit()` 호출(저장 트리거).
|
|
74
|
+
|
|
75
|
+
```html
|
|
76
|
+
<sd-crud-detail [viewType]="viewType()" [(ready)]="ready" [initialized]="initialized()"
|
|
77
|
+
[(busyCount)]="busyCount" (submit)="onSubmit()">
|
|
78
|
+
<ng-template #contentTpl><div class="form-table">...</div></ng-template>
|
|
79
|
+
</sd-crud-detail>
|
|
80
|
+
```
|
|
@@ -1,78 +1,76 @@
|
|
|
1
|
-
# @simplysm/angular — 디렉티브·signal
|
|
1
|
+
# @simplysm/angular — 호스트 디렉티브·signal 헬퍼·선택 매니저
|
|
2
2
|
|
|
3
|
-
DOM 관찰(리사이즈/교차)·캡처 이벤트·커맨드 단축키·ripple·노출 애니메이션·invalid 표시·타입드 템플릿을 호스트 엘리먼트에 붙이는 군. `setup*` 헬퍼는 컴포넌트 `constructor`
|
|
3
|
+
DOM 관찰(리사이즈/교차)·캡처 이벤트·커맨드 단축키·ripple·노출 애니메이션·invalid 표시·타입드 템플릿을 호스트 엘리먼트에 붙이는 디렉티브와, 선택/정렬/펼침 상태를 시그널로 관리하는 매니저 함수 군. `setup*` 헬퍼는 컴포넌트 `constructor` 에서 호출(`inject(ElementRef)` 의존), `Sd*` 디렉티브는 그 헬퍼를 attribute 로 래핑.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## DOM 관찰 디렉티브
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
### SdResizeDirective — `[sdResize]`
|
|
8
|
+
ResizeObserver 로 크기 변경 감지(rAF 디바운스).
|
|
9
|
+
- `sdResize: output<SdResizeEvent>` — `{ heightChanged: boolean; widthChanged: boolean; target: HTMLElement; contentRect: DOMRectReadOnly }`. 폭/높이 변경 여부와 새 크기.
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
11
|
+
### SdIntersectionDirective — `[sdIntersection]`
|
|
12
|
+
IntersectionObserver 로 화면 교차 감지.
|
|
13
|
+
- `sdIntersection: output<SdIntersectionEvent>` — `{ entry: IntersectionObserverEntry }`. 마지막 entry 전달. 무한 스크롤·등장 트리거에.
|
|
12
14
|
|
|
13
|
-
##
|
|
15
|
+
## 캡처 이벤트·명령 단축키
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
### SdEvents
|
|
18
|
+
표준 이벤트를 capture/passive/once 옵션으로 받는 디렉티브. 셀렉터에 등록된 속성(`(click.capture)`, `(scroll.passive)`, `(wheel.capture.passive)`, `(touchstart.passive)`, `(transitionend.once)` 등) 으로 바인딩. 각 output 은 원본 DOM 이벤트(`MouseEvent`/`KeyboardEvent`/`WheelEvent`/`TouchEvent` 등)를 emit. `.capture`=캡처 단계, `.passive`=passive 리스너, `.once`=1회.
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
### SdOptionEventPlugin
|
|
21
|
+
위 `.capture`/`.passive`/`.once` 접미사 이벤트를 Angular 가 인식하게 하는 `EventManagerPlugin`. `provideSdAngular` 가 등록하므로 직접 쓸 일은 없음.
|
|
19
22
|
|
|
20
|
-
|
|
23
|
+
### SdCommandDirective — `[sdRefreshCommand],[sdSaveCommand],[sdInsertCommand]`
|
|
24
|
+
전역 키보드 단축키를 명령으로 변환(최상위 열린 모달 기준으로만 처리).
|
|
25
|
+
- `sdRefreshCommand: output<KeyboardEvent>` — `Ctrl+Alt+L` (조회).
|
|
26
|
+
- `sdSaveCommand: output<KeyboardEvent>` — `Ctrl+S` (저장).
|
|
27
|
+
- `sdInsertCommand: output<KeyboardEvent>` — `Ctrl+Insert` (등록).
|
|
21
28
|
|
|
22
|
-
|
|
29
|
+
## 시각 효과·유효성 디렉티브 + setup 헬퍼
|
|
23
30
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
- 스크롤/휠: `scroll.capture`, `scroll.passive`, `scroll.capture.passive`, `wheel.passive`, `wheel.capture.passive` — passive 로 스크롤 성능 확보.
|
|
29
|
-
- 터치: `touchstart.passive`(+capture), `touchmove.passive`(+capture), `touchend.passive` — `output<TouchEvent>`.
|
|
30
|
-
- 드래그: `dragover.capture`, `dragenter.capture`, `dragleave.capture`, `drop.capture` — `output<DragEvent>`.
|
|
31
|
-
- 애니메이션: `transitionend.once`, `animationend.once` — 1회만.
|
|
32
|
-
- `.capture` = 캡처 단계 수신, `.passive` = preventDefault 불가(스크롤 블로킹 방지), `.once` = 1회 후 자동 해제.
|
|
33
|
-
- 사용: `<div (scroll.passive)="onScroll()">`, `<div (keydown.capture)="onKeydown($event)">`.
|
|
31
|
+
### setupRipple / SdRipple
|
|
32
|
+
클릭 위치에서 퍼지는 ripple 효과.
|
|
33
|
+
- `setupRipple(enableFn?: () => boolean): void` — 호스트에 ripple 부착. `enableFn` 이 false 반환 시 비활성.
|
|
34
|
+
- `SdRipple`(`[sdRipple]`): `sdRipple: input.required<boolean>` — ripple 활성 여부.
|
|
34
35
|
|
|
35
|
-
|
|
36
|
+
### setupRevealOnShow / SdShowEffect
|
|
37
|
+
교차 시 페이드+슬라이드 등장.
|
|
38
|
+
- `setupRevealOnShow(optFn?: () => { type?: "l2r"|"t2b"; enabled?: boolean }): void` — `type` 이 등장 방향(`"t2b"` 위→아래 기본, `"l2r"` 좌→우), `enabled` false 면 애니메이션 없이 즉시 표시.
|
|
39
|
+
- `SdShowEffect`(`[sdShowEffect]`): `sdShowEffect: input.required<boolean>`(활성), `sdShowEffectType: "l2r"|"t2b"`.
|
|
36
40
|
|
|
37
|
-
|
|
41
|
+
### setupInvalid / SdInvalid
|
|
42
|
+
커스텀 유효성 메시지를 네이티브 폼 검증으로 표시(빨간 인디케이터 + form submit 차단).
|
|
43
|
+
- `setupInvalid(getInvalidMessage: () => string): void` — 빈 문자열이면 유효, 아니면 그 메시지로 invalid. 숨겨진 input 의 `setCustomValidity` 로 처리.
|
|
44
|
+
- `SdInvalid`(`[sdInvalid]`): `sdInvalid: input.required<string>` — 오류 메시지(빈 값=유효).
|
|
38
45
|
|
|
39
|
-
|
|
40
|
-
- `sdSaveCommand: output<KeyboardEvent>` — Ctrl+S.
|
|
41
|
-
- `sdInsertCommand: output<KeyboardEvent>` — Ctrl+Insert.
|
|
42
|
-
- 매칭 시 preventDefault + stopPropagation. `sd-crud-list`/`sd-crud-detail` 가 `sdSaveCommand` 를 hostDirective 로 받아 저장 트리거.
|
|
46
|
+
## 타입드 템플릿 디렉티브
|
|
43
47
|
|
|
44
|
-
|
|
48
|
+
### SdTypedTemplate — `ng-template[typed]`
|
|
49
|
+
`ng-template` 컨텍스트에 타입을 부여.
|
|
50
|
+
- `typed: input.required<T>` — 컨텍스트 타입 토큰. `ngTemplateContextGuard` 로 `let-` 변수 타입 추론.
|
|
45
51
|
|
|
46
|
-
|
|
52
|
+
### SdItemOfTemplate<TItem> — `ng-template[itemOf]`
|
|
53
|
+
배열 항목 순회 템플릿에 타입 부여(셀렉트·공유데이터 선택·달력의 항목 렌더).
|
|
54
|
+
- `itemOf: input.required<TItem[]>` — 항목 배열. 컨텍스트 `SdItemOfTemplateContext`: `$implicit`/`item: TItem`, `index: number`, `depth: number`.
|
|
47
55
|
|
|
48
|
-
|
|
49
|
-
-
|
|
56
|
+
```html
|
|
57
|
+
<ng-template [itemOf]="items()" let-item="item">{{ item.name }}</ng-template>
|
|
58
|
+
```
|
|
50
59
|
|
|
51
|
-
##
|
|
60
|
+
## 선택·정렬·펼침 매니저 (signal 기반)
|
|
52
61
|
|
|
53
|
-
|
|
62
|
+
목록/시트가 선택·정렬·트리펼침 상태를 시그널로 관리하도록 돕는 순수 함수. 외부 시그널을 받아 파생 시그널·조작 함수를 반환.
|
|
54
63
|
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
- `
|
|
64
|
+
### useSelectionManager<TItem, TKey>
|
|
65
|
+
- 입력: `displayItems`/`selectedKeys`(model)/`selectMode`/`getItemSelectableFn`/`trackByFn`(모두 Signal).
|
|
66
|
+
- 반환: `hasSelectable`/`isAllSelected`(Signal), `getSelectable(item)`(true/사유문자열/undefined), `getCanChangeFn(item)`, `select`/`deselect`/`toggle`/`toggleAll`/`isSelected`. `selectMode` 가 `"single"` 이면 단일, `"multi"` 면 누적 선택. 키 비교는 `obj.equal` 으로 결측·객체 키도 안전.
|
|
58
67
|
|
|
59
|
-
|
|
68
|
+
### useSortingManager
|
|
69
|
+
- 입력: `sorts: WritableSignal<SortingDef[]>`.
|
|
70
|
+
- 반환: `defMap`(키→`{ indexText?, desc }`, 다중 정렬 시 순번 표시), `toggle(key, multiple)`(미정렬→오름차순→내림차순→해제 순환, `multiple` 이면 누적), `sort<T>(items)`(현재 정렬로 배열 정렬, null 은 앞쪽).
|
|
71
|
+
- `SortingDef` — `{ key: string; desc: boolean }`.
|
|
60
72
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
- `
|
|
64
|
-
- `
|
|
65
|
-
|
|
66
|
-
## SdTypedTemplate (`ng-template[typed]`)
|
|
67
|
-
|
|
68
|
-
`<ng-template>` 컨텍스트에 타입을 주는 디렉티브(런타임 동작 없음, 타입 가드만).
|
|
69
|
-
|
|
70
|
-
- `typed: input.required<T>` — 컨텍스트 타입 토큰. `let-x` 변수에 `T` 타입이 추론됨. 사이드바/탑바 메뉴 재귀 템플릿이 사용.
|
|
71
|
-
|
|
72
|
-
## SdItemOfTemplate (`ng-template[itemOf]`)
|
|
73
|
-
|
|
74
|
-
항목 반복 템플릿에 항목 타입을 주는 디렉티브.
|
|
75
|
-
|
|
76
|
-
- `itemOf: input.required<TItem[]>` — 항목 배열(타입 추론용 더미, 실제 반복은 부모가 수행).
|
|
77
|
-
- 컨텍스트: `SdItemOfTemplateContext<TItem> = { $implicit; item; index: number; depth: number }`. `let-item="item"` / `let-index="index"` / `let-depth="depth"`.
|
|
78
|
-
- 사용: `sd-shared-data-select`·`sd-calendar` 의 항목 템플릿. `<ng-template [itemOf]="items()" let-item="item">{{ item.name }}</ng-template>`.
|
|
73
|
+
### useExpandingManager<T>
|
|
74
|
+
- 입력: `items`/`expandedItems`(model)/`getChildrenFn`/`sort`.
|
|
75
|
+
- 반환: `displayItems`(펼침 반영 평면 목록)/`hasExpandable`/`isAllExpanded`(Signal), `toggle`/`toggleAll`/`isVisible(item)`(조상이 모두 펼쳐졌는지)/`def(item)`(`ExpandItemDef`).
|
|
76
|
+
- `ExpandItemDef<T>` — `{ item; parentDef; hasChildren; depth }`.
|
|
@@ -1,127 +1,108 @@
|
|
|
1
|
-
# @simplysm/angular — 기능
|
|
1
|
+
# @simplysm/angular — 부가 기능(칸반·권한표·상태프리셋·테마·주소·에디터·시각화)
|
|
2
2
|
|
|
3
3
|
위 군에 들지 않는 도메인성/표시용 컴포넌트 모음. 특정 화면 기능을 붙일 때 개별로 읽힘.
|
|
4
4
|
|
|
5
|
-
## 칸반 (드래그
|
|
5
|
+
## 칸반 보드 (드래그 앤 드롭)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
레인-카드 보드. `sd-kanban-board` > `sd-kanban-lane` > `sd-kanban` 중첩.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
### SdKanbanBoard<L, T> — `sd-kanban-board`
|
|
10
|
+
- `selectedValues: model<T[]>` — 선택된 카드 값(Shift+클릭 다중 선택).
|
|
11
|
+
- `drop: output<SdKanbanBoardDropInfo<L, T>>` — 카드 드롭 시 emit. `{ sourceKanbanValue?, targetLaneValue?, targetKanbanValue? }`(이동한 카드/대상 레인/대상 카드 값).
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
- `
|
|
13
|
-
- `
|
|
14
|
-
- `
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
레인(컬럼). 카드들을 담고 drop 대상이 됨.
|
|
19
|
-
|
|
20
|
-
- `value: input<L>` — 레인 값(drop 시 `targetLaneValue`).
|
|
21
|
-
- `busy: boolean` — 레인 busy 오버레이.
|
|
22
|
-
- `useCollapse: boolean` — 접기 토글 표시. `collapse: model<boolean>` — 접힘 상태.
|
|
23
|
-
- 슬롯: `#titleTpl`(제목), `#toolTpl`(도구). 전체선택 체크박스는 선택 가능 카드가 있을 때.
|
|
24
|
-
|
|
25
|
-
### SdKanban<L, T> (`sd-kanban`)
|
|
26
|
-
|
|
27
|
-
카드. 드래그 소스 + 선택 대상.
|
|
13
|
+
### SdKanbanLane<L, T> — `sd-kanban-lane`
|
|
14
|
+
- `value: input<L>` — 레인 식별 값(드롭 대상).
|
|
15
|
+
- `busy: boolean` — 레인 busy 표시.
|
|
16
|
+
- `useCollapse: boolean` — 접기 버튼 노출.
|
|
17
|
+
- `collapse: model<boolean>` — 접힘 상태.
|
|
18
|
+
- 슬롯: `#titleTpl`(레인 제목), `#toolTpl`(도구). 자식 `sd-kanban` 들 배치.
|
|
28
19
|
|
|
20
|
+
### SdKanban<L, T> — `sd-kanban`
|
|
29
21
|
- `value: input<T>` — 카드 값.
|
|
30
|
-
- `
|
|
31
|
-
- `
|
|
32
|
-
- `contentClass: string` — 카드
|
|
33
|
-
- 사용: `<sd-kanban-board (drop)="onDrop($event)"><sd-kanban-lane [value]="lane"><sd-kanban [value]="card" [draggable]="true">...</sd-kanban></sd-kanban-lane></sd-kanban-board>`.
|
|
34
|
-
|
|
35
|
-
## SdPermissionTable<TModule> (`sd-permission-table`)
|
|
36
|
-
|
|
37
|
-
권한 트리를 표로 표시·편집(use/edit 체크박스). `SdAppStructureProvider.getPermissionsByStructure(...)` 결과를 입력.
|
|
22
|
+
- `selectable: boolean` — Shift+클릭 선택 가능.
|
|
23
|
+
- `draggable: boolean` — 드래그 가능.
|
|
24
|
+
- `contentClass: string` — 카드 클래스.
|
|
38
25
|
|
|
39
|
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
26
|
+
```html
|
|
27
|
+
<sd-kanban-board [(selectedValues)]="selected" (drop)="onDrop($event)">
|
|
28
|
+
<sd-kanban-lane [value]="'todo'"><sd-kanban [value]="task" [draggable]="true">{{ task.title }}</sd-kanban></sd-kanban-lane>
|
|
29
|
+
</sd-kanban-board>
|
|
30
|
+
```
|
|
42
31
|
|
|
43
|
-
##
|
|
32
|
+
## SdPermissionTable — `sd-permission-table`
|
|
44
33
|
|
|
45
|
-
|
|
34
|
+
권한 트리(`SdPermission[]`)를 체크박스 표로 편집. routing-appstructure.md 의 `SdAppStructureProvider.getPermissionsByStructure()` 결과를 입력.
|
|
35
|
+
- `value: model<Record<string, boolean>>` — `"코드.액션"→보유` 권한 맵(체크 상태).
|
|
36
|
+
- `items: input<SdPermission<TModule>[]>` — 권한 트리.
|
|
37
|
+
- `disabled: boolean` — 읽기 전용.
|
|
46
38
|
|
|
47
|
-
|
|
48
|
-
- `state: model.required<TState>` — 현재 상태(프리셋 적용 시 이 모델에 set). 저장은 현재 state 를 스냅샷.
|
|
49
|
-
- `size: "sm"|"lg"` — 버튼 크기.
|
|
50
|
-
- `SdStatePresetDef<TState> = { name: string; state: TState }` — 저장된 프리셋 1개.
|
|
51
|
-
- 별(추가)·저장·삭제 동작은 내장(이름 prompt/덮어쓰기 confirm 모달 사용).
|
|
39
|
+
## SdStatePreset<TState> — `sd-state-preset`
|
|
52
40
|
|
|
53
|
-
|
|
41
|
+
화면 상태(필터 등)를 이름 붙여 저장·복원하는 프리셋 바. 프리셋은 `injectSdSystemConfigResource(key)` 로 영속.
|
|
42
|
+
- `key: input.required<string>` — 프리셋 저장 키(화면 식별).
|
|
43
|
+
- `state: model.required<TState>` — 현재 화면 상태. 프리셋 클릭 시 이 모델에 복원, 저장 시 현재 값을 프리셋에 기록.
|
|
44
|
+
- `size: "sm"|"lg"` — 크기.
|
|
45
|
+
- `SdStatePresetDef<TState>` — `{ name: string; state: TState }`(저장 단위).
|
|
54
46
|
|
|
55
|
-
|
|
47
|
+
## SdThemeSelector — `sd-theme-selector`
|
|
56
48
|
|
|
57
|
-
|
|
49
|
+
글자 크기 증감 + 다크모드 토글 드롭다운. `SdThemeProvider`(infra.md)를 조작. 입력 없음.
|
|
58
50
|
|
|
59
|
-
## SdAddressSearchModal
|
|
51
|
+
## SdAddressSearchModal — `sd-address-search-modal`
|
|
60
52
|
|
|
61
|
-
다음(
|
|
53
|
+
다음(Daum) 우편번호 검색 모달(`SdModalContentDef<Address>`). 스크립트를 동적 로드해 표시, 선택 시 주소 emit.
|
|
54
|
+
- `close: output<Address>` — 선택 결과. `Address` = `{ postNumber?: string; address?: string; buildingName?: string }`(미입력 필드는 undefined 보존).
|
|
62
55
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- 사용: `const addr = await this._sdModal.showAsync({ type: SdAddressSearchModal, title: "주소 검색", inputs: {} }); if (!addr) return;`.
|
|
56
|
+
```ts
|
|
57
|
+
const addr = await sdModal.showAsync({ type: SdAddressSearchModal, title: "주소 검색", inputs: {} });
|
|
58
|
+
```
|
|
67
59
|
|
|
68
|
-
## SdTiptapEditor
|
|
60
|
+
## SdTiptapEditor — `sd-tiptap-editor`
|
|
69
61
|
|
|
70
|
-
Tiptap
|
|
71
|
-
|
|
72
|
-
- `
|
|
73
|
-
- `
|
|
74
|
-
- `
|
|
75
|
-
- `placeholder: string` — 빈 에디터 안내.
|
|
62
|
+
리치텍스트(Tiptap) 에디터. 색상·정렬·목록 툴바 내장.
|
|
63
|
+
- `value: model<string>` — HTML 값.
|
|
64
|
+
- `disabled`/`readonly`/`required: boolean` — 상태.
|
|
65
|
+
- `placeholder: string` — 빈 상태 안내.
|
|
66
|
+
- `validatorFn: (value) => string | undefined` — 커스텀 검증(반환 문자열이 오류).
|
|
76
67
|
- `extensions: AnyExtension[]` — 추가 Tiptap 확장.
|
|
77
68
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
- `theme
|
|
85
|
-
- `color: string` —
|
|
86
|
-
- `clickable: boolean` —
|
|
87
|
-
|
|
88
|
-
### SdNote
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
- `
|
|
102
|
-
- `
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
- `
|
|
111
|
-
- `
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
- `type: input.required<BarcodeType>` — 바코드 종류. `BarcodeType` 은 `"code128"|"qrcode"|"ean13"|"datamatrix"|...`(bwip-js 의 100+ 심볼로지 리터럴 유니온). 대표: `"code128"`(범용 1D), `"qrcode"`(QR), `"ean13"`/`"upca"`(상품), `"datamatrix"`(소형 2D).
|
|
119
|
-
- `value: string` — 인코딩할 데이터(빈 값이면 미렌더).
|
|
120
|
-
|
|
121
|
-
### SdEcharts (`sd-echarts`)
|
|
122
|
-
|
|
123
|
-
ECharts 차트(SVG 렌더). 리사이즈 자동 대응.
|
|
124
|
-
|
|
125
|
-
- `option: input.required<echarts.EChartsOption>` — 차트 옵션. 변경 시 재설정.
|
|
126
|
-
- `notMerge: boolean` — true 면 옵션 병합 없이 교체(기본 false=병합).
|
|
127
|
-
- `loading: boolean` — true 면 로딩 인디케이터.
|
|
69
|
+
보조 헬퍼 `useTiptapToolbar(opt)` — 에디터 시그널을 받아 툴바 상태/명령을 반환(`activeStates`/`activeColor`/`execCmd`/`refreshActiveStates`/`toggleColorPicker`/`applyColor` 등). `TiptapActiveStates` 는 h1/h2/bold/italic/underline/strike/bulletList/orderedList/blockquote/codeBlock/align* 의 활성 여부 맵.
|
|
70
|
+
|
|
71
|
+
## 시각화 컴포넌트
|
|
72
|
+
|
|
73
|
+
### SdLabel — `sd-label`
|
|
74
|
+
배지/태그.
|
|
75
|
+
- `theme` — 테마 계열(미지정=기본 회색).
|
|
76
|
+
- `color: string` — 직접 색상 지정.
|
|
77
|
+
- `clickable: boolean` — 클릭 가능 스타일.
|
|
78
|
+
|
|
79
|
+
### SdNote — `sd-note`
|
|
80
|
+
강조 노트 블록.
|
|
81
|
+
- `theme` — 테마 계열.
|
|
82
|
+
- `size: "sm"|"lg"`, `inset: boolean`.
|
|
83
|
+
|
|
84
|
+
### SdProgress — `sd-progress`
|
|
85
|
+
진행 바.
|
|
86
|
+
- `theme: input.required<테마 계열>` — 바 색상(필수).
|
|
87
|
+
- `value: input.required<number>` — 진행값(0~1, 내부에서 0~100% 클램프).
|
|
88
|
+
- `size: "sm"|"lg"`, `inset: boolean`.
|
|
89
|
+
|
|
90
|
+
### SdCalendar<T> — `sd-calendar`
|
|
91
|
+
월 단위 달력에 항목 배치.
|
|
92
|
+
- `items: input.required<T[]>` — 표시 항목.
|
|
93
|
+
- `getItemDateFn: input.required<(item, index) => DateOnly>` — 항목의 날짜.
|
|
94
|
+
- `yearMonth: DateOnly` — 표시 연월(기본 이번 달 1일).
|
|
95
|
+
- `weekStartDay: number` — 주 시작 요일(기본 0=일).
|
|
96
|
+
- `minDaysInFirstWeek: number` — 첫 주 최소 일수(기본 1).
|
|
97
|
+
- 컨텐츠: `<ng-template [itemOf]>` 로 날짜 셀 항목 렌더.
|
|
98
|
+
|
|
99
|
+
### SdBarcode — `sd-barcode`
|
|
100
|
+
바코드/QR SVG 렌더(bwip-js).
|
|
101
|
+
- `type: input.required<BarcodeType>` — 심볼 종류(`qrcode`/`code128`/`ean13`/`datamatrix` 등 다수, `BarcodeType` union).
|
|
102
|
+
- `value: string` — 인코딩할 데이터(빈 값이면 미표시).
|
|
103
|
+
|
|
104
|
+
### SdEcharts — `sd-echarts`
|
|
105
|
+
ECharts 차트(SVG 렌더).
|
|
106
|
+
- `option: input.required<echarts.EChartsOption>` — 차트 옵션. 변경 시 갱신.
|
|
107
|
+
- `notMerge: boolean` — 옵션 set 시 기존과 병합하지 않고 교체.
|
|
108
|
+
- `loading: boolean` — 로딩 오버레이.
|