@simplysm/angular 14.0.51 → 14.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/data/sheet/sd-sheet.d.ts +9 -12
  2. package/dist/data/sheet/sd-sheet.d.ts.map +1 -1
  3. package/dist/data/sheet/sd-sheet.js +150 -168
  4. package/dist/data/sheet/types.d.ts +1 -0
  5. package/dist/data/sheet/types.d.ts.map +1 -1
  6. package/dist/data/sheet/useSheetCellStyling.d.ts +2 -2
  7. package/dist/data/sheet/useSheetCellStyling.d.ts.map +1 -1
  8. package/dist/data/sheet/useSheetCellStyling.js +20 -12
  9. package/dist/data/sheet/useSheetColumnFixing.d.ts +3 -8
  10. package/dist/data/sheet/useSheetColumnFixing.d.ts.map +1 -1
  11. package/dist/data/sheet/useSheetColumnFixing.js +19 -27
  12. package/dist/data/sheet/useSheetLayoutEngine.d.ts.map +1 -1
  13. package/dist/data/sheet/useSheetLayoutEngine.js +4 -1
  14. package/dist/layout/dock/sd-dock-container.d.ts.map +1 -1
  15. package/dist/layout/dock/sd-dock-container.js +3 -3
  16. package/package.json +7 -8
  17. package/src/data/sheet/sd-sheet.ts +39 -60
  18. package/src/data/sheet/types.ts +1 -0
  19. package/src/data/sheet/useSheetCellStyling.ts +19 -11
  20. package/src/data/sheet/useSheetColumnFixing.ts +21 -28
  21. package/src/data/sheet/useSheetLayoutEngine.ts +4 -1
  22. package/src/layout/dock/sd-dock-container.ts +1 -0
  23. package/README.md +0 -476
  24. package/docs/bootstrap/provide-sd-angular.md +0 -37
  25. package/docs/bootstrap/sd-angular-config-provider.md +0 -16
  26. package/docs/directives/sd-command-directive.md +0 -30
  27. package/docs/directives/sd-events.md +0 -25
  28. package/docs/directives/sd-intersection-directive.md +0 -36
  29. package/docs/directives/sd-invalid.md +0 -24
  30. package/docs/directives/sd-resize-directive.md +0 -42
  31. package/docs/directives/sd-ripple.md +0 -23
  32. package/docs/directives/sd-router-link.md +0 -38
  33. package/docs/directives/sd-show-effect.md +0 -18
  34. package/docs/directives/sd-typed-template.md +0 -69
  35. package/docs/features/sd-address-search-modal.md +0 -50
  36. package/docs/features/sd-permission-table.md +0 -20
  37. package/docs/features/sd-shared-data-components.md +0 -158
  38. package/docs/features/sd-tiptap-editor.md +0 -26
  39. package/docs/pipes/format-pipe.md +0 -41
  40. package/docs/plugins/sd-global-error-handler.md +0 -23
  41. package/docs/plugins/sd-option-event-plugin.md +0 -34
  42. package/docs/provider-types/sd-menu.md +0 -65
  43. package/docs/provider-types/sd-modal-content-def.md +0 -148
  44. package/docs/provider-types/sd-toast-content-def.md +0 -73
  45. package/docs/provider-types/shared-data-base.md +0 -59
  46. package/docs/providers/sd-activated-modal-provider.md +0 -34
  47. package/docs/providers/sd-app-structure-provider.md +0 -81
  48. package/docs/providers/sd-busy-provider.md +0 -18
  49. package/docs/providers/sd-file-dialog-provider.md +0 -40
  50. package/docs/providers/sd-local-storage-provider.md +0 -20
  51. package/docs/providers/sd-modal-provider.md +0 -67
  52. package/docs/providers/sd-navigate-window-provider.md +0 -18
  53. package/docs/providers/sd-print-provider.md +0 -25
  54. package/docs/providers/sd-service-client-factory-provider.md +0 -43
  55. package/docs/providers/sd-shared-data-provider.md +0 -64
  56. package/docs/providers/sd-system-config-provider.md +0 -46
  57. package/docs/providers/sd-system-log-provider.md +0 -18
  58. package/docs/providers/sd-theme-provider.md +0 -38
  59. package/docs/providers/sd-toast-provider.md +0 -65
  60. package/docs/recipes/_common-rules.md +0 -244
  61. package/docs/recipes/crud-detail/extension-a-edit-save.md +0 -230
  62. package/docs/recipes/crud-detail/extension-b-delete-restore.md +0 -142
  63. package/docs/recipes/crud-detail/extension-c-modal-view.md +0 -214
  64. package/docs/recipes/crud-detail/extension-d-control-view.md +0 -103
  65. package/docs/recipes/crud-detail/extension-e-auxiliary.md +0 -87
  66. package/docs/recipes/crud-detail/extension-f-complex-detail.md +0 -234
  67. package/docs/recipes/crud-detail.md +0 -353
  68. package/docs/recipes/crud-list/extension-a-inline-edit.md +0 -410
  69. package/docs/recipes/crud-list/extension-b-selection.md +0 -226
  70. package/docs/recipes/crud-list/extension-c-inline-delete.md +0 -87
  71. package/docs/recipes/crud-list/extension-d-select-modal.md +0 -207
  72. package/docs/recipes/crud-list/extension-e-readonly-modal.md +0 -165
  73. package/docs/recipes/crud-list/extension-f-modal-edit.md +0 -177
  74. package/docs/recipes/crud-list/extension-g-excel.md +0 -157
  75. package/docs/recipes/crud-list.md +0 -446
  76. package/docs/recipes/data-select-button.md +0 -412
  77. package/docs/recipes/page-modal-container.md +0 -260
  78. package/docs/styling/classes.md +0 -149
  79. package/docs/styling/mixins.md +0 -100
  80. package/docs/styling/themes.md +0 -35
  81. package/docs/styling/variables.md +0 -147
  82. package/docs/type-utilities/directive-input-signals.md +0 -232
  83. package/docs/ui-data/sd-list.md +0 -37
  84. package/docs/ui-data/sd-sheet.md +0 -227
  85. package/docs/ui-form/sd-additional-button.md +0 -26
  86. package/docs/ui-form/sd-anchor.md +0 -31
  87. package/docs/ui-form/sd-button.md +0 -105
  88. package/docs/ui-form/sd-checkbox-group.md +0 -39
  89. package/docs/ui-form/sd-checkbox.md +0 -81
  90. package/docs/ui-form/sd-date-range-picker.md +0 -27
  91. package/docs/ui-form/sd-form.md +0 -89
  92. package/docs/ui-form/sd-modal-select-button.md +0 -54
  93. package/docs/ui-form/sd-numpad.md +0 -26
  94. package/docs/ui-form/sd-range.md +0 -26
  95. package/docs/ui-form/sd-select.md +0 -68
  96. package/docs/ui-form/sd-shared-data-select.md +0 -52
  97. package/docs/ui-form/sd-state-preset.md +0 -37
  98. package/docs/ui-form/sd-switch.md +0 -27
  99. package/docs/ui-form/sd-textarea.md +0 -33
  100. package/docs/ui-form/sd-textfield.md +0 -145
  101. package/docs/ui-layout/sd-dock-container.md +0 -64
  102. package/docs/ui-layout/sd-dock.md +0 -37
  103. package/docs/ui-layout/sd-gap.md +0 -26
  104. package/docs/ui-layout/sd-kanban-board.md +0 -96
  105. package/docs/ui-layout/sd-kanban-lane.md +0 -34
  106. package/docs/ui-layout/sd-kanban.md +0 -29
  107. package/docs/ui-navigation/sd-collapse.md +0 -35
  108. package/docs/ui-navigation/sd-pagination.md +0 -26
  109. package/docs/ui-navigation/sd-sidebar-container.md +0 -49
  110. package/docs/ui-navigation/sd-sidebar-menu.md +0 -22
  111. package/docs/ui-navigation/sd-sidebar-user.md +0 -43
  112. package/docs/ui-navigation/sd-tab.md +0 -51
  113. package/docs/ui-navigation/sd-topbar-container.md +0 -97
  114. package/docs/ui-navigation/sd-topbar-menu.md +0 -23
  115. package/docs/ui-navigation/sd-topbar-user.md +0 -38
  116. package/docs/ui-navigation/sd-topbar.md +0 -30
  117. package/docs/ui-overlay/sd-busy-container.md +0 -69
  118. package/docs/ui-overlay/sd-confirm-modal.md +0 -30
  119. package/docs/ui-overlay/sd-dropdown.md +0 -40
  120. package/docs/ui-overlay/sd-modal.md +0 -34
  121. package/docs/ui-overlay/sd-prompt-modal.md +0 -30
  122. package/docs/ui-overlay/sd-toast.md +0 -35
  123. package/docs/ui-visual/sd-barcode.md +0 -36
  124. package/docs/ui-visual/sd-calendar.md +0 -34
  125. package/docs/ui-visual/sd-echarts.md +0 -32
  126. package/docs/ui-visual/sd-label.md +0 -24
  127. package/docs/ui-visual/sd-note.md +0 -23
  128. package/docs/ui-visual/sd-progress.md +0 -23
  129. package/docs/utils/inject-routing-signals.md +0 -161
  130. package/docs/utils/inject-sd-system-config-resource.md +0 -35
  131. package/docs/utils/mark.md +0 -43
  132. package/docs/utils/selection-managers.md +0 -96
  133. package/docs/utils/set-safe-style.md +0 -19
  134. package/docs/utils/setup-functions.md +0 -93
