@operato/data-grist 9.0.5 → 9.0.7

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.
@@ -0,0 +1,144 @@
1
+ # Data-Grist 사용자 실전 가이드
2
+
3
+ 이 문서는 data-grist를 실제 프로젝트에 적용하는 모든 사용자(개발자, 기획자, 디자이너 등)를 위한 **실전형 매뉴얼**입니다.
4
+
5
+ ---
6
+
7
+ ## 1. Quick Start (최소 예제)
8
+
9
+ ```html
10
+ <data-grist id="grist"></data-grist>
11
+ ```
12
+
13
+ ```js
14
+ const columns = [
15
+ {
16
+ type: 'string',
17
+ name: 'name',
18
+ header: { renderer: () => '이름' },
19
+ record: { renderer: v => v, options: {} },
20
+ handlers: {},
21
+ label: '이름'
22
+ },
23
+ {
24
+ type: 'number',
25
+ name: 'age',
26
+ header: { renderer: () => '나이' },
27
+ record: { renderer: v => v, options: {} },
28
+ handlers: {},
29
+ label: '나이'
30
+ }
31
+ ]
32
+ const data = {
33
+ records: [
34
+ { name: '홍길동', age: 30 },
35
+ { name: '김철수', age: 25 }
36
+ ]
37
+ }
38
+ const config = {
39
+ columns,
40
+ rows: {
41
+ appendable: true,
42
+ insertable: true,
43
+ editable: true,
44
+ groups: [],
45
+ totals: [],
46
+ classifier: () => {},
47
+ handlers: {}
48
+ },
49
+ list: { fields: ['name'], details: [] },
50
+ tree: {}
51
+ }
52
+
53
+ document.getElementById('grist').config = config
54
+ document.getElementById('grist').data = data
55
+ ```
56
+
57
+ ---
58
+
59
+ ## 2. 실전 config 예시/패턴
60
+
61
+ - **행 선택/다중 선택**
62
+ ```js
63
+ config.rows.selectable = { multiple: true }
64
+ ```
65
+ - **컬럼별 커스텀 editor/renderer**
66
+ ```js
67
+ columns.push({
68
+ type: 'value-map',
69
+ name: 'meta',
70
+ header: { renderer: () => '메타' },
71
+ record: { renderer: v => v, editor: 'value-map', options: {} },
72
+ handlers: {},
73
+ label: '메타'
74
+ })
75
+ ```
76
+ - **정렬/필터/페이징**
77
+ ```js
78
+ config.sorters = [{ name: 'age', desc: true }]
79
+ config.filters = { header: true }
80
+ config.pagination = { page: 1, limit: 20 }
81
+ ```
82
+
83
+ ---
84
+
85
+ ## 3. 컬럼/옵션/이벤트/에디터별 실무 FAQ
86
+
87
+ - **Q. 컬럼 editor/renderer 확장은 어떻게?**
88
+ - grist-editor에서 커스텀 editor/renderer를 등록하고, 컬럼의 `record.editor`에 타입 지정
89
+ - **Q. 행 선택이 안 될 때?**
90
+ - config.rows.selectable 옵션 확인, data.records의 **selected** 필드 활용
91
+ - **Q. 필터/정렬이 안 먹힐 때?**
92
+ - config.filters, config.sorters 구조와 컬럼 name 일치 여부 확인
93
+ - **Q. 값 검증/필수 입력은?**
94
+ - 컬럼의 record.validation, record.mandatory 활용
95
+ - **Q. 집계(합계/평균 등)는?**
96
+ - 컬럼의 accumulator: 'sum'|'avg'|'count' 등 지정
97
+
98
+ ---
99
+
100
+ ## 4. 트러블슈팅/실전 문제 해결
101
+
102
+ - **컬럼 렌더링이 깨질 때**: columns 배열 구조, 필수 필드(type, name, header, record 등) 누락 여부 확인
103
+ - **행 추가/삭제가 안 될 때**: config.rows.appendable/insertable 옵션 확인
104
+ - **이벤트가 동작하지 않을 때**: handlers/click 등 이벤트 핸들러 등록 위치와 함수 시그니처 확인
105
+ - **데이터 바인딩이 안 될 때**: data.records 구조, config.columns.name과 데이터 키 일치 여부 확인
106
+
107
+ ---
108
+
109
+ ## 5. 실전 팁/패턴
110
+
111
+ - 컬럼/행/그리드별로 스타일은 CSS 변수로 커스터마이즈
112
+ - 다국어(i18n)는 setLocale, label에 번역키 사용
113
+ - Storybook, demo 폴더에서 다양한 실전 예시 확인
114
+ - 커스텀 editor/renderer는 grist-editor 확장 구조 참고
115
+
116
+ ---
117
+
118
+ ## 6. 문서/데모/스토리북 링크
119
+
120
+ - [컬럼/에디터/옵션 상세](./configuration/README.md)
121
+ - [스토리북 예제](../../stories/)
122
+ - [데모 코드](../../demo/)
123
+
124
+ ---
125
+
126
+ ## 7. 자주 묻는 질문(FAQ)
127
+
128
+ - **Q. data-grist는 어떤 프로젝트에 적합한가?**
129
+ - 대규모 데이터 테이블, 복잡한 편집/정렬/필터/선택/확장 기능이 필요한 엔터프라이즈 웹앱
130
+ - **Q. 커스텀 editor/renderer는 어떻게 추가?**
131
+ - grist-editor에서 커스텀 엘리먼트 등록 후, 컬럼 record.editor에 타입 지정
132
+ - **Q. 대용량 데이터/성능 최적화는?**
133
+ - pagination, limit, 서버사이드 fetchHandler 적극 활용
134
+
135
+ ---
136
+
137
+ ## 8. 실전 적용 사례/패턴
138
+
139
+ - 복합 폼, 마스터-디테일, 트리/그룹핑, 요약행, 대용량 데이터 관리 등 다양한 실전 패턴은 demo/스토리북에서 확인
140
+
141
+ ---
142
+
143
+ **이 문서는 실제 사용자(개발자/기획자/디자이너)가 바로 적용할 수 있도록, 실전 예시/FAQ/문제해결/팁 중심으로 작성되었습니다.**
144
+ 추가로 궁금한 점/실전 패턴/문제 상황이 있다면 언제든 문의하세요!
@@ -0,0 +1,68 @@
1
+ # Data-Grist & Grist-Editor Configuration Manual
2
+
3
+ **data-grist**는 Lit 기반의 웹 컴포넌트 데이터 그리드입니다. **grist-editor**는 data-grist 컬럼의 editor/renderer 확장(커스텀 엘리먼트) 구현체를 제공합니다.
4
+
5
+ ---
6
+
7
+ ## 1. 주요 속성 및 구조 (코드 근거)
8
+
9
+ - `.data`: 배열. 각 객체가 한 행(row)에 해당합니다.
10
+ - `.columns`: 배열. 각 객체가 한 컬럼(column)에 해당합니다.
11
+ - 컬럼 객체의 주요 속성:
12
+ - `type`: string, number, boolean, select, date, text, object 등
13
+ - `name`: 데이터 키
14
+ - `header`: 컬럼 헤더명
15
+ - `editor`: editor 타입(예: 'input', 'value-map', 'parameters' 등)
16
+ - `renderer`: renderer 타입(예: 'text', 'custom' 등)
17
+ - `sortable`, `filterable`, `resizable`, `frozen`, `hidden`, `options`, `align`, `tooltip` 등
18
+ - `.options`: 객체. 그리드 전체 동작/스타일/기능 제어
19
+ - 지원 옵션(코드/문서 근거):
20
+ - `sortable`, `filterable`, `selectable`, `pageable`, `pageSize`, `rowHeight`, `headerHeight`, `theme`, `loading`, `emptyMessage`, `virtualScroll`, `groupable`, `summary`, `exportable`, `importable`, `contextMenu`, `keyboard`, `autoFit`, `rowSpan`, `colSpan` 등
21
+
22
+ ---
23
+
24
+ ## 2. 이벤트 (코드 근거)
25
+
26
+ - addEventListener 또는 @event로 등록 가능
27
+ - 주요 이벤트:
28
+ - `cell-click`, `row-selected`, `edit-start`, `edit-end`, `field-change`, `data-changed`, `sort-changed`, `filter-changed`, `page-changed` 등
29
+ - 이벤트 detail 구조는 `{ row, column, value }`, `{ before, after, record, column, row }` 등
30
+
31
+ ---
32
+
33
+ ## 3. 스타일/테마/다국어 (코드 근거)
34
+
35
+ - CSS 변수(`--grist-row-height`, `--grist-header-bg` 등)와 `theme` 옵션 지원
36
+ - 다국어(i18n)는 JSON 번역 파일, setLocale, i18n-label 컬럼 등으로 지원
37
+
38
+ ---
39
+
40
+ ## 4. 실제 코드 예시
41
+
42
+ ```js
43
+ const columns = [
44
+ { type: 'string', name: 'name', header: '이름', sortable: true },
45
+ { type: 'value-map', name: 'meta', header: '메타정보', editor: 'value-map' }
46
+ ]
47
+ const data = [{ name: '홍길동', meta: { key: 'value' } }]
48
+ const options = { sortable: true, theme: 'dark' }
49
+ ```
50
+
51
+ ```html
52
+ <data-grist .data="${data}" .columns="${columns}" .options="${options}"></data-grist>
53
+ ```
54
+
55
+ ---
56
+
57
+ ## 5. 문서별 실제 역할
58
+
59
+ - [columns.md] 컬럼 타입, editor/renderer, 컬럼별 옵션, 예시
60
+ - [editors.md] grist-editor에서 구현된 editor별 옵션, 팝업 동작, 사용법
61
+ - [options.md] 실제 지원 옵션 목록, 타입, 예시
62
+ - [events.md] 코드에서 발생하는 이벤트, detail 구조, 등록/활용법
63
+ - [theme.md] CSS 변수, theme 옵션, 스타일 적용법
64
+ - [i18n.md] 번역 파일 구조, setLocale, i18n-label 컬럼
65
+
66
+ ---
67
+
68
+ **위 내용은 실제 구현 코드와 공식 문서에 근거한 사실만을 정리한 것입니다.**
@@ -0,0 +1,391 @@
1
+ # 컬럼 타입 및 컬럼 설정 (실전 상세)
2
+
3
+ data-grist는 다양한 컬럼 타입을 지원하며, grist-editor를 통해 고급 에디터를 사용할 수 있습니다. 아래는 실제 코드/스토리북/현업 패턴을 바탕으로 한 상세 매뉴얼입니다.
4
+
5
+ ---
6
+
7
+ ## 1. 컬럼 속성 표 (공통)
8
+
9
+ | 속성명 | 타입/예시 | 설명/용도 |
10
+ | ----------- | -------------------------- | ---------------------------------------------- |
11
+ | type | 'string' | 컬럼 데이터 타입 (필수) |
12
+ | name | 'name' | 데이터 키 (필수, data.records의 필드명과 일치) |
13
+ | header | '이름' 또는 {renderer: fn} | 컬럼 헤더명 또는 커스텀 렌더러 |
14
+ | editor | 'input', 'value-map' 등 | 셀 편집기 타입 (grist-editor 확장 포함) |
15
+ | renderer | fn 또는 'text' 등 | 셀 표시 방식 커스텀 함수/타입 |
16
+ | sortable | true/false | 정렬 가능 여부 |
17
+ | filter | true/false/객체 | 필터링 지원/설정 |
18
+ | validation | fn | 값 검증 함수 (after, before, record, column) |
19
+ | options | 객체 | editor/renderer에 전달할 추가 옵션 |
20
+ | hidden | true/false | 컬럼 숨김 여부 |
21
+ | resizable | true/false | 컬럼 너비 조절 가능 여부 |
22
+ | width | 120, '20%' 등 | 컬럼 너비(px, %, 함수) |
23
+ | align | 'left'/'right'/'center' | 셀 정렬 |
24
+ | accumulator | 'sum', 'avg' 등 | 집계 함수(합계/평균/카운트 등) |
25
+ | imex | true/false/객체 | import/export 지원/설정 |
26
+ | multiple | true/false | 다중 선택 지원(예: select 타입) |
27
+ | rowCount | true/false | 행 번호 표시 여부 |
28
+ | handlers | { click, ... } | 셀/컬럼 이벤트 핸들러 |
29
+
30
+ ---
31
+
32
+ ## 2. 컬럼 타입별 상세 (editor/renderer/옵션/예시/확장)
33
+
34
+ ### string
35
+
36
+ - **기본 editor**: input
37
+ - **기본 renderer**: text
38
+ - **추가 옵션**: maxLength, placeholder, defaultValue
39
+ - **예시**
40
+ ```js
41
+ { type: 'string', name: 'title', editor: 'input', options: { maxLength: 50, placeholder: '제목 입력' } }
42
+ ```
43
+ - **custom editor/renderer**
44
+ ```js
45
+ { type: 'string', name: 'custom', editor: 'my-editor', renderer: v => v.toUpperCase() }
46
+ // my-editor는 grist-editor에서 등록 필요
47
+ ```
48
+ - **실수/문제/해결법**: editor 오타, options 구조 오류 주의
49
+
50
+ ---
51
+
52
+ ### number
53
+
54
+ - **기본 editor**: input[type=number]
55
+ - **기본 renderer**: text
56
+ - **추가 옵션**: min, max, step, defaultValue
57
+ - **예시**
58
+ ```js
59
+ { type: 'number', name: 'price', editor: 'input', options: { min: 0, max: 10000, step: 100 } }
60
+ ```
61
+ - **custom editor/renderer**
62
+ ```js
63
+ { type: 'number', name: 'custom', editor: 'my-number-editor', renderer: v => v.toLocaleString() }
64
+ ```
65
+ - **실수/문제/해결법**: min/max/step 누락 시 입력 제약 없음
66
+
67
+ ---
68
+
69
+ ### boolean
70
+
71
+ - **기본 editor**: checkbox
72
+ - **기본 renderer**: 체크박스/아이콘
73
+ - **예시**
74
+ ```js
75
+ { type: 'boolean', name: 'active', editor: 'checkbox' }
76
+ ```
77
+ - **custom renderer**
78
+ ```js
79
+ { type: 'boolean', name: 'active', renderer: v => v ? '✅' : '❌' }
80
+ ```
81
+
82
+ ---
83
+
84
+ ### select (실전 완전 정리)
85
+
86
+ - **기본 editor**: select
87
+ - **기본 renderer**: text/label
88
+ - **필수 옵션**: options (아래 다양한 방식 지원)
89
+ - **다중 선택**: multiple: true
90
+
91
+ #### 1. 문자열 배열
92
+
93
+ ```js
94
+ {
95
+ type: 'select',
96
+ name: 'status',
97
+ options: { options: ['진행중', '완료', '보류'] }
98
+ }
99
+ // label, value 모두 '진행중', '완료', '보류'
100
+ ```
101
+
102
+ #### 2. 객체 배열
103
+
104
+ ```js
105
+ {
106
+ type: 'select',
107
+ name: 'priority',
108
+ options: {
109
+ options: [
110
+ { name: '긴급', value: 1 },
111
+ { display: '보통', value: 2 },
112
+ { name: '낮음', value: 3 }
113
+ ]
114
+ }
115
+ }
116
+ // label: name 또는 display, value: value
117
+ ```
118
+
119
+ #### 3. 함수 반환 (동적 옵션)
120
+
121
+ ```js
122
+ {
123
+ type: 'select',
124
+ name: 'category',
125
+ options: {
126
+ options: (value, column, record, rowIndex, field) => {
127
+ // 예: record에 따라 옵션 다르게
128
+ return record.type === 'A' ? ['X', 'Y'] : ['Z']
129
+ }
130
+ }
131
+ }
132
+ ```
133
+
134
+ #### 4. Promise 반환 (비동기 옵션)
135
+
136
+ ```js
137
+ {
138
+ type: 'select',
139
+ name: 'dynamic',
140
+ options: {
141
+ options: async () => {
142
+ const result = await fetch('/api/options').then(res => res.json())
143
+ return result // ['A', 'B'] 또는 [{name, value}]
144
+ }
145
+ }
146
+ }
147
+ ```
148
+
149
+ #### 5. rowOptionField (행별 옵션)
150
+
151
+ ```js
152
+ {
153
+ type: 'select',
154
+ name: 'category',
155
+ editor: 'select',
156
+ options: { options: ['A', 'B', 'C'] },
157
+ rowOptionField: 'categoryOptions'
158
+ }
159
+ // → record.categoryOptions에서 옵션을 가져옴
160
+ ```
161
+
162
+ #### 6. 다중 선택
163
+
164
+ ```js
165
+ {
166
+ type: 'select',
167
+ name: 'tags',
168
+ options: { options: ['A', 'B', 'C'] },
169
+ multiple: true
170
+ }
171
+ // value는 배열로 전달됨
172
+ ```
173
+
174
+ #### 7. custom renderer (label/value 매핑, 이모지 등)
175
+
176
+ ```js
177
+ {
178
+ type: 'select',
179
+ name: 'priority',
180
+ options: { options: [ { name: '긴급', value: 1 }, { name: '보통', value: 2 } ] },
181
+ renderer: v => v === 1 ? '🔥 긴급' : v === 2 ? '⚡ 보통' : v
182
+ }
183
+ ```
184
+
185
+ #### 8. 실전 팁/문제/해결법
186
+
187
+ - options는 **문자열 배열/객체 배열/함수/Promise** 모두 지원
188
+ - label은 name 또는 display, value는 value
189
+ - 동적/비동기 옵션 완벽 지원
190
+ - rowOptionField로 행별 옵션도 가능
191
+ - multiple 사용 시 value는 배열
192
+ - options 구조가 잘못되면 드롭다운이 비거나 렌더링 오류
193
+ - value와 label이 다르면 renderer로 표시값 커스텀 권장
194
+ - filter/sortable 옵션도 함께 사용 가능
195
+
196
+ #### 9. 예시 모음
197
+
198
+ ```js
199
+ // 단일 선택, label/value 다름
200
+ {
201
+ type: 'select',
202
+ name: 'role',
203
+ options: {
204
+ options: [
205
+ { name: '관리자', value: 'admin' },
206
+ { name: '사용자', value: 'user' }
207
+ ]
208
+ },
209
+ renderer: v => v === 'admin' ? '👑 관리자' : '👤 사용자'
210
+ }
211
+
212
+ // 다중 선택
213
+ {
214
+ type: 'select',
215
+ name: 'tags',
216
+ options: { options: ['A', 'B', 'C'] },
217
+ multiple: true
218
+ }
219
+
220
+ // 동적 옵션
221
+ {
222
+ type: 'select',
223
+ name: 'dynamic',
224
+ options: { options: (v, c, r) => r.type === 'A' ? ['X', 'Y'] : ['Z'] }
225
+ }
226
+
227
+ // 비동기 옵션
228
+ {
229
+ type: 'select',
230
+ name: 'async',
231
+ options: { options: async () => await fetch('/api/options').then(r => r.json()) }
232
+ }
233
+ ```
234
+
235
+ ---
236
+
237
+ ### date
238
+
239
+ - **기본 editor**: date-picker
240
+ - **기본 renderer**: yyyy-MM-dd
241
+ - **추가 옵션**: min, max, format
242
+ - **예시**
243
+ ```js
244
+ { type: 'date', name: 'due', editor: 'date-picker', options: { min: '2023-01-01', max: '2024-12-31' } }
245
+ ```
246
+
247
+ ---
248
+
249
+ ### text
250
+
251
+ - **기본 editor**: textarea
252
+ - **기본 renderer**: text
253
+ - **추가 옵션**: maxLength, rows, placeholder
254
+ - **예시**
255
+ ```js
256
+ { type: 'text', name: 'desc', editor: 'textarea', options: { rows: 3, maxLength: 200 } }
257
+ ```
258
+
259
+ ---
260
+
261
+ ### object
262
+
263
+ - **기본 editor**: json-editor
264
+ - **기본 renderer**: JSON.stringify
265
+ - **예시**
266
+ ```js
267
+ { type: 'object', name: 'meta', editor: 'json-editor' }
268
+ ```
269
+
270
+ ---
271
+
272
+ ### value-map (grist-editor 확장)
273
+
274
+ - **editor**: value-map
275
+ - **필수 옵션**: valuetype, defaultValue
276
+ - **예시**
277
+ ```js
278
+ { type: 'value-map', name: 'meta', editor: 'value-map', options: { valuetype: 'number', defaultValue: 0 } }
279
+ ```
280
+ - **custom renderer**
281
+ ```js
282
+ { type: 'value-map', name: 'meta', renderer: v => Object.keys(v).length + '개' }
283
+ ```
284
+
285
+ ---
286
+
287
+ ### parameters (grist-editor 확장)
288
+
289
+ - **editor**: parameters
290
+ - **필수 옵션**: spec, context
291
+ - **예시**
292
+ ```js
293
+ { type: 'parameters', name: 'params', editor: 'parameters', options: { spec: {...}, context: {...} } }
294
+ ```
295
+
296
+ ---
297
+
298
+ ### i18n-label (grist-editor 확장)
299
+
300
+ - **editor**: i18n-label
301
+ - **필수 옵션**: languages
302
+ - **예시**
303
+ ```js
304
+ { type: 'i18n-label', name: 'label', editor: 'i18n-label', options: { languages: ['ko', 'en'] } }
305
+ ```
306
+
307
+ ---
308
+
309
+ ### 기타(grist-editor 확장)
310
+
311
+ - **hashtags**: editor: hashtags, options: 없음/필수 없음
312
+ - **crontab**: editor: crontab, options: 없음/필수 없음
313
+ - **duration**: editor: duration, options: 없음/필수 없음
314
+ - **quantifier**: editor: quantifier, options: 없음/필수 없음
315
+ - **signature**: editor: signature, options: 없음/필수 없음
316
+ - **data**: editor: data, options: 없음/필수 없음
317
+
318
+ ---
319
+
320
+ ## 3. editor/renderer custom 등록/사용법
321
+
322
+ - **함수형 renderer**
323
+ ```js
324
+ { type: 'string', name: 'desc', renderer: v => v && v.length > 10 ? v.slice(0, 10) + '...' : v }
325
+ ```
326
+ - **문자열 editor/renderer**
327
+ ```js
328
+ { type: 'string', name: 'desc', editor: 'input', renderer: 'text' }
329
+ ```
330
+ - **커스텀 editor/renderer**
331
+ ```js
332
+ // grist-editor에서 'my-editor' 등록 후 사용
333
+ { type: 'string', name: 'custom', editor: 'my-editor', renderer: 'my-renderer' }
334
+ ```
335
+ - **등록 방법**
336
+ - grist-editor 패키지에서 custom editor/renderer를 등록 후, 컬럼 editor/renderer에 타입명 지정
337
+ - 예: `customElements.define('my-editor', class extends HTMLElement { ... })`
338
+
339
+ ---
340
+
341
+ ## 4. 실전 팁/문제/해결법
342
+
343
+ - editor/renderer 등록 시 타입 오타 주의
344
+ - 필수 옵션 누락 시 동작 오류(특히 select, value-map, parameters, i18n-label)
345
+ - options 구조는 editor마다 다르므로 반드시 공식 소스/스토리북 참고
346
+ - 커스텀 editor/renderer는 grist-editor에서 등록 후 사용
347
+ - data.records의 키와 columns의 name이 반드시 일치해야 함
348
+ - 컬럼 name/type/header/record/handlers 등 필수 속성 누락 주의
349
+
350
+ ---
351
+
352
+ ## 5. 참고/스토리북/데모
353
+
354
+ - 각 editor/renderer별 옵션/동작은 grist-editor 소스/스토리북에서 확인
355
+ - demo/스토리북에서 실전 config/패턴/문제 상황 예시 다수 제공
356
+
357
+ ```js
358
+ const columns = [
359
+ {
360
+ type: 'string',
361
+ name: 'name',
362
+ header: '이름',
363
+ sortable: true,
364
+ filter: true,
365
+ editor: 'input',
366
+ renderer: v => v,
367
+ width: 120,
368
+ align: 'left',
369
+ validation: (after, before) => !!after,
370
+ options: {},
371
+ handlers: { click: (columns, data, column, record) => console.log(record) }
372
+ },
373
+ {
374
+ type: 'value-map',
375
+ name: 'meta',
376
+ header: '메타정보',
377
+ editor: 'value-map',
378
+ options: { valuetype: 'number', defaultValue: 0 }
379
+ },
380
+ {
381
+ type: 'i18n-label',
382
+ name: 'label',
383
+ header: '다국어',
384
+ editor: 'i18n-label'
385
+ }
386
+ ]
387
+ ```
388
+
389
+ ```html
390
+ <data-grist .columns="${columns}"></data-grist>
391
+ ```
@@ -0,0 +1,53 @@
1
+ # 컬럼 에디터 상세
2
+
3
+ grist-editor에서 제공하는 주요 에디터와 옵션 설명입니다.
4
+
5
+ ## value-map
6
+
7
+ - Key-Value 형태의 데이터를 입력/수정할 수 있는 팝업 에디터
8
+ - 옵션:
9
+ - `valuetype`: 값의 타입 (string, number 등)
10
+ - `defaultValue`: 기본값
11
+
12
+ ## value-ranges
13
+
14
+ - 값의 범위를 여러 구간으로 설정할 수 있는 에디터
15
+ - 옵션:
16
+ - `valuetype`: 값의 타입
17
+ - `defaultValue`: 기본값
18
+
19
+ ## parameters
20
+
21
+ - 복합 파라미터(여러 속성)를 한 번에 입력할 수 있는 빌더형 에디터
22
+ - 옵션:
23
+ - `spec`: 파라미터 스펙(필드 정의)
24
+ - `context`: 컨텍스트 객체
25
+
26
+ ## partition-keys
27
+
28
+ - 파티션 키 목록을 입력하는 에디터
29
+
30
+ ## i18n-label
31
+
32
+ - 다국어 라벨을 입력/수정하는 에디터
33
+ - 옵션:
34
+ - `languages`: 지원 언어 목록
35
+
36
+ ## crontab
37
+
38
+ - cron 스케줄 문자열을 입력하는 에디터
39
+
40
+ ## duration
41
+
42
+ - 기간/시간을 입력하는 에디터
43
+
44
+ ## 기타
45
+
46
+ - quantifier, signature, hashtags 등 특수 목적 에디터도 지원
47
+
48
+ ---
49
+
50
+ ## 에디터 공통 사용법
51
+
52
+ - 각 에디터는 팝업 형태로 동작하며, 값 변경 시 `field-change` 이벤트를 발생시킵니다.
53
+ - editor/renderer를 직접 확장하려면 grist-editor의 커스텀 엘리먼트 구조를 참고하세요.
@@ -0,0 +1,44 @@
1
+ # 이벤트(Event)
2
+
3
+ data-grist는 다양한 커스텀 이벤트를 지원하여, 그리드의 동작을 외부에서 제어하거나 반응할 수 있습니다.
4
+
5
+ ## 1. 주요 지원 이벤트
6
+
7
+ | 이벤트명 | 설명 | detail 구조 예시 |
8
+ | -------------- | ---------------------- | ---------------------------------------- |
9
+ | cell-click | 셀 클릭 시 발생 | `{ row, column, value }` |
10
+ | row-selected | 행 선택 시 발생 | `{ row, selectedRows }` |
11
+ | edit-start | 셀 편집 시작 시 발생 | `{ row, column, value }` |
12
+ | edit-end | 셀 편집 종료 시 발생 | `{ row, column, value, oldValue }` |
13
+ | field-change | 에디터 값 변경 시 발생 | `{ before, after, record, column, row }` |
14
+ | data-changed | 데이터 전체 변경 시 | `{ data }` |
15
+ | sort-changed | 정렬 상태 변경 시 | `{ sorters }` |
16
+ | filter-changed | 필터 상태 변경 시 | `{ filters }` |
17
+ | page-changed | 페이지 이동 시 | `{ page, pageSize }` |
18
+
19
+ ## 2. 이벤트 핸들러 등록법
20
+
21
+ ### addEventListener 방식
22
+
23
+ ```js
24
+ grist.addEventListener('cell-click', e => {
25
+ console.log('Clicked cell:', e.detail)
26
+ })
27
+ ```
28
+
29
+ ### 속성 바인딩 방식 (Lit 등)
30
+
31
+ ```html
32
+ <data-grist @cell-click="${onCellClick}"></data-grist>
33
+ ```
34
+
35
+ ## 3. 커스텀 이벤트 활용 팁
36
+
37
+ - `field-change` 이벤트는 에디터 팝업에서 값이 바뀔 때 발생하며, undo/redo 구현에도 활용 가능
38
+ - `row-selected` 이벤트로 선택된 행의 데이터 추출 가능
39
+ - `edit-start`/`edit-end`로 편집 상태 UI 제어 가능
40
+
41
+ ## 4. 참고
42
+
43
+ - 이벤트 detail 구조는 상황에 따라 확장될 수 있으니, 실제 e.detail을 콘솔로 확인하는 것이 좋습니다.
44
+ - Storybook, demo 폴더에서 다양한 이벤트 활용 예시를 참고하세요.