@things-factory/meta-ui 10.1.246 → 10.1.248

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 (324) hide show
  1. package/package.json +16 -16
  2. package/dist-client/bootstrap.d.ts +0 -7
  3. package/dist-client/bootstrap.js +0 -126
  4. package/dist-client/bootstrap.js.map +0 -1
  5. package/dist-client/component/filter/filter-form-meta-code-select.d.ts +0 -4
  6. package/dist-client/component/filter/filter-form-meta-code-select.js +0 -80
  7. package/dist-client/component/filter/filter-form-meta-code-select.js.map +0 -1
  8. package/dist-client/component/filter/filter-form-meta-object-select.d.ts +0 -4
  9. package/dist-client/component/filter/filter-form-meta-object-select.js +0 -82
  10. package/dist-client/component/filter/filter-form-meta-object-select.js.map +0 -1
  11. package/dist-client/component/filter/filter-grist-meta-code-select.d.ts +0 -3
  12. package/dist-client/component/filter/filter-grist-meta-code-select.js +0 -76
  13. package/dist-client/component/filter/filter-grist-meta-code-select.js.map +0 -1
  14. package/dist-client/component/filter/filter-grist-meta-object-select.d.ts +0 -3
  15. package/dist-client/component/filter/filter-grist-meta-object-select.js +0 -81
  16. package/dist-client/component/filter/filter-grist-meta-object-select.js.map +0 -1
  17. package/dist-client/component/grist/editor/grist-editor-code-input.d.ts +0 -17
  18. package/dist-client/component/grist/editor/grist-editor-code-input.js +0 -82
  19. package/dist-client/component/grist/editor/grist-editor-code-input.js.map +0 -1
  20. package/dist-client/component/grist/editor/grist-editor-meta-code-selector.d.ts +0 -17
  21. package/dist-client/component/grist/editor/grist-editor-meta-code-selector.js +0 -131
  22. package/dist-client/component/grist/editor/grist-editor-meta-code-selector.js.map +0 -1
  23. package/dist-client/component/grist/editor/grist-editor-meta-object-selector.d.ts +0 -18
  24. package/dist-client/component/grist/editor/grist-editor-meta-object-selector.js +0 -103
  25. package/dist-client/component/grist/editor/grist-editor-meta-object-selector.js.map +0 -1
  26. package/dist-client/component/grist/renderer/grist-renderer-code-input.d.ts +0 -1
  27. package/dist-client/component/grist/renderer/grist-renderer-code-input.js +0 -20
  28. package/dist-client/component/grist/renderer/grist-renderer-code-input.js.map +0 -1
  29. package/dist-client/component/grist/renderer/grist-renderer-meta-code-selector.d.ts +0 -1
  30. package/dist-client/component/grist/renderer/grist-renderer-meta-code-selector.js +0 -30
  31. package/dist-client/component/grist/renderer/grist-renderer-meta-code-selector.js.map +0 -1
  32. package/dist-client/component/grist/renderer/grist-renderer-meta-object-selector.d.ts +0 -1
  33. package/dist-client/component/grist/renderer/grist-renderer-meta-object-selector.js +0 -23
  34. package/dist-client/component/grist/renderer/grist-renderer-meta-object-selector.js.map +0 -1
  35. package/dist-client/component/popup/code-input-editor-popup.d.ts +0 -37
  36. package/dist-client/component/popup/code-input-editor-popup.js +0 -104
  37. package/dist-client/component/popup/code-input-editor-popup.js.map +0 -1
  38. package/dist-client/component/popup/file-upload-popup.d.ts +0 -2
  39. package/dist-client/component/popup/file-upload-popup.js +0 -123
  40. package/dist-client/component/popup/file-upload-popup.js.map +0 -1
  41. package/dist-client/component/popup/meta-object-selector-popup.d.ts +0 -60
  42. package/dist-client/component/popup/meta-object-selector-popup.js +0 -318
  43. package/dist-client/component/popup/meta-object-selector-popup.js.map +0 -1
  44. package/dist-client/component/popup/record-based-code-editor-popup.d.ts +0 -52
  45. package/dist-client/component/popup/record-based-code-editor-popup.js +0 -174
  46. package/dist-client/component/popup/record-based-code-editor-popup.js.map +0 -1
  47. package/dist-client/dynamic-menus.d.ts +0 -1
  48. package/dist-client/dynamic-menus.js +0 -17
  49. package/dist-client/dynamic-menus.js.map +0 -1
  50. package/dist-client/index.d.ts +0 -17
  51. package/dist-client/index.js +0 -18
  52. package/dist-client/index.js.map +0 -1
  53. package/dist-client/load-components.d.ts +0 -15
  54. package/dist-client/load-components.js +0 -17
  55. package/dist-client/load-components.js.map +0 -1
  56. package/dist-client/mixin/meta-base-mixin.d.ts +0 -148
  57. package/dist-client/mixin/meta-base-mixin.js +0 -287
  58. package/dist-client/mixin/meta-base-mixin.js.map +0 -1
  59. package/dist-client/mixin/meta-basic-grist-mixin.d.ts +0 -190
  60. package/dist-client/mixin/meta-basic-grist-mixin.js +0 -252
  61. package/dist-client/mixin/meta-basic-grist-mixin.js.map +0 -1
  62. package/dist-client/mixin/meta-button-mixin.d.ts +0 -109
  63. package/dist-client/mixin/meta-button-mixin.js +0 -107
  64. package/dist-client/mixin/meta-button-mixin.js.map +0 -1
  65. package/dist-client/mixin/meta-form-mixin.d.ts +0 -183
  66. package/dist-client/mixin/meta-form-mixin.js +0 -374
  67. package/dist-client/mixin/meta-form-mixin.js.map +0 -1
  68. package/dist-client/mixin/meta-grist-tab-mixin.d.ts +0 -213
  69. package/dist-client/mixin/meta-grist-tab-mixin.js +0 -301
  70. package/dist-client/mixin/meta-grist-tab-mixin.js.map +0 -1
  71. package/dist-client/mixin/meta-main-tab-mixin.d.ts +0 -187
  72. package/dist-client/mixin/meta-main-tab-mixin.js +0 -242
  73. package/dist-client/mixin/meta-main-tab-mixin.js.map +0 -1
  74. package/dist-client/mixin/meta-master-detail-mixin.d.ts +0 -261
  75. package/dist-client/mixin/meta-master-detail-mixin.js +0 -370
  76. package/dist-client/mixin/meta-master-detail-mixin.js.map +0 -1
  77. package/dist-client/mixin/meta-service-mixin.d.ts +0 -78
  78. package/dist-client/mixin/meta-service-mixin.js +0 -267
  79. package/dist-client/mixin/meta-service-mixin.js.map +0 -1
  80. package/dist-client/mixin/meta-tab-detail-mixin.d.ts +0 -194
  81. package/dist-client/mixin/meta-tab-detail-mixin.js +0 -255
  82. package/dist-client/mixin/meta-tab-detail-mixin.js.map +0 -1
  83. package/dist-client/mixin/meta-tab-mixin.d.ts +0 -135
  84. package/dist-client/mixin/meta-tab-mixin.js +0 -169
  85. package/dist-client/mixin/meta-tab-mixin.js.map +0 -1
  86. package/dist-client/pages/activity/meta-activity-define-page.d.ts +0 -3
  87. package/dist-client/pages/activity/meta-activity-define-page.js +0 -407
  88. package/dist-client/pages/activity/meta-activity-define-page.js.map +0 -1
  89. package/dist-client/pages/activity/meta-activity-list-page.d.ts +0 -1
  90. package/dist-client/pages/activity/meta-activity-list-page.js +0 -236
  91. package/dist-client/pages/activity/meta-activity-list-page.js.map +0 -1
  92. package/dist-client/pages/activity/meta-activity-viewer-element.d.ts +0 -22
  93. package/dist-client/pages/activity/meta-activity-viewer-element.js +0 -25
  94. package/dist-client/pages/activity/meta-activity-viewer-element.js.map +0 -1
  95. package/dist-client/pages/activity/meta-activity-writer-element.d.ts +0 -25
  96. package/dist-client/pages/activity/meta-activity-writer-element.js +0 -39
  97. package/dist-client/pages/activity/meta-activity-writer-element.js.map +0 -1
  98. package/dist-client/pages/activity/meta-activiy-mixin.d.ts +0 -15
  99. package/dist-client/pages/activity/meta-activiy-mixin.js +0 -70
  100. package/dist-client/pages/activity/meta-activiy-mixin.js.map +0 -1
  101. package/dist-client/pages/button-role/button-role-detail.d.ts +0 -89
  102. package/dist-client/pages/button-role/button-role-detail.js +0 -39
  103. package/dist-client/pages/button-role/button-role-detail.js.map +0 -1
  104. package/dist-client/pages/button-role/button-role-page.d.ts +0 -98
  105. package/dist-client/pages/button-role/button-role-page.js +0 -22
  106. package/dist-client/pages/button-role/button-role-page.js.map +0 -1
  107. package/dist-client/pages/doc-number/doc-number-page.d.ts +0 -3
  108. package/dist-client/pages/doc-number/doc-number-page.js +0 -21
  109. package/dist-client/pages/doc-number/doc-number-page.js.map +0 -1
  110. package/dist-client/pages/doc-number/next-doc-number-popup.d.ts +0 -4
  111. package/dist-client/pages/doc-number/next-doc-number-popup.js +0 -22
  112. package/dist-client/pages/doc-number/next-doc-number-popup.js.map +0 -1
  113. package/dist-client/pages/entity/config-entity.d.ts +0 -4
  114. package/dist-client/pages/entity/config-entity.js +0 -804
  115. package/dist-client/pages/entity/config-entity.js.map +0 -1
  116. package/dist-client/pages/entity/main-menu-selector.d.ts +0 -79
  117. package/dist-client/pages/entity/main-menu-selector.js +0 -234
  118. package/dist-client/pages/entity/main-menu-selector.js.map +0 -1
  119. package/dist-client/pages/history/history-copy-list-popup.d.ts +0 -55
  120. package/dist-client/pages/history/history-copy-list-popup.js +0 -123
  121. package/dist-client/pages/history/history-copy-list-popup.js.map +0 -1
  122. package/dist-client/pages/history/history-json-list-popup.d.ts +0 -55
  123. package/dist-client/pages/history/history-json-list-popup.js +0 -134
  124. package/dist-client/pages/history/history-json-list-popup.js.map +0 -1
  125. package/dist-client/pages/menu/dynamic-menu-template.d.ts +0 -1
  126. package/dist-client/pages/menu/dynamic-menu-template.js +0 -81
  127. package/dist-client/pages/menu/dynamic-menu-template.js.map +0 -1
  128. package/dist-client/pages/menu/dynamic-menu.d.ts +0 -89
  129. package/dist-client/pages/menu/dynamic-menu.js +0 -663
  130. package/dist-client/pages/menu/dynamic-menu.js.map +0 -1
  131. package/dist-client/pages/menu/export-menu-popup.d.ts +0 -54
  132. package/dist-client/pages/menu/export-menu-popup.js +0 -393
  133. package/dist-client/pages/menu/export-menu-popup.js.map +0 -1
  134. package/dist-client/pages/meta-form-element.d.ts +0 -67
  135. package/dist-client/pages/meta-form-element.js +0 -9
  136. package/dist-client/pages/meta-form-element.js.map +0 -1
  137. package/dist-client/pages/meta-grist-element.d.ts +0 -84
  138. package/dist-client/pages/meta-grist-element.js +0 -12
  139. package/dist-client/pages/meta-grist-element.js.map +0 -1
  140. package/dist-client/pages/meta-grist-page.d.ts +0 -87
  141. package/dist-client/pages/meta-grist-page.js +0 -15
  142. package/dist-client/pages/meta-grist-page.js.map +0 -1
  143. package/dist-client/pages/meta-grist-tab-element.d.ts +0 -95
  144. package/dist-client/pages/meta-grist-tab-element.js +0 -15
  145. package/dist-client/pages/meta-grist-tab-element.js.map +0 -1
  146. package/dist-client/pages/meta-grist-tab-page.d.ts +0 -95
  147. package/dist-client/pages/meta-grist-tab-page.js +0 -15
  148. package/dist-client/pages/meta-grist-tab-page.js.map +0 -1
  149. package/dist-client/pages/meta-main-tab-element.d.ts +0 -82
  150. package/dist-client/pages/meta-main-tab-element.js +0 -12
  151. package/dist-client/pages/meta-main-tab-element.js.map +0 -1
  152. package/dist-client/pages/meta-main-tab-page.d.ts +0 -85
  153. package/dist-client/pages/meta-main-tab-page.js +0 -15
  154. package/dist-client/pages/meta-main-tab-page.js.map +0 -1
  155. package/dist-client/pages/meta-master-detail-element.d.ts +0 -93
  156. package/dist-client/pages/meta-master-detail-element.js +0 -12
  157. package/dist-client/pages/meta-master-detail-element.js.map +0 -1
  158. package/dist-client/pages/meta-master-detail-page.d.ts +0 -96
  159. package/dist-client/pages/meta-master-detail-page.js +0 -15
  160. package/dist-client/pages/meta-master-detail-page.js.map +0 -1
  161. package/dist-client/pages/meta-tab-detail-element.d.ts +0 -84
  162. package/dist-client/pages/meta-tab-detail-element.js +0 -12
  163. package/dist-client/pages/meta-tab-detail-element.js.map +0 -1
  164. package/dist-client/pages/meta-tab-detail-page.d.ts +0 -87
  165. package/dist-client/pages/meta-tab-detail-page.js +0 -15
  166. package/dist-client/pages/meta-tab-detail-page.js.map +0 -1
  167. package/dist-client/pages/meta-tab-element.d.ts +0 -65
  168. package/dist-client/pages/meta-tab-element.js +0 -14
  169. package/dist-client/pages/meta-tab-element.js.map +0 -1
  170. package/dist-client/pages/printer-device/printer-device-page.d.ts +0 -3
  171. package/dist-client/pages/printer-device/printer-device-page.js +0 -21
  172. package/dist-client/pages/printer-device/printer-device-page.js.map +0 -1
  173. package/dist-client/pages/template/doc-template-page.d.ts +0 -3
  174. package/dist-client/pages/template/doc-template-page.js +0 -21
  175. package/dist-client/pages/template/doc-template-page.js.map +0 -1
  176. package/dist-client/pages/template/template-file-page.d.ts +0 -3
  177. package/dist-client/pages/template/template-file-page.js +0 -21
  178. package/dist-client/pages/template/template-file-page.js.map +0 -1
  179. package/dist-client/pages/terms/config-terminology.d.ts +0 -1
  180. package/dist-client/pages/terms/config-terminology.js +0 -197
  181. package/dist-client/pages/terms/config-terminology.js.map +0 -1
  182. package/dist-client/pages/work-code/work-code-detail-popup.d.ts +0 -82
  183. package/dist-client/pages/work-code/work-code-detail-popup.js +0 -14
  184. package/dist-client/pages/work-code/work-code-detail-popup.js.map +0 -1
  185. package/dist-client/pages/work-code/work-code-page.d.ts +0 -4
  186. package/dist-client/pages/work-code/work-code-page.js +0 -20
  187. package/dist-client/pages/work-code/work-code-page.js.map +0 -1
  188. package/dist-client/route.d.ts +0 -1
  189. package/dist-client/route.js +0 -30
  190. package/dist-client/route.js.map +0 -1
  191. package/dist-client/tsconfig.tsbuildinfo +0 -1
  192. package/dist-client/utils/grist-default-value.d.ts +0 -14
  193. package/dist-client/utils/grist-default-value.js +0 -34
  194. package/dist-client/utils/grist-default-value.js.map +0 -1
  195. package/dist-client/utils/meta-api.d.ts +0 -760
  196. package/dist-client/utils/meta-api.js +0 -729
  197. package/dist-client/utils/meta-api.js.map +0 -1
  198. package/dist-client/utils/meta-crypto.d.ts +0 -4
  199. package/dist-client/utils/meta-crypto.js +0 -46
  200. package/dist-client/utils/meta-crypto.js.map +0 -1
  201. package/dist-client/utils/meta-ui-util.d.ts +0 -764
  202. package/dist-client/utils/meta-ui-util.js +0 -2994
  203. package/dist-client/utils/meta-ui-util.js.map +0 -1
  204. package/dist-client/utils/rest-service-util.d.ts +0 -120
  205. package/dist-client/utils/rest-service-util.js +0 -292
  206. package/dist-client/utils/rest-service-util.js.map +0 -1
  207. package/dist-client/utils/service-util.d.ts +0 -361
  208. package/dist-client/utils/service-util.js +0 -1204
  209. package/dist-client/utils/service-util.js.map +0 -1
  210. package/dist-client/utils/terms-util.d.ts +0 -81
  211. package/dist-client/utils/terms-util.js +0 -111
  212. package/dist-client/utils/terms-util.js.map +0 -1
  213. package/dist-client/utils/ui-util.d.ts +0 -153
  214. package/dist-client/utils/ui-util.js +0 -307
  215. package/dist-client/utils/ui-util.js.map +0 -1
  216. package/dist-client/utils/value-util.d.ts +0 -99
  217. package/dist-client/utils/value-util.js +0 -215
  218. package/dist-client/utils/value-util.js.map +0 -1
  219. package/dist-server/activity/CommonActivity.d.ts +0 -2
  220. package/dist-server/activity/CommonActivity.js +0 -58
  221. package/dist-server/activity/CommonActivity.js.map +0 -1
  222. package/dist-server/index.d.ts +0 -2
  223. package/dist-server/index.js +0 -6
  224. package/dist-server/index.js.map +0 -1
  225. package/dist-server/routes.d.ts +0 -1
  226. package/dist-server/routes.js +0 -58
  227. package/dist-server/routes.js.map +0 -1
  228. package/dist-server/service/button-role/button-role-mutation.d.ts +0 -9
  229. package/dist-server/service/button-role/button-role-mutation.js +0 -130
  230. package/dist-server/service/button-role/button-role-mutation.js.map +0 -1
  231. package/dist-server/service/button-role/button-role-query.d.ts +0 -11
  232. package/dist-server/service/button-role/button-role-query.js +0 -79
  233. package/dist-server/service/button-role/button-role-query.js.map +0 -1
  234. package/dist-server/service/button-role/button-role-type.d.ts +0 -15
  235. package/dist-server/service/button-role/button-role-type.js +0 -57
  236. package/dist-server/service/button-role/button-role-type.js.map +0 -1
  237. package/dist-server/service/button-role/button-role.d.ts +0 -15
  238. package/dist-server/service/button-role/button-role.js +0 -69
  239. package/dist-server/service/button-role/button-role.js.map +0 -1
  240. package/dist-server/service/button-role/index.d.ts +0 -5
  241. package/dist-server/service/button-role/index.js +0 -9
  242. package/dist-server/service/button-role/index.js.map +0 -1
  243. package/dist-server/service/dynamic-menu/dynamic-menu-query.d.ts +0 -11
  244. package/dist-server/service/dynamic-menu/dynamic-menu-query.js +0 -243
  245. package/dist-server/service/dynamic-menu/dynamic-menu-query.js.map +0 -1
  246. package/dist-server/service/dynamic-menu/dynamic-menu-type.d.ts +0 -30
  247. package/dist-server/service/dynamic-menu/dynamic-menu-type.js +0 -109
  248. package/dist-server/service/dynamic-menu/dynamic-menu-type.js.map +0 -1
  249. package/dist-server/service/dynamic-menu/index.d.ts +0 -2
  250. package/dist-server/service/dynamic-menu/index.js +0 -6
  251. package/dist-server/service/dynamic-menu/index.js.map +0 -1
  252. package/dist-server/service/entity-event-subscriber/entity-event-subscriber.d.ts +0 -6
  253. package/dist-server/service/entity-event-subscriber/entity-event-subscriber.js +0 -71
  254. package/dist-server/service/entity-event-subscriber/entity-event-subscriber.js.map +0 -1
  255. package/dist-server/service/entity-event-subscriber/index.d.ts +0 -2
  256. package/dist-server/service/entity-event-subscriber/index.js +0 -6
  257. package/dist-server/service/entity-event-subscriber/index.js.map +0 -1
  258. package/dist-server/service/index.d.ts +0 -9
  259. package/dist-server/service/index.js +0 -42
  260. package/dist-server/service/index.js.map +0 -1
  261. package/dist-server/service/menu-button-auth/index.d.ts +0 -5
  262. package/dist-server/service/menu-button-auth/index.js +0 -9
  263. package/dist-server/service/menu-button-auth/index.js.map +0 -1
  264. package/dist-server/service/menu-button-auth/menu-button-auth-mutation.d.ts +0 -10
  265. package/dist-server/service/menu-button-auth/menu-button-auth-mutation.js +0 -145
  266. package/dist-server/service/menu-button-auth/menu-button-auth-mutation.js.map +0 -1
  267. package/dist-server/service/menu-button-auth/menu-button-auth-query.d.ts +0 -16
  268. package/dist-server/service/menu-button-auth/menu-button-auth-query.js +0 -167
  269. package/dist-server/service/menu-button-auth/menu-button-auth-query.js.map +0 -1
  270. package/dist-server/service/menu-button-auth/menu-button-auth-type.d.ts +0 -24
  271. package/dist-server/service/menu-button-auth/menu-button-auth-type.js +0 -90
  272. package/dist-server/service/menu-button-auth/menu-button-auth-type.js.map +0 -1
  273. package/dist-server/service/menu-button-auth/menu-button-auth.d.ts +0 -23
  274. package/dist-server/service/menu-button-auth/menu-button-auth.js +0 -102
  275. package/dist-server/service/menu-button-auth/menu-button-auth.js.map +0 -1
  276. package/dist-server/service/meta-activity/index.d.ts +0 -3
  277. package/dist-server/service/meta-activity/index.js +0 -7
  278. package/dist-server/service/meta-activity/index.js.map +0 -1
  279. package/dist-server/service/meta-activity/meta-activity-mutation.d.ts +0 -18
  280. package/dist-server/service/meta-activity/meta-activity-mutation.js +0 -213
  281. package/dist-server/service/meta-activity/meta-activity-mutation.js.map +0 -1
  282. package/dist-server/service/meta-activity/meta-activity-query.d.ts +0 -10
  283. package/dist-server/service/meta-activity/meta-activity-query.js +0 -66
  284. package/dist-server/service/meta-activity/meta-activity-query.js.map +0 -1
  285. package/dist-server/service/meta-activity/meta-activity-type.d.ts +0 -21
  286. package/dist-server/service/meta-activity/meta-activity-type.js +0 -80
  287. package/dist-server/service/meta-activity/meta-activity-type.js.map +0 -1
  288. package/dist-server/service/set-translations/index.d.ts +0 -2
  289. package/dist-server/service/set-translations/index.js +0 -6
  290. package/dist-server/service/set-translations/index.js.map +0 -1
  291. package/dist-server/service/set-translations/set-translation-resolver.d.ts +0 -4
  292. package/dist-server/service/set-translations/set-translation-resolver.js +0 -67
  293. package/dist-server/service/set-translations/set-translation-resolver.js.map +0 -1
  294. package/dist-server/service/work-code/index.d.ts +0 -5
  295. package/dist-server/service/work-code/index.js +0 -9
  296. package/dist-server/service/work-code/index.js.map +0 -1
  297. package/dist-server/service/work-code/work-code-mutation.d.ts +0 -10
  298. package/dist-server/service/work-code/work-code-mutation.js +0 -155
  299. package/dist-server/service/work-code/work-code-mutation.js.map +0 -1
  300. package/dist-server/service/work-code/work-code-query.d.ts +0 -14
  301. package/dist-server/service/work-code/work-code-query.js +0 -106
  302. package/dist-server/service/work-code/work-code-query.js.map +0 -1
  303. package/dist-server/service/work-code/work-code-type.d.ts +0 -23
  304. package/dist-server/service/work-code/work-code-type.js +0 -89
  305. package/dist-server/service/work-code/work-code-type.js.map +0 -1
  306. package/dist-server/service/work-code/work-code.d.ts +0 -20
  307. package/dist-server/service/work-code/work-code.js +0 -94
  308. package/dist-server/service/work-code/work-code.js.map +0 -1
  309. package/dist-server/service/work-code-detail/index.d.ts +0 -5
  310. package/dist-server/service/work-code-detail/index.js +0 -9
  311. package/dist-server/service/work-code-detail/index.js.map +0 -1
  312. package/dist-server/service/work-code-detail/work-code-detail-mutation.d.ts +0 -10
  313. package/dist-server/service/work-code-detail/work-code-detail-mutation.js +0 -156
  314. package/dist-server/service/work-code-detail/work-code-detail-mutation.js.map +0 -1
  315. package/dist-server/service/work-code-detail/work-code-detail-query.d.ts +0 -13
  316. package/dist-server/service/work-code-detail/work-code-detail-query.js +0 -89
  317. package/dist-server/service/work-code-detail/work-code-detail-query.js.map +0 -1
  318. package/dist-server/service/work-code-detail/work-code-detail-type.d.ts +0 -20
  319. package/dist-server/service/work-code-detail/work-code-detail-type.js +0 -74
  320. package/dist-server/service/work-code-detail/work-code-detail-type.js.map +0 -1
  321. package/dist-server/service/work-code-detail/work-code-detail.d.ts +0 -19
  322. package/dist-server/service/work-code-detail/work-code-detail.js +0 -93
  323. package/dist-server/service/work-code-detail/work-code-detail.js.map +0 -1
  324. package/dist-server/tsconfig.tsbuildinfo +0 -1