@@ -1,227 +0,0 @@
1
- # `SdSheet`
2
-
3
- 스프레드시트 컴포넌트. 정렬, 컬럼 고정, 리사이즈, 페이지네이션, 설정 저장을 지원한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-sheet" })
7
- class SdSheet<T> {
8
- key = input<string>();
9
- items = input<T[]>([]);
10
- trackByFn = input<(item: T, index: number) => unknown>();
11
- selectMode = input<"single" | "multi">();
12
- getItemSelectableFn = input<(item: T) => boolean | string>();
13
- getChildrenFn = input<(item: T, index: number) => T[] | undefined>();
14
- useAutoSort = input(false, { transform: booleanAttribute });
15
- visiblePageCount = input(10);
16
- totalPageCount = input(0);
17
- itemsPerPage = input(0);
18
- inset = input(false, { transform: booleanAttribute });
19
- hideConfigBar = input(false, { transform: booleanAttribute });
20
- cumulativeSelection = input(false, { transform: booleanAttribute });
21
-
22
- itemKeydown = output<SdSheetItemKeydownEventParam<T>>();
23
- cellKeydown = output<SdSheetCellKeydownEventParam<T>>();
24
-
25
- selectedItems = model<T[]>([]);
26
- expandedItems = model<T[]>([]);
27
- sorts = model<SortingDef[]>([]);
28
- currentPage = model(0);
29
- }
30
- ```
31
-
32
- ## Members
33
-
34
- | Member | Kind | Type | Default | Description |
35
- |--------|------|------|---------|-------------|
36
- | `key` | input | `string \| undefined` | `undefined` | 설정 저장 키 |
37
- | `items` | input | `T[]` | `[]` | 표시할 항목 |
38
- | `trackByFn` | input | `((item, index) => unknown) \| undefined` | `undefined` | 트랙킹 함수 |
39
- | `selectMode` | input | `"single" \| "multi" \| undefined` | `undefined` | 선택 모드 |
40
- | `getItemSelectableFn` | input | `((item) => boolean \| string) \| undefined` | `undefined` | 선택 가능 여부 함수. string은 비활성 사유 |
41
- | `getChildrenFn` | input | `((item, index) => T[] \| undefined) \| undefined` | `undefined` | 트리 구조 자식 반환 함수 |
42
- | `useAutoSort` | input | `boolean` | `false` | 클라이언트 측 자동 정렬 |
43
- | `visiblePageCount` | input | `number` | `10` | 한 번에 표시할 페이지 수 |
44
- | `totalPageCount` | input | `number` | `0` | 총 페이지 수 |
45
- | `itemsPerPage` | input | `number` | `0` | 페이지당 항목 수 |
46
- | `inset` | input | `boolean` | `false` | 삽입 스타일 |
47
- | `hideConfigBar` | input | `boolean` | `false` | 설정 바 숨김 |
48
- | `cumulativeSelection` | input | `boolean` | `false` | items 변경 시 selectedItems 유지 여부. 다중 페이지 선택 누적에 사용 |
49
- | `itemKeydown` | output | `SdSheetItemKeydownEventParam<T>` | - | 행 keydown 이벤트 |
50
- | `cellKeydown` | output | `SdSheetCellKeydownEventParam<T>` | - | 셀 keydown 이벤트 |
51
- | `selectedItems` | model | `T[]` | `[]` | 선택된 항목 (two-way) |
52
- | `expandedItems` | model | `T[]` | `[]` | 확장된 항목 (two-way) |
53
- | `sorts` | model | `SortingDef[]` | `[]` | 정렬 설정 (two-way) |
54
- | `currentPage` | model | `number` | `0` | 현재 페이지 (two-way) |
55
-
56
- ### `cumulativeSelection` 사용 패턴
57
-
58
- - **선택 모달** (다중 페이지 선택 누적) → `true`. 반드시 `trackByFn` 지정 필수
59
- - **현재 뷰 일괄 작업** (현재 페이지 내 처리) → `false` (기본값)
60
-
61
- ```html
62
- <sd-sheet
63
- [cumulativeSelection]="viewType() === 'modal' && selectMode() === 'multi'"
64
- [trackByFn]="trackById"
65
- >
66
- ```
67
-
68
- > `SortingDef.key`는 `"vendor.name"` 같은 체인 경로일 수 있다. 정렬 처리 시 `obj.getChainValue(item, sort.key)` (from `@simplysm/core-common`)를 사용한다.
69
-
70
- ### 실사용 예
71
-
72
- - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — items·sorts·currentPage·totalPageCount·trackByFn 기본 바인딩
73
- - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — selectMode·selectedItems·mark 연동
74
- - [crud-list.md §6 확장 B: 선택 기능 + 선택 삭제/복구](../recipes/crud-list.md#6-확장-b-선택-기능--선택-삭제복구) — selectMode="multi"·selectedItems 바인딩
75
- - [crud-list.md §8 확장 D: 선택 모달 전환](../recipes/crud-list.md#8-확장-d-선택-모달-전환) — cumulativeSelection·selectMode 조건부 적용
76
- - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 상세 폼 내부 하위 컬렉션 편집
77
-
78
- ## Related Types
79
-
80
- ### `SdSheetColumn`
81
-
82
- 시트 컬럼 정의 디렉티브.
83
-
84
- ```typescript
85
- @Directive({ selector: "sd-sheet-column" })
86
- class SdSheetColumn<T = unknown> {
87
- key = input.required<string>();
88
- header = input<string | string[]>("");
89
- headerStyle = input<string>();
90
- tooltip = input<string>();
91
- width = input<string>();
92
- fixed = input(false, { transform: booleanAttribute });
93
- hidden = input(false, { transform: booleanAttribute });
94
- collapse = input(false, { transform: booleanAttribute });
95
- disableSorting = input(false, { transform: booleanAttribute });
96
- disableResizing = input(false, { transform: booleanAttribute });
97
- ordering = input(0);
98
- }
99
- ```
100
-
101
- Content children: `SdSheetColumnCellTemplate` (required), `#headerTpl`, `#summaryTpl`
102
-
103
- #### 실사용 예
104
-
105
- - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — key·header 기본 컬럼 정의
106
- - [crud-list.md §7 확장 C: inline 삭제 열](../recipes/crud-list.md#7-확장-c-inline-삭제-열) — fixed·hidden·#headerTpl 커스텀 헤더
107
- - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 하위 컬렉션 컬럼 정의
108
-
109
- ### `SdSheetColumnCellTemplate`
110
-
111
- 시트 컬럼 셀 내용을 정의하는 디렉티브. `ng-template[cell]` 셀렉터.
112
-
113
- ```typescript
114
- @Directive({ selector: "ng-template[cell]" })
115
- class SdSheetColumnCellTemplate<T> {
116
- cell = input.required<T[]>();
117
-
118
- static ngTemplateContextGuard<TContextItem>(
119
- _dir: SdSheetColumnCellTemplate<TContextItem>,
120
- _ctx: unknown,
121
- ): _ctx is SdSheetCellContext<TContextItem>;
122
- }
123
- ```
124
-
125
- **셀 내용 작성 지침:**
126
- - **일반 텍스트**: `<div class="p-xs-sm">` 로 감싸 기본 패딩 적용
127
- - **컨트롤 삽입**: 반드시 `[inset]="true"` + `[size]="'sm'"` 지정
128
-
129
- #### 실사용 예
130
-
131
- - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — let-item 기본 셀 렌더링
132
- - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — let-edit 조건부 편집 셀 (inset+sm 컨트롤)
133
- - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 상세 폼 내부 하위 컬렉션 셀
134
-
135
- ### `SdSheetCellContext`
136
-
137
- ```typescript
138
- interface SdSheetCellContext<T = unknown> {
139
- $implicit: T;
140
- item: T;
141
- index: number;
142
- depth: number;
143
- edit: boolean;
144
- }
145
- ```
146
-
147
- | Field | Type | Description |
148
- |-------|------|-------------|
149
- | `$implicit` | `T` | 현재 항목 (let-item으로 접근) |
150
- | `item` | `T` | 현재 항목 |
151
- | `index` | `number` | 행 인덱스 |
152
- | `depth` | `number` | 트리 깊이 |
153
- | `edit` | `boolean` | 편집 모드 여부 |
154
-
155
- ### `SdSheetConfigModal`
156
-
157
- ```typescript
158
- @Component({ selector: "sd-sheet-config-modal" })
159
- class SdSheetConfigModal implements SdModalContentDef<SdSheetConfig> {
160
- controls = input.required<readonly SdSheetColumn[]>();
161
- config = input.required<SdSheetConfig | undefined>();
162
- close = output<SdSheetConfig>();
163
- initialized = signal(true);
164
- }
165
- ```
166
-
167
- ### `SdSheetColumnDef`
168
-
169
- ```typescript
170
- interface SdSheetColumnDef {
171
- key: string;
172
- header: string | string[];
173
- headerStyle: string | undefined;
174
- tooltip: string | undefined;
175
- width: string | undefined;
176
- fixed: boolean;
177
- hidden: boolean;
178
- collapse: boolean;
179
- disableSorting: boolean;
180
- disableResizing: boolean;
181
- ordering: number;
182
- }
183
- ```
184
-
185
- ### `SdSheetConfig`
186
-
187
- ```typescript
188
- interface SdSheetConfig {
189
- columnRecord: Record<string, {
190
- width?: string;
191
- hidden?: boolean;
192
- fixed?: boolean;
193
- ordering?: number;
194
- }>;
195
- }
196
- ```
197
-
198
- ### `SdSheetHeaderDef`
199
-
200
- ```typescript
201
- interface SdSheetHeaderDef {
202
- text: string;
203
- colspan: number;
204
- rowspan: number;
205
- isLastRow: boolean;
206
- colDef: SdSheetColumnDef | undefined;
207
- }
208
- ```
209
-
210
- ### `SdSheetItemKeydownEventParam`
211
-
212
- ```typescript
213
- interface SdSheetItemKeydownEventParam<T> {
214
- item: T;
215
- event: KeyboardEvent;
216
- }
217
- ```
218
-
219
- ### `SdSheetCellKeydownEventParam`
220
-
221
- ```typescript
222
- interface SdSheetCellKeydownEventParam<T> {
223
- item: T;
224
- key: string;
225
- event: KeyboardEvent;
226
- }
227
- ```
@@ -1,26 +0,0 @@
1
- # `SdAdditionalButton`
2
-
3
- 주 콘텐츠 영역과 추가 동작 버튼을 나란히 배치하는 복합 컴포넌트. 콘텐츠 왼쪽 `_content` 영역과 오른쪽 `_button` 영역으로 구성된다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-additional-button", ... })
7
- export class SdAdditionalButton
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `disabled` | input | `boolean` | 비활성화 여부 (기본값: `false`) |
15
- | `size` | input | `"sm" \| "lg" \| undefined` | 크기 |
16
- | `inset` | input | `boolean` | 인셋 스타일 여부 (기본값: `false`) |
17
-
18
- ## Usage
19
-
20
- ```html
21
- <sd-additional-button>
22
- 선택된 항목 이름
23
- <sd-anchor>편집</sd-anchor>
24
- <sd-button>삭제</sd-button>
25
- </sd-additional-button>
26
- ```
@@ -1,31 +0,0 @@
1
- # `SdAnchor`
2
-
3
- 인라인 버튼 컴포넌트. 텍스트나 아이콘을 클릭 가능한 링크 스타일로 표시한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-anchor", ... })
7
- export class SdAnchor
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `disabled` | input | `boolean` | 비활성화 여부 (기본값: `false`) |
15
- | `theme` | input | `"primary" \| "secondary" \| "info" \| "success" \| "warning" \| "danger" \| "gray" \| "blue-gray"` | 색상 테마 (기본값: `"primary"`) |
16
-
17
- ## Usage
18
-
19
- ```html
20
- <sd-anchor (click)="onItemClick()">편집</sd-anchor>
21
- <sd-anchor [theme]="'danger'" (click)="onDeleteClick()">삭제</sd-anchor>
22
- <sd-anchor [disabled]="!canEdit()">설정</sd-anchor>
23
- ```
24
-
25
- ### 실사용 예
26
-
27
- - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — 시트 셀 내 인라인 앵커 버튼
28
- - [crud-list.md §7 확장 C: inline 삭제 열](../recipes/crud-list.md#7-확장-c-inline-삭제-열) — row별 삭제/복구 토글 아이콘
29
- - [crud-list.md §10 확장 F: 모달 편집 모드](../recipes/crud-list.md#10-확장-f-모달-편집-모드) — 행 클릭 편집 모달 열기 링크
30
- - [crud-detail.md §7 확장 C: modal 뷰](../recipes/crud-detail.md#7-확장-c-modal-뷰) — modal 우측 상단 액션 앵커
31
- - [crud-detail.md §10 확장 F: 복합 상세](../recipes/crud-detail.md#10-확장-f-복합-상세-내부-sd-sheet) — 행 삭제 아이콘 앵커
@@ -1,105 +0,0 @@
1
- # `SdButton`
2
-
3
- 버튼 컴포넌트.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-button" })
7
- class SdButton {
8
- type = input<"button" | "submit">("button");
9
- theme = input<"primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "blue-gray" | "link" | "link-primary" | "link-secondary" | "link-info" | "link-success" | "link-warning" | "link-danger" | "link-gray" | "link-blue-gray" | "link-rev">();
10
- inline = input(false, { transform: booleanAttribute });
11
- inset = input(false, { transform: booleanAttribute });
12
- size = input<"sm" | "lg">();
13
- disabled = input(false, { transform: booleanAttribute });
14
- buttonStyle = input<string>();
15
- buttonClass = input<string>();
16
- }
17
- ```
18
-
19
- ## Members
20
-
21
- | Member | Kind | Type | Default | Description |
22
- |--------|------|------|---------|-------------|
23
- | `type` | input | `"button" \| "submit"` | `"button"` | 버튼 HTML 타입 |
24
- | `theme` | input | `string \| undefined` | `undefined` | 테마 색상 |
25
- | `inline` | input | `boolean` | `false` | 인라인 표시 |
26
- | `inset` | input | `boolean` | `false` | 테두리 없는 삽입 스타일 |
27
- | `size` | input | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
28
- | `disabled` | input | `boolean` | `false` | 비활성화 |
29
- | `buttonStyle` | input | `string \| undefined` | `undefined` | 버튼 인라인 스타일 |
30
- | `buttonClass` | input | `string \| undefined` | `undefined` | 버튼 CSS 클래스 |
31
-
32
- **스타일 적용**: 시각적 스타일은 내부 `<button>`에 적용되므로 `buttonClass`/`buttonStyle`을 사용한다. 호스트(`<sd-button>`)에 직접 `class`/`style`을 줘도 버튼 외형은 변경되지 않는다.
33
-
34
- ### 실사용 예
35
-
36
- - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — 새로고침 버튼 (link-info theme)
37
- - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — 저장·등록 버튼 (type="submit", primary theme)
38
- - [crud-list.md §11 확장 G: 엑셀 업로드/다운로드](../recipes/crud-list.md#11-확장-g-엑셀-업로드다운로드) — 엑셀 업로드·다운로드 버튼
39
- - [crud-detail.md §3 최소 뼈대: 읽기 전용 상세 폼](../recipes/crud-detail.md#3-최소-뼈대-읽기-전용-상세-폼) — 새로고침 버튼
40
- - [crud-detail.md §5 확장 A: 편집/저장](../recipes/crud-detail.md#5-확장-a-편집저장) — 저장 버튼 (type="submit")
41
- - [crud-detail.md §6 확장 B: 삭제/복구 토글](../recipes/crud-detail.md#6-확장-b-삭제복구-토글) — 삭제·복구 버튼 (danger/warning theme)
42
- - [crud-detail.md §7 확장 C: modal 뷰](../recipes/crud-detail.md#7-확장-c-modal-뷰) — modal 하단 바 확인·취소 버튼
43
- - [crud-detail.md §8 확장 D: control 뷰](../recipes/crud-detail.md#8-확장-d-control-뷰) — control 상단 바 버튼
44
-
45
- ## Related Types
46
-
47
- ### `SdAnchor`
48
-
49
- 앵커(인라인 버튼) 컴포넌트. 텍스트 내 클릭 가능 요소.
50
-
51
- ```typescript
52
- @Component({ selector: "sd-anchor" })
53
- class SdAnchor {
54
- disabled = input(false, { transform: booleanAttribute });
55
- theme = input<"primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "blue-gray">("primary");
56
- }
57
- ```
58
-
59
- | Input | Type | Default | Description |
60
- |-------|------|---------|-------------|
61
- | `disabled` | `boolean` | `false` | 비활성화 |
62
- | `theme` | `string` | `"primary"` | 테마 색상 |
63
-
64
- ### `SdAdditionalButton`
65
-
66
- 추가 동작 버튼. 드롭다운 포함.
67
-
68
- ```typescript
69
- @Component({ selector: "sd-additional-button" })
70
- class SdAdditionalButton {
71
- size = input<"sm" | "lg">();
72
- inset = input(false, { transform: booleanAttribute });
73
- }
74
- ```
75
-
76
- ### `SdModalSelectButton`
77
-
78
- 모달을 열어 선택하는 버튼 컴포넌트.
79
-
80
- ```typescript
81
- @Component({ selector: "sd-modal-select-button" })
82
- class SdModalSelectButton<T extends object, K, M extends keyof SelectModeValue<K>> {
83
- modal = input.required<SdSelectModalInfo<SdSelectModal<T>>>();
84
- value = model<SelectModeValue<K>[M]>();
85
- selectedItems = model<T[]>([]);
86
- disabled = input(false, { transform: booleanAttribute });
87
- required = input(false, { transform: booleanAttribute });
88
- inset = input(false, { transform: booleanAttribute });
89
- size = input<"sm" | "lg">();
90
- selectMode = input<M>("single" as M);
91
- modalOptions = input<SdModalOptions>();
92
- searchIcon = input(tablerSearch);
93
- }
94
- ```
95
-
96
- | Input | Type | Default | Description |
97
- |-------|------|---------|-------------|
98
- | `modal` | `SdSelectModalInfo<...>` | required | 모달 정보 |
99
- | `value` | `SelectModeValue<K>[M]` | - | 선택된 값 (two-way) |
100
- | `selectedItems` | `T[]` | `[]` | 선택된 항목 객체 배열 (two-way) |
101
- | `disabled` | `boolean` | `false` | 비활성화 |
102
- | `required` | `boolean` | `false` | 필수 (지우기 버튼 숨김) |
103
- | `inset` | `boolean` | `false` | 삽입 스타일 |
104
- | `size` | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
105
- | `selectMode` | `M` | `"single"` | 선택 모드 |
@@ -1,39 +0,0 @@
1
- # `SdCheckboxGroup`
2
-
3
- 체크박스 그룹 컴포넌트. `SdCheckboxGroupItem`과 함께 사용하여 다중 선택을 관리한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-checkbox-group", ... })
7
- export class SdCheckboxGroup<T>
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `value` | model | `T[]` | 선택된 값 배열 (기본값: `[]`) |
15
- | `disabled` | input | `boolean` | 비활성화 (기본값: `false`) |
16
-
17
- ## Related Types
18
-
19
- ### `SdCheckboxGroupItem`
20
-
21
- ```typescript
22
- @Component({ selector: "sd-checkbox-group-item", ... })
23
- export class SdCheckboxGroupItem<T>
24
- ```
25
-
26
- | Member | Kind | Type | Description |
27
- |--------|------|------|-------------|
28
- | `value` | input (required) | `T` | 이 항목의 값 |
29
- | `inline` | input | `boolean` | 인라인 표시 (기본값: `false`) |
30
-
31
- ## Usage
32
-
33
- ```html
34
- <sd-checkbox-group [(value)]="selectedRoles">
35
- <sd-checkbox-group-item [value]="'admin'">관리자</sd-checkbox-group-item>
36
- <sd-checkbox-group-item [value]="'user'">사용자</sd-checkbox-group-item>
37
- <sd-checkbox-group-item [value]="'viewer'">조회</sd-checkbox-group-item>
38
- </sd-checkbox-group>
39
- ```
@@ -1,81 +0,0 @@
1
- # `SdCheckbox`
2
-
3
- 체크박스 컴포넌트.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-checkbox" })
7
- class SdCheckbox {
8
- value = model(false);
9
- canChangeFn = input<(item: boolean) => boolean | Promise<boolean>>(() => true);
10
- icon = input(tablerCheck);
11
- radio = input(false, { transform: booleanAttribute });
12
- disabled = input(false, { transform: booleanAttribute });
13
- size = input<"sm" | "lg">();
14
- inline = input(false, { transform: booleanAttribute });
15
- inset = input(false, { transform: booleanAttribute });
16
- theme = input<"primary" | "secondary" | "info" | "success" | "warning" | "danger" | "gray" | "blue-gray">();
17
- contentStyle = input<string>();
18
- }
19
- ```
20
-
21
- ## Members
22
-
23
- | Member | Kind | Type | Default | Description |
24
- |--------|------|------|---------|-------------|
25
- | `value` | model | `boolean` | `false` | 체크 여부 (two-way) |
26
- | `canChangeFn` | input | `(item: boolean) => boolean \| Promise<boolean>` | `() => true` | 값 변경 가능 여부 함수 |
27
- | `icon` | input | `string` | `tablerCheck` | 체크 아이콘 |
28
- | `radio` | input | `boolean` | `false` | 라디오 버튼 스타일 |
29
- | `disabled` | input | `boolean` | `false` | 비활성화 |
30
- | `size` | input | `"sm" \| "lg" \| undefined` | `undefined` | 크기 |
31
- | `inline` | input | `boolean` | `false` | 인라인 표시 |
32
- | `inset` | input | `boolean` | `false` | 삽입 스타일 |
33
- | `theme` | input | `string \| undefined` | `undefined` | 테마 색상 |
34
- | `contentStyle` | input | `string \| undefined` | `undefined` | 라벨 텍스트 인라인 스타일 |
35
-
36
- ### 실사용 예
37
-
38
- - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — 필터 영역 "삭제항목 포함" 체크박스
39
-
40
- ## Related Types
41
-
42
- ### `SdSwitch`
43
-
44
- 스위치 토글 컴포넌트.
45
-
46
- ```typescript
47
- @Component({ selector: "sd-switch" })
48
- class SdSwitch {
49
- value = model(false);
50
- canChangeFn = input<(item: boolean) => boolean | Promise<boolean>>(() => true);
51
- disabled = input(false, { transform: booleanAttribute });
52
- inline = input(false, { transform: booleanAttribute });
53
- inset = input(false, { transform: booleanAttribute });
54
- size = input<"sm" | "lg">();
55
- theme = input<string>();
56
- }
57
- ```
58
-
59
- ### `SdCheckboxGroup`
60
-
61
- 체크박스 그룹 컴포넌트.
62
-
63
- ```typescript
64
- @Component({ selector: "sd-checkbox-group" })
65
- class SdCheckboxGroup<T> {
66
- value = model<T[]>([]);
67
- disabled = input(false, { transform: booleanAttribute });
68
- }
69
- ```
70
-
71
- ### `SdCheckboxGroupItem`
72
-
73
- 체크박스 그룹 항목.
74
-
75
- ```typescript
76
- @Component({ selector: "sd-checkbox-group-item" })
77
- class SdCheckboxGroupItem<T> {
78
- value = input.required<T>();
79
- inline = input(false, { transform: booleanAttribute });
80
- }
81
- ```
@@ -1,27 +0,0 @@
1
- # `SdDateRangePicker`
2
-
3
- 날짜 범위 선택 컴포넌트. 기간 유형(`일`/`월`/`범위`)을 선택하고 `from`/`to` 날짜를 입력한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-date-range-picker", ... })
7
- export class SdDateRangePicker
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `periodType` | model | `"일" \| "월" \| "범위"` | 기간 유형 (기본값: `"범위"`) |
15
- | `from` | model | `DateOnly \| undefined` | 시작 날짜 |
16
- | `to` | model | `DateOnly \| undefined` | 종료 날짜 |
17
- | `required` | input | `boolean` | 필수 여부 (기본값: `false`) |
18
-
19
- ## Usage
20
-
21
- ```html
22
- <sd-date-range-picker
23
- [(periodType)]="searchPeriodType"
24
- [(from)]="searchFrom"
25
- [(to)]="searchTo"
26
- />
27
- ```
@@ -1,89 +0,0 @@
1
- # `SdForm`
2
-
3
- 폼 래퍼 컴포넌트. `<form>` 태그를 렌더링하며 submit 이벤트 처리 및 유효성 검증을 수행한다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-form" })
7
- class SdForm {
8
- formSubmit = output<SubmitEvent>();
9
- formInvalid = output();
10
-
11
- requestSubmit(): void;
12
- }
13
- ```
14
-
15
- ## Members
16
-
17
- | Member | Kind | Type | Description |
18
- |--------|------|------|-------------|
19
- | `formSubmit` | output | `SubmitEvent` | 유효성 검증 통과 시 발생 |
20
- | `formInvalid` | output | `void` | 유효성 검증 실패 시 발생 (`reportValidity()` 호출 후) |
21
- | `requestSubmit()` | method | `() => void` | 프로그래밍 방식으로 submit 트리거 |
22
-
23
- ## Usage
24
-
25
- ```html
26
- <sd-form #formCtrl (formSubmit)="onSubmit($event)">
27
- <sd-textfield [type]="'text'" [(value)]="name" [required]="true" />
28
- <sd-button [type]="'submit'">저장</sd-button>
29
- </sd-form>
30
- ```
31
-
32
- 프로그래밍 방식 저장:
33
-
34
- ```typescript
35
- const formCtrl = viewChild.required<SdForm>('formCtrl');
36
-
37
- onSave(): void {
38
- this.formCtrl().requestSubmit();
39
- }
40
- ```
41
-
42
- ### 실사용 예
43
-
44
- - [crud-list.md §3 최소 뼈대: 조회 전용 page](../recipes/crud-list.md#3-최소-뼈대-조회-전용-page) — 필터 폼 래퍼 (formSubmit으로 검색 트리거)
45
- - [crud-list.md §5 확장 A: inline 편집/저장](../recipes/crud-list.md#5-확장-a-inline-편집저장) — 편집 폼 래퍼 (#formCtrl + requestSubmit)
46
- - [crud-detail.md §3 최소 뼈대: 읽기 전용 상세 폼](../recipes/crud-detail.md#3-최소-뼈대-읽기-전용-상세-폼) — 읽기 전용 필드 배치 컨테이너
47
- - [crud-detail.md §5 확장 A: 편집/저장](../recipes/crud-detail.md#5-확장-a-편집저장) — 편집 폼 래퍼 (formSubmit + #formCtrl + requestSubmit)
48
-
49
- ## Related Types
50
-
51
- ### `SdStatePreset`
52
-
53
- 상태 프리셋 저장/불러오기 컴포넌트.
54
-
55
- ```typescript
56
- @Component({ selector: "sd-state-preset" })
57
- class SdStatePreset {
58
- key = input.required<string>();
59
- state = model<any>();
60
- size = input<"sm" | "lg">();
61
- }
62
- ```
63
-
64
- ### `SdTiptapEditor`
65
-
66
- TipTap 기반 리치 텍스트 에디터.
67
-
68
- ```typescript
69
- @Component({ selector: "sd-tiptap-editor" })
70
- class SdTiptapEditor {
71
- value = model<string>();
72
- disabled = input(false, { transform: booleanAttribute });
73
- readonly = input(false, { transform: booleanAttribute });
74
- required = input(false, { transform: booleanAttribute });
75
- placeholder = input<string>();
76
- validatorFn = input<(value: string | undefined) => string | undefined>();
77
- extensions = input<AnyExtension[]>();
78
- }
79
- ```
80
-
81
- | Input | Type | Default | Description |
82
- |-------|------|---------|-------------|
83
- | `value` | `string \| undefined` | - | HTML 콘텐츠 (two-way) |
84
- | `disabled` | `boolean` | `false` | 비활성화 |
85
- | `readonly` | `boolean` | `false` | 읽기 전용 |
86
- | `required` | `boolean` | `false` | 필수 |
87
- | `placeholder` | `string \| undefined` | `undefined` | 플레이스홀더 |
88
- | `validatorFn` | `((value) => string \| undefined) \| undefined` | `undefined` | 커스텀 유효성 검증 함수 |
89
- | `extensions` | `AnyExtension[] \| undefined` | `undefined` | 추가 TipTap 확장 |
@@ -1,54 +0,0 @@
1
- # `SdModalSelectButton`
2
-
3
- 모달을 열어 항목을 선택하는 버튼 컴포넌트. 선택된 값은 `value`와 `selectedItems` model로 관리된다.
4
-
5
- ```typescript
6
- @Component({ selector: "sd-modal-select-button", ... })
7
- export class SdModalSelectButton<T extends object, K, M extends keyof SelectModeValue<K> = keyof SelectModeValue<K>>
8
- ```
9
-
10
- ## Members
11
-
12
- | Member | Kind | Type | Description |
13
- |--------|------|------|-------------|
14
- | `modal` | input (required) | `SdSelectModalInfo<SdSelectModal<T>>` | 모달 정보 |
15
- | `value` | model | `SelectModeValue<K>[M] \| undefined` | 선택된 키 값 |
16
- | `selectedItems` | model | `T[]` | 선택된 항목 배열 (기본값: `[]`) |
17
- | `disabled` | input | `boolean` | 비활성화 여부 (기본값: `false`) |
18
- | `required` | input | `boolean` | 필수 여부 (기본값: `false`) |
19
- | `inset` | input | `boolean` | 인셋 스타일 (기본값: `false`) |
20
- | `size` | input | `"sm" \| "lg" \| undefined` | 크기 |
21
- | `selectMode` | input | `M` | 선택 모드 (기본값: `"single"`) |
22
- | `modalOptions` | input | `SdModalOptions \| undefined` | 모달 옵션 |
23
- | `searchIcon` | input | `string` | 검색 버튼 아이콘 SVG (기본값: `tablerSearch`) |
24
-
25
- ## Related Types
26
-
27
- ### `SdSelectModal<T>`
28
-
29
- ```typescript
30
- interface SdSelectModal<T> extends SdModalContentDef<SelectModalOutputResult<T>> {
31
- selectMode: InputSignal<"single" | "multi" | undefined>;
32
- selectedItemKeys: InputSignal<any[]>;
33
- }
34
- ```
35
-
36
- ### `SdSelectModalInfo<T>`
37
-
38
- ```typescript
39
- type SdSelectModalInfo<T extends SdSelectModal<any>> = SdModalInfo<T, "selectMode" | "selectedItemKeys">
40
- ```
41
-
42
- `selectMode`, `selectedItemKeys`를 제외한 나머지 inputs만 전달하면 된다.
43
-
44
- ## Usage
45
-
46
- ```html
47
- <sd-modal-select-button
48
- [modal]="{ title: '고객 선택', type: CustomerSelectModal, inputs: {} }"
49
- [(value)]="selectedCustomerId"
50
- [(selectedItems)]="selectedCustomers"
51
- >
52
- {{ selectedCustomers()[0]?.name }}
53
- </sd-modal-select-button>
54
- ```