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

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.
@@ -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
  }