@mediusinc/mng-commons 0.8.0-rc.3 → 0.8.0

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 (279) hide show
  1. package/assets/i18n/en.json +3 -1
  2. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  3. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  4. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  5. package/esm2020/lib/api/models/index.mjs +8 -8
  6. package/esm2020/lib/api/models/mappers.mjs +12 -12
  7. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  8. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  9. package/esm2020/lib/api/models/query-result.model.mjs +17 -17
  10. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  11. package/esm2020/lib/api/services/api.abstract.service.mjs +55 -55
  12. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +66 -66
  13. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +22 -22
  14. package/esm2020/lib/api/services/index.mjs +3 -3
  15. package/esm2020/lib/api/utils/index.mjs +2 -2
  16. package/esm2020/lib/api/utils/medius-rest.util.mjs +151 -151
  17. package/esm2020/lib/api/utils/object-serializer.util.mjs +243 -243
  18. package/esm2020/lib/components/action/action.component.mjs +176 -176
  19. package/esm2020/lib/components/action/editor/action-editor.component.mjs +247 -230
  20. package/esm2020/lib/components/action/index.mjs +3 -3
  21. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  22. package/esm2020/lib/components/action/models/action-execution.model.mjs +234 -234
  23. package/esm2020/lib/components/action/models/index.mjs +2 -2
  24. package/esm2020/lib/components/action/route/action-route.component.mjs +124 -124
  25. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +268 -268
  26. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +160 -160
  27. package/esm2020/lib/components/form/editor/form-editor.component.mjs +189 -189
  28. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +18 -18
  29. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +42 -42
  30. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +24 -24
  31. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +95 -95
  32. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +16 -16
  33. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +178 -178
  34. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +155 -155
  35. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +126 -126
  36. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  37. package/esm2020/lib/components/form/formly/fields/index.mjs +9 -9
  38. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +14 -14
  39. package/esm2020/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.mjs +14 -14
  40. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  41. package/esm2020/lib/components/form/index.mjs +3 -3
  42. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  43. package/esm2020/lib/components/form/models/index.mjs +1 -1
  44. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  45. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  46. package/esm2020/lib/components/layout/index.mjs +6 -6
  47. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  48. package/esm2020/lib/components/layout/menu-item.component.mjs +216 -216
  49. package/esm2020/lib/components/layout/menu.component.mjs +19 -19
  50. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  51. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +192 -192
  52. package/esm2020/lib/components/layout/topbar.component.mjs +57 -57
  53. package/esm2020/lib/components/tableview/index.mjs +6 -6
  54. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  55. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  56. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +56 -56
  57. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +53 -53
  58. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +101 -101
  59. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +70 -70
  60. package/esm2020/lib/components/tableview/table/table.component.mjs +429 -429
  61. package/esm2020/lib/components/tableview/tableview.component.mjs +91 -91
  62. package/esm2020/lib/config/formly.config.mjs +180 -180
  63. package/esm2020/lib/config/index.mjs +1 -1
  64. package/esm2020/lib/config/models/index.mjs +1 -1
  65. package/esm2020/lib/config/models/mng-config.model.mjs +1 -1
  66. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  67. package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
  68. package/esm2020/lib/data-providers/index.mjs +5 -5
  69. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  70. package/esm2020/lib/data-providers/table.data-provider.mjs +16 -16
  71. package/esm2020/lib/data-providers/tableview.data-provider.mjs +16 -16
  72. package/esm2020/lib/descriptors/action.descriptor.mjs +622 -622
  73. package/esm2020/lib/descriptors/column.descriptor.mjs +271 -271
  74. package/esm2020/lib/descriptors/editor.descriptor.mjs +154 -154
  75. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +20 -20
  76. package/esm2020/lib/descriptors/field.descriptor.interface.mjs +1 -1
  77. package/esm2020/lib/descriptors/field.descriptor.mjs +863 -863
  78. package/esm2020/lib/descriptors/filter.descriptor.mjs +294 -294
  79. package/esm2020/lib/descriptors/index.mjs +11 -11
  80. package/esm2020/lib/descriptors/lookup.descriptor.mjs +1 -1
  81. package/esm2020/lib/descriptors/model.descriptor.mjs +33 -33
  82. package/esm2020/lib/descriptors/table.descriptor.mjs +213 -213
  83. package/esm2020/lib/descriptors/tableview.descriptor.mjs +134 -134
  84. package/esm2020/lib/directives/component.directive.mjs +43 -43
  85. package/esm2020/lib/directives/index.mjs +2 -2
  86. package/esm2020/lib/directives/template.directive.mjs +27 -27
  87. package/esm2020/lib/mng-commons.module.mjs +426 -426
  88. package/esm2020/lib/models/column-value.model.mjs +1 -1
  89. package/esm2020/lib/models/enum.model.mjs +1 -1
  90. package/esm2020/lib/models/error.model.mjs +1 -1
  91. package/esm2020/lib/models/index.mjs +6 -6
  92. package/esm2020/lib/models/menu.model.mjs +1 -1
  93. package/esm2020/lib/models/user.model.mjs +1 -1
  94. package/esm2020/lib/models/view-container.model.mjs +1 -1
  95. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  96. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  97. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  98. package/esm2020/lib/pipes/index.mjs +5 -5
  99. package/esm2020/lib/pipes/json-path.pipe.mjs +79 -79
  100. package/esm2020/lib/pipes/link-formatter.pipe.mjs +38 -38
  101. package/esm2020/lib/router/index.mjs +1 -1
  102. package/esm2020/lib/router/models/index.mjs +1 -1
  103. package/esm2020/lib/router/models/router.model.mjs +1 -1
  104. package/esm2020/lib/router/route-builder.mjs +431 -431
  105. package/esm2020/lib/services/action-executor.service.mjs +535 -535
  106. package/esm2020/lib/services/commons.service.mjs +343 -343
  107. package/esm2020/lib/services/configuration.service.mjs +110 -110
  108. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  109. package/esm2020/lib/services/index.mjs +6 -6
  110. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  111. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  112. package/esm2020/lib/services/internal/index.mjs +2 -2
  113. package/esm2020/lib/services/navigation.service.mjs +47 -47
  114. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  115. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  116. package/esm2020/lib/services/providers/index.mjs +2 -2
  117. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  118. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  119. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  120. package/esm2020/lib/services/tokens/index.mjs +4 -4
  121. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  122. package/esm2020/lib/services/view-container.component.service.mjs +34 -34
  123. package/esm2020/lib/types/index.mjs +2 -2
  124. package/esm2020/lib/types/type.decorator.mjs +12 -12
  125. package/esm2020/lib/types/type.model.mjs +1 -1
  126. package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
  127. package/esm2020/lib/utils/editor-formly.util.mjs +209 -209
  128. package/esm2020/lib/utils/enum.util.mjs +81 -81
  129. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  130. package/esm2020/lib/utils/index.mjs +7 -7
  131. package/esm2020/lib/utils/model.util.mjs +59 -59
  132. package/esm2020/lib/utils/notification.util.mjs +45 -45
  133. package/esm2020/lib/utils/route.util.mjs +23 -23
  134. package/esm2020/lib/utils/styles.util.mjs +40 -40
  135. package/esm2020/lib/utils/type.util.mjs +76 -76
  136. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  137. package/esm2020/public-api.mjs +39 -39
  138. package/fesm2015/mediusinc-mng-commons.mjs +9908 -9891
  139. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  140. package/fesm2020/mediusinc-mng-commons.mjs +9774 -9757
  141. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  142. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  143. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  144. package/lib/api/models/filter-param.model.d.ts +23 -23
  145. package/lib/api/models/index.d.ts +8 -8
  146. package/lib/api/models/mappers.d.ts +6 -6
  147. package/lib/api/models/query-mode.model.d.ts +16 -16
  148. package/lib/api/models/query-param.model.d.ts +31 -31
  149. package/lib/api/models/query-result.model.d.ts +23 -23
  150. package/lib/api/models/serialization.model.d.ts +8 -8
  151. package/lib/api/services/api.abstract.service.d.ts +24 -24
  152. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  153. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  154. package/lib/api/services/index.d.ts +3 -3
  155. package/lib/api/utils/index.d.ts +2 -2
  156. package/lib/api/utils/medius-rest.util.d.ts +14 -14
  157. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  158. package/lib/components/action/action.component.d.ts +68 -68
  159. package/lib/components/action/editor/action-editor.component.d.ts +64 -62
  160. package/lib/components/action/index.d.ts +3 -3
  161. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  162. package/lib/components/action/models/action-execution.model.d.ts +129 -129
  163. package/lib/components/action/models/index.d.ts +2 -2
  164. package/lib/components/action/route/action-route.component.d.ts +31 -31
  165. package/lib/components/form/autocomplete/autocomplete.component.d.ts +53 -53
  166. package/lib/components/form/dropdown/dropdown.component.d.ts +44 -44
  167. package/lib/components/form/editor/form-editor.component.d.ts +45 -45
  168. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +12 -12
  169. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +14 -14
  170. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +12 -12
  171. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +21 -21
  172. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +6 -6
  173. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +44 -44
  174. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +22 -22
  175. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  176. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +6 -6
  177. package/lib/components/form/formly/fields/index.d.ts +9 -9
  178. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +6 -6
  179. package/lib/components/form/formly/wrappers/formly-table-wrapper/formly-table-wrapper.component.d.ts +6 -6
  180. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  181. package/lib/components/form/index.d.ts +3 -3
  182. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  183. package/lib/components/form/models/index.d.ts +1 -1
  184. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  185. package/lib/components/layout/footer.component.d.ts +9 -9
  186. package/lib/components/layout/index.d.ts +6 -6
  187. package/lib/components/layout/main-layout.component.d.ts +20 -20
  188. package/lib/components/layout/menu-item.component.d.ts +37 -37
  189. package/lib/components/layout/menu.component.d.ts +10 -10
  190. package/lib/components/layout/services/index.d.ts +1 -1
  191. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  192. package/lib/components/layout/topbar.component.d.ts +24 -24
  193. package/lib/components/tableview/index.d.ts +6 -6
  194. package/lib/components/tableview/models/index.d.ts +1 -1
  195. package/lib/components/tableview/models/table.event.d.ts +17 -17
  196. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +20 -20
  197. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  198. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +31 -31
  199. package/lib/components/tableview/table/column-value/column-value.component.d.ts +28 -28
  200. package/lib/components/tableview/table/table.component.d.ts +104 -104
  201. package/lib/components/tableview/tableview.component.d.ts +41 -41
  202. package/lib/config/formly.config.d.ts +15 -15
  203. package/lib/config/index.d.ts +1 -1
  204. package/lib/config/models/index.d.ts +1 -1
  205. package/lib/config/models/mng-config.model.d.ts +34 -34
  206. package/lib/data-providers/base.data-provider.d.ts +14 -14
  207. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  208. package/lib/data-providers/index.d.ts +5 -5
  209. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  210. package/lib/data-providers/table.data-provider.d.ts +14 -14
  211. package/lib/data-providers/tableview.data-provider.d.ts +15 -15
  212. package/lib/descriptors/action.descriptor.d.ts +277 -277
  213. package/lib/descriptors/column.descriptor.d.ts +91 -91
  214. package/lib/descriptors/editor.descriptor.d.ts +44 -44
  215. package/lib/descriptors/field-validation.descriptor.d.ts +18 -18
  216. package/lib/descriptors/field.descriptor.d.ts +342 -342
  217. package/lib/descriptors/field.descriptor.interface.d.ts +9 -9
  218. package/lib/descriptors/filter.descriptor.d.ts +127 -127
  219. package/lib/descriptors/index.d.ts +11 -11
  220. package/lib/descriptors/lookup.descriptor.d.ts +17 -17
  221. package/lib/descriptors/model.descriptor.d.ts +15 -15
  222. package/lib/descriptors/table.descriptor.d.ts +80 -80
  223. package/lib/descriptors/tableview.descriptor.d.ts +42 -42
  224. package/lib/directives/component.directive.d.ts +16 -16
  225. package/lib/directives/index.d.ts +2 -2
  226. package/lib/directives/template.directive.d.ts +13 -13
  227. package/lib/mng-commons.module.d.ts +86 -86
  228. package/lib/models/column-value.model.d.ts +4 -4
  229. package/lib/models/enum.model.d.ts +6 -6
  230. package/lib/models/error.model.d.ts +14 -14
  231. package/lib/models/index.d.ts +6 -6
  232. package/lib/models/menu.model.d.ts +25 -25
  233. package/lib/models/user.model.d.ts +8 -8
  234. package/lib/models/view-container.model.d.ts +6 -6
  235. package/lib/pipes/boolean.pipe.d.ts +7 -7
  236. package/lib/pipes/enum.pipe.d.ts +8 -8
  237. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  238. package/lib/pipes/index.d.ts +5 -5
  239. package/lib/pipes/json-path.pipe.d.ts +13 -13
  240. package/lib/pipes/link-formatter.pipe.d.ts +11 -11
  241. package/lib/router/index.d.ts +1 -1
  242. package/lib/router/models/index.d.ts +1 -1
  243. package/lib/router/models/router.model.d.ts +22 -22
  244. package/lib/router/route-builder.d.ts +86 -86
  245. package/lib/services/action-executor.service.d.ts +149 -149
  246. package/lib/services/commons.service.d.ts +72 -72
  247. package/lib/services/configuration.service.d.ts +36 -36
  248. package/lib/services/error-mapper.service.d.ts +7 -7
  249. package/lib/services/index.d.ts +6 -6
  250. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  251. package/lib/services/internal/commons-init.service.d.ts +16 -16
  252. package/lib/services/internal/index.d.ts +2 -2
  253. package/lib/services/navigation.service.d.ts +14 -14
  254. package/lib/services/providers/config-service.provider.d.ts +6 -6
  255. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  256. package/lib/services/providers/index.d.ts +2 -2
  257. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  258. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  259. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  260. package/lib/services/tokens/index.d.ts +4 -4
  261. package/lib/services/tokens/module-config.token.d.ts +3 -3
  262. package/lib/services/view-container.component.service.d.ts +22 -22
  263. package/lib/types/index.d.ts +2 -2
  264. package/lib/types/type.decorator.d.ts +4 -4
  265. package/lib/types/type.model.d.ts +20 -20
  266. package/lib/utils/action-data-provider.util.d.ts +20 -20
  267. package/lib/utils/editor-formly.util.d.ts +10 -10
  268. package/lib/utils/enum.util.d.ts +50 -50
  269. package/lib/utils/i18n.util.d.ts +56 -56
  270. package/lib/utils/index.d.ts +7 -7
  271. package/lib/utils/model.util.d.ts +8 -8
  272. package/lib/utils/notification.util.d.ts +11 -11
  273. package/lib/utils/route.util.d.ts +4 -4
  274. package/lib/utils/styles.util.d.ts +14 -14
  275. package/lib/utils/type.util.d.ts +36 -36
  276. package/mediusinc-mng-commons.d.ts +5 -5
  277. package/package.json +3 -3
  278. package/public-api.d.ts +28 -28
  279. package/mediusinc-mng-commons-0.8.0-rc.3.tgz +0 -0
