@simplysm/sd-claude 14.0.89 โ 14.0.90
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 +16 -17
- package/claude/references/sd-simplysm14/apis/angular/README.md +52 -30
- package/claude/references/sd-simplysm14/apis/angular/controls.md +200 -38
- package/claude/references/sd-simplysm14/apis/angular/crud.md +41 -53
- package/claude/references/sd-simplysm14/apis/angular/directives.md +66 -22
- package/claude/references/sd-simplysm14/apis/angular/features.md +127 -40
- package/claude/references/sd-simplysm14/apis/angular/infra.md +60 -43
- package/claude/references/sd-simplysm14/apis/angular/layout.md +56 -20
- package/claude/references/sd-simplysm14/apis/angular/overlay.md +74 -74
- package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +50 -40
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +55 -15
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +59 -42
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +77 -62
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +8 -7
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +71 -43
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +22 -14
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +19 -19
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +17 -17
- package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +28 -28
- package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +37 -37
- package/claude/references/sd-simplysm14/apis/core-common/README.md +87 -219
- package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +54 -98
- package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +57 -99
- package/claude/references/sd-simplysm14/apis/core-common/datetime.md +60 -103
- package/claude/references/sd-simplysm14/apis/core-common/errors.md +42 -47
- package/claude/references/sd-simplysm14/apis/core-common/obj.md +42 -88
- package/claude/references/sd-simplysm14/apis/core-common/serialization.md +55 -0
- package/claude/references/sd-simplysm14/apis/core-node/README.md +6 -7
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +17 -12
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +14 -13
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +9 -8
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +14 -13
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +4 -8
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +14 -12
- package/claude/references/sd-simplysm14/apis/excel/README.md +22 -22
- package/claude/references/sd-simplysm14/apis/excel/cell.md +37 -29
- package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +29 -15
- package/claude/references/sd-simplysm14/apis/excel/style.md +33 -27
- package/claude/references/sd-simplysm14/apis/excel/utils.md +29 -19
- package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +78 -55
- package/claude/references/sd-simplysm14/apis/excel/wrapper.md +42 -45
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +6 -8
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +118 -67
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +83 -86
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +102 -93
- package/claude/references/sd-simplysm14/apis/orm-common/schema.md +138 -81
- package/claude/references/sd-simplysm14/apis/orm-common/types.md +49 -44
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +42 -42
- package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +44 -33
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +11 -10
- package/claude/references/sd-simplysm14/apis/service-client/README.md +56 -52
- package/claude/references/sd-simplysm14/apis/service-client/orm.md +33 -28
- package/claude/references/sd-simplysm14/apis/service-client/transport.md +23 -21
- package/claude/references/sd-simplysm14/apis/service-common/README.md +83 -48
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +126 -34
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +109 -54
- package/claude/references/sd-simplysm14/apis/service-server/README.md +69 -81
- package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +46 -43
- package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +63 -37
- package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +40 -30
- package/claude/references/sd-simplysm14/apis/storage/README.md +17 -17
- package/claude/references/sd-simplysm14/manuals/client-app-structure.md +142 -140
- package/claude/references/sd-simplysm14/manuals/client-orm.md +1 -1
- package/claude/references/sd-simplysm14/manuals/client-service.md +19 -7
- package/claude/references/sd-simplysm14/manuals/client-shared-data.md +2 -2
- package/claude/references/sd-simplysm14/manuals/client-system-log.md +11 -3
- package/claude/references/sd-simplysm14/manuals/data-log.md +0 -1
- package/claude/references/sd-simplysm14/manuals/orm.md +16 -0
- package/claude/rules/sd-design-rules.md +10 -0
- package/claude/skills/sd-demo/SKILL.md +0 -6
- package/claude/skills/sd-docs/SKILL.md +58 -0
- package/claude/{workflows/sd-docs.rules.md โ skills/sd-docs/references/subagent-prompt.md} +103 -103
- package/claude/skills/sd-impl/SKILL.md +7 -4
- package/claude/skills/sd-spec/SKILL.md +842 -15
- package/claude/skills/sd-spec/references/example-spec.md +26 -36
- package/package.json +1 -1
- package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +0 -53
- package/claude/skills/sd-spec/references/spec-authoring.md +0 -519
- package/claude/workflows/sd-docs.js +0 -84
|
@@ -44,20 +44,19 @@ ORM ํธ์ถ, ํ์ผ ๋ณํ, ๋น์ฆ๋์ค ๋ก์ง ๋ฑ์ ์ ๋ ๊ฒฝ์ฐ์ ํด๋น
|
|
|
44
44
|
|
|
45
45
|
## ํจํค์ง ์ธ๋ฑ์ค
|
|
46
46
|
|
|
47
|
-
- **angular** โ Angular(zoneless
|
|
48
|
-
- **capacitor-plugin-auto-update** โ
|
|
49
|
-
- **capacitor-plugin-file-system** โ Capacitor ํ์ผ ์์คํ
|
|
50
|
-
- **capacitor-plugin-intent** โ Android ์ธํ
ํธ ์ก์์ Capacitor ํ๋ฌ๊ทธ์ธ โ ๋ธ๋ก๋์บ์คํธ
|
|
51
|
-
- **capacitor-plugin-usb-storage** โ USB Mass Storage
|
|
52
|
-
- **core-browser** โ ๋ธ๋ผ์ฐ์ ์ ์ฉ
|
|
53
|
-
- **core-common** โ
|
|
54
|
-
- **core-node** โ Node
|
|
55
|
-
- **excel** โ OOXML(.xlsx) ์ํฌ๋ถ์ ZIP lazy-load ๋ก ์ฝ๊ณ
|
|
56
|
-
- **
|
|
57
|
-
- **orm-
|
|
58
|
-
- **
|
|
59
|
-
- **
|
|
60
|
-
- **service-
|
|
61
|
-
- **service-
|
|
62
|
-
- **
|
|
63
|
-
- **storage** โ FTP/FTPS/SFTP ์๊ฒฉ ์คํ ๋ฆฌ์ง์ ์ฐ๊ฒฐํด ํ์ผยท๋๋ ํ ๋ฆฌ๋ฅผ ์
๋ก๋ยท๋ค์ด๋ก๋ยท์กฐํยท์ญ์ ํ ๋. ์ง์
์ ์ StorageFactory.connect(ํ๋กํ ์ฝ, ์ ์์ ๋ณด, ์ฝ๋ฐฑ)๋ก ์ฐ๊ฒฐยท์ข
๋ฃ ์๋ ๊ด๋ฆฌ. ์์ธํ: [apis/storage/README.md](./apis/storage/README.md)
|
|
47
|
+
- **angular** โ Angular(zoneless) ๊ธฐ๋ฐ SI/์
๋ฌด ํด๋ผ์ด์ธํธ์ฉ UI ์ปดํฌ๋ํธยท๋๋ ํฐ๋ธยท์ ์ญ ํ๋ก๋ฐ์ด๋ยทsignal ํฌํผ โ ๋ถํธ์คํธ๋ฉ(provideSdAngular)ยท๋ชจ๋ฌ/ํ ์คํธ/busy/์ธ์ยท๋ผ์ฐํ
/๋ฉ๋ด/๊ถํยทํผ ์
๋ ฅ ์ปจํธ๋กคยท์ํธ(sd-sheet)ยท๊ณต์ ๋ง์คํฐ ๋ฐ์ดํฐยทCRUD ํ๋ฉด ๊ณจ๊ฒฉยท์ฌ์ด๋๋ฐ/ํ๋ฐ ๋ ์ด์์ยท์นธ๋ฐ/๊ถํํ/์๋ํฐ/์๊ฐํ๋ฅผ ์ธ ๋. ์์ธํ: [apis/angular/README.md](./apis/angular/README.md)
|
|
48
|
+
- **capacitor-plugin-auto-update** โ Android APK ์๋ ์
๋ฐ์ดํธ Capacitor ํ๋ฌ๊ทธ์ธ โ ๋ถํ
์ ์๋ฒ/์ธ๋ถ์ ์ฅ์์ ์ต์ APK ๋ฅผ ๋ฐ์ ์ค์นํ๋ ์ค์ผ์คํธ๋ ์ดํฐ(AutoUpdate)์ ์ ์์ค ์ค์นยท๊ถํยท๋ฒ์ ์กฐํ ์ ์ ํด๋์ค(ApkInstaller). ์์ธํ: [apis/capacitor-plugin-auto-update/README.md](./apis/capacitor-plugin-auto-update/README.md)
|
|
49
|
+
- **capacitor-plugin-file-system** โ Capacitor ๋ค์ดํฐ๋ธ ํ์ผ ์์คํ
์ ๊ทผ(Android OS ํ์ผ ์์คํ
/ ์น IndexedDB ์๋ฎฌ๋ ์ด์
). FileSystem ์ ์ ๋ฉ์๋๋ก ๊ถํ ํ์ธยท์์ฒญ, ๋๋ ํ ๋ฆฌ ์ฝ๊ธฐ/์์ฑ, ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ/์ญ์ , ์ ์ฅ์ ๊ฒฝ๋กยทํ์ผ URI ์กฐํ ์. ์์ธํ: [apis/capacitor-plugin-file-system/README.md](./apis/capacitor-plugin-file-system/README.md)
|
|
50
|
+
- **capacitor-plugin-intent** โ Android ์ธํ
ํธ ์ก์์ Capacitor ํ๋ฌ๊ทธ์ธ(Intent ์ ์ ํด๋์ค) โ ๋ธ๋ก๋์บ์คํธ ๊ตฌ๋
/์ ์ก, ์คํ ์ธํ
ํธ ์กฐํ, newIntent ๋ฆฌ์ค๋, startActivityForResult ์ธ๋ถ Activity ์คํยท๊ฒฐ๊ณผ ์์ . ๋ฐ์ฝ๋ ์ค์บ๋ยทPDA ๋ฑ ์ฐ์
์ฉ ๋๋ฐ์ด์ค ์ฐ๋ ์ ์ฌ์ฉ. ์์ธํ: [apis/capacitor-plugin-intent/README.md](./apis/capacitor-plugin-intent/README.md)
|
|
51
|
+
- **capacitor-plugin-usb-storage** โ ์ฐ๊ฒฐ๋ USB Mass Storage ์ฅ์น๋ฅผ ์ด๊ฑฐยท๊ถํํ์ธ ํ ๋๋ ํ ๋ฆฌ/ํ์ผ์ ์ฝ๋ Capacitor ํ๋ฌ๊ทธ์ธ. ์ ์ ํด๋์ค UsbStorage ์ ์
์ถ๋ ฅ ํ์
(UsbDeviceInfo/UsbDeviceFilter/UsbFileInfo/UsbStoragePlugin) ์ ๊ณต. ์์ธํ: [apis/capacitor-plugin-usb-storage/README.md](./apis/capacitor-plugin-usb-storage/README.md)
|
|
52
|
+
- **core-browser** โ ๋ธ๋ผ์ฐ์ ์ ์ฉ ์ ํธ๋ฆฌํฐ โ DOM ์์ ํ์ยท์์น ๊ณ์ฐยท๊ฐ์์ฑ ํ์ฅ, IndexedDB ์์ํ ๋ฐ ๊ฐ์ ํ์ผ์์คํ
, Blob ๋ค์ด๋ก๋ยทURL ๋ฐ์ด๋๋ฆฌ ์์ ยทํ์ผ ์ ํ ๋ํ์์๊ฐ ํ์ํ ๋. ์์ธํ: [apis/core-browser/README.md](./apis/core-browser/README.md)
|
|
53
|
+
- **core-common** โ ๋ธ๋ผ์ฐ์ ยทNode ๊ณต์ฉ ๊ธฐ๋ฐ ์ ํธ โ ๋ ์ง/์๊ฐ ๊ฐ ํ์
(DateTime/DateOnly/Time), ์๋ฌ ํด๋์ค(SdError ๋ฑ), ๋ฐฐ์ด/๊ฐ์ฒด ์กฐ์, ์ง๋ ฌํ(json/xml/bytes/transfer), ๋น๋๊ธฐ ํยท์ด๋ฒคํธยท๋๊ธฐ, ๋ก๊ฑฐยทํ๊ฒฝ๋ณ์๊ฐ ํ์ํ ๋. ์์ธํ: [apis/core-common/README.md](./apis/core-common/README.md)
|
|
54
|
+
- **core-node** โ Node ์ ์ฉ ์ ํธ: ํ์ผ์์คํ
IO(fsx)ยท๊ฒฝ๋ก ๊ฐ๊ณต(pathx)ยท์์ ํ๋ก์ธ์ค ์คํ(cpx)ยทglob ๊ฐ์(FsWatcher)ยทconsola ๋ก๊น
์
์
(setupConsola)ยทworker_threads ํ์
์์ ๋ํผ(Worker/createWorker)๊ฐ ํ์ํ ๋. ์์ธํ: [apis/core-node/README.md](./apis/core-node/README.md)
|
|
55
|
+
- **excel** โ OOXML(.xlsx) ์ํฌ๋ถ์ ZIP ๋จ์ lazy-load ๋ก ์ฝ๊ณ ์ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ExcelWorkbook/ExcelWorksheet ๋ก ์ํธยท์
๊ฐ/์์ยท์คํ์ผยท์กฐ๊ฑด๋ถ ์์ยท์ด๋ฏธ์งยทํ ๋ณต์ฌยท๋ทฐ๋ฅผ, ExcelWrapper ๋ก Zod ์คํค๋ง ๊ธฐ๋ฐ ๋ ์ฝ๋ โ ์์
๋ณํ์, ExcelUtils ๋ก ์ฃผ์ยท๋ ์ง ์๋ฆฌ์ผยท์ซ์ํ์ ๋ณํ์ ๋ค๋ฃฐ ๋. ์์ธํ: [apis/excel/README.md](./apis/excel/README.md)
|
|
56
|
+
- **orm-common** โ Dialect ๋
๋ฆฝ ORM ์ฝ์ด โ DbContext ์์ยท์ฐ๊ฒฐ/ํธ๋์ญ์
/DDL/๋ง์ด๊ทธ๋ ์ด์
, Table/View/Procedure ์คํค๋ง ๋น๋, Queryable ์ฒด์ด๋ยทCRUDยท๊ฒ์ยทUNION, expr ํํ์ ๋น๋, QueryDef/Expr ASTยทQueryBuilderยท๊ฒฐ๊ณผ ํ์ฑ์ ๋ค๋ฃฐ ๋ ์ฐธ์กฐ. ์์ธํ: [apis/orm-common/README.md](./apis/orm-common/README.md)
|
|
57
|
+
- **orm-node** โ Node.js ํ๊ฒฝ์์ DbContext ๋ฅผ MySQL/MSSQL/PostgreSQL ์ ์ฐ๊ฒฐยท์คํํ๋ ORM ๋ฐํ์ โ ๊ณ ์์ค createOrm(ํธ๋์ญ์
๊ฒฝ๊ณ) ๊ณผ ์ ์์ค createDbConn/DbConn(raw SQLยทํ๋ผ๋ฏธํฐ ์ฟผ๋ฆฌยทbulk insertยท์๋ ํธ๋์ญ์
) ์ ๊ณต. ์์ธํ: [apis/orm-node/README.md](./apis/orm-node/README.md)
|
|
58
|
+
- **sd-cli** โ sd.config.ts ์ค์ ํ์
(SdConfigFnยทํ๊ฒ๋ณ ํจํค์ง ์ค์ ยท๋ฐฐํฌ/Capacitor/Electron/PWA), ํจํค์ง ๋จ์ TS/Angular AOT ์ฆ๋ถ ์ปดํ์ผ๋ฌ SdTsCompiler, Vitest์ฉ Angular Vite ํ๋ฌ๊ทธ์ธ sdAngularPlugin ์ ๋ค๋ฃฐ ๋. ์์ธํ: [apis/sd-cli/README.md](./apis/sd-cli/README.md)
|
|
59
|
+
- **service-client** โ WebSocket ์ผ๋ก ์๋น์ค ์๋ฒ์ ์ ์ํด ์๋น์ค RPC ํธ์ถยท์๋ฒ ํธ์ ์ด๋ฒคํธ ๊ตฌ๋
/๋ฐํยทํ์ผ ์
๋ค์ด๋ก๋ยท์๋ฒ์ธก ORM ์๊ฒฉ ์คํ์ ์ํํ๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ /Node ์์ฉ)๊ฐ ํ์ํ ๋. ์์ธํ: [apis/service-client/README.md](./apis/service-client/README.md)
|
|
60
|
+
- **service-common** โ ์๋ฒยทํด๋ผ์ด์ธํธ ๊ณต์ ์๋น์ค ํต์ ๊ณ์ฝ โ defineEvent ์ด๋ฒคํธ ์ ์, ๋ด์ฅ RPC ์๋น์ค(OrmServiceยทAutoUpdateService) ์๊ทธ๋์ฒ, ์ฑ ๋ฉ๋ดยท๊ถํยท๋ชจ๋ ๊ตฌ์กฐ(AppStructure), WebSocket ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝยท๋ฉ์์ง ํ์
. ์์ธํ: [apis/service-common/README.md](./apis/service-common/README.md)
|
|
61
|
+
- **service-server** โ Fastify ๊ธฐ๋ฐ RPC ์๋น์ค ์๋ฒ(WebSocket/HTTP ์ ์ก, JWT ์ธ์ฆ, ์ ์ ํ์ผยท์
๋ก๋, ์๋ฒ์ธก ์ด๋ฒคํธ ๋ธ๋ก๋์บ์คํธ, ๋ด์ฅ ORM/์๋์
๋ฐ์ดํธ ์๋น์ค)๋ฅผ ๋์ฐ๊ฑฐ๋ defineService/auth ๋ก ์๋น์ค ๋ฉ์๋๋ฅผ ์์ฑํ ๋. ์์ธํ: [apis/service-server/README.md](./apis/service-server/README.md)
|
|
62
|
+
- **storage** โ FTP/FTPS/SFTP ์๊ฒฉ ์คํ ๋ฆฌ์ง์ ์ ์ํด ํ์ผยท๋๋ ํ ๋ฆฌ๋ฅผ ์
๋ก๋ยท๋ค์ด๋ก๋ยท์กฐํยท์ญ์ ํ ๋(StorageFactory.connect ๋ก ์ฐ๊ฒฐ/์ข
๋ฃ ์๋ ๊ด๋ฆฌ). ์์ธํ: [apis/storage/README.md](./apis/storage/README.md)
|
|
@@ -1,35 +1,57 @@
|
|
|
1
1
|
# @simplysm/angular
|
|
2
2
|
|
|
3
|
-
Angular
|
|
3
|
+
Angular(zoneless) ๊ธฐ๋ฐ SI/์
๋ฌด ํด๋ผ์ด์ธํธ์ฉ UI ์ปดํฌ๋ํธยท๋๋ ํฐ๋ธยทํ๋ก๋ฐ์ด๋ยทsignal ํฌํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. `import "@simplysm/core-browser"` ๋ฅผ side-effect ๋ก ๋ก๋ํ๋ฉฐ, ๋ชจ๋ ์ปดํฌ๋ํธ๋ standalone + OnPush + `ViewEncapsulation.None`, selector ๋ `sd-` prefix.
|
|
4
|
+
|
|
5
|
+
> ์ฌ์ฉ ์ ํจํด ๊ทผ๊ฑฐ: `manuals/client-component.md`, `client-shared-data.md`, `client-system-log.md`, `client-demo.md`, `client-rules.md`. ํ๋ฉด ์์ฑ ์ provider ๊ฒฝ์ ํธ์ถยทํ์ค ์๊ทธ๋(ready/initialized/busyCount/viewType)ยท`mark` ์ฌ์ฉยท`$any` ๊ธ์ง ๋ฑ์ ๋งค๋ด์ผ์ ๋ฐ๋ฆ.
|
|
4
6
|
|
|
5
7
|
## ์ฌ์ฉ ํธ๋ฆฌ๊ฑฐ ์ธ๋ฑ์ค
|
|
6
8
|
|
|
7
|
-
- **์ฑ ๋ถํธ์คํธ๋ฉยท์ ์ญ
|
|
8
|
-
-
|
|
9
|
-
- **๋ผ์ฐํ
ยท์ฑ
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
- **๋ ์ด์์(์ฌ์ด๋๋ฐยทํ๋ฐ)** โ
|
|
13
|
-
- **์ํธ(
|
|
14
|
-
- **๊ณต์ ๋ฐ์ดํฐ
|
|
15
|
-
-
|
|
16
|
-
- **CRUD ํ๋ฉด
|
|
17
|
-
- **๊ธฐ๋ฅ ์ปดํฌ๋ํธ(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
##
|
|
22
|
-
|
|
23
|
-
`
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
9
|
+
- **์ฑ ๋ถํธ์คํธ๋ฉยท์ ์ญ ํ๋ก๋ฐ์ด๋** โ `provideSdAngular`, ํ
๋ง/๋ก์ปฌ์คํ ๋ฆฌ์ง/์์คํ
์ค์ /์์คํ
๋ก๊ทธ/์๋น์คํด๋ผ์ด์ธํธ provider ๋ฅผ ๋ฐฐ์ ํ ๋. ์์ธํ: [infra.md](./infra.md)
|
|
10
|
+
- **๋ชจ๋ฌยทํ ์คํธยทbusyยท์ธ์ (์ค๋ฒ๋ ์ด/์ ์ญ ํผ๋๋ฐฑ)** โ ํ๋ฉด์์ ๋ชจ๋ฌ์ ๋์ฐ๊ฑฐ๋, ํ ์คํธ๋ก ์๋ฆผยท์งํ๋ฅ ์ ํ์ํ๊ฑฐ๋, busy ์ธ๋์ผ์ดํฐยท์ธ์/PDF ๋ฅผ ํธ์ถํ ๋. ์์ธํ: [overlay.md](./overlay.md)
|
|
11
|
+
- **๋ผ์ฐํ
ยท์ฑ ๊ตฌ์กฐ(๋ฉ๋ดยท๊ถํ)** โ ๋ผ์ฐํฐ ๋งํฌ, ํ์ฌ ํ์ด์ง ์ฝ๋ยท๋ทฐ ํ์
ยท๋ทฐ ์ ๋ชฉ signal, ๋ฉ๋ดยท๊ถํ ํธ๋ฆฌ(`injectPermsSignal`) ๋ฅผ ๋ค๋ฃฐ ๋. ์์ธํ: [routing-appstructure.md](./routing-appstructure.md)
|
|
12
|
+
- **๋๋ ํฐ๋ธยทsignal setup ํฌํผ** โ ๋ฆฌ์ฌ์ด์ฆ/๊ต์ฐจ/์บก์ฒ ์ด๋ฒคํธ, ์ปค๋งจ๋ ๋จ์ถํค, ripple, ๋
ธ์ถ ์ ๋๋ฉ์ด์
, invalid ํ์, ํ์
๋ ํ
ํ๋ฆฟ์ ๋ถ์ผ ๋. ์์ธํ: [directives.md](./directives.md)
|
|
13
|
+
- **ํผยท๊ธฐ๋ณธ ์
๋ ฅ ์ปจํธ๋กค** โ ๋ฒํผ/์ต์ปค, textfield/textarea/numpad/range/๋ ์ง๋ฒ์, checkbox/switch/group, select/dropdown, form/collapse/tab/list/pagination ์ ๋ฐฐ์นํ ๋. ์์ธํ: [controls.md](./controls.md)
|
|
14
|
+
- **๋ ์ด์์ ์
ธ (์ฌ์ด๋๋ฐยทํ๋ฐ)** โ ์ฑ ์ข์ธก ์ฌ์ด๋๋ฐ/์๋จ๋ฐ + ๋ฉ๋ด/์ฌ์ฉ์ ๋ฉ๋ด๋ฅผ ๊ตฌ์ฑํ ๋. ์์ธํ: [layout.md](./layout.md)
|
|
15
|
+
- **์ํธ(๊ทธ๋ฆฌ๋)** โ `sd-sheet` + ์ปฌ๋ผ/์
ํ
ํ๋ฆฟ์ผ๋ก ๋ค๊ฑด ๋ชฉ๋กยทํธ์ง ํ๋ฅผ ๊ทธ๋ฆด ๋. ์์ธํ: [sheet.md](./sheet.md)
|
|
16
|
+
- **๊ณต์ ๋ง์คํฐ ๋ฐ์ดํฐ + ์ ํ ์ปจํธ๋กค** โ `SdSharedDataProvider` ๋ฑ๋กยท์กฐํ, `sd-shared-data-select`(๋๋กญ๋ค์ด/๋ฒํผ/๋ฆฌ์คํธ) ๋ก ๋ง์คํฐ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ๋. ์์ธํ: [shared-data.md](./shared-data.md)
|
|
17
|
+
- **selection/sorting/expanding ๋งค๋์ ** โ ์ปค์คํ
๋ชฉ๋ก ์ปดํฌ๋ํธ์์ ์ ํยท์ ๋ ฌยทํธ๋ฆฌ ํผ์นจ ์ํ ๋ก์ง์ signal ๋ก ํฉ์ฑํ ๋. ์์ธํ: [selection-managers.md](./selection-managers.md)
|
|
18
|
+
- **CRUD ํ๋ฉด ํ์ค ๊ณจ๊ฒฉ** โ `sd-base-container` / `sd-crud-list` / `sd-crud-detail` ๋ก ๋ชฉ๋ก/๋จ๊ฑด ํ๋ฉด์ ๋ง๋ค ๋. ์์ธํ: [crud.md](./crud.md)
|
|
19
|
+
- **๊ธฐ๋ฅ ์ปดํฌ๋ํธ (์นธ๋ฐยท๊ถํํยท์ํํ๋ฆฌ์
ยทํ
๋ง์ ํยท์ฃผ์๊ฒ์ยท์๋ํฐยท์๊ฐํ)** โ ์ ๊ตฐ์ ์ ๋๋ ๋๋ฉ์ธ์ฑ ์ปดํฌ๋ํธ๋ฅผ ์ธ ๋. ์์ธํ: [features.md](./features.md)
|
|
20
|
+
|
|
21
|
+
์๋๋ ๊ตฐ์ ๋ณ๋๋ก ๋ ๋งํผ ํฌ์ง ์์ ์ ํธยทํ์
ยทํ์์ฉ ์ฌ๋ณผ์ ์ธ๋ผ์ธ ์น์
์ด๋ค.
|
|
22
|
+
|
|
23
|
+
## signalยทDOM ์ ํธ
|
|
24
|
+
|
|
25
|
+
- `mark(sig: WritableSignal<any>): void` โ WritableSignal ์ ๊ฐ์ in-place ๋ณ๊ฒฝํ ๋ค ๋ณ๊ฒฝ ์๋ฆผ๋ง ๋ฐํ. ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ด๋ฉด `[...v]`, ๊ฐ์ฒด๋ฉด `{...v}` ๋ก shallow copy ํด ์ ์ฐธ์กฐ๋ฅผ set. effect ๊ฐ์ ์ฌ๋ฐํ๋ ๊ฐ์ฒด/๋ฐฐ์ด ํ๋ ๋ณ๊ฒฝ ์๋ฆผ์ ์ฌ์ฉ. ๋งค๋ด์ผ ๊ถ์ฅ ํจํด: `doRefresh(){ mark(this.lastFilter); }`, ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ ์์ ๋ณ๊ฒฝ ์ `(valueChange)="mark(filter)"`.
|
|
26
|
+
- `setSafeStyle(renderer: Renderer2, el: HTMLElement, style: Partial<CSSStyleDeclaration>): void` โ `style` ๊ฐ์ฒด์ ๊ฐ ํค๋ฅผ `renderer.setStyle` ๋ก ์ ์ฉ. Angular Renderer ๊ฒฝ์ ๋ก DOM ์คํ์ผ์ ์์ ํ๊ฒ ์ผ๊ด ์ธํ
ํ ๋(์ง์ `el.style` ๋์
์ ํผํด์ผ ํ๋ ๋๋ ํฐ๋ธ/setup ๋ด๋ถ).
|
|
27
|
+
|
|
28
|
+
## FormatPipe (`format` ํ์ดํ)
|
|
29
|
+
|
|
30
|
+
- `transform(value: string | DateTime | DateOnly | undefined, format: string): string` โ ๊ฐ ํ์ ํฌ๋งคํ
ํ์ดํ(`name: "format"`).
|
|
31
|
+
- `value` ๊ฐ `null`/`undefined` โ `""` ๋ฐํ(๊ฒฐ์ธก ๋ณด์กด).
|
|
32
|
+
- `DateTime`/`DateOnly` โ `value.toFormatString(format)`.
|
|
33
|
+
- `string` โ `format` ์ `|` ๋ก ๋์ด ๊ฐ ํ๋ณด์์ `X` ๊ฐ์๊ฐ ๋ฌธ์์ด ๊ธธ์ด์ ๊ฐ์ ๊ฒ์ ์ฐพ์ `X` ์๋ฆฌ์ ํ ๊ธ์์ฉ ๋ผ์ ๋ง์คํน(์: ์ ํ๋ฒํธ `"XXX-XXXX-XXXX"`). ๋งค์นญ ํ๋ณด๊ฐ ์์ผ๋ฉด ์๋ฌธ ๊ทธ๋๋ก.
|
|
34
|
+
- ์ฌ์ฉ: `{{ phone | format: 'XXX-XXXX-XXXX' }}`, `{{ date | format: 'yyyy-MM-dd' }}`.
|
|
35
|
+
|
|
36
|
+
## ๋๋ ํฐ๋ธ ์
๋ ฅ ์ถ๋ก ํ์
|
|
37
|
+
|
|
38
|
+
๋ชจ๋ฌ/ํ ์คํธ/์ธ์ provider ์ `inputs` ํ์
๊ณ์ฐ์ ์ฐ์ด๋ ์ ํธ ํ์
. ์ง์ ์ธ ์ผ์ ๋๋ฌผ์ง๋ง ์๊ทธ๋์ฒ ํด์์ฉ์ผ๋ก ๋
ธ์ถ๋จ.
|
|
39
|
+
|
|
40
|
+
- `DirectiveInputSignals<T>` โ ์ปดํฌ๋ํธ/๋๋ ํฐ๋ธ ํด๋์ค `T` ์ `InputSignal` ํ๋กํผํฐ๋ง ๊ณจ๋ผ `{ ํค: ๊ฐํ์
}` ์ผ๋ก ์ถ์ถ. `InputSignal` ์๋ ๋ฉค๋ฒ๋ ์ ์ธ, `undefined` ํฌํจ ํ๋๋ optional ๋ก ๋ณํ.
|
|
41
|
+
- `UndefToOptional<T>` โ `undefined` ๋ฅผ ํฌํจํ๋ ํ๋กํผํฐ๋ฅผ optional(`?`)๋ก ๋ฐ๊พธ๋ ๋งคํ ํ์
. `DirectiveInputSignals` ๋ด๋ถ์์ ์ฌ์ฉ.
|
|
42
|
+
- `WithOptional<T, K extends keyof T>` โ ํน์ ํค `K` ๋ง optional ๋ก ๋ง๋ ํ์
(`Omit<T,K> & Partial<Pick<T,K>>`). provider ์ `inputs` ์์ "๊ธฐ๋ณธ๊ฐ ์๋ ์
๋ ฅ์ ์๋ต ๊ฐ๋ฅ" ์ ํํ.
|
|
43
|
+
|
|
44
|
+
## SelectModalOutputResult
|
|
45
|
+
|
|
46
|
+
- `interface SelectModalOutputResult<TKey = any> { selectedKeys: TKey[] }` โ ์ ํ ์ ์ฉ ๋ชจ๋ฌ์ด close ์ emit ํ๋ ํ์ด๋ก๋ ๊ท์ฝ. `SdSelectModal` / `SdModalSelectButton` / `sd-shared-data-select` ๋ชจ๋ฌ ์ฐ๋์ ๋ฐํ ํ์
. ์ ํ ๋ชจ๋ฌ ์ปดํฌ๋ํธ๋ ์ด ํ์
์ `close.emit` ์ผ๋ก ๋๋ ค์ค.
|
|
47
|
+
|
|
48
|
+
## SdGap (`sd-gap`)
|
|
49
|
+
|
|
50
|
+
์ฌ๋ฐฑ ์ ์ฉ ๋น ์ปดํฌ๋ํธ. flex ๋ ์ด์์ ์ฌ์ด ๊ฐ๊ฒฉ์ ํ ํฐ/ํฝ์
๋ก ์ฝ์
.
|
|
51
|
+
|
|
52
|
+
- `height: "xxs"|"xs"|"sm"|"default"|"lg"|"xl"|"xxl"` โ ์ธ๋ก ๊ฐ๊ฒฉ ํ ํฐ(`--gap-*`). ์ธ๋ก ์คํ ์ฌ์ด ๊ฐ๊ฒฉ์ ์ฌ์ฉ. ์ง์ ์ display=block.
|
|
53
|
+
- `heightPx: number` โ ์ธ๋ก ๊ฐ๊ฒฉ px. `0` ์ด๋ฉด display=none(๊ฐ๊ฒฉ ์ ๊ฑฐ).
|
|
54
|
+
- `width: "xxs"|...|"xxl"` โ ๊ฐ๋ก ๊ฐ๊ฒฉ ํ ํฐ. ๊ฐ๋ก ๋์ด ์ฌ์ด ๊ฐ๊ฒฉ์ ์ฌ์ฉ. ์ง์ ์ display=inline-block.
|
|
55
|
+
- `widthPx: number` โ ๊ฐ๋ก ๊ฐ๊ฒฉ px. `0` ์ด๋ฉด display=none.
|
|
56
|
+
- `widthEm: number` โ ๊ฐ๋ก ๊ฐ๊ฒฉ em. `0` ์ด๋ฉด display=none.
|
|
57
|
+
- ์ฌ์ฉ: `<sd-gap [width]="'sm'" />`.
|
|
@@ -1,51 +1,213 @@
|
|
|
1
|
-
# @simplysm/angular โ
|
|
1
|
+
# @simplysm/angular โ ํผยท๊ธฐ๋ณธ ์
๋ ฅ ์ปจํธ๋กค
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
- theme(๊ธฐ๋ณธ 8์): `"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray"` โ ์์ ํ
๋ง.
|
|
5
|
-
- size: `"sm"|"lg"` โ ์๊ฒ/ํฌ๊ฒ(๋ฏธ์ง์ =๊ธฐ๋ณธ).
|
|
6
|
-
- inline: boolean โ inline-block ์ผ๋ก ๋ฐฐ์น(ํญ ์๋).
|
|
7
|
-
- inset: boolean โ ํ
๋๋ฆฌยท๋ผ์ด๋ ์ ๊ฑฐ(์
/๊ทธ๋ฃน ๋ด๋ถ ์ฝ์
์ฉ).
|
|
8
|
-
- disabled: boolean โ ๋นํ์ฑ.
|
|
3
|
+
๋ฒํผยท์ต์ปค, ํ
์คํธ/์ซ์/๋ ์ง ์
๋ ฅ, ์ฒดํฌ๋ฐ์ค/์ค์์น, ์
๋ ํธ/๋๋กญ๋ค์ด, ํผ/์ ๊ธฐ/ํญ/๋ฆฌ์คํธ/ํ์ด์ง๋ค์ด์
๋ฑ ํผยทUI ๊ธฐ๋ณธ ์ปจํธ๋กค ๊ตฐ. ํ๋ฉด ํผยทํํฐยท์ํธ ์
์์ ํจ๊ป ์ฐ์. ๊ณตํต: ๊ฑฐ์ ๋ชจ๋ ์ปจํธ๋กค์ด `size: "sm"|"lg"`(๋ฏธ์ง์ =๊ธฐ๋ณธ), `inline`, `inset`(ํ
๋๋ฆฌ ์ ๊ฑฐยท์
๋ด์ฅ์ฉ), `disabled`, `theme` ์ ๊ฐ์ง. ๋งค๋ด์ผ(client-component.md "ํ์ค ์
๋ ฅ ์ปจํธ๋กค"ยท"๋ฒํผ ์คํ์ผ")์ ์ญํ ๋ณ theme/size ๊ท์ฝ์ ๋ฐ๋ฆ.
|
|
9
4
|
|
|
10
|
-
##
|
|
5
|
+
## ๋ฒํผยท์ต์ปค
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
- **SdAnchor** `<sd-anchor>` โ ํ
์คํธ ๋งํฌ. `theme`(8์, ๊ธฐ๋ณธ primary), `disabled`. ์ธ๋ผ์ธ ํด๋ฆญ ์์(์์ด์ฝ ๋ฒํผ ๋ฑ)์.
|
|
14
|
-
- **SdAdditionalButton** `<sd-additional-button>` โ ๋ด์ฉ + ์ฐ์ธก ๋ถ์ ๋ฒํผ(`sd-anchor`/`sd-button` ํฌ์) ์ปจํ
์ด๋. `size`/`inset`.
|
|
15
|
-
- **SdModalSelectButton** `<sd-modal-select-button>` โ ํด๋ฆญ ์ ์ ํ ๋ชจ๋ฌ์ ๋์ ๊ฐ ์ ํ. `modal = input.required<SdSelectModalInfo<...>>()`, `value = model()`, `selectMode`("single"|"multi", ๊ธฐ๋ณธ single โ single ์ด๋ฉด ๋จ์ผ ํค, multi ๋ฉด ํค ๋ฐฐ์ด), `required`(๋ฏธ์ ํ ์ ๊ฒ์ฆ ์ค๋ฅ + ์ง์ฐ๊ฐ ์จ๊น), `disabled`/`inset`/`size`, `modalOptions`, `searchIcon`. required ์๋๊ณ ๊ฐ ์์ผ๋ฉด ์ง์ฐ๊ฐ ํ์. ํ์
: `SdSelectModal<TKey>`(์ ํ๋ชจ๋ฌ์ด ๊ตฌํ, `SdModalContentDef<SelectModalOutputResult<TKey>>` + `selectMode`/`selectedKeys` input), `SdSelectModalInfo<T>`(selectMode/selectedKeys ์ ์ธํ ๋ชจ๋ฌ ์ ๋ณด).
|
|
7
|
+
### SdButton (`sd-button`)
|
|
16
8
|
|
|
17
|
-
|
|
9
|
+
- `type: "button"|"submit"` โ ๋ฒํผ ํ์
. `"submit"` ์ด๋ฉด ๋ถ๋ชจ `sd-form` submit ํธ๋ฆฌ๊ฑฐ. ๊ธฐ๋ณธ `"button"`.
|
|
10
|
+
- `theme` โ ์ ํ
๋ง. ์ผ๋ฐ ์๋ฆฌ์ฆ `"primary"|"secondary"|"info"|"success"|"warning"|"danger"|"gray"|"blue-gray"`(์ฑ์ ๋ฒํผ), link ์๋ฆฌ์ฆ `"link"|"link-primary"|...|"link-blue-gray"|"link-rev"`(ํ
๋๋ฆฌยท๋ฐฐ๊ฒฝ ์๋ ํ
์คํธ ๋ฒํผ). ์ ์ฅ/์ญ์ ๋ฑ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ต์์ ์ก์
์ ์ผ๋ฐ ์๋ฆฌ์ฆ, ์ ํธ/์ํธ ์ ๋ฒํผ์ link ์๋ฆฌ์ฆ(client-component.md).
|
|
11
|
+
- `size: "sm"|"lg"` โ ํจ๋ฉ ํฌ๊ธฐ. ์ํธ ์/์
๋ฒํผ์ `"sm"`.
|
|
12
|
+
- `inline: boolean` โ true ๋ฉด width auto(์ธ๋ผ์ธ ๋ฐฐ์น). ๊ธฐ๋ณธ์ width 100%.
|
|
13
|
+
- `inset: boolean` โ true ๋ฉด ํ
๋๋ฆฌยทradius ์ ๊ฑฐ(์ปจํ
์ด๋ ๋ด์ฅ ๋ฒํผ).
|
|
14
|
+
- `disabled: boolean` โ ๋นํ์ฑ.
|
|
15
|
+
- `buttonStyle: string` / `buttonClass: string` โ ๋ด๋ถ `<button>` ์ ์ง์ ์ค ์คํ์ผ/ํด๋์ค.
|
|
16
|
+
- ์ฌ์ฉ: `<sd-button [theme]="'primary'" (click)="onSave()">์ ์ฅ</sd-button>`.
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
- **SdTextfieldTypes / sdTextfieldTypes** โ ํ์
โ๊ฐ ๋งคํ: `number`:number, `text`/`password`/`color`/`email`/`format`:string, `date`/`month`/`year`:DateOnly, `datetime`/`datetime-sec`:DateTime, `time`/`time-sec`:Time. `sdTextfieldTypes` ๋ ํค ๋ฐฐ์ด(์: select ์ต์
์์ฑ).
|
|
21
|
-
- **SdTextarea** `<sd-textarea>` โ ์ฌ๋ฌ ์ค ํ
์คํธ. `value = model<string>()`, `minRows`(๊ธฐ๋ณธ 1, ๋ด์ฉ ์ค ์๋งํผ ์๋ ํ์ฅ), `placeholder`/`title`/`required`/`readonly`/`validatorFn`/`inline`/`inset`/`size`/`theme`/`inputStyle`/`inputClass`.
|
|
22
|
-
- **SdNumpad** `<sd-numpad>` โ ํ๋ฉด ์ซ์ ํคํจ๋. `value = model<number>()`, `placeholder`, `required`, `inputDisabled`(์๋จ ์
๋ ฅ์นธ ์ง์ ์
๋ ฅ ๋ง๊ธฐ), `useEnterButton`/`useMinusButton`(ENT/โ ๋ฒํผ ํ์), `enterButtonClick = output()`.
|
|
23
|
-
- **SdRange<K>** `<sd-range [type]="...">` โ ๋์ผ ํ์
๋ ๊ฐ์ ๋ฒ์(`from ~ to`). `type = input.required<K>()`, `from`/`to` = model<SdTextfieldTypes[K]>(), `required`/`disabled`/`inputStyle`. to ์ min ์ from ์ผ๋ก ์๋ ์ ํ.
|
|
24
|
-
- **SdDateRangePicker** `<sd-date-range-picker>` โ ์ผ/์/๋ฒ์ ์ ํ. `periodType = model<"์ผ"|"์"|"๋ฒ์">("๋ฒ์")`(์ผ=from=to ๋๊ธฐํ, ์=ํด๋น ์ 1์ผ~๋ง์ผ ์๋, ๋ฒ์=from~to ์์ ), `from`/`to` = model<DateOnly>(), `required`.
|
|
18
|
+
### SdAnchor (`sd-anchor`)
|
|
25
19
|
|
|
26
|
-
|
|
20
|
+
์ธ๋ผ์ธ ํ
์คํธ ๋งํฌ/์์ด์ฝ ๋ฒํผ.
|
|
27
21
|
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
22
|
+
- `theme: "primary"|...|"blue-gray"` โ ํ
์คํธ ์(๊ธฐ๋ณธ `"primary"`). hover ์ underline.
|
|
23
|
+
- `disabled: boolean` โ true ๋ฉด ํ๋ ค์ง๊ณ ํฌ์ธํฐยทtabindex ์ ๊ฑฐ.
|
|
24
|
+
- ์ฌ์ฉ: ์ํธ ์
์ ์ก์
์์ด์ฝ `<sd-anchor [theme]="'danger'" (click)="onDelete()"><ng-icon [svg]="tablerEraser" /></sd-anchor>`.
|
|
31
25
|
|
|
32
|
-
|
|
26
|
+
### SdAdditionalButton (`sd-additional-button`)
|
|
33
27
|
|
|
34
|
-
|
|
35
|
-
- **SdSelectItem<T>** `<sd-select-item [value]="...">` โ ์ ํ ํญ๋ชฉ. `value`, `disabled`, `hidden`(๊ฒ์ ํํฐ ๋ฑ์ผ๋ก ์จ๊น). multi ๋ชจ๋๋ฉด ์ข์ธก ์ฒดํฌ๋ฐ์ค ํ์. Enter/Space ๋ก ์ ํยทํ ๊ธ.
|
|
36
|
-
- **SdSelectButton** `<sd-select-button>` โ sd-select ์ฐ์ธก์ ๋ถ๋ ๋ถ์ ๋ฒํผ(๊ฒ์/ํธ์ง ๋ฑ ํธ๋ฆฌ๊ฑฐ). input ์์, ํด๋ฆญ ์ด๋ฒคํธ๋ ํฌ์๋ ๋ด์ฉ์์ ์ฒ๋ฆฌ.
|
|
28
|
+
์ฝํ
์ธ + ์ฐ์ธก ๋ฒํผ์ ํ ํ
๋๋ฆฌ๋ก ๋ฌถ๋ ์ปจํ
์ด๋. `<ng-content>` ๋ณธ๋ฌธ + ํฌ์๋ `sd-anchor`/`sd-button`.
|
|
37
29
|
|
|
38
|
-
|
|
30
|
+
- `size: "sm"|"lg"` โ ํจ๋ฉ.
|
|
31
|
+
- `inset: boolean` โ ํ
๋๋ฆฌยทradius ์ ๊ฑฐ.
|
|
39
32
|
|
|
40
|
-
|
|
41
|
-
- **SdDropdownPopup** `<sd-dropdown-popup>` โ ๋๋กญ๋ค์ด ๋ด์ฉ. input ์์. ๋ด์ฉ ๋์ด 300px ์ด๊ณผ ์ ์๋ ์คํฌ๋กค ์บก.
|
|
33
|
+
### SdModalSelectButton (`sd-modal-select-button`)
|
|
42
34
|
|
|
43
|
-
|
|
35
|
+
๊ฐ ํ์ + ๊ฒ์ ๋ฒํผ์ผ๋ก ์ ํ ๋ชจ๋ฌ์ ๋์ฐ๋ ์
๋ ฅ. ์ ํ ๊ฒฐ๊ณผ(`SelectModalOutputResult`)๋ฅผ `value` ์ ๋ฐ์.
|
|
44
36
|
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
37
|
+
- `modal: input.required<SdSelectModalInfo<SdSelectModal<K>>>` โ ๋์ธ ์ ํ ๋ชจ๋ฌ ์ ๋ณด(`selectMode`/`selectedKeys` ๋ ์๋ ์ฃผ์
๋๋ฏ๋ก inputs ์์ ์ ์ธ).
|
|
38
|
+
- `value: model<...>` โ ์ ํ ๊ฐ. `selectMode="single"` ์ด๋ฉด ๋จ์ผ ํค, `"multi"` ๋ฉด ํค ๋ฐฐ์ด.
|
|
39
|
+
- `selectMode: "single"|"multi"` โ ์ ํ ๋ชจ๋(๊ธฐ๋ณธ `"single"`).
|
|
40
|
+
- `modalOptions: SdModalOptions` โ ๋ชจ๋ฌ ํ์ ์ต์
.
|
|
41
|
+
- `required: boolean` โ true ๋ฉด ๊ฐ ์์ ๋ invalid(๋นจ๊ฐ ์ ) + ์ง์ฐ๊ฐ ๋ฒํผ ์จ๊น.
|
|
42
|
+
- `disabled` / `inset` / `size` โ ๊ณตํต.
|
|
43
|
+
- `searchIcon: input` โ ๊ฒ์ ๋ฒํผ ์์ด์ฝ(๊ธฐ๋ณธ `tablerSearch`).
|
|
44
|
+
- ๋์: ๊ฒ์ ๋ฒํผ ํด๋ฆญ โ ํ์ฌ ๊ฐ์ผ๋ก `selectedKeys` ์ฑ์ ๋ชจ๋ฌ ํ์ โ ๊ฒฐ๊ณผ๋ก `value` ๊ฐฑ์ . required ๊ฐ ์๋๊ณ ๊ฐ ์์ผ๋ฉด ์ง์ฐ๊ฐ๋ก ๋น์.
|
|
45
|
+
- `SdSelectModal<TKey>` = `SdModalContentDef<SelectModalOutputResult<TKey>>` + `selectMode`/`selectedKeys` input. ์ ํ ๋ชจ๋ฌ ์ปดํฌ๋ํธ๊ฐ ๊ตฌํ(๋ณดํต `sd-crud-list` ๋ฅผ ๋ชจ๋ฌ๋ก).
|
|
46
|
+
- `SdSelectModalInfo<T>` = `SdModalInfo<T, "selectMode"|"selectedKeys">`.
|
|
47
|
+
|
|
48
|
+
## ํ
์คํธยท์ซ์ยท๋ ์ง ์
๋ ฅ
|
|
49
|
+
|
|
50
|
+
### SdTextfield<K> (`sd-textfield`)
|
|
51
|
+
|
|
52
|
+
ํ์
๋ณ ํธ๋ค๋ฌ๋ก ํ์ฑยทํฌ๋งทยท๊ฒ์ฆํ๋ ๋ง๋ฅ ์
๋ ฅ. `value` ํ์
์ด `type` ์ ๋ฐ๋ผ ๊ฒฐ์ ๋จ.
|
|
53
|
+
|
|
54
|
+
- `type: input.required<K extends keyof SdTextfieldTypes>` โ ์
๋ ฅ ํ์
. ๊ฐ ํ์
๋งคํ(`SdTextfieldTypes`):
|
|
55
|
+
- `"text"|"password"|"email"|"color"|"format"` โ `string`.
|
|
56
|
+
- `"number"` โ `number`(์ฝค๋ง ํ์, ์ฐ์ ๋ ฌ).
|
|
57
|
+
- `"date"|"month"|"year"` โ `DateOnly`.
|
|
58
|
+
- `"datetime"|"datetime-sec"` โ `DateTime`(sec ๋ ์ด ํฌํจ).
|
|
59
|
+
- `"time"|"time-sec"` โ `Time`.
|
|
60
|
+
- (`sdTextfieldTypes` ๋ ์ด ํค๋ค์ ๋ฐํ์ ๋ฐฐ์ด.)
|
|
61
|
+
- `value: model<SdTextfieldTypes[K]>` โ ๊ฐ. ๋น ์
๋ ฅ์ `undefined`(๊ฒฐ์ธก ๋ณด์กด). ํ์ฑ ์คํจ ์ ํ์๊ฐ ๋กค๋ฐฑ.
|
|
62
|
+
- `placeholder` / `title` โ ์๋ด/ํดํ.
|
|
63
|
+
- `disabled` / `readonly` โ readonly ๋ ๊ฐ ํ์๋ง(input ๋ฏธ๋ ๋).
|
|
64
|
+
- `required: boolean` โ ๋น ๊ฐ์ด๋ฉด invalid.
|
|
65
|
+
- `min` / `max: SdTextfieldTypes[K]` โ ์ซ์/๋ ์ง/์๊ฐ ๋ฒ์ ๊ฒ์ฆ.
|
|
66
|
+
- `minlength` / `maxlength: number` / `pattern: string` โ ๋ฌธ์์ด ๊ธธ์ดยท์ ๊ท์ ๊ฒ์ฆ(text ๊ณ์ด).
|
|
67
|
+
- `format: string` โ `"format"` ํ์
์ ๋ง์คํน ํจํด(์: `"XXX-XXXX"`, `|` ๋ก ์ฌ๋ฌ ๊ธธ์ด ํ๋ณด).
|
|
68
|
+
- `validatorFn: (value) => string | undefined` โ ์ปค์คํ
๊ฒ์ฆ. ๋ฉ์์ง ๋ฐํ ์ invalid.
|
|
69
|
+
- `step: number` โ ์ซ์/๋ ์ง ์คํ
.
|
|
70
|
+
- `autocomplete: string` โ ์๋์์ฑ ์์ฑ.
|
|
71
|
+
- `useNumberComma: boolean` โ `"number"` ํ์ ์ ์ฒ๋จ์ ์ฝค๋ง(๊ธฐ๋ณธ true). false ๋ฉด ์ฝค๋ง ์์ด.
|
|
72
|
+
- `minDigits: number` โ ์ซ์ ํ์ ์ต์ ์์ ์๋ฆฟ์.
|
|
73
|
+
- `inline` / `inset` / `size` / `theme` / `inputStyle` / `inputClass` โ ๊ณตํต/์คํ์ผ.
|
|
74
|
+
- ์ฌ์ฉ: `<sd-textfield [type]="'number'" [(value)]="data().qty" (valueChange)="mark(data)" />`.
|
|
75
|
+
|
|
76
|
+
### SdTextarea (`sd-textarea`)
|
|
77
|
+
|
|
78
|
+
์ฌ๋ฌ ์ค ํ
์คํธ. ๋ด์ฉ ์ค ์์ ๋ฐ๋ผ ์๋ ๋์ด(`minRows` ์ด์).
|
|
79
|
+
|
|
80
|
+
- `value: model<string>` โ ๋น ๊ฐ์ `undefined`.
|
|
81
|
+
- `minRows: number` โ ์ต์ ์ค ์(๊ธฐ๋ณธ 1).
|
|
82
|
+
- `placeholder` / `title` / `disabled` / `readonly` / `required` / `validatorFn` / `inline` / `inset` / `size` / `theme` / `inputStyle` / `inputClass` โ `sd-textfield` ์ ๋์ผ ์๋ฏธ.
|
|
83
|
+
|
|
84
|
+
### SdNumpad (`sd-numpad`)
|
|
85
|
+
|
|
86
|
+
ํฐ์น ์ซ์ ์
๋ ฅ ํจ๋ + ํ์ ํ๋.
|
|
87
|
+
|
|
88
|
+
- `value: model<number>` โ ์
๋ ฅ๋ ์ซ์.
|
|
89
|
+
- `placeholder: string` โ ํ์ ํ๋ placeholder.
|
|
90
|
+
- `required: boolean` โ true ๋ฉด ๋น ๊ฐ์์ ENT ๋นํ์ฑ.
|
|
91
|
+
- `inputDisabled: boolean` โ true ๋ฉด ์๋จ ํ
์คํธ ์ง์ ์
๋ ฅ ๋ง๊ณ ํจ๋๋ง.
|
|
92
|
+
- `useEnterButton: boolean` โ true ๋ฉด ENT ๋ฒํผ ํ์.
|
|
93
|
+
- `useMinusButton: boolean` โ true ๋ฉด ๋ถํธ(-) ๋ฒํผ ํ์.
|
|
94
|
+
- `enterButtonClick: output()` โ ENT ํด๋ฆญ ์ ๋ฐํ(ํ์ ์ฒ๋ฆฌ ํธ๋ฆฌ๊ฑฐ).
|
|
95
|
+
|
|
96
|
+
### SdRange<K> (`sd-range`)
|
|
97
|
+
|
|
98
|
+
`from ~ to` ๋ ์
๋ ฅ. `to` ์ min ์ `from` ์ผ๋ก ์๋ ์ ํ.
|
|
99
|
+
|
|
100
|
+
- `type: input.required<K>` โ `sd-textfield` ์ ๋์ผ ํ์
ํค.
|
|
101
|
+
- `from: model<SdTextfieldTypes[K]>` / `to: model<SdTextfieldTypes[K]>` โ ๋ฒ์ ์๋.
|
|
102
|
+
- `required` / `disabled` / `inputStyle` โ ๊ณตํต.
|
|
103
|
+
|
|
104
|
+
### SdDateRangePicker (`sd-date-range-picker`)
|
|
105
|
+
|
|
106
|
+
๊ธฐ๊ฐ ์ข
๋ฅ(์ผ/์/๋ฒ์) ์ ํ + ๊ทธ์ ๋ง๋ ๋ ์ง ์
๋ ฅ. ์ข
๋ฅยท์์์ผ ๋ณ๊ฒฝ ์ `to` ์๋ ๋๊ธฐํ(์ผ=from๊ณผ ๋์ผ, ์=๊ทธ ๋ฌ 1์ผ~๋ง์ผ, ๋ฒ์=from>to๋ฉด ๋ณด์ ).
|
|
107
|
+
|
|
108
|
+
- `periodType: model<"์ผ"|"์"|"๋ฒ์">` โ ๊ธฐ๊ฐ ์ข
๋ฅ(๊ธฐ๋ณธ `"๋ฒ์"`).
|
|
109
|
+
- `from: model<DateOnly>` / `to: model<DateOnly>` โ ๊ธฐ๊ฐ ์๋.
|
|
110
|
+
- `required: boolean` โ ํ์ ์ฌ๋ถ.
|
|
111
|
+
- ์ฌ์ฉ: `<sd-date-range-picker [(from)]="filter().from" [(to)]="filter().to" (fromChange)="mark(filter)" />`.
|
|
112
|
+
|
|
113
|
+
## ์ฒดํฌ๋ฐ์คยท์ค์์น
|
|
114
|
+
|
|
115
|
+
### SdCheckbox (`sd-checkbox`)
|
|
116
|
+
|
|
117
|
+
์ฒดํฌ๋ฐ์ค ๋๋ ๋ผ๋์ค. `canChangeFn` ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋.
|
|
118
|
+
|
|
119
|
+
- `value: model<boolean>` โ ์ฒดํฌ ์ํ.
|
|
120
|
+
- `canChangeFn: (next: boolean) => boolean | Promise<boolean>` โ ๋ณ๊ฒฝ ์๋ ์ false(๋๋ Promise<false>) ๋ฉด ๋ณ๊ฒฝ ์ฐจ๋จ. ๋น๋๊ธฐ ํ์ธ ํ ๋ณ๊ฒฝ์ ์ฌ์ฉ.
|
|
121
|
+
- `radio: boolean` โ true ๋ฉด ๋ผ๋์ค ๋ชจ์(ํด๋ฆญ ์ ํญ์ true, ํ ๊ธ ์ ํจ).
|
|
122
|
+
- `icon: input` โ ์ฒดํฌ ์์ด์ฝ(๊ธฐ๋ณธ `tablerCheck`).
|
|
123
|
+
- `disabled` / `size` / `inline` / `inset` / `theme`(+`"white"`) / `contentStyle` โ ๊ณตํต/์คํ์ผ.
|
|
124
|
+
- ์ฌ์ฉ: ๋ผ๋์ค ๊ทธ๋ฃน์ ๊ฐ์ ๋ชจ๋ธ์ `[radio]="true"` ์ฒดํฌ๋ฐ์ค ์ฌ๋ฌ ๊ฐ๋ก.
|
|
125
|
+
|
|
126
|
+
### SdSwitch (`sd-switch`)
|
|
127
|
+
|
|
128
|
+
on/off ํ ๊ธ ์ค์์น.
|
|
129
|
+
|
|
130
|
+
- `value: model<boolean>` / `canChangeFn` โ `sd-checkbox` ์ ๋์ผ.
|
|
131
|
+
- `disabled` / `inline` / `inset` / `size` / `theme` โ ๊ณตํต.
|
|
132
|
+
|
|
133
|
+
### SdCheckboxGroup<T> / SdCheckboxGroupItem<T> (`sd-checkbox-group` / `-item`)
|
|
134
|
+
|
|
135
|
+
๋ฐฐ์ด ๊ฐ์ ํญ๋ชฉ ์ฒดํฌ๋ก ํ ๊ธํ๋ ๊ทธ๋ฃน.
|
|
136
|
+
|
|
137
|
+
- `SdCheckboxGroup.value: model<T[]>` โ ์ ํ๋ ํญ๋ชฉ ๋ฐฐ์ด.
|
|
138
|
+
- `SdCheckboxGroup.disabled: boolean` โ ๊ทธ๋ฃน ์ ์ฒด ๋นํ์ฑ.
|
|
139
|
+
- `SdCheckboxGroupItem.value: input.required<T>` โ ์ด ํญ๋ชฉ์ ๊ฐ. ์ฒดํฌ ์ ๊ทธ๋ฃน ๋ฐฐ์ด์ ์ถ๊ฐ/์ ๊ฑฐ.
|
|
140
|
+
- `SdCheckboxGroupItem.inline: boolean` โ ์ธ๋ผ์ธ ํ์.
|
|
141
|
+
- ์ฌ์ฉ: `<sd-checkbox-group [(value)]="selected"><sd-checkbox-group-item [value]="'a'">A</sd-checkbox-group-item>...</sd-checkbox-group>`.
|
|
142
|
+
|
|
143
|
+
## ์
๋ ํธยท๋๋กญ๋ค์ด
|
|
144
|
+
|
|
145
|
+
### SdSelect<M,T> (`sd-select`) + SdSelectItem<T> / SdSelectButton
|
|
146
|
+
|
|
147
|
+
๋๋กญ๋ค์ด ์
๋ ํธ. ์ ์ ํญ๋ชฉ(`sd-select-item` ํฌ์) ๋๋ `items`+`itemOf` ํ
ํ๋ฆฟ, single/multi.
|
|
148
|
+
|
|
149
|
+
- `selectMode: "single"|"multi"` โ ์ ํ ๋ชจ๋(๊ธฐ๋ณธ single). multi ๋ฉด ํค๋์ ์ ์ฒด์ ํ/ํด์ + ์ฒดํฌ๋ฐ์ค.
|
|
150
|
+
- `value: model<SelectModeValue<any>[M]>` โ single ์ด๋ฉด ๋จ์ผ ๊ฐ, multi ๋ฉด ๋ฐฐ์ด. `SelectModeValue<T> = { single: T; multi: T[] }`.
|
|
151
|
+
- `placeholder: string` โ ๋ฏธ์ ํ ํ์.
|
|
152
|
+
- `required: boolean` โ ๋น ๊ฐ์ด๋ฉด invalid.
|
|
153
|
+
- `items: T[]` + `getChildrenFn: (item) => T[]|undefined` โ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ํญ๋ชฉ(ํธ๋ฆฌ ๊ฐ๋ฅ). `trackByFn: (item, index) => unknown`.
|
|
154
|
+
- `hideSelectAll: boolean` โ multi ์ ์ ์ฒด์ ํ/ํด์ ๋ฐ ์จ๊น.
|
|
155
|
+
- `multiSelectionDisplayDirection: "vertical"` โ multi ์ ํ ํ์๋ฅผ ์ธ๋ก ๋์ด.
|
|
156
|
+
- `disabled` / `inline` / `inset` / `size` / `contentClass` / `contentStyle` โ ๊ณตํต/์คํ์ผ.
|
|
157
|
+
- `dropdownOpen: model<boolean>` โ ๋๋กญ๋ค์ด ์ด๋ฆผ ์ํ.
|
|
158
|
+
- ๋ด๋ถ ๋ฉ์๋ `selectItem`/`toggleItem`/`openDropdown`/`closeDropdown` ์ ์์ `sd-select-item` ์ด ํธ์ถ.
|
|
159
|
+
- `SdSelectItem.value: input<T>` โ ํญ๋ชฉ ๊ฐ. `disabled` / `hidden` ์ผ๋ก ๊ฐ๋ณ ์ ์ด. ํด๋ฆญ ์ ๋ถ๋ชจ select ํ ๊ธ(single ์ ๋ซํ).
|
|
160
|
+
- `SdSelectButton` (`sd-select-button`) โ ๋๋กญ๋ค์ด ์ฐ์ธก์ ๋ผ์ฐ๋ ์ก์
๋ฒํผ(๊ฒ์/ํธ์ง ๋ฑ). `<sd-select-button>` ์ผ๋ก ํฌ์.
|
|
161
|
+
- ์ฌ์ฉ: `<sd-select [(value)]="data().state" [required]="true"><sd-select-item [value]="'์์ฑ'">์์ฑ</sd-select-item></sd-select>`.
|
|
162
|
+
|
|
163
|
+
### SdDropdown / SdDropdownPopup (`sd-dropdown` / `sd-dropdown-popup`)
|
|
164
|
+
|
|
165
|
+
๋ฒ์ฉ ๋๋กญ๋ค์ด ํ ๊ธ + ํ์
. ์์น ์๋ ๋ฐฐ์น, ๋ชจ๋ฐ์ผ์์ ํ๋จ ์ํธ, ์ธ๋ถ ํด๋ฆญ/blur/ESC ๋ก ๋ซํ.
|
|
166
|
+
|
|
167
|
+
- `SdDropdown.open: model<boolean>` โ ์ด๋ฆผ ์ํ.
|
|
168
|
+
- `SdDropdown.disabled: boolean` โ true ๋ฉด ํ ๊ธ ๋ง์.
|
|
169
|
+
- ๋ณธ๋ฌธ ์ฝํ
์ธ ์ `<sd-dropdown-popup>` ์ ์์์ผ๋ก ๋ . `sd-select`ยท`sd-topbar-menu`ยท`sd-theme-selector` ๋ฑ์ด ๋ด๋ถ์์ ์ฌ์ฉ.
|
|
170
|
+
|
|
171
|
+
## ํผยท์ ๊ธฐยทํญยท๋ฆฌ์คํธยทํ์ด์ง๋ค์ด์
|
|
172
|
+
|
|
173
|
+
### SdForm (`sd-form`)
|
|
174
|
+
|
|
175
|
+
native form ๋ํผ. Enter/submit ๋ฒํผ์ผ๋ก submit, ๊ฒ์ฆ ์คํจ ์ ๋ค์ดํฐ๋ธ ๋ฉ์์งยทํฌ์ปค์ฑ.
|
|
176
|
+
|
|
177
|
+
- `formSubmit: output<SubmitEvent>` โ ๊ฒ์ฆ ํต๊ณผ ํ submit. `(formSubmit)="onSubmit()"`.
|
|
178
|
+
- `formInvalid: output()` โ ๊ฒ์ฆ ์คํจ ์.
|
|
179
|
+
- `requestSubmit(): void` โ ์ฝ๋์์ submit ํธ๋ฆฌ๊ฑฐ. `formEl` getter ๋ก native form ์ ๊ทผ.
|
|
180
|
+
- `sd-crud-list`/`sd-crud-detail` ๋ ๋ด๋ถ์ form ์ ๋ณด์ ํ๋ฏ๋ก ๋ณ๋ ๋ํ ๋ถํ์.
|
|
181
|
+
|
|
182
|
+
### SdCollapse / SdCollapseIcon (`sd-collapse` / `sd-collapse-icon`)
|
|
183
|
+
|
|
184
|
+
- `SdCollapse.open: boolean` โ true ๋ฉด ํผ์นจ, false ๋ฉด ๋์ด 0 ์ผ๋ก ์ ํ(๋์ด ํธ๋์ง์
). ์ฝํ
์ธ ๋์ด ๋ณํ ์๋ ์ฌ์ธก์ .
|
|
185
|
+
- `SdCollapseIcon.open: boolean` โ ์ด๋ฆผ์ด๋ฉด ํ์ . `openRotate: number`(๊ธฐ๋ณธ 90๋) ๋งํผ ํ์ . `icon`(๊ธฐ๋ณธ `tablerChevronDown`). ์ ๊ธฐ ํ ๊ธ ํ์์ฉ.
|
|
186
|
+
|
|
187
|
+
### SdTab / SdTabItem (`sd-tab` / `sd-tab-item`)
|
|
188
|
+
|
|
189
|
+
- `SdTab.value: model<any>` โ ์ ํ๋ ํญ ๊ฐ.
|
|
190
|
+
- `SdTabItem.value: input<any>` โ ์ด ํญ์ ๊ฐ. ํด๋ฆญ ์ ๋ถ๋ชจ `value` ๋ก set, ์ผ์นํ๋ฉด ์ ํ ํ์.
|
|
191
|
+
- ์ฌ์ฉ: `<sd-tab [(value)]="tab"><sd-tab-item [value]="'a'">A</sd-tab-item></sd-tab>`.
|
|
192
|
+
|
|
193
|
+
### SdList / SdListItem (`sd-list` / `sd-list-item`)
|
|
194
|
+
|
|
195
|
+
์ธ๋ก ๋ฆฌ์คํธ(์ค์ฒฉ ๊ฐ๋ฅ, accordion/flat).
|
|
196
|
+
|
|
197
|
+
- `SdList.inset: boolean` โ ๋ฐฐ๊ฒฝ ํฌ๋ช
(์ค์ฒฉ ๋ฆฌ์คํธ์ฉ).
|
|
198
|
+
- `SdListItem.layout: "accordion"|"flat"` โ ์์ ๋ฆฌ์คํธ ๋์. `"accordion"`(๊ธฐ๋ณธ) = ํด๋ฆญ ํ ๊ธ๋ก ํผ์นจ, `"flat"` = ํญ์ ํผ์นจ(์น์
ํค๋์ฒ๋ผ).
|
|
199
|
+
- `SdListItem.open: model<boolean>` โ accordion ํผ์นจ ์ํ.
|
|
200
|
+
- `SdListItem.selected: boolean` โ ์ ํ ๊ฐ์กฐ.
|
|
201
|
+
- `SdListItem.selectedIcon: string` โ leaf ํญ๋ชฉ์ ์ ํ ์์ด์ฝ ํ์.
|
|
202
|
+
- `SdListItem.readonly: boolean` โ ํด๋ฆญ ํ ๊ธ ๋นํ์ฑ.
|
|
203
|
+
- `SdListItem.contentStyle` / `contentClass` โ ์ฝํ
์ธ ํ ์คํ์ผ.
|
|
204
|
+
- `#toolTpl` ํ
ํ๋ฆฟ์ผ๋ก ํ ์ฐ์ธก ๋๊ตฌ ๋ฐฐ์น. ์ฌ์ด๋๋ฐ/ํ๋ฐ ๋ฉ๋ด๊ฐ ์ด ์์ ๊ตฌ์ฑ๋จ.
|
|
205
|
+
|
|
206
|
+
### SdPagination (`sd-pagination`)
|
|
207
|
+
|
|
208
|
+
ํ์ด์ง ๋ฒํธ ๋ค๋น๊ฒ์ดํฐ(์ฒ์/์ด์ ๊ทธ๋ฃน/๋ฒํธ/๋ค์๊ทธ๋ฃน/๋).
|
|
209
|
+
|
|
210
|
+
- `currentPage: model<number>` โ 0-based ํ์ฌ ํ์ด์ง.
|
|
211
|
+
- `totalPageCount: number` โ ์ ์ฒด ํ์ด์ง ์(0 ์ด๋ฉด ๋นํ์).
|
|
212
|
+
- `visiblePageCount: number` โ ํ ๋ฒ์ ๋ณด์ผ ๋ฒํธ ๊ฐ์(๊ธฐ๋ณธ 10).
|
|
213
|
+
- ์ฌ์ฉ: `<sd-pagination [(currentPage)]="page" [totalPageCount]="pageLength()" />`. `sd-sheet`/`sd-crud-list` ๊ฐ ๋ด์ฅ.
|
|
@@ -1,53 +1,41 @@
|
|
|
1
|
-
# @simplysm/angular โ CRUD ํ๋ฉด
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## SdBaseContainer
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
- (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
- (
|
|
31
|
-
- (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
`<sd-state-preset [key]="..." [(state)]="...">` โ ํ๋ฉด ์ํ(ํํฐ ๋ฑ) ํ๋ฆฌ์
์ ์ฅ/์ ์ฉ ๋ฐ.
|
|
43
|
-
- key: input.required<string> โ ํ๋ฆฌ์
์์ ํค(`SdSystemConfigProvider`).
|
|
44
|
-
- state = model.required<TState> โ ํ์ฌ ์ํ(์ ์ฅยท์ ์ฉ ๋์).
|
|
45
|
-
- size?: "sm"|"lg".
|
|
46
|
-
- โ
๋ฒํผ์ผ๋ก ํ์ฌ ์ํ๋ฅผ ์ด๋ฆ ๋ถ์ฌ ์ ์ฅ, ํ๋ฆฌ์
ํด๋ฆญ ์ ์ํ ์ ์ฉ, ๊ฐ ํ๋ฆฌ์
์ ์ฅ(๋ฎ์ด์ฐ๊ธฐ)ยท์ญ์ . ํ์
`SdStatePresetDef<TState> = { name: string; state: TState }`.
|
|
47
|
-
|
|
48
|
-
## SdPermissionTable<TModule>
|
|
49
|
-
|
|
50
|
-
`<sd-permission-table [items]="...">` โ ๊ถํ(use/edit) ํธ์ง ํ
์ด๋ธ.
|
|
51
|
-
- value = model<Record<string, boolean>>({}) โ `<์ฝ๋>.<use|edit>` โ ํ์ฉ ๋งต.
|
|
52
|
-
- items: SdPermission<TModule>[] โ ๊ถํ ํธ๋ฆฌ(`SdAppStructureProvider.getPermissionsByStructure` ๊ฒฐ๊ณผ).
|
|
53
|
-
- disabled: boolean โ ํธ์ง ๋นํ์ฑ.
|
|
1
|
+
# @simplysm/angular โ CRUD ํ๋ฉด ํ์ค ๊ณจ๊ฒฉ
|
|
2
|
+
|
|
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
|
+
|
|
5
|
+
## SdBaseContainer (`sd-base-container`)
|
|
6
|
+
|
|
7
|
+
๋ชจ๋ ํ๋ฉด์ ๊ณตํต ์
ธ. busy ์ค๋ฒ๋ ์ด + ๊ถํ ์ ํ ํ์ + (page ๋ชจ๋) ํ๋ฐ + ์ฌ๋กฏ(content/command/bottom) ๊ตฌ์ฑ. ๊ณต์ ๋ฐ์ดํฐ ๋ก๋ ์๋ฃ๊น์ง ready ๋ฅผ ์ง์ฐ.
|
|
8
|
+
|
|
9
|
+
- `ready: model<boolean>` โ ๋ฐ์ดํฐ ๋ก๋ ์์ ํ์ฉ ์์ . ๊ณต์ ๋ฐ์ดํฐ ๋๊ธฐ ํ ์๋ true(์์ effect ๋ฐํ ํธ๋ฆฌ๊ฑฐ). ๋ถ๋ชจโ์์ ์ ํ.
|
|
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 ์์ด ์งค ๋ ์ฌ์ฉ.
|
|
16
|
+
|
|
17
|
+
## SdCrudList<TItem, TKey> (`sd-crud-list`)
|
|
18
|
+
|
|
19
|
+
๋ชฉ๋ก ํ๋ฉด ๊ณจ๊ฒฉ. ๋ด๋ถ์ `sd-sheet` + ๊ฒ์ ํผ + ๋ฑ๋ก/์ญ์ /๋ณต๊ตฌ ๋ฒํผ + (๋ชจ๋ฌ ๋ชจ๋) ์ ํ ํ์ ๋ฐ๋ฅผ ๋ด์ฅ. ํฌ์ํ `<sd-sheet-column>` ์ ์ํธ๋ก ์ ๋ฌ. CTRL+S ๋ก ์ ์ฅ ํธ๋ฆฌ๊ฑฐ.
|
|
20
|
+
|
|
21
|
+
- ํ์ค ์๊ทธ๋: `ready: model<boolean>`, `initialized: input<boolean>`, `busyCount: model<number>`, `restricted: input<boolean>`, `viewType: input.required<SdViewType>`.
|
|
22
|
+
- `readonly: input<boolean>` โ true ๋ฉด ์ ์ฅ/๋ฑ๋ก/์ญ์ UIยทํธ์ง ๋์ ์ ๊ฑฐ(์กฐํ ์ ์ฉ).
|
|
23
|
+
- `selectMode: "single"|"multi"` โ ํ ์ ํ ๋ชจ๋. modal ๋ชจ๋ + ์ง์ ์ ํ๋จ์ ์ ํ ํด์ /ํ์ธ ๋ฐ. single ์ ํ ํด๋ฆญ ์๋ ์ ํ, ๋ฏธ์ง์ +ํธ์ง ๊ฐ๋ฅ์ด๋ฉด multi ๊ธฐ๋ณธ.
|
|
24
|
+
- `key: input.required<string>` โ ์ํธ ์ค์ ์ ์ฅ ํค(`<key>-sheet` ๋ก ์ํธ์ ์ ๋ฌ).
|
|
25
|
+
- `items: TItem[]` โ ํ ๋ฐ์ดํฐ. `selectedKeys: model<NonNullable<TKey>[]>` โ ์ ํ ํค.
|
|
26
|
+
- `currDeletedItems: TItem[]` โ ํ์ฌ ์ญ์ ์ํ ํญ๋ชฉ(์ทจ์์ ํ์ + ์ ํ ์ ๋ณต๊ตฌ ๋ฒํผ ๋
ธ์ถ).
|
|
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>`.
|
|
32
|
+
|
|
33
|
+
## SdCrudDetail (`sd-crud-detail`)
|
|
34
|
+
|
|
35
|
+
๋จ๊ฑด ๋ณด๊ธฐ/ํธ์ง ํ๋ฉด ๊ณจ๊ฒฉ. ๋ด๋ถ์ `sd-form`(ํธ์ง ์) + page ํ๋ฐ/modal ํ๋จ ํ์ธ ๋ฒํผ์ ์ปจํ
์คํธ๋ณ ์๋ ๊ตฌ์ฑ. CTRL+S ์ ์ฅ.
|
|
36
|
+
|
|
37
|
+
- ํ์ค ์๊ทธ๋: `ready: model<boolean>`, `initialized: input<boolean>`, `busyCount: model<number>`, `restricted: input<boolean>`, `viewType: input.required<SdViewType>`.
|
|
38
|
+
- `readonly: input<boolean>` โ true ๋ฉด form ์์ด ํ์๋ง(์ ์ฅ ๋ฒํผ ์ ๊ฑฐ).
|
|
39
|
+
- `submit: output()` โ ์ ์ฅ ํผ submit/CTRL+S/ํ์ธ ๋ฒํผ ํด๋ฆญ ์ ๋ฐํ.
|
|
40
|
+
- ์ฌ๋กฏ: `#commandTpl`(๋ช
๋ น์ค), `#contentTpl`(๋ณธ๋ฌธ ํผ), `#bottomCommandTpl`(ํ๋จ ์ถ๊ฐ).
|
|
41
|
+
- ์ฌ์ฉ: `<sd-crud-detail [viewType]="viewType()" [initialized]="initialized()" [(busyCount)]="busyCount" (submit)="onSubmit()"><ng-template #contentTpl><div class="form-table">...</div></ng-template></sd-crud-detail>`. ์๋ณ์ ๋ก๋ยท์๋ณธ ์ค๋
์ทยท์ดํ ๊ฐ๋ ๋ฑ ๋ฐ์ดํฐ ํ๋ฆ์ client-component.md "detail ๋ฐ์ดํฐ ํ๋ฆ".
|