@operato/scene-grist 2.0.0-alpha.6 → 2.0.0-beta.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +43 -0
- package/dist/grist-action.d.ts +13 -1
- package/dist/grist-action.js +42 -2
- package/dist/grist-action.js.map +1 -1
- package/dist/grist.d.ts +3 -1
- package/dist/grist.js +31 -7
- package/dist/grist.js.map +1 -1
- package/helps/scene/component/grist-action.ko.md +15 -0
- package/helps/scene/component/grist-action.md +19 -6
- package/helps/scene/component/grist-action.zh.md +23 -11
- package/helps/scene/component/grist.ko.md +2 -0
- package/helps/scene/component/grist.md +2 -0
- package/helps/scene/component/grist.zh.md +7 -5
- package/package.json +6 -5
- package/schema.graphql +3976 -0
- package/src/grist-action.ts +56 -3
- package/src/grist.ts +45 -8
- package/translations/en.json +1 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
- package/tsconfig.json +1 -0
- package/tsconfig.tsbuildinfo +1 -1
package/src/grist-action.ts
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
*
|
4
4
|
* grist 컴포넌트를 보조하여 grist의 각종 동작을 수행하는 컴포넌트.
|
5
5
|
*/
|
6
|
+
import 'ses'
|
6
7
|
|
7
8
|
import { Component, ComponentNature, Properties, RectPath, ValueHolder } from '@hatiolab/things-scene'
|
8
9
|
import { DataGrist } from '@operato/data-grist'
|
@@ -17,7 +18,8 @@ export enum ACTIONS {
|
|
17
18
|
GET_DIRTY = 'getDirtyRows',
|
18
19
|
ADD_ROW = 'addRow',
|
19
20
|
DELETE_SELECTED_ROWS = 'deleteSelectedRowsSoftly',
|
20
|
-
GET_PAGE_INFO = 'getPageInfo'
|
21
|
+
GET_PAGE_INFO = 'getPageInfo',
|
22
|
+
GET_LIST_PARAM = 'getListParam'
|
21
23
|
}
|
22
24
|
|
23
25
|
const NATURE: ComponentNature = {
|
@@ -46,6 +48,11 @@ const NATURE: ComponentNature = {
|
|
46
48
|
display: 'Get page information',
|
47
49
|
value: ACTIONS.GET_PAGE_INFO
|
48
50
|
},
|
51
|
+
{
|
52
|
+
// 페이지네이션 정보 가져오기
|
53
|
+
display: 'Get ListParam',
|
54
|
+
value: ACTIONS.GET_LIST_PARAM
|
55
|
+
},
|
49
56
|
{
|
50
57
|
// 모든 레코드 데이터 가져오기
|
51
58
|
display: 'Get all rows',
|
@@ -141,6 +148,16 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
|
|
141
148
|
this.data = this.getPageInfoFrom(null, fetchedData)
|
142
149
|
this.doDataMap()
|
143
150
|
}
|
151
|
+
} else if (after.action == ACTIONS.GET_LIST_PARAM) {
|
152
|
+
gristComponent.beforeFetchFuncs[refid] = (fetchedData: {
|
153
|
+
page: number
|
154
|
+
limit: number
|
155
|
+
total: number
|
156
|
+
records: GristRecord[]
|
157
|
+
}) => {
|
158
|
+
this.data = this.getListParamFrom(null, fetchedData)
|
159
|
+
this.doDataMap()
|
160
|
+
}
|
144
161
|
} else {
|
145
162
|
delete gristComponent.beforeFetchFuncs[refid]
|
146
163
|
}
|
@@ -194,10 +211,11 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
|
|
194
211
|
case ACTIONS.ADD_ROW:
|
195
212
|
{
|
196
213
|
var records = grist.dirtyData.records || []
|
214
|
+
const c = new Compartment()
|
197
215
|
|
198
216
|
let recordFormat
|
199
217
|
try {
|
200
|
-
recordFormat =
|
218
|
+
recordFormat = c.evaluate(`(${this.state.recordFormat})`)
|
201
219
|
} catch (e) {
|
202
220
|
console.log('Invalid JSON format. It will be assumed as empty object.\n', e)
|
203
221
|
recordFormat = {}
|
@@ -223,6 +241,9 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
|
|
223
241
|
case ACTIONS.GET_PAGE_INFO:
|
224
242
|
data = this.getPageInfoFrom(grist)
|
225
243
|
break
|
244
|
+
case ACTIONS.GET_LIST_PARAM:
|
245
|
+
data = this.getListParamFrom(grist)
|
246
|
+
break
|
226
247
|
}
|
227
248
|
|
228
249
|
// 이 컴포넌트의 data 값이 바뀌는 동작은 데이터 매핑까지 실행함
|
@@ -292,6 +313,38 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
|
|
292
313
|
}
|
293
314
|
}
|
294
315
|
|
316
|
+
// Grist로부터 ListParam 정보를 가져옴
|
317
|
+
getListParamFrom(grist: DataGrist | null, fetchedData?: GristData) {
|
318
|
+
var {
|
319
|
+
page = 1,
|
320
|
+
limit = 20,
|
321
|
+
sorters,
|
322
|
+
sortings,
|
323
|
+
filters = [],
|
324
|
+
inherited,
|
325
|
+
options
|
326
|
+
// @ts-ignore
|
327
|
+
} = fetchedData || (grist && grist.dataProvider) || pagination(grist!)
|
328
|
+
|
329
|
+
return {
|
330
|
+
pagination: { page, limit },
|
331
|
+
sortings: sorters || sortings,
|
332
|
+
filters,
|
333
|
+
inherited,
|
334
|
+
options
|
335
|
+
}
|
336
|
+
|
337
|
+
function pagination(grist: DataGrist) {
|
338
|
+
var config = grist && grist.config && grist.config.pagination
|
339
|
+
if (config)
|
340
|
+
return {
|
341
|
+
page: config.page,
|
342
|
+
limit: config.limit || (config.pages && config.pages[0])
|
343
|
+
}
|
344
|
+
else return {}
|
345
|
+
}
|
346
|
+
}
|
347
|
+
|
295
348
|
// 레코드들을 서버 공통 resolver에 맞는 포맷으로 만듦
|
296
349
|
buildPatches(patches: GristRecord[]): GristRecord[] {
|
297
350
|
return patches.map(patch => {
|
@@ -345,7 +398,7 @@ export default class GristAction extends ValueHolder(RectPath(Component)) {
|
|
345
398
|
|
346
399
|
get targetGristComponent(): SceneGrist {
|
347
400
|
var { target } = this.state
|
348
|
-
return this.root.findById(target) as SceneGrist
|
401
|
+
return target && (this.root.findById(target) as SceneGrist)
|
349
402
|
}
|
350
403
|
|
351
404
|
get targetGristElement(): DataGrist | undefined {
|
package/src/grist.ts
CHANGED
@@ -2,10 +2,13 @@
|
|
2
2
|
* Copyright © HatioLab Inc. All rights reserved.
|
3
3
|
*/
|
4
4
|
|
5
|
-
import '
|
5
|
+
import 'ses'
|
6
|
+
import '@operato/data-grist/ox-grist.js'
|
7
|
+
import '@operato/data-grist/ox-filters-form.js'
|
6
8
|
|
7
9
|
import { Component, ComponentNature, error, HTMLOverlayElement, Properties } from '@hatiolab/things-scene'
|
8
10
|
import { DataGrist, FetchResult } from '@operato/data-grist'
|
11
|
+
import { i18next as _i18next } from '@operato/i18n'
|
9
12
|
import { FetchOption } from '@operato/data-grist/dist/src/types'
|
10
13
|
|
11
14
|
const NATURE: ComponentNature = {
|
@@ -43,6 +46,11 @@ const NATURE: ComponentNature = {
|
|
43
46
|
label: 'config',
|
44
47
|
name: 'config'
|
45
48
|
},
|
49
|
+
{
|
50
|
+
type: 'checkbox',
|
51
|
+
label: 'filterable',
|
52
|
+
name: 'filterable'
|
53
|
+
},
|
46
54
|
{
|
47
55
|
type: 'checkbox',
|
48
56
|
label: 'appendable',
|
@@ -127,8 +135,6 @@ export default class SceneGrist extends HTMLOverlayElement {
|
|
127
135
|
super.createElement()
|
128
136
|
|
129
137
|
this.grist = document.createElement('ox-grist') as DataGrist
|
130
|
-
this.grist.style.setProperty('--grist-padding', '0')
|
131
|
-
|
132
138
|
this.element.appendChild(this.grist)
|
133
139
|
|
134
140
|
this.rescale()
|
@@ -137,8 +143,18 @@ export default class SceneGrist extends HTMLOverlayElement {
|
|
137
143
|
|
138
144
|
this.setGristConfig(grist)
|
139
145
|
|
140
|
-
grist.fetchHandler = async ({
|
141
|
-
|
146
|
+
grist.fetchHandler = async ({
|
147
|
+
page,
|
148
|
+
limit,
|
149
|
+
sorters,
|
150
|
+
sortings,
|
151
|
+
filters,
|
152
|
+
inherited,
|
153
|
+
options
|
154
|
+
}: FetchOption): Promise<FetchResult> => {
|
155
|
+
Object.values(this.beforeFetchFuncs).forEach((func: any) =>
|
156
|
+
func({ page, limit, sorters, sortings, filters, inherited, options })
|
157
|
+
)
|
142
158
|
var { total = 0, records = [] } = grist.data || {}
|
143
159
|
|
144
160
|
return {
|
@@ -198,7 +214,13 @@ export default class SceneGrist extends HTMLOverlayElement {
|
|
198
214
|
onchange(after: Properties, before: Properties) {
|
199
215
|
super.onchange(after, before)
|
200
216
|
|
201
|
-
if (
|
217
|
+
if (
|
218
|
+
'mode' in after ||
|
219
|
+
'filterable' in after ||
|
220
|
+
'appendable' in after ||
|
221
|
+
'paginatable' in after ||
|
222
|
+
'config' in after
|
223
|
+
) {
|
202
224
|
this.setGristConfig(this.grist)
|
203
225
|
}
|
204
226
|
|
@@ -226,7 +248,7 @@ export default class SceneGrist extends HTMLOverlayElement {
|
|
226
248
|
return
|
227
249
|
}
|
228
250
|
|
229
|
-
var { mode } = this.state
|
251
|
+
var { mode, filterable } = this.state
|
230
252
|
|
231
253
|
if (mode != 'DEVICE') {
|
232
254
|
grist.mode = mode
|
@@ -235,6 +257,16 @@ export default class SceneGrist extends HTMLOverlayElement {
|
|
235
257
|
}
|
236
258
|
|
237
259
|
grist.config = this.config
|
260
|
+
|
261
|
+
grist.innerHTML = filterable
|
262
|
+
? `
|
263
|
+
<div slot="headroom">
|
264
|
+
<div style="padding: 9px 9px 0px 9px;">
|
265
|
+
<ox-filters-form autofocus></ox-filters-form>
|
266
|
+
</div>
|
267
|
+
</div>
|
268
|
+
`
|
269
|
+
: ''
|
238
270
|
}
|
239
271
|
|
240
272
|
/*
|
@@ -276,7 +308,12 @@ export default class SceneGrist extends HTMLOverlayElement {
|
|
276
308
|
|
277
309
|
if (typeof config !== 'object') {
|
278
310
|
try {
|
279
|
-
|
311
|
+
const c = new Compartment({
|
312
|
+
t: _i18next.t,
|
313
|
+
i18next: _i18next
|
314
|
+
})
|
315
|
+
|
316
|
+
config = c.evaluate(`(${config})`)
|
280
317
|
} catch (e) {
|
281
318
|
error(e)
|
282
319
|
}
|
package/translations/en.json
CHANGED
package/translations/ja.json
CHANGED
package/translations/ko.json
CHANGED
package/translations/ms.json
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
"label.run-at-startup": "Jalankan ketika memulakan",
|
10
10
|
"label.record-adder-format": "Default ketika menambah baris",
|
11
11
|
"label.appendable": "Boleh ditambah",
|
12
|
+
"label.filterable": "boleh ditapis",
|
12
13
|
"label.paginatable": "Boleh dipaginasi",
|
13
14
|
"label.bound-data": "Data Terikat"
|
14
15
|
}
|
package/translations/zh.json
CHANGED