@yuuvis/client-framework 0.6.5

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 (392) hide show
  1. package/README.md +62 -0
  2. package/actions/README.md +3 -0
  3. package/actions/index.d.ts +6 -0
  4. package/actions/lib/actions/copy-action/copy-action.d.ts +17 -0
  5. package/actions/lib/actions/cut-action/cut-action.d.ts +17 -0
  6. package/actions/lib/actions/delete-action/delete/delete.component.d.ts +22 -0
  7. package/actions/lib/actions/delete-action/delete-action.d.ts +17 -0
  8. package/actions/lib/actions/download-action/download-action.d.ts +17 -0
  9. package/actions/lib/actions.icon.d.ts +7 -0
  10. package/actions/lib/actions.interface.d.ts +86 -0
  11. package/actions/lib/actions.module.d.ts +8 -0
  12. package/actions/lib/actions.service.d.ts +38 -0
  13. package/actions/lib/components/contextmenu/contextmenu.component.d.ts +11 -0
  14. package/app-bar/README.md +3 -0
  15. package/app-bar/index.d.ts +1 -0
  16. package/app-bar/lib/app-bar.component.d.ts +47 -0
  17. package/clipboard/README.md +3 -0
  18. package/clipboard/index.d.ts +1 -0
  19. package/clipboard/lib/clipboard.component.d.ts +16 -0
  20. package/common/README.md +3 -0
  21. package/common/index.d.ts +5 -0
  22. package/common/lib/components/focus-indicator/focus-indicator.component.d.ts +7 -0
  23. package/common/lib/components/token-input/token-input.component.d.ts +55 -0
  24. package/common/lib/components/token-input/token-input.interface.d.ts +8 -0
  25. package/common/lib/directives/busy-overlay.directive.d.ts +25 -0
  26. package/common/lib/directives/click-double.directive.d.ts +17 -0
  27. package/common/lib/directives/container-size.directive.d.ts +30 -0
  28. package/common/lib/directives/drag-select.directive.d.ts +21 -0
  29. package/common/lib/directives/file-drop-zone/file-drop-zone.directive.d.ts +18 -0
  30. package/common/lib/directives/file-drop-zone/file-drop-zone.interface.d.ts +5 -0
  31. package/common/lib/directives/focus-within.directive.d.ts +36 -0
  32. package/common/lib/directives/index.d.ts +8 -0
  33. package/common/lib/directives/light-dismiss.directive.d.ts +19 -0
  34. package/common/lib/directives/longpress.directive.d.ts +13 -0
  35. package/common/lib/directives/noop-value-accessor.directive.d.ts +10 -0
  36. package/esm2022/actions/index.mjs +7 -0
  37. package/esm2022/actions/lib/actions/copy-action/copy-action.mjs +31 -0
  38. package/esm2022/actions/lib/actions/cut-action/cut-action.mjs +30 -0
  39. package/esm2022/actions/lib/actions/delete-action/delete/delete.component.mjs +67 -0
  40. package/esm2022/actions/lib/actions/delete-action/delete-action.mjs +44 -0
  41. package/esm2022/actions/lib/actions/download-action/download-action.mjs +33 -0
  42. package/esm2022/actions/lib/actions.icon.mjs +8 -0
  43. package/esm2022/actions/lib/actions.interface.mjs +19 -0
  44. package/esm2022/actions/lib/actions.module.mjs +16 -0
  45. package/esm2022/actions/lib/actions.service.mjs +89 -0
  46. package/esm2022/actions/lib/components/contextmenu/contextmenu.component.mjs +27 -0
  47. package/esm2022/actions/yuuvis-client-framework-actions.mjs +5 -0
  48. package/esm2022/app-bar/index.mjs +2 -0
  49. package/esm2022/app-bar/lib/app-bar.component.mjs +89 -0
  50. package/esm2022/app-bar/yuuvis-client-framework-app-bar.mjs +5 -0
  51. package/esm2022/clipboard/index.mjs +2 -0
  52. package/esm2022/clipboard/lib/clipboard.component.mjs +48 -0
  53. package/esm2022/clipboard/yuuvis-client-framework-clipboard.mjs +5 -0
  54. package/esm2022/common/index.mjs +6 -0
  55. package/esm2022/common/lib/components/focus-indicator/focus-indicator.component.mjs +41 -0
  56. package/esm2022/common/lib/components/token-input/token-input.component.mjs +324 -0
  57. package/esm2022/common/lib/components/token-input/token-input.interface.mjs +2 -0
  58. package/esm2022/common/lib/directives/busy-overlay.directive.mjs +88 -0
  59. package/esm2022/common/lib/directives/click-double.directive.mjs +61 -0
  60. package/esm2022/common/lib/directives/container-size.directive.mjs +56 -0
  61. package/esm2022/common/lib/directives/drag-select.directive.mjs +114 -0
  62. package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.directive.mjs +153 -0
  63. package/esm2022/common/lib/directives/file-drop-zone/file-drop-zone.interface.mjs +2 -0
  64. package/esm2022/common/lib/directives/focus-within.directive.mjs +81 -0
  65. package/esm2022/common/lib/directives/index.mjs +9 -0
  66. package/esm2022/common/lib/directives/light-dismiss.directive.mjs +44 -0
  67. package/esm2022/common/lib/directives/longpress.directive.mjs +36 -0
  68. package/esm2022/common/lib/directives/noop-value-accessor.directive.mjs +42 -0
  69. package/esm2022/common/yuuvis-client-framework-common.mjs +5 -0
  70. package/esm2022/forms/index.mjs +19 -0
  71. package/esm2022/forms/lib/elements/catalog/catalog.component.mjs +118 -0
  72. package/esm2022/forms/lib/elements/datetime/datetime.component.mjs +82 -0
  73. package/esm2022/forms/lib/elements/datetime-range/datetime-range.component.mjs +166 -0
  74. package/esm2022/forms/lib/elements/number/number.component.mjs +195 -0
  75. package/esm2022/forms/lib/elements/number-range/number-range.component.mjs +176 -0
  76. package/esm2022/forms/lib/elements/organization/organization.component.mjs +268 -0
  77. package/esm2022/forms/lib/elements/string/string.component.mjs +254 -0
  78. package/esm2022/forms/lib/form-input/form-input.component.mjs +88 -0
  79. package/esm2022/forms/lib/forms.module.mjs +58 -0
  80. package/esm2022/forms/yuuvis-client-framework-forms.mjs +5 -0
  81. package/esm2022/icons/index.mjs +4 -0
  82. package/esm2022/icons/lib/icon.service.mjs +59 -0
  83. package/esm2022/icons/lib/icons.mjs +31 -0
  84. package/esm2022/icons/lib/object-type-icon/object-type-icon.component.mjs +29 -0
  85. package/esm2022/icons/yuuvis-client-framework-icons.mjs +5 -0
  86. package/esm2022/index.mjs +2 -0
  87. package/esm2022/lib/yuuvis-client-framework.module.mjs +15 -0
  88. package/esm2022/list/index.mjs +3 -0
  89. package/esm2022/list/lib/list-item.directive.mjs +72 -0
  90. package/esm2022/list/lib/list.component.mjs +133 -0
  91. package/esm2022/list/yuuvis-client-framework-list.mjs +5 -0
  92. package/esm2022/metadata-form/index.mjs +4 -0
  93. package/esm2022/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.mjs +31 -0
  94. package/esm2022/metadata-form/lib/metadata-form-element-registry.service.mjs +99 -0
  95. package/esm2022/metadata-form/lib/metadata-form-field/metadata-form-field.component.mjs +126 -0
  96. package/esm2022/metadata-form/lib/object-metadata-element-template.directive.mjs +52 -0
  97. package/esm2022/metadata-form/yuuvis-client-framework-metadata-form.mjs +5 -0
  98. package/esm2022/object-details/index.mjs +7 -0
  99. package/esm2022/object-details/lib/object-audit/object-audit.component.mjs +195 -0
  100. package/esm2022/object-details/lib/object-details-shell/object-details-shell.component.mjs +127 -0
  101. package/esm2022/object-details/lib/object-details.component.mjs +61 -0
  102. package/esm2022/object-details/lib/object-metadata/form-section-group.pipe.mjs +17 -0
  103. package/esm2022/object-details/lib/object-metadata/object-metadata.component.mjs +201 -0
  104. package/esm2022/object-details/lib/object-metadata/object-metadata.interface.mjs +2 -0
  105. package/esm2022/object-details/yuuvis-client-framework-object-details.mjs +5 -0
  106. package/esm2022/object-flavor/index.mjs +6 -0
  107. package/esm2022/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.mjs +25 -0
  108. package/esm2022/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.mjs +21 -0
  109. package/esm2022/object-flavor/lib/flavor-chip/flavor-chip.component.mjs +35 -0
  110. package/esm2022/object-flavor/lib/object-flavor/object-flavor.component.mjs +93 -0
  111. package/esm2022/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.mjs +43 -0
  112. package/esm2022/object-flavor/yuuvis-client-framework-object-flavor.mjs +5 -0
  113. package/esm2022/object-form/index.mjs +5 -0
  114. package/esm2022/object-form/lib/form-scripting.api.interface.mjs +2 -0
  115. package/esm2022/object-form/lib/form-scripting.service.mjs +160 -0
  116. package/esm2022/object-form/lib/object-form-element/object-form-element.component.mjs +87 -0
  117. package/esm2022/object-form/lib/object-form-extension.interface.mjs +36 -0
  118. package/esm2022/object-form/lib/object-form-group/object-form-group.component.mjs +85 -0
  119. package/esm2022/object-form/lib/object-form-script/form-scripting-element-extension/form-scripting-element-extension.component.mjs +23 -0
  120. package/esm2022/object-form/lib/object-form-script/object-form-script.service.mjs +115 -0
  121. package/esm2022/object-form/lib/object-form-script/object-form-scripting-scope.mjs +251 -0
  122. package/esm2022/object-form/lib/object-form-translate.service.mjs +73 -0
  123. package/esm2022/object-form/lib/object-form.component.mjs +627 -0
  124. package/esm2022/object-form/lib/object-form.interface.mjs +9 -0
  125. package/esm2022/object-form/lib/object-form.model.mjs +20 -0
  126. package/esm2022/object-form/lib/object-form.service.mjs +127 -0
  127. package/esm2022/object-form/lib/object-form.utils.mjs +55 -0
  128. package/esm2022/object-form/lib/object-form.validation.mjs +48 -0
  129. package/esm2022/object-form/yuuvis-client-framework-object-form.mjs +5 -0
  130. package/esm2022/object-preview/index.mjs +3 -0
  131. package/esm2022/object-preview/lib/components/index.mjs +3 -0
  132. package/esm2022/object-preview/lib/components/object-email-preview/object-email-preview.component.mjs +45 -0
  133. package/esm2022/object-preview/lib/components/object-preview/object-preview.component.mjs +78 -0
  134. package/esm2022/object-preview/lib/services/object-preview.service.mjs +92 -0
  135. package/esm2022/object-preview/yuuvis-client-framework-object-preview.mjs +5 -0
  136. package/esm2022/object-summary/index.mjs +5 -0
  137. package/esm2022/object-summary/lib/multi-object-summary/multi-object-summary.component.mjs +33 -0
  138. package/esm2022/object-summary/lib/object-summary/object-summary.component.mjs +273 -0
  139. package/esm2022/object-summary/lib/object-summary-data/object-summary-data.component.mjs +80 -0
  140. package/esm2022/object-summary/lib/object-summary.module.mjs +15 -0
  141. package/esm2022/object-summary/yuuvis-client-framework-object-summary.mjs +5 -0
  142. package/esm2022/pagination/index.mjs +3 -0
  143. package/esm2022/pagination/lib/pagination.component.mjs +48 -0
  144. package/esm2022/pagination/lib/pagination.interface.mjs +2 -0
  145. package/esm2022/pagination/yuuvis-client-framework-pagination.mjs +5 -0
  146. package/esm2022/panel/index.mjs +2 -0
  147. package/esm2022/panel/lib/panel.component.mjs +20 -0
  148. package/esm2022/panel/yuuvis-client-framework-panel.mjs +5 -0
  149. package/esm2022/renderer/index.mjs +11 -0
  150. package/esm2022/renderer/lib/property-renderer/abstract.renderer.mjs +29 -0
  151. package/esm2022/renderer/lib/property-renderer/datetime.renderer.mjs +13 -0
  152. package/esm2022/renderer/lib/property-renderer/decimal.renderer.component.mjs +12 -0
  153. package/esm2022/renderer/lib/property-renderer/filesize.renderer.component.mjs +28 -0
  154. package/esm2022/renderer/lib/property-renderer/icon.renderer.component.mjs +23 -0
  155. package/esm2022/renderer/lib/property-renderer/integer.renderer.component.mjs +12 -0
  156. package/esm2022/renderer/lib/property-renderer/organization.renderer.mjs +19 -0
  157. package/esm2022/renderer/lib/property-renderer/string.renderer.component.mjs +12 -0
  158. package/esm2022/renderer/lib/property-renderer/unknown.renderer.mjs +12 -0
  159. package/esm2022/renderer/lib/renderer.directive.mjs +51 -0
  160. package/esm2022/renderer/lib/services/renderer/renderer.interface.mjs +2 -0
  161. package/esm2022/renderer/lib/services/renderer/renderer.service.mjs +84 -0
  162. package/esm2022/renderer/yuuvis-client-framework-renderer.mjs +5 -0
  163. package/esm2022/sequence-list/index.mjs +6 -0
  164. package/esm2022/sequence-list/lib/due-date-picker/due-date-picker.component.mjs +99 -0
  165. package/esm2022/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.mjs +183 -0
  166. package/esm2022/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.mjs +114 -0
  167. package/esm2022/sequence-list/lib/sequence-list.component.mjs +146 -0
  168. package/esm2022/sequence-list/lib/sequence-list.interface.mjs +2 -0
  169. package/esm2022/sequence-list/yuuvis-client-framework-sequence-list.mjs +5 -0
  170. package/esm2022/simple-search/index.mjs +3 -0
  171. package/esm2022/simple-search/lib/simple-search/simple-search.component.mjs +111 -0
  172. package/esm2022/simple-search/lib/simple-search/simple-search.interface.mjs +2 -0
  173. package/esm2022/simple-search/yuuvis-client-framework-simple-search.mjs +5 -0
  174. package/esm2022/tile-list/index.mjs +11 -0
  175. package/esm2022/tile-list/lib/tile/tile.component.mjs +53 -0
  176. package/esm2022/tile-list/lib/tile-config/action-select/action-select.component.mjs +22 -0
  177. package/esm2022/tile-list/lib/tile-config/icon-select/icon-select.component.mjs +33 -0
  178. package/esm2022/tile-list/lib/tile-config/property-select/property-select.component.mjs +91 -0
  179. package/esm2022/tile-list/lib/tile-config/tile-config-tile/tile-config-tile.component.mjs +66 -0
  180. package/esm2022/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.mjs +46 -0
  181. package/esm2022/tile-list/lib/tile-config/tile-config.component.mjs +156 -0
  182. package/esm2022/tile-list/lib/tile-extension/directive/tile-extension.directive.mjs +37 -0
  183. package/esm2022/tile-list/lib/tile-extension/extensions/email.extension.mjs +42 -0
  184. package/esm2022/tile-list/lib/tile-extension/tile-extension.service.mjs +35 -0
  185. package/esm2022/tile-list/lib/tile-list/tile-list.component.mjs +510 -0
  186. package/esm2022/tile-list/lib/tile-list/tile-list.interface.mjs +2 -0
  187. package/esm2022/tile-list/yuuvis-client-framework-tile-list.mjs +5 -0
  188. package/esm2022/token-search/index.mjs +3 -0
  189. package/esm2022/token-search/token-search.component.mjs +78 -0
  190. package/esm2022/token-search/token-search.interface.mjs +2 -0
  191. package/esm2022/token-search/yuuvis-client-framework-token-search.mjs +5 -0
  192. package/esm2022/tree/index.mjs +3 -0
  193. package/esm2022/tree/lib/tree-node/tree-node.component.mjs +65 -0
  194. package/esm2022/tree/lib/tree.component.mjs +148 -0
  195. package/esm2022/tree/lib/tree.interface.mjs +2 -0
  196. package/esm2022/tree/lib/tree.service.mjs +95 -0
  197. package/esm2022/tree/yuuvis-client-framework-tree.mjs +5 -0
  198. package/esm2022/upload-progress/index.mjs +2 -0
  199. package/esm2022/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.mjs +49 -0
  200. package/esm2022/upload-progress/lib/upload-progress/upload-progress.component.mjs +37 -0
  201. package/esm2022/upload-progress/yuuvis-client-framework-upload-progress.mjs +5 -0
  202. package/esm2022/user-avatar/index.mjs +3 -0
  203. package/esm2022/user-avatar/lib/user-avatar.component.mjs +69 -0
  204. package/esm2022/user-avatar/lib/user-avatar.module.mjs +24 -0
  205. package/esm2022/user-avatar/yuuvis-client-framework-user-avatar.mjs +5 -0
  206. package/esm2022/yuuvis-client-framework.mjs +5 -0
  207. package/fesm2022/yuuvis-client-framework-actions.mjs +333 -0
  208. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -0
  209. package/fesm2022/yuuvis-client-framework-app-bar.mjs +96 -0
  210. package/fesm2022/yuuvis-client-framework-app-bar.mjs.map +1 -0
  211. package/fesm2022/yuuvis-client-framework-clipboard.mjs +55 -0
  212. package/fesm2022/yuuvis-client-framework-clipboard.mjs.map +1 -0
  213. package/fesm2022/yuuvis-client-framework-common.mjs +1020 -0
  214. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -0
  215. package/fesm2022/yuuvis-client-framework-forms.mjs +1355 -0
  216. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -0
  217. package/fesm2022/yuuvis-client-framework-icons.mjs +123 -0
  218. package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -0
  219. package/fesm2022/yuuvis-client-framework-list.mjs +209 -0
  220. package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -0
  221. package/fesm2022/yuuvis-client-framework-metadata-form.mjs +302 -0
  222. package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -0
  223. package/fesm2022/yuuvis-client-framework-object-details.mjs +583 -0
  224. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -0
  225. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +200 -0
  226. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -0
  227. package/fesm2022/yuuvis-client-framework-object-form.mjs +1664 -0
  228. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -0
  229. package/fesm2022/yuuvis-client-framework-object-preview.mjs +213 -0
  230. package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -0
  231. package/fesm2022/yuuvis-client-framework-object-summary.mjs +397 -0
  232. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -0
  233. package/fesm2022/yuuvis-client-framework-pagination.mjs +55 -0
  234. package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -0
  235. package/fesm2022/yuuvis-client-framework-panel.mjs +27 -0
  236. package/fesm2022/yuuvis-client-framework-panel.mjs.map +1 -0
  237. package/fesm2022/yuuvis-client-framework-renderer.mjs +262 -0
  238. package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -0
  239. package/fesm2022/yuuvis-client-framework-sequence-list.mjs +519 -0
  240. package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -0
  241. package/fesm2022/yuuvis-client-framework-simple-search.mjs +118 -0
  242. package/fesm2022/yuuvis-client-framework-simple-search.mjs.map +1 -0
  243. package/fesm2022/yuuvis-client-framework-tile-list.mjs +1036 -0
  244. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -0
  245. package/fesm2022/yuuvis-client-framework-token-search.mjs +85 -0
  246. package/fesm2022/yuuvis-client-framework-token-search.mjs.map +1 -0
  247. package/fesm2022/yuuvis-client-framework-tree.mjs +307 -0
  248. package/fesm2022/yuuvis-client-framework-tree.mjs.map +1 -0
  249. package/fesm2022/yuuvis-client-framework-upload-progress.mjs +84 -0
  250. package/fesm2022/yuuvis-client-framework-upload-progress.mjs.map +1 -0
  251. package/fesm2022/yuuvis-client-framework-user-avatar.mjs +96 -0
  252. package/fesm2022/yuuvis-client-framework-user-avatar.mjs.map +1 -0
  253. package/fesm2022/yuuvis-client-framework.mjs +22 -0
  254. package/fesm2022/yuuvis-client-framework.mjs.map +1 -0
  255. package/forms/README.md +3 -0
  256. package/forms/index.d.ts +9 -0
  257. package/forms/lib/elements/catalog/catalog.component.d.ts +68 -0
  258. package/forms/lib/elements/datetime/datetime.component.d.ts +32 -0
  259. package/forms/lib/elements/datetime-range/datetime-range.component.d.ts +51 -0
  260. package/forms/lib/elements/number/number.component.d.ts +77 -0
  261. package/forms/lib/elements/number-range/number-range.component.d.ts +66 -0
  262. package/forms/lib/elements/organization/organization.component.d.ts +93 -0
  263. package/forms/lib/elements/string/string.component.d.ts +104 -0
  264. package/forms/lib/form-input/form-input.component.d.ts +48 -0
  265. package/forms/lib/forms.module.d.ts +16 -0
  266. package/icons/README.md +5 -0
  267. package/icons/index.d.ts +3 -0
  268. package/icons/lib/icon.service.d.ts +38 -0
  269. package/icons/lib/icons.d.ts +1 -0
  270. package/icons/lib/object-type-icon/object-type-icon.component.d.ts +11 -0
  271. package/index.d.ts +1 -0
  272. package/lib/yuuvis-client-framework.module.d.ts +7 -0
  273. package/list/README.md +3 -0
  274. package/list/index.d.ts +2 -0
  275. package/list/lib/list-item.directive.d.ts +15 -0
  276. package/list/lib/list.component.d.ts +36 -0
  277. package/metadata-form/README.md +21 -0
  278. package/metadata-form/index.d.ts +3 -0
  279. package/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.d.ts +5 -0
  280. package/metadata-form/lib/metadata-form-element-registry.service.d.ts +47 -0
  281. package/metadata-form/lib/metadata-form-field/metadata-form-field.component.d.ts +31 -0
  282. package/metadata-form/lib/object-metadata-element-template.directive.d.ts +27 -0
  283. package/object-details/README.md +28 -0
  284. package/object-details/index.d.ts +6 -0
  285. package/object-details/lib/object-audit/object-audit.component.d.ts +59 -0
  286. package/object-details/lib/object-details-shell/object-details-shell.component.d.ts +51 -0
  287. package/object-details/lib/object-details.component.d.ts +36 -0
  288. package/object-details/lib/object-metadata/form-section-group.pipe.d.ts +8 -0
  289. package/object-details/lib/object-metadata/object-metadata.component.d.ts +48 -0
  290. package/object-details/lib/object-metadata/object-metadata.interface.d.ts +26 -0
  291. package/object-flavor/README.md +3 -0
  292. package/object-flavor/index.d.ts +5 -0
  293. package/object-flavor/lib/abstract-apply-create-flavor/abstract-apply-create-flavor.component.d.ts +12 -0
  294. package/object-flavor/lib/abstract-apply-object-flavor/abstract-apply-object-flavor.component.d.ts +12 -0
  295. package/object-flavor/lib/flavor-chip/flavor-chip.component.d.ts +17 -0
  296. package/object-flavor/lib/object-flavor/object-flavor.component.d.ts +26 -0
  297. package/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.d.ts +10 -0
  298. package/object-form/README.md +3 -0
  299. package/object-form/index.d.ts +4 -0
  300. package/object-form/lib/form-scripting.api.interface.d.ts +131 -0
  301. package/object-form/lib/form-scripting.service.d.ts +30 -0
  302. package/object-form/lib/object-form-element/object-form-element.component.d.ts +22 -0
  303. package/object-form/lib/object-form-extension.interface.d.ts +22 -0
  304. package/object-form/lib/object-form-group/object-form-group.component.d.ts +22 -0
  305. package/object-form/lib/object-form-script/form-scripting-element-extension/form-scripting-element-extension.component.d.ts +10 -0
  306. package/object-form/lib/object-form-script/object-form-script.service.d.ts +45 -0
  307. package/object-form/lib/object-form-script/object-form-scripting-scope.d.ts +50 -0
  308. package/object-form/lib/object-form-translate.service.d.ts +15 -0
  309. package/object-form/lib/object-form.component.d.ts +60 -0
  310. package/object-form/lib/object-form.interface.d.ts +113 -0
  311. package/object-form/lib/object-form.model.d.ts +18 -0
  312. package/object-form/lib/object-form.service.d.ts +39 -0
  313. package/object-form/lib/object-form.utils.d.ts +20 -0
  314. package/object-form/lib/object-form.validation.d.ts +21 -0
  315. package/object-preview/README.md +3 -0
  316. package/object-preview/index.d.ts +2 -0
  317. package/object-preview/lib/components/index.d.ts +2 -0
  318. package/object-preview/lib/components/object-email-preview/object-email-preview.component.d.ts +16 -0
  319. package/object-preview/lib/components/object-preview/object-preview.component.d.ts +13 -0
  320. package/object-preview/lib/services/object-preview.service.d.ts +37 -0
  321. package/object-summary/README.md +3 -0
  322. package/object-summary/index.d.ts +4 -0
  323. package/object-summary/lib/multi-object-summary/multi-object-summary.component.d.ts +7 -0
  324. package/object-summary/lib/object-summary/object-summary.component.d.ts +73 -0
  325. package/object-summary/lib/object-summary-data/object-summary-data.component.d.ts +11 -0
  326. package/object-summary/lib/object-summary.module.d.ts +7 -0
  327. package/package.json +173 -0
  328. package/pagination/README.md +3 -0
  329. package/pagination/index.d.ts +2 -0
  330. package/pagination/lib/pagination.component.d.ts +18 -0
  331. package/pagination/lib/pagination.interface.d.ts +5 -0
  332. package/panel/README.md +3 -0
  333. package/panel/index.d.ts +1 -0
  334. package/panel/lib/panel.component.d.ts +12 -0
  335. package/renderer/README.md +5 -0
  336. package/renderer/index.d.ts +10 -0
  337. package/renderer/lib/property-renderer/abstract.renderer.d.ts +14 -0
  338. package/renderer/lib/property-renderer/datetime.renderer.d.ts +6 -0
  339. package/renderer/lib/property-renderer/decimal.renderer.component.d.ts +6 -0
  340. package/renderer/lib/property-renderer/filesize.renderer.component.d.ts +7 -0
  341. package/renderer/lib/property-renderer/icon.renderer.component.d.ts +6 -0
  342. package/renderer/lib/property-renderer/integer.renderer.component.d.ts +6 -0
  343. package/renderer/lib/property-renderer/organization.renderer.d.ts +7 -0
  344. package/renderer/lib/property-renderer/string.renderer.component.d.ts +6 -0
  345. package/renderer/lib/property-renderer/unknown.renderer.d.ts +6 -0
  346. package/renderer/lib/renderer.directive.d.ts +17 -0
  347. package/renderer/lib/services/renderer/renderer.interface.d.ts +8 -0
  348. package/renderer/lib/services/renderer/renderer.service.d.ts +35 -0
  349. package/sequence-list/README.md +3 -0
  350. package/sequence-list/index.d.ts +5 -0
  351. package/sequence-list/lib/due-date-picker/due-date-picker.component.d.ts +28 -0
  352. package/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.d.ts +52 -0
  353. package/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.d.ts +36 -0
  354. package/sequence-list/lib/sequence-list.component.d.ts +43 -0
  355. package/sequence-list/lib/sequence-list.interface.d.ts +16 -0
  356. package/simple-search/README.md +3 -0
  357. package/simple-search/index.d.ts +2 -0
  358. package/simple-search/lib/simple-search/simple-search.component.d.ts +55 -0
  359. package/simple-search/lib/simple-search/simple-search.interface.d.ts +4 -0
  360. package/styles/client-framework.scss +27 -0
  361. package/tile-list/README.md +3 -0
  362. package/tile-list/index.d.ts +10 -0
  363. package/tile-list/lib/tile/tile.component.d.ts +22 -0
  364. package/tile-list/lib/tile-config/action-select/action-select.component.d.ts +13 -0
  365. package/tile-list/lib/tile-config/icon-select/icon-select.component.d.ts +11 -0
  366. package/tile-list/lib/tile-config/property-select/property-select.component.d.ts +25 -0
  367. package/tile-list/lib/tile-config/tile-config-tile/tile-config-tile.component.d.ts +20 -0
  368. package/tile-list/lib/tile-config/tile-config-trigger/tile-config-trigger.component.d.ts +17 -0
  369. package/tile-list/lib/tile-config/tile-config.component.d.ts +47 -0
  370. package/tile-list/lib/tile-extension/directive/tile-extension.directive.d.ts +11 -0
  371. package/tile-list/lib/tile-extension/extensions/email.extension.d.ts +10 -0
  372. package/tile-list/lib/tile-extension/tile-extension.service.d.ts +16 -0
  373. package/tile-list/lib/tile-list/tile-list.component.d.ts +116 -0
  374. package/tile-list/lib/tile-list/tile-list.interface.d.ts +18 -0
  375. package/token-search/README.md +3 -0
  376. package/token-search/index.d.ts +2 -0
  377. package/token-search/token-search.component.d.ts +22 -0
  378. package/token-search/token-search.interface.d.ts +4 -0
  379. package/tree/README.md +3 -0
  380. package/tree/index.d.ts +2 -0
  381. package/tree/lib/tree-node/tree-node.component.d.ts +21 -0
  382. package/tree/lib/tree.component.d.ts +53 -0
  383. package/tree/lib/tree.interface.d.ts +11 -0
  384. package/tree/lib/tree.service.d.ts +35 -0
  385. package/upload-progress/README.md +3 -0
  386. package/upload-progress/index.d.ts +1 -0
  387. package/upload-progress/lib/upload-progress/upload-progress-overlay/upload-progress-overlay.component.d.ts +17 -0
  388. package/upload-progress/lib/upload-progress/upload-progress.component.d.ts +16 -0
  389. package/user-avatar/README.md +3 -0
  390. package/user-avatar/index.d.ts +2 -0
  391. package/user-avatar/lib/user-avatar.component.d.ts +44 -0
  392. package/user-avatar/lib/user-avatar.module.d.ts +8 -0
