@things-factory/meta-ui 8.0.6 → 9.0.0-beta.12

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.
Files changed (116) hide show
  1. package/dist-client/tsconfig.tsbuildinfo +1 -1
  2. package/dist-client/utils/service-util.d.ts +2 -2
  3. package/dist-client/utils/service-util.js +4 -4
  4. package/dist-client/utils/service-util.js.map +1 -1
  5. package/dist-server/service/index.d.ts +2 -2
  6. package/dist-server/tsconfig.tsbuildinfo +1 -1
  7. package/package.json +24 -24
  8. package/client/bootstrap.ts +0 -170
  9. package/client/component/filter/filter-form-meta-code-select.ts +0 -102
  10. package/client/component/filter/filter-form-meta-object-select.ts +0 -107
  11. package/client/component/filter/filter-grist-meta-code-select.ts +0 -97
  12. package/client/component/filter/filter-grist-meta-object-select.ts +0 -102
  13. package/client/component/grist/editor/grist-editor-code-input.js +0 -96
  14. package/client/component/grist/editor/grist-editor-meta-code-selector.js +0 -157
  15. package/client/component/grist/editor/grist-editor-meta-object-selector.js +0 -122
  16. package/client/component/grist/renderer/grist-renderer-code-input.js +0 -20
  17. package/client/component/grist/renderer/grist-renderer-meta-code-selector.js +0 -28
  18. package/client/component/grist/renderer/grist-renderer-meta-object-selector.js +0 -25
  19. package/client/component/popup/code-input-editor-popup.js +0 -111
  20. package/client/component/popup/file-upload-popup.js +0 -129
  21. package/client/component/popup/meta-object-selector-popup.ts +0 -356
  22. package/client/component/popup/record-based-code-editor-popup.ts +0 -141
  23. package/client/dynamic-menus.ts +0 -38
  24. package/client/index.ts +0 -18
  25. package/client/load-components.ts +0 -17
  26. package/client/mixin/meta-base-mixin.js +0 -323
  27. package/client/mixin/meta-basic-grist-mixin.js +0 -283
  28. package/client/mixin/meta-button-mixin.js +0 -116
  29. package/client/mixin/meta-form-mixin.js +0 -435
  30. package/client/mixin/meta-grist-tab-mixin.js +0 -335
  31. package/client/mixin/meta-main-tab-mixin.js +0 -267
  32. package/client/mixin/meta-master-detail-mixin.js +0 -395
  33. package/client/mixin/meta-service-mixin.js +0 -306
  34. package/client/mixin/meta-tab-detail-mixin.js +0 -283
  35. package/client/mixin/meta-tab-mixin.js +0 -190
  36. package/client/pages/activity/meta-activity-define-page.js +0 -422
  37. package/client/pages/activity/meta-activity-list-page.js +0 -262
  38. package/client/pages/activity/meta-activity-viewer-element.js +0 -35
  39. package/client/pages/activity/meta-activity-writer-element.js +0 -48
  40. package/client/pages/activity/meta-activiy-mixin.js +0 -79
  41. package/client/pages/button-role/button-role-detail.js +0 -50
  42. package/client/pages/button-role/button-role-page.js +0 -25
  43. package/client/pages/doc-number/doc-number-page.js +0 -24
  44. package/client/pages/doc-number/next-doc-number-popup.js +0 -25
  45. package/client/pages/entity/config-entity.js +0 -955
  46. package/client/pages/entity/main-menu-selector.js +0 -245
  47. package/client/pages/history/history-copy-list-popup.js +0 -145
  48. package/client/pages/history/history-json-list-popup.js +0 -159
  49. package/client/pages/menu/dynamic-menu-template.js +0 -92
  50. package/client/pages/menu/dynamic-menu.ts +0 -744
  51. package/client/pages/menu/export-menu-popup.js +0 -468
  52. package/client/pages/meta-form-element.js +0 -9
  53. package/client/pages/meta-grist-element.js +0 -12
  54. package/client/pages/meta-grist-page.js +0 -16
  55. package/client/pages/meta-grist-tab-element.js +0 -16
  56. package/client/pages/meta-grist-tab-page.js +0 -16
  57. package/client/pages/meta-main-tab-element.js +0 -12
  58. package/client/pages/meta-main-tab-page.js +0 -16
  59. package/client/pages/meta-master-detail-element.js +0 -12
  60. package/client/pages/meta-master-detail-page.js +0 -16
  61. package/client/pages/meta-tab-detail-element.js +0 -12
  62. package/client/pages/meta-tab-detail-page.js +0 -16
  63. package/client/pages/meta-tab-element.js +0 -15
  64. package/client/pages/printer-device/printer-device-page.js +0 -24
  65. package/client/pages/template/doc-template-page.js +0 -24
  66. package/client/pages/template/template-file-page.js +0 -24
  67. package/client/pages/terms/config-terminology.js +0 -214
  68. package/client/pages/work-code/work-code-detail-popup.js +0 -16
  69. package/client/pages/work-code/work-code-page.js +0 -23
  70. package/client/route.ts +0 -36
  71. package/client/tsconfig.json +0 -13
  72. package/client/utils/grist-default-value.js +0 -36
  73. package/client/utils/meta-api.js +0 -811
  74. package/client/utils/meta-crypto.js +0 -52
  75. package/client/utils/meta-ui-util.js +0 -3304
  76. package/client/utils/rest-service-util.js +0 -328
  77. package/client/utils/service-util.js +0 -1327
  78. package/client/utils/terms-util.ts +0 -119
  79. package/client/utils/ui-util.js +0 -338
  80. package/client/utils/value-util.js +0 -234
  81. package/server/activity/CommonActivity.ts +0 -68
  82. package/server/index.ts +0 -3
  83. package/server/routes.ts +0 -61
  84. package/server/service/button-role/button-role-mutation.ts +0 -105
  85. package/server/service/button-role/button-role-query.ts +0 -53
  86. package/server/service/button-role/button-role-type.ts +0 -39
  87. package/server/service/button-role/button-role.ts +0 -61
  88. package/server/service/button-role/index.ts +0 -7
  89. package/server/service/dynamic-menu/dynamic-menu-query.ts +0 -270
  90. package/server/service/dynamic-menu/dynamic-menu-type.ts +0 -74
  91. package/server/service/dynamic-menu/index.ts +0 -3
  92. package/server/service/entity-event-subscriber/entity-event-subscriber.ts +0 -80
  93. package/server/service/entity-event-subscriber/index.ts +0 -3
  94. package/server/service/index.ts +0 -41
  95. package/server/service/menu-button-auth/index.ts +0 -7
  96. package/server/service/menu-button-auth/menu-button-auth-mutation.ts +0 -133
  97. package/server/service/menu-button-auth/menu-button-auth-query.ts +0 -138
  98. package/server/service/menu-button-auth/menu-button-auth-type.ts +0 -63
  99. package/server/service/menu-button-auth/menu-button-auth.ts +0 -92
  100. package/server/service/meta-activity/index.ts +0 -5
  101. package/server/service/meta-activity/meta-activity-mutation.ts +0 -191
  102. package/server/service/meta-activity/meta-activity-query.ts +0 -43
  103. package/server/service/meta-activity/meta-activity-type.ts +0 -56
  104. package/server/service/set-translations/index.ts +0 -3
  105. package/server/service/set-translations/set-translation-resolver.ts +0 -63
  106. package/server/service/work-code/index.ts +0 -6
  107. package/server/service/work-code/work-code-mutation.ts +0 -147
  108. package/server/service/work-code/work-code-query.ts +0 -67
  109. package/server/service/work-code/work-code-type.ts +0 -60
  110. package/server/service/work-code/work-code.ts +0 -83
  111. package/server/service/work-code-detail/index.ts +0 -6
  112. package/server/service/work-code-detail/work-code-detail-mutation.ts +0 -149
  113. package/server/service/work-code-detail/work-code-detail-query.ts +0 -59
  114. package/server/service/work-code-detail/work-code-detail-type.ts +0 -50
  115. package/server/service/work-code-detail/work-code-detail.ts +0 -82
  116. package/server/tsconfig.json +0 -9
