@simplysm/angular 14.0.48 → 14.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +234 -226
- package/dist/controls/select/sd-select.js +3 -3
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/layout/dock/sd-dock-container.js +1 -1
- package/dist/styles.css +9 -0
- package/docs/bootstrap/provide-sd-angular.md +37 -0
- package/docs/bootstrap/sd-angular-config-provider.md +16 -0
- package/docs/directives/sd-command-directive.md +30 -0
- package/docs/directives/sd-events.md +25 -0
- package/docs/directives/sd-intersection-directive.md +36 -0
- package/docs/directives/sd-invalid.md +24 -0
- package/docs/directives/sd-resize-directive.md +42 -0
- package/docs/directives/sd-ripple.md +23 -0
- package/docs/directives/sd-router-link.md +38 -0
- package/docs/directives/sd-show-effect.md +18 -0
- package/docs/directives/sd-typed-template.md +69 -0
- package/docs/features/sd-address-search-modal.md +50 -0
- package/docs/features/sd-permission-table.md +20 -0
- package/docs/features/sd-shared-data-components.md +158 -0
- package/docs/features/sd-tiptap-editor.md +26 -0
- package/docs/{pipes.md → pipes/format-pipe.md} +14 -5
- package/docs/plugins/sd-global-error-handler.md +23 -0
- package/docs/{plugins.md → plugins/sd-option-event-plugin.md} +9 -12
- package/docs/provider-types/sd-menu.md +65 -0
- package/docs/provider-types/sd-modal-content-def.md +148 -0
- package/docs/provider-types/sd-toast-content-def.md +73 -0
- package/docs/provider-types/shared-data-base.md +59 -0
- package/docs/providers/sd-activated-modal-provider.md +34 -0
- package/docs/providers/sd-app-structure-provider.md +81 -0
- package/docs/providers/sd-busy-provider.md +18 -0
- package/docs/providers/sd-file-dialog-provider.md +40 -0
- package/docs/providers/sd-local-storage-provider.md +20 -0
- package/docs/providers/sd-modal-provider.md +67 -0
- package/docs/providers/sd-navigate-window-provider.md +18 -0
- package/docs/providers/sd-print-provider.md +25 -0
- package/docs/providers/sd-service-client-factory-provider.md +43 -0
- package/docs/providers/sd-shared-data-provider.md +64 -0
- package/docs/providers/sd-system-config-provider.md +46 -0
- package/docs/providers/sd-system-log-provider.md +18 -0
- package/docs/providers/sd-theme-provider.md +38 -0
- package/docs/providers/sd-toast-provider.md +65 -0
- package/docs/recipes/_common-rules.md +244 -0
- package/docs/recipes/crud-detail/extension-a-edit-save.md +230 -0
- package/docs/recipes/crud-detail/extension-b-delete-restore.md +142 -0
- package/docs/recipes/crud-detail/extension-c-modal-view.md +214 -0
- package/docs/recipes/crud-detail/extension-d-control-view.md +103 -0
- package/docs/recipes/crud-detail/extension-e-auxiliary.md +87 -0
- package/docs/recipes/crud-detail/extension-f-complex-detail.md +234 -0
- package/docs/recipes/crud-detail.md +215 -722
- package/docs/recipes/crud-list/extension-a-inline-edit.md +410 -0
- package/docs/recipes/crud-list/extension-b-selection.md +226 -0
- package/docs/recipes/crud-list/extension-c-inline-delete.md +87 -0
- package/docs/recipes/crud-list/extension-d-select-modal.md +207 -0
- package/docs/recipes/crud-list/extension-e-readonly-modal.md +165 -0
- package/docs/recipes/crud-list/extension-f-modal-edit.md +177 -0
- package/docs/recipes/crud-list/extension-g-excel.md +157 -0
- package/docs/recipes/crud-list.md +293 -626
- package/docs/recipes/data-select-button.md +194 -101
- package/docs/recipes/page-modal-container.md +168 -86
- package/docs/styling/classes.md +149 -0
- package/docs/styling/mixins.md +100 -0
- package/docs/styling/themes.md +35 -0
- package/docs/styling/variables.md +147 -0
- package/docs/{type-utilities.md → type-utilities/directive-input-signals.md} +17 -35
- package/docs/ui-data/sd-list.md +37 -0
- package/docs/ui-data/sd-sheet.md +227 -0
- package/docs/ui-form/sd-additional-button.md +26 -0
- package/docs/ui-form/sd-anchor.md +31 -0
- package/docs/ui-form/sd-button.md +105 -0
- package/docs/ui-form/sd-checkbox-group.md +39 -0
- package/docs/ui-form/sd-checkbox.md +81 -0
- package/docs/ui-form/sd-date-range-picker.md +27 -0
- package/docs/ui-form/sd-form.md +89 -0
- package/docs/ui-form/sd-modal-select-button.md +54 -0
- package/docs/ui-form/sd-numpad.md +26 -0
- package/docs/ui-form/sd-range.md +26 -0
- package/docs/ui-form/sd-select.md +68 -0
- package/docs/ui-form/sd-shared-data-select.md +52 -0
- package/docs/ui-form/sd-state-preset.md +37 -0
- package/docs/ui-form/sd-switch.md +27 -0
- package/docs/ui-form/sd-textarea.md +33 -0
- package/docs/ui-form/sd-textfield.md +145 -0
- package/docs/ui-layout/sd-dock-container.md +64 -0
- package/docs/ui-layout/sd-dock.md +37 -0
- package/docs/ui-layout/sd-gap.md +26 -0
- package/docs/{ui-layout.md → ui-layout/sd-kanban-board.md} +41 -85
- package/docs/ui-layout/sd-kanban-lane.md +34 -0
- package/docs/ui-layout/sd-kanban.md +29 -0
- package/docs/ui-navigation/sd-collapse.md +35 -0
- package/docs/ui-navigation/sd-pagination.md +26 -0
- package/docs/ui-navigation/sd-sidebar-container.md +49 -0
- package/docs/ui-navigation/sd-sidebar-menu.md +22 -0
- package/docs/ui-navigation/sd-sidebar-user.md +43 -0
- package/docs/ui-navigation/sd-tab.md +51 -0
- package/docs/ui-navigation/sd-topbar-container.md +97 -0
- package/docs/ui-navigation/sd-topbar-menu.md +23 -0
- package/docs/ui-navigation/sd-topbar-user.md +38 -0
- package/docs/ui-navigation/sd-topbar.md +30 -0
- package/docs/ui-overlay/sd-busy-container.md +69 -0
- package/docs/ui-overlay/sd-confirm-modal.md +30 -0
- package/docs/ui-overlay/sd-dropdown.md +40 -0
- package/docs/ui-overlay/sd-modal.md +34 -0
- package/docs/ui-overlay/sd-prompt-modal.md +30 -0
- package/docs/ui-overlay/sd-toast.md +35 -0
- package/docs/ui-visual/sd-barcode.md +36 -0
- package/docs/ui-visual/sd-calendar.md +34 -0
- package/docs/ui-visual/sd-echarts.md +32 -0
- package/docs/ui-visual/sd-label.md +24 -0
- package/docs/ui-visual/sd-note.md +23 -0
- package/docs/ui-visual/sd-progress.md +23 -0
- package/docs/utils/inject-routing-signals.md +161 -0
- package/docs/utils/inject-sd-system-config-resource.md +35 -0
- package/docs/utils/mark.md +43 -0
- package/docs/utils/selection-managers.md +96 -0
- package/docs/utils/set-safe-style.md +19 -0
- package/docs/utils/setup-functions.md +93 -0
- package/package.json +7 -7
- package/scss/commons/_styles.scss +12 -0
- package/src/controls/select/sd-select.ts +3 -3
- package/src/core/modal/sd-modal.provider.ts +1 -1
- package/src/core/modal/sd-modal.ts +1 -1
- package/src/core/routing/menu-utils.ts +1 -1
- package/src/core/shared-data/sd-shared-data.provider.ts +7 -7
- package/src/data/shared-data/sd-shared-data-select.ts +2 -2
- package/src/index.ts +0 -3
- package/src/layout/dock/sd-dock-container.ts +1 -1
- package/dist/data/getOrmDataEditToastErrorMessage.d.ts +0 -2
- package/dist/data/getOrmDataEditToastErrorMessage.d.ts.map +0 -1
- package/dist/data/getOrmDataEditToastErrorMessage.js +0 -8
- package/docs/bootstrap.md +0 -38
- package/docs/directives.md +0 -236
- package/docs/features.md +0 -169
- package/docs/provider-types.md +0 -283
- package/docs/providers.md +0 -379
- package/docs/styling.md +0 -222
- package/docs/ui-data.md +0 -333
- package/docs/ui-form.md +0 -502
- package/docs/ui-navigation.md +0 -273
- package/docs/ui-overlay.md +0 -157
- package/docs/ui-visual.md +0 -127
- package/docs/utils.md +0 -244
- package/src/data/getOrmDataEditToastErrorMessage.ts +0 -10
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# CSS Custom Properties
|
|
2
|
+
|
|
3
|
+
`:root`에 선언되는 CSS 커스텀 프로퍼티. SCSS `$vars` 맵에서 `mixins.writeVars()`로 생성된다.
|
|
4
|
+
|
|
5
|
+
## Theme Colors
|
|
6
|
+
|
|
7
|
+
OKLCH 기반 17+5 색상 팔레트. 각 테마 그룹에 7단계 shade가 존재한다.
|
|
8
|
+
|
|
9
|
+
**테마 그룹**: gray, blue-gray, primary, secondary, info, success, warning, danger
|
|
10
|
+
|
|
11
|
+
**Shade 단계**: lightest (+90%), lighter (+75%), light (+60%), default, dark (-10%), darker (-25%), darkest (-40%)
|
|
12
|
+
|
|
13
|
+
| Property Pattern | Description |
|
|
14
|
+
|------------------|-------------|
|
|
15
|
+
| `--theme-{group}-lightest` | 가장 밝은 단계 |
|
|
16
|
+
| `--theme-{group}-lighter` | 밝은 단계 |
|
|
17
|
+
| `--theme-{group}-light` | 약간 밝은 단계 |
|
|
18
|
+
| `--theme-{group}-default` | 기본 단계 |
|
|
19
|
+
| `--theme-{group}-dark` | 약간 어두운 단계 |
|
|
20
|
+
| `--theme-{group}-darker` | 어두운 단계 |
|
|
21
|
+
| `--theme-{group}-darkest` | 가장 어두운 단계 |
|
|
22
|
+
|
|
23
|
+
**기본 색상 매핑** (OKLCH):
|
|
24
|
+
|
|
25
|
+
| Theme Group | Base Color |
|
|
26
|
+
|-------------|------------|
|
|
27
|
+
| gray | `oklch(0.707 0.022 261.325)` (gray) |
|
|
28
|
+
| blue-gray | `oklch(0.704 0.04 256.788)` (slate) |
|
|
29
|
+
| primary | `oklch(0.707 0.165 254.624)` (blue) |
|
|
30
|
+
| secondary | `oklch(0.707 0.165 254.624)` (blue) |
|
|
31
|
+
| info | `oklch(0.789 0.154 211.53)` (cyan) |
|
|
32
|
+
| success | `oklch(0.841 0.238 128.85)` (lime) |
|
|
33
|
+
| warning | `oklch(0.75 0.183 55.934)` (orange) |
|
|
34
|
+
| danger | `oklch(0.704 0.191 22.216)` (red) |
|
|
35
|
+
|
|
36
|
+
## Transparency
|
|
37
|
+
|
|
38
|
+
| Property | Default | Description |
|
|
39
|
+
|----------|---------|-------------|
|
|
40
|
+
| `--trans-darkest` | `rgba(0, 0, 0, 0.5)` | 가장 어두운 투명 |
|
|
41
|
+
| `--trans-darker` | `rgba(0, 0, 0, 0.4)` | |
|
|
42
|
+
| `--trans-dark` | `rgba(0, 0, 0, 0.3)` | |
|
|
43
|
+
| `--trans-default` | `rgba(0, 0, 0, 0.2)` | |
|
|
44
|
+
| `--trans-light` | `rgba(0, 0, 0, 0.1)` | |
|
|
45
|
+
| `--trans-lighter` | `rgba(0, 0, 0, 0.05)` | |
|
|
46
|
+
| `--trans-lightest` | `rgba(0, 0, 0, 0.03)` | |
|
|
47
|
+
| `--trans-rev-default` | `rgba(255, 255, 255, 0.1)` | 역방향 투명 |
|
|
48
|
+
| `--trans-rev-light` | `rgba(255, 255, 255, 0.2)` | |
|
|
49
|
+
| `--trans-rev-lighter` | `rgba(255, 255, 255, 0.3)` | |
|
|
50
|
+
| `--trans-rev-lightest` | `rgba(255, 255, 255, 0.4)` | |
|
|
51
|
+
|
|
52
|
+
## Text Colors
|
|
53
|
+
|
|
54
|
+
| Property | Default | Description |
|
|
55
|
+
|----------|---------|-------------|
|
|
56
|
+
| `--text-trans-dark` | `black` | 강조 텍스트 |
|
|
57
|
+
| `--text-trans-default` | `rgba(0, 0, 0, 0.87)` | 기본 텍스트 |
|
|
58
|
+
| `--text-trans-light` | `rgba(0, 0, 0, 0.6)` | 보조 텍스트 |
|
|
59
|
+
| `--text-trans-lighter` | `rgba(0, 0, 0, 0.38)` | 비활성 텍스트 |
|
|
60
|
+
| `--text-trans-lightest` | `rgba(0, 0, 0, 0.2)` | 최소 텍스트 |
|
|
61
|
+
| `--text-trans-rev-default` | `white` | 역방향 기본 텍스트 |
|
|
62
|
+
| `--text-trans-rev-dark` | `rgba(255, 255, 255, 0.7)` | 역방향 강조 텍스트 |
|
|
63
|
+
| `--text-trans-rev-darker` | `rgba(255, 255, 255, 0.5)` | 역방향 더 강조 |
|
|
64
|
+
|
|
65
|
+
## Font Size
|
|
66
|
+
|
|
67
|
+
| Property | Default | Description |
|
|
68
|
+
|----------|---------|-------------|
|
|
69
|
+
| `--font-size-h1` | `2rem` | h1 |
|
|
70
|
+
| `--font-size-h2` | `1.5rem` | h2 |
|
|
71
|
+
| `--font-size-h3` | `1.3333rem` | h3 |
|
|
72
|
+
| `--font-size-h4` | `1.1667rem` | h4 |
|
|
73
|
+
| `--font-size-h5` | `1rem` | h5 |
|
|
74
|
+
| `--font-size-h6` | `0.9167rem` | h6 |
|
|
75
|
+
| `--font-size-lg` | `1.1667rem` | 큰 폰트 |
|
|
76
|
+
| `--font-size-default` | `1rem` | 기본 폰트 |
|
|
77
|
+
| `--font-size-sm` | `0.9167rem` | 작은 폰트 |
|
|
78
|
+
|
|
79
|
+
## Gap (Spacing)
|
|
80
|
+
|
|
81
|
+
| Property | Default | Description |
|
|
82
|
+
|----------|---------|-------------|
|
|
83
|
+
| `--gap-xxs` | `0.0833rem` | 초소형 |
|
|
84
|
+
| `--gap-xs` | `0.1667rem` | 소형 |
|
|
85
|
+
| `--gap-sm` | `0.3333rem` | 중소형 |
|
|
86
|
+
| `--gap-default` | `0.5rem` | 기본 |
|
|
87
|
+
| `--gap-lg` | `0.6667rem` | 중대형 |
|
|
88
|
+
| `--gap-xl` | `1rem` | 대형 |
|
|
89
|
+
| `--gap-xxl` | `1.5rem` | 초대형 |
|
|
90
|
+
| `--gap-0` | `0` | 없음 |
|
|
91
|
+
| `--gap-auto` | `auto` | 자동 |
|
|
92
|
+
|
|
93
|
+
## Border
|
|
94
|
+
|
|
95
|
+
| Property | Default | Description |
|
|
96
|
+
|----------|---------|-------------|
|
|
97
|
+
| `--border-color-lighter` | `var(--theme-gray-lightest)` | 가장 밝은 border |
|
|
98
|
+
| `--border-color-light` | `var(--theme-gray-lighter)` | 밝은 border |
|
|
99
|
+
| `--border-color-default` | `var(--theme-gray-light)` | 기본 border |
|
|
100
|
+
| `--border-color-dark` | `var(--theme-gray-default)` | 어두운 border |
|
|
101
|
+
| `--border-color-darker` | `var(--theme-gray-dark)` | 가장 어두운 border |
|
|
102
|
+
| `--border-radius-xs` | `var(--gap-xxs)` | |
|
|
103
|
+
| `--border-radius-sm` | `var(--gap-xs)` | |
|
|
104
|
+
| `--border-radius-default` | `var(--gap-sm)` | |
|
|
105
|
+
| `--border-radius-lg` | `var(--gap-default)` | |
|
|
106
|
+
| `--border-radius-xl` | `var(--gap-lg)` | |
|
|
107
|
+
| `--border-radius-xxl` | `var(--gap-xl)` | |
|
|
108
|
+
|
|
109
|
+
## Layout & Z-Index
|
|
110
|
+
|
|
111
|
+
| Property | Default | Description |
|
|
112
|
+
|----------|---------|-------------|
|
|
113
|
+
| `--line-height` | `1.5em` | 기본 line-height |
|
|
114
|
+
| `--font-family` | `sans-serif` | 기본 폰트 패밀리 |
|
|
115
|
+
| `--font-family-monospace` | `monospace` | 코드 폰트 패밀리 |
|
|
116
|
+
| `--background-color` | `white` | 페이지 배경색 |
|
|
117
|
+
| `--background-rev-color` | `black` | 역방향 배경색 |
|
|
118
|
+
| `--control-color` | `white` | 컨트롤 배경색 |
|
|
119
|
+
| `--busy-overlay-bg` | `rgba(255, 255, 255, 0.6)` | busy 오버레이 배경 |
|
|
120
|
+
| `--animation-duration` | `0.2s` | 애니메이션 지속 시간 |
|
|
121
|
+
| `--elevation-size` | `0.0833rem` | elevation 단위 |
|
|
122
|
+
| `--sidebar-width` | `15em` | 사이드바 너비 |
|
|
123
|
+
| `--topbar-height` | `3em` | 탑바 높이 |
|
|
124
|
+
| `--z-index-toast` | `9999` | 토스트 z-index |
|
|
125
|
+
| `--z-index-busy` | `9998` | busy z-index |
|
|
126
|
+
| `--z-index-dropdown` | `5000` | 드롭다운 z-index |
|
|
127
|
+
| `--z-index-modal` | `4000` | 모달 z-index |
|
|
128
|
+
| `--z-index-sidebar` | `3000` | 사이드바 z-index |
|
|
129
|
+
|
|
130
|
+
## Sheet
|
|
131
|
+
|
|
132
|
+
| Property | Default | Description |
|
|
133
|
+
|----------|---------|-------------|
|
|
134
|
+
| `--sheet-pv` | `var(--gap-xs)` | 시트 셀 수직 padding |
|
|
135
|
+
| `--sheet-ph` | `var(--gap-sm)` | 시트 셀 수평 padding |
|
|
136
|
+
| `--sheet-bg` | `var(--theme-gray-lightest)` | 시트 배경색 |
|
|
137
|
+
|
|
138
|
+
## Breakpoints (SCSS 전용)
|
|
139
|
+
|
|
140
|
+
CSS 커스텀 프로퍼티가 아닌 SCSS 변수. media query에서 사용된다.
|
|
141
|
+
|
|
142
|
+
| Variable | Value | Description |
|
|
143
|
+
|----------|-------|-------------|
|
|
144
|
+
| `$breakpoint-mobile` | `520px` | 모바일 |
|
|
145
|
+
| `$breakpoint-xxs` | `800px` | 초소형 |
|
|
146
|
+
| `$breakpoint-xs` | `1024px` | 소형 |
|
|
147
|
+
| `$breakpoint-sm` | `1280px` | 중소형 |
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Type Utilities
|
|
2
2
|
|
|
3
|
+
컴포넌트/디렉티브 입력 시그널 타입 추출 유틸리티 모음.
|
|
4
|
+
|
|
3
5
|
## `DirectiveInputSignals`
|
|
4
6
|
|
|
5
7
|
컴포넌트/디렉티브의 InputSignal 프로퍼티에서 값 타입을 추출하는 유틸리티 타입. InputSignal이 아닌 프로퍼티는 제외되며, undefined를 포함하는 필드는 optional로 변환된다.
|
|
@@ -10,7 +12,8 @@ type DirectiveInputSignals<T> = UndefToOptional<{
|
|
|
10
12
|
}>
|
|
11
13
|
```
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
### 예시
|
|
16
|
+
|
|
14
17
|
```typescript
|
|
15
18
|
class MyComponent {
|
|
16
19
|
name = input.required<string>();
|
|
@@ -31,7 +34,7 @@ type UndefToOptional<T> = {
|
|
|
31
34
|
}
|
|
32
35
|
```
|
|
33
36
|
|
|
34
|
-
예시: `{ name: string; age: number | undefined }`
|
|
37
|
+
예시: `{ name: string; age: number | undefined }` → `{ name: string; age?: number }`
|
|
35
38
|
|
|
36
39
|
## `WithOptional`
|
|
37
40
|
|
|
@@ -62,7 +65,7 @@ interface SortingDef {
|
|
|
62
65
|
|
|
63
66
|
| Field | Type | Description |
|
|
64
67
|
|-------|------|-------------|
|
|
65
|
-
| `key` | `string` | 정렬 키. **컬럼 `key`가 `"vendor.name"`, `"lot.goods.code"` 같은 체인 경로일 수 있다.**
|
|
68
|
+
| `key` | `string` | 정렬 키. **컬럼 `key`가 `"vendor.name"`, `"lot.goods.code"` 같은 체인 경로일 수 있다.** 정렬 처리 시 `item[key]` 단순 접근 대신 `obj.getChainValue(item, key)` (from `@simplysm/core-common`)를 사용해야 한다 |
|
|
66
69
|
| `desc` | `boolean` | 내림차순 여부 |
|
|
67
70
|
|
|
68
71
|
## `ExpandItemDef`
|
|
@@ -85,25 +88,6 @@ interface ExpandItemDef<T> {
|
|
|
85
88
|
| `hasChildren` | `boolean` | 자식 존재 여부 |
|
|
86
89
|
| `depth` | `number` | 깊이 |
|
|
87
90
|
|
|
88
|
-
## `SdSelectModal`
|
|
89
|
-
|
|
90
|
-
모달 선택 컴포넌트가 구현해야 하는 인터페이스. `SdModalContentDef`를 확장.
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
interface SdSelectModal<T> extends SdModalContentDef<SelectModalOutputResult<T>> {
|
|
94
|
-
selectMode: InputSignal<"single" | "multi" | undefined>;
|
|
95
|
-
selectedItemKeys: InputSignal<any[]>;
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## `SdSelectModalInfo`
|
|
100
|
-
|
|
101
|
-
모달 선택 정보. `SdModalInfo`에서 selectMode/selectedItemKeys를 제외.
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
type SdSelectModalInfo<T extends SdSelectModal<any>> = SdModalInfo<T, "selectMode" | "selectedItemKeys">
|
|
105
|
-
```
|
|
106
|
-
|
|
107
91
|
## `SdTextfieldTypes`
|
|
108
92
|
|
|
109
93
|
텍스트필드 타입별 값 타입 매핑.
|
|
@@ -139,7 +123,7 @@ const sdTextfieldTypes: (keyof SdTextfieldTypes)[] = [
|
|
|
139
123
|
|
|
140
124
|
## `SelectModeValue`
|
|
141
125
|
|
|
142
|
-
select mode별 value 타입 매핑.
|
|
126
|
+
select mode별 value 타입 매핑.
|
|
143
127
|
|
|
144
128
|
```typescript
|
|
145
129
|
type SelectModeValue<T> = {
|
|
@@ -150,7 +134,7 @@ type SelectModeValue<T> = {
|
|
|
150
134
|
|
|
151
135
|
## `SdSidebarUserMenu`
|
|
152
136
|
|
|
153
|
-
사이드바 사용자 메뉴 항목.
|
|
137
|
+
사이드바 사용자 메뉴 항목.
|
|
154
138
|
|
|
155
139
|
```typescript
|
|
156
140
|
interface SdSidebarUserMenu {
|
|
@@ -169,7 +153,7 @@ interface SdSidebarUserMenu {
|
|
|
169
153
|
|
|
170
154
|
## `SdTopbarUserMenu`
|
|
171
155
|
|
|
172
|
-
탑바 사용자 메뉴 항목.
|
|
156
|
+
탑바 사용자 메뉴 항목.
|
|
173
157
|
|
|
174
158
|
```typescript
|
|
175
159
|
interface SdTopbarUserMenu {
|
|
@@ -185,7 +169,7 @@ interface SdTopbarUserMenu {
|
|
|
185
169
|
|
|
186
170
|
## `SdStatePresetDef`
|
|
187
171
|
|
|
188
|
-
상태 프리셋 데이터.
|
|
172
|
+
상태 프리셋 데이터.
|
|
189
173
|
|
|
190
174
|
```typescript
|
|
191
175
|
interface SdStatePresetDef {
|
|
@@ -199,9 +183,11 @@ interface SdStatePresetDef {
|
|
|
199
183
|
| `name` | `string` | 프리셋 이름 |
|
|
200
184
|
| `state` | `any` | 저장된 상태 데이터 |
|
|
201
185
|
|
|
202
|
-
##
|
|
186
|
+
## Kanban Types
|
|
187
|
+
|
|
188
|
+
### `SdKanbanBoardDropInfo`
|
|
203
189
|
|
|
204
|
-
칸반 보드 드롭 정보.
|
|
190
|
+
칸반 보드 드롭 정보.
|
|
205
191
|
|
|
206
192
|
```typescript
|
|
207
193
|
interface SdKanbanBoardDropInfo<L, T> {
|
|
@@ -215,11 +201,9 @@ interface SdKanbanBoardDropInfo<L, T> {
|
|
|
215
201
|
|-------|------|-------------|
|
|
216
202
|
| `sourceKanbanValue` | `T \| undefined` | 드래그한 칸반 아이템의 값 |
|
|
217
203
|
| `targetLaneValue` | `L \| undefined` | 드롭 대상 레인의 값 |
|
|
218
|
-
| `targetKanbanValue` | `T \| undefined` | 드롭 대상 칸반 아이템의 값
|
|
204
|
+
| `targetKanbanValue` | `T \| undefined` | 드롭 대상 칸반 아이템의 값 |
|
|
219
205
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
칸반 드래그 참조 인터페이스. `SdKanbanBoard`에서 export됨.
|
|
206
|
+
### `SdKanbanDragRef`
|
|
223
207
|
|
|
224
208
|
```typescript
|
|
225
209
|
interface SdKanbanDragRef<_L, T> {
|
|
@@ -233,9 +217,7 @@ interface SdKanbanDragRef<_L, T> {
|
|
|
233
217
|
| `value()` | `T \| undefined` | 드래그 중인 칸반 아이템의 값 |
|
|
234
218
|
| `heightOnDrag()` | `number` | 드래그 시작 시점의 요소 높이 |
|
|
235
219
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
칸반 드롭 타겟 인터페이스. `SdKanbanBoard`에서 export됨.
|
|
220
|
+
### `SdKanbanDropTarget`
|
|
239
221
|
|
|
240
222
|
```typescript
|
|
241
223
|
interface SdKanbanDropTarget<L, T> {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# `SdList`
|
|
2
|
+
|
|
3
|
+
리스트 컴포넌트.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
@Component({ selector: "sd-list" })
|
|
7
|
+
class SdList {
|
|
8
|
+
inset = input(false, { transform: booleanAttribute });
|
|
9
|
+
}
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Members
|
|
13
|
+
|
|
14
|
+
| Member | Kind | Type | Default | Description |
|
|
15
|
+
|--------|------|------|---------|-------------|
|
|
16
|
+
| `inset` | input | `boolean` | `false` | 삽입 스타일 (테두리 없음) |
|
|
17
|
+
|
|
18
|
+
## Related Types
|
|
19
|
+
|
|
20
|
+
### `SdListItem`
|
|
21
|
+
|
|
22
|
+
리스트 항목 컴포넌트. 접기/펼치기 자식 리스트를 지원한다.
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
@Component({ selector: "sd-list-item" })
|
|
26
|
+
class SdListItem {
|
|
27
|
+
open = model(false);
|
|
28
|
+
selected = input(false, { transform: booleanAttribute });
|
|
29
|
+
readonly = input(false, { transform: booleanAttribute });
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
| Input | Type | Default | Description |
|
|
34
|
+
|-------|------|---------|-------------|
|
|
35
|
+
| `open` | `boolean` | `false` | 자식 리스트 펼침 (two-way) |
|
|
36
|
+
| `selected` | `boolean` | `false` | 선택 상태 |
|
|
37
|
+
| `readonly` | `boolean` | `false` | 읽기 전용 |
|
|
@@ -0,0 +1,227 @@
|
|
|
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
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
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) — 행 삭제 아이콘 앵커
|