@@ -1,152 +1,152 @@
1
- import { FilterMatchMode } from 'primeng/api';
2
- import { FilterDescriptor } from '../../descriptors';
3
- import { MediusFilterMatchType, MediusQueryParamBuilder } from '../models';
4
- export class MediusRestUtil {
5
- static fromAngularQueryParamsToMediusQueryParams(params, filterDescriptors, defaultItemsPerPage = 10, defaultOffset = 0) {
6
- const offset = params['first'] ? parseInt(params['first']) : defaultOffset;
7
- const itemsPerPage = params['rows'] ? parseInt(params['rows']) : defaultItemsPerPage;
8
- const mediusParamsBuilder = MediusQueryParamBuilder.create(itemsPerPage, offset);
9
- if (params['sort']) {
10
- for (const sort of params['sort'].split(',')) {
11
- const qpSortSplit = sort.split(':');
12
- const field = qpSortSplit[0];
13
- const asc = qpSortSplit.length > 1 ? qpSortSplit[1] === 'asc' : true;
14
- mediusParamsBuilder.withSort(field, asc);
15
- }
16
- }
17
- if (params['filter']) {
18
- const filterSplit = params['filter'].split(',');
19
- for (const filterField of filterSplit) {
20
- const filterFieldSplit = filterField.split(':');
21
- const field = filterFieldSplit[0];
22
- const operator = filterFieldSplit.length > 1 ? filterFieldSplit[1] : 'eq';
23
- // prepare value
24
- let value = filterFieldSplit.length > 2 ? filterFieldSplit.slice(2).join(':') : '';
25
- const valueTo = undefined;
26
- if (value.startsWith("'")) {
27
- value = value.substring(1, value.length - 1);
28
- }
29
- if (value.startsWith('[') && value.endsWith(']')) {
30
- value = value
31
- .substring(1, value.length - 1)
32
- .split(',')
33
- .map((v) => (v.startsWith("'") ? v.substring(1, v.length - 1) : v));
34
- }
35
- const filterDescriptor = filterDescriptors.find(f => f.property === field);
36
- const matchMode = MediusRestUtil.getMapping(operator, filterDescriptor?.filterType, 1);
37
- if (matchMode && filterDescriptor) {
38
- const fieldFilterProperty = filterDescriptor.filterProperty ?? filterDescriptor.property;
39
- mediusParamsBuilder.withFilter(fieldFilterProperty, value, valueTo, MediusRestUtil.getMediusFilterMatchTypeFromPrimeMatchMode(matchMode[0]));
40
- }
41
- }
42
- }
43
- return mediusParamsBuilder.build();
44
- }
45
- static fromPrimeLazyLoadEventToAngularQueryParams(event, defaultItemsPerPage = 10, defaultOffset = 0) {
46
- const params = {
47
- first: null,
48
- rows: null,
49
- sort: null,
50
- filter: null
51
- };
52
- if (event.first && event.first !== defaultOffset && event.first > 0) {
53
- params['first'] = event.first;
54
- }
55
- if (event.rows && event.rows !== defaultItemsPerPage && event.rows > 0) {
56
- params['rows'] = event.rows;
57
- }
58
- if (event.multiSortMeta?.length ?? 0 > 0) {
59
- params['sort'] = event.multiSortMeta?.map(s => `${s.field}${s.order === 1 ? '' : ':desc'}`).join(',');
60
- }
61
- if (event.filters) {
62
- const filters = [];
63
- for (const field in event.filters) {
64
- const primeOperator = event.filters[field].matchMode;
65
- let value = event.filters[field].value;
66
- const operatorMapping = primeOperator ? MediusRestUtil.getMapping(primeOperator, undefined, 0) : undefined;
67
- if (operatorMapping && typeof value !== 'undefined' && value !== null) {
68
- let doAddFilter = false;
69
- if (typeof value === 'string' && value.length > 0) {
70
- value = `'${value}'`;
71
- doAddFilter = true;
72
- }
73
- else if (typeof value === 'number') {
74
- doAddFilter = true;
75
- }
76
- else if (Array.isArray(value)) {
77
- value = `[${value.map(v => `'${v}'`).join(',')}]`;
78
- doAddFilter = true;
79
- }
80
- else if (value instanceof Date) {
81
- value = `${value.toISOString()}`;
82
- doAddFilter = true;
83
- }
84
- if (doAddFilter) {
85
- filters.push(`${field}:${operatorMapping[1]}:${value}`);
86
- }
87
- }
88
- }
89
- if (filters.length > 0) {
90
- params['filter'] = filters.join(',');
91
- }
92
- }
93
- return params;
94
- }
95
- static fromPrimeLazyLoadEventToMediusQueryParams(event) {
96
- const queryParamBuilder = MediusQueryParamBuilder.create(event.rows, event.first);
97
- // apply sorting
98
- if (event.multiSortMeta) {
99
- event.multiSortMeta.forEach(msm => queryParamBuilder.withSort(msm.field, msm.order === 1));
100
- }
101
- // apply filtering
102
- if (event.filters) {
103
- for (const key of Object.keys(event.filters)) {
104
- const filterEvent = event.filters[key];
105
- if (Array.isArray(filterEvent)) {
106
- filterEvent.filter(e => e.value).forEach(e => MediusRestUtil.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, e));
107
- }
108
- else if (typeof filterEvent === 'object') {
109
- if (filterEvent.value) {
110
- MediusRestUtil.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, filterEvent);
111
- }
112
- }
113
- }
114
- }
115
- return queryParamBuilder.build();
116
- }
117
- static addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, property, filterMetadata) {
118
- const matchType = MediusRestUtil.getMediusFilterMatchTypeFromPrimeMatchMode(filterMetadata.matchMode ?? 'equals');
119
- queryParamBuilder.withFilter(property, filterMetadata.value, undefined, matchType);
120
- }
121
- static getMediusFilterMatchTypeFromPrimeMatchMode(matchMode, dataType) {
122
- return MediusRestUtil.getMapping(matchMode, dataType)?.[2] ?? MediusFilterMatchType.Equals;
123
- }
124
- static getMapping(matchMode, dataType, idx = 0) {
125
- const mappings = MediusRestUtil.matchModeMapping.filter(m => m[idx] === matchMode && (!dataType || !m[3] || dataType === m[3]));
126
- if (mappings.length === 0) {
127
- return null;
128
- }
129
- else if (mappings.length === 1) {
130
- return mappings[0];
131
- }
132
- else {
133
- return mappings.sort((m1, m2) => (m2[3] ?? -1) - (m1[3] ?? -1))[0];
134
- }
135
- }
136
- }
137
- // first value is from primeNG, second is for use in query params
138
- MediusRestUtil.matchModeMapping = [
139
- [FilterMatchMode.CONTAINS, 'c', MediusFilterMatchType.Contains, null],
140
- [FilterMatchMode.ENDS_WITH, 'ew', MediusFilterMatchType.EndsWith, null],
141
- [FilterMatchMode.EQUALS, 'eq', MediusFilterMatchType.Equals, null],
142
- [FilterMatchMode.GREATER_THAN, 'gt', MediusFilterMatchType.GreaterThan, null],
143
- [FilterMatchMode.LESS_THAN, 'lt', MediusFilterMatchType.SmallerThan, null],
144
- [FilterMatchMode.STARTS_WITH, 'sw', MediusFilterMatchType.StartsWith, null],
145
- [FilterMatchMode.IN, 'in', MediusFilterMatchType.In, null],
146
- [FilterMatchMode.NOT_EQUALS, 'neq', MediusFilterMatchType.NotEquals, null],
147
- [FilterMatchMode.DATE_IS, 'eq', MediusFilterMatchType.Equals, FilterDescriptor.TypeEnum.Date],
148
- [FilterMatchMode.DATE_BEFORE, 'lt', MediusFilterMatchType.SmallerThan, FilterDescriptor.TypeEnum.Date],
149
- [FilterMatchMode.DATE_AFTER, 'gt', MediusFilterMatchType.GreaterThan, FilterDescriptor.TypeEnum.Date],
150
- [FilterMatchMode.DATE_IS_NOT, 'neq', MediusFilterMatchType.NotEquals, FilterDescriptor.TypeEnum.Date]
151
- ];
1
+ import { FilterMatchMode } from 'primeng/api';
2
+ import { FilterDescriptor } from '../../descriptors';
3
+ import { MediusFilterMatchType, MediusQueryParamBuilder } from '../models';
4
+ export class MediusRestUtil {
5
+ static fromAngularQueryParamsToMediusQueryParams(params, filterDescriptors, defaultItemsPerPage = 10, defaultOffset = 0) {
6
+ const offset = params['first'] ? parseInt(params['first']) : defaultOffset;
7
+ const itemsPerPage = params['rows'] ? parseInt(params['rows']) : defaultItemsPerPage;
8
+ const mediusParamsBuilder = MediusQueryParamBuilder.create(itemsPerPage, offset);
9
+ if (params['sort']) {
10
+ for (const sort of params['sort'].split(',')) {
11
+ const qpSortSplit = sort.split(':');
12
+ const field = qpSortSplit[0];
13
+ const asc = qpSortSplit.length > 1 ? qpSortSplit[1] === 'asc' : true;
14
+ mediusParamsBuilder.withSort(field, asc);
15
+ }
16
+ }
17
+ if (params['filter']) {
18
+ const filterSplit = params['filter'].split(',');
19
+ for (const filterField of filterSplit) {
20
+ const filterFieldSplit = filterField.split(':');
21
+ const field = filterFieldSplit[0];
22
+ const operator = filterFieldSplit.length > 1 ? filterFieldSplit[1] : 'eq';
23
+ // prepare value
24
+ let value = filterFieldSplit.length > 2 ? filterFieldSplit.slice(2).join(':') : '';
25
+ const valueTo = undefined;
26
+ if (value.startsWith("'")) {
27
+ value = value.substring(1, value.length - 1);
28
+ }
29
+ if (value.startsWith('[') && value.endsWith(']')) {
30
+ value = value
31
+ .substring(1, value.length - 1)
32
+ .split(',')
33
+ .map((v) => (v.startsWith("'") ? v.substring(1, v.length - 1) : v));
34
+ }
35
+ const filterDescriptor = filterDescriptors.find(f => f.property === field);
36
+ const matchMode = MediusRestUtil.getMapping(operator, filterDescriptor?.filterType, 1);
37
+ if (matchMode && filterDescriptor) {
38
+ const fieldFilterProperty = filterDescriptor.filterProperty ?? filterDescriptor.property;
39
+ mediusParamsBuilder.withFilter(fieldFilterProperty, value, valueTo, MediusRestUtil.getMediusFilterMatchTypeFromPrimeMatchMode(matchMode[0]));
40
+ }
41
+ }
42
+ }
43
+ return mediusParamsBuilder.build();
44
+ }
45
+ static fromPrimeLazyLoadEventToAngularQueryParams(event, defaultItemsPerPage = 10, defaultOffset = 0) {
46
+ const params = {
47
+ first: null,
48
+ rows: null,
49
+ sort: null,
50
+ filter: null
51
+ };
52
+ if (event.first && event.first !== defaultOffset && event.first > 0) {
53
+ params['first'] = event.first;
54
+ }
55
+ if (event.rows && event.rows !== defaultItemsPerPage && event.rows > 0) {
56
+ params['rows'] = event.rows;
57
+ }
58
+ if (event.multiSortMeta?.length ?? 0 > 0) {
59
+ params['sort'] = event.multiSortMeta?.map(s => `${s.field}${s.order === 1 ? '' : ':desc'}`).join(',');
60
+ }
61
+ if (event.filters) {
62
+ const filters = [];
63
+ for (const field in event.filters) {
64
+ const primeOperator = event.filters[field].matchMode;
65
+ let value = event.filters[field].value;
66
+ const operatorMapping = primeOperator ? MediusRestUtil.getMapping(primeOperator, undefined, 0) : undefined;
67
+ if (operatorMapping && typeof value !== 'undefined' && value !== null) {
68
+ let doAddFilter = false;
69
+ if (typeof value === 'string' && value.length > 0) {
70
+ value = `'${value}'`;
71
+ doAddFilter = true;
72
+ }
73
+ else if (typeof value === 'number') {
74
+ doAddFilter = true;
75
+ }
76
+ else if (Array.isArray(value)) {
77
+ value = `[${value.map(v => `'${v}'`).join(',')}]`;
78
+ doAddFilter = true;
79
+ }
80
+ else if (value instanceof Date) {
81
+ value = `${value.toISOString()}`;
82
+ doAddFilter = true;
83
+ }
84
+ if (doAddFilter) {
85
+ filters.push(`${field}:${operatorMapping[1]}:${value}`);
86
+ }
87
+ }
88
+ }
89
+ if (filters.length > 0) {
90
+ params['filter'] = filters.join(',');
91
+ }
92
+ }
93
+ return params;
94
+ }
95
+ static fromPrimeLazyLoadEventToMediusQueryParams(event) {
96
+ const queryParamBuilder = MediusQueryParamBuilder.create(event.rows, event.first);
97
+ // apply sorting
98
+ if (event.multiSortMeta) {
99
+ event.multiSortMeta.forEach(msm => queryParamBuilder.withSort(msm.field, msm.order === 1));
100
+ }
101
+ // apply filtering
102
+ if (event.filters) {
103
+ for (const key of Object.keys(event.filters)) {
104
+ const filterEvent = event.filters[key];
105
+ if (Array.isArray(filterEvent)) {
106
+ filterEvent.filter(e => e.value).forEach(e => MediusRestUtil.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, e));
107
+ }
108
+ else if (typeof filterEvent === 'object') {
109
+ if (filterEvent.value) {
110
+ MediusRestUtil.addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, key, filterEvent);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ return queryParamBuilder.build();
116
+ }
117
+ static addMediusFilterFromPrimeFilterMetadata(queryParamBuilder, property, filterMetadata) {
118
+ const matchType = MediusRestUtil.getMediusFilterMatchTypeFromPrimeMatchMode(filterMetadata.matchMode ?? 'equals');
119
+ queryParamBuilder.withFilter(property, filterMetadata.value, undefined, matchType);
120
+ }
121
+ static getMediusFilterMatchTypeFromPrimeMatchMode(matchMode, dataType) {
122
+ return MediusRestUtil.getMapping(matchMode, dataType)?.[2] ?? MediusFilterMatchType.Equals;
123
+ }
124
+ static getMapping(matchMode, dataType, idx = 0) {
125
+ const mappings = MediusRestUtil.matchModeMapping.filter(m => m[idx] === matchMode && (!dataType || !m[3] || dataType === m[3]));
126
+ if (mappings.length === 0) {
127
+ return null;
128
+ }
129
+ else if (mappings.length === 1) {
130
+ return mappings[0];
131
+ }
132
+ else {
133
+ return mappings.sort((m1, m2) => (m2[3] ?? -1) - (m1[3] ?? -1))[0];
134
+ }
135
+ }
136
+ }
137
+ // first value is from primeNG, second is for use in query params
138
+ MediusRestUtil.matchModeMapping = [
139
+ [FilterMatchMode.CONTAINS, 'c', MediusFilterMatchType.Contains, null],
140
+ [FilterMatchMode.ENDS_WITH, 'ew', MediusFilterMatchType.EndsWith, null],
141
+ [FilterMatchMode.EQUALS, 'eq', MediusFilterMatchType.Equals, null],
142
+ [FilterMatchMode.GREATER_THAN, 'gt', MediusFilterMatchType.GreaterThan, null],
143
+ [FilterMatchMode.LESS_THAN, 'lt', MediusFilterMatchType.SmallerThan, null],
144
+ [FilterMatchMode.STARTS_WITH, 'sw', MediusFilterMatchType.StartsWith, null],
145
+ [FilterMatchMode.IN, 'in', MediusFilterMatchType.In, null],
146
+ [FilterMatchMode.NOT_EQUALS, 'neq', MediusFilterMatchType.NotEquals, null],
147
+ [FilterMatchMode.DATE_IS, 'eq', MediusFilterMatchType.Equals, FilterDescriptor.TypeEnum.Date],
148
+ [FilterMatchMode.DATE_BEFORE, 'lt', MediusFilterMatchType.SmallerThan, FilterDescriptor.TypeEnum.Date],
149
+ [FilterMatchMode.DATE_AFTER, 'gt', MediusFilterMatchType.GreaterThan, FilterDescriptor.TypeEnum.Date],
150
+ [FilterMatchMode.DATE_IS_NOT, 'neq', MediusFilterMatchType.NotEquals, FilterDescriptor.TypeEnum.Date]
151
+ ];
152
152
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaXVzLXJlc3QudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYXBpL3V0aWxzL21lZGl1cy1yZXN0LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGVBQWUsRUFBZ0MsTUFBTSxhQUFhLENBQUM7QUFFM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFDLHFCQUFxQixFQUFvQix1QkFBdUIsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUUzRixNQUFNLE9BQU8sY0FBYztJQWlCaEIsTUFBTSxDQUFDLHlDQUF5QyxDQUNuRCxNQUFjLEVBQ2QsaUJBQStDLEVBQy9DLG1CQUFtQixHQUFHLEVBQUUsRUFDeEIsYUFBYSxHQUFHLENBQUM7UUFFakIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUMzRSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUM7UUFFckYsTUFBTSxtQkFBbUIsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWpGLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2hCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxLQUFLLEdBQUcsV0FB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Q0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQzdGLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUscUJBQXFCLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDdEcsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztJQUNyRyxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0NBQ3hHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BhcmFtc30gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtGaWx0ZXJNYXRjaE1vZGUsIEZpbHRlck1ldGFkYXRhLCBMYXp5TG9hZEV2ZW50fSBmcm9tICdwcmltZW5nL2FwaSc7XG5cbmltcG9ydCB7RmlsdGVyRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vZGVzY3JpcHRvcnMnO1xuaW1wb3J0IHtNYXRjaE1vZGVNYXBUeXBlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge01lZGl1c0ZpbHRlck1hdGNoVHlwZSwgTWVkaXVzUXVlcnlQYXJhbSwgTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXJ9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBjbGFzcyBNZWRpdXNSZXN0VXRpbCB7XG4gICAgLy8gZmlyc3QgdmFsdWUgaXMgZnJvbSBwcmltZU5HLCBzZWNvbmQgaXMgZm9yIHVzZSBpbiBxdWVyeSBwYXJhbXNcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBtYXRjaE1vZGVNYXBwaW5nOiBBcnJheTxNYXRjaE1vZGVNYXBUeXBlPiA9IFtcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5DT05UQUlOUywgJ2MnLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuQ29udGFpbnMsIG51bGxdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkVORFNfV0lUSCwgJ2V3JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkVuZHNXaXRoLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5FUVVBTFMsICdlcScsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FcXVhbHMsIG51bGxdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkdSRUFURVJfVEhBTiwgJ2d0JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkdyZWF0ZXJUaGFuLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5MRVNTX1RIQU4sICdsdCcsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5TbWFsbGVyVGhhbiwgbnVsbF0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuU1RBUlRTX1dJVEgsICdzdycsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5TdGFydHNXaXRoLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5JTiwgJ2luJywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkluLCBudWxsXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5OT1RfRVFVQUxTLCAnbmVxJywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFscywgbnVsbF0sXG4gICAgICAgIFtGaWx0ZXJNYXRjaE1vZGUuREFURV9JUywgJ2VxJywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkVxdWFscywgRmlsdGVyRGVzY3JpcHRvci5UeXBlRW51bS5EYXRlXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5EQVRFX0JFRk9SRSwgJ2x0JywgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLlNtYWxsZXJUaGFuLCBGaWx0ZXJEZXNjcmlwdG9yLlR5cGVFbnVtLkRhdGVdLFxuICAgICAgICBbRmlsdGVyTWF0Y2hNb2RlLkRBVEVfQUZURVIsICdndCcsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5HcmVhdGVyVGhhbiwgRmlsdGVyRGVzY3JpcHRvci5UeXBlRW51bS5EYXRlXSxcbiAgICAgICAgW0ZpbHRlck1hdGNoTW9kZS5EQVRFX0lTX05PVCwgJ25lcScsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Ob3RFcXVhbHMsIEZpbHRlckRlc2NyaXB0b3IuVHlwZUVudW0uRGF0ZV1cbiAgICBdO1xuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQW5ndWxhclF1ZXJ5UGFyYW1zVG9NZWRpdXNRdWVyeVBhcmFtcyhcbiAgICAgICAgcGFyYW1zOiBQYXJhbXMsXG4gICAgICAgIGZpbHRlckRlc2NyaXB0b3JzOiBBcnJheTxGaWx0ZXJEZXNjcmlwdG9yPGFueT4+LFxuICAgICAgICBkZWZhdWx0SXRlbXNQZXJQYWdlID0gMTAsXG4gICAgICAgIGRlZmF1bHRPZmZzZXQgPSAwXG4gICAgKTogTWVkaXVzUXVlcnlQYXJhbSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHBhcmFtc1snZmlyc3QnXSA/IHBhcnNlSW50KHBhcmFtc1snZmlyc3QnXSkgOiBkZWZhdWx0T2Zmc2V0O1xuICAgICAgICBjb25zdCBpdGVtc1BlclBhZ2UgPSBwYXJhbXNbJ3Jvd3MnXSA/IHBhcnNlSW50KHBhcmFtc1sncm93cyddKSA6IGRlZmF1bHRJdGVtc1BlclBhZ2U7XG5cbiAgICAgICAgY29uc3QgbWVkaXVzUGFyYW1zQnVpbGRlciA9IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZShpdGVtc1BlclBhZ2UsIG9mZnNldCk7XG5cbiAgICAgICAgaWYgKHBhcmFtc1snc29ydCddKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvcnQgb2YgcGFyYW1zWydzb3J0J10uc3BsaXQoJywnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHFwU29ydFNwbGl0ID0gc29ydC5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gcXBTb3J0U3BsaXRbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgYXNjID0gcXBTb3J0U3BsaXQubGVuZ3RoID4gMSA/IHFwU29ydFNwbGl0WzFdID09PSAnYXNjJyA6IHRydWU7XG4gICAgICAgICAgICAgICAgbWVkaXVzUGFyYW1zQnVpbGRlci53aXRoU29ydChmaWVsZCwgYXNjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zWydmaWx0ZXInXSkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyU3BsaXQgPSBwYXJhbXNbJ2ZpbHRlciddLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbHRlckZpZWxkIG9mIGZpbHRlclNwbGl0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyRmllbGRTcGxpdCA9IGZpbHRlckZpZWxkLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWx0ZXJGaWVsZFNwbGl0WzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdG9yID0gZmlsdGVyRmllbGRTcGxpdC5sZW5ndGggPiAxID8gZmlsdGVyRmllbGRTcGxpdFsxXSA6ICdlcSc7XG5cbiAgICAgICAgICAgICAgICAvLyBwcmVwYXJlIHZhbHVlXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBmaWx0ZXJGaWVsZFNwbGl0Lmxlbmd0aCA+IDIgPyBmaWx0ZXJGaWVsZFNwbGl0LnNsaWNlKDIpLmpvaW4oJzonKSA6ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlVG86IGFueSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIidcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdbJykgJiYgdmFsdWUuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgodjogc3RyaW5nKSA9PiAodi5zdGFydHNXaXRoKFwiJ1wiKSA/IHYuc3Vic3RyaW5nKDEsIHYubGVuZ3RoIC0gMSkgOiB2KSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyRGVzY3JpcHRvciA9IGZpbHRlckRlc2NyaXB0b3JzLmZpbmQoZiA9PiBmLnByb3BlcnR5ID09PSBmaWVsZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gTWVkaXVzUmVzdFV0aWwuZ2V0TWFwcGluZyhvcGVyYXRvciwgZmlsdGVyRGVzY3JpcHRvcj8uZmlsdGVyVHlwZSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoTW9kZSAmJiBmaWx0ZXJEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkRmlsdGVyUHJvcGVydHkgPSBmaWx0ZXJEZXNjcmlwdG9yLmZpbHRlclByb3BlcnR5ID8/IGZpbHRlckRlc2NyaXB0b3IucHJvcGVydHk7XG4gICAgICAgICAgICAgICAgICAgIG1lZGl1c1BhcmFtc0J1aWxkZXIud2l0aEZpbHRlcihmaWVsZEZpbHRlclByb3BlcnR5LCB2YWx1ZSwgdmFsdWVUbywgTWVkaXVzUmVzdFV0aWwuZ2V0TWVkaXVzRmlsdGVyTWF0Y2hUeXBlRnJvbVByaW1lTWF0Y2hNb2RlKG1hdGNoTW9kZVswXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZWRpdXNQYXJhbXNCdWlsZGVyLmJ1aWxkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tUHJpbWVMYXp5TG9hZEV2ZW50VG9Bbmd1bGFyUXVlcnlQYXJhbXMoZXZlbnQ6IExhenlMb2FkRXZlbnQsIGRlZmF1bHRJdGVtc1BlclBhZ2UgPSAxMCwgZGVmYXVsdE9mZnNldCA9IDApOiBQYXJhbXMge1xuICAgICAgICBjb25zdCBwYXJhbXM6IFBhcmFtcyA9IHtcbiAgICAgICAgICAgIGZpcnN0OiBudWxsLFxuICAgICAgICAgICAgcm93czogbnVsbCxcbiAgICAgICAgICAgIHNvcnQ6IG51bGwsXG4gICAgICAgICAgICBmaWx0ZXI6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZXZlbnQuZmlyc3QgJiYgZXZlbnQuZmlyc3QgIT09IGRlZmF1bHRPZmZzZXQgJiYgZXZlbnQuZmlyc3QgPiAwKSB7XG4gICAgICAgICAgICBwYXJhbXNbJ2ZpcnN0J10gPSBldmVudC5maXJzdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQucm93cyAmJiBldmVudC5yb3dzICE9PSBkZWZhdWx0SXRlbXNQZXJQYWdlICYmIGV2ZW50LnJvd3MgPiAwKSB7XG4gICAgICAgICAgICBwYXJhbXNbJ3Jvd3MnXSA9IGV2ZW50LnJvd3M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQubXVsdGlTb3J0TWV0YT8ubGVuZ3RoID8/IDAgPiAwKSB7XG4gICAgICAgICAgICBwYXJhbXNbJ3NvcnQnXSA9IGV2ZW50Lm11bHRpU29ydE1ldGE/Lm1hcChzID0+IGAke3MuZmllbGR9JHtzLm9yZGVyID09PSAxID8gJycgOiAnOmRlc2MnfWApLmpvaW4oJywnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5maWx0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIGV2ZW50LmZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmltZU9wZXJhdG9yID0gZXZlbnQuZmlsdGVyc1tmaWVsZF0ubWF0Y2hNb2RlO1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGV2ZW50LmZpbHRlcnNbZmllbGRdLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdG9yTWFwcGluZyA9IHByaW1lT3BlcmF0b3IgPyBNZWRpdXNSZXN0VXRpbC5nZXRNYXBwaW5nKHByaW1lT3BlcmF0b3IsIHVuZGVmaW5lZCwgMCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wZXJhdG9yTWFwcGluZyAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb0FkZEZpbHRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGAnJHt2YWx1ZX0nYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvQWRkRmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb0FkZEZpbHRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYFske3ZhbHVlLm1hcCh2ID0+IGAnJHt2fSdgKS5qb2luKCcsJyl9XWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb0FkZEZpbHRlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlLnRvSVNPU3RyaW5nKCl9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvQWRkRmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkb0FkZEZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKGAke2ZpZWxkfToke29wZXJhdG9yTWFwcGluZ1sxXX06JHt2YWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNbJ2ZpbHRlciddID0gZmlsdGVycy5qb2luKCcsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvTWVkaXVzUXVlcnlQYXJhbXMoZXZlbnQ6IExhenlMb2FkRXZlbnQpOiBNZWRpdXNRdWVyeVBhcmFtIHtcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbUJ1aWxkZXIgPSBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGUoZXZlbnQucm93cywgZXZlbnQuZmlyc3QpO1xuXG4gICAgICAgIC8vIGFwcGx5IHNvcnRpbmdcbiAgICAgICAgaWYgKGV2ZW50Lm11bHRpU29ydE1ldGEpIHtcbiAgICAgICAgICAgIGV2ZW50Lm11bHRpU29ydE1ldGEuZm9yRWFjaChtc20gPT4gcXVlcnlQYXJhbUJ1aWxkZXIud2l0aFNvcnQobXNtLmZpZWxkLCBtc20ub3JkZXIgPT09IDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFwcGx5IGZpbHRlcmluZ1xuICAgICAgICBpZiAoZXZlbnQuZmlsdGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZXZlbnQuZmlsdGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJFdmVudCA9IGV2ZW50LmZpbHRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJFdmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgKGZpbHRlckV2ZW50IGFzIEZpbHRlck1ldGFkYXRhW10pLmZpbHRlcihlID0+IGUudmFsdWUpLmZvckVhY2goZSA9PiBNZWRpdXNSZXN0VXRpbC5hZGRNZWRpdXNGaWx0ZXJGcm9tUHJpbWVGaWx0ZXJNZXRhZGF0YShxdWVyeVBhcmFtQnVpbGRlciwga2V5LCBlKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmlsdGVyRXZlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJFdmVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTWVkaXVzUmVzdFV0aWwuYWRkTWVkaXVzRmlsdGVyRnJvbVByaW1lRmlsdGVyTWV0YWRhdGEocXVlcnlQYXJhbUJ1aWxkZXIsIGtleSwgZmlsdGVyRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1CdWlsZGVyLmJ1aWxkKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhZGRNZWRpdXNGaWx0ZXJGcm9tUHJpbWVGaWx0ZXJNZXRhZGF0YShxdWVyeVBhcmFtQnVpbGRlcjogTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIsIHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlck1ldGFkYXRhOiBGaWx0ZXJNZXRhZGF0YSkge1xuICAgICAgICBjb25zdCBtYXRjaFR5cGU6IE1lZGl1c0ZpbHRlck1hdGNoVHlwZSA9IE1lZGl1c1Jlc3RVdGlsLmdldE1lZGl1c0ZpbHRlck1hdGNoVHlwZUZyb21QcmltZU1hdGNoTW9kZShmaWx0ZXJNZXRhZGF0YS5tYXRjaE1vZGUgPz8gJ2VxdWFscycpO1xuICAgICAgICBxdWVyeVBhcmFtQnVpbGRlci53aXRoRmlsdGVyKHByb3BlcnR5LCBmaWx0ZXJNZXRhZGF0YS52YWx1ZSwgdW5kZWZpbmVkLCBtYXRjaFR5cGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TWVkaXVzRmlsdGVyTWF0Y2hUeXBlRnJvbVByaW1lTWF0Y2hNb2RlKG1hdGNoTW9kZTogc3RyaW5nLCBkYXRhVHlwZT86IEZpbHRlckRlc2NyaXB0b3IuVHlwZUVudW0pOiBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUge1xuICAgICAgICByZXR1cm4gTWVkaXVzUmVzdFV0aWwuZ2V0TWFwcGluZyhtYXRjaE1vZGUsIGRhdGFUeXBlKT8uWzJdID8/IE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FcXVhbHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRNYXBwaW5nKG1hdGNoTW9kZTogc3RyaW5nLCBkYXRhVHlwZT86IEZpbHRlckRlc2NyaXB0b3IuVHlwZUVudW0sIGlkeCA9IDApOiBNYXRjaE1vZGVNYXBUeXBlIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IG1hcHBpbmdzID0gTWVkaXVzUmVzdFV0aWwubWF0Y2hNb2RlTWFwcGluZy5maWx0ZXIobSA9PiBtW2lkeF0gPT09IG1hdGNoTW9kZSAmJiAoIWRhdGFUeXBlIHx8ICFtWzNdIHx8IGRhdGFUeXBlID09PSBtWzNdKSk7XG4gICAgICAgIGlmIChtYXBwaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG1hcHBpbmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdzWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdzLnNvcnQoKG0xLCBtMikgPT4gKG0yWzNdID8/IC0xKSAtIChtMVszXSA/PyAtMSkpWzBdO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19