@mediusinc/mng-commons 0.2.0 → 0.2.1-rc

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 (328) hide show
  1. package/.browserslistrc +16 -0
  2. package/karma.conf.js +51 -0
  3. package/ng-package.json +14 -0
  4. package/package.json +3 -24
  5. package/src/lib/api/models/builders/query-param.builder.ts +54 -0
  6. package/src/lib/api/models/filter-match-type.model.ts +25 -0
  7. package/src/lib/api/models/filter-param.model.ts +59 -0
  8. package/{lib/api/models/index.d.ts → src/lib/api/models/index.ts} +10 -8
  9. package/src/lib/api/models/mappers.ts +18 -0
  10. package/{lib/api/models/filter-match-type.model.d.ts → src/lib/api/models/query-mode.model.ts} +18 -23
  11. package/src/lib/api/models/query-param.model.ts +99 -0
  12. package/src/lib/api/models/query-result.model.ts +77 -0
  13. package/{lib/api/models/serialization.model.d.ts → src/lib/api/models/serialization.model.ts} +9 -8
  14. package/src/lib/api/services/crud-api.abstract.service.ts +113 -0
  15. package/{lib/api/services/index.d.ts → src/lib/api/services/index.ts} +1 -1
  16. package/{lib/api/utils/index.d.ts → src/lib/api/utils/index.ts} +2 -2
  17. package/src/lib/api/utils/medius-rest.util.ts +146 -0
  18. package/src/lib/api/utils/object-serializer.util.ts +227 -0
  19. package/src/lib/components/action/action.component.html +30 -0
  20. package/src/lib/components/action/action.component.ts +77 -0
  21. package/src/lib/components/action/dialog/action-dialog.component.html +26 -0
  22. package/src/lib/components/action/dialog/action-dialog.component.ts +171 -0
  23. package/{lib/components/action/index.d.ts → src/lib/components/action/index.ts} +3 -3
  24. package/{lib/components/action/models/action-confirmation-service.model.d.ts → src/lib/components/action/models/action-confirmation-service.model.ts} +7 -6
  25. package/src/lib/components/action/models/action-execution.model.ts +81 -0
  26. package/{lib/components/action/models/index.d.ts → src/lib/components/action/models/index.ts} +2 -2
  27. package/src/lib/components/action/route/action-route.component.html +1 -0
  28. package/src/lib/components/action/route/action-route.component.ts +159 -0
  29. package/src/lib/components/form/autocomplete/autocomplete.component.html +16 -0
  30. package/src/lib/components/form/autocomplete/autocomplete.component.ts +113 -0
  31. package/src/lib/components/form/dropdown/dropdown.component.html +29 -0
  32. package/src/lib/components/form/dropdown/dropdown.component.ts +109 -0
  33. package/src/lib/components/form/editor/form-editor.component.html +5 -0
  34. package/src/lib/components/form/editor/form-editor.component.ts +149 -0
  35. package/src/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.html +7 -0
  36. package/src/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.ts +21 -0
  37. package/src/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.html +9 -0
  38. package/src/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.ts +22 -0
  39. package/src/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.html +8 -0
  40. package/src/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.ts +10 -0
  41. package/src/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.html +56 -0
  42. package/src/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.ts +22 -0
  43. package/src/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.html +13 -0
  44. package/src/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.scss +4 -0
  45. package/src/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.ts +114 -0
  46. package/src/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.html +37 -0
  47. package/src/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.ts +133 -0
  48. package/src/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.html +10 -0
  49. package/src/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.ts +10 -0
  50. package/{lib/components/form/formly/fields/index.d.ts → src/lib/components/form/formly/fields/index.ts} +7 -7
  51. package/src/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.html +7 -0
  52. package/src/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.ts +13 -0
  53. package/src/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.html +6 -0
  54. package/src/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.ts +13 -0
  55. package/{lib/components/form/formly/wrappers/index.d.ts → src/lib/components/form/formly/wrappers/index.ts} +2 -2
  56. package/{lib/components/form/index.d.ts → src/lib/components/form/index.ts} +3 -3
  57. package/src/lib/components/form/models/form-editor.event.ts +7 -0
  58. package/{lib/components/form/models/index.d.ts → src/lib/components/form/models/index.ts} +1 -1
  59. package/src/lib/components/layout/breadcrumb.component.html +5 -0
  60. package/src/lib/components/layout/breadcrumb.component.ts +12 -0
  61. package/src/lib/components/layout/footer.component.html +7 -0
  62. package/src/lib/components/layout/footer.component.ts +15 -0
  63. package/{lib/components/layout/index.d.ts → src/lib/components/layout/index.ts} +6 -6
  64. package/src/lib/components/layout/main-layout.component.html +26 -0
  65. package/src/lib/components/layout/main-layout.component.ts +54 -0
  66. package/src/lib/components/layout/menu-item.component.html +41 -0
  67. package/src/lib/components/layout/menu-item.component.ts +170 -0
  68. package/src/lib/components/layout/menu.component.html +27 -0
  69. package/src/lib/components/layout/menu.component.ts +17 -0
  70. package/{lib/components/layout/services/index.d.ts → src/lib/components/layout/services/index.ts} +1 -1
  71. package/src/lib/components/layout/services/main-layout.component.service.ts +231 -0
  72. package/src/lib/components/layout/topbar.component.html +38 -0
  73. package/src/lib/components/layout/topbar.component.ts +62 -0
  74. package/{lib/components/tableview/index.d.ts → src/lib/components/tableview/index.ts} +5 -5
  75. package/{lib/components/tableview/models/index.d.ts → src/lib/components/tableview/models/index.ts} +1 -1
  76. package/src/lib/components/tableview/models/table.event.ts +22 -0
  77. package/src/lib/components/tableview/route/tableview-route.abstract.component.ts +31 -0
  78. package/{lib/components/tableview/services/index.d.ts → src/lib/components/tableview/services/index.ts} +1 -1
  79. package/src/lib/components/tableview/services/tableview.component.service.ts +22 -0
  80. package/src/lib/components/tableview/table/column-filter/column-filter.component.html +36 -0
  81. package/src/lib/components/tableview/table/column-filter/column-filter.component.ts +70 -0
  82. package/src/lib/components/tableview/table/column-value/column-value.component.html +14 -0
  83. package/src/lib/components/tableview/table/column-value/column-value.component.ts +19 -0
  84. package/src/lib/components/tableview/table/table.component.html +110 -0
  85. package/src/lib/components/tableview/table/table.component.ts +327 -0
  86. package/src/lib/components/tableview/tableview.component.html +37 -0
  87. package/src/lib/components/tableview/tableview.component.ts +78 -0
  88. package/src/lib/config/formly.config.ts +154 -0
  89. package/{lib/config/index.d.ts → src/lib/config/index.ts} +1 -1
  90. package/{lib/config/models/index.d.ts → src/lib/config/models/index.ts} +1 -1
  91. package/{lib/config/models/mng-config.model.d.ts → src/lib/config/models/mng-config.model.ts} +35 -34
  92. package/src/lib/data-providers/base.data-provider.ts +42 -0
  93. package/src/lib/data-providers/editor.data-provider.ts +60 -0
  94. package/{lib/data-providers/index.d.ts → src/lib/data-providers/index.ts} +5 -5
  95. package/src/lib/data-providers/lookup.data-provider.ts +29 -0
  96. package/{lib/data-providers/table.data-provider.d.ts → src/lib/data-providers/table.data-provider.ts} +8 -6
  97. package/src/lib/data-providers/tableview.data-provider.ts +29 -0
  98. package/src/lib/descriptors/action.descriptor.ts +439 -0
  99. package/src/lib/descriptors/editor.descriptor.ts +880 -0
  100. package/src/lib/descriptors/field.validator.ts +35 -0
  101. package/{lib/descriptors/index.d.ts → src/lib/descriptors/index.ts} +7 -7
  102. package/{lib/descriptors/lookup.descriptor.d.ts → src/lib/descriptors/lookup.descriptor.ts} +20 -17
  103. package/src/lib/descriptors/model.descriptor.ts +47 -0
  104. package/src/lib/descriptors/table.descriptor.ts +514 -0
  105. package/src/lib/descriptors/tableview.descriptor.ts +180 -0
  106. package/src/lib/directives/component.directive.ts +18 -0
  107. package/{lib/directives/index.d.ts → src/lib/directives/index.ts} +2 -2
  108. package/src/lib/directives/template.directive.ts +24 -0
  109. package/src/lib/mng-commons.module.ts +240 -0
  110. package/{lib/models/index.d.ts → src/lib/models/index.ts} +2 -2
  111. package/src/lib/models/router.model.ts +16 -0
  112. package/{lib/models/user.model.d.ts → src/lib/models/user.model.ts} +9 -8
  113. package/src/lib/pipes/boolean.pipe.ts +17 -0
  114. package/{lib/pipes/index.d.ts → src/lib/pipes/index.ts} +2 -2
  115. package/src/lib/pipes/property-path.pipe.ts +30 -0
  116. package/src/lib/services/action.service.ts +310 -0
  117. package/src/lib/services/commons.service.ts +407 -0
  118. package/src/lib/services/configuration.service.ts +98 -0
  119. package/{lib/services/index.d.ts → src/lib/services/index.ts} +4 -4
  120. package/src/lib/services/navigation.service.ts +42 -0
  121. package/src/lib/services/providers/commons-init.provider.ts +5 -0
  122. package/src/lib/services/providers/config-service.provider.ts +22 -0
  123. package/src/lib/services/providers/formly-config.provider.ts +39 -0
  124. package/{lib/services/providers/index.d.ts → src/lib/services/providers/index.ts} +3 -3
  125. package/src/lib/services/tokens/browser-storage.token.ts +9 -0
  126. package/{lib/services/tokens/index.d.ts → src/lib/services/tokens/index.ts} +2 -2
  127. package/src/lib/services/tokens/module-config.token.ts +5 -0
  128. package/{lib/types/index.d.ts → src/lib/types/index.ts} +2 -2
  129. package/src/lib/types/type.decorator.ts +7 -0
  130. package/src/lib/types/type.model.ts +12 -0
  131. package/src/lib/utils/editor-formly.util.ts +193 -0
  132. package/src/lib/utils/i18n.util.ts +148 -0
  133. package/{lib/utils/index.d.ts → src/lib/utils/index.ts} +5 -5
  134. package/src/lib/utils/model.util.ts +66 -0
  135. package/src/lib/utils/toast.util.ts +49 -0
  136. package/src/lib/utils/type.util.ts +44 -0
  137. package/{public-api.d.ts → src/public-api.ts} +42 -25
  138. package/src/test.ts +26 -0
  139. package/tsconfig.lib.json +15 -0
  140. package/tsconfig.lib.prod.json +10 -0
  141. package/tsconfig.spec.json +17 -0
  142. package/esm2020/lib/api/models/builders/query-param.builder.mjs +0 -48
  143. package/esm2020/lib/api/models/filter-match-type.model.mjs +0 -26
  144. package/esm2020/lib/api/models/filter-param.model.mjs +0 -46
  145. package/esm2020/lib/api/models/index.mjs +0 -9
  146. package/esm2020/lib/api/models/mappers.mjs +0 -17
  147. package/esm2020/lib/api/models/query-mode.model.mjs +0 -19
  148. package/esm2020/lib/api/models/query-param.model.mjs +0 -69
  149. package/esm2020/lib/api/models/query-result.model.mjs +0 -45
  150. package/esm2020/lib/api/models/serialization.model.mjs +0 -2
  151. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +0 -72
  152. package/esm2020/lib/api/services/index.mjs +0 -2
  153. package/esm2020/lib/api/utils/index.mjs +0 -3
  154. package/esm2020/lib/api/utils/medius-rest.util.mjs +0 -122
  155. package/esm2020/lib/api/utils/object-serializer.util.mjs +0 -226
  156. package/esm2020/lib/components/action/action.component.mjs +0 -65
  157. package/esm2020/lib/components/action/dialog/action-dialog.component.mjs +0 -148
  158. package/esm2020/lib/components/action/index.mjs +0 -4
  159. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +0 -2
  160. package/esm2020/lib/components/action/models/action-execution.model.mjs +0 -58
  161. package/esm2020/lib/components/action/models/index.mjs +0 -3
  162. package/esm2020/lib/components/action/route/action-route.component.mjs +0 -144
  163. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +0 -114
  164. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +0 -113
  165. package/esm2020/lib/components/form/editor/form-editor.component.mjs +0 -141
  166. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +0 -19
  167. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +0 -19
  168. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +0 -16
  169. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +0 -26
  170. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +0 -109
  171. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +0 -122
  172. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -17
  173. package/esm2020/lib/components/form/formly/fields/index.mjs +0 -8
  174. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +0 -17
  175. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +0 -16
  176. package/esm2020/lib/components/form/formly/wrappers/index.mjs +0 -3
  177. package/esm2020/lib/components/form/index.mjs +0 -4
  178. package/esm2020/lib/components/form/models/form-editor.event.mjs +0 -7
  179. package/esm2020/lib/components/form/models/index.mjs +0 -2
  180. package/esm2020/lib/components/layout/breadcrumb.component.mjs +0 -17
  181. package/esm2020/lib/components/layout/footer.component.mjs +0 -17
  182. package/esm2020/lib/components/layout/index.mjs +0 -7
  183. package/esm2020/lib/components/layout/main-layout.component.mjs +0 -54
  184. package/esm2020/lib/components/layout/menu-item.component.mjs +0 -173
  185. package/esm2020/lib/components/layout/menu.component.mjs +0 -20
  186. package/esm2020/lib/components/layout/services/index.mjs +0 -2
  187. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +0 -190
  188. package/esm2020/lib/components/layout/topbar.component.mjs +0 -59
  189. package/esm2020/lib/components/tableview/index.mjs +0 -6
  190. package/esm2020/lib/components/tableview/models/index.mjs +0 -2
  191. package/esm2020/lib/components/tableview/models/table.event.mjs +0 -16
  192. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +0 -24
  193. package/esm2020/lib/components/tableview/services/index.mjs +0 -2
  194. package/esm2020/lib/components/tableview/services/tableview.component.service.mjs +0 -17
  195. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +0 -74
  196. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +0 -25
  197. package/esm2020/lib/components/tableview/table/table.component.mjs +0 -307
  198. package/esm2020/lib/components/tableview/tableview.component.mjs +0 -82
  199. package/esm2020/lib/config/formly.config.mjs +0 -136
  200. package/esm2020/lib/config/index.mjs +0 -2
  201. package/esm2020/lib/config/models/index.mjs +0 -2
  202. package/esm2020/lib/config/models/mng-config.model.mjs +0 -2
  203. package/esm2020/lib/data-providers/base.data-provider.mjs +0 -24
  204. package/esm2020/lib/data-providers/editor.data-provider.mjs +0 -37
  205. package/esm2020/lib/data-providers/index.mjs +0 -6
  206. package/esm2020/lib/data-providers/lookup.data-provider.mjs +0 -16
  207. package/esm2020/lib/data-providers/table.data-provider.mjs +0 -2
  208. package/esm2020/lib/data-providers/tableview.data-provider.mjs +0 -17
  209. package/esm2020/lib/descriptors/action.descriptor.mjs +0 -332
  210. package/esm2020/lib/descriptors/editor.descriptor.mjs +0 -670
  211. package/esm2020/lib/descriptors/field.validator.mjs +0 -21
  212. package/esm2020/lib/descriptors/index.mjs +0 -8
  213. package/esm2020/lib/descriptors/lookup.descriptor.mjs +0 -2
  214. package/esm2020/lib/descriptors/model.descriptor.mjs +0 -34
  215. package/esm2020/lib/descriptors/table.descriptor.mjs +0 -401
  216. package/esm2020/lib/descriptors/tableview.descriptor.mjs +0 -131
  217. package/esm2020/lib/directives/component.directive.mjs +0 -23
  218. package/esm2020/lib/directives/index.mjs +0 -3
  219. package/esm2020/lib/directives/template.directive.mjs +0 -29
  220. package/esm2020/lib/mng-commons.module.mjs +0 -410
  221. package/esm2020/lib/models/index.mjs +0 -3
  222. package/esm2020/lib/models/router.model.mjs +0 -2
  223. package/esm2020/lib/models/user.model.mjs +0 -2
  224. package/esm2020/lib/pipes/boolean.pipe.mjs +0 -22
  225. package/esm2020/lib/pipes/index.mjs +0 -3
  226. package/esm2020/lib/pipes/property-path.pipe.mjs +0 -36
  227. package/esm2020/lib/services/action.service.mjs +0 -269
  228. package/esm2020/lib/services/commons.service.mjs +0 -353
  229. package/esm2020/lib/services/configuration.service.mjs +0 -78
  230. package/esm2020/lib/services/index.mjs +0 -5
  231. package/esm2020/lib/services/navigation.service.mjs +0 -48
  232. package/esm2020/lib/services/providers/commons-init.provider.mjs +0 -4
  233. package/esm2020/lib/services/providers/config-service.provider.mjs +0 -20
  234. package/esm2020/lib/services/providers/formly-config.provider.mjs +0 -31
  235. package/esm2020/lib/services/providers/index.mjs +0 -4
  236. package/esm2020/lib/services/tokens/browser-storage.token.mjs +0 -6
  237. package/esm2020/lib/services/tokens/index.mjs +0 -3
  238. package/esm2020/lib/services/tokens/module-config.token.mjs +0 -3
  239. package/esm2020/lib/types/index.mjs +0 -3
  240. package/esm2020/lib/types/type.decorator.mjs +0 -7
  241. package/esm2020/lib/types/type.model.mjs +0 -2
  242. package/esm2020/lib/utils/editor-formly.util.mjs +0 -176
  243. package/esm2020/lib/utils/i18n.util.mjs +0 -125
  244. package/esm2020/lib/utils/index.mjs +0 -6
  245. package/esm2020/lib/utils/model.util.mjs +0 -57
  246. package/esm2020/lib/utils/toast.util.mjs +0 -39
  247. package/esm2020/lib/utils/type.util.mjs +0 -39
  248. package/esm2020/mediusinc-mng-commons.mjs +0 -5
  249. package/esm2020/public-api.mjs +0 -36
  250. package/fesm2015/mediusinc-mng-commons.mjs +0 -6250
  251. package/fesm2015/mediusinc-mng-commons.mjs.map +0 -1
  252. package/fesm2020/mediusinc-mng-commons.mjs +0 -6176
  253. package/fesm2020/mediusinc-mng-commons.mjs.map +0 -1
  254. package/lib/api/models/builders/query-param.builder.d.ts +0 -11
  255. package/lib/api/models/filter-param.model.d.ts +0 -23
  256. package/lib/api/models/mappers.d.ts +0 -6
  257. package/lib/api/models/query-mode.model.d.ts +0 -16
  258. package/lib/api/models/query-param.model.d.ts +0 -31
  259. package/lib/api/models/query-result.model.d.ts +0 -36
  260. package/lib/api/services/crud-api.abstract.service.d.ts +0 -23
  261. package/lib/api/utils/medius-rest.util.d.ts +0 -12
  262. package/lib/api/utils/object-serializer.util.d.ts +0 -30
  263. package/lib/components/action/action.component.d.ts +0 -36
  264. package/lib/components/action/dialog/action-dialog.component.d.ts +0 -46
  265. package/lib/components/action/models/action-execution.model.d.ts +0 -53
  266. package/lib/components/action/route/action-route.component.d.ts +0 -32
  267. package/lib/components/form/autocomplete/autocomplete.component.d.ts +0 -36
  268. package/lib/components/form/dropdown/dropdown.component.d.ts +0 -34
  269. package/lib/components/form/editor/form-editor.component.d.ts +0 -39
  270. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +0 -11
  271. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +0 -11
  272. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +0 -6
  273. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +0 -12
  274. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +0 -17
  275. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +0 -36
  276. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +0 -6
  277. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +0 -8
  278. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +0 -8
  279. package/lib/components/form/models/form-editor.event.d.ts +0 -5
  280. package/lib/components/layout/breadcrumb.component.d.ts +0 -8
  281. package/lib/components/layout/footer.component.d.ts +0 -9
  282. package/lib/components/layout/main-layout.component.d.ts +0 -21
  283. package/lib/components/layout/menu-item.component.d.ts +0 -29
  284. package/lib/components/layout/menu.component.d.ts +0 -10
  285. package/lib/components/layout/services/main-layout.component.service.d.ts +0 -65
  286. package/lib/components/layout/topbar.component.d.ts +0 -25
  287. package/lib/components/tableview/models/table.event.d.ts +0 -17
  288. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +0 -14
  289. package/lib/components/tableview/services/tableview.component.service.d.ts +0 -13
  290. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +0 -22
  291. package/lib/components/tableview/table/column-value/column-value.component.d.ts +0 -12
  292. package/lib/components/tableview/table/table.component.d.ts +0 -79
  293. package/lib/components/tableview/tableview.component.d.ts +0 -35
  294. package/lib/config/formly.config.d.ts +0 -14
  295. package/lib/data-providers/base.data-provider.d.ts +0 -17
  296. package/lib/data-providers/editor.data-provider.d.ts +0 -25
  297. package/lib/data-providers/lookup.data-provider.d.ts +0 -14
  298. package/lib/data-providers/tableview.data-provider.d.ts +0 -15
  299. package/lib/descriptors/action.descriptor.d.ts +0 -148
  300. package/lib/descriptors/editor.descriptor.d.ts +0 -255
  301. package/lib/descriptors/field.validator.d.ts +0 -18
  302. package/lib/descriptors/model.descriptor.d.ts +0 -15
  303. package/lib/descriptors/table.descriptor.d.ts +0 -164
  304. package/lib/descriptors/tableview.descriptor.d.ts +0 -39
  305. package/lib/directives/component.directive.d.ts +0 -11
  306. package/lib/directives/template.directive.d.ts +0 -13
  307. package/lib/mng-commons.module.d.ts +0 -79
  308. package/lib/models/router.model.d.ts +0 -14
  309. package/lib/pipes/boolean.pipe.d.ts +0 -7
  310. package/lib/pipes/property-path.pipe.d.ts +0 -7
  311. package/lib/services/action.service.d.ts +0 -92
  312. package/lib/services/commons.service.d.ts +0 -72
  313. package/lib/services/configuration.service.d.ts +0 -35
  314. package/lib/services/navigation.service.d.ts +0 -14
  315. package/lib/services/providers/commons-init.provider.d.ts +0 -2
  316. package/lib/services/providers/config-service.provider.d.ts +0 -5
  317. package/lib/services/providers/formly-config.provider.d.ts +0 -4
  318. package/lib/services/tokens/browser-storage.token.d.ts +0 -2
  319. package/lib/services/tokens/module-config.token.d.ts +0 -3
  320. package/lib/types/type.decorator.d.ts +0 -2
  321. package/lib/types/type.model.d.ts +0 -10
  322. package/lib/utils/editor-formly.util.d.ts +0 -9
  323. package/lib/utils/i18n.util.d.ts +0 -18
  324. package/lib/utils/model.util.d.ts +0 -7
  325. package/lib/utils/toast.util.d.ts +0 -13
  326. package/lib/utils/type.util.d.ts +0 -15
  327. package/mediusinc-mng-commons-0.2.0.tgz +0 -0
  328. package/mediusinc-mng-commons.d.ts +0 -5
