@operato/scene-grist 2.0.0-alpha.0 → 2.0.0-alpha.11

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,10 +2,12 @@
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'
10
+ import { i18next as _i18next } from '@operato/i18n'
9
11
  import { FetchOption } from '@operato/data-grist/dist/src/types'
10
12
 
11
13
  const NATURE: ComponentNature = {
@@ -43,6 +45,11 @@ const NATURE: ComponentNature = {
43
45
  label: 'config',
44
46
  name: 'config'
45
47
  },
48
+ {
49
+ type: 'checkbox',
50
+ label: 'filterable',
51
+ name: 'filterable'
52
+ },
46
53
  {
47
54
  type: 'checkbox',
48
55
  label: 'appendable',
@@ -127,8 +134,6 @@ export default class SceneGrist extends HTMLOverlayElement {
127
134
  super.createElement()
128
135
 
129
136
  this.grist = document.createElement('ox-grist') as DataGrist
130
- this.grist.style.setProperty('--grist-padding', '0')
131
-
132
137
  this.element.appendChild(this.grist)
133
138
 
134
139
  this.rescale()
@@ -137,8 +142,18 @@ export default class SceneGrist extends HTMLOverlayElement {
137
142
 
138
143
  this.setGristConfig(grist)
139
144
 
140
- grist.fetchHandler = async ({ page, limit, sorters, options }: FetchOption): Promise<FetchResult> => {
141
- Object.values(this.beforeFetchFuncs).forEach((func: any) => func({ page, limit, sorters, options }))
145
+ grist.fetchHandler = async ({
146
+ page,
147
+ limit,
148
+ sorters,
149
+ sortings,
150
+ filters,
151
+ inherited,
152
+ options
153
+ }: FetchOption): Promise<FetchResult> => {
154
+ Object.values(this.beforeFetchFuncs).forEach((func: any) =>
155
+ func({ page, limit, sorters, sortings, filters, inherited, options })
156
+ )
142
157
  var { total = 0, records = [] } = grist.data || {}
143
158
 
144
159
  return {
@@ -198,7 +213,13 @@ export default class SceneGrist extends HTMLOverlayElement {
198
213
  onchange(after: Properties, before: Properties) {
199
214
  super.onchange(after, before)
200
215
 
201
- if ('mode' in after || 'appendable' in after || 'paginatable' in after || 'config' in after) {
216
+ if (
217
+ 'mode' in after ||
218
+ 'filterable' in after ||
219
+ 'appendable' in after ||
220
+ 'paginatable' in after ||
221
+ 'config' in after
222
+ ) {
202
223
  this.setGristConfig(this.grist)
203
224
  }
204
225
 
@@ -226,7 +247,7 @@ export default class SceneGrist extends HTMLOverlayElement {
226
247
  return
227
248
  }
228
249
 
229
- var { mode } = this.state
250
+ var { mode, filterable } = this.state
230
251
 
231
252
  if (mode != 'DEVICE') {
232
253
  grist.mode = mode
@@ -235,6 +256,16 @@ export default class SceneGrist extends HTMLOverlayElement {
235
256
  }
236
257
 
237
258
  grist.config = this.config
259
+
260
+ grist.innerHTML = filterable
261
+ ? `
262
+ <div slot="headroom">
263
+ <div style="padding: 9px 9px 0px 9px;">
264
+ <ox-filters-form autofocus></ox-filters-form>
265
+ </div>
266
+ </div>
267
+ `
268
+ : ''
238
269
  }
239
270
 
240
271
  /*
@@ -276,6 +307,10 @@ export default class SceneGrist extends HTMLOverlayElement {
276
307
 
277
308
  if (typeof config !== 'object') {
278
309
  try {
310
+ var i18next = _i18next
311
+ //@ts-ignore 이 함수는 script에서 사용하기 위해서 스코프내에서 정의한 것임. 사용되지 않는다는 이유로 삭제하면 안됨.
312
+ var t = i18next.t
313
+
279
314
  config = eval(`(${config})`)
280
315
  } catch (e) {
281
316
  error(e)
@@ -1,13 +1,15 @@
1
1
  {
2
- "keyword": "keyword",
2
+ "component.grist": "data grid",
3
+ "component.grist-action": "data grid action",
3
4
  "label.grist-mode": "mode",
4
- "label.target-grist": "target grist",
5
+ "label.target-grist": "target data grid",
5
6
  "label.config": "config",
6
7
  "label.action": "action",
7
8
  "label.content-scale": "content scale",
8
9
  "label.run-at-startup": "run at startup",
9
10
  "label.record-adder-format": "default when adding row",
10
11
  "label.appendable": "appendable",
12
+ "label.filterable": "filterable",
11
13
  "label.paginatable": "paginatable",
12
14
  "label.bound-data": "bound data"
13
15
  }
@@ -0,0 +1,15 @@
1
+ {
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
+ }
@@ -1,13 +1,15 @@
1
1
  {
2
- "keyword": "키워드",
2
+ "component.grist": "데이타 그리드",
3
+ "component.grist-action": "데이타 그리드 조작",
3
4
  "label.grist-mode": "형태",
4
- "label.target-grist": "대상 grist",
5
+ "label.target-grist": "대상 데이타 그리드",
5
6
  "label.config": "설정",
6
7
  "label.action": "동작",
7
8
  "label.content-scale": "내부 스케일",
8
9
  "label.run-at-startup": "시작 시 실행",
9
10
  "label.record-adder-format": "행 추가 시 초기값",
10
11
  "label.appendable": "행추가 가능",
12
+ "label.filterable": "필터 가능",
11
13
  "label.paginatable": "페이지네이션",
12
14
  "label.bound-data": "연결 데이타"
13
15
  }
@@ -1,13 +1,15 @@
1
1
  {
2
- "keyword": "[ms] keyword",
3
- "label.grist-mode": "[ms] mode",
4
- "label.target-grist": "[ms] target grist",
5
- "label.config": "[ms] config",
6
- "label.action": "[ms] action",
7
- "label.content-scale": "[ms]content scale",
8
- "label.run-at-startup": "[ms] run at startup",
9
- "label.record-adder-format": "[ms] default when adding row",
10
- "label.appendable": "[ms] appendable",
11
- "label.paginatable": "[ms] paginatable",
12
- "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"
13
15
  }
@@ -1,13 +1,15 @@
1
1
  {
2
- "keyword": "关键词",
2
+ "component.grist": "数据网格",
3
+ "component.grist-action": "数据网格操作",
3
4
  "label.grist-mode": "模式",
4
- "label.target-grist": "目标grist",
5
+ "label.target-grist": "目标数据网格",
5
6
  "label.config": "配置",
6
- "label.action": "动作",
7
- "label.content-scale": "比例",
8
- "label.run-at-startup": "在启动时运行",
9
- "label.record-adder-format": "添加新行时的默认值",
10
- "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": "可过滤",
11
13
  "label.paginatable": "可分页",
12
14
  "label.bound-data": "绑定数据"
13
15
  }