@@ -0,0 +1,195 @@
1
+ import { Component, forwardRef, Input } from '@angular/core';
2
+ import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { Classification, TranslateService, Utils } from '@yuuvis/client-core';
4
+ import { FileSizePipe, LocaleNumberPipe } from '@yuuvis/client-core';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@yuuvis/client-core";
7
+ import * as i2 from "@angular/forms";
8
+ /**
9
+ * Creates form input for number values.
10
+ *
11
+ * Implements `ControlValueAccessor` so it can be used within Angular forms.
12
+ *
13
+ * @example
14
+ * <yuv-number [scale]="2"></yuv-number>
15
+ *
16
+ */
17
+ export class NumberComponent {
18
+ /**
19
+ * Number of decimal places
20
+ */
21
+ set scale(val) {
22
+ this._scale = Math.min(val || 0, 30);
23
+ }
24
+ get scale() {
25
+ return this._scale;
26
+ }
27
+ /**
28
+ * Overall amount of digits allowed (including decimal places)
29
+ */
30
+ set precision(val) {
31
+ this._precision = Math.min(val || 100, 100);
32
+ }
33
+ get precision() {
34
+ return this._precision;
35
+ }
36
+ /**
37
+ * Set to true to group number by pattern
38
+ */
39
+ set grouping(val) {
40
+ this._grouping = val ?? true;
41
+ }
42
+ get grouping() {
43
+ return this._grouping;
44
+ }
45
+ /**
46
+ * The pattern to group number value by
47
+ */
48
+ set groupPattern(val) {
49
+ this._pattern = val;
50
+ }
51
+ get groupPattern() {
52
+ return this._pattern;
53
+ }
54
+ /**
55
+ * classification property adds some semantics to the value of this component.
56
+ * If you provide a value of `filesize` numbers typed into the control will be
57
+ * handled like file sizes (calculates differnt units)
58
+ */
59
+ set classifications(classifications) {
60
+ this.numberPipe =
61
+ classifications && classifications.includes(Classification.NUMBER_FILESIZE) ? new FileSizePipe(this.translate) : new LocaleNumberPipe(this.translate);
62
+ }
63
+ static betweenTwoNumbers(val, minVal, maxVal) {
64
+ const min = !Utils.isEmpty(minVal) ? minVal : -Infinity;
65
+ const max = !Utils.isEmpty(maxVal) ? maxVal : Infinity;
66
+ return val >= min && val <= max;
67
+ }
68
+ constructor(translate) {
69
+ this.translate = translate;
70
+ this.innerValue = null;
71
+ this._grouping = false;
72
+ this.validationErrors = [];
73
+ /**
74
+ * Will prevent the input from being changed (default: false)
75
+ */
76
+ this.readonly = false;
77
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
78
+ this.propagateChange = (_) => { };
79
+ this.numberPipe = new LocaleNumberPipe(this.translate);
80
+ }
81
+ writeValue(value) {
82
+ this.value = value != null ? value : null;
83
+ this.innerValue = value != null ? this.numberPipe.numberToString(value, this.grouping, this.groupPattern, this.scale) : null;
84
+ }
85
+ registerOnChange(fn) {
86
+ this.propagateChange = fn;
87
+ }
88
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
89
+ registerOnTouched() { }
90
+ onValueChange(evt) {
91
+ this.validationErrors = [];
92
+ if (Utils.isEmpty(evt)) {
93
+ this.value = undefined;
94
+ this.propagateChange(this.value);
95
+ return;
96
+ }
97
+ // validate input
98
+ const val = this.numberPipe.stringToNumber(evt);
99
+ // general number validation
100
+ if (isNaN(val) || typeof val !== 'number') {
101
+ this.validationErrors.push({ key: 'number' });
102
+ }
103
+ else {
104
+ const split = evt.replaceAll(this.numberPipe.separator, '').split(this.numberPipe.decimalSeparator);
105
+ // check precision
106
+ if (this.precision !== undefined) {
107
+ const prePointDigits = this.precision - (this.scale || 0);
108
+ if (split[0]?.length > prePointDigits) {
109
+ this.validationErrors.push({ key: 'precision', params: { prePointDigits } });
110
+ }
111
+ }
112
+ // check scale
113
+ if (this.scale && split[1]?.length > this.scale) {
114
+ this.validationErrors.push({ key: 'scale', params: { scale: this.scale } });
115
+ }
116
+ // min max
117
+ if (!NumberComponent.betweenTwoNumbers(val, this.minValue, this.maxValue)) {
118
+ if (Utils.isEmpty(this.minValue)) {
119
+ this.validationErrors.push({ key: 'maxvalue', params: { maxValue: this.maxValue } });
120
+ }
121
+ else if (Utils.isEmpty(this.maxValue)) {
122
+ this.validationErrors.push({ key: 'minvalue', params: { minValue: this.minValue } });
123
+ }
124
+ else {
125
+ this.validationErrors.push({ key: 'minmax', params: { minValue: this.minValue, maxValue: this.maxValue } });
126
+ }
127
+ }
128
+ if (!this.validationErrors.length) {
129
+ this.value = val;
130
+ }
131
+ }
132
+ this.propagateChange(this.value);
133
+ }
134
+ // called when the input looses focus
135
+ format() {
136
+ if (!this.readonly && typeof this.value === 'number' && this.validationErrors.length === 0) {
137
+ this.innerValue = this.numberPipe.numberToString(this.value, this.grouping, this.groupPattern, this.scale);
138
+ }
139
+ }
140
+ // called when the input get focus
141
+ unformat() {
142
+ if (!this.readonly && typeof this.value === 'number' && this.validationErrors.length === 0) {
143
+ this.innerValue = this.numberPipe.transform(this.value, false);
144
+ }
145
+ }
146
+ // returns null when valid else the validation object
147
+ validate() {
148
+ return this.validationErrors.length ? Utils.arrayToObject(this.validationErrors, 'key', (err) => ({ valid: false, ...err })) : null;
149
+ }
150
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NumberComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
151
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NumberComponent, isStandalone: true, selector: "yuv-number", inputs: { scale: "scale", precision: "precision", grouping: "grouping", groupPattern: "groupPattern", readonly: "readonly", minValue: "minValue", maxValue: "maxValue", classifications: "classifications" }, providers: [
152
+ {
153
+ provide: NG_VALUE_ACCESSOR,
154
+ useExisting: forwardRef(() => NumberComponent),
155
+ multi: true
156
+ },
157
+ {
158
+ provide: NG_VALIDATORS,
159
+ useExisting: forwardRef(() => NumberComponent),
160
+ multi: true
161
+ }
162
+ ], ngImport: i0, template: "<input type=\"string\" [(ngModel)]=\"innerValue\" (focus)=\"unformat()\" (blur)=\"format()\" class=\"input-number\"\n [readonly]=\"readonly\" (ngModelChange)=\"onValueChange($event)\" />\n", styles: [":host{display:block}:host input{width:100%;border:0;background-color:transparent}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
163
+ }
164
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NumberComponent, decorators: [{
165
+ type: Component,
166
+ args: [{ selector: 'yuv-number', standalone: true, imports: [FormsModule], providers: [
167
+ {
168
+ provide: NG_VALUE_ACCESSOR,
169
+ useExisting: forwardRef(() => NumberComponent),
170
+ multi: true
171
+ },
172
+ {
173
+ provide: NG_VALIDATORS,
174
+ useExisting: forwardRef(() => NumberComponent),
175
+ multi: true
176
+ }
177
+ ], template: "<input type=\"string\" [(ngModel)]=\"innerValue\" (focus)=\"unformat()\" (blur)=\"format()\" class=\"input-number\"\n [readonly]=\"readonly\" (ngModelChange)=\"onValueChange($event)\" />\n", styles: [":host{display:block}:host input{width:100%;border:0;background-color:transparent}\n"] }]
178
+ }], ctorParameters: () => [{ type: i1.TranslateService }], propDecorators: { scale: [{
179
+ type: Input
180
+ }], precision: [{
181
+ type: Input
182
+ }], grouping: [{
183
+ type: Input
184
+ }], groupPattern: [{
185
+ type: Input
186
+ }], readonly: [{
187
+ type: Input
188
+ }], minValue: [{
189
+ type: Input
190
+ }], maxValue: [{
191
+ type: Input
192
+ }], classifications: [{
193
+ type: Input
194
+ }] } });
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvZm9ybXMvc3JjL2xpYi9lbGVtZW50cy9udW1iZXIvbnVtYmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvZm9ybXMvc3JjL2xpYi9lbGVtZW50cy9udW1iZXIvbnVtYmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQXdCLFdBQVcsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQStCLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEksT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFFckU7Ozs7Ozs7O0dBUUc7QUFvQkgsTUFBTSxPQUFPLGVBQWU7SUFVMUI7O09BRUc7SUFDSCxJQUNJLEtBQUssQ0FBQyxHQUF1QjtRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRDs7T0FFRztJQUNILElBQ0ksU0FBUyxDQUFDLEdBQXVCO1FBQ25DLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxD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aUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDWjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDBCQy9CSCwrTEFFQSw0SURlWSxXQUFXOzs0RkFnQlYsZUFBZTtrQkFuQjNCLFNBQVM7K0JBQ0UsWUFBWSxjQUNWLElBQUksV0FDUCxDQUFDLFdBQVcsQ0FBQyxhQUdYO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDOzRCQUM5QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO3FGQWdCRyxLQUFLO3NCQURSLEtBQUs7Z0JBV0YsU0FBUztzQkFEWixLQUFLO2dCQVdGLFFBQVE7c0JBRFgsS0FBSztnQkFXRixZQUFZO3NCQURmLEtBQUs7Z0JBVUcsUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT08sZUFBZTtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENsYXNzaWZpY2F0aW9uLCBUcmFuc2xhdGVTZXJ2aWNlLCBVdGlscyB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgRmlsZVNpemVQaXBlLCBMb2NhbGVOdW1iZXJQaXBlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5cbi8qKlxuICogQ3JlYXRlcyBmb3JtIGlucHV0IGZvciBudW1iZXIgdmFsdWVzLlxuICpcbiAqIEltcGxlbWVudHMgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gQW5ndWxhciBmb3Jtcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHl1di1udW1iZXIgW3NjYWxlXT1cIjJcIj48L3l1di1udW1iZXI+XG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5dXYtbnVtYmVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0Zvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL251bWJlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL251bWJlci5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWJlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWJlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOdW1iZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcbiAgdmFsdWU/OiBudW1iZXI7XG4gIGlubmVyVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBfc2NhbGU/OiBudW1iZXI7XG4gIF9wcmVjaXNpb24/OiBudW1iZXI7XG4gIF9wYXR0ZXJuPzogc3RyaW5nO1xuICBfZ3JvdXBpbmcgPSBmYWxzZTtcbiAgdmFsaWRhdGlvbkVycm9yczogVmFsaWRhdGlvbkVycm9yc1tdID0gW107XG4gIG51bWJlclBpcGU6IExvY2FsZU51bWJlclBpcGUgfCBGaWxlU2l6ZVBpcGU7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHNjYWxlKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2NhbGUgPSBNYXRoLm1pbih2YWwgfHwgMCwgMzApO1xuICB9XG4gIGdldCBzY2FsZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zY2FsZTtcbiAgfVxuICAvKipcbiAgICogT3ZlcmFsbCBhbW91bnQgb2YgZGlnaXRzIGFsbG93ZWQgKGluY2x1ZGluZyBkZWNpbWFsIHBsYWNlcylcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBwcmVjaXNpb24odmFsOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wcmVjaXNpb24gPSBNYXRoLm1pbih2YWwgfHwgMTAwLCAxMDApO1xuICB9XG4gIGdldCBwcmVjaXNpb24oKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlY2lzaW9uO1xuICB9XG4gIC8qKlxuICAgKiAgU2V0IHRvIHRydWUgdG8gZ3JvdXAgbnVtYmVyIGJ5IHBhdHRlcm5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBncm91cGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncm91cGluZyA9IHZhbCA/PyB0cnVlO1xuICB9XG4gIGdldCBncm91cGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBpbmc7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBwYXR0ZXJuIHRvIGdyb3VwIG51bWJlciB2YWx1ZSBieVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGdyb3VwUGF0dGVybih2YWw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhdHRlcm4gPSB2YWw7XG4gIH1cbiAgZ2V0IGdyb3VwUGF0dGVybigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXR0ZXJuO1xuICB9XG4gIC8qKlxuICAgKiBXaWxsIHByZXZlbnQgdGhlIGlucHV0IGZyb20gYmVpbmcgY2hhbmdlZCAoZGVmYXVsdDogZmFsc2UpXG4gICAqL1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBzZXQgbWluaW11bSBpbnB1dCB2YWx1ZVxuICAgKi9cbiAgQElucHV0KCkgbWluVmFsdWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHNldCBtYXhpbXVtIGlucHV0IHZhbHVlXG4gICAqXG4gICAqL1xuICBASW5wdXQoKSBtYXhWYWx1ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogY2xhc3NpZmljYXRpb24gcHJvcGVydHkgYWRkcyBzb21lIHNlbWFudGljcyB0byB0aGUgdmFsdWUgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqIElmIHlvdSBwcm92aWRlIGEgdmFsdWUgb2YgYGZpbGVzaXplYCBudW1iZXJzIHR5cGVkIGludG8gdGhlIGNvbnRyb2wgd2lsbCBiZVxuICAgKiBoYW5kbGVkIGxpa2UgZmlsZSBzaXplcyAoY2FsY3VsYXRlcyBkaWZmZXJudCB1bml0cylcbiAgICovXG4gIEBJbnB1dCgpIHNldCBjbGFzc2lmaWNhdGlvbnMoY2xhc3NpZmljYXRpb25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubnVtYmVyUGlwZSA9XG4gICAgICBjbGFzc2lmaWNhdGlvbnMgJiYgY2xhc3NpZmljYXRpb25zLmluY2x1ZGVzKENsYXNzaWZpY2F0aW9uLk5VTUJFUl9GSUxFU0laRSkgPyBuZXcgRmlsZVNpemVQaXBlKHRoaXMudHJhbnNsYXRlKSA6IG5ldyBMb2NhbGVOdW1iZXJQaXBlKHRoaXMudHJhbnNsYXRlKTtcbiAgfVxuXG4gIHN0YXRpYyBiZXR3ZWVuVHdvTnVtYmVycyh2YWw6IG51bWJlciwgbWluVmFsOiBudW1iZXIgfCB1bmRlZmluZWQsIG1heFZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWluID0gIVV0aWxzLmlzRW1wdHkobWluVmFsKSA/IG1pblZhbCA6IC1JbmZpbml0eTtcbiAgICBjb25zdCBtYXggPSAhVXRpbHMuaXNFbXB0eShtYXhWYWwpID8gbWF4VmFsIDogSW5maW5pdHk7XG4gICAgcmV0dXJuIHZhbCA+PSAobWluIGFzIG51bWJlcikgJiYgdmFsIDw9IChtYXggYXMgbnVtYmVyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7XG4gICAgdGhpcy5udW1iZXJQaXBlID0gbmV3IExvY2FsZU51bWJlclBpcGUodGhpcy50cmFuc2xhdGUpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBudWxsO1xuICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHZhbHVlICE9IG51bGwgPyB0aGlzLm51bWJlclBpcGUubnVtYmVyVG9TdHJpbmcodmFsdWUsIHRoaXMuZ3JvdXBpbmcsIHRoaXMuZ3JvdXBQYXR0ZXJuLCB0aGlzLnNjYWxlKSA6IG51bGw7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICByZWdpc3Rlck9uVG91Y2hlZCgpOiB2b2lkIHt9XG5cbiAgb25WYWx1ZUNoYW5nZShldnQ6IGFueSkge1xuICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IFtdO1xuXG4gICAgaWYgKFV0aWxzLmlzRW1wdHkoZXZ0KSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGlucHV0XG4gICAgY29uc3QgdmFsID0gdGhpcy5udW1iZXJQaXBlLnN0cmluZ1RvTnVtYmVyKGV2dCk7XG4gICAgLy8gZ2VuZXJhbCBudW1iZXIgdmFsaWRhdGlvblxuICAgIGlmIChpc05hTih2YWwpIHx8IHR5cGVvZiB2YWwgIT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucHVzaCh7IGtleTogJ251bWJlcicgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gZXZ0LnJlcGxhY2VBbGwodGhpcy5udW1iZXJQaXBlLnNlcGFyYXRvciwgJycpLnNwbGl0KHRoaXMubnVtYmVyUGlwZS5kZWNpbWFsU2VwYXJhdG9yKTtcbiAgICAgIC8vIGNoZWNrIHByZWNpc2lvblxuICAgICAgaWYgKHRoaXMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcHJlUG9pbnREaWdpdHMgPSB0aGlzLnByZWNpc2lvbiAtICh0aGlzLnNjYWxlIHx8IDApO1xuICAgICAgICBpZiAoc3BsaXRbMF0/Lmxlbmd0aCA+IHByZVBvaW50RGlnaXRzKSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBrZXk6ICdwcmVjaXNpb24nLCBwYXJhbXM6IHsgcHJlUG9pbnREaWdpdHMgfSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gY2hlY2sgc2NhbGVcbiAgICAgIGlmICh0aGlzLnNjYWxlICYmIHNwbGl0WzFdPy5sZW5ndGggPiB0aGlzLnNjYWxlKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5wdXNoKHsga2V5OiAnc2NhbGUnLCBwYXJhbXM6IHsgc2NhbGU6IHRoaXMuc2NhbGUgfSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gbWluIG1heFxuICAgICAgaWYgKCFOdW1iZXJDb21wb25lbnQuYmV0d2VlblR3b051bWJlcnModmFsLCB0aGlzLm1pblZhbHVlLCB0aGlzLm1heFZhbHVlKSkge1xuICAgICAgICBpZiAoVXRpbHMuaXNFbXB0eSh0aGlzLm1pblZhbHVlKSkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5wdXNoKHsga2V5OiAnbWF4dmFsdWUnLCBwYXJhbXM6IHsgbWF4VmFsdWU6IHRoaXMubWF4VmFsdWUgfSB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChVdGlscy5pc0VtcHR5KHRoaXMubWF4VmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzLnB1c2goeyBrZXk6ICdtaW52YWx1ZScsIHBhcmFtczogeyBtaW5WYWx1ZTogdGhpcy5taW5WYWx1ZSB9IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycy5wdXNoKHsga2V5OiAnbWlubWF4JywgcGFyYW1zOiB7IG1pblZhbHVlOiB0aGlzLm1pblZhbHVlLCBtYXhWYWx1ZTogdGhpcy5tYXhWYWx1ZSB9IH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8vIGNhbGxlZCB3aGVuIHRoZSBpbnB1dCBsb29zZXMgZm9jdXNcbiAgcHVibGljIGZvcm1hdCgpIHtcbiAgICBpZiAoIXRoaXMucmVhZG9ubHkgJiYgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInICYmIHRoaXMudmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHRoaXMubnVtYmVyUGlwZS5udW1iZXJUb1N0cmluZyh0aGlzLnZhbHVlLCB0aGlzLmdyb3VwaW5nLCB0aGlzLmdyb3VwUGF0dGVybiwgdGhpcy5zY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gY2FsbGVkIHdoZW4gdGhlIGlucHV0IGdldCBmb2N1c1xuICBwdWJsaWMgdW5mb3JtYXQoKSB7XG4gICAgaWYgKCF0aGlzLnJlYWRvbmx5ICYmIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJyAmJiB0aGlzLnZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmlubmVyVmFsdWUgPSB0aGlzLm51bWJlclBpcGUudHJhbnNmb3JtKHRoaXMudmFsdWUsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXR1cm5zIG51bGwgd2hlbiB2YWxpZCBlbHNlIHRoZSB2YWxpZGF0aW9uIG9iamVjdFxuICBwdWJsaWMgdmFsaWRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPyBVdGlscy5hcnJheVRvT2JqZWN0KHRoaXMudmFsaWRhdGlvbkVycm9ycywgJ2tleScsIChlcnIpID0+ICh7IHZhbGlkOiBmYWxzZSwgLi4uZXJyIH0pKSA6IG51bGw7XG4gIH1cbn1cbiIsIjxpbnB1dCB0eXBlPVwic3RyaW5nXCIgWyhuZ01vZGVsKV09XCJpbm5lclZhbHVlXCIgKGZvY3VzKT1cInVuZm9ybWF0KClcIiAoYmx1cik9XCJmb3JtYXQoKVwiIGNsYXNzPVwiaW5wdXQtbnVtYmVyXCJcbiAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCIgLz5cbiJdfQ==
@@ -0,0 +1,176 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, forwardRef, Input } from '@angular/core';
3
+ import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
4
+ import { Operator, OperatorLabel } from '@yuuvis/client-core';
5
+ import { YvcDropdownModule } from '@yuuvis/components/dropdown';
6
+ import { NumberComponent } from '../number/number.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@yuuvis/components/dropdown";
9
+ import * as i2 from "@angular/forms";
10
+ /**
11
+ * Creates form input for ranges of numeric values.
12
+ *
13
+ * Implements `ControlValueAccessor` so it can be used within Angular forms.
14
+ *
15
+ * @example
16
+ * <yuv-number-range [scale]="2"></yuv-number-range>
17
+ *
18
+ */
19
+ export class NumberRangeComponent {
20
+ constructor() {
21
+ /**
22
+ * Set to true to group number by pattern
23
+ */
24
+ this.grouping = false;
25
+ /**
26
+ * Will prevent the input from being changed (default: false)
27
+ */
28
+ this.readonly = false;
29
+ /**
30
+ * classification property adds some semantics to the value of this component.
31
+ * If you provide a value of `filesize` numbers typed into the control will be
32
+ * handled like file sizes (calculates differnt units)
33
+ */
34
+ this.classifications = [];
35
+ this.rangeForm = new UntypedFormGroup({
36
+ numberValue: new UntypedFormControl(),
37
+ numberValueFrom: new UntypedFormControl()
38
+ });
39
+ this.isValid = true;
40
+ // options for search situation
41
+ this.availableSearchOptions = [
42
+ { label: OperatorLabel.EQUAL, value: Operator.EQUAL },
43
+ { label: OperatorLabel.GREATER_OR_EQUAL, value: Operator.GREATER_OR_EQUAL },
44
+ { label: OperatorLabel.LESS_OR_EQUAL, value: Operator.LESS_OR_EQUAL },
45
+ { label: OperatorLabel.INTERVAL_INCLUDE_BOTH, value: Operator.INTERVAL_INCLUDE_BOTH }
46
+ ];
47
+ // the selected search option
48
+ this.searchOption = this.availableSearchOptions[1].value;
49
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
50
+ this.propagateChange = (_) => { };
51
+ this.rangeForm.valueChanges.forEach(() => {
52
+ this.onValueChange();
53
+ });
54
+ }
55
+ writeValue(value) {
56
+ if (value && (value.firstValue != null || value.secondValue != null)) {
57
+ const match = this.availableSearchOptions.find((o) => o.value === value.operator);
58
+ this.searchOption = match ? match.value : this.availableSearchOptions[0].value;
59
+ this.value = value;
60
+ if (value.secondValue == null) {
61
+ this.rangeForm.setValue({
62
+ numberValueFrom: null,
63
+ numberValue: value.firstValue != null ? value.firstValue : null
64
+ });
65
+ }
66
+ else {
67
+ this.rangeForm.setValue({
68
+ numberValueFrom: value.firstValue != null ? value.firstValue : null,
69
+ numberValue: value.secondValue
70
+ });
71
+ }
72
+ }
73
+ else {
74
+ this.searchOption = this.availableSearchOptions[0].value;
75
+ this.value = undefined;
76
+ this.rangeForm.reset();
77
+ }
78
+ }
79
+ registerOnChange(fn) {
80
+ this.propagateChange = fn;
81
+ }
82
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
83
+ registerOnTouched(fn) { }
84
+ onValueChange() {
85
+ this.isValid = this.rangeForm.valid;
86
+ if (this.searchOption === Operator.INTERVAL_INCLUDE_BOTH) {
87
+ this.isValid = this.rangeForm.valid && this.rangeForm.value.numberValueFrom != null && this.rangeForm.value.numberValue != null;
88
+ this.value = !this.isValid
89
+ ? {
90
+ operator: this.searchOption,
91
+ firstValue: undefined,
92
+ secondValue: undefined
93
+ }
94
+ : {
95
+ operator: this.searchOption,
96
+ firstValue: this.rangeForm.value.numberValueFrom,
97
+ secondValue: this.rangeForm.value.numberValue
98
+ };
99
+ }
100
+ else {
101
+ this.value = !this.isValid
102
+ ? {
103
+ operator: this.searchOption,
104
+ firstValue: undefined,
105
+ secondValue: undefined
106
+ }
107
+ : {
108
+ operator: this.searchOption,
109
+ firstValue: this.rangeForm.value.numberValue,
110
+ secondValue: undefined
111
+ };
112
+ }
113
+ this.propagateChange(this.value);
114
+ }
115
+ // returns null when valid else the validation object
116
+ validate() {
117
+ let err;
118
+ if (this.searchOption === Operator.EQUAL) {
119
+ err = { number: { valid: false } };
120
+ }
121
+ else if (this.searchOption === Operator.INTERVAL_INCLUDE_BOTH && this.value?.firstValue && this.value?.secondValue) {
122
+ // make sure that on ranges, the first value is earlier than the last
123
+ this.isValid = this.value.firstValue < this.value.secondValue;
124
+ err = { numberrangeorder: { valid: false } };
125
+ }
126
+ else {
127
+ err = { numberrange: { valid: false } };
128
+ }
129
+ return this.isValid ? null : err;
130
+ }
131
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NumberRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
132
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: NumberRangeComponent, isStandalone: true, selector: "yuv-number-range", inputs: { scale: "scale", precision: "precision", grouping: "grouping", pattern: "pattern", readonly: "readonly", classifications: "classifications", minValue: "minValue", maxValue: "maxValue" }, providers: [
133
+ {
134
+ provide: NG_VALUE_ACCESSOR,
135
+ useExisting: forwardRef(() => NumberRangeComponent),
136
+ multi: true
137
+ },
138
+ {
139
+ provide: NG_VALIDATORS,
140
+ useExisting: forwardRef(() => NumberRangeComponent),
141
+ multi: true
142
+ }
143
+ ], ngImport: i0, template: "<form class=\"yuv-number-range\" [formGroup]=\"rangeForm\">\n @if(searchOption === 'gtelte'){\n <yuv-number\n class=\"first\"\n [readonly]=\"readonly\"\n [scale]=\"scale\"\n [precision]=\"precision\"\n [grouping]=\"grouping\"\n [groupPattern]=\"pattern\"\n formControlName=\"numberValueFrom\"\n [classifications]=\"classifications\"\n [minValue]=\"minValue\"\n [maxValue]=\"maxValue\"\n ></yuv-number>}\n\n <yvc-dropdown\n class=\"no-trigger\"\n [(ngModel)]=\"searchOption\"\n (ngModelChange)=\"onValueChange()\"\n [disabled]=\"readonly\"\n [disableClearButton]=\"true\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"availableSearchOptions\"\n ></yvc-dropdown>\n\n <yuv-number\n [scale]=\"scale\"\n [readonly]=\"readonly\"\n [precision]=\"precision\"\n [grouping]=\"grouping\"\n [groupPattern]=\"pattern\"\n formControlName=\"numberValue\"\n [classifications]=\"classifications\"\n [minValue]=\"minValue\"\n [maxValue]=\"maxValue\"\n >\n </yuv-number>\n</form>\n", styles: [":host{display:block}:host>form{display:flex;align-items:center}:host>form yuv-number{flex:1 1 auto}:host>form yuv-number.first ::ng-deep .input-number{text-align:right}:host>form yvc-dropdown{--yvc-form-element-border-color: var(--text-color-hint);--yvc-form-element-focus-border-color: var(--color-accent);padding:0;min-width:auto;border-radius:2px;background-color:var(--list-item-hover-background)}:host>form yvc-dropdown:hover{background-color:var(--list-item-selected-background)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: NumberComponent, selector: "yuv-number", inputs: ["scale", "precision", "grouping", "groupPattern", "readonly", "minValue", "maxValue", "classifications"] }, { kind: "ngmodule", type: YvcDropdownModule }, { kind: "component", type: i1.Dropdown, selector: "yvc-dropdown", inputs: ["options", "filter", "disabled", "multiple", "disableClearButton"], outputs: ["onDropdownOptionsClose"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
144
+ }
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NumberRangeComponent, decorators: [{
146
+ type: Component,
147
+ args: [{ selector: 'yuv-number-range', standalone: true, imports: [CommonModule, NumberComponent, YvcDropdownModule, FormsModule, ReactiveFormsModule], providers: [
148
+ {
149
+ provide: NG_VALUE_ACCESSOR,
150
+ useExisting: forwardRef(() => NumberRangeComponent),
151
+ multi: true
152
+ },
153
+ {
154
+ provide: NG_VALIDATORS,
155
+ useExisting: forwardRef(() => NumberRangeComponent),
156
+ multi: true
157
+ }
158
+ ], template: "<form class=\"yuv-number-range\" [formGroup]=\"rangeForm\">\n @if(searchOption === 'gtelte'){\n <yuv-number\n class=\"first\"\n [readonly]=\"readonly\"\n [scale]=\"scale\"\n [precision]=\"precision\"\n [grouping]=\"grouping\"\n [groupPattern]=\"pattern\"\n formControlName=\"numberValueFrom\"\n [classifications]=\"classifications\"\n [minValue]=\"minValue\"\n [maxValue]=\"maxValue\"\n ></yuv-number>}\n\n <yvc-dropdown\n class=\"no-trigger\"\n [(ngModel)]=\"searchOption\"\n (ngModelChange)=\"onValueChange()\"\n [disabled]=\"readonly\"\n [disableClearButton]=\"true\"\n [ngModelOptions]=\"{ standalone: true }\"\n [options]=\"availableSearchOptions\"\n ></yvc-dropdown>\n\n <yuv-number\n [scale]=\"scale\"\n [readonly]=\"readonly\"\n [precision]=\"precision\"\n [grouping]=\"grouping\"\n [groupPattern]=\"pattern\"\n formControlName=\"numberValue\"\n [classifications]=\"classifications\"\n [minValue]=\"minValue\"\n [maxValue]=\"maxValue\"\n >\n </yuv-number>\n</form>\n", styles: [":host{display:block}:host>form{display:flex;align-items:center}:host>form yuv-number{flex:1 1 auto}:host>form yuv-number.first ::ng-deep .input-number{text-align:right}:host>form yvc-dropdown{--yvc-form-element-border-color: var(--text-color-hint);--yvc-form-element-focus-border-color: var(--color-accent);padding:0;min-width:auto;border-radius:2px;background-color:var(--list-item-hover-background)}:host>form yvc-dropdown:hover{background-color:var(--list-item-selected-background)}\n"] }]
159
+ }], ctorParameters: () => [], propDecorators: { scale: [{
160
+ type: Input
161
+ }], precision: [{
162
+ type: Input
163
+ }], grouping: [{
164
+ type: Input
165
+ }], pattern: [{
166
+ type: Input
167
+ }], readonly: [{
168
+ type: Input
169
+ }], classifications: [{
170
+ type: Input
171
+ }], minValue: [{
172
+ type: Input
173
+ }], maxValue: [{
174
+ type: Input
175
+ }] } });
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLXJhbmdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvZm9ybXMvc3JjL2xpYi9lbGVtZW50cy9udW1iZXItcmFuZ2UvbnVtYmVyLXJhbmdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvZm9ybXMvc3JjL2xpYi9lbGVtZW50cy9udW1iZXItcmFuZ2UvbnVtYmVyLXJhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUVMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBRWpCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQWMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFFN0Q7Ozs7Ozs7O0dBUUc7QUFvQkgsTUFBTSxPQUFPLG9CQUFvQjtJQXdEL0I7UUEvQ0E7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBSzFCOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQjs7OztXQUlHO1FBQ00sb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFXakMsY0FBUyxHQUFHLElBQUksZ0JBQWdCLENBQUM7WUFDdEMsV0FBVyxF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QUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkMxQ0gsc2lDQXNDQSxnaUJEVlksWUFBWSwrQkFBRSxlQUFlLHlLQUFFLGlCQUFpQixvTkFBRSxXQUFXLG1tQkFBRSxtQkFBbUI7OzRGQWdCakYsb0JBQW9CO2tCQW5CaEMsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUMsYUFHbEY7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUM7NEJBQ25ELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQzs0QkFDbkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7d0RBTVEsS0FBSztzQkFBYixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxPQUFPO3NCQUFmLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFPRyxlQUFlO3NCQUF2QixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybXNNb2R1bGUsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPcGVyYXRvciwgT3BlcmF0b3JMYWJlbCwgUmFuZ2VWYWx1ZSB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgWXZjRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdAeXV1dmlzL2NvbXBvbmVudHMvZHJvcGRvd24nO1xuaW1wb3J0IHsgTnVtYmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbnVtYmVyL251bWJlci5jb21wb25lbnQnO1xuXG4vKipcbiAqIENyZWF0ZXMgZm9ybSBpbnB1dCBmb3IgcmFuZ2VzIG9mIG51bWVyaWMgdmFsdWVzLlxuICpcbiAqIEltcGxlbWVudHMgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gQW5ndWxhciBmb3Jtcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHl1di1udW1iZXItcmFuZ2UgW3NjYWxlXT1cIjJcIj48L3l1di1udW1iZXItcmFuZ2U+XG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5dXYtbnVtYmVyLXJhbmdlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTnVtYmVyQ29tcG9uZW50LCBZdmNEcm9wZG93bk1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vbnVtYmVyLXJhbmdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbnVtYmVyLXJhbmdlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnVtYmVyUmFuZ2VDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOdW1iZXJSYW5nZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOdW1iZXJSYW5nZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuICAvKipcbiAgICogTnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG4gICAqL1xuICBASW5wdXQoKSBzY2FsZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIE92ZXJhbGwgYW1vdW50IG9mIGRpZ2l0cyBhbGxvd2VkIChpbmNsdWRpbmcgZGVjaW1hbCBwbGFjZXMpXG4gICAqL1xuICBASW5wdXQoKSBwcmVjaXNpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiAgU2V0IHRvIHRydWUgdG8gZ3JvdXAgbnVtYmVyIGJ5IHBhdHRlcm5cbiAgICovXG4gIEBJbnB1dCgpIGdyb3VwaW5nID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgcGF0dGVybiB0byBncm91cCBudW1iZXIgdmFsdWUgYnlcbiAgICovXG4gIEBJbnB1dCgpIHBhdHRlcm4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaWxsIHByZXZlbnQgdGhlIGlucHV0IGZyb20gYmVpbmcgY2hhbmdlZCAoZGVmYXVsdDogZmFsc2UpXG4gICAqL1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBjbGFzc2lmaWNhdGlvbiBwcm9wZXJ0eSBhZGRzIHNvbWUgc2VtYW50aWNzIHRvIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbXBvbmVudC5cbiAgICogSWYgeW91IHByb3ZpZGUgYSB2YWx1ZSBvZiBgZmlsZXNpemVgIG51bWJlcnMgdHlwZWQgaW50byB0aGUgY29udHJvbCB3aWxsIGJlXG4gICAqIGhhbmRsZWQgbGlrZSBmaWxlIHNpemVzIChjYWxjdWxhdGVzIGRpZmZlcm50IHVuaXRzKVxuICAgKi9cbiAgQElucHV0KCkgY2xhc3NpZmljYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAvKipcbiAgICogc2V0IG1pbmltdW0gaW5wdXQgdmFsdWVcbiAgICovXG4gIEBJbnB1dCgpIG1pblZhbHVlPzogbnVtYmVyO1xuICAvKipcbiAgICogc2V0IG1heGltdW0gaW5wdXQgdmFsdWVcbiAgICpcbiAgICovXG4gIEBJbnB1dCgpIG1heFZhbHVlPzogbnVtYmVyO1xuXG4gIHB1YmxpYyByYW5nZUZvcm0gPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7XG4gICAgbnVtYmVyVmFsdWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICBudW1iZXJWYWx1ZUZyb206IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKVxuICB9KTtcblxuICB2YWx1ZT86IFJhbmdlVmFsdWU7XG4gIHByaXZhdGUgaXNWYWxpZCA9IHRydWU7XG5cbiAgLy8gb3B0aW9ucyBmb3Igc2VhcmNoIHNpdHVhdGlvblxuICBwdWJsaWMgYXZhaWxhYmxlU2VhcmNoT3B0aW9ucyA9IFtcbiAgICB7IGxhYmVsOiBPcGVyYXRvckxhYmVsLkVRVUFMLCB2YWx1ZTogT3BlcmF0b3IuRVFVQUwgfSxcbiAgICB7IGxhYmVsOiBPcGVyYXRvckxhYmVsLkdSRUFURVJfT1JfRVFVQUwsIHZhbHVlOiBPcGVyYXRvci5HUkVBVEVSX09SX0VRVUFMIH0sXG4gICAgeyBsYWJlbDogT3BlcmF0b3JMYWJlbC5MRVNTX09SX0VRVUFMLCB2YWx1ZTogT3BlcmF0b3IuTEVTU19PUl9FUVVBTCB9LFxuICAgIHsgbGFiZWw6IE9wZXJhdG9yTGFiZWwuSU5URVJWQUxfSU5DTFVERV9CT1RILCB2YWx1ZTogT3BlcmF0b3IuSU5URVJWQUxfSU5DTFVERV9CT1RIIH1cbiAgXTtcbiAgLy8gdGhlIHNlbGVjdGVkIHNlYXJjaCBvcHRpb25cbiAgcHVibGljIHNlYXJjaE9wdGlvbiA9IHRoaXMuYXZhaWxhYmxlU2VhcmNoT3B0aW9uc1sxXS52YWx1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJhbmdlRm9ybS52YWx1ZUNoYW5nZXMuZm9yRWFjaCgoKSA9PiB7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBSYW5nZVZhbHVlKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICYmICh2YWx1ZS5maXJzdFZhbHVlICE9IG51bGwgfHwgdmFsdWUuc2Vjb25kVmFsdWUgIT0gbnVsbCkpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5hdmFpbGFibGVTZWFyY2hPcHRpb25zLmZpbmQoKG8pID0+IG8udmFsdWUgPT09IHZhbHVlLm9wZXJhdG9yKTtcbiAgICAgIHRoaXMuc2VhcmNoT3B0aW9uID0gbWF0Y2ggPyBtYXRjaC52YWx1ZSA6IHRoaXMuYXZhaWxhYmxlU2VhcmNoT3B0aW9uc1swXS52YWx1ZTtcblxuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlLnNlY29uZFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yYW5nZUZvcm0uc2V0VmFsdWUoe1xuICAgICAgICAgIG51bWJlclZhbHVlRnJvbTogbnVsbCxcbiAgICAgICAgICBudW1iZXJWYWx1ZTogdmFsdWUuZmlyc3RWYWx1ZSAhPSBudWxsID8gdmFsdWUuZmlyc3RWYWx1ZSA6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJhbmdlRm9ybS5zZXRWYWx1ZSh7XG4gICAgICAgICAgbnVtYmVyVmFsdWVGcm9tOiB2YWx1ZS5maXJzdFZhbHVlICE9IG51bGwgPyB2YWx1ZS5maXJzdFZhbHVlIDogbnVsbCxcbiAgICAgICAgICBudW1iZXJWYWx1ZTogdmFsdWUuc2Vjb25kVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoT3B0aW9uID0gdGhpcy5hdmFpbGFibGVTZWFyY2hPcHRpb25zWzBdLnZhbHVlO1xuICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMucmFuZ2VGb3JtLnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge31cblxuICBvblZhbHVlQ2hhbmdlKCkge1xuICAgIHRoaXMuaXNWYWxpZCA9IHRoaXMucmFuZ2VGb3JtLnZhbGlkO1xuICAgIGlmICh0aGlzLnNlYXJjaE9wdGlvbiA9PT0gT3BlcmF0b3IuSU5URVJWQUxfSU5DTFVERV9CT1RIKSB7XG4gICAgICB0aGlzLmlzVmFsaWQgPSB0aGlzLnJhbmdlRm9ybS52YWxpZCAmJiB0aGlzLnJhbmdlRm9ybS52YWx1ZS5udW1iZXJWYWx1ZUZyb20gIT0gbnVsbCAmJiB0aGlzLnJhbmdlRm9ybS52YWx1ZS5udW1iZXJWYWx1ZSAhPSBudWxsO1xuICAgICAgdGhpcy52YWx1ZSA9ICF0aGlzLmlzVmFsaWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBvcGVyYXRvcjogdGhpcy5zZWFyY2hPcHRpb24sXG4gICAgICAgICAgICBmaXJzdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzZWNvbmRWYWx1ZTogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIG9wZXJhdG9yOiB0aGlzLnNlYXJjaE9wdGlvbixcbiAgICAgICAgICAgIGZpcnN0VmFsdWU6IHRoaXMucmFuZ2VGb3JtLnZhbHVlLm51bWJlclZhbHVlRnJvbSxcbiAgICAgICAgICAgIHNlY29uZFZhbHVlOiB0aGlzLnJhbmdlRm9ybS52YWx1ZS5udW1iZXJWYWx1ZVxuICAgICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSAhdGhpcy5pc1ZhbGlkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgb3BlcmF0b3I6IHRoaXMuc2VhcmNoT3B0aW9uLFxuICAgICAgICAgICAgZmlyc3RWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2Vjb25kVmFsdWU6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBvcGVyYXRvcjogdGhpcy5zZWFyY2hPcHRpb24sXG4gICAgICAgICAgICBmaXJzdFZhbHVlOiB0aGlzLnJhbmdlRm9ybS52YWx1ZS5udW1iZXJWYWx1ZSxcbiAgICAgICAgICAgIHNlY29uZFZhbHVlOiB1bmRlZmluZWRcbiAgICAgICAgICB9O1xuICAgIH1cbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8vIHJldHVybnMgbnVsbCB3aGVuIHZhbGlkIGVsc2UgdGhlIHZhbGlkYXRpb24gb2JqZWN0XG4gIHB1YmxpYyB2YWxpZGF0ZSgpIHtcbiAgICBsZXQgZXJyOiBhbnk7XG4gICAgaWYgKHRoaXMuc2VhcmNoT3B0aW9uID09PSBPcGVyYXRvci5FUVVBTCkge1xuICAgICAgZXJyID0geyBudW1iZXI6IHsgdmFsaWQ6IGZhbHNlIH0gfTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VhcmNoT3B0aW9uID09PSBPcGVyYXRvci5JTlRFUlZBTF9JTkNMVURFX0JPVEggJiYgdGhpcy52YWx1ZT8uZmlyc3RWYWx1ZSAmJiB0aGlzLnZhbHVlPy5zZWNvbmRWYWx1ZSkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgb24gcmFuZ2VzLCB0aGUgZmlyc3QgdmFsdWUgaXMgZWFybGllciB0aGFuIHRoZSBsYXN0XG4gICAgICB0aGlzLmlzVmFsaWQgPSB0aGlzLnZhbHVlIS5maXJzdFZhbHVlIDwgdGhpcy52YWx1ZSEuc2Vjb25kVmFsdWU7XG4gICAgICBlcnIgPSB7IG51bWJlcnJhbmdlb3JkZXI6IHsgdmFsaWQ6IGZhbHNlIH0gfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyID0geyBudW1iZXJyYW5nZTogeyB2YWxpZDogZmFsc2UgfSB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gbnVsbCA6IGVycjtcbiAgfVxufVxuIiwiPGZvcm0gY2xhc3M9XCJ5dXYtbnVtYmVyLXJhbmdlXCIgW2Zvcm1Hcm91cF09XCJyYW5nZUZvcm1cIj5cbiAgQGlmKHNlYXJjaE9wdGlvbiA9PT0gJ2d0ZWx0ZScpe1xuICA8eXV2LW51bWJlclxuICAgIGNsYXNzPVwiZmlyc3RcIlxuICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgW3NjYWxlXT1cInNjYWxlXCJcbiAgICBbcHJlY2lzaW9uXT1cInByZWNpc2lvblwiXG4gICAgW2dyb3VwaW5nXT1cImdyb3VwaW5nXCJcbiAgICBbZ3JvdXBQYXR0ZXJuXT1cInBhdHRlcm5cIlxuICAgIGZvcm1Db250cm9sTmFtZT1cIm51bWJlclZhbHVlRnJvbVwiXG4gICAgW2NsYXNzaWZpY2F0aW9uc109XCJjbGFzc2lmaWNhdGlvbnNcIlxuICAgIFttaW5WYWx1ZV09XCJtaW5WYWx1ZVwiXG4gICAgW21heFZhbHVlXT1cIm1heFZhbHVlXCJcbiAgPjwveXV2LW51bWJlcj59XG5cbiAgPHl2Yy1kcm9wZG93blxuICAgIGNsYXNzPVwibm8tdHJpZ2dlclwiXG4gICAgWyhuZ01vZGVsKV09XCJzZWFyY2hPcHRpb25cIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoKVwiXG4gICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5XCJcbiAgICBbZGlzYWJsZUNsZWFyQnV0dG9uXT1cInRydWVcIlxuICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgW29wdGlvbnNdPVwiYXZhaWxhYmxlU2VhcmNoT3B0aW9uc1wiXG4gID48L3l2Yy1kcm9wZG93bj5cblxuICA8eXV2LW51bWJlclxuICAgIFtzY2FsZV09XCJzY2FsZVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbcHJlY2lzaW9uXT1cInByZWNpc2lvblwiXG4gICAgW2dyb3VwaW5nXT1cImdyb3VwaW5nXCJcbiAgICBbZ3JvdXBQYXR0ZXJuXT1cInBhdHRlcm5cIlxuICAgIGZvcm1Db250cm9sTmFtZT1cIm51bWJlclZhbHVlXCJcbiAgICBbY2xhc3NpZmljYXRpb25zXT1cImNsYXNzaWZpY2F0aW9uc1wiXG4gICAgW21pblZhbHVlXT1cIm1pblZhbHVlXCJcbiAgICBbbWF4VmFsdWVdPVwibWF4VmFsdWVcIlxuICA+XG4gIDwveXV2LW51bWJlcj5cbjwvZm9ybT5cbiJdfQ==