@@ -0,0 +1,146 @@
1
+ import {Params} from '@angular/router';
2
+
3
+ import {FilterMetadata, LazyLoadEvent} from 'primeng/api';
4
+
5
+ import {MediusFilterMatchType, MediusQueryParam, MediusQueryParamBuilder} from '../models';
6
+ import {FilterDescriptor} from '../../descriptors';
7
+
8
+ export class MediusRestUtil {
9
+
10
+ // first value is from primeNG, second is for use in query params
11
+ public static readonly matchModeMapping: Array<[string, string, MediusFilterMatchType]> = [
12
+ ['contains', 'c', MediusFilterMatchType.Contains],
13
+ ['endsWith', 'ew', MediusFilterMatchType.EndsWith],
14
+ ['equals', 'eq', MediusFilterMatchType.Equals],
15
+ ['gte', 'gte', MediusFilterMatchType.GreaterThan],
16
+ ['leq', 'leq', MediusFilterMatchType.SmallerThan],
17
+ ['startsWith', 'sw', MediusFilterMatchType.StartsWith],
18
+ ['in', 'in', MediusFilterMatchType.In],
19
+ ['notEquals', 'neq', MediusFilterMatchType.NotEquals]
20
+ ];
21
+
22
+ public static fromAngularQueryParamsToMediusQueryParams(params: Params, filterDescriptors: Array<FilterDescriptor<any>>, defaultItemsPerPage = 10, defaultOffset= 0): MediusQueryParam {
23
+ const offset = params['first'] ? parseInt(params['first']) : defaultOffset;
24
+ const itemsPerPage = params['rows'] ? parseInt(params['rows']) : defaultItemsPerPage;
25
+
26
+ const mediusParamsBuilder = MediusQueryParamBuilder.create(itemsPerPage, offset);
27
+
28
+ if (params['sort']) {
29
+ for (const sort of params['sort'].split(',')) {
30
+ const qpSortSplit = sort.split(':');
31
+ const field = qpSortSplit[0];
32
+ const asc = qpSortSplit.length > 1 ? qpSortSplit[1] === 'asc' : true;
33
+ mediusParamsBuilder.withSort(field, asc);
34
+ }
35
+ }
36
+ if (params['filter']) {
37
+ const filterSplit = params['filter'].split(',');
38
+ for (const filterField of filterSplit) {
39
+ const filterFieldSplit = filterField.split(':');
40
+ const field = filterFieldSplit[0];
41
+ const operator = filterFieldSplit.length > 1 ? filterFieldSplit[1] : 'eq';
42
+
43
+ // prepare value
44
+ let value: any = filterFieldSplit.length > 2 ? filterFieldSplit[2] : '';
45
+ let valueTo: any = undefined;
46
+ if (value.startsWith('\'')) {
47
+ value = value.substring(1, value.length - 1);
48
+ }
49
+ if (value.startsWith('[') && value.endsWith(']')) {
50
+ value = value.substring(1, value.length - 1).split(',').map((v: string) => v.startsWith('\'') ? v.substring(1, v.length - 1) : v);
51
+ }
52
+
53
+ const operatorMapping = MediusRestUtil.matchModeMapping.find(mapping => mapping[1] === operator);
54
+ const filterDescriptor = filterDescriptors.find(f => f.property === field);
55
+ if (operatorMapping && filterDescriptor) {
56
+ const fieldFilterProperty = filterDescriptor.filterProperty ?? filterDescriptor.property;
57
+ mediusParamsBuilder.withFilter(fieldFilterProperty, value, valueTo, MediusRestUtil.getMediusFilterMatchTypeFromPrimeMatchMode(operatorMapping[0]));
58
+ }
59
+ }
60
+ }
61
+
62
+ return mediusParamsBuilder.build();
63
+ }
64
+
65
+ public static fromPrimeLazyLoadEventToAngularQueryParams(event: LazyLoadEvent, defaultItemsPerPage = 10, defaultOffset= 0): Params {
66
+ const params: Params = {
67
+ first: null,
68
+ rows: null,
69
+ sort: null,
70
+ filter: null
71
+ };
72
+
73
+ if (event.first && event.first !== defaultOffset && event.first > 0) {
74
+ params['first'] = event.first;
75
+ }
76
+ if (event.rows && event.rows !== defaultItemsPerPage && event.rows > 0) {
77
+ params['rows'] = event.rows;
78
+ }
79
+
80
+ if (event.multiSortMeta?.length ?? 0 > 0) {
81
+ params['sort'] = event.multiSortMeta?.map(s => `${s.field}${s.order === 1 ? '' : ':desc'}`).join(',');
82
+ }
83
+
84
+ if (event.filters) {
85
+ const filters = [];
86
+ for (const field in event.filters) {
87
+ const primeOperator = event.filters[field].matchMode;
88
+ let value = event.filters[field].value;
89
+ const operatorMapping = MediusRestUtil.matchModeMapping.find(mapping => mapping[0] === primeOperator);
90
+ if (operatorMapping && typeof value !== 'undefined' && value !== null &&
91
+ ((typeof value === 'string' && value.length > 0) || (Array.isArray(value) && value.length > 0))) {
92
+
93
+ if (Array.isArray(value)) {
94
+ value = `[${value.map(v => `'${v}'`).join(',')}]`;
95
+ } else {
96
+ value = `'${value}'`;
97
+ }
98
+
99
+ filters.push(`${field}:${operatorMapping[1]}:${value}`);
100
+ }
101
+ }
102
+ if (filters.length > 0) {
103
+ params['filter'] = filters.join(',');
104
+ }
105
+ }
106
+
107
+ return params;
108
+ }
109
+
110
+ public static fromPrimeLazyLoadEventToMediusQueryParams(event: LazyLoadEvent): MediusQueryParam {
111
+
112
+ const queryParamBuilder = MediusQueryParamBuilder.create(event.rows, event.first);
113
+
114
+ // apply sorting
115
+ if (event.multiSortMeta) {
116
+ event.multiSortMeta.forEach(msm => queryParamBuilder.withSort(msm.field, msm.order === 1));
117
+ }
118
+
119
+ // apply filtering
120
+ if (event.filters) {
121
+ for (const key of Object.keys(event.filters)) {
122
+ const filterEvent = event.filters[key];
123
+ if (Array.isArray(filterEvent)) {
124
+ (filterEvent as FilterMetadata[]).filter(e => e.value)
125
+ .forEach(e => MediusRestUtil.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, e));
126
+ } else if (typeof filterEvent === 'object') {
127
+ if (filterEvent.value) {
128
+ MediusRestUtil.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, filterEvent);
129
+ }
130
+ }
131
+ }
132
+ }
133
+
134
+ return queryParamBuilder.build();
135
+ }
136
+
137
+ public static addMediusFilterFromPrimeFilterMetadata(queryParamBuilder: MediusQueryParamBuilder, property: string, filterMetadata: FilterMetadata) {
138
+ const matchType: MediusFilterMatchType = MediusRestUtil.getMediusFilterMatchTypeFromPrimeMatchMode(filterMetadata.matchMode ?? 'contains');
139
+ queryParamBuilder.withFilter(property, filterMetadata.value, undefined, matchType);
140
+ }
141
+
142
+ public static getMediusFilterMatchTypeFromPrimeMatchMode(matchMode: string): MediusFilterMatchType {
143
+ const mapping = MediusRestUtil.matchModeMapping.find(m => m[0] === matchMode);
144
+ return mapping?.[2] ?? MediusFilterMatchType.Contains;
145
+ }
146
+ }
@@ -0,0 +1,227 @@
1
+ import {AttributeDef, enumsMapBase, SerializableTypeMap, typeMapBase} from '../models';
2
+ import {ClassType} from '../../types';
3
+ import {TypeUtil} from '../../utils';
4
+
5
+ export class ObjectSerializer {
6
+
7
+ private readonly _primitives: string[] = [
8
+ 'string',
9
+ 'boolean',
10
+ 'double',
11
+ 'integer',
12
+ 'long',
13
+ 'float',
14
+ 'number',
15
+ 'any'
16
+ ];
17
+ private readonly _typeMap: SerializableTypeMap = {
18
+ ...typeMapBase
19
+ }
20
+ private readonly _enumMap: SerializableTypeMap = {
21
+ ...enumsMapBase
22
+ }
23
+
24
+ private static _instance: ObjectSerializer = new ObjectSerializer();
25
+
26
+ /**
27
+ * Only use one instance of object (out of Angular context)
28
+ */
29
+ public static get(): ObjectSerializer {
30
+ return ObjectSerializer._instance;
31
+ }
32
+
33
+ public get primitives() { return this._primitives }
34
+ public get typeMap() { return this._typeMap }
35
+ public get enumMap() { return this._enumMap }
36
+
37
+ public findAttributeDefinitionByClassType(type: ClassType<any>, attributeName: string): AttributeDef|null {
38
+ return this.findAttributeDefinition(TypeUtil.findTypeName(type), attributeName);
39
+ }
40
+ public findAttributeDefinition(typeName: string, attributeName: string): AttributeDef|null {
41
+ const attributeDefs = this.findAttributesDefinition(typeName);
42
+ if (!attributeDefs) {
43
+ return null;
44
+ }
45
+ for (let attribute of attributeDefs) {
46
+ if (attribute.name === attributeName) {
47
+ return attribute;
48
+ }
49
+ }
50
+ return null;
51
+ }
52
+ public findAttributesDefinitionByClassType(type: ClassType<any>): Array<AttributeDef>|null {
53
+ return this.findAttributesDefinition(TypeUtil.findTypeName(type));
54
+ }
55
+ public findAttributesDefinition(typeName: string): Array<AttributeDef>|null {
56
+ const typeDef = this.findType(typeName);
57
+ if (!typeDef) {
58
+ return null;
59
+ }
60
+ return typeDef.getAttributeTypeMap() as Array<AttributeDef>;
61
+ }
62
+ public findByClassType(type: ClassType<any>): any {
63
+ return this.findType(TypeUtil.findTypeName(type));
64
+ }
65
+ public findType(typeName: string): any {
66
+ return this._typeMap[typeName];
67
+ }
68
+ public findEnum(enumName: string): any {
69
+ return this._enumMap[enumName];
70
+ }
71
+
72
+ public registerTypes(types: SerializableTypeMap) {
73
+ for (const key in types) {
74
+ this.registerType(types[key], key);
75
+ }
76
+ }
77
+
78
+ public registerType(type: ClassType<any>, optTypeName?: string) {
79
+ // try to find name from decorator
80
+ let typeName = TypeUtil.getDecoratorTypeName(type);
81
+ if (!typeName) {
82
+ // defined name from optional type name
83
+ typeName = optTypeName;
84
+ if (!typeName) {
85
+ console.warn(`Registering type ${type} failed, because typeName could not be determined and optional name was not provided.`);
86
+ return;
87
+ }
88
+ }
89
+ if (typeof this._typeMap[typeName] !== 'undefined') {
90
+ console.warn(`Registering type ${type} under key ${typeName} skipped, because type already exists for this key.`);
91
+ } else {
92
+ TypeUtil.defineReflectTypeName(type, typeName);
93
+ this._typeMap[typeName] = type;
94
+ }
95
+ }
96
+
97
+ public registerEnums(enums: SerializableTypeMap) {
98
+ for (const key in enums) {
99
+ if (typeof this._enumMap[key] !== 'undefined') {
100
+ console.warn(`Registering enum ${key} skipped, because enum already exists.`);
101
+ } else {
102
+ this._enumMap[key] = enums[key];
103
+ }
104
+ }
105
+ }
106
+
107
+ public findCorrectType(data: any, expectedType: string) {
108
+ if (data == undefined) {
109
+ return expectedType;
110
+ } else if (this._primitives.indexOf(expectedType.toLowerCase()) !== -1) {
111
+ return expectedType;
112
+ } else if (expectedType === 'Date') {
113
+ return expectedType;
114
+ } else {
115
+ if (this._enumMap[expectedType]) {
116
+ return expectedType;
117
+ }
118
+
119
+ if (!this._typeMap[expectedType]) {
120
+ return expectedType; // w/e we don't know the type
121
+ }
122
+
123
+ // Check the discriminator
124
+ const discriminatorProperty = this._typeMap[expectedType].discriminator;
125
+ if (discriminatorProperty == null) {
126
+ return expectedType; // the type does not have a discriminator. use it.
127
+ } else {
128
+ if (data[discriminatorProperty]) {
129
+ const discriminatorType = data[discriminatorProperty];
130
+ if (this._typeMap[discriminatorType]) {
131
+ return discriminatorType; // use the type given in the discriminator
132
+ } else {
133
+ return expectedType; // discriminator did not map to a type
134
+ }
135
+ } else {
136
+ return expectedType; // discriminator was not present (or an empty string)
137
+ }
138
+ }
139
+ }
140
+ }
141
+
142
+ public serializeClass<T>(data: any, type: ClassType<T>) {
143
+ return this.serialize(data, TypeUtil.findTypeName(type));
144
+ }
145
+ public serialize(data: any, type: string) {
146
+ if (data == undefined) {
147
+ return data;
148
+ } else if (this._primitives.indexOf(type.toLowerCase()) !== -1) {
149
+ return data;
150
+ } else if (type.lastIndexOf('Array<', 0) === 0) { // string.startsWith pre es6
151
+ let subType: string = type.replace('Array<', ''); // Array<Type> => Type>
152
+ subType = subType.substring(0, subType.length - 1); // Type> => Type
153
+ const transformedData: any[] = [];
154
+ // tslint:disable-next-line:prefer-for-of
155
+ for (let index = 0; index < data.length; index++) {
156
+ const datum = data[index];
157
+ transformedData.push(this.serialize(datum, subType));
158
+ }
159
+ return transformedData;
160
+ } else if (type === 'Date') {
161
+ return data.toISOString();
162
+ } else {
163
+ if (this._enumMap[type]) {
164
+ return data;
165
+ }
166
+ if (!this._typeMap[type]) { // in case we dont know the type
167
+ return data;
168
+ }
169
+
170
+ // Get the actual type of this object
171
+ type = this.findCorrectType(data, type);
172
+
173
+ // get the map for the correct type.
174
+ const attributeTypes = this._typeMap[type].getAttributeTypeMap() as Array<AttributeDef>;
175
+ const instance: {[index: string]: any} = {};
176
+ // tslint:disable-next-line:prefer-for-of
177
+ for (let index = 0; index < attributeTypes.length; index++) {
178
+ const attributeType = attributeTypes[index];
179
+ instance[attributeType.baseName] = this.serialize(data[attributeType.name],
180
+ attributeType.type);
181
+ }
182
+ return instance;
183
+ }
184
+ }
185
+
186
+ public deserializeClass<T>(data: any, type: ClassType<T>) {
187
+ return this.deserialize(data, TypeUtil.findTypeName(type));
188
+ }
189
+ public deserialize(data: any, type: string) {
190
+ // polymorphism may change the actual type.
191
+ type = this.findCorrectType(data, type);
192
+ if (data == undefined) {
193
+ return data;
194
+ } else if (this._primitives.indexOf(type.toLowerCase()) !== -1) {
195
+ return data;
196
+ } else if (type.lastIndexOf('Array<', 0) === 0) { // string.startsWith pre es6
197
+ let subType: string = type.replace('Array<', ''); // Array<Type> => Type>
198
+ subType = subType.substring(0, subType.length - 1); // Type> => Type
199
+ const transformedData: any[] = [];
200
+ // tslint:disable-next-line:prefer-for-of
201
+ for (let index = 0; index < data.length; index++) {
202
+ const datum = data[index];
203
+ transformedData.push(this.deserialize(datum, subType));
204
+ }
205
+ return transformedData;
206
+ } else if (type === 'Date') {
207
+ return new Date(data);
208
+ } else {
209
+ if (this._enumMap[type]) {// is Enum
210
+ return data;
211
+ }
212
+
213
+ if (!this._typeMap[type]) { // dont know the type
214
+ return data;
215
+ }
216
+ const instance = new this._typeMap[type]();
217
+ const attributeTypes = this._typeMap[type].getAttributeTypeMap() as Array<AttributeDef>;
218
+ // tslint:disable-next-line:prefer-for-of
219
+ for (let index = 0; index < attributeTypes.length; index++) {
220
+ const attributeType = attributeTypes[index];
221
+ instance[attributeType.name] = this.deserialize(data[attributeType.baseName],
222
+ attributeType.type);
223
+ }
224
+ return instance;
225
+ }
226
+ }
227
+ }
@@ -0,0 +1,30 @@
1
+ <ng-container *ngIf="$isVisible | async">
2
+ <button *ngIf="action.icon && action.title === null; else noIcon" type="button"
3
+ pButton pRipple
4
+ [icon]="action.icon"
5
+ [loading]="($loading | async) ?? false"
6
+ [disabled]="!($isEnabled | async)"
7
+ [pTooltip]="$any($tooltip | async)"
8
+ (click)="triggerAction($event)"
9
+ class="mng-action-button mng-action-button-icon p-button-rounded"
10
+ [class.p-button-primary]="action.level === 1"
11
+ [class.p-button-success]="action.level === 5"
12
+ [class.p-button-danger]="action.level === 7">
13
+ </button>
14
+ <ng-template #noIcon>
15
+ <button type="button"
16
+ pButton pRipple
17
+ [icon]="$any(action.icon)"
18
+ [label]="($label | async) ?? ''"
19
+ [loading]="($loading | async) ?? false"
20
+ [disabled]="!($isEnabled | async)"
21
+ [pTooltip]="$any($tooltip | async)"
22
+ (click)="triggerAction($event)"
23
+ class="mng-action-button p-button-text"
24
+ [class.p-button-primary]="action.level === 1"
25
+ [class.p-button-success]="action.level === 5"
26
+ [class.p-button-danger]="action.level === 7">
27
+ </button>
28
+ </ng-template>
29
+ <p-confirmDialog *ngIf="action.hasRunConfirmation" [key]="action.actionName + '_' + cmpId" [baseZIndex]="50" appendTo="body"></p-confirmDialog>
30
+ </ng-container>
@@ -0,0 +1,77 @@
1
+ import {ChangeDetectionStrategy, Component, Input, OnInit} from '@angular/core';
2
+ import {ActivatedRoute} from '@angular/router';
3
+
4
+ import {TranslateService} from '@ngx-translate/core';
5
+
6
+ import {Observable, of, ReplaySubject} from 'rxjs';
7
+ import {finalize, first} from 'rxjs/operators';
8
+ import {ConfirmationService, MessageService} from 'primeng/api';
9
+
10
+ import {IdType} from '../../types';
11
+ import {ActionDescriptor} from '../../descriptors';
12
+ import {IActionConfirmationService, ActionData} from './models';
13
+ import {MngActionService} from '../../services';
14
+ import {I18nUtil} from '../../utils';
15
+ import {TableviewComponentService} from '../tableview/services';
16
+
17
+ @Component({
18
+ selector: 'mng-action',
19
+ templateUrl: './action.component.html',
20
+ changeDetection: ChangeDetectionStrategy.OnPush,
21
+ providers: [MessageService, ConfirmationService]
22
+ })
23
+ export class MngActionComponent<T, S> implements OnInit, IActionConfirmationService {
24
+
25
+ // metadata and editor mode input
26
+ @Input() public action!: ActionDescriptor<T>;
27
+ @Input() public item?: T;
28
+ @Input() public itemId?: IdType;
29
+ @Input() public actionData?: ActionData;
30
+
31
+ private loadingSubject = new ReplaySubject<boolean>(1);
32
+ public $loading: Observable<boolean> = this.loadingSubject.asObservable();
33
+
34
+ public cmpId: string = Math.random().toString(36).substring(2);
35
+ public $isVisible!: Observable<boolean>;
36
+ public $isEnabled!: Observable<boolean>;
37
+ public $label!: Observable<string|null>;
38
+ public $tooltip!: Observable<string|null>;
39
+
40
+ constructor(
41
+ private route: ActivatedRoute,
42
+ private translate: TranslateService,
43
+ private actionService: MngActionService,
44
+ private confirmationService: ConfirmationService,
45
+ private tableviewService: TableviewComponentService<T, S>
46
+ ) {
47
+ this.loadingSubject.next(false);
48
+ }
49
+
50
+ public ngOnInit() {
51
+ const context = this.actionService.getActionExecContext(this.action, this.itemId, this.item, this.tableviewService?.dataProvider ?? undefined, this.tableviewService, this, this.actionData);
52
+ this.$isVisible = typeof this.action.isVisibleFunction === 'function' ? this.action.isVisibleFunction(context) : of(true);
53
+ this.$isEnabled = typeof this.action.isEnabledFunction === 'function' ? this.action.isEnabledFunction(context) : of(true);
54
+ this.$label = I18nUtil.streamActionTranslation(this.translate, this.action, 'title', this.action?.title ?? undefined, this.item);
55
+ this.$tooltip = I18nUtil.streamActionTranslation(this.translate, this.action, 'tooltip', this.action?.tooltip ?? undefined, this.item);
56
+ }
57
+
58
+ public triggerAction(event: Event) {
59
+ this.loadingSubject.next(true);
60
+ const actionData = this.actionData ? this.actionData : {};
61
+ actionData['cmpId'] = this.cmpId;
62
+ this.actionService.triggerAction(this.action, this.itemId, this.item, actionData, this.route, this.tableviewService, this)
63
+ .pipe(
64
+ first(),
65
+ finalize(() => this.loadingSubject.next(false))
66
+ )
67
+ .subscribe(res => {});
68
+ }
69
+
70
+ public getConfirmationService() {
71
+ return this.confirmationService;
72
+ }
73
+
74
+ public getConfirmationServiceInstanceKey(action: ActionDescriptor<any>) {
75
+ return `${action.actionName}_${this.cmpId}`;
76
+ }
77
+ }
@@ -0,0 +1,26 @@
1
+ <div class="h-full flex flex-column">
2
+ <div class="flex-grow-1">
3
+ <div class="text-center" *ngIf="loading$ | async">
4
+ <p-progressSpinner [style]="{width: '3rem', height: '3rem'}" strokeWidth="3"></p-progressSpinner>
5
+ </div>
6
+ <mng-form-editor *ngIf="action.editorDescriptor && !(loading$ | async)"
7
+ [descriptor]="action.editorDescriptor"
8
+ [item]="item"
9
+ (onSubmit)="onSubmit($event)">
10
+ </mng-form-editor>
11
+ </div>
12
+ <div class="flex flex-row justify-content-between">
13
+ <div></div>
14
+ <div>
15
+ <button type="button" pButton pRipple [label]="'general.close' | translate" icon="pi pi-times" class="p-button-text" (click)="closeDialog()" [disabled]="submitLoading$ | async"></button>
16
+ <button *ngIf="isSaveButton" #submitButton type="button" pButton pRipple
17
+ [label]="'general.save' | translate"
18
+ icon="pi pi-check"
19
+ class="p-button-text"
20
+ (click)="saveItem()"
21
+ [loading]="(submitLoading$ | async) ?? false"
22
+ [disabled]="(submitLoading$ | async) ?? false">
23
+ </button>
24
+ </div>
25
+ </div>
26
+ </div>
@@ -0,0 +1,171 @@
1
+ import {ChangeDetectionStrategy, Component, ContentChildren, ElementRef, EventEmitter, Injector, Input, OnDestroy, OnInit, Output, QueryList, ViewChild} from '@angular/core';
2
+
3
+ import {TranslateService} from '@ngx-translate/core';
4
+ import {DynamicDialogConfig, DynamicDialogRef} from 'primeng/dynamicdialog';
5
+ import {Observable, of, ReplaySubject, Subscription} from 'rxjs';
6
+ import {catchError, finalize, first, mergeMap} from 'rxjs/operators';
7
+
8
+ import {ActionData, ActionError, ActionRunResult} from '../models';
9
+ import {ActionDescriptor, ActionEditorDescriptor} from '../../../descriptors';
10
+ import {IdType} from '../../../types';
11
+ import {IEditorDataProvider} from '../../../data-providers';
12
+ import {MngFormEditorSubmitEvent} from '../../form/models';
13
+ import {MngActionService, MngCommonsService} from '../../../services';
14
+ import {MngTemplateDirective} from '../../../directives';
15
+ import {MngFormEditorComponent} from '../../form';
16
+ import {I18nUtil, ToastUtil} from '../../../utils';
17
+ import {TableviewComponentService} from '../../tableview/services';
18
+
19
+ @Component({
20
+ selector: 'mng-action-dialog',
21
+ templateUrl: './action-dialog.component.html',
22
+ changeDetection: ChangeDetectionStrategy.OnPush
23
+ })
24
+ export class MngActionDialogComponent<T, S> implements OnInit, OnDestroy {
25
+
26
+ // metadata and editor mode input
27
+ @Input() public action!: ActionEditorDescriptor<T>;
28
+
29
+ // data source inputs
30
+ @Input() public itemId?: IdType;
31
+ @Input() public item?: T;
32
+ @Input() public actionData?: ActionData;
33
+ @Input() public dataProvider?: IEditorDataProvider<T, S>;
34
+
35
+ // content and view queries
36
+ @ContentChildren(MngTemplateDirective) templates!: QueryList<MngTemplateDirective>;
37
+
38
+ @ViewChild('submitButton') private submitButtonElementRef!: ElementRef;
39
+ @ViewChild(MngFormEditorComponent) private editorComponent!: MngFormEditorComponent<T>;
40
+
41
+ public cmpId: string = Math.random().toString(36).substring(2);
42
+
43
+ private loadingSubject = new ReplaySubject<boolean>(1);
44
+ private submitLoadingSubject = new ReplaySubject<boolean>(1);
45
+ public loading$: Observable<boolean> = this.loadingSubject.asObservable();
46
+ public submitLoading$: Observable<boolean> = this.submitLoadingSubject.asObservable();
47
+ public isSaveButton = true;
48
+
49
+ private tableviewService?: TableviewComponentService<T, S>;
50
+ private sourceComponent: any = this;
51
+ private subscriptions: Array<Subscription> = [];
52
+
53
+ constructor(
54
+ private injector: Injector,
55
+ private translate: TranslateService,
56
+ public dialogRef: DynamicDialogRef,
57
+ public dialogConfig: DynamicDialogConfig,
58
+ private actionService: MngActionService,
59
+ // private mngCommonsService: MngCommonsService
60
+ ) {
61
+ }
62
+
63
+ public ngOnInit() {
64
+
65
+ if (this.dialogConfig.data) {
66
+ if (this.dialogConfig.data.action) {
67
+ this.action = this.dialogConfig.data.action;
68
+ }
69
+ if (this.dialogConfig.data.item) {
70
+ this.item = this.dialogConfig.data.item;
71
+ }
72
+ if (this.dialogConfig.data.itemId) {
73
+ this.itemId = this.dialogConfig.data.itemId;
74
+ }
75
+ if (this.dialogConfig.data.actionData) {
76
+ this.actionData = this.dialogConfig.data.actionData;
77
+ }
78
+ if (this.dialogConfig.data.tableview) {
79
+ this.tableviewService = this.dialogConfig.data.tableview;
80
+ if (!this.dataProvider && this.tableviewService?.dataProvider) {
81
+ this.dataProvider = this.tableviewService.dataProvider;
82
+ }
83
+ }
84
+ if (this.dialogConfig.data.sourceComponent) {
85
+ this.sourceComponent = this.dialogConfig.data.sourceComponent;
86
+ }
87
+ }
88
+
89
+ this.isSaveButton = typeof this.action.submitFunction === 'function';
90
+ this.setDialogHeaderTitle();
91
+
92
+ this.loadItemWithDataProvider();
93
+ }
94
+
95
+ public ngOnDestroy() {
96
+ this.subscriptions.forEach(s => s.unsubscribe());
97
+ }
98
+
99
+ public onSubmit(event: MngFormEditorSubmitEvent<T>) {
100
+ if (event.success) {
101
+ if (typeof this.action.submitFunction !== 'function') {
102
+ return;
103
+ }
104
+ this.submitLoadingSubject.next(true);
105
+ this.actionService.runEditorSave(this.action, this.itemId, event.formItem, this.dataProvider, this.sourceComponent, this.tableviewService, this.actionData)
106
+ .pipe(
107
+ first(),
108
+ finalize(() => this.submitLoadingSubject.next(false))
109
+ )
110
+ .subscribe(res => {
111
+ this.closeDialog(res);
112
+ });
113
+ }
114
+ }
115
+
116
+ public closeDialog(result?: ActionRunResult<T, any, any>) {
117
+ this.dialogRef.close(result ? result : new ActionRunResult(undefined, undefined, new ActionError(null, true)));
118
+ }
119
+
120
+ public saveItem() {
121
+ this.editorComponent.submit();
122
+ }
123
+
124
+ private loadItemWithDataProvider() {
125
+ if (typeof this.action.fetchFunction !== 'function') {
126
+ return;
127
+ }
128
+ this.loadingSubject.next(true);
129
+ this.actionService.runEditorFetch(this.action, this.itemId, this.dataProvider, this.sourceComponent, this.tableviewService)
130
+ .pipe(
131
+ first(),
132
+ catchError(err => {
133
+ if (this.action.hasRunNotificationError) {
134
+ ToastUtil.actionNotificationError(this.translate, this.action, err, 'fetch', this.tableviewService, this.item);
135
+ }
136
+ throw err;
137
+ }),
138
+ finalize(() => this.loadingSubject.next(false))
139
+ )
140
+ .subscribe(res => {
141
+ this.item = res.result;
142
+ if (this.action.hasFetchNotificationSuccess) {
143
+ ToastUtil.actionNotificationSuccess(this.translate, this.action, 'fetch', this.action.fetchNotificationSuccessTitle,
144
+ this.action.fetchNotificationSuccessMessage,this.tableviewService, this.item);
145
+ }
146
+ this.setDialogHeaderTitle();
147
+ });
148
+ }
149
+
150
+ private setDialogHeaderTitle() {
151
+ if (this.action.editorTitle === null) {
152
+ requestAnimationFrame(() => {
153
+ this.dialogConfig.header = undefined;
154
+ });
155
+ return;
156
+ }
157
+ const subscription = I18nUtil.streamActionTranslation(this.translate, this.action as ActionDescriptor<T>, 'dialog.title', undefined, this.item)
158
+ .pipe(
159
+ mergeMap(i18nDialogTitle => i18nDialogTitle === null
160
+ ? I18nUtil.getActionTranslation(this.translate, this.action as ActionDescriptor<T>, 'title', this.action.editorTitle, this.item)
161
+ : of(i18nDialogTitle))
162
+ )
163
+ .subscribe(t => {
164
+ requestAnimationFrame(() => {
165
+ this.dialogConfig.header = t ?? undefined;
166
+ // this.mngCommonsService.setPageTitle(t ?? undefined);
167
+ });
168
+ });
169
+ this.subscriptions.push(subscription);
170
+ }
171
+ }