@operato/scene-grist 2.0.0-alpha.4 → 2.0.0-alpha.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,7 +17,8 @@ export enum ACTIONS {
17
17
  GET_DIRTY = 'getDirtyRows',
18
18
  ADD_ROW = 'addRow',
19
19
  DELETE_SELECTED_ROWS = 'deleteSelectedRowsSoftly',
20
- GET_PAGE_INFO = 'getPageInfo'
20
+ GET_PAGE_INFO = 'getPageInfo',
21
+ GET_LIST_PARAM = 'getListParam'
21
22
  }
22
23
 
23
24
  const NATURE: ComponentNature = {
@@ -46,6 +47,11 @@ const NATURE: ComponentNature = {
46
47
  display: 'Get page information',
47
48
  value: ACTIONS.GET_PAGE_INFO
48
49
  },
50
+ {
51
+ // 페이지네이션 정보 가져오기
52
+ display: 'Get ListParam',
53
+ value: ACTIONS.GET_LIST_PARAM
54
+ },
49
55
  {
50
56
  // 모든 레코드 데이터 가져오기
51
57
  display: 'Get all rows',
@@ -141,6 +147,16 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
141
147
  this.data = this.getPageInfoFrom(null, fetchedData)
142
148
  this.doDataMap()
143
149
  }
150
+ } else if (after.action == ACTIONS.GET_LIST_PARAM) {
151
+ gristComponent.beforeFetchFuncs[refid] = (fetchedData: {
152
+ page: number
153
+ limit: number
154
+ total: number
155
+ records: GristRecord[]
156
+ }) => {
157
+ this.data = this.getListParamFrom(null, fetchedData)
158
+ this.doDataMap()
159
+ }
144
160
  } else {
145
161
  delete gristComponent.beforeFetchFuncs[refid]
146
162
  }
@@ -223,6 +239,9 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
223
239
  case ACTIONS.GET_PAGE_INFO:
224
240
  data = this.getPageInfoFrom(grist)
225
241
  break
242
+ case ACTIONS.GET_LIST_PARAM:
243
+ data = this.getListParamFrom(grist)
244
+ break
226
245
  }
227
246
 
228
247
  // 이 컴포넌트의 data 값이 바뀌는 동작은 데이터 매핑까지 실행함
@@ -292,6 +311,38 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
292
311
  }
293
312
  }
294
313
 
314
+ // Grist로부터 ListParam 정보를 가져옴
315
+ getListParamFrom(grist: DataGrist | null, fetchedData?: GristData) {
316
+ var {
317
+ page = 1,
318
+ limit = 20,
319
+ sorters,
320
+ sortings,
321
+ filters = [],
322
+ inherited,
323
+ options
324
+ // @ts-ignore
325
+ } = fetchedData || (grist && grist.dataProvider) || pagination(grist!)
326
+
327
+ return {
328
+ pagination: { page, limit },
329
+ sortings: sorters || sortings,
330
+ filters,
331
+ inherited,
332
+ options
333
+ }
334
+
335
+ function pagination(grist: DataGrist) {
336
+ var config = grist && grist.config && grist.config.pagination
337
+ if (config)
338
+ return {
339
+ page: config.page,
340
+ limit: config.limit || (config.pages && config.pages[0])
341
+ }
342
+ else return {}
343
+ }
344
+ }
345
+
295
346
  // 레코드들을 서버 공통 resolver에 맞는 포맷으로 만듦