@@ -1,2994 +0,0 @@
1
- // @ts-nocheck
2
- import '@material/web/icon/icon.js';
3
- import '@operato/data-grist/ox-record-creator.js';
4
- import 'ses';
5
- import { css, html, render, nothing } from 'lit';
6
- import { getEditor, getRenderer } from '@operato/data-grist';
7
- import { getValueGenerators } from '@operato/time-calculator';
8
- import moment from '@operato/moment-timezone-es';
9
- import { ScrollbarStyles, CommonGristStyles, CommonButtonStyles, ButtonContainerStyles, CommonHeaderStyles } from '@operato/styles';
10
- import { MetaCrypto } from './meta-crypto';
11
- import { TermsUtil } from './terms-util';
12
- import { ValueUtil } from './value-util';
13
- import { ServiceUtil } from './service-util';
14
- import { UiUtil } from './ui-util';
15
- import { MetaApi } from './meta-api';
16
- /**
17
- * @license
18
- * Copyright © HatioLab Inc. All rights reserved.
19
- * @author Shortstop shortstop@hatiolab.com
20
- * @description 메타 UI에서 필요한 유틸리티 함수 정의
21
- */
22
- export class MetaUiUtil {
23
- /**
24
- * @description 메뉴 ID 정보로 메뉴 메타 정보 조회
25
- ********************************************
26
- * @param {String} menuId 메뉴 ID 값
27
- * @returns {Object} 메뉴 메타 정보
28
- */
29
- static async findMenuMeta(menuId) {
30
- let menu = await ServiceUtil.findOne('menu', menuId, 'template');
31
- if (!menu) {
32
- throw new Error(TermsUtil.tText('value_is_not_exist', { value: `${TermsUtil.tMenu('menu')} ${menuId}` }));
33
- }
34
- if (!menu.template) {
35
- throw new Error(TermsUtil.tText('value_is_not_exist', { value: `${TermsUtil.tMenu('menu')} ${TermsUtil.tLabel('model')}` }));
36
- }
37
- this.menuId = menuId;
38
- return JSON.parse(menu.template);
39
- }
40
- /**
41
- * @description 메뉴 라우팅 정보로 메뉴 메타 정보 조회
42
- **********************************************
43
- * @param {String} menuRouting 메뉴 route 값
44
- * @returns {Object} 메뉴 메타 정보 (암호)
45
- */
46
- static async getMenuMetaData(menuRouting) {
47
- let filters = [{ name: 'routing', operator: 'eq', value: menuRouting }];
48
- let data = await ServiceUtil.searchByPagination('menus', filters, null, 0, 0, 'id,template');
49
- return data;
50
- }
51
- /**
52
- * @description 메뉴 라우팅 정보로 메뉴 메타 정보 조회
53
- **********************************************
54
- * @param {Object} pageView
55
- * @param {String} menuRouting 메뉴 route 값
56
- * @returns {Object} 메뉴 메타 정보
57
- */
58
- static async findMenuMetaByRouting(pageView, menuRouting) {
59
- let data = await MetaUiUtil.getMenuMetaData(menuRouting);
60
- let menu = undefined;
61
- if (!data || !data.records || data.records.length == 0) {
62
- if (pageView.defaultPageConfig) {
63
- menu = { id: menuRouting, template: pageView.defaultPageConfig };
64
- }
65
- }
66
- else {
67
- menu = data.records[0];
68
- if (!menu.template && pageView.defaultPageConfig) {
69
- menu.template = pageView.defaultPageConfig;
70
- }
71
- }
72
- if (!menu) {
73
- throw new Error(TermsUtil.tText('value_is_not_exist', { value: `${TermsUtil.tMenu('menu')} ${menuRouting}` }));
74
- }
75
- else if (!menu.template) {
76
- throw new Error(TermsUtil.tText('value_is_not_exist', { value: `${TermsUtil.tMenu('menu')} ${TermsUtil.tLabel('model')}` }));
77
- }
78
- pageView.menuId = menu.id;
79
- return JSON.parse(MetaCrypto.dec(menu.template));
80
- }
81
- /**
82
- * @description 기본 그리스트 페이지 프로퍼티 리턴
83
- *******************************************
84
- * @returns {Object} 기본 그리스트 페이지 프로퍼티
85
- */
86
- static getBasicGristPageProperties() {
87
- return {
88
- /* 메뉴 메타 정보 */
89
- menuInfo: Object, // 메뉴 기본 정보
90
- gridConfig: Object, // 그리드 구성 정보
91
- gridColumnConfig: Array, // 그리드 컬럼 정보
92
- formColumnConfig: Array, // form 컬럼 정보
93
- buttonConfig: Array, // 버튼 구성 정보
94
- searchConfig: Array, // 서치폼 구성 정보
95
- gqlInfo: String, // GraphQL 정보
96
- gqlFetchField: String, // GraphQL 조회 필드
97
- searchFormElement: String, // 화면에서 사용 되는 서치폼 (grist, filter, not)
98
- useFilterForm: Boolean, // 그리드내 filter 폼 사용 여부
99
- /* 화면 구성 */
100
- gristConfigSet: Object, // 메타정보에서 변환된 그리드 구성 정보
101
- formConfigSet: Array, // 메타정보에서 변환된 폼 구성 정보
102
- useButtonExport: Boolean, // 내보내기 버튼 사용 여부
103
- useButtonImport: Boolean, // 가져오기 버튼 사용 여부
104
- useButtonAdd: Boolean, // 추가 버튼 사용 여부
105
- gridMobileMode: String, // 모바일 기기에서 그리드 뷰
106
- gridDeskMode: String, // 데스크탑에서 그리드 뷰
107
- gridViewOptions: Array, // 그리드 뷰 옵션
108
- gridMode: String, // 현재 그리드 뷰 모드
109
- infinityPage: true, // 페이지 사용시 false
110
- route_name: String, // Element 로드시 화면을 그릴 메뉴 정보,
111
- parent_id: String, // 상세 폼 뷰 상위 데이터 ID
112
- /* 속성 ? */
113
- is_detail: {
114
- // 페이지 컴포넌트 여부
115
- type: Boolean,
116
- converter(value) {
117
- let retVal = Boolean(value);
118
- return retVal;
119
- }
120
- },
121
- is_popup: {
122
- // 팝업 여부
123
- type: Boolean,
124
- converter(value) {
125
- let retVal = Boolean(value);
126
- return retVal;
127
- }
128
- },
129
- is_activity: {
130
- // 작업 결재 관련 화면에서 호출 여부
131
- type: Boolean,
132
- converter(value) {
133
- let retVal = Boolean(value);
134
- return retVal;
135
- }
136
- },
137
- is_readonly: {
138
- // 수정 불가 페이지
139
- type: Boolean,
140
- converter(value) {
141
- let retVal = Boolean(value);
142
- return retVal;
143
- }
144
- }
145
- };
146
- }
147
- /**
148
- * @description 메뉴 메타 정보를 조회한 후 파싱...
149
- ********************************************
150
- * @param {HTMLElement} pageView
151
- * @returns {Object} 메뉴 메타 정보
152
- */
153
- static async getMenuMeta(pageView) {
154
- // 1. 라우팅 추출 및 메뉴 메타 정보 조회
155
- let currentRouting = pageView.isPage ? UiUtil.currentRouting() : pageView.route_name;
156
- pageView.currentRouting = currentRouting;
157
- let menuMetaData = await MetaUiUtil.findMenuMetaByRouting(pageView, currentRouting);
158
- // 2. Activity 여부에 따라 버튼 / 검색 삭제
159
- if (pageView.is_activity === true) {
160
- menuMetaData.grid.option.grid_refresh_when_page_activated = false;
161
- menuMetaData.grid.option.use_row_checker = false;
162
- menuMetaData.grid.option.pages = 'unlimited';
163
- menuMetaData.grid.use_filter_form = false;
164
- menuMetaData.grid.button = [];
165
- menuMetaData.button = menuMetaData.button.filter(x => x.name == 'add');
166
- }
167
- // 3. 화면이 읽기 전용인 경우 그리드 Configuration 처리
168
- if (pageView.is_readonly === true) {
169
- menuMetaData.grid_column.forEach(x => {
170
- x.editable = false;
171
- });
172
- menuMetaData.button = menuMetaData.button.filter(x => x.name != 'add');
173
- }
174
- // 4. 필터 폼 사용 여부 강제 설정
175
- if (pageView.use_filter_form === false) {
176
- menuMetaData.grid.use_filter_form = false;
177
- }
178
- // 5. 필드 변경 이벤트 처리자 설정
179
- menuMetaData.grid_column
180
- .filter(x => x.change_event_handler)
181
- .forEach(x => {
182
- if (!pageView.fieldChangeHandlers)
183
- pageView.fieldChangeHandlers = {};
184
- pageView.fieldChangeHandlers[x.name] = x.change_event_handler;
185
- });
186
- // 6. 그리드 타입 통합 처리 : object, resource-object -> meta-object-selector, resource-code-selector -> meta-code-selector
187
- menuMetaData.grid_column.forEach(x => {
188
- if (['resource-object', 'object'].includes(x.type)) {
189
- x.type = 'meta-object-selector';
190
- }
191
- else if (['resource-code-selector'].includes(x.type)) {
192
- x.type = 'meta-code-selector';
193
- }
194
- });
195
- // 7. 검색 필드의 검색 Operator가 in인 경우 디폴트 값을 배열로 변경
196
- if (menuMetaData.search && menuMetaData.search.length > 0) {
197
- menuMetaData.search.forEach(c => {
198
- let value = c.value;
199
- if (value && c.operator == 'in' && value.indexOf(',') > 0) {
200
- c.value = value.split(',');
201
- }
202
- });
203
- }
204
- // 8. 메뉴 메타 정보 리턴
205
- return menuMetaData;
206
- }
207
- /**
208
- * @description 파라미터로 받은 pageLimits로 페이지네이션 페이지 수를 표시
209
- ***************************************************************
210
- * @param {Array} 페이지네이션 페이지 수 배열
211
- * @returns {Object} 페이지네이션 페이지 수
212
- */
213
- static getGristPaginationCustomConfig(...pageLimits) {
214
- return { pages: pageLimits };
215
- }
216
- /**
217
- * @description 그리스트 기본 gutter 설정 리턴
218
- ********************************************
219
- * @param {Boolean} useRowSelector 행 선택 기능 사용 여부
220
- * @param {Boolean} multiple 여러 행 선택 가능 여부
221
- * @returns {Object} 그리스트 기본 gutter 설정
222
- */
223
- static getGristGuttersConfig(useRowSelector, multiple) {
224
- let configList = [
225
- { type: 'gutter', gutterName: 'dirty' },
226
- { type: 'gutter', gutterName: 'sequence' }
227
- ];
228
- if (useRowSelector) {
229
- configList.push({ type: 'gutter', gutterName: 'row-selector', multiple: multiple });
230
- }
231
- return configList;
232
- }
233
- /**
234
- * @description 그리스트 선택 모드 설정
235
- ***************************************
236
- * @returns {Object} 그리스트 선택 모드 설정
237
- */
238
- static getGristSelectableConfig(multiple) {
239
- return { selectable: { multiple: multiple } };
240
- }
241
- /**
242
- * @description 메뉴 메타 정보를 기반으로 그리드 설정 셋을 파싱하여 리턴
243
- ************************************************************
244
- * @param {Object} pageView 페이지
245
- * @returns {Object} 그리드 설정 셋
246
- */
247
- static async parseGridConfigSet(pageView) {
248
- // 0. GraphQL 예외 처리를 위한 오브젝트 초기 화
249
- if (!pageView.gqlInfo)
250
- pageView.gqlInfo = {};
251
- if (!pageView.gqlInfo.query)
252
- pageView.gqlInfo.query = {};
253
- if (!pageView.gqlInfo.query.after_set_fields)
254
- pageView.gqlInfo.query.after_set_fields = {};
255
- if (!pageView.gqlInfo.mutation)
256
- pageView.gqlInfo.mutation = {};
257
- if (!pageView.gqlInfo.mutation.multiple)
258
- pageView.gqlInfo.mutation.multiple = {};
259
- if (!pageView.gqlInfo.mutation.multiple.skip_fields)
260
- pageView.gqlInfo.mutation.multiple.skip_fields = [];
261
- // 1. 그리드 옵션
262
- let gridOption = MetaUiUtil.getGridOptionSet(pageView);
263
- // 2. 그리드 리스트 설정
264
- let gridList = MetaUiUtil.getGridListSet(pageView);
265
- // 3. 그리드 row 설정
266
- let gridRow = MetaUiUtil.getGridRowSet(pageView);
267
- // 4. 그리드 버튼 설정
268
- let gridButton = MetaUiUtil.getGridButtonSet(pageView);
269
- // 5. 그리드 컬럼 설정
270
- let gridColumns = await MetaUiUtil.getGridColumnSet(pageView);
271
- // 6. 그리드 meta-object-selector 타입이면서 검색 조건에 해당하는 컬럼을 찾아 숨김 컬럼으로 등록
272
- gridColumns
273
- .filter(x => ['meta-object-selector'].includes(x.type))
274
- .forEach(col => {
275
- pageView.searchConfig
276
- .filter(x => x.name == col.name)
277
- .forEach(x => {
278
- const options = col.record.options;
279
- // 6.1. 검색 필드 명 설정
280
- const filterName = options.referenceField ? options.referenceField : `${col.name}Id`;
281
- // 6.2. 검색 필드 설정 찾기
282
- const filterIdx = pageView.searchConfig.findIndex(item => {
283
- return item.name == col.name;
284
- });
285
- // 6.3. 검색 필드를 그리드 컬럼 리스트에 추가
286
- gridColumns.push({
287
- type: 'meta-object-selector',
288
- header: col.header,
289
- name: filterName,
290
- hidden: true,
291
- record: {
292
- editable: false,
293
- mandatory: false,
294
- options: options
295
- },
296
- unusable: true
297
- });
298
- // 6.4. 조회시 skip 필드 추가
299
- pageView.gqlInfo.query.after_set_fields[filterName] = 'x';
300
- // 6.5. 저장시 skip 필드 추가
301
- pageView.gqlInfo.mutation.multiple.skip_fields.push(filterName);
302
- // 6.6. 검색 설정 이름 변경
303
- pageView.searchConfig[filterIdx].name = filterName;
304
- pageView.searchConfig[filterIdx].type = 'meta-object-selector';
305
- });
306
- });
307
- // 7. 누적 계산 설정 컬럼 추출
308
- let accumulatorCols = gridColumns.filter(col => (col.accumulator ? true : false));
309
- if (accumulatorCols && accumulatorCols.length > 0) {
310
- gridRow.accumulator = true;
311
- }
312
- // 8. default 그리드 gutter
313
- let gutterConfigs = MetaUiUtil.getGristGuttersConfig(gridOption.use_row_checker, gridRow.selectable.multiple);
314
- // 9. 필터 폼에 검색 조건 필드 정의
315
- if (pageView.useFilterForm == true) {
316
- gridColumns = MetaUiUtil.setGridColumnSearchOption(pageView, gridColumns);
317
- }
318
- // 10. 그리드 강조 설정
319
- if (pageView.gridEmphasized) {
320
- // 10.1. 그리드 row
321
- if (pageView.gridEmphasized && pageView.gridEmphasized.row && pageView.gridEmphasized.row.length > 0) {
322
- gridRow.classifier = function (recordData, rowIdx) {
323
- let settings = pageView.gridEmphasized.row;
324
- for (let idx = 0; idx < settings.length; idx++) {
325
- const logic = settings[idx].logic;
326
- const c = new Compartment({ record: recordData, rowIdx });
327
- const evalFunc = c.evaluate(`(record, rowIdx) => {
328
- ${logic}
329
- }`);
330
- if (evalFunc(recordData, rowIdx)) {
331
- return {
332
- emphasized: [settings[idx].backgroundColor, settings[idx].fontColor]
333
- };
334
- }
335
- }
336
- };
337
- }
338
- // 10.2. 그리드 column
339
- if (pageView.gridEmphasized && pageView.gridEmphasized.column) {
340
- let columSetting = pageView.gridEmphasized.column;
341
- Object.keys(columSetting).forEach(key => {
342
- let settings = columSetting[key];
343
- let colIdx = gridColumns.findIndex(x => x.name == key);
344
- if (!gridColumns[colIdx].record)
345
- gridColumns[colIdx].record = {};
346
- gridColumns[colIdx].record.classifier = function (recordData, rowIdx) {
347
- for (let idx = 0; idx < settings.length; idx++) {
348
- const logic = settings[idx].logic;
349
- const c = new Compartment({ record: recordData, rowIdx });
350
- const evalFunc = c.evaluate(`(record, rowIdx) => {
351
- ${logic}
352
- }`);
353
- if (evalFunc(recordData, rowIdx)) {
354
- return {
355
- emphasized: [settings[idx].backgroundColor, settings[idx].fontColor]
356
- };
357
- }
358
- }
359
- };
360
- });
361
- }
362
- }
363
- // 11. 그리드 최종 Configuration
364
- return {
365
- list: gridList,
366
- pagination: gridOption.pages,
367
- sorters: gridOption.sorters,
368
- rows: gridRow,
369
- columns: [...gutterConfigs, ...gridButton, ...gridColumns]
370
- };
371
- }
372
- /**
373
- * @description 메뉴 메타 정보를 기반으로 폼 설정 셋을 파싱하여 리턴
374
- ********************************************************
375
- * @param {Object} pageView 페이지
376
- * @returns {Object} 폼 설정 셋
377
- */
378
- static async parseFormConfigSet(pageView) {
379
- let formColumnConfig = pageView.formColumnConfig;
380
- let columns = [];
381
- let defaultValueGenerators = Object.keys(getValueGenerators());
382
- for (let idx = 0; idx < formColumnConfig.length; idx++) {
383
- let { type = 'string', name = undefined, header = undefined, hidden = false, editable = true, mandatory = false, align = 'left', select_opt = undefined, object_opt = undefined, default_value = undefined } = formColumnConfig[idx];
384
- // 컬럼 config 으로 변경 및 문자열 처리
385
- let column = {
386
- type: type,
387
- name: name,
388
- header_txt: ValueUtil.isEmpty(header) ? TermsUtil.tLabel(name) : TermsUtil.tLabel(header),
389
- header: {
390
- renderer: function (column) {
391
- return column.header_txt;
392
- }
393
- },
394
- hidden: hidden,
395
- record: {
396
- editable: editable,
397
- mandatory: mandatory,
398
- align: align,
399
- classifier: function () { },
400
- renderer: getRenderer(type)
401
- }
402
- };
403
- if (editable) {
404
- column.record.editor = getEditor(type);
405
- }
406
- if (default_value) {
407
- let defaultSet = default_value.split(',');
408
- let defaultName = defaultSet[0];
409
- if (defaultValueGenerators.includes(defaultName)) {
410
- column.record.defaultValue =
411
- defaultSet.length == 1 ? { name: defaultName } : { name: defaultName, params: { calc: defaultSet[1] } };
412
- }
413
- else {
414
- column.record.defaultValue = type === 'number' ? Number(default_value) : default_value;
415
- }
416
- }
417
- if (type == 'boolean-all') {
418
- column.type = 'boolean';
419
- }
420
- // meta- 로 시작 되는 타입은 공통으로 메뉴를 조회 template 을 가져간다.
421
- if (type.startsWith('meta-') && object_opt && object_opt.menu) {
422
- object_opt = await MetaUiUtil.getGristMetaObjectOptions(type, object_opt);
423
- }
424
- // select-option
425
- if (type === 'select' && ValueUtil.isNotEmpty(select_opt)) {
426
- if (Array.isArray(select_opt)) {
427
- column.record.options = select_opt;
428
- }
429
- else {
430
- if (select_opt.type === 'code') {
431
- // 공통 코드
432
- column.record.options = await ServiceUtil.getCodeSelectorData(select_opt.values ? select_opt.values : select_opt.name);
433
- }
434
- else if (select_opt.type === 'scenario') {
435
- // 시나리오
436
- column.record.options = await ServiceUtil.getCodeByScenario(select_opt.name, select_opt.args);
437
- }
438
- else if (select_opt.type === 'entity') {
439
- // 엔티티
440
- column.record.options = await ServiceUtil.getCodeByEntity(select_opt.args);
441
- }
442
- }
443
- }
444
- if (type === 'meta-object-selector' && ValueUtil.isNotEmpty(object_opt)) {
445
- column.record.options = { ...object_opt };
446
- }
447
- else if (type === 'meta-code-selector' && ValueUtil.isNotEmpty(object_opt)) {
448
- if (object_opt.dispField) {
449
- object_opt.codes = await ServiceUtil.getCodeByEntity(object_opt);
450
- }
451
- column.record.options = { ...object_opt };
452
- }
453
- columns.push(column);
454
- }
455
- return columns;
456
- }
457
- /**
458
- * @description 메타 설정에서 그리드 옵션을 추출
459
- *****************************************
460
- * @param {Object} pageView
461
- * @returns {Object}
462
- */
463
- static getGridOptionSet(pageView) {
464
- let gridConfig = pageView.gridConfig;
465
- pageView.useFilterForm = gridConfig && gridConfig.use_filter_form != undefined ? gridConfig.use_filter_form : true;
466
- let { mobile_mode = 'LIST', desk_mode = 'GRID', view_mode = [], use_row_checker = true, sorters = [], pages = [50, 100, 500, 1000] } = ValueUtil.isEmpty(gridConfig.option) ? {} : gridConfig.option;
467
- // 페이지 설정 변환
468
- if (pages === 'unlimited' || pages === '-1') {
469
- pageView.infinityPage = true;
470
- pages = { infinite: true };
471
- }
472
- else {
473
- pageView.infinityPage = false;
474
- pages.sort(function (a, b) {
475
- return a - b;
476
- });
477
- pages = { pages: pages };
478
- }
479
- // 모바일 데스크 뷰 모드
480
- if (ValueUtil.isNotEmpty(view_mode)) {
481
- if (view_mode.length == 1) {
482
- desk_mode = view_mode[0];
483
- mobile_mode = view_mode[0];
484
- }
485
- else if (view_mode.length >= 2) {
486
- if (!view_mode.includes(mobile_mode)) {
487
- mobile_mode = view_mode[1];
488
- }
489
- if (!view_mode.includes(desk_mode)) {
490
- desk_mode = view_mode[0];
491
- }
492
- }
493
- }
494
- pageView.gridMobileMode = mobile_mode;
495
- pageView.gridDeskMode = desk_mode;
496
- pageView.gridViewOptions = view_mode;
497
- pageView.gridMode = UiUtil.isMobileEnv() ? pageView.gridMobileMode : pageView.gridDeskMode;
498
- return {
499
- use_row_checker: use_row_checker,
500
- sorters: sorters,
501
- pages: pages
502
- };
503
- }
504
- /**
505
- * @description 메타 설정에서 그리드 리스트 설정을 추출
506
- ***********************************************
507
- * @param {Object} pageView
508
- * @returns {Object}
509
- */
510
- static getGridListSet(pageView) {
511
- let gridList = {
512
- fields: [ValueUtil.getParams(pageView.menuInfo, 'name'), ValueUtil.getParams(pageView.menuInfo, 'desc')]
513
- };
514
- // 기본 리스트 설정과 메타에서 가져온 설정 merge
515
- if (pageView.gridConfig.list) {
516
- Object.assign(gridList, pageView.gridConfig.list);
517
- }
518
- return gridList;
519
- }
520
- /**
521
- * @description 메타 설정에서 그리드 Row 옵션을 추출
522
- *********************************************
523
- * @param {Object} pageView
524
- * @returns {Object}
525
- */
526
- static getGridRowSet(pageView) {
527
- // 기본 옵션, 메타와 상관없이 그리드 로우 멀티 셀렉트는 false, click 이벤트는 없다.
528
- let { multiple_select = false, click = undefined } = ValueUtil.isEmpty(pageView.gridConfig.row)
529
- ? {}
530
- : pageView.gridConfig.row;
531
- let retObject = {
532
- selectable: { multiple: multiple_select },
533
- appendable: pageView.useButtonAdd
534
- };
535
- if (ValueUtil.isNotEmpty(click)) {
536
- retObject.handlers = { click: click };
537
- }
538
- return retObject;
539
- }
540
- /**
541
- * @description 메타 설정에서 그리드 버튼 옵션을 추출
542
- *********************************************
543
- * @param {Object} pageView
544
- * @returns {Array}
545
- */
546
- static getGridButtonSet(pageView) {
547
- let gridButtons = pageView.gridConfig.button;
548
- return ValueUtil.isEmpty(gridButtons)
549
- ? []
550
- : // 그리드 버튼 정보로 버튼 설정 정보를 구성하여 리턴
551
- gridButtons.map(btn => {
552
- // 기본 그리드 버튼
553
- let button = { type: 'gutter', gutterName: 'button' };
554
- // 레코드 특정 필드 값 조건에 따라서 아이콘을 변경 ...
555
- if (ValueUtil.isNotEmpty(btn.icon)) {
556
- // 아이콘이 Array 타입
557
- if (Array.isArray(btn.icon)) {
558
- // 지정 된 조건에 따라 아이콘을 바꾼다.
559
- button.icon = record => {
560
- if (ValueUtil.isNotEmpty(record)) {
561
- // 지정된 조건 Loop
562
- for (let i = 0; i < btn.icon.length; i++) {
563
- let logic = btn.icon[i];
564
- let useIcon = ValueUtil.compareObjectValues(logic, record, Object.keys(logic).filter(key => key != 'icon'));
565
- if (useIcon === true) {
566
- return logic.icon;
567
- }
568
- }
569
- }
570
- };
571
- }
572
- else {
573
- button.icon = btn.icon;
574
- }
575
- }
576
- // 이름이 지정되어 있으면 변환
577
- if (ValueUtil.isNotEmpty(btn.name)) {
578
- button.name = btn.name;
579
- }
580
- // Tooltip
581
- if (ValueUtil.isNotEmpty(btn.label)) {
582
- button.title = TermsUtil.tButton(btn.label);
583
- }
584
- // 버튼 유형이 기본이면 ( 그리스트 기본 제공 기능 및 추가 기능 )
585
- if (btn.type === 'basic') {
586
- let logicTxt = ValueUtil.getParams(btn, 'logic');
587
- if (['history_copy', 'history_json'].includes(logicTxt)) {
588
- button.handlers = {
589
- click: (_columns, _data, _column, record, _rowIdx) => {
590
- if (record.id) {
591
- let action = {
592
- title: 'data_history_list',
593
- type: 'popup',
594
- tagname: logicTxt == 'history_copy' ? 'history-copy-list-popup' : 'history-json-list-popup',
595
- location: logicTxt == 'history_copy'
596
- ? 'pages/hgistory/history-copy-list-popup.js'
597
- : 'pages/hgistory/history-json-list-popup.js',
598
- menu: pageView.currentRouting,
599
- size: 'large',
600
- popup_field: 'open_param',
601
- parent_field: 'id'
602
- };
603
- let params = {
604
- ...record,
605
- gqlFunc: ValueUtil.getParams(pageView.gqlInfo, 'query', 'find_one_func'),
606
- gristConfig: JSON.parse(JSON.stringify(pageView.grist.config))
607
- };
608
- MetaUiUtil.gristButtonHandler(pageView, { logic: action }, params);
609
- }
610
- }
611
- };
612
- }
613
- else {
614
- button.handlers = { click: logicTxt };
615
- }
616
- // 버튼 유형이 커스텀이면 ...
617
- }
618
- else {
619
- button.handlers = {
620
- click: (_columns, _data, _column, record, _rowIdx) => {
621
- if (record.id) {
622
- MetaUiUtil.gristButtonHandler(pageView, btn, record);
623
- }
624
- }
625
- };
626
- }
627
- return button;
628
- });
629
- }
630
- /**
631
- * @description 메타 데이터에서 그리드 렌더링 config 을 생성
632
- ***************************************************
633
- * @param {Object} pageView 페이지
634
- * @returns {Array} 그리드 컬럼 설정 리스트
635
- */
636
- static async getGridColumnSet(pageView) {
637
- let gridColumnConfig = pageView.gridColumnConfig;
638
- // 메타에 그리드 컬럼 정보가 없으면
639
- if (ValueUtil.isEmpty(gridColumnConfig)) {
640
- return [];
641
- }
642
- // CARD, LIST인 경우 컬럼 정보를 표시하기 위한 컬럼들 추출
643
- let mobileDisplayColumns = UiUtil.isMobileEnv() && pageView.etcConfig && pageView.etcConfig.mobile_display_columns
644
- ? pageView.etcConfig.mobile_display_columns.split(',')
645
- : [];
646
- let defaultValueGenerators = Object.keys(getValueGenerators());
647
- let columns = [];
648
- for (let idx = 0; idx < gridColumnConfig.length; idx++) {
649
- let { type = 'string', name = undefined, header = undefined, hidden = false, editable = true, mandatory = false, sortable = false, align = 'left', width = 0, exportable = false, select_opt = undefined, object_opt = undefined, format = undefined, default_value = undefined, accumulator = undefined, fixed = false } = gridColumnConfig[idx];
650
- // 컬럼 config 으로 변경 및 문자열 처리
651
- let column = {
652
- type: type,
653
- name: name,
654
- header: ValueUtil.isEmpty(header) ? '' : TermsUtil.tLabel(header),
655
- hidden: hidden,
656
- sortable: sortable,
657
- width: width,
658
- fixed: fixed,
659
- record: { editable: editable, mandatory: mandatory, align: align, format: format }
660
- };
661
- // accumulator 설정이 있고 type이 number이면 accumulator 설정 추가
662
- if (type.indexOf('number') >= 0 && accumulator) {
663
- column.accumulator = accumulator;
664
- }
665
- if (default_value) {
666
- let defaultSet = default_value.split(',');
667
- let defaultName = defaultSet[0];
668
- if (defaultValueGenerators.includes(defaultName)) {
669
- column.record.defaultValue =
670
- defaultSet.length == 1 ? { name: defaultName } : { name: defaultName, params: { calc: defaultSet[1] } };
671
- }
672
- else {
673
- column.record.defaultValue = type === 'number' ? Number(default_value) : default_value;
674
- }
675
- }
676
- if (type == 'boolean-all') {
677
- column.type = 'boolean';
678
- let colHeaderTxt = column.header;
679
- column.header = {
680
- renderer: function (col) {
681
- return html `
682
- <span>${colHeaderTxt}
683
- <input type='checkbox'
684
- @change=${e => {
685
- e.stopPropagation();
686
- let targetElement = e.target;
687
- let selected = targetElement.checked;
688
- let grist = pageView.grist;
689
- if (grist._data && grist._data.records) {
690
- let records = grist._data.records;
691
- for (let idx = 0; idx < records.length; idx++) {
692
- targetElement.dispatchEvent(new CustomEvent('field-change', {
693
- bubbles: true,
694
- composed: true,
695
- detail: {
696
- before: records[idx][col.name],
697
- after: selected,
698
- record: records[idx],
699
- column: col,
700
- row: idx
701
- }
702
- }));
703
- }
704
- }
705
- }}
706
- ></input>
707
- </span>
708
- `;
709
- }
710
- };
711
- }
712
- // meta- 로 시작 되는 타입은 공통으로 메뉴를 조회 template 을 가져간다.
713
- if (type.startsWith('meta-') && object_opt && object_opt.menu) {
714
- object_opt = await MetaUiUtil.getGristMetaObjectOptions(type, object_opt);
715
- }
716
- // select-option
717
- if (type === 'select' && ValueUtil.isNotEmpty(select_opt)) {
718
- if (Array.isArray(select_opt)) {
719
- column.record.options = select_opt;
720
- }
721
- else {
722
- // 공통 코드
723
- if (select_opt.type === 'code') {
724
- column.record.options = await ServiceUtil.getCodeSelectorData(select_opt.values ? select_opt.values : select_opt.name);
725
- // 시나리오
726
- }
727
- else if (select_opt.type === 'scenario') {
728
- column.record.options = await ServiceUtil.getCodeByScenario(select_opt.name, select_opt.args);
729
- // 엔티티
730
- }
731
- else if (select_opt.type === 'entity') {
732
- column.record.options = await ServiceUtil.getCodeByEntity(select_opt.args);
733
- }
734
- }
735
- }
736
- // object-option
737
- if (type === 'meta-object-selector' && ValueUtil.isNotEmpty(object_opt)) {
738
- column.record.options = { ...object_opt };
739
- }
740
- else if (type === 'meta-code-selector' && ValueUtil.isNotEmpty(object_opt)) {
741
- if (object_opt.dispField) {
742
- object_opt.codes = await ServiceUtil.getCodeByEntity(object_opt);
743
- }
744
- column.record.options = { ...object_opt };
745
- }
746
- // attributes (확장 속성)
747
- if (type === 'attributes' && format) {
748
- column.record.options = await ServiceUtil.getAttributeSetOptionFor(format);
749
- }
750
- // mask
751
- if (type == 'mask') {
752
- column.record.renderer = (value, column, record, rowIndex, field) => {
753
- let maskVal = '';
754
- if (value) {
755
- let valCount = value.length;
756
- for (let i = 1; i <= valCount; i++) {
757
- maskVal += '*';
758
- }
759
- }
760
- else {
761
- maskVal = '********';
762
- }
763
- return maskVal;
764
- };
765
- }
766
- // LIST, CARD 에서 컬럼 정보 표시
767
- if (mobileDisplayColumns.includes(name)) {
768
- column.record.renderer = (value, column, record, rowIndex, field) => {
769
- return TermsUtil.tLabel(header) + ': ' + value;
770
- };
771
- }
772
- // 내보내기 버튼 사용, 컬럼 내보내기 옵션
773
- if (pageView.useButtonExport === true && exportable === true) {
774
- column.imex = { header: column.header, key: column.name, width: column.width / 6, type: column.type };
775
- }
776
- columns.push(column);
777
- }
778
- if (this.is_activity !== true) {
779
- return columns;
780
- }
781
- return columns;
782
- }
783
- /**
784
- * @description meta-object, meta-code에 대한 설정을 가져온다. (menu or 설정)
785
- ***********************************************************************
786
- * @param {String} type 컬럼 타입
787
- * @param {Object} options 컬럼 오브젝트 설정
788
- * @returns {Object} 메타 변경 결과
789
- */
790
- static async getGristMetaObjectOptions(type, options) {
791
- let data = await MetaUiUtil.getMenuMetaData(options.menu);
792
- if (data && data.records && data.records.length > 0 && data.records[0].template) {
793
- let menu = data.records[0];
794
- let menu_template = JSON.parse(MetaCrypto.dec(menu.template));
795
- if (!options.queryName) {
796
- options.queryName = menu_template.gql.query.list_func;
797
- }
798
- if (!options.select) {
799
- options.select = menu_template.grid_column;
800
- }
801
- if (!options.filterFields || options.filterFields.length == 0) {
802
- options.filterFields = menu_template.search;
803
- }
804
- if (!options.selectorName) {
805
- options.selectorName = menu_template.menu.title;
806
- }
807
- if (!options.filters) {
808
- options.filters = menu_template.gql.query.filters || [];
809
- }
810
- if (type.includes('-object-')) {
811
- if (!options.nameField) {
812
- options.nameField = menu_template.menu.name || 'name';
813
- }
814
- }
815
- else if (type.includes('-code-')) {
816
- if (!options.codeField) {
817
- options.codeField = menu_template.menu.name || 'code';
818
- }
819
- if (!options.dispField) {
820
- options.dispField = menu_template.menu.desc || undefined;
821
- }
822
- }
823
- }
824
- return options;
825
- }
826
- /**
827
- * @description 필터 폼에 검색 조건 필드 정의
828
- *****************************************
829
- * @param {HTMLElement} pageView 페이지
830
- * @param {Array} gridColumns 그리드 컬럼 설정
831
- * @returns
832
- */
833
- static setGridColumnSearchOption(pageView, gridColumns) {
834
- let searchConfig = pageView.searchConfig;
835
- if (searchConfig) {
836
- searchConfig.forEach(config => {
837
- if (typeof config === 'string') {
838
- gridColumns
839
- .filter(col => col.name == config)
840
- .forEach(col => {
841
- col.filter = 'search';
842
- });
843
- }
844
- else if (typeof config === 'object') {
845
- gridColumns
846
- .filter(col => col.name == config.name)
847
- .forEach(col => {
848
- col.filter = config;
849
- col.filter.type = col.type === 'datetime' && config.operator == 'eq' ? 'datetime-local' : col.type;
850
- let defValue = col.filter.value;
851
- let dateKeywords = ['today', 'year', 'month', 'date', 'hour', 'min', 'sec'];
852
- if (defValue &&
853
- typeof defValue == 'string' &&
854
- dateKeywords.filter(x => defValue.startsWith(x)).length > 0) {
855
- let defRes = [];
856
- let dateFormat = { date: 'YYYY-MM-DD', datetime: 'YYYY-MM-DD HH:mm:ss' };
857
- let durationType = {
858
- today: 'day',
859
- year: 'year',
860
- month: 'month',
861
- date: 'day',
862
- hour: 'hour',
863
- min: 'minute',
864
- sec: 'second'
865
- };
866
- let defDates = defValue.split(',');
867
- defDates.forEach(x => {
868
- const todayMoment = moment();
869
- if (dateKeywords.includes(x)) {
870
- defRes.push(todayMoment.startOf(durationType[x]).format(dateFormat[col.type]));
871
- }
872
- else if (x.includes('-')) {
873
- let wordSplits = x.split('-');
874
- let key = wordSplits[0];
875
- let value = wordSplits[1];
876
- defRes.push(todayMoment
877
- .subtract(value, durationType[key])
878
- .startOf(durationType[key])
879
- .format(dateFormat[col.type]));
880
- }
881
- else if (x.includes('+')) {
882
- let wordSplits = x.split('+');
883
- let key = wordSplits[0];
884
- let value = wordSplits[1];
885
- defRes.push(todayMoment.add(value, durationType[key]).startOf(durationType[key]).format(dateFormat[col.type]));
886
- }
887
- });
888
- if (defRes.length > 0)
889
- col.filter.value = defRes.length == 1 ? defRes[0] : defRes;
890
- }
891
- });
892
- }
893
- });
894
- }
895
- return gridColumns;
896
- }
897
- /**
898
- * @description 컨텍스트 오브젝트 리턴
899
- **********************************
900
- * @param {Object} pageView
901
- * @returns {Object} 컨텍스트 오브젝트
902
- */
903
- static getContextObject(pageView) {
904
- let ctx = pageView && pageView.menuInfo
905
- ? {
906
- title: TermsUtil.tTitle(pageView.menuInfo.title),
907
- help: pageView.menuInfo.help || '',
908
- actions: [...MetaUiUtil.getContextButtons(pageView)]
909
- }
910
- : {};
911
- // export 버튼
912
- if (pageView.useButtonExport) {
913
- ctx.exportable = {
914
- name: ctx.title,
915
- data: pageView.export.bind(pageView)
916
- };
917
- }
918
- // import 버튼
919
- if (pageView.useButtonImport) {
920
- ctx.importable = {
921
- handler: pageView.import.bind(pageView)
922
- };
923
- }
924
- // Context
925
- return ctx;
926
- }
927
- /**
928
- * @description 메뉴 컨텍스트에서 사용할 버튼 정보 추출
929
- **********************************************
930
- * @param {Object} pageView 페이지 뷰
931
- * @returns {Array} 버튼 엘리먼트 리스트
932
- */
933
- static getContextButtons(pageView) {
934
- let buttonConfig = pageView.buttonConfig;
935
- return ValueUtil.isEmpty(buttonConfig)
936
- ? []
937
- : buttonConfig
938
- .filter(b => b.name != 'export' && b.name != 'import' && b.name != 'add')
939
- .map(btn => {
940
- let { name = undefined, label = undefined, style = undefined, type = 'basic', action = undefined, logic = undefined } = btn;
941
- if (ValueUtil.isEmpty(name)) {
942
- return { title: '-1' };
943
- }
944
- if (ValueUtil.isEmpty(label))
945
- label = name;
946
- if (ValueUtil.isEmpty(style))
947
- style = name;
948
- if (ValueUtil.isEmpty(action))
949
- action = name;
950
- let btnStylecss = ValueUtil.isNotEmpty(style)
951
- ? CommonButtonStyles[style] || {
952
- icon: style,
953
- emphasis: {
954
- raised: true,
955
- outlined: false,
956
- dense: false,
957
- danger: false
958
- }
959
- }
960
- : {};
961
- return {
962
- title: TermsUtil.tButton(label),
963
- action: MetaUiUtil.getButtonActionHandler(pageView, type, action, logic),
964
- ...btnStylecss
965
- };
966
- })
967
- .filter(btn => btn.title != '-1');
968
- }
969
- /**
970
- * @description element로 로드시 버튼 element를 container에 직접 추가
971
- ****************************************************************
972
- * @param {Object} pageView 페이지 뷰
973
- * @returns {Array} 버튼 엘리먼트 리스트
974
- */
975
- static getContainerButtons(pageView) {
976
- let buttonConfig = pageView && pageView.buttonConfig ? pageView.buttonConfig : null;
977
- return !buttonConfig
978
- ? []
979
- : buttonConfig
980
- .filter(b => b.name != 'add')
981
- .map(b => {
982
- let { name = undefined, label = undefined, style = undefined, type = 'basic', action = undefined, logic = undefined } = b;
983
- if (ValueUtil.isEmpty(label))
984
- label = name;
985
- if (ValueUtil.isEmpty(style))
986
- style = name;
987
- if (ValueUtil.isEmpty(action))
988
- action = name;
989
- let btn = MetaUiUtil.createButtonElement(TermsUtil.tButton(label), style);
990
- btn.onclick = MetaUiUtil.getButtonActionHandler(pageView, type, action, logic);
991
- return btn;
992
- });
993
- }
994
- /**
995
- * @description 버튼 엘리먼트를 생성
996
- ********************************
997
- * @param {String} buttonName
998
- * @param {String} style
999
- * @returns {HTMLElement} 버튼 엘리먼트
1000
- */
1001
- static createButtonElement(buttonName, style) {
1002
- let btnStyle = CommonButtonStyles[style] || {
1003
- icon: style,
1004
- emphasis: {
1005
- raised: true,
1006
- outlined: false,
1007
- dense: false,
1008
- danger: false
1009
- }
1010
- };
1011
- const { raised, outlined, dense, danger, icon } = btnStyle.emphasis;
1012
- const template = html `
1013
- <button ?dense=${dense} ?raised=${raised} ?outlined=${outlined} ?danger=${danger}>
1014
- <md-icon>${icon || 'done'}</md-icon>
1015
- ${buttonName}
1016
- </button>
1017
- `;
1018
- const container = document.createElement('div');
1019
- render(template, container);
1020
- const element = container.firstElementChild;
1021
- return container.removeChild(element);
1022
- }
1023
- /**
1024
- * @description 버튼과 연결할 핸들러를 리턴
1025
- *************************************
1026
- * @param {Object} pageView 화면
1027
- * @param {String} type 버튼 유형 (기본, 커스텀, 그리드 버튼)
1028
- * @param {String} action 버튼 명
1029
- * @param {Object} logic 버튼 로직 (String || JSON)
1030
- * @returns {Function} 버튼 클릭시 실행될 액션 핸들러
1031
- */
1032
- static getButtonActionHandler(pageView, type, action, logic) {
1033
- if (type == 'basic') {
1034
- if (pageView[action]) {
1035
- return pageView[action].bind(pageView);
1036
- }
1037
- }
1038
- else if (type == 'custom') {
1039
- return () => MetaUiUtil.customButtonHandler(pageView, action, logic);
1040
- }
1041
- // 버튼과 연결된 함수가 없습니다.
1042
- return () => {
1043
- UiUtil.showAlertPopup('title.warning', 'text.button_bind_func_is_not_exist', 'info', 'confirm');
1044
- };
1045
- }
1046
- /**
1047
- * @description 그리스트 버튼 (그리드에 추가된 버튼)에 대한 커스텀 액션 분기
1048
- ***************************************************************
1049
- * @param {Object} pageView
1050
- * @param {Object} actionInfo
1051
- * @param {Object} record
1052
- */
1053
- static async gristButtonHandler(pageView, actionInfo, record) {
1054
- let action = ValueUtil.getParams(actionInfo, 'logic');
1055
- let buttonName = ValueUtil.getParams(actionInfo, 'name');
1056
- let eventType = ValueUtil.getParams(action, 'type');
1057
- // 폼 팝업
1058
- if (eventType === 'form') {
1059
- // 상세 폼 뷰는 기본 정의된 로직으로 셋팅
1060
- action.tagname = 'meta-form-element';
1061
- action.location = 'pages/meta-form-element.js';
1062
- action.parent_field = 'id';
1063
- await MetaUiUtil.commonButtonOpenPopup(pageView, action, record);
1064
- // 다른 객체로 파라미터 전달
1065
- }
1066
- else if (eventType === 'pass_param') {
1067
- MetaUiUtil.gristButtonPassParam(pageView, action, record);
1068
- // 페이지 이동
1069
- }
1070
- else if (eventType === 'page') {
1071
- let passParams = action.param_field ? {} : record;
1072
- if (action.param_field) {
1073
- Object.keys(record)
1074
- .filter(x => Object.keys(action.param_field).includes(x))
1075
- .map(x => {
1076
- if (Object.keys(action.param_field).includes(x)) {
1077
- let data = record[x];
1078
- passParams[action.param_field[x]] =
1079
- Array.isArray(data) === false && typeof data === 'object' && data.id ? { id: data.id } : data;
1080
- }
1081
- });
1082
- }
1083
- UiUtil.pageNavigate(action.url, [passParams]);
1084
- // 팝업 실행
1085
- }
1086
- else if (eventType === 'popup') {
1087
- await MetaUiUtil.commonButtonOpenPopup(pageView, action, record);
1088
- // 서비스 호출
1089
- }
1090
- else if (eventType === 'graphql') {
1091
- await MetaUiUtil.commonButtonCallService(pageView, action, record, record);
1092
- // 시나리오 호출
1093
- }
1094
- else if (eventType === 'scenario') {
1095
- await MetaUiUtil.commonButtonCallScenario(pageView, buttonName, action, record);
1096
- // 설정된 조건에 따라 커스텀 로직 처리
1097
- }
1098
- else if (eventType === 'value_reference') {
1099
- await MetaUiUtil.gristButtonValueReference(pageView, action, record);
1100
- // 첨부파일 다운로드 처리
1101
- }
1102
- else if (eventType === 'download') {
1103
- MetaUiUtil.downloadFile(action, record);
1104
- }
1105
- }
1106
- /**
1107
- * @description 폼 화면에서의 커스텀 버튼에 대한 액션
1108
- *********************************************
1109
- * @param {Object} pageView
1110
- * @param {String} buttonName
1111
- * @param {Object} logic
1112
- */
1113
- static async formScreenCustomButtonHandler(pageView, buttonName, logic) {
1114
- if (ValueUtil.isEmpty(logic))
1115
- return;
1116
- // TODO 현재 폼 엘리먼트에 검색 폼 기능이 없으므로 추후 추가 필요 && gristButtonHandler 함수와 거의 동일하게 로직이 처리되어야 하는데 로직이 약간 다름...
1117
- let formData = pageView.currentData;
1118
- let eventType = ValueUtil.getParams(logic, 'type');
1119
- let paramInfo = ValueUtil.getParams(logic, 'param');
1120
- let params = { form: paramInfo && paramInfo.includes('form_changed') ? pageView.patchData() : formData };
1121
- /**
1122
- * data 정보가 있는 경우 폼 데이터로 부터 아래 구조대로 변형 처리
1123
- * data: {
1124
- * "id": "$id",
1125
- * "name": "$name",
1126
- * "description": "$description",
1127
- * "activeFlag": true,
1128
- * "cuFlag": "M"
1129
- * }
1130
- */
1131
- let dataSchema = ValueUtil.getParams(logic, 'data');
1132
- // data schema (데이터 형태) 추출
1133
- if (ValueUtil.isNotEmpty(dataSchema)) {
1134
- params.form = ValueUtil.replaceVariableObject(dataSchema, formData);
1135
- }
1136
- // 페이지 이동
1137
- if (eventType === 'page') {
1138
- UiUtil.pageNavigate(logic.url, [params.form]);
1139
- // 팝업 오픈
1140
- }
1141
- else if (eventType === 'popup') {
1142
- await MetaUiUtil.commonButtonOpenPopup(pageView, logic, params);
1143
- // 서비스 호출
1144
- }
1145
- else if (eventType === 'graphql') {
1146
- await MetaUiUtil.commonButtonCallService(pageView, logic, params.filter, params.form);
1147
- // 시나리오 호출
1148
- }
1149
- else if (eventType === 'scenario') {
1150
- await MetaUiUtil.commonButtonCallScenario(pageView, buttonName, logic, params);
1151
- }
1152
- }
1153
- /**
1154
- * @description 그리드 화면에서의 커스텀 버튼에 대한 액션
1155
- ************************************************
1156
- * @param {Object} pageView 화면
1157
- * @param {String} buttonName 버튼 명
1158
- * @param {Object} logic 버튼 커스텀 로직 JSON
1159
- */
1160
- static async gristScreenCustomButtonHandler(pageView, buttonName, logic) {
1161
- if (ValueUtil.isEmpty(logic))
1162
- return;
1163
- let grist = pageView.grist;
1164
- let filterForm = pageView.filterForm;
1165
- let eventType = ValueUtil.getParams(logic, 'type');
1166
- let paramInfo = ValueUtil.getParams(logic, 'param');
1167
- let includeGristParams = paramInfo.filter(p => p.startsWith('grist'));
1168
- // 오류 메시지 처리
1169
- if (ValueUtil.isNotEmpty(includeGristParams)) {
1170
- // 그리스트 존재 여부
1171
- if (!grist) {
1172
- // 그리드가 없습니다.
1173
- UiUtil.showAlertPopup('title.info', 'text.grid_is_not_exist', 'info', 'confirm');
1174
- return;
1175
- }
1176
- // 그리스트 데이터 존재 여부 (편집중 데이터도 체크)
1177
- if ((grist?.data?.records || []).length == 0 && (grist?.dirtyData?.records || []).length == 0) {
1178
- // 비어있는 그리드 입니다.
1179
- UiUtil.showAlertPopup('title.info', 'text.grid_data_is_empty', 'info', 'confirm');
1180
- return;
1181
- }
1182
- if (paramInfo.includes('grist_one') || paramInfo.includes('grist_selected')) {
1183
- // 선택된 행이 있는지 확인
1184
- let selectedRows = grist.selected;
1185
- if (ValueUtil.isEmpty(selectedRows)) {
1186
- // 선택된 항목이 없습니다.
1187
- UiUtil.showAlertPopup('text.nothing_selected', 'text.there_is_no_selected_items', 'info', 'confirm');
1188
- return;
1189
- }
1190
- if (paramInfo.includes('grist_one')) {
1191
- // 하나의 행만 선택 되었는지 확인
1192
- if (selectedRows.length > 1) {
1193
- // 하나의 항목만 선택해주세요.
1194
- UiUtil.showAlertPopup('title.info', 'text.please_select_only_one', 'info', 'confirm');
1195
- return;
1196
- }
1197
- }
1198
- }
1199
- }
1200
- let params = {};
1201
- if (paramInfo.includes('filter')) {
1202
- if (!filterForm) {
1203
- // 서치폼이 없습니다.
1204
- UiUtil.showAlertPopup('title.info', 'text.search_form_is_not_exist', 'info', 'confirm');
1205
- return;
1206
- }
1207
- let filterValues = filterForm ? await filterForm.getQueryFilters() : [];
1208
- params['filter'] = filterValues;
1209
- }
1210
- if (paramInfo.includes('grist_all')) {
1211
- params['grist'] = grist.data.records;
1212
- }
1213
- else if (paramInfo.includes('grist_one')) {
1214
- params['grist'] = grist.selected[0];
1215
- }
1216
- else if (paramInfo.includes('grist_selected')) {
1217
- params['grist'] = grist.selected;
1218
- }
1219
- else if (paramInfo.includes('grist_changed')) {
1220
- let changedList = ServiceUtil.patchesForUpdateMultiple(grist);
1221
- if (!changedList) {
1222
- return;
1223
- }
1224
- // 화면이 팝업 화면이라면 부모 ID를 레코드에 추가한다.
1225
- let pId = pageView.parent_id ? pageView.parent_id : null;
1226
- let parentIdField = ValueUtil.getParams(logic, 'parent_field');
1227
- changedList.forEach(item => {
1228
- if (pId && parentIdField && !item[parentIdField]) {
1229
- item[parentIdField] = pId;
1230
- }
1231
- });
1232
- params['grist'] = changedList;
1233
- }
1234
- // 페이지 이동
1235
- if (eventType === 'page') {
1236
- let records = Array.isArray(params['grist']) ? params['grist'] : [params['grist']];
1237
- let passParams = logic.param_field ? null : records;
1238
- if (logic.param_field) {
1239
- passParams = records.map(record => {
1240
- let recordParams = {};
1241
- Object.keys(record)
1242
- .filter(x => Object.keys(logic.param_field).includes(x))
1243
- .map(x => {
1244
- if (Object.keys(logic.param_field).includes(x)) {
1245
- let data = record[x];
1246
- recordParams[logic.param_field[x]] =
1247
- Array.isArray(data) === false && typeof data === 'object' && data.id ? { id: data.id } : data;
1248
- }
1249
- });
1250
- return recordParams;
1251
- });
1252
- }
1253
- UiUtil.pageNavigate(logic.url, passParams);
1254
- // 팝업 오픈
1255
- }
1256
- else if (eventType === 'popup') {
1257
- let convParam = {
1258
- ...(params['grist'] ? params['grist'] : {}),
1259
- ...(params['filter'] ? params['filter'] : {})
1260
- };
1261
- await MetaUiUtil.commonButtonOpenPopup(pageView, logic, convParam);
1262
- // 서비스 호출
1263
- }
1264
- else if (eventType === 'graphql') {
1265
- let filterParam = params['filter'] ? params['filter'] : {};
1266
- let dataParams = params['grist'] ? params['grist'] : filterParam;
1267
- await MetaUiUtil.commonButtonCallService(pageView, logic, filterParam, dataParams);
1268
- // 시나리오 호출
1269
- }
1270
- else if (eventType === 'scenario') {
1271
- await MetaUiUtil.commonButtonCallScenario(pageView, buttonName, logic, params);
1272
- // 첨부파일 다운로드 처리
1273
- }
1274
- else if (eventType == 'download' && paramInfo.includes('grist_one')) {
1275
- MetaUiUtil.downloadFile(logic, params['grist']);
1276
- }
1277
- }
1278
- /**
1279
- * @description 커스텀 버튼에 대한 액션 처리
1280
- **************************************
1281
- * @param {Object} pageView 화면
1282
- * @param {String} buttonName 버튼 명
1283
- * @param {Object} logic 커스텀 버튼 로직 JSON
1284
- */
1285
- static async customButtonHandler(pageView, buttonName, logic) {
1286
- // 폼 화면의 버튼 핸들링인지 그리드 계열 화면의 버튼 핸들링 인지 구분
1287
- if (pageView.localName.startsWith('meta-form')) {
1288
- await MetaUiUtil.formScreenCustomButtonHandler(pageView, buttonName, logic);
1289
- }
1290
- else {
1291
- await MetaUiUtil.gristScreenCustomButtonHandler(pageView, buttonName, logic);
1292
- }
1293
- }
1294
- /**
1295
- * @description 파라미터 전달 버튼 처리
1296
- **********************************
1297
- * @param {Object} pageView
1298
- * @param {Object} action
1299
- * @param {Object} record
1300
- */
1301
- static gristButtonPassParam(pageView, action, record) {
1302
- // 파라미터 전달 정보
1303
- let passInfoAll = action.pass_field;
1304
- let elementTagName = pageView.tagName.toLowerCase();
1305
- let pageElement = pageView;
1306
- let passInfo = elementTagName.startsWith('meta-grist-tab-') || elementTagName.startsWith('meta-master-detail-')
1307
- ? passInfoAll.detail
1308
- ? { ...passInfoAll } // 그리스트 탭 페이지는 하단으로 보내는 이벤트만 허용
1309
- : { detail: { ...passInfoAll } }
1310
- : { ...passInfoAll }; // tab+tab or tab+etc or main-tab
1311
- Object.keys(passInfo).forEach(tab => {
1312
- if (tab == 'master') {
1313
- pageElement = pageView.rootElement.masterElement;
1314
- }
1315
- else if (tab == 'detail') {
1316
- pageElement = pageView.rootElement ? pageView.rootElement.detailElement : pageView.detailElement;
1317
- }
1318
- else if (tab == 'self') {
1319
- pageElement = pageView;
1320
- }
1321
- if (pageElement) {
1322
- if (pageElement.tagName.toLowerCase().startsWith('meta-tab-element')) {
1323
- // Object Key로 Element 검색.
1324
- Object.keys(passInfo[tab]).forEach(elementId => {
1325
- let targetElement = pageElement.shadowRoot.querySelector(`#${elementId}`);
1326
- // 상위 데이터 ID
1327
- if (record.id) {
1328
- targetElement.setParentId(record.id);
1329
- }
1330
- // 대상 엘리먼트에 매치할 필드 정보
1331
- let matchInfo = passInfo[tab][elementId];
1332
- // 필드 정보 Loop tField : target , sField : source
1333
- Object.keys(matchInfo).forEach(tField => {
1334
- let sField = matchInfo[tField];
1335
- // param 값이 * 이면 record 전체
1336
- let param = sField === '*' ? record : record[sField];
1337
- // tElement.tField에 파라미터 set
1338
- targetElement[tField] = param;
1339
- });
1340
- });
1341
- }
1342
- else {
1343
- let targetElement = pageElement;
1344
- // 상위 데이터 ID
1345
- if (record.id) {
1346
- targetElement.setParentId(record.id);
1347
- }
1348
- // 대상 엘리먼트에 매치할 필드 정보
1349
- let matchInfo = passInfo[tab];
1350
- // 필드 정보 Loop tField : target , sField : source
1351
- Object.keys(matchInfo).forEach(tField => {
1352
- let sField = matchInfo[tField];
1353
- // param 값이 * 이면 record 전체
1354
- let param = sField === '*' ? record : record[sField];
1355
- // tElement.tField에 파라미터 set
1356
- targetElement[tField] = param;
1357
- });
1358
- }
1359
- }
1360
- });
1361
- }
1362
- /**
1363
- * @description 팝업 오픈 버튼 처리
1364
- ********************************
1365
- * @param {Object} pageView
1366
- * @param {Object} action
1367
- * @param {Object} record
1368
- */
1369
- static async commonButtonOpenPopup(pageView, action, record) {
1370
- // 타이틀 변환
1371
- let title = TermsUtil.tTitle(action.title);
1372
- // 타이틀 상세 필드 정의 확인
1373
- if (ValueUtil.isNotEmpty(action.title_detail)) {
1374
- title = `${title}(${ValueUtil.getParams(record, ...action.title_detail.split('.'))})`;
1375
- }
1376
- // closeCallback
1377
- let closeCallback = action.after && typeof action.after === 'string' && action.after === 'fetch' && pageView && pageView.fetch
1378
- ? pageView.fetch.bind(pageView)
1379
- : undefined;
1380
- // 팝업 오픈
1381
- UiUtil.openDynamicPopup(title, action, record, closeCallback);
1382
- }
1383
- /**
1384
- * @description 서비스 호출 버튼 처리
1385
- *************************************
1386
- * @param {Object} pageView 페이지 뷰
1387
- * @param {Object} action 액션
1388
- * @param {Object or Array} filterParam 필터 파라미터
1389
- * @param {Object or Array} records 선택 레코드
1390
- */
1391
- static async commonButtonCallService(pageView, action, filterParam, records) {
1392
- // Graphql 서비스 호출
1393
- let response = await ServiceUtil.callService(pageView, action, filterParam, records);
1394
- // 후 처리 액션 처리
1395
- if (!response.errors && action.after && ValueUtil.isNotEmpty(action.after)) {
1396
- let afterParams = null;
1397
- if (typeof action.after === 'object') {
1398
- afterParams = Array.isArray(response) ? response : [response];
1399
- }
1400
- await MetaUiUtil.afterActionHandler(pageView, action, afterParams);
1401
- }
1402
- }
1403
- /**
1404
- * @description 시나리오 호출 버튼 처리
1405
- ***********************************
1406
- * @param {Object} pageView
1407
- * @param {String} buttonName
1408
- * @param {Object} action
1409
- * @param {Object or Array} params
1410
- */
1411
- static async commonButtonCallScenario(pageView, buttonName, action, params) {
1412
- // 시나리오 호출
1413
- let response = await ServiceUtil.callScenario(buttonName, action.name, params);
1414
- // 처리 중 에러가 발생했거나 시나리오 호출 후 처리가 없으면 return
1415
- if (!response.errors && action.after && ValueUtil.isNotEmpty(action.after)) {
1416
- let afterParams = null;
1417
- // after가 오브젝트이면 후 처리 로직
1418
- if (typeof action.after === 'object') {
1419
- let after = action.after;
1420
- afterParams = ValueUtil.getParams(response.data.runScenario.result, ...after.result_name.split('.'));
1421
- if (Array.isArray(afterParams) == false) {
1422
- afterParams = [afterParams];
1423
- }
1424
- }
1425
- // 후 처리 처리
1426
- await MetaUiUtil.afterActionHandler(pageView, action, afterParams);
1427
- }
1428
- }
1429
- /**
1430
- * @description 버튼 처리 후 처리
1431
- *******************************
1432
- * @param {Object} pageView
1433
- * @param {Object} action
1434
- * @param {Object or Array} afterParams
1435
- */
1436
- static async afterActionHandler(pageView, action, afterParams) {
1437
- // after가 오브젝트이면 후 처리 로직
1438
- if (typeof action.after === 'object') {
1439
- let after = action.after;
1440
- // 상세 폼 뷰 팝업 실행
1441
- if (after.type === 'form') {
1442
- after.tagname = 'meta-form-element';
1443
- after.location = 'pages/meta-form-element.js';
1444
- after.parent_field = 'id';
1445
- afterParams = afterParams[0];
1446
- await MetaUiUtil.commonButtonOpenPopup(pageView, after, afterParams);
1447
- // 페이지 이동 처리
1448
- }
1449
- else if (after.type === 'page') {
1450
- let records = afterParams;
1451
- let passParams = after.param_field ? null : records;
1452
- if (after.param_field) {
1453
- passParams = records.map(record => {
1454
- let recordParams = {};
1455
- Object.keys(record)
1456
- .filter(x => Object.keys(after.param_field).includes(x))
1457
- .map(x => {
1458
- if (Object.keys(after.param_field).includes(x)) {
1459
- let data = record[x];
1460
- recordParams[after.param_field[x]] =
1461
- Array.isArray(data) === false && typeof data === 'object' && data.id ? { id: data.id } : data;
1462
- }
1463
- });
1464
- return recordParams;
1465
- });
1466
- }
1467
- UiUtil.pageNavigate(after.url, passParams);
1468
- // 다른 객체로 파라미터 전달
1469
- }
1470
- else if (after.type === 'pass_param') {
1471
- afterParams = afterParams[0];
1472
- MetaUiUtil.gristButtonPassParam(pageView, after, afterParams);
1473
- // 팝업 오픈
1474
- }
1475
- else if (after.type === 'popup') {
1476
- afterParams = afterParams[0];
1477
- await MetaUiUtil.commonButtonOpenPopup(pageView, after, afterParams);
1478
- // 설정된 조건에 따라 커스텀 로직 처리
1479
- }
1480
- else if (after.type === 'value_reference') {
1481
- afterParams = afterParams[0];
1482
- await MetaUiUtil.gristButtonValueReference(pageView, after, afterParams);
1483
- }
1484
- // after가 fetch이면 리프레쉬
1485
- }
1486
- else if (action.after === 'fetch') {
1487
- pageView.fetch();
1488
- // after가 close이면 팝업 닫기
1489
- }
1490
- else if (action.after == 'close') {
1491
- UiUtil.closePopupBy(pageView);
1492
- }
1493
- }
1494
- /**
1495
- * @description UI에서 파일 다운로드 처리
1496
- *************************************
1497
- * @param {Object} config 설정
1498
- * @param {Object} record 레코드
1499
- */
1500
- static downloadFile(config, record) {
1501
- let attachmentRoot = config.attachment_root;
1502
- let attachColumn = config.attachment_column;
1503
- let downloadColumn = config.download_name_column ? config.download_name_column : null;
1504
- if (!attachColumn) {
1505
- throw new Error('attachmentColumn 정보가 없습니다.');
1506
- }
1507
- let attachColumns = attachColumn.split('.');
1508
- let fileData = record[attachColumns[0]];
1509
- let fileName = attachColumns.length == 1 ? fileData : fileData[attachColumns[1]];
1510
- let downloadName = downloadColumn ? record[downloadColumn] : fileName;
1511
- const link = document.createElement('a');
1512
- link.setAttribute('href', `./${attachmentRoot}/${fileName}`);
1513
- link.setAttribute('download', downloadName);
1514
- document.body.appendChild(link);
1515
- link.click();
1516
- link.parentNode.removeChild(link);
1517
- }
1518
- /**
1519
- * @description 설정된 조건과 record 의 값을 비교. 로직 처리
1520
- ****************************************************
1521
- * @param {Object} pageView
1522
- * @param {Object} config
1523
- * @param {Object} record
1524
- */
1525
- static async gristButtonValueReference(pageView, config, record) {
1526
- // 지정된 조건 Loop
1527
- for (let idx = 0; idx < config.relation.length; idx++) {
1528
- let relation = config.relation[idx];
1529
- let useRelation = ValueUtil.compareObjectValues(relation, record, Object.keys(relation).filter(key => key != 'logic'));
1530
- if (useRelation === true) {
1531
- // 조건 체크 후 버튼 핸들러 호출
1532
- await MetaUiUtil.gristButtonHandler(pageView, relation, record);
1533
- }
1534
- }
1535
- }
1536
- /**
1537
- * @description 그리스트 Hidden 컬럼 설정
1538
- *************************************
1539
- * @param {String} type
1540
- * @param {String} name
1541
- * @returns {Object} 그리스트 Hidden 컬럼 설정
1542
- */
1543
- static getGristHiddenColumnConfig(type, name) {
1544
- return {
1545
- type: type,
1546
- name: name,
1547
- sortable: false,
1548
- hidden: true
1549
- };
1550
- }
1551
- /**
1552
- * @description 그리스트 기본 컬럼 설정
1553
- ***********************************
1554
- * @param {String} type
1555
- * @param {String} name
1556
- * @param {String} align
1557
- * @param {Boolean} editable
1558
- * @param {Boolean} sortable
1559
- * @param {Number} width
1560
- * @returns {Object} 그리스트 기본 컬럼 설정
1561
- */
1562
- static getGristColumnConfig(type, name, align, editable, sortable, width) {
1563
- let dispName = TermsUtil.tLabel(name);
1564
- return {
1565
- type: type,
1566
- name: name,
1567
- header: dispName,
1568
- record: {
1569
- align: align,
1570
- editable: editable
1571
- },
1572
- sortable: sortable,
1573
- width: width,
1574
- imex: {
1575
- width: Math.floor(width / 6),
1576
- header: dispName,
1577
- type: type,
1578
- key: name
1579
- }
1580
- };
1581
- }
1582
- /**
1583
- * @description 그리스트 컬럼 설정
1584
- *******************************
1585
- * @param {String} type
1586
- * @param {String} name
1587
- * @param {String} displayName
1588
- * @param {String} align
1589
- * @param {Boolean} editable
1590
- * @param {Boolean} sortable
1591
- * @param {Number} width
1592
- * @returns {Object} 그리스트 기본 컬럼 설정
1593
- */
1594
- static getGristColumnConfig2(type, name, displayName, align, editable, sortable, width) {
1595
- let dispName = TermsUtil.tLabel(displayName);
1596
- return {
1597
- type: type,
1598
- name: name,
1599
- header: dispName,
1600
- record: {
1601
- align: align,
1602
- editable: editable
1603
- },
1604
- sortable: sortable,
1605
- width: width,
1606
- imex: {
1607
- width: Math.floor(width / 6),
1608
- header: dispName,
1609
- type: type,
1610
- key: name
1611
- }
1612
- };
1613
- }
1614
- /**
1615
- * @description 그리스트 컬럼 설정
1616
- *******************************
1617
- * @param {String} type
1618
- * @param {String} name
1619
- * @param {String} displayName
1620
- * @param {String} align
1621
- * @param {Boolean} editable
1622
- * @param {Boolean} sortable
1623
- * @param {Boolean} mandatory
1624
- * @param {Number} width
1625
- * @returns {Object} 그리스트 기본 컬럼 설정
1626
- */
1627
- static getGristColumnConfig3(type, name, displayName, align, editable, sortable, mandatory, width) {
1628
- let dispName = TermsUtil.tLabel(displayName);
1629
- return {
1630
- type: type,
1631
- name: name,
1632
- header: dispName,
1633
- record: {
1634
- align: align,
1635
- editable: editable,
1636
- mandatory: mandatory
1637
- },
1638
- sortable: sortable,
1639
- width: width,
1640
- imex: {
1641
- width: Math.floor(width / 6),
1642
- header: dispName,
1643
- type: type,
1644
- key: name
1645
- }
1646
- };
1647
- }
1648
- /**
1649
- * @description 그리스트 Selector 컬럼 설정
1650
- ***************************************
1651
- * @param {String} name
1652
- * @param {String} displayName
1653
- * @param {String} align
1654
- * @param {Boolean} sortable
1655
- * @param {Number} width
1656
- * @param {Boolean} mandatory
1657
- * @param {Array} optionValues
1658
- * @returns {Object} 그리스트 기본 컬럼 설정
1659
- */
1660
- static getGristSelectorColumnConfig(name, displayName, align, sortable, width, mandatory, optionValues) {
1661
- let dispName = TermsUtil.tLabel(displayName);
1662
- return {
1663
- type: 'select',
1664
- name: name,
1665
- header: dispName,
1666
- record: {
1667
- align: align,
1668
- editable: true,
1669
- mandatory: mandatory,
1670
- options: optionValues
1671
- },
1672
- sortable: sortable,
1673
- width: width,
1674
- imex: {
1675
- width: Math.floor(width / 6),
1676
- header: dispName,
1677
- type: 'string',
1678
- key: name
1679
- }
1680
- };
1681
- }
1682
- /**
1683
- * @description 그리스트 Code Selector 컬럼 설정
1684
- ********************************************
1685
- * @param {String} name
1686
- * @param {String} displayName
1687
- * @param {String} align
1688
- * @param {Boolean} sortable
1689
- * @param {Number} width
1690
- * @param {Boolean} mandatory
1691
- * @param {String} codeName
1692
- * @returns {Object} 그리스트 기본 컬럼 설정
1693
- */
1694
- static async getGristCodeSelectorColumnConfig(name, displayName, align, sortable, width, mandatory, codeName) {
1695
- let optionValue = await ServiceUtil.getCodeSelectorData(codeName);
1696
- return MetaUiUtil.getGristSelectorColumnConfig(name, displayName, align, sortable, width, mandatory, optionValue);
1697
- }
1698
- /**
1699
- * @description 그리스트 검색 편집기 설정
1700
- ************************************
1701
- * @param {String} name
1702
- * @param {String} type
1703
- * @param {String} label
1704
- * @param {String} operator
1705
- * @param {Array} optionValues
1706
- * @returns {Object} 그리스트 검색 편집기 설정
1707
- */
1708
- static getGristSearchColumnConfig(name, type, label, operator, optionValues) {
1709
- let dispName = TermsUtil.tLabel(label);
1710
- let column = {
1711
- name: name,
1712
- type: type,
1713
- label: dispName,
1714
- operator: operator,
1715
- imex: {
1716
- width: 16,
1717
- header: dispName,
1718
- type: type,
1719
- key: name
1720
- }
1721
- };
1722
- if (optionValues) {
1723
- column.options = optionValues;
1724
- }
1725
- return column;
1726
- }
1727
- /**
1728
- * @description 그리스트 검색 코드 편집기 설정
1729
- ***************************************
1730
- * @param {String} name 검색 필드 명
1731
- * @param {String} type 검색 편집기 유형
1732
- * @param {String} label 검색 필드 라벨명
1733
- * @param {String} operator 검색 연산자
1734
- * @param {String} codeName 코드 이름
1735
- * @returns {Object} 그리스트 검색 코드 편집기 설정
1736
- */
1737
- static async getGristSearchCodeColumnConfig(name, type, label, operator, codeName) {
1738
- let optionValues = await ServiceUtil.getCodeSelectorData(codeName);
1739
- return MetaUiUtil.getGristSearchColumnConfig(name, type, label, operator, optionValues);
1740
- }
1741
- /**
1742
- * @description 기본 컨텍스트 버튼이 아닌 커스텀 버튼 컨테이너 스타일
1743
- *********************************************************
1744
- * @returns {Array} 커스텀 버튼 컨테이너 CSS 리턴
1745
- */
1746
- static getCustomButtonContainerStyles() {
1747
- return [ButtonContainerStyles];
1748
- }
1749
- /**
1750
- * @description 그리스트 강조 스타일 리턴
1751
- ************************************
1752
- * @returns {Array} 그리스트 강조 스타일 CSS
1753
- */
1754
- static getGristEmphasizedStyles() {
1755
- return [
1756
- css `
1757
- :host {
1758
- --grid-record-emphasized-background-color: red;
1759
- --grid-record-emphasized-color: yellow;
1760
- }
1761
- `
1762
- ];
1763
- }
1764
- /**
1765
- * @description 기본 그리스트 스타일 리턴
1766
- ************************************
1767
- * @returns {Array} 기본 그리스트 스타일 CSS 리턴
1768
- */
1769
- static getBasicGristStyles() {
1770
- return [
1771
- ScrollbarStyles,
1772
- CommonGristStyles,
1773
- CommonHeaderStyles,
1774
- css `
1775
- :host {
1776
- display: flex;
1777
- flex-direction: column;
1778
- overflow-x: overlay;
1779
- background-color: var(--md-sys-color-background);
1780
- }
1781
-
1782
- ox-grist {
1783
- overflow-y: auto;
1784
- flex: 1;
1785
- }
1786
-
1787
- ox-filters-form {
1788
- flex: 1;
1789
- }
1790
- `,
1791
- ...MetaUiUtil.getGristEmphasizedStyles(),
1792
- ...MetaUiUtil.getCustomButtonContainerStyles()
1793
- ];
1794
- }
1795
- /**
1796
- * @description 기본 그리스트 탭 스타일 리턴
1797
- **************************************
1798
- * @returns {Array} 기본 그리스트 탭 스타일 CSS 리턴
1799
- */
1800
- static getBasicGristTabStyles() {
1801
- return [
1802
- ScrollbarStyles,
1803
- CommonGristStyles,
1804
- CommonHeaderStyles,
1805
- css `
1806
- :host {
1807
- display: flex;
1808
- flex-direction: column;
1809
- overflow-x: overlay;
1810
- background-color: var(--md-sys-color-background);
1811
- }
1812
-
1813
- .container {
1814
- flex: 1;
1815
- display: grid;
1816
- overflow: hidden;
1817
- }
1818
-
1819
- .container_detail {
1820
- background-color: var(--md-sys-color-background);
1821
- display: flex;
1822
- flex-direction: column;
1823
- flex: 1;
1824
- overflow-y: auto;
1825
- }
1826
-
1827
- h2 {
1828
- padding: var(--subtitle-padding);
1829
- font: var(--subtitle-font);
1830
- color: var(--subtitle-text-color);
1831
- border-bottom: var(--subtitle-border-bottom);
1832
- }
1833
-
1834
- .container_detail h2 {
1835
- margin: var(--grist-title-margin);
1836
- border: var(--grist-title-border);
1837
- font: var(--grist-title-font);
1838
- color: var(--md-sys-color-secondary);
1839
- }
1840
-
1841
- .container_detail h2 md-icon {
1842
- --md-icon-size: var(--grist-title-icon-size);
1843
- vertical-align: middle;
1844
- margin: var(--grist-title-icon-margin);
1845
- color: var(--grist-title-icon-color);
1846
- }
1847
-
1848
- h2 {
1849
- padding-bottom: var(--grist-title-with-grid-padding);
1850
- }
1851
-
1852
- ox-grist {
1853
- overflow-y: auto;
1854
- flex: 1;
1855
- }
1856
-
1857
- ox-filters-form {
1858
- flex: 1;
1859
- }
1860
- `,
1861
- ...MetaUiUtil.getGristEmphasizedStyles(),
1862
- ...MetaUiUtil.getCustomButtonContainerStyles()
1863
- ];
1864
- }
1865
- /**
1866
- * @description 기본 마스터 디테일 스타일 리턴
1867
- ****************************************
1868
- * @returns {Array} 기본 마스터 디테일 스타일 CSS 리턴
1869
- */
1870
- static getBasicMasterDetailStyles() {
1871
- return [
1872
- ScrollbarStyles,
1873
- CommonGristStyles,
1874
- CommonHeaderStyles,
1875
- css `
1876
- :host {
1877
- display: flex;
1878
- flex-direction: column;
1879
- overflow-x: overlay;
1880
- background-color: var(--md-sys-color-background);
1881
- }
1882
-
1883
- .container {
1884
- flex: 1;
1885
- display: grid;
1886
- overflow: hidden;
1887
- }
1888
-
1889
- .container_detail {
1890
- background-color: var(--md-sys-color-background);
1891
- display: flex;
1892
- flex-direction: column;
1893
- flex: 1;
1894
- overflow-y: auto;
1895
- }
1896
-
1897
- h2 {
1898
- padding: var(--subtitle-padding);
1899
- font: var(--subtitle-font);
1900
- color: var(--subtitle-text-color);
1901
- border-bottom: var(--subtitle-border-bottom);
1902
- }
1903
-
1904
- .container_detail h2 {
1905
- margin: var(--grist-title-margin);
1906
- border: var(--grist-title-border);
1907
- font: var(--grist-title-font);
1908
- color: var(--md-sys-color-secondary);
1909
- }
1910
-
1911
- .container_detail h2 md-icon {
1912
- --md-icon-size: var(--grist-title-icon-size);
1913
- vertical-align: middle;
1914
- margin: var(--grist-title-icon-margin);
1915
- color: var(--grist-title-icon-color);
1916
- }
1917
-
1918
- h2 {
1919
- padding-bottom: var(--grist-title-with-grid-padding);
1920
- }
1921
-
1922
- ox-grist {
1923
- overflow-y: auto;
1924
- flex: 1;
1925
- }
1926
-
1927
- ox-filters-form {
1928
- flex: 1;
1929
- }
1930
- `,
1931
- ...MetaUiUtil.getGristEmphasizedStyles(),
1932
- ...MetaUiUtil.getCustomButtonContainerStyles()
1933
- ];
1934
- }
1935
- /**
1936
- * @description 기본 TAB 디테일 스타일 리턴
1937
- **************************************
1938
- * @returns {Array} 기본 TAB 디테일 스타일 CSS 리턴
1939
- */
1940
- static getBasicTabDetailStyles() {
1941
- return [
1942
- ScrollbarStyles,
1943
- CommonGristStyles,
1944
- CommonHeaderStyles,
1945
- css `
1946
- :host {
1947
- display: flex;
1948
- flex-direction: column;
1949
- overflow-x: overlay;
1950
- background-color: var(--md-sys-color-background);
1951
- }
1952
-
1953
- .container {
1954
- flex: 1;
1955
- display: grid;
1956
- overflow: hidden;
1957
- }
1958
-
1959
- .container_detail {
1960
- background-color: var(--md-sys-color-background);
1961
- display: flex;
1962
- flex-direction: column;
1963
- flex: 1;
1964
- overflow-y: auto;
1965
- }
1966
-
1967
- h2 {
1968
- padding: var(--subtitle-padding);
1969
- font: var(--subtitle-font);
1970
- color: var(--subtitle-text-color);
1971
- border-bottom: var(--subtitle-border-bottom);
1972
- }
1973
-
1974
- .container_detail h2 {
1975
- margin: var(--grist-title-margin);
1976
- border: var(--grist-title-border);
1977
- font: var(--grist-title-font);
1978
- color: var(--md-sys-color-secondary);
1979
- }
1980
-
1981
- .container_detail h2 md-icon {
1982
- --md-icon-size: var(--grist-title-icon-size);
1983
- vertical-align: middle;
1984
- margin: var(--grist-title-icon-margin);
1985
- color: var(--grist-title-icon-color);
1986
- }
1987
-
1988
- h2 {
1989
- padding-bottom: var(--grist-title-with-grid-padding);
1990
- }
1991
-
1992
- ox-grist {
1993
- overflow-y: auto;
1994
- flex: 1;
1995
- }
1996
-
1997
- ox-filters-form {
1998
- flex: 1;
1999
- }
2000
- `,
2001
- ...MetaUiUtil.getGristEmphasizedStyles(),
2002
- ...MetaUiUtil.getCustomButtonContainerStyles()
2003
- ];
2004
- }
2005
- /**
2006
- * @description 기본 MAIN TAB 스타일 리턴
2007
- **************************************
2008
- * @returns {Array} 기본 MAIN TAB 스타일 CSS 리턴
2009
- */
2010
- static getBasicMainTabStyles() {
2011
- return [
2012
- ScrollbarStyles,
2013
- CommonGristStyles,
2014
- CommonHeaderStyles,
2015
- css `
2016
- :host {
2017
- display: flex;
2018
- flex-direction: column;
2019
- overflow-x: overlay;
2020
- background-color: var(--md-sys-color-background);
2021
- }
2022
-
2023
- .container {
2024
- flex: 1;
2025
- display: grid;
2026
- overflow: hidden;
2027
- }
2028
-
2029
- ox-grist {
2030
- overflow-y: auto;
2031
- flex: 1;
2032
- }
2033
-
2034
- ox-filters-form {
2035
- flex: 1;
2036
- }
2037
- `,
2038
- ...MetaUiUtil.getGristEmphasizedStyles(),
2039
- ...MetaUiUtil.getCustomButtonContainerStyles()
2040
- ];
2041
- }
2042
- /**
2043
- * @description 기본 마스터 디테일 그리스트 스타일 리턴
2044
- *********************************************************
2045
- * @param {String} masterDetailType top-down / left-right
2046
- * @returns {Array} 마스터 디테일 그리스트 스타일 CSS
2047
- */
2048
- static getBasicMasterDetailGristStyle(masterDetailType) {
2049
- if (masterDetailType == 'top-down') {
2050
- return MetaUiUtil.getMasterDetailTopDownGristStyle();
2051
- }
2052
- else {
2053
- return MetaUiUtil.getMasterDetailLeftRightGristStyle();
2054
- }
2055
- }
2056
- /**
2057
- * @description top-down 형태의 마스터 디테일 그리스트 스타일 리턴
2058
- ************************************************************
2059
- * @returns {Array} top-down 형태의 마스터 디테일 그리스트 스타일 CSS
2060
- */
2061
- static getMasterDetailTopDownGristStyle() {
2062
- return [
2063
- ButtonContainerStyles,
2064
- CommonGristStyles,
2065
- CommonHeaderStyles,
2066
- ScrollbarStyles,
2067
- css `
2068
- :host {
2069
- display: flex;
2070
- flex-direction: column;
2071
- overflow-x: auto;
2072
- background-color: var(--md-sys-color-background);
2073
- }
2074
-
2075
- .container {
2076
- flex: 1;
2077
- display: grid;
2078
- overflow: hidden;
2079
- grid-template-rows: 50% 50%;
2080
- }
2081
-
2082
- .container_detail {
2083
- background-color: var(--md-sys-color-background);
2084
- display: flex;
2085
- flex-direction: column;
2086
- flex: 1;
2087
- overflow-y: auto;
2088
- }
2089
-
2090
- h2 {
2091
- padding: var(--subtitle-padding);
2092
- font: var(--subtitle-font);
2093
- color: var(--subtitle-text-color);
2094
- border-bottom: var(--subtitle-border-bottom);
2095
- }
2096
-
2097
- .container_detail h2 {
2098
- margin: var(--grist-title-margin);
2099
- border: var(--grist-title-border);
2100
- font: var(--grist-title-font);
2101
- color: var(--md-sys-color-secondary);
2102
- }
2103
-
2104
- .container_detail h2 md-icon {
2105
- --md-icon-size: var(--grist-title-icon-size);
2106
- vertical-align: middle;
2107
- margin: var(--grist-title-icon-margin);
2108
- color: var(--grist-title-icon-color);
2109
- }
2110
-
2111
- h2 {
2112
- padding-bottom: var(--grist-title-with-grid-padding);
2113
- }
2114
-
2115
- ox-grist {
2116
- overflow-y: auto;
2117
- flex: 1;
2118
- }
2119
-
2120
- ox-filters-form {
2121
- flex: 1;
2122
- }
2123
- `
2124
- ];
2125
- }
2126
- /**
2127
- * @description left-rigth 형태의 마스터 디테일 그리스트 스타일 리턴
2128
- **************************************************************
2129
- * @returns {Array} left-rigth 형태의 마스터 디테일 그리스트 스타일 CSS
2130
- */
2131
- static getMasterDetailLeftRightGristStyle() {
2132
- return [
2133
- ButtonContainerStyles,
2134
- CommonGristStyles,
2135
- CommonHeaderStyles,
2136
- ScrollbarStyles,
2137
- css `
2138
- :host {
2139
- display: flex;
2140
- flex-direction: column;
2141
- overflow-x: auto;
2142
- background-color: var(--md-sys-color-background);
2143
- }
2144
-
2145
- .container {
2146
- flex: 1;
2147
- display: grid;
2148
- overflow: hidden;
2149
- grid-template-columns: 50% 50%;
2150
- }
2151
-
2152
- .container_detail {
2153
- background-color: var(--md-sys-color-background);
2154
- display: flex;
2155
- flex-direction: column;
2156
- flex: 1;
2157
- overflow-y: auto;
2158
- }
2159
-
2160
- h2 {
2161
- padding: var(--subtitle-padding);
2162
- font: var(--subtitle-font);
2163
- color: var(--subtitle-text-color);
2164
- border-bottom: var(--subtitle-border-bottom);
2165
- }
2166
-
2167
- .container_detail h2 {
2168
- margin: var(--grist-title-margin);
2169
- border: var(--grist-title-border);
2170
- font: var(--grist-title-font);
2171
- color: var(--md-sys-color-secondary);
2172
- }
2173
-
2174
- .container_detail h2 md-icon {
2175
- --md-icon-size: var(--grist-title-icon-size);
2176
- vertical-align: middle;
2177
- margin: var(--grist-title-icon-margin);
2178
- color: var(--grist-title-icon-color);
2179
- }
2180
-
2181
- h2 {
2182
- padding-bottom: var(--grist-title-with-grid-padding);
2183
- }
2184
-
2185
- ox-grist {
2186
- overflow-y: auto;
2187
- flex: 1;
2188
- }
2189
-
2190
- ox-filters-form {
2191
- flex: 1;
2192
- }
2193
- `
2194
- ];
2195
- }
2196
- /**
2197
- * @description 기본 폼 스타일 리턴
2198
- ************************************
2199
- * @returns {Array} 기본 폼 스타일 CSS 리턴
2200
- */
2201
- static getBasicFormStyles() {
2202
- return [
2203
- ScrollbarStyles,
2204
- CommonHeaderStyles,
2205
- css `
2206
- :host {
2207
- display: flex;
2208
- flex: 1;
2209
- flex-direction: column;
2210
- overflow-x: overlay;
2211
- background-color: var(--md-sys-color-background);
2212
- }
2213
-
2214
- .container {
2215
- display: grid;
2216
- grid-auto-rows: min-content;
2217
- grid-gap: var(--record-view-gap);
2218
- padding: var(--record-view-padding);
2219
- overflow-y: auto;
2220
- height: 100%;
2221
- border-bottom: var(--record-view-border-bottom);
2222
- }
2223
-
2224
- .root_container {
2225
- display: flex;
2226
- flex: 1;
2227
- flex-direction: column;
2228
- padding: var(--record-view-padding);
2229
- overflow-y: auto;
2230
- height: 100%;
2231
- border-bottom: var(--record-view-border-bottom);
2232
- }
2233
-
2234
- .content_container {
2235
- display: grid;
2236
- grid-auto-rows: min-content;
2237
- grid-gap: var(--record-view-gap);
2238
- padding: var(--record-view-padding);
2239
- }
2240
-
2241
- h2 {
2242
- border: var(--grist-title-border);
2243
- font: var(--grist-title-font);
2244
- color: var(--md-sys-color-secondary);
2245
- margin: var(--grist-title-margin);
2246
- padding-bottom: var(--grist-title-with-grid-padding);
2247
- padding-top: var(--grist-title-with-grid-padding);
2248
- border-bottom: var(--subtitle-border-bottom);
2249
- }
2250
-
2251
- h2 md-icon {
2252
- --md-icon-size: var(--grist-title-icon-size);
2253
- vertical-align: middle;
2254
- margin: var(--grist-title-icon-margin);
2255
- color: var(--grist-title-icon-color);
2256
- }
2257
-
2258
- label {
2259
- display: flex;
2260
- align-items: center;
2261
- position: relative;
2262
- text-transform: capitalize;
2263
-
2264
- padding: var(--record-view-item-padding);
2265
- border-bottom: var(--record-view-border-bottom);
2266
- font: var(--record-view-label-font);
2267
- color: var(--record-view-label-color);
2268
- }
2269
-
2270
- label md-icon {
2271
- display: none;
2272
- }
2273
-
2274
- label[editable] md-icon {
2275
- --md-icon-size: var(--record-view-label-icon-size);
2276
- display: inline-block;
2277
- opacity: 0.5;
2278
- }
2279
-
2280
- ox-grid-field {
2281
- border-top: none;
2282
- border-bottom: var(--record-view-border-bottom);
2283
- font: var(--record-view-font);
2284
- color: var(--record-view-color);
2285
- background-color: transparent;
2286
- margin-right: 10px;
2287
- }
2288
-
2289
- ox-grid-field[editing='true'] {
2290
- border-bottom: var(--record-view-edit-border-bottom);
2291
- }
2292
- `,
2293
- ...MetaUiUtil.getCustomButtonContainerStyles()
2294
- ];
2295
- }
2296
- /**
2297
- * @description 기본 탭 스타일 리턴
2298
- ************************************
2299
- * @returns {Array} 기본 탭 스타일 CSS 리턴
2300
- */
2301
- static getBasicTabStyles() {
2302
- return [
2303
- css `
2304
- :host {
2305
- display: flex;
2306
- flex: 1;
2307
- flex-direction: column;
2308
- overflow-x: overlay;
2309
- background-color: var(--md-sys-color-background);
2310
- }
2311
-
2312
- .tabs {
2313
- display: flex;
2314
- padding: 0 0 0 var(--spacing-medium);
2315
- border-bottom: 1px solid var(--md-sys-color-primary);
2316
- }
2317
-
2318
- .tab {
2319
- background-color: var(--md-sys-color-secondary-container);
2320
- color: var(--md-sys-color-on-secondary-container);
2321
- margin-top: var(--spacing-medium);
2322
- padding: var(--spacing-small) var(--spacing-large) 0 var(--spacing-large);
2323
- border-radius: 9px 9px 0 0;
2324
- border-right: 1px solid rgba(0, 0, 0, 0.4);
2325
- text-transform: capitalize;
2326
- opacity: 0.7;
2327
- font-size: 15px;
2328
- cursor: pointer;
2329
- }
2330
-
2331
- .tab[activate] {
2332
- background-color: var(--md-sys-color-primary);
2333
- color: var(--md-sys-color-on-primary);
2334
- box-shadow: 2px -2px 2px 0px rgba(0, 0, 0, 0.15);
2335
- opacity: 1;
2336
- font-weight: bold;
2337
- }
2338
-
2339
- .tab > md-icon {
2340
- width: 15px;
2341
- height: 20px;
2342
- padding: 0;
2343
- margin: 0;
2344
- --md-icon-size: 15px;
2345
- vertical-align: middle;
2346
- }
2347
-
2348
- .content-container {
2349
- flex: 1;
2350
- display: flex;
2351
- flex-direction: column;
2352
- background-color: var(--md-sys-color-surface);
2353
- border-radius: 0 var(--border-radius) var(--border-radius) var(--border-radius);
2354
- border: var(--border-dim-color);
2355
- border-width: 0 1px 1px 1px;
2356
- box-shadow: var(--box-shadow);
2357
- overflow: auto;
2358
- }
2359
-
2360
- .tab-contents {
2361
- display: flex;
2362
- flex: 1;
2363
- flex-direction: column;
2364
- overflow-x: overlay;
2365
- background-color: var(--md-sys-color-background);
2366
- }
2367
- `
2368
- ];
2369
- }
2370
- /**
2371
- * @description 그리드 설정에 버튼 이름이 buttonName인 버튼이 있는지 체크
2372
- **************************************************************
2373
- * @param {Object} buttonConfig 버튼 설정
2374
- * @param {String} buttonName 버튼 명
2375
- * @returns
2376
- */
2377
- static isButtonExist(buttonConfig, buttonName) {
2378
- let button = buttonConfig
2379
- ? buttonConfig.find(b => {
2380
- return b.name == buttonName;
2381
- })
2382
- : null;
2383
- return button ? true : false;
2384
- }
2385
- /**
2386
- * @description 그리드 설정에 버튼 이름이 buttonName인 버튼이 있는지 체크
2387
- **************************************************************
2388
- * @param {Object} gridConfig 그리드 설정
2389
- * @param {String} buttonName 버튼 명
2390
- * @returns
2391
- */
2392
- static isGridButtonExist(gridConfig, buttonName) {
2393
- let button = gridConfig && gridConfig.button
2394
- ? gridConfig.button.find(b => {
2395
- return b.name == buttonName;
2396
- })
2397
- : null;
2398
- return button ? true : false;
2399
- }
2400
- /**
2401
- * @description 그리드 설정에서 셀렉트 컬럼을 추출
2402
- *******************************************
2403
- * @param {Array} gridColumns 그리드 컬럼 설정
2404
- * @returns {String} 셀렉트 필드 정보
2405
- */
2406
- static getSelectColumns(gridColumns) {
2407
- let fields = '';
2408
- gridColumns
2409
- .filter(x => x.type != 'gutter')
2410
- .forEach(c => {
2411
- fields += '\n';
2412
- fields += ['meta-object-selector', 'object', 'resource-object'].includes(c.type)
2413
- ? `${c.name}\n{${MetaUiUtil.getObjctColumnSelectFields(c)}}`
2414
- : c.type == 'board'
2415
- ? `${c.name}\n{${'\nid\nname\nthumbnail'}}`
2416
- : c.name;
2417
- });
2418
- return fields;
2419
- }
2420
- /**
2421
- * Object 타입의 컬럼에 대한 셀렉트 필드 추출 후 리턴
2422
- ********************************************
2423
- * @param {Object} gridCol
2424
- * @returns {String} Object 타입의 필드 문자열
2425
- */
2426
- static getObjctColumnSelectFields(gridCol) {
2427
- let colStr = '';
2428
- if (ValueUtil.isNotEmpty(gridCol.record) &&
2429
- ValueUtil.isNotEmpty(gridCol.record.options) &&
2430
- ValueUtil.isNotEmpty(gridCol.record.options.select)) {
2431
- // 설정에 정의가 되어 있으면
2432
- gridCol.record.options.select.forEach(x => {
2433
- if (x.name && x.name !== '') {
2434
- if (['meta-object-selector', 'object', 'resource-object'].includes(x.type)) {
2435
- colStr += `\n${x.name} { ${MetaUiUtil.getObjctColumnSelectFields(x)} \n }`;
2436
- }
2437
- else {
2438
- colStr += `\n${x.name}`;
2439
- }
2440
- }
2441
- });
2442
- }
2443
- if (colStr == '') {
2444
- // 설정에 정의가 되어 있지 않으면 기본 id, name, description 필드
2445
- colStr += '\nid\nname\ndescription';
2446
- }
2447
- return colStr;
2448
- }
2449
- /**
2450
- * @description pageView의 그리드 정보로 기본 그리스트 Html을 생성하여 리턴
2451
- *****************************************************************
2452
- * @param {String} pageView 페이지 뷰
2453
- * @returns {HTMLElement} 그리스트 HTML
2454
- */
2455
- static getBasicGristHtml(pageView) {
2456
- let gristConfigSet = pageView.gristConfigSet;
2457
- if (!gristConfigSet) {
2458
- return html ``;
2459
- }
2460
- else {
2461
- let gristElementId = pageView.gristId ? pageView.gristId : 'ox-grist';
2462
- let gridMode = pageView.gridMode;
2463
- return html `
2464
- <ox-grist
2465
- id=${gristElementId}
2466
- .config=${gristConfigSet}
2467
- .mode=${gridMode}
2468
- auto-fetch
2469
- .personalConfigProvider=${pageView.getPagePreferenceProvider(gristElementId)}
2470
- .fetchHandler=${pageView.fetchHandler.bind(pageView)}
2471
- >
2472
- ${MetaUiUtil.getGridDetailHtml(pageView)}
2473
-
2474
- <ox-grist-personalizer slot="setting"></ox-grist-personalizer>
2475
- </ox-grist>
2476
- `;
2477
- }
2478
- }
2479
- /**
2480
- * @description pageView의 폼 정보로 기본 폼 Html을 생성하여 리턴
2481
- *********************************************************
2482
- * @param {Object} pageView 페이지 뷰
2483
- * @returns {HTMLElement} 폼을 HTML
2484
- */
2485
- static getBasicFormHtml(pageView) {
2486
- if (!pageView)
2487
- return html ``;
2488
- if (!pageView.formConfigSet)
2489
- return html ``;
2490
- let cols = pageView.formConfigSet;
2491
- let record = pageView.record || {};
2492
- let columns = cols.filter(x => x.hidden == false);
2493
- // 폼 렌더링 옵션 여부
2494
- if (ValueUtil.isEmpty(pageView.formRenderConfig)) {
2495
- return MetaUiUtil.getBasicFormHtmlNoOption(pageView, columns, record);
2496
- }
2497
- else {
2498
- return MetaUiUtil.getBasicFormHtmlOnOption(pageView, columns, record);
2499
- }
2500
- }
2501
- /**
2502
- * @description pageView의 폼 정보로 폼렌더링 옵션을 적용한 폼 Html을 생성하여 리턴
2503
- ***********************************************************************
2504
- * @param {Object} pageView 페이지 뷰
2505
- * @param {Array} columns 구성 컬럼
2506
- * @param {Object} record 표현 데이터
2507
- * @returns {HTMLElement} 폼을 HTML
2508
- */
2509
- static getBasicFormHtmlOnOption(pageView, columns, record) {
2510
- let renderConfig = pageView.formRenderConfig;
2511
- return html `
2512
- <div class="root_container">
2513
- ${renderConfig.map(config => {
2514
- let renderCols = [];
2515
- config.column_list.forEach(x => {
2516
- let columnInfo = columns.filter(col => x == col.name) || [];
2517
- if (columnInfo.length > 0) {
2518
- renderCols.push(columnInfo[0]);
2519
- }
2520
- });
2521
- // 그리드 구분 스타일
2522
- let divStyle = 'height:auto;grid-template-columns:';
2523
- for (let i = 0; i < config.column; i++) {
2524
- divStyle += ' 1fr 2fr';
2525
- }
2526
- divStyle += ';';
2527
- let rowIndex = 0;
2528
- return html `
2529
- <h2><md-icon>list_alt</md-icon>${TermsUtil.tTitle(config.display)}</h2>
2530
- <div id="content_container" class="content_container" style="${divStyle}">
2531
- ${renderCols.map(column => {
2532
- let { editable = false, mandatory = false } = column.record;
2533
- let dirtyFields = record['__dirtyfields__'] || {};
2534
- return html `
2535
- <label ?editable=${editable}
2536
- ><span>${mandatory ? '*' : ''}${column.header_txt}</span>
2537
- ${editable ? html `<md-icon>edit</md-icon>` : ''}
2538
- </label>
2539
- <ox-grid-field
2540
- .rowIndex=${rowIndex}
2541
- .column=${column}
2542
- .record=${record}
2543
- .value=${record[column.name]}
2544
- ?dirty=${!!dirtyFields[column.name]}
2545
- ></ox-grid-field>
2546
- `;
2547
- })}
2548
- </div>
2549
- `;
2550
- })}
2551
- </div>
2552
- ${pageView.isPage ? html `` : MetaUiUtil.getButtonContainer(pageView)}
2553
- `;
2554
- }
2555
- /**
2556
- * @description pageView의 폼 정보로 기본 폼 Html을 생성하여 리턴
2557
- *********************************************************
2558
- * @param {Object} pageView 페이지 뷰
2559
- * @param {Array} columns 구성 컬럼
2560
- * @param {Object} record 표현 데이터
2561
- * @returns {HTMLElement} 폼을 HTML
2562
- */
2563
- static getBasicFormHtmlNoOption(pageView, columns, record) {
2564
- // 그리드 구분 스타일
2565
- let divStyle = 'grid-template-columns:';
2566
- if (!pageView.column || pageView.column == 0) {
2567
- pageView.column = 1;
2568
- }
2569
- pageView.column = parseInt((pageView.etcConfig || {}).default_form_column || pageView.column);
2570
- for (let i = 0; i < pageView.column; i++) {
2571
- divStyle += ' 1fr 2fr';
2572
- }
2573
- divStyle += ';';
2574
- let rowIndex = 0;
2575
- return html `
2576
- <div id="container" class="container" style="${divStyle}">
2577
- ${columns.map(column => {
2578
- let { editable = false, mandatory = false } = column.record;
2579
- let dirtyFields = record['__dirtyfields__'] || {};
2580
- return html `
2581
- <label ?editable=${editable}
2582
- ><span>${mandatory ? '*' : ''}${column.header_txt}</span>
2583
- ${editable ? html `<md-icon>edit</md-icon>` : ''}
2584
- </label>
2585
- <ox-grid-field
2586
- .rowIndex=${rowIndex}
2587
- .column=${column}
2588
- .record=${record}
2589
- .value=${record[column.name]}
2590
- ?dirty=${!!dirtyFields[column.name]}
2591
- ></ox-grid-field>
2592
- `;
2593
- })}
2594
- </div>
2595
- ${pageView.isPage ? html `` : MetaUiUtil.getButtonContainer(pageView)}
2596
- `;
2597
- }
2598
- /**
2599
- * @description pageView의 탭 정보로 기본 탭 Html을 생성하여 리턴
2600
- **********************************************************
2601
- * @param {Object} pageView 페이지 뷰
2602
- * @returns {HTMLElement} 탭 HTML
2603
- */
2604
- static getBasicTabHtml(pageView) {
2605
- if (!pageView)
2606
- return html ``;
2607
- if (!pageView.tabRenderConfig)
2608
- return html ``;
2609
- let tabs = pageView.tabRenderConfig;
2610
- if (!pageView.currentTabKey)
2611
- pageView.currentTabKey = tabs[0]?.name || undefined;
2612
- return html `
2613
- <div class="tabs">
2614
- ${tabs.map(tab => {
2615
- let label = TermsUtil.tLabel(tab.display);
2616
- let key = tab.name;
2617
- return html `
2618
- <div
2619
- class="tab"
2620
- ?activate="${key === pageView.currentTabKey}"
2621
- @click="${() => (pageView.currentTabKey = key)}"
2622
- >
2623
- ${tab.icon ? html `<md-icon>${tab.icon}</md-icon>` : html ``}
2624
- <span>${label}</span>
2625
- </div>
2626
- `;
2627
- })}
2628
- </div>
2629
- <div class="content-container">
2630
- ${tabs.map(tab => {
2631
- let displayStyle = 'display:none';
2632
- let key = tab.name;
2633
- if (key == pageView.currentTabKey) {
2634
- displayStyle = 'display:flex';
2635
- }
2636
- return html `
2637
- <div class="tab-contents" style="${displayStyle}">${MetaUiUtil.getBasicTabContent(pageView, tab)}</div>
2638
- `;
2639
- })}
2640
- </div>
2641
- `;
2642
- }
2643
- /**
2644
- * @description Grist 탭 Html을 생성하여 리턴
2645
- *****************************************
2646
- * @param {Object} pageView 페이지 뷰
2647
- * @returns {HTMLElement} 탭 HTML
2648
- */
2649
- static getGristTabHtml(pageView) {
2650
- let type = (pageView.etcConfig || {}).master_detail_type || 'top_bottom';
2651
- let size = (pageView.etcConfig || {}).master_detail_size || '50% 50%';
2652
- let layoutContainerStyle = type == 'left_right' ? `grid-template-columns:${size};` : `grid-template-rows:${size};`;
2653
- let currentRouting = pageView.isPage ? UiUtil.currentRouting() : pageView.route_name;
2654
- return html `
2655
- ${pageView.useMasterFilterForm == false
2656
- ? html ``
2657
- : html `
2658
- <div slot="headroom" class="header">
2659
- <div class="filters">
2660
- <ox-filters-form-base
2661
- id="ox-filters-form"
2662
- .filters=${pageView.searchFields || []}
2663
- .value=${pageView.searchFieldValues || []}
2664
- @filters-change=${e => {
2665
- pageView.grist?.fetch();
2666
- }}
2667
- ></ox-filters-form-base>
2668
- </div>
2669
- </div>
2670
- `}
2671
- <div id="container" class="container" style="${layoutContainerStyle}">
2672
- <div class="container_detail">
2673
- ${MetaApi.getBasicGristHtml(pageView)} ${MetaUiUtil.getButtonContainer(pageView)}
2674
- </div>
2675
- <div class="container_detail">
2676
- ${pageView.is_activity === true
2677
- ? html `${pageView.is_readonly === true
2678
- ? html `<meta-tab-element
2679
- id="detail"
2680
- route_name="${currentRouting}"
2681
- .activityDataSet=${(pageView.activityDataSet || {}).detail}
2682
- is_readonly="true"
2683
- is_activity="true"
2684
- is_detail="true"
2685
- >
2686
- </meta-tab-element>`
2687
- : html `<meta-tab-element
2688
- id="detail"
2689
- route_name="${currentRouting}"
2690
- .activityDataSet=${(pageView.activityDataSet || {}).detail}
2691
- is_activity="true"
2692
- is_detail="true"
2693
- >
2694
- </meta-tab-element>`}`
2695
- : html `${pageView.is_readonly === true
2696
- ? html `<meta-tab-element
2697
- id="detail"
2698
- route_name="${currentRouting}"
2699
- is_readonly="true"
2700
- is_detail="true"
2701
- ></meta-tab-element>`
2702
- : html `<meta-tab-element
2703
- id="detail"
2704
- route_name="${currentRouting}"
2705
- is_detail="true"
2706
- ></meta-tab-element>`}`}
2707
- </div>
2708
- </div>
2709
- `;
2710
- }
2711
- /**
2712
- * @description Tab Detail Html을 생성하여 리턴
2713
- ********************************************
2714
- * @param {Object} pageView 페이지 뷰
2715
- * @returns {HTMLElement} 탭 HTML
2716
- */
2717
- static getTabDetailHtml(pageView) {
2718
- let type = pageView.etcConfig.master_detail_type || 'top_bottom';
2719
- let size = pageView.etcConfig.master_detail_size || '50% 50%';
2720
- let detailInfoTxt = pageView.etcConfig.master_detail_element;
2721
- let detailInfo = JSON.parse(detailInfoTxt || '{}');
2722
- let layoutContainerStyle = type == 'left_right' ? `grid-template-columns:${size};` : `grid-template-rows:${size};`;
2723
- MetaUiUtil.createMasterElement(pageView);
2724
- MetaUiUtil.createDetailElement(pageView, detailInfo);
2725
- return html `
2726
- ${pageView.useMasterFilterForm == false
2727
- ? html ``
2728
- : html `
2729
- <div slot="headroom" class="header">
2730
- <div class="filters">
2731
- <ox-filters-form-base
2732
- id="ox-filters-form"
2733
- .filters=${pageView.searchFields || []}
2734
- .value=${pageView.searchFieldValues || []}
2735
- @filters-change=${e => {
2736
- pageView.fetch();
2737
- }}
2738
- ></ox-filters-form-base>
2739
- </div>
2740
- </div>
2741
- `}
2742
- <div id="container" class="container" style="${layoutContainerStyle}">
2743
- <div class="container_detail">${pageView.masterElement}</div>
2744
- <div class="container_detail">
2745
- ${detailInfo.tagname == '' || detailInfo.tagname == 'meta-tab-element'
2746
- ? html ``
2747
- : html `<h2 id="detail_title"><md-icon>list_alt</md-icon>${TermsUtil.tTitle(`${detailInfo.display}`)}</h2>`}
2748
- ${pageView.detailElement}
2749
- </div>
2750
- </div>
2751
- `;
2752
- }
2753
- /**
2754
- * @description 메인 탭 Html을 생성하여 리턴
2755
- ***************************************
2756
- * @param {Object} pageView 페이지 뷰
2757
- * @returns {HTMLElement} 탭 HTML
2758
- */
2759
- static getMainTabHtml(pageView) {
2760
- MetaUiUtil.createMasterElement(pageView);
2761
- return html `
2762
- ${pageView.useMasterFilterForm == false
2763
- ? html ``
2764
- : html `
2765
- <div slot="headroom" class="header">
2766
- <div class="filters">
2767
- <ox-filters-form-base
2768
- id="ox-filters-form"
2769
- .filters=${pageView.searchFields || []}
2770
- .value=${pageView.searchFieldValues || []}
2771
- @filters-change=${e => {
2772
- pageView.fetch();
2773
- }}
2774
- ></ox-filters-form-base>
2775
- </div>
2776
- </div>
2777
- `}
2778
- <div id="container" class="container">${pageView.masterElement}</div>
2779
- `;
2780
- }
2781
- /**
2782
- * @description 마스터 디테일 Html을 생성하여 리턴
2783
- ********************************************
2784
- * @param {Object} pageView 페이지 뷰
2785
- * @returns {HTMLElement} 탭 HTML
2786
- */
2787
- static getMasterDetailHtml(pageView) {
2788
- let type = pageView.etcConfig.master_detail_type || 'top_bottom';
2789
- let size = pageView.etcConfig.master_detail_size || '50% 50%';
2790
- let masterDisplay = (pageView.masterOption || {}).display;
2791
- let detailInfoTxt = pageView.etcConfig.master_detail_element;
2792
- let detailInfo = JSON.parse(detailInfoTxt || '{}');
2793
- let layoutContainerStyle = type == 'left_right' ? `grid-template-columns:${size};` : `grid-template-rows:${size};`;
2794
- MetaUiUtil.createDetailElement(pageView, detailInfo);
2795
- return html `
2796
- ${pageView.useMasterFilterForm == false
2797
- ? html ``
2798
- : html `
2799
- <div slot="headroom" class="header">
2800
- <div class="filters">
2801
- <ox-filters-form-base
2802
- id="ox-filters-form"
2803
- .filters=${pageView.searchFields || []}
2804
- .value=${pageView.searchFieldValues || []}
2805
- @filters-change=${e => {
2806
- pageView.grist?.fetch();
2807
- }}
2808
- ></ox-filters-form-base>
2809
- </div>
2810
- </div>
2811
- `}
2812
- <div id="container" class="container" style="${layoutContainerStyle}">
2813
- <div class="container_detail">
2814
- ${pageView.useFilterForm
2815
- ? masterDisplay
2816
- ? html `<h2 id="detail_title"><md-icon>list_alt</md-icon>${TermsUtil.tTitle(`${masterDisplay}`)}</h2>`
2817
- : html ``
2818
- : html ``}
2819
- ${MetaApi.getBasicGristHtml(pageView)} ${MetaUiUtil.getButtonContainer(pageView)}
2820
- </div>
2821
- <div class="container_detail">
2822
- ${detailInfo.tagname == '' || detailInfo.tagname == 'meta-tab-element'
2823
- ? html ``
2824
- : detailInfo.display
2825
- ? html `<h2 id="detail_title"><md-icon>list_alt</md-icon>${TermsUtil.tTitle(`${detailInfo.display}`)}</h2>`
2826
- : html ``}
2827
- ${pageView.detailElement}
2828
- </div>
2829
- </div>
2830
- `;
2831
- }
2832
- /**
2833
- * @descrtiption 디테일 엘리먼트 렌더링
2834
- **********************************
2835
- * @param {Object} pageView
2836
- * @param {Object} detailInfo
2837
- * @returns htmlElement
2838
- */
2839
- static createDetailElement(pageView, detailInfo) {
2840
- if (!pageView.detailElement) {
2841
- let name = detailInfo.name ? detailInfo.name : 'detail';
2842
- let elementTxt = `<${detailInfo.tagname} id="${name}" name="${name}" route_name="${detailInfo.routing}" ${pageView.is_activity === true ? 'is_activity=true' : ''} ${pageView.is_readonly === true ? 'is_readonly=true' : ''} is_detail=true style="flex:1;"></${detailInfo.tagname}>`;
2843
- pageView.detailElement = UiUtil.htmlToElement(elementTxt);
2844
- pageView.detailElement.activityDataSet = (pageView.activityDataSet || {}).detail;
2845
- if (pageView.tagName.toLowerCase().startsWith('meta-tab-detail-')) {
2846
- pageView.detailElement.rootElement = pageView;
2847
- }
2848
- }
2849
- }
2850
- /**
2851
- * @descrtiption 마스터 엘리먼트 렌더링
2852
- **********************************
2853
- * @param {Object} pageView
2854
- * @returns {HTMLElement} 마스터 엘리먼트 HTML
2855
- */
2856
- static createMasterElement(pageView) {
2857
- if (!pageView.masterElement && pageView.filterForm) {
2858
- let name = 'master';
2859
- let elementTxt = `<meta-tab-element id="${name}" name="${name}" route_name="${pageView.currentRouting}" ${pageView.is_activity === true ? 'is_activity=true' : ''} ${pageView.is_readonly === true ? 'is_readonly=true' : ''} is_detail=true style="flex:1;"></meta-tab-element>`;
2860
- pageView.masterElement = UiUtil.htmlToElement(elementTxt);
2861
- pageView.masterElement.activityDataSet = (pageView.activityDataSet || {}).master;
2862
- pageView.masterElement.includeMainList = true;
2863
- pageView.masterElement.mainFilterForm = pageView.filterForm;
2864
- pageView.masterElement.rootElement = pageView;
2865
- }
2866
- }
2867
- /**
2868
- * @descrtiption 기본 탭 컨텐트 리턴
2869
- ********************************
2870
- * @param {Object} pageView
2871
- * @param {Object} tabConfig
2872
- * @returns {HTMLElement} 탭 컨텐트 HTML
2873
- */
2874
- static getBasicTabContent(pageView, tabConfig) {
2875
- if (!pageView.tabElements) {
2876
- pageView.tabElements = {};
2877
- }
2878
- if (Object.keys(pageView.tabElements).filter(key => key == tabConfig.name).length > 0) {
2879
- return pageView.tabElements[tabConfig.name];
2880
- }
2881
- let htmlText = `<${tabConfig.tagname} id='${tabConfig.name}' route_name='${tabConfig.menu}' style="flex:1;" ${pageView.is_activity === true ? 'is_activity=true' : ''} ${pageView.is_readonly === true ? 'is_readonly=true' : ''} is_detail=true></${tabConfig.tagname}>`;
2882
- let tabElement = UiUtil.htmlToElement(htmlText);
2883
- tabElement.activityDataSet = (pageView.activityDataSet || {})[tabConfig.name];
2884
- if (pageView.parent_id) {
2885
- tabElement.parent_id = pageView.parent_id;
2886
- }
2887
- if (pageView.rootElement) {
2888
- tabElement.rootElement = pageView.rootElement;
2889
- }
2890
- else {
2891
- tabElement.detailElement = pageView;
2892
- }
2893
- if (tabConfig.filter_from === false) {
2894
- tabElement.use_filter_form = false;
2895
- }
2896
- if (tabConfig.main_filter_form) {
2897
- tabElement.mainFilterForm = tabConfig.main_filter_form;
2898
- }
2899
- pageView.tabElements[tabConfig.name] = tabElement;
2900
- return tabElement;
2901
- }
2902
- /**
2903
- * @description 그리드 상세 내용 HTML 생성
2904
- **************************************
2905
- * @param {Object} pageView 페이지 뷰
2906
- * @returns {HTMLElement} 그리드 상세 내용 HTML
2907
- */
2908
- static getGridDetailHtml(pageView) {
2909
- let useAddButton = pageView.useButtonAdd;
2910
- let useFilterForm = pageView.useFilterForm;
2911
- let useFilterAddButton = JSON.parse((pageView.etcConfig || {}).use_filter_add_button || 'false');
2912
- let recordCreationCallback = pageView.recordCreationCallback;
2913
- let useSortButton = JSON.parse((pageView.etcConfig || {}).use_grid_sort_button || 'false');
2914
- useFilterAddButton = useFilterAddButton === true && useAddButton === true;
2915
- return html `
2916
- ${useFilterForm
2917
- ? html `
2918
- <div slot="headroom" class="header">
2919
- <div class="filters">
2920
- <ox-filters-form></ox-filters-form>
2921
- ${useSortButton
2922
- ? html `
2923
- <div id="sorters">
2924
- <md-icon
2925
- @click=${e => {
2926
- const target = e.currentTarget;
2927
- target.nextElementSibling.open({
2928
- right: 0,
2929
- top: target.offsetTop + target.offsetHeight
2930
- });
2931
- }}
2932
- >sort</md-icon
2933
- >
2934
- <ox-popup id="sorter-control">
2935
- <ox-sorters-control></ox-sorters-control>
2936
- </ox-popup>
2937
- </div>
2938
- `
2939
- : nothing}
2940
- ${MetaUiUtil.getGridViewOption(pageView)}
2941
- <ox-record-creator id="add" ?hidden="${!useFilterAddButton}" .callback=${recordCreationCallback}>
2942
- <button style="display: flex; justify-content: center">
2943
- <md-icon>add</md-icon>
2944
- </button>
2945
- </ox-record-creator>
2946
- </div>
2947
- </div>
2948
- `
2949
- : nothing}
2950
- `;
2951
- }
2952
- /**
2953
- * @description 그리드 보기 옵션 버튼을 그린다.
2954
- ****************************************
2955
- * @param {Object} pageView 페이지 뷰
2956
- * @return {HTMLElement} 그리드 뷰 옵션 HTML
2957
- */
2958
- static getGridViewOption(pageView) {
2959
- if (ValueUtil.isEmpty(pageView.gridViewOptions) || pageView.gridViewOptions.length == 1) {
2960
- return html ``;
2961
- }
2962
- else {
2963
- return html `
2964
- <div id="modes">
2965
- ${pageView.gridViewOptions.includes('GRID')
2966
- ? html `<md-icon @click="${() => (pageView.gridMode = 'GRID')}" ?active="${pageView.gridMode == 'GRID'}"
2967
- >grid_on</md-icon
2968
- >`
2969
- : ``}
2970
- ${pageView.gridViewOptions.includes('LIST')
2971
- ? html `<md-icon @click="${() => (pageView.gridMode = 'LIST')}" ?active="${pageView.gridMode == 'LIST'}"
2972
- >format_list_bulleted</md-icon
2973
- >`
2974
- : ``}
2975
- ${pageView.gridViewOptions.includes('CARD')
2976
- ? html `<md-icon @click="${() => (pageView.gridMode = 'CARD')}" ?active="${pageView.gridMode == 'CARD'}"
2977
- >apps</md-icon
2978
- >`
2979
- : ``}
2980
- </div>
2981
- `;
2982
- }
2983
- }
2984
- /**
2985
- * @description 버튼 컨테이너 엘리먼트 생성
2986
- *************************************
2987
- * @param {Object} pageView
2988
- * @returns {HTMLElement}
2989
- */
2990
- static getButtonContainer(pageView) {
2991
- return html `<div class="button-container">${MetaUiUtil.getContainerButtons(pageView)}</div>`;
2992
- }
2993
- }
2994
- //# sourceMappingURL=meta-ui-util.js.map