@@ -1,955 +0,0 @@
1
- import '@material/web/icon/icon.js'
2
-
3
- import { html } from 'lit'
4
- import gql from 'graphql-tag'
5
-
6
- import { PageView, store } from '@operato/shell'
7
- import { client, gqlContext } from '@operato/graphql'
8
- import { i18next, localize } from '@operato/i18n'
9
- import { p13n } from '@operato/p13n'
10
-
11
- import { EXPORT } from '@things-factory/export-base'
12
- import { IMPORT } from '@things-factory/import-base'
13
-
14
- import '@things-factory/form-ui'
15
- import '@things-factory/import-ui'
16
-
17
- import { TermsUtil } from './../../utils/terms-util'
18
- import { ValueUtil } from '../../utils/value-util'
19
- import { MetaApi } from '../../utils/meta-api'
20
-
21
- import './main-menu-selector'
22
-
23
- /**
24
- * @license
25
- * Copyright © HatioLab Inc. All rights reserved.
26
- * @author Shortstop <shortstop@hatiolab.com>
27
- * @description 엔티티 정의 화면
28
- */
29
- class ConfigEntity extends p13n(localize(i18next)(PageView)) {
30
- /**
31
- * @description 프로퍼티 정의
32
- ***********************************
33
- * @returns {Object} 화면의 프로퍼티 정의
34
- */
35
- static get properties() {
36
- return {
37
- searchFields: Array,
38
- masterConfig: Object,
39
- detailConfig: Object,
40
- importConfig: Object,
41
- entityId: String,
42
- selectedEntity: Object
43
- }
44
- }
45
-
46
- /**
47
- * @description 스타일 정의
48
- *********************************
49
- * @returns {Object} 화면 스타일 정의
50
- */
51
- static get styles() {
52
- return MetaApi.getBasicMasterDetailGristStyle('left-right')
53
- }
54
-
55
- /**
56
- * @description 화면 컨텍스트 정보
57
- *******************************
58
- * @returns {Object} 컨텍스트 정보
59
- */
60
- get context() {
61
- return {
62
- title: TermsUtil.tTitle('entity')
63
- }
64
- }
65
-
66
- /**
67
- * @description 검색 폼
68
- ***************************
69
- * @returns {Object} 검색 폼
70
- */
71
- get searchForm() {
72
- return this.shadowRoot.querySelector('ox-filters-form-base')
73
- }
74
-
75
- /**
76
- * @description 엔티티 마스터 그리드
77
- ********************************
78
- * @returns {Object} 그리스트
79
- */
80
- get masterGrist() {
81
- return this.shadowRoot.querySelector('#master-grist')
82
- }
83
-
84
- /**
85
- * @description 엔티티 컬럼 그리드
86
- ********************************
87
- * @returns {Object} 그리스트
88
- */
89
- get detailGrist() {
90
- return this.shadowRoot.querySelector('#detail-grist')
91
- }
92
-
93
- /*********************************************************************/
94
- /* 조 회 */
95
- /*********************************************************************/
96
-
97
- /**
98
- * @description 엔티티 리스트 조회
99
- *******************************************
100
- * @param {Object} { page, limit, sorters }
101
- * @returns {Array}
102
- */
103
- async fetchEntities({ page, limit, sorters = [{ name: 'bundle' }, { name: 'name' }] }) {
104
- // 선택된 엔티티 ID 초기화
105
- this.entityId = null
106
- this.selectedEntity = null
107
-
108
- if (this.detailGrist && this.detailGrist.data) {
109
- this.detailGrist.data = {}
110
- }
111
-
112
- let filters = [...(await this.searchForm.getQueryFilters())]
113
- let selectFields = `
114
- id
115
- bundle
116
- name
117
- tableName
118
- dataProp
119
- delStrategy
120
- description
121
- `
122
- return await MetaApi.searchByPagination('entities', filters, sorters, page, limit, selectFields)
123
- }
124
-
125
- /**
126
- * @description 엔티티 선택시 엔티티 컬럼 조회
127
- *******************************************
128
- * @param {Object} { page, limit, sorters }
129
- * @returns {Array}
130
- */
131
- async fetchEntityColumns({ page, limit, sorters = [{ name: 'rank' }] }) {
132
- if (this.entityId) {
133
- let filters = [
134
- {
135
- name: 'entityId',
136
- operator: 'eq',
137
- value: this.entityId
138
- }
139
- ]
140
-
141
- let selectFields = `
142
- id
143
- name
144
- rank
145
- description
146
- term
147
- colType
148
- colSize
149
- nullable
150
- uniqRank
151
- searchRank
152
- searchOper
153
- gridRank
154
- gridWidth
155
- gridEditor
156
- refType
157
- refName
158
- refUrl
159
- defVal
160
- `
161
- return await MetaApi.searchByPagination('entityColumns', filters, sorters, page, limit, selectFields)
162
- }
163
- }
164
-
165
- /**
166
- * @description 엔티티 컬럼 조회
167
- *****************************
168
- * @param {Object} record 선택한 엔티티 마스터 레코드
169
- */
170
- async searchEntityColumns(record) {
171
- this.entityId = record.id
172
- this.selectedEntity = record
173
- await this.detailGrist.fetch()
174
- }
175
-
176
- /**
177
- * @description 메인 메뉴 선택기 오픈
178
- *********************************
179
- */
180
- async openMainMenuSelectorPopup() {
181
- let menuSelector = MetaApi.createCustomElement('main-menu-selector', 'main-menu-selector')
182
- menuSelector.selectCallback = this.createMenuTo.bind(this)
183
- await MetaApi.openPopupByElement(TermsUtil.tButton('create-menu'), 'large', menuSelector, true)
184
- }
185
-
186
- /*********************************************************************/
187
- /* 버튼 트랜잭션 */
188
- /*********************************************************************/
189
-
190
- /**
191
- * @description 엔티티 저장 / 업데이트
192
- **********************************
193
- */
194
- async saveMasters() {
195
- let patches = MetaApi.patchesForUpdateMultiple(this.masterGrist)
196
- if (ValueUtil.isNotEmpty(patches)) {
197
- patches.forEach(x => {
198
- if (!x.tableName || x.tableName.length == 0) {
199
- x.tableName = x.name
200
- }
201
- })
202
- let result = await MetaApi.updateMultiple('updateMultipleEntity', patches)
203
- if (result) {
204
- this.masterGrist.fetch()
205
- }
206
- }
207
- }
208
-
209
- /**
210
- * @description 엔티티 삭제
211
- *************************
212
- */
213
- async deleteMasters() {
214
- await MetaApi.deleteListByGristSelected(this.masterGrist, 'deleteEntities')
215
- }
216
-
217
- /**
218
- * @description 엔티티 컬럼 생성, 업데이트
219
- *************************************
220
- */
221
- async saveEntityColumns() {
222
- if (this.entityId) {
223
- let patches = MetaApi.patchesForUpdateMultiple(this.detailGrist)
224
- if (ValueUtil.isNotEmpty(patches)) {
225
- let idx = 0
226
- patches.forEach(patch => {
227
- idx += 10
228
- patch.entity = { id: this.entityId }
229
- patch.nullable = patch.nullable === undefined || patch.nullable == null ? false : patch.nullable
230
- patch.rank = !patch.rank || patch.rank == 0 ? idx : patch.rank
231
- patch.gridRank = patch.gridRank ? patch.gridRank : 0
232
- patch.term = patch.term ? patch.term : patch.name
233
- patch.colType = !patch.colType ? 'string' : patch.colType
234
- patch.colSize = patch.colType == 'string' && !patch.colSize ? 50 : patch.colSize
235
- })
236
-
237
- let result = await MetaApi.updateMultiple('updateMultipleEntityColumn', patches)
238
- if (result) {
239
- this.detailGrist.fetch()
240
- }
241
- }
242
- }
243
- }
244
-
245
- /**
246
- * @description 엔티티 컬럼 삭제
247
- ****************************
248
- */
249
- async deleteEntityColumns() {
250
- await MetaApi.deleteListByGristSelected(this.detailGrist, 'deleteEntityColumns')
251
- }
252
-
253
- /**
254
- * @description 엔티티 / 서비스 자동 생성
255
- ************************************
256
- */
257
- async createService() {
258
- const answer = await MetaApi.showAlertPopup(
259
- 'button.create-service',
260
- 'text.are_you_sure',
261
- 'question',
262
- 'confirm',
263
- 'cancel'
264
- )
265
- if (answer.value) {
266
- let ids = MetaApi.getSelectedIdList(this.masterGrist, true)
267
- if (ids) {
268
- let selectedId = ids[0]
269
- const res = await client.query({
270
- query: gql`
271
- query ($id: String!) {
272
- toolCreateService(id: $id)
273
- }
274
- `,
275
- variables: { id: selectedId },
276
- context: gqlContext()
277
- })
278
-
279
- if (res && res.data && res.data.toolCreateService) {
280
- MetaApi.showToast('info', TermsUtil.tText('success to process'))
281
- }
282
- }
283
- }
284
- }
285
-
286
- /**
287
- * @description 엔티티 기반 메뉴 자동 생성
288
- ************************************
289
- */
290
- async createMenu() {
291
- if (this.entityId) {
292
- // 메인 메뉴를 선택하는 팝업을 실행하여 어떤 메뉴 하위에 엔티티 메뉴를 생성할 지 결정
293
- const answer = await MetaApi.showAlertPopup(
294
- 'button.create-menu',
295
- 'text.are_you_sure',
296
- 'question',
297
- 'confirm',
298
- 'cancel'
299
- )
300
- if (answer.value) {
301
- if (MetaApi.getSelectedIdList(this.masterGrist, true)) {
302
- await this.openMainMenuSelectorPopup()
303
- }
304
- }
305
- } else {
306
- MetaApi.showAlertPopup('text.nothing_selected', 'text.nothing_selected', 'info', 'confirm')
307
- }
308
- }
309
-
310
- /**
311
- * @description mainMenuId에 해당하는 메인 메뉴 하위에 현재 선택된 엔티티의 메뉴 생성
312
- ************************************************************************
313
- * @param {String} mainMenuId
314
- */
315
- async createMenuTo(mainMenuId) {
316
- const res = await client.query({
317
- query: gql`
318
- mutation ($id: String!, $parent_menu_id: String!) {
319
- toolCreateMenu(id: $id, parent_menu_id: $parent_menu_id)
320
- }
321
- `,
322
- variables: { id: this.entityId, parent_menu_id: mainMenuId },
323
- context: gqlContext()
324
- })
325
-
326
- if (res && res.data && res.data.toolCreateMenu) {
327
- MetaApi.showToast('info', TermsUtil.tText('success to process'))
328
- return { success: true }
329
- } else {
330
- return { success: false }
331
- }
332
- }
333
-
334
- /**
335
- * @description 등록되지 않은 용어 자동 등록
336
- **************************************
337
- */
338
- async createUnregisteredTerms() {
339
- try {
340
- if (this.entityId) {
341
- const terms = this.detailGrist.data.records
342
- .filter(record => TermsUtil.tLabel(record.term) === record.term)
343
- .map(r => `label.${r.term}`)
344
- const bundle = this.selectedEntity.bundle
345
-
346
- if (terms.length) {
347
- const response = await client.query({
348
- query: gql`
349
- query setTranslations($bundle: String!, $terms: [String!]!) {
350
- setTranslations(bundle: $bundle, terms: $terms)
351
- }
352
- `,
353
- variables: { bundle, terms }
354
- })
355
-
356
- if (!response.errors) {
357
- MetaApi.showToast('info', TermsUtil.tText('success to register terms'))
358
- }
359
- }
360
- }
361
- } catch (e) {
362
- MetaApi.showToast('error', e.message)
363
- }
364
- }
365
-
366
- /**
367
- * @description 엔티티 컬럼 내보내기
368
- ********************************
369
- */
370
- async exportEntityColumns() {
371
- let headerSetting = this.detailGrist._config.columns
372
- .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
373
- .map(column => {
374
- return column.imex
375
- })
376
-
377
- let records = this.detailGrist.data.records
378
- let data = records.map(item => {
379
- return {
380
- id: item.id,
381
- ...this.detailGrist._config.columns
382
- .filter(column => column.type !== 'gutter' && column.record !== undefined && column.imex !== undefined)
383
- .reduce((record, column) => {
384
- record[column.imex.key] = column.imex.key
385
- .split('.')
386
- .reduce((obj, key) => (obj && obj[key] !== 'undefined' ? obj[key] : undefined), item)
387
- return record
388
- }, {})
389
- }
390
- })
391
-
392
- store.dispatch({
393
- type: EXPORT,
394
- exportable: {
395
- extension: 'xlsx',
396
- name: `${TermsUtil.tTitle('entity-column')}-${this.selectedEntity.name}`,
397
- data: { header: headerSetting, data: data }
398
- }
399
- })
400
- }
401
-
402
- /**
403
- * @description 임포트 대상 엑셀 파일 열기 (파일 셀렉트)
404
- **************************************
405
- */
406
- async importXlsxFile() {
407
- let _self = this
408
- const fileTypes = ['xlsx']
409
- const fileUpload = document.createElement('input')
410
- fileUpload.setAttribute('type', 'file')
411
- fileUpload.setAttribute('accept', fileTypes)
412
- fileUpload.hidden = true
413
-
414
- fileUpload.addEventListener('change', event => {
415
- //임포트 대상 엑셀 파일 읽기
416
- const fileObj = event.currentTarget.files[0]
417
- const extension = fileObj.name.split('.').pop()
418
- const reader = new FileReader()
419
-
420
- // Ready The Event For When A File Gets Selected
421
- reader.onload = function (e) {
422
- const data = e.target.result
423
- store.dispatch({
424
- type: IMPORT,
425
- importable: {
426
- extension,
427
- handler: _self.importEntityColumns.bind(_self)
428
- },
429
- data
430
- })
431
- }
432
- reader.readAsArrayBuffer(fileObj)
433
- })
434
-
435
- document.body.appendChild(fileUpload)
436
- fileUpload.click()
437
- }
438
-
439
- /**
440
- * @description 엔티티 컬럼 엑셀 임포트 처리
441
- **************************************
442
- */
443
- importEntityColumns(records) {
444
- let importList = records.header ? records.data : records
445
-
446
- if (importList && importList.length > 0) {
447
- importList.forEach(i => {
448
- i.__selected__ = true
449
- })
450
- let cols = this.importConfig.columns.filter(column => !!column.imex)
451
- setTimeout(() => {
452
- MetaApi.openPopupByElement(
453
- TermsUtil.tTitle('import'),
454
- 'large',
455
- html` <import-pop-up
456
- .records=${importList}
457
- .config=${{
458
- rows: importList,
459
- columns: [
460
- {
461
- type: 'gutter',
462
- gutterName: 'sequence'
463
- },
464
- ...cols
465
- ]
466
- }}
467
- .importHandler="${this.importHandler.bind(this)}"
468
- >
469
- </import-pop-up>`
470
- )
471
- }, 500)
472
- }
473
- }
474
-
475
- /**
476
- * @description 엔티티 컬럼 엑셀 임포트 처리
477
- **************************************
478
- */
479
- async importHandler(patches) {
480
- if (!patches || patches.length == 0) {
481
- MetaApi.showToast('info', 'text.no_data')
482
- history.back()
483
- } else {
484
- let idx = 0
485
- patches.forEach(patch => {
486
- idx += 10
487
- patch.colSize = ValueUtil.isNotEmpty(patch.colSize)
488
- ? ValueUtil.toInteger(patch.colSize)
489
- : patch.colType == 'string'
490
- ? 50
491
- : 0
492
- patch.rank = ValueUtil.toInteger(patch.rank, 0)
493
- patch.uniqRank = ValueUtil.toInteger(patch.uniqRank, 0)
494
- patch.searchRank = ValueUtil.toInteger(patch.searchRank, 0)
495
- patch.gridRank = ValueUtil.toInteger(patch.gridRank, 0)
496
- patch.gridWidth = ValueUtil.toInteger(patch.gridWidth, 0)
497
- patch.entity = { id: this.entityId }
498
- patch.nullable = ValueUtil.toBoolean(patch.nullable)
499
- patch.term = patch.term ? patch.term : patch.name
500
- patch.colType = !patch.colType ? 'string' : patch.colType
501
- delete patch['string']
502
- })
503
-
504
- let result = await MetaApi.updateMultiple('updateMultipleEntityColumn', patches)
505
- if (result) {
506
- this.detailGrist.fetch()
507
- history.back()
508
- }
509
- }
510
- }
511
-
512
- /**
513
- * @description 체크 컬럼
514
- ************************
515
- */
516
- async checkEntityColumns() {
517
- if (this.entityId) {
518
- let records = this.detailGrist.data.records
519
- let lastIdx = records && records.length ? records.length * 10 : 0
520
- let idExist = false
521
- let domainIdExist = false
522
- let createdAtExist = false
523
- let updatedAtExist = false
524
- let creatorIdExist = false
525
- let updaterIdExist = false
526
-
527
- if (records && records.length > 0) {
528
- idExist =
529
- records.findIndex(i => {
530
- return i.name == 'id'
531
- }) >= 0
532
- domainIdExist =
533
- records.findIndex(i => {
534
- return i.name == 'domain_id'
535
- }) >= 0
536
- createdAtExist =
537
- records.findIndex(i => {
538
- return i.name == 'created_at'
539
- }) >= 0
540
- updatedAtExist =
541
- records.findIndex(i => {
542
- return i.name == 'updated_at'
543
- }) >= 0
544
- creatorIdExist =
545
- records.findIndex(i => {
546
- return i.name == 'creator_id'
547
- }) >= 0
548
- updaterIdExist =
549
- records.findIndex(i => {
550
- return i.name == 'updater_id'
551
- }) >= 0
552
- }
553
-
554
- let defaultList = []
555
- if (!idExist) {
556
- lastIdx += 10
557
- defaultList.push({
558
- entity: { id: this.entityId },
559
- name: 'id',
560
- colType: 'string',
561
- colSize: 0,
562
- nullable: false,
563
- term: 'id',
564
- rank: lastIdx,
565
- cuFlag: '+'
566
- })
567
- }
568
-
569
- if (!domainIdExist) {
570
- lastIdx += 10
571
- defaultList.push({
572
- entity: { id: this.entityId },
573
- name: 'domain_id',
574
- colType: 'string',
575
- colSize: 0,
576
- nullable: false,
577
- term: 'domain',
578
- rank: lastIdx,
579
- cuFlag: '+'
580
- })
581
- }
582
-
583
- if (!createdAtExist) {
584
- lastIdx += 10
585
- defaultList.push({
586
- entity: { id: this.entityId },
587
- name: 'created_at',
588
- colType: 'timestamp',
589
- colSize: 0,
590
- nullable: true,
591
- term: 'created_at',
592
- rank: lastIdx,
593
- gridRank: 0,
594
- gridWidth: 140,
595
- cuFlag: '+'
596
- })
597
- }
598
-
599
- if (!updatedAtExist) {
600
- lastIdx += 10
601
- defaultList.push({
602
- entity: { id: this.entityId },
603
- name: 'updated_at',
604
- colType: 'timestamp',
605
- colSize: 0,
606
- nullable: true,
607
- term: 'updated_at',
608
- rank: lastIdx,
609
- gridRank: lastIdx,
610
- gridWidth: 140,
611
- cuFlag: '+'
612
- })
613
- }
614
-
615
- if (!creatorIdExist) {
616
- lastIdx += 10
617
- defaultList.push({
618
- entity: { id: this.entityId },
619
- name: 'creator_id',
620
- colType: 'string',
621
- colSize: 40,
622
- nullable: true,
623
- term: 'creator',
624
- rank: lastIdx,
625
- gridRank: 0,
626
- gridWidth: 100,
627
- cuFlag: '+'
628
- })
629
- }
630
-
631
- if (!updaterIdExist) {
632
- lastIdx += 10
633
- defaultList.push({
634
- entity: { id: this.entityId },
635
- name: 'updater_id',
636
- colType: 'string',
637
- colSize: 40,
638
- nullable: true,
639
- term: 'updater',
640
- rank: lastIdx,
641
- gridRank: 0,
642
- gridWidth: 100,
643
- cuFlag: '+'
644
- })
645
- }
646
-
647
- let result = await MetaApi.updateMultiple('updateMultipleEntityColumn', defaultList)
648
- if (result) {
649
- this.detailGrist.fetch()
650
- }
651
- }
652
- }
653
-
654
- /*********************************************************************/
655
- /* 라이프 사이클 */
656
- /*********************************************************************/
657
-
658
- /**
659
- * @description 라이프 사이클 - 페이지 초기화
660
- ***************************************
661
- */
662
- async pageInitialized(lifecycle) {
663
- // 조회 필드
664
- this.searchFields = [
665
- // name, type, label, operator, optionValues
666
- MetaApi.getGristSearchColumnConfig('name', 'string', 'name', 'i_like'),
667
- MetaApi.getGristSearchColumnConfig('table_name', 'string', 'table_name', 'i_like'),
668
- // name, type, label, operator, codeName
669
- await MetaApi.getGristSearchCodeColumnConfig('bundle', 'select', 'bundle', 'eq', 'BUNDLE')
670
- ]
671
-
672
- // 엔티티 마스터 그리드 설정
673
- this.masterConfig = {
674
- rows: MetaApi.getGristSelectableConfig(false),
675
- pagination: { pages: [1000] },
676
- appendable: true,
677
- columns: [
678
- ...MetaApi.getGristGuttersConfig(true, false),
679
- {
680
- type: 'gutter',
681
- gutterName: 'button',
682
- icon: 'edit',
683
- handlers: {
684
- click: (_columns, _data, _column, record, _rowIndex) => {
685
- if (record.id) {
686
- this.searchEntityColumns(record)
687
- }
688
- }
689
- }
690
- },
691
- // type, name, align, editable, sortable, width
692
- MetaApi.getGristColumnConfig('string', 'name', 'left', true, false, 175),
693
- MetaApi.getGristColumnConfig2('string', 'tableName', 'table_name', 'left', true, false, 180),
694
- // name, displayName, align, sortable, width, mandatory, codeName
695
- await MetaApi.getGristCodeSelectorColumnConfig('bundle', 'bundle', 'left', false, 100, true, 'BUNDLE'),
696
- // name, displayName, align, sortable, width, mandatory, codeName
697
- await MetaApi.getGristCodeSelectorColumnConfig(
698
- 'dataProp',
699
- 'entity_manage_hist',
700
- 'left',
701
- false,
702
- 90,
703
- true,
704
- 'ENTITY_HIST_TYPE'
705
- ),
706
- await MetaApi.getGristCodeSelectorColumnConfig(
707
- 'delStrategy',
708
- 'entity_del_strategy',
709
- 'left',
710
- false,
711
- 90,
712
- true,
713
- 'ENTITY_DEL_STRATEGY'
714
- ),
715
- // type, name, align, editable, sortable, width
716
- MetaApi.getGristColumnConfig('string', 'description', 'left', true, false, 250)
717
- ]
718
- }
719
-
720
- // 엔티티 컬럼 그리드 설정
721
- this.detailConfig = {
722
- rows: MetaApi.getGristSelectableConfig(true),
723
- pagination: { pages: [1000] },
724
- appendable: true,
725
- columns: [
726
- ...MetaApi.getGristGuttersConfig(true, true),
727
- MetaApi.getGristColumnConfig('integer', 'rank', 'center', true, false, 50),
728
- MetaApi.getGristColumnConfig('string', 'name', 'left', true, false, 135),
729
- {
730
- type: 'string',
731
- name: 'term',
732
- header: TermsUtil.tLabel('term'),
733
- sortable: false,
734
- width: 135,
735
- record: {
736
- editable: true,
737
- align: 'left',
738
- renderer: (value, column, record, rowIndex, field) => {
739
- return record.term ? TermsUtil.tLabel(record.term, null, record.term) : ''
740
- }
741
- }
742
- },
743
- // name, displayName, align, sortable, width, mandatory, codeName
744
- await MetaApi.getGristCodeSelectorColumnConfig(
745
- 'colType',
746
- 'col_type',
747
- 'left',
748
- false,
749
- 75,
750
- true,
751
- 'ENTITY_COLUMN_TYPES'
752
- ),
753
- // type, name, displayName, align, editable, sortable, width
754
- MetaApi.getGristColumnConfig2('integer', 'colSize', 'size', 'right', true, false, 60),
755
- MetaApi.getGristColumnConfig2('boolean', 'nullable', 'nullable', 'center', true, false, 70),
756
- MetaApi.getGristColumnConfig2('integer', 'uniqRank', 'uniq_rank', 'right', true, false, 70),
757
- MetaApi.getGristColumnConfig2('string', 'description', 'description', 'left', true, false, 135),
758
- MetaApi.getGristColumnConfig2('integer', 'searchRank', 'search_rank', 'right', true, false, 70),
759
- // name, displayName, align, sortable, width, mandatory, codeName
760
- await MetaApi.getGristCodeSelectorColumnConfig(
761
- 'searchOper',
762
- 'search_oper',
763
- 'left',
764
- false,
765
- 85,
766
- true,
767
- 'FILTER_OPERATORS'
768
- ),
769
- MetaApi.getGristColumnConfig2('integer', 'gridRank', 'grid_rank', 'right', true, false, 80),
770
- MetaApi.getGristColumnConfig2('integer', 'gridWidth', 'grid_width', 'right', true, false, 75),
771
- // name, displayName, align, sortable, width, mandatory, codeName
772
- await MetaApi.getGristCodeSelectorColumnConfig(
773
- 'gridEditor',
774
- 'grid_editor',
775
- 'left',
776
- false,
777
- 90,
778
- true,
779
- 'ENTITY_GRIST_COLUMN_TYPES'
780
- ),
781
- await MetaApi.getGristCodeSelectorColumnConfig(
782
- 'refType',
783
- 'ref_type',
784
- 'left',
785
- false,
786
- 85,
787
- true,
788
- 'COLUMN_REF_TYPE'
789
- ),
790
- // type, name, displayName, align, editable, sortable, width
791
- MetaApi.getGristColumnConfig2('string', 'refName', 'ref_name', 'left', true, false, 100),
792
- MetaApi.getGristColumnConfig2('string', 'defVal', 'id_rule', 'left', true, false, 100)
793
- ]
794
- }
795
-
796
- this.importConfig = {
797
- rows: MetaApi.getGristSelectableConfig(true),
798
- pagination: { pages: [1000] },
799
- appendable: true,
800
- columns: [
801
- ...MetaApi.getGristGuttersConfig(true, true),
802
- MetaApi.getGristColumnConfig('integer', 'rank', 'center', true, false, 50),
803
- MetaApi.getGristColumnConfig('string', 'name', 'left', true, false, 115),
804
- {
805
- type: 'string',
806
- name: 'term',
807
- header: TermsUtil.tLabel('term'),
808
- sortable: false,
809
- width: 135,
810
- record: {
811
- editable: false,
812
- align: 'left',
813
- renderer: (value, column, record, rowIndex, field) => {
814
- return record.term ? TermsUtil.tLabel(record.term, null, record.term) : ''
815
- }
816
- }
817
- },
818
- // name, displayName, align, sortable, width, mandatory, codeName
819
- await MetaApi.getGristCodeSelectorColumnConfig(
820
- 'colType',
821
- 'col_type',
822
- 'left',
823
- false,
824
- 75,
825
- true,
826
- 'ENTITY_COLUMN_TYPES'
827
- ),
828
- // type, name, displayName, align, editable, sortable, width
829
- MetaApi.getGristColumnConfig2('integer', 'colSize', 'size', 'right', true, false, 60),
830
- MetaApi.getGristColumnConfig2('boolean', 'nullable', 'nullable', 'center', true, false, 70),
831
- MetaApi.getGristColumnConfig2('integer', 'uniqRank', 'uniq_rank', 'right', true, false, 70),
832
- MetaApi.getGristColumnConfig2('string', 'description', 'description', 'left', true, false, 135),
833
- MetaApi.getGristColumnConfig2('integer', 'searchRank', 'search_rank', 'right', true, false, 70),
834
- // name, displayName, align, sortable, width, mandatory, codeName
835
- await MetaApi.getGristCodeSelectorColumnConfig(
836
- 'string',
837
- 'search_oper',
838
- 'left',
839
- false,
840
- 85,
841
- true,
842
- 'FILTER_OPERATORS'
843
- ),
844
- MetaApi.getGristColumnConfig2('integer', 'gridRank', 'grid_rank', 'right', true, false, 80),
845
- MetaApi.getGristColumnConfig2('integer', 'gridWidth', 'grid_width', 'right', true, false, 75),
846
- // name, displayName, align, sortable, width, mandatory, codeName
847
- await MetaApi.getGristCodeSelectorColumnConfig(
848
- 'gridEditor',
849
- 'grid_editor',
850
- 'left',
851
- false,
852
- 90,
853
- true,
854
- 'GRIST_COLUMN_TYPES'
855
- ),
856
- await MetaApi.getGristCodeSelectorColumnConfig(
857
- 'refType',
858
- 'ref_type',
859
- 'left',
860
- false,
861
- 85,
862
- true,
863
- 'COLUMN_REF_TYPE'
864
- ),
865
- // type, name, displayName, align, editable, sortable, width
866
- MetaApi.getGristColumnConfig2('string', 'refName', 'ref_name', 'left', true, false, 100)
867
- ]
868
- }
869
- }
870
-
871
- /**
872
- * @description 라이프 사이클 - 렌더링
873
- *********************************
874
- * @returns {HTML} HTML
875
- */
876
- render() {
877
- return html`
878
- <div slot="headroom" class="header">
879
- <div class="filters">
880
- <ox-filters-form-base
881
- .filters=${this.searchFields || []}
882
- @filters-change=${e => {
883
- this.masterGrist?.fetch()
884
- }}
885
- ></ox-filters-form-base>
886
- </div>
887
- </div>
888
-
889
- <div class="container" style="grid-template-columns: 37% 63%">
890
- <div class="container_detail">
891
- <h2><md-icon>list_alt</md-icon>${TermsUtil.tTitle('entity')}</h2>
892
- <ox-grist
893
- id="master-grist"
894
- .config=${this.masterConfig}
895
- .mode=${MetaApi.isMobileEnv() ? 'LIST' : 'GRID'}
896
- .personalConfigProvider=${this.getPagePreferenceProvider('master-grist')}
897
- .fetchHandler=${this.fetchEntities.bind(this)}
898
- auto-fetch
899
- >
900
- <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
901
- </ox-grist>
902
-
903
- <div class="button-container">
904
- <button @click=${e => this.createService()}>
905
- <md-icon>add_box</md-icon>${TermsUtil.tButton('create-service')}
906
- </button>
907
- <button @click=${e => this.createMenu()}>
908
- <md-icon>menu_open</md-icon>${TermsUtil.tButton('create-menu')}
909
- </button>
910
- <button @click=${e => this.saveMasters()}><md-icon>save</md-icon>${TermsUtil.tButton('save')}</button>
911
- <button danger @click=${e => this.deleteMasters()}>
912
- <md-icon>delete</md-icon>${TermsUtil.tButton('delete')}
913
- </button>
914
- </div>
915
- </div>
916
-
917
- <div class="container_detail">
918
- <h2><md-icon>list_alt</md-icon>${TermsUtil.tTitle('entity-column')}</h2>
919
-
920
- <ox-grist
921
- id="detail-grist"
922
- .config=${this.detailConfig}
923
- .mode=${MetaApi.isMobileEnv() ? 'LIST' : 'GRID'}
924
- explcit-fetch
925
- .fetchHandler=${this.fetchEntityColumns.bind(this)}
926
- .personalConfigProvider=${this.getPagePreferenceProvider('detail-grist')}
927
- >
928
- <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
929
- </ox-grist>
930
-
931
- <div class="button-container">
932
- <button @click=${e => this.exportEntityColumns()}>
933
- <md-icon>cloud_download</md-icon>${TermsUtil.tButton('export')}
934
- </button>
935
- <button @click=${e => this.importXlsxFile()}>
936
- <md-icon>cloud_upload</md-icon>${TermsUtil.tButton('import')}
937
- </button>
938
- <button @click=${e => this.checkEntityColumns()}>
939
- <md-icon>fact_check</md-icon>${TermsUtil.tButton('check-columns')}
940
- </button>
941
- <button @click=${e => this.createUnregisteredTerms()}>
942
- <md-icon>abc</md-icon>${TermsUtil.tButton('register-terms')}
943
- </button>
944
- <button @click=${e => this.saveEntityColumns()}><md-icon>save</md-icon>${TermsUtil.tButton('save')}</button>
945
- <button danger @click=${e => this.deleteEntityColumns()}>
946
- <md-icon>delete</md-icon>${TermsUtil.tButton('delete')}
947
- </button>
948
- </div>
949
- </div>
950
- </div>
951
- `
952
- }
953
- }
954
-
955
- customElements.define('config-entity', ConfigEntity)