296
347
  buildPatches(patches: GristRecord[]): GristRecord[] {
297
348
  return patches.map(patch => {
@@ -345,7 +396,7 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
345
396
 
346
397
  get targetGristComponent(): SceneGrist {
347
398
  var { target } = this.state
348
- return this.root.findById(target) as SceneGrist
399
+ return target && (this.root.findById(target) as SceneGrist)
349
400
  }
350
401
 
351
402
  get targetGristElement(): DataGrist | undefined {
package/src/grist.ts CHANGED
@@ -2,7 +2,8 @@
2
2
  * Copyright © HatioLab Inc. All rights reserved.
3
3
  */
4
4
 
5
- import '@operato/data-grist'
5
+ import '@operato/data-grist/ox-grist.js'
6
+ import '@operato/data-grist/ox-filters-form.js'
6
7
 
7
8
  import { Component, ComponentNature, error, HTMLOverlayElement, Properties } from '@hatiolab/things-scene'
8
9
  import { DataGrist, FetchResult } from '@operato/data-grist'
@@ -43,6 +44,11 @@ const NATURE: ComponentNature = {
43
44
  label: 'config',
44
45
  name: 'config'
45
46
  },
47
+ {
48
+ type: 'checkbox',
49
+ label: 'filterable',
50
+ name: 'filterable'
51
+ },
46
52
  {
47
53
  type: 'checkbox',
48
54
  label: 'appendable',
@@ -127,8 +133,6 @@ export default class SceneGrist extends HTMLOverlayElement {
127
133
  super.createElement()
128
134
 
129
135
  this.grist = document.createElement('ox-grist') as DataGrist
130
- this.grist.style.setProperty('--grist-padding', '0')
131
-
132
136
  this.element.appendChild(this.grist)
133
137
 
134
138
  this.rescale()
@@ -137,8 +141,18 @@ export default class SceneGrist extends HTMLOverlayElement {
137
141
 
138
142
  this.setGristConfig(grist)
139
143
 
140
- grist.fetchHandler = async ({ page, limit, sorters, options }: FetchOption): Promise<FetchResult> => {
141
- Object.values(this.beforeFetchFuncs).forEach((func: any) => func({ page, limit, sorters, options }))
144
+ grist.fetchHandler = async ({
145
+ page,
146
+ limit,
147
+ sorters,
148
+ sortings,
149
+ filters,
150
+ inherited,
151
+ options
152
+ }: FetchOption): Promise<FetchResult> => {
153
+ Object.values(this.beforeFetchFuncs).forEach((func: any) =>
154
+ func({ page, limit, sorters, sortings, filters, inherited, options })
155
+ )
142
156
  var { total = 0, records = [] } = grist.data || {}
143
157
 
144
158
  return {
@@ -198,7 +212,13 @@ export default class SceneGrist extends HTMLOverlayElement {
198
212
  onchange(after: Properties, before: Properties) {
199
213
  super.onchange(after, before)
200
214
 
201
- if ('mode' in after || 'appendable' in after || 'paginatable' in after || 'config' in after) {
215
+ if (
216
+ 'mode' in after ||
217
+ 'filterable' in after ||
218
+ 'appendable' in after ||
219
+ 'paginatable' in after ||
220
+ 'config' in after
221
+ ) {
202
222
  this.setGristConfig(this.grist)
203
223
  }
204
224
 
@@ -226,7 +246,7 @@ export default class SceneGrist extends HTMLOverlayElement {
226
246
  return
227
247
  }
228
248
 
229
- var { mode } = this.state
249
+ var { mode, filterable } = this.state
230
250
 
231
251
  if (mode != 'DEVICE') {
232
252
  grist.mode = mode
@@ -235,6 +255,16 @@ export default class SceneGrist extends HTMLOverlayElement {
235
255
  }
236
256
 
237
257
  grist.config = this.config
258
+
259
+ grist.innerHTML = filterable
260
+ ? `
261
+ <div slot="headroom">
262
+ <div style="padding: 9px 9px 0px 9px;">
263
+ <ox-filters-form autofocus></ox-filters-form>
264
+ </div>
265
+ </div>
266
+ `
267
+ : ''
238
268
  }
239
269
 
240
270
  /*
@@ -1,15 +1,15 @@
1
1
  {
2
- "component.grist": "grist",
3
- "component.grist-action": "grist action",
4
- "keyword": "keyword",
2
+ "component.grist": "data grid",
3
+ "component.grist-action": "data grid action",
5
4
  "label.grist-mode": "mode",
6
- "label.target-grist": "target grist",
5
+ "label.target-grist": "target data grid",
7
6
  "label.config": "config",
8
7
  "label.action": "action",
9
8
  "label.content-scale": "content scale",
10
9
  "label.run-at-startup": "run at startup",
11
10
  "label.record-adder-format": "default when adding row",
12
11
  "label.appendable": "appendable",
12
+ "label.filterable": "filterable",
13
13
  "label.paginatable": "paginatable",
14
14
  "label.bound-data": "bound data"
15
15
  }
@@ -1,15 +1,15 @@
1
1
  {
2
- "component.grist": "grist",
3
- "component.grist-action": "grist action",
4
- "keyword": "keyword",
5
- "label.grist-mode": "mode",
6
- "label.target-grist": "target grist",
7
- "label.config": "config",
8
- "label.action": "action",
9
- "label.content-scale": "content scale",
10
- "label.run-at-startup": "run at startup",
11
- "label.record-adder-format": "default when adding row",
12
- "label.appendable": "appendable",
13
- "label.paginatable": "paginatable",
14
- "label.bound-data": "bound data"
2
+ "component.grist": "データグリッド",
3
+ "component.grist-action": "データグリッドアクション",
4
+ "label.grist-mode": "モード",
5
+ "label.target-grist": "対象データグリッド",
6
+ "label.config": "設定",
7
+ "label.action": "アクション",
8
+ "label.content-scale": "コンテンツスケール",
9
+ "label.run-at-startup": "起動時に実行",
10
+ "label.record-adder-format": "行追加時のデフォルト",
11
+ "label.appendable": "追加可能",
12
+ "label.filterable": "フィルタ可能",
13
+ "label.paginatable": "ページング可能",
14
+ "label.bound-data": "バインドデータ"
15
15
  }
@@ -1,15 +1,15 @@
1
1
  {
2
- "component.grist": "grist",
3
- "component.grist-action": "grist action",
4
- "keyword": "키워드",
2
+ "component.grist": "데이타 그리드",
3
+ "component.grist-action": "데이타 그리드 조작",
5
4
  "label.grist-mode": "형태",
6
- "label.target-grist": "대상 grist",
5
+ "label.target-grist": "대상 데이타 그리드",
7
6
  "label.config": "설정",
8
7
  "label.action": "동작",
9
8
  "label.content-scale": "내부 스케일",
10
9
  "label.run-at-startup": "시작 시 실행",
11
10
  "label.record-adder-format": "행 추가 시 초기값",
12
11
  "label.appendable": "행추가 가능",
12
+ "label.filterable": "필터 가능",
13
13
  "label.paginatable": "페이지네이션",
14
14
  "label.bound-data": "연결 데이타"
15
15
  }
@@ -1,15 +1,15 @@
1
1
  {
2
- "component.grist": "grist",
3
- "component.grist-action": "grist action",
4
- "keyword": "[ms] keyword",
5
- "label.grist-mode": "[ms] mode",
6
- "label.target-grist": "[ms] target grist",
7
- "label.config": "[ms] config",
8
- "label.action": "[ms] action",
9
- "label.content-scale": "[ms]content scale",
10
- "label.run-at-startup": "[ms] run at startup",
11
- "label.record-adder-format": "[ms] default when adding row",
12
- "label.appendable": "[ms] appendable",
13
- "label.paginatable": "[ms] paginatable",
14
- "label.bound-data": "[ms] bound data"
2
+ "component.grist": "Grid Data",
3
+ "component.grist-action": "Aksi Grid Data",
4
+ "label.grist-mode": "Mod",
5
+ "label.target-grist": "Grid Data Sasaran",
6
+ "label.config": "Konfigurasi",
7
+ "label.action": "Tindakan",
8
+ "label.content-scale": "Skala Kandungan",
9
+ "label.run-at-startup": "Jalankan ketika memulakan",
10
+ "label.record-adder-format": "Default ketika menambah baris",
11
+ "label.appendable": "Boleh ditambah",
12
+ "label.filterable": "boleh ditapis",
13
+ "label.paginatable": "Boleh dipaginasi",
14
+ "label.bound-data": "Data Terikat"
15
15
  }
@@ -1,15 +1,15 @@
1
1
  {
2
- "component.grist": "grist",
3
- "component.grist-action": "grist action",
4
- "keyword": "关键词",
2
+ "component.grist": "数据网格",
3
+ "component.grist-action": "数据网格操作",
5
4
  "label.grist-mode": "模式",
6
- "label.target-grist": "目标grist",
5
+ "label.target-grist": "目标数据网格",
7
6
  "label.config": "配置",
8
- "label.action": "动作",
9
- "label.content-scale": "比例",
10
- "label.run-at-startup": "在启动时运行",
11
- "label.record-adder-format": "添加新行时的默认值",
12
- "label.appendable": "可增加新行",
7
+ "label.action": "操作",
8
+ "label.content-scale": "内容缩放",
9
+ "label.run-at-startup": "启动时运行",
10
+ "label.record-adder-format": "添加行时的默认值",
11
+ "label.appendable": "可追加",
12
+ "label.filterable": "可过滤",
13
13
  "label.paginatable": "可分页",
14
14
  "label.bound-data": "绑定数据"
15
15
  }