@sumaris-net/ngx-components 2.0.0-rc1 → 2.0.0-rc3

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 (271) hide show
  1. package/doc/changelog.md +37 -0
  2. package/esm2020/public_api.mjs +9 -5
  3. package/esm2020/src/app/admin/admin-routing.module.mjs +5 -5
  4. package/esm2020/src/app/admin/admin.module.mjs +13 -28
  5. package/esm2020/src/app/admin/services/person.service.mjs +3 -3
  6. package/esm2020/src/app/admin/services/validator/person.validator.mjs +3 -3
  7. package/esm2020/src/app/admin/users/list/users.mjs +33 -27
  8. package/esm2020/src/app/admin/users/list/users.module.mjs +58 -0
  9. package/esm2020/src/app/core/about/modal-about.mjs +3 -3
  10. package/esm2020/src/app/core/account/account.mjs +3 -3
  11. package/esm2020/src/app/core/auth/form/form-auth.mjs +3 -3
  12. package/esm2020/src/app/core/auth/modal/modal-auth.mjs +3 -3
  13. package/esm2020/src/app/core/core.module.mjs +6 -6
  14. package/esm2020/src/app/core/core.testing.module.mjs +26 -12
  15. package/esm2020/src/app/core/form/editor.class.mjs +126 -62
  16. package/esm2020/src/app/core/form/entity-editor-modal.class.mjs +8 -7
  17. package/esm2020/src/app/core/form/entity-editor.class.mjs +10 -33
  18. package/esm2020/src/app/core/form/entity-metadata.component.mjs +3 -3
  19. package/esm2020/src/app/core/form/form-buttons-bar.component.mjs +3 -3
  20. package/esm2020/src/app/core/form/form.class.mjs +7 -4
  21. package/esm2020/src/app/core/form/form.utils.mjs +39 -4
  22. package/esm2020/src/app/core/form/list.form.mjs +7 -6
  23. package/esm2020/src/app/core/form/properties/properties.form.mjs +129 -0
  24. package/esm2020/src/app/core/form/properties/property.validator.mjs +23 -0
  25. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +90 -0
  26. package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +39 -0
  27. package/esm2020/src/app/core/graphql/graphql.module.mjs +4 -4
  28. package/esm2020/src/app/core/graphql/graphql.service.mjs +3 -3
  29. package/esm2020/src/app/core/graphql/graphql.utils.mjs +2 -2
  30. package/esm2020/src/app/core/home/home.mjs +3 -3
  31. package/esm2020/src/app/core/icon/icon.component.mjs +3 -3
  32. package/esm2020/src/app/core/icon/icon.module.mjs +4 -4
  33. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +3 -3
  34. package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +4 -4
  35. package/esm2020/src/app/core/menu/menu.component.mjs +3 -3
  36. package/esm2020/src/app/core/menu/menu.module.mjs +4 -4
  37. package/esm2020/src/app/core/menu/menu.service.mjs +3 -3
  38. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +3 -3
  39. package/esm2020/src/app/core/peer/select-peer.modal.mjs +3 -3
  40. package/esm2020/src/app/core/peer/select-peer.module.mjs +4 -4
  41. package/esm2020/src/app/core/register/confirm/confirm.mjs +3 -3
  42. package/esm2020/src/app/core/register/form/form-register.mjs +3 -3
  43. package/esm2020/src/app/core/register/modal/modal-register.mjs +3 -3
  44. package/esm2020/src/app/core/register/register.module.mjs +4 -4
  45. package/esm2020/src/app/core/services/account.service.mjs +5 -5
  46. package/esm2020/src/app/core/services/auth-guard.service.mjs +3 -3
  47. package/esm2020/src/app/core/services/base-entity-service.class.mjs +8 -9
  48. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +3 -3
  49. package/esm2020/src/app/core/services/config.service.mjs +5 -5
  50. package/esm2020/src/app/core/services/crypto.service.mjs +3 -3
  51. package/esm2020/src/app/core/services/local-settings.service.mjs +3 -3
  52. package/esm2020/src/app/core/services/network.service.mjs +21 -28
  53. package/esm2020/src/app/core/services/pipes/account.pipes.mjs +8 -8
  54. package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +4 -4
  55. package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +4 -4
  56. package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +8 -8
  57. package/esm2020/src/app/core/services/platform.service.mjs +3 -3
  58. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +3 -3
  59. package/esm2020/src/app/core/services/testing/referential.validator.mjs +3 -3
  60. package/esm2020/src/app/core/services/validator/account.validator.mjs +3 -3
  61. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +3 -3
  62. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +3 -3
  63. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +3 -3
  64. package/esm2020/src/app/core/settings/settings.page.mjs +4 -4
  65. package/esm2020/src/app/core/table/actions-column.component.mjs +9 -9
  66. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +74 -65
  67. package/esm2020/src/app/core/table/memory-table.class.mjs +3 -3
  68. package/esm2020/src/app/core/table/table-select-columns.component.mjs +3 -3
  69. package/esm2020/src/app/core/table/table.class.mjs +77 -65
  70. package/esm2020/src/app/core/table/table.utils.mjs +1 -1
  71. package/esm2020/src/app/core/table/testing/table.testing.mjs +5 -5
  72. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +4 -4
  73. package/esm2020/src/app/core/text-popover/testing/text-popover.testing.mjs +3 -3
  74. package/esm2020/src/app/core/text-popover/testing/text-popover.testing.module.mjs +4 -4
  75. package/esm2020/src/app/core/text-popover/text-form.component.mjs +3 -3
  76. package/esm2020/src/app/core/text-popover/text-popover.component.mjs +3 -3
  77. package/esm2020/src/app/shared/audio/audio.mjs +4 -4
  78. package/esm2020/src/app/shared/audio/audio.testing.mjs +3 -3
  79. package/esm2020/src/app/shared/audio/audio.testing.module.mjs +4 -4
  80. package/esm2020/src/app/shared/capacitor/keyboard.mjs +3 -3
  81. package/esm2020/src/app/shared/debug/debug.component.mjs +39 -0
  82. package/esm2020/src/app/shared/debug/debug.module.mjs +44 -0
  83. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +6 -6
  84. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +3 -3
  85. package/esm2020/src/app/shared/directives/directives.module.mjs +4 -4
  86. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +3 -3
  87. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +3 -3
  88. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +3 -3
  89. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +3 -3
  90. package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +4 -4
  91. package/esm2020/src/app/shared/file/file.service.mjs +5 -5
  92. package/esm2020/src/app/shared/form/field.component.mjs +10 -7
  93. package/esm2020/src/app/shared/form/loading-spinner.mjs +3 -3
  94. package/esm2020/src/app/shared/forms.mjs +21 -2
  95. package/esm2020/src/app/shared/functions.mjs +23 -10
  96. package/esm2020/src/app/shared/gesture/gesture-config.mjs +3 -3
  97. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +3 -3
  98. package/esm2020/src/app/shared/help/help.modal.mjs +3 -3
  99. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +3 -3
  100. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +3 -3
  101. package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +4 -4
  102. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +3 -3
  103. package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +4 -4
  104. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +3 -3
  105. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +3 -3
  106. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +4 -4
  107. package/esm2020/src/app/shared/image/image.module.mjs +4 -4
  108. package/esm2020/src/app/shared/image/image.service.mjs +3 -3
  109. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +6 -6
  110. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +4 -4
  111. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +3 -3
  112. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +157 -0
  113. package/esm2020/src/app/shared/material/badge/badge.module.mjs +32 -0
  114. package/esm2020/src/app/shared/material/badge/badge.test.mjs +26 -0
  115. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +4 -4
  116. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +3 -3
  117. package/esm2020/src/app/shared/material/chips/chips.module.mjs +4 -4
  118. package/esm2020/src/app/shared/material/chips/material.chips.mjs +10 -11
  119. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +3 -3
  120. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +4 -4
  121. package/esm2020/src/app/shared/material/datetime/material.date.mjs +79 -83
  122. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +5 -5
  123. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +95 -77
  124. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +5 -5
  125. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +5 -5
  126. package/esm2020/src/app/shared/material/duration/duration.module.mjs +4 -4
  127. package/esm2020/src/app/shared/material/duration/material.duration.mjs +3 -3
  128. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +3 -3
  129. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +4 -4
  130. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +3 -3
  131. package/esm2020/src/app/shared/material/material.module.mjs +10 -10
  132. package/esm2020/src/app/shared/material/material.testing.module.mjs +9 -9
  133. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +3 -3
  134. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +3 -3
  135. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +5 -5
  136. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +3 -3
  137. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +3 -3
  138. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +3 -3
  139. package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +4 -4
  140. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +3 -3
  141. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +3 -3
  142. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +3 -3
  143. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +3 -3
  144. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +4 -4
  145. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +3 -3
  146. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +48 -27
  147. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +3 -3
  148. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +4 -4
  149. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +4 -4
  150. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +4 -4
  151. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +4 -4
  152. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +3 -3
  153. package/esm2020/src/app/shared/pipes/form.pipes.mjs +18 -18
  154. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +4 -4
  155. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +9 -9
  156. package/esm2020/src/app/shared/pipes/maps.pipe.mjs +12 -12
  157. package/esm2020/src/app/shared/pipes/math.pipes.mjs +12 -12
  158. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +3 -3
  159. package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +4 -4
  160. package/esm2020/src/app/shared/pipes/pipes.module.mjs +10 -6
  161. package/esm2020/src/app/shared/pipes/property.pipes.mjs +7 -7
  162. package/esm2020/src/app/shared/pipes/string.pipes.mjs +15 -15
  163. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +8 -8
  164. package/esm2020/src/app/shared/services/entity-service.class.mjs +1 -13
  165. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +120 -42
  166. package/esm2020/src/app/shared/services/progress-bar.service.mjs +3 -3
  167. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +119 -0
  168. package/esm2020/src/app/shared/services/startable-service.class.mjs +42 -31
  169. package/esm2020/src/app/shared/services/storage/storage.service.mjs +3 -3
  170. package/esm2020/src/app/shared/services/translate-context.service.mjs +3 -3
  171. package/esm2020/src/app/shared/shared-routing.module.mjs +7 -7
  172. package/esm2020/src/app/shared/shared.module.mjs +4 -4
  173. package/esm2020/src/app/shared/shared.testing.module.mjs +4 -4
  174. package/esm2020/src/app/shared/testing/tests.page.mjs +3 -3
  175. package/esm2020/src/app/shared/toast/toast.testing.mjs +10 -11
  176. package/esm2020/src/app/shared/toast/toast.testing.module.mjs +4 -4
  177. package/esm2020/src/app/shared/toast/toasts.mjs +38 -15
  178. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +5 -5
  179. package/esm2020/src/app/shared/toolbar/toolbar.mjs +9 -9
  180. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +4 -4
  181. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +3 -3
  182. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +4 -4
  183. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +3 -3
  184. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +3 -3
  185. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +3 -3
  186. package/esm2020/src/app/social/job/job.module.mjs +9 -9
  187. package/esm2020/src/app/social/job/job.service.mjs +27 -15
  188. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +210 -0
  189. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +3 -3
  190. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +33 -31
  191. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +27 -5
  192. package/esm2020/src/app/social/job/testing/job.testing.module.mjs +4 -4
  193. package/esm2020/src/app/social/message/message.form.mjs +3 -3
  194. package/esm2020/src/app/social/message/message.modal.mjs +3 -3
  195. package/esm2020/src/app/social/message/message.module.mjs +4 -4
  196. package/esm2020/src/app/social/message/message.service.mjs +3 -3
  197. package/esm2020/src/app/social/social.module.mjs +5 -5
  198. package/esm2020/src/app/social/social.testing.module.mjs +4 -4
  199. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +28 -17
  200. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +6 -6
  201. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +6 -6
  202. package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +4 -4
  203. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +3 -3
  204. package/esm2020/src/app/social/user-event/user-event.module.mjs +9 -9
  205. package/esm2020/src/app/social/user-event/user-event.service.mjs +5 -5
  206. package/esm2020/src/app/vendor.mjs +6 -1
  207. package/fesm2015/sumaris-net.ngx-components.mjs +2232 -1552
  208. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -1
  209. package/fesm2020/sumaris-net.ngx-components.mjs +2191 -1490
  210. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -1
  211. package/package.json +6 -2
  212. package/public_api.d.ts +8 -4
  213. package/src/app/admin/admin.module.d.ts +4 -8
  214. package/src/app/admin/users/list/users.d.ts +1 -0
  215. package/src/app/admin/users/list/users.module.d.ts +14 -0
  216. package/src/app/core/core.module.d.ts +1 -1
  217. package/src/app/core/core.testing.module.d.ts +2 -1
  218. package/src/app/core/form/editor.class.d.ts +19 -6
  219. package/src/app/core/form/entity-editor.class.d.ts +4 -11
  220. package/src/app/core/form/form.class.d.ts +1 -0
  221. package/src/app/core/form/form.utils.d.ts +28 -2
  222. package/src/app/core/form/{properties.form.d.ts → properties/properties.form.d.ts} +13 -13
  223. package/src/app/core/form/properties/property.validator.d.ts +13 -0
  224. package/src/app/core/form/properties/testing/properties-form.test.d.ts +19 -0
  225. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
  226. package/src/app/core/services/network.service.d.ts +6 -8
  227. package/src/app/core/table/entities-table-datasource.class.d.ts +22 -15
  228. package/src/app/core/table/table.class.d.ts +3 -0
  229. package/src/app/core/table/table.utils.d.ts +2 -1
  230. package/src/app/shared/debug/debug.component.d.ts +13 -0
  231. package/src/app/shared/debug/debug.module.d.ts +12 -0
  232. package/src/app/shared/form/field.component.d.ts +4 -1
  233. package/src/app/shared/forms.d.ts +8 -1
  234. package/src/app/shared/functions.d.ts +9 -4
  235. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +1 -1
  236. package/src/app/shared/material/badge/badge.directive.d.ts +28 -0
  237. package/src/app/shared/material/badge/badge.module.d.ts +10 -0
  238. package/src/app/shared/material/badge/badge.test.d.ts +12 -0
  239. package/src/app/shared/material/datetime/material.date.d.ts +12 -13
  240. package/src/app/shared/material/datetime/material.datetime.d.ts +14 -14
  241. package/src/app/shared/material/material.module.d.ts +2 -2
  242. package/src/app/shared/material/material.testing.module.d.ts +2 -2
  243. package/src/app/shared/pipes/arrays.pipe.d.ts +12 -2
  244. package/src/app/shared/pipes/pipes.module.d.ts +1 -1
  245. package/src/app/shared/services/entity-service.class.d.ts +0 -11
  246. package/src/app/shared/services/memory-entity-service.class.d.ts +15 -6
  247. package/src/app/shared/services/startable-observable-service.class.d.ts +33 -0
  248. package/src/app/shared/services/startable-service.class.d.ts +12 -9
  249. package/src/app/shared/toast/toast.testing.d.ts +3 -5
  250. package/src/app/shared/toast/toasts.d.ts +5 -2
  251. package/src/app/social/job/job.module.d.ts +2 -2
  252. package/src/app/social/job/job.service.d.ts +10 -2
  253. package/src/app/social/job/progression/{job-progression.component.d.ts → job-progression.icon.d.ts} +5 -5
  254. package/src/app/social/job/testing/job-progression.testing.d.ts +7 -4
  255. package/src/app/social/job/testing/job-progression.testing.service.d.ts +4 -0
  256. package/src/app/social/social.module.d.ts +1 -1
  257. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +8 -5
  258. package/src/app/social/user-event/testing/user-event.testing.d.ts +2 -2
  259. package/src/app/social/user-event/user-event.module.d.ts +1 -1
  260. package/src/app/social/user-event/user-event.service.d.ts +1 -1
  261. package/src/app/vendor.d.ts +2 -0
  262. package/src/theme/_material.scss +29 -4
  263. package/src/theme/_ngx-components.scss +26 -0
  264. package/esm2020/src/app/core/form/properties.form.mjs +0 -126
  265. package/esm2020/src/app/shared/material/badge/badge-icon.directive.mjs +0 -143
  266. package/esm2020/src/app/shared/material/badge/badge-icon.module.mjs +0 -32
  267. package/esm2020/src/app/shared/material/badge/badge-icon.test.mjs +0 -27
  268. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -201
  269. package/src/app/shared/material/badge/badge-icon.directive.d.ts +0 -30
  270. package/src/app/shared/material/badge/badge-icon.module.d.ts +0 -10
  271. package/src/app/shared/material/badge/badge-icon.test.d.ts +0 -12
@@ -11,13 +11,14 @@ export interface JobProgressionOptions {
11
11
  autoRemove: boolean;
12
12
  autoRemoveDelay: number;
13
13
  }
14
- export declare class JobProgressionComponent implements OnInit, OnDestroy {
14
+ export declare class JobProgressionIcon implements OnInit, OnDestroy {
15
15
  protected jobProgressionService: IJobProgressionService;
16
16
  protected popoverController: PopoverController;
17
17
  protected cd: ChangeDetectorRef;
18
18
  debug: boolean;
19
19
  titleI18n: string;
20
20
  options: JobProgressionOptions;
21
+ autoHide: boolean;
21
22
  jobFinished: EventEmitter<number>;
22
23
  visible: boolean;
23
24
  disabled: boolean;
@@ -25,7 +26,6 @@ export declare class JobProgressionComponent implements OnInit, OnDestroy {
25
26
  mode: ProgressSpinnerMode;
26
27
  value: number;
27
28
  jobProgressions: JobProgression[];
28
- protected autoHide: boolean;
29
29
  protected autoHideDelay: number;
30
30
  protected autoRemove: boolean;
31
31
  protected autoRemoveDelay: number;
@@ -35,13 +35,13 @@ export declare class JobProgressionComponent implements OnInit, OnDestroy {
35
35
  private _logPrefix;
36
36
  constructor(jobProgressionService: IJobProgressionService, popoverController: PopoverController, cd: ChangeDetectorRef);
37
37
  ngOnInit(): void;
38
- addJob(id: number): void;
38
+ addJob(id: number, job?: JobProgression): void;
39
39
  removeJob(id: number): void;
40
40
  getProgression(id: number): JobProgression | undefined;
41
41
  updateValue(): void;
42
42
  showList(event: Event): Promise<void>;
43
43
  protected markForCheck(): void;
44
44
  ngOnDestroy(): void;
45
- static ɵfac: i0.ɵɵFactoryDeclaration<JobProgressionComponent, [{ optional: true; }, null, null]>;
46
- static ɵcmp: i0.ɵɵComponentDeclaration<JobProgressionComponent, "app-job-progression", never, { "debug": "debug"; "titleI18n": "titleI18n"; "options": "options"; }, { "jobFinished": "jobFinished"; }, never, never, false>;
45
+ static ɵfac: i0.ɵɵFactoryDeclaration<JobProgressionIcon, [{ optional: true; }, null, null]>;
46
+ static ɵcmp: i0.ɵɵComponentDeclaration<JobProgressionIcon, "app-job-progression-icon", never, { "debug": "debug"; "titleI18n": "titleI18n"; "options": "options"; "autoHide": "autoHide"; }, { "jobFinished": "jobFinished"; }, never, never, false>;
47
47
  }
@@ -1,14 +1,17 @@
1
- import { JobProgressionComponent, JobProgressionOptions } from '../progression/job-progression.component';
1
+ import { JobProgressionIcon, JobProgressionOptions } from '../progression/job-progression.icon';
2
2
  import { JobProgression } from '../job.model';
3
+ import { JobProgressionService } from '../job.service';
3
4
  import * as i0 from "@angular/core";
4
5
  export declare class JobProgressionTestingPage {
5
- jobProgression: JobProgressionComponent;
6
- nJob: number;
6
+ protected jobProgressionService: JobProgressionService;
7
+ jobProgressionIcon: JobProgressionIcon;
8
+ jobId: number;
7
9
  job: JobProgression;
8
10
  options: JobProgressionOptions;
9
- constructor();
11
+ constructor(jobProgressionService: JobProgressionService);
10
12
  incrementJob(value: number): void;
11
13
  addJob(): void;
14
+ private createJob;
12
15
  static ɵfac: i0.ɵɵFactoryDeclaration<JobProgressionTestingPage, never>;
13
16
  static ɵcmp: i0.ɵɵComponentDeclaration<JobProgressionTestingPage, "job-progression-testing", never, {}, {}, never, never, false>;
14
17
  }
@@ -4,6 +4,10 @@ import { Observable } from 'rxjs';
4
4
  import { JobProgression } from '../job.model';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class JobProgressionTestService implements IJobProgressionService {
7
+ private jobsSubject;
8
+ addJob(id: number, job?: JobProgression): void;
9
+ removeJob(id: number): void;
10
+ watchAll(): Observable<JobProgression[]>;
7
11
  listenChanges(id: number, options?: {
8
12
  interval?: number;
9
13
  fetchPolicy?: FetchPolicy;
@@ -1,5 +1,5 @@
1
1
  import { InjectionToken } from '@angular/core';
2
- import { JobProgressionOptions } from './job/progression/job-progression.component';
2
+ import { JobProgressionOptions } from './job/progression/job-progression.icon';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/common";
5
5
  import * as i2 from "../core/core.module";
@@ -1,26 +1,29 @@
1
- import { OnDestroy, OnInit } from '@angular/core';
1
+ import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
3
  import { PopoverController } from '@ionic/angular';
4
4
  import { IUserEventService } from '../user-event.service';
5
5
  import { IUserEvent, IUserEventFilter } from '../user-event.model';
6
6
  import { AccountService } from '../../../core/services/account.service';
7
7
  import * as i0 from "@angular/core";
8
- export declare class AppUserEventNotificationIcon implements OnInit, OnDestroy {
8
+ export declare class UserEventNotificationIcon implements OnInit, OnDestroy {
9
9
  userEventService: IUserEventService<IUserEvent<any>, IUserEventFilter<any>>;
10
10
  protected accountService: AccountService;
11
11
  protected popoverController: PopoverController;
12
+ private cd;
12
13
  debug: boolean;
13
14
  titleI18n: string;
14
15
  disabled: boolean;
15
16
  filter: any;
17
+ autoHide: boolean;
18
+ visible: boolean;
16
19
  get countChanges(): Observable<number>;
17
20
  private _logPrefix;
18
21
  private _readEvent;
19
22
  private _readEvents;
20
- constructor(userEventService: IUserEventService<IUserEvent<any>, IUserEventFilter<any>>, accountService: AccountService, popoverController: PopoverController);
23
+ constructor(userEventService: IUserEventService<IUserEvent<any>, IUserEventFilter<any>>, accountService: AccountService, popoverController: PopoverController, cd: ChangeDetectorRef);
21
24
  ngOnInit(): Promise<void>;
22
25
  showList(event: Event): Promise<void>;
23
26
  ngOnDestroy(): void;
24
- static ɵfac: i0.ɵɵFactoryDeclaration<AppUserEventNotificationIcon, [{ optional: true; }, null, null]>;
25
- static ɵcmp: i0.ɵɵComponentDeclaration<AppUserEventNotificationIcon, "app-user-event-notification-icon", never, { "debug": "debug"; "titleI18n": "titleI18n"; "disabled": "disabled"; "filter": "filter"; }, {}, never, never, false>;
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<UserEventNotificationIcon, [{ optional: true; }, null, null, null]>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserEventNotificationIcon, "app-user-event-notification-icon", never, { "debug": "debug"; "titleI18n": "titleI18n"; "disabled": "disabled"; "filter": "filter"; "autoHide": "autoHide"; }, {}, never, never, false>;
26
29
  }
@@ -3,7 +3,7 @@ import { Router } from '@angular/router';
3
3
  import { AlertController } from '@ionic/angular';
4
4
  import { TranslateService } from '@ngx-translate/core';
5
5
  import { UserEventTestService } from './user-event.testing.service';
6
- import { AppUserEventNotificationIcon } from '../notification/user-event-notification.icon';
6
+ import { UserEventNotificationIcon } from '../notification/user-event-notification.icon';
7
7
  import { UserEventTest } from './user-event.testing.model';
8
8
  import * as i0 from "@angular/core";
9
9
  export declare class UserEventTestingPage implements OnDestroy {
@@ -12,7 +12,7 @@ export declare class UserEventTestingPage implements OnDestroy {
12
12
  protected alertController: AlertController;
13
13
  protected translateService: TranslateService;
14
14
  private _timerSubscription;
15
- notification: AppUserEventNotificationIcon;
15
+ notification: UserEventNotificationIcon;
16
16
  get timerStarted(): boolean;
17
17
  constructor(userEventService: UserEventTestService, router: Router, alertController: AlertController, translateService: TranslateService);
18
18
  ngOnDestroy(): void;
@@ -7,6 +7,6 @@ import * as i5 from "../../core/icon/icon.module";
7
7
  import * as i6 from "ngx-jdenticon";
8
8
  export declare class UserEventModule {
9
9
  static ɵfac: i0.ɵɵFactoryDeclaration<UserEventModule, never>;
10
- static ɵmod: i0.ɵɵNgModuleDeclaration<UserEventModule, [typeof i1.AppUserEventNotificationIcon, typeof i2.UserEventNotificationList], [typeof i3.CommonModule, typeof i4.SharedModule, typeof i5.AppIconModule, typeof i6.NgxJdenticonModule], [typeof i1.AppUserEventNotificationIcon]>;
10
+ static ɵmod: i0.ɵɵNgModuleDeclaration<UserEventModule, [typeof i1.UserEventNotificationIcon, typeof i2.UserEventNotificationList], [typeof i3.CommonModule, typeof i4.SharedModule, typeof i5.AppIconModule, typeof i6.NgxJdenticonModule], [typeof i1.UserEventNotificationIcon]>;
11
11
  static ɵinj: i0.ɵɵInjectorDeclaration<UserEventModule>;
12
12
  }
@@ -12,7 +12,7 @@ import { BaseGraphqlService, BaseGraphqlServiceOptions } from '../../core/servic
12
12
  import { Moment } from 'moment';
13
13
  import { IStartableService } from '../../shared/services/startable-service.class';
14
14
  import * as i0 from "@angular/core";
15
- export declare const USER_EVENT_SERVICE: InjectionToken<IUserEventService<any, any, number, UserEventWatchOptions, UserEventLoadOptions>>;
15
+ export declare const APP_USER_EVENT_SERVICE: InjectionToken<IUserEventService<any, any, number, UserEventWatchOptions, UserEventLoadOptions>>;
16
16
  export declare interface UserEventLoadOptions extends EntitiesServiceLoadOptions {
17
17
  withContent?: boolean;
18
18
  }
@@ -7,3 +7,5 @@ import { Moment } from 'moment';
7
7
  declare const moment: typeof momentImported;
8
8
  declare const tz: typeof momentImported;
9
9
  export { moment, tz, Moment };
10
+ declare const uuidv4: import("uuid/interfaces").v4;
11
+ export { uuidv4 };
@@ -40,18 +40,21 @@
40
40
  .mat-button.mat-accent,
41
41
  .mat-icon-button.mat-accent,
42
42
  .mat-stroked-button.mat-accent {
43
- color: var(--ion-color-accent, $accent);
43
+ color: var(--ion-color-accent);
44
44
  }
45
45
 
46
46
  // Badge
47
47
  .mat-badge-primary .mat-badge-content {
48
- background-color: var(--ion-color-tertiary, $tertiary);
48
+ background-color: var(--ion-color-tertiary);
49
+ color: var(--ion-color-tertiary-contrast);
49
50
  }
50
51
  .mat-badge-accent .mat-badge-content {
51
- background-color: var(--ion-color-accent, $accent);
52
+ background-color: var(--ion-color-accent);
53
+ color: var(--ion-color-accent-contrast);
52
54
  }
53
55
  .mat-badge-warn .mat-badge-content {
54
- background-color: var(--ion-color-warning, $warning);
56
+ background-color: var(--ion-color-warning);
57
+ color: var(--ion-color-warning-contrast);
55
58
  }
56
59
 
57
60
  // Progress bar
@@ -71,6 +74,28 @@
71
74
  }
72
75
  }
73
76
 
77
+ // Date picker
78
+ @media (orientation: landscape) {
79
+ .mat-datepicker-content-touch {
80
+ height: unset !important;
81
+ min-height: 80vh;
82
+
83
+ .mat-calendar-controls {
84
+ margin-top: 0;
85
+ }
86
+ .mat-datepicker-content-container {
87
+ &.mat-datepicker-content-container-with-actions {
88
+ height: unset !important;
89
+ }
90
+ .mat-datepicker-actions {
91
+ background-color: white;
92
+ margin-top: -12px;
93
+ }
94
+ }
95
+ }
96
+
97
+ }
98
+
74
99
  .mat-option {
75
100
  padding-top: var(--padding-top, 0) !important;
76
101
  padding-right: var(--padding-end, 16px) !important;
@@ -1381,7 +1381,33 @@ ion-toast {
1381
1381
  --color: var(--ion-color-danger-contrast);
1382
1382
  --button-color: var(--ion-color-primary);
1383
1383
  }
1384
+
1385
+ /* -- workaround because toast animation failed */
1386
+ --toast-max-height: 75px;
1387
+
1388
+ &.toast-stack-offset-1 {
1389
+ --toast-stack-offset: 1;
1390
+ }
1391
+ &.toast-stack-offset-2 {
1392
+ --toast-stack-offset: 2;
1393
+ }
1394
+ &.toast-stack-offset-3 {
1395
+ --toast-stack-offset: 3;
1396
+ }
1397
+ &.toast-stack-offset-4 {
1398
+ --toast-stack-offset: 4;
1399
+ }
1400
+
1401
+ &.toast-stacked-top {
1402
+ --toast-top: calc(var(--toast-stack-offset, 0) * var(--toast-max-height, 0));
1403
+ transform: translateY(var(--toast-top));
1404
+ }
1405
+ &.toast-stacked-bottom {
1406
+ --toast-bottom: calc(-1 * var(--toast-stack-offset, 0) * var(--toast-max-height, 0)) !important;
1407
+ transform: translateY(var(--toast-bottom));
1408
+ }
1384
1409
  }
1410
+
1385
1411
  // --------------------------------------------------
1386
1412
  // Refresher
1387
1413
  // --------------------------------------------------
@@ -1,126 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Input, Optional } from '@angular/core';
2
- import { Validators } from '@angular/forms';
3
- import { EntityUtils } from '../services/model/entity.model';
4
- import { isEmptyArray, isNil } from '../../shared/functions';
5
- import { AppForm } from './form.class';
6
- import { FormArrayHelper } from './form.utils';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/forms";
9
- import * as i2 from "@angular/material/core";
10
- import * as i3 from "../services/local-settings.service";
11
- import * as i4 from "@angular/common";
12
- import * as i5 from "@ionic/angular";
13
- import * as i6 from "@ngx-translate/core";
14
- import * as i7 from "@angular/material/form-field";
15
- import * as i8 from "@angular/material/input";
16
- import * as i9 from "@angular/material/icon";
17
- import * as i10 from "@angular/material/button";
18
- import * as i11 from "@angular/material/select";
19
- import * as i12 from "../../shared/form/field.component";
20
- import * as i13 from "../../shared/pipes/form.pipes";
21
- export class AppPropertiesForm extends AppForm {
22
- constructor(injector, formBuilder, dateAdapter, settings, cd, formGroupDir) {
23
- super(injector, null);
24
- this.formBuilder = formBuilder;
25
- this.dateAdapter = dateAdapter;
26
- this.settings = settings;
27
- this.cd = cd;
28
- this.formGroupDir = formGroupDir;
29
- this.definitionsMapByKey = {};
30
- this.definitionsByIndex = {};
31
- //this.debug = !environment.production;
32
- }
33
- set value(data) {
34
- this.setValue(data);
35
- }
36
- get value() {
37
- return this.formArray.value;
38
- }
39
- get fieldForms() {
40
- return this.formArray.controls;
41
- }
42
- ngOnInit() {
43
- if (isEmptyArray(this.definitions)) {
44
- throw new Error('Missing or invalid attribute \'definitions\'');
45
- }
46
- // Fill options map
47
- this.definitionsMapByKey = {};
48
- this.definitions.forEach(o => {
49
- this.definitionsMapByKey[o.key] = o;
50
- });
51
- // Retrieve the form
52
- const form = (this.formArray && this.formArray.parent || this.formGroupDir && this.formGroupDir.form || this.formBuilder.group({}));
53
- this.setForm(form);
54
- this.formArray = this.formArray || this.formArrayName && form.get(this.formArrayName);
55
- this.formArrayName = this.formArrayName || this.formArray && Object.keys(form.controls).find(key => form.get(key) === this.formArray) || 'properties';
56
- if (!this.formArray) {
57
- console.warn(`Missing array control '${this.formArrayName}'. Will create it!`);
58
- this.formArray = this.formBuilder.array([]);
59
- this.form.addControl(this.formArrayName, this.formArray);
60
- }
61
- this.helper = new FormArrayHelper(this.formArray, (value) => this.getPropertyFormGroup(value), (v1, v2) => (!v1 && !v2) || v1.key === v2.key, (value) => isNil(value) || (isNil(value.key) && isNil(value.value)), this.options);
62
- super.ngOnInit();
63
- }
64
- getDefinitionAt(index) {
65
- let definition = this.definitionsByIndex[index];
66
- if (!definition) {
67
- definition = this.updateDefinitionAt(index);
68
- this.definitionsByIndex[index] = definition;
69
- }
70
- return definition;
71
- }
72
- updateDefinitionAt(index) {
73
- const key = this.formArray.at(index).controls.key.value;
74
- const definition = key && this.definitionsMapByKey[key] || null;
75
- this.definitionsByIndex[index] = definition; // update map by index
76
- this.markForCheck();
77
- return definition;
78
- }
79
- removeAt(index) {
80
- this.helper.removeAt(index);
81
- this.definitionsByIndex = {}; // clear map by index
82
- this.markForCheck();
83
- }
84
- isUnknownField(fieldForm) {
85
- const keyControl = fieldForm.get('key');
86
- const key = keyControl && keyControl.value;
87
- return key && isNil(this.definitionsMapByKey[key]);
88
- }
89
- setValue(data) {
90
- if (!data)
91
- return; // Skip
92
- // Transform properties map into array
93
- const values = EntityUtils.getMapAsArray(data);
94
- this.helper.resize(values.length);
95
- this.helper.formArray.patchValue(values, { emitEvent: false });
96
- this.markAsPristine();
97
- this.markAsLoaded();
98
- }
99
- /* -- protected methods -- */
100
- getPropertyFormGroup(data) {
101
- return this.formBuilder.group({
102
- key: [data && data.key || null, Validators.compose([Validators.required, Validators.max(50)])],
103
- value: [data && data.value || null, Validators.required]
104
- });
105
- }
106
- markForCheck() {
107
- this.cd.markForCheck();
108
- }
109
- }
110
- AppPropertiesForm.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: AppPropertiesForm, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.DateAdapter }, { token: i3.LocalSettingsService }, { token: i0.ChangeDetectorRef }, { token: i1.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
111
- AppPropertiesForm.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: AppPropertiesForm, selector: "app-properties-form", inputs: { formArrayName: "formArrayName", formArray: "formArray", options: "options", definitions: "definitions" }, usesInheritance: true, ngImport: i0, template: "\n<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n <ion-grid *ngIf=\"!loading; else propertiesSkeleton\"\n formArrayName=\"properties\" class=\"ion-no-padding\" >\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding ion-align-self-end\" size=\"12\">\n <span class=\"toolbar-spacer\"></span>\n\n <!-- Show more options -->\n <ion-button color=\"light\" *ngIf=\"formArray?.length === 0\"\n [title]=\"'SETTINGS.BTN_SHOW_MORE_HELP'|translate\"\n (click)=\"helper.add()\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n\n <ng-container *ngFor=\"let fieldForm of fieldForms; let i=index\">\n <ion-row class=\"ion-no-padding\" [formGroupName]=\"i\">\n\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"fieldForm|formGetControl:'key' as control\">\n <mat-select [formControl]=\"control\"\n [placeholder]=\"'SETTINGS.PROPERTY_KEY'|translate\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"20+i*2\"\n required>\n\n <!-- When option's key not a well known option, add it as first select option -->\n <mat-option *ngIf=\"isUnknownField(fieldForm)\" [value]=\"control.value\">\n {{control.value}}\n </mat-option>\n\n <mat-option *ngFor=\"let item of definitions\" [value]=\"item.key\">{{ item.label | translate }}\n </mat-option>\n\n </mat-select>\n\n <mat-error *ngIf=\"control.hasError('required') && !helper.isLast(i)\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </ion-col>\n\n <!-- property value -->\n <ion-col class=\"ion-no-padding\" padding-left >\n <app-form-field *ngIf=\"getDefinitionAt(i) else unknownValue; let definition; \"\n floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm|formGetControl:'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [required]=\"true\"\n [tabindex]=\"20+i*2 + 1\">\n </app-form-field>\n <ng-template #unknownValue>\n <mat-form-field floatLabel=\"never\">\n <input type=\"text\" matInput\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [formControl]=\"fieldForm|formGetControl:'value'\"\n [required]=\"true\"\n [tabindex]=\"20+i*2 + 1\">\n </mat-form-field>\n </ng-template>\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"removeAt(i)\">\n <mat-icon>close</mat-icon>\n </button>\n <button [hidden]=\"!helper.isLast(i)\"\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY'|translate\"\n (click)=\"helper.add()\">\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ng-container>\n </ion-grid>\n</form>\n\n<ng-template #propertiesSkeleton>\n\n <ion-grid class=\"ion-no-padding\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-grid>\n\n</ng-template>\n\n<ng-template #propertyRowSkeleton>\n\n <ion-row>\n <!-- property key -->\n <ion-col>\n <mat-form-field>\n <input matInput hidden>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col>\n <mat-form-field>\n <input matInput hidden>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"2\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"true\">\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i5.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonRow, selector: "ion-row" }, { kind: "component", type: i5.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "directive", type: i6.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i7.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i12.AppFormField, selector: "app-form-field", inputs: ["definition", "required", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "floatLabel", "tabindex", "autofocus", "class"], outputs: ["keyup.enter"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.FormGetControlPipe, name: "formGetControl" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
112
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: AppPropertiesForm, decorators: [{
113
- type: Component,
114
- args: [{ selector: 'app-properties-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "\n<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n <ion-grid *ngIf=\"!loading; else propertiesSkeleton\"\n formArrayName=\"properties\" class=\"ion-no-padding\" >\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding ion-align-self-end\" size=\"12\">\n <span class=\"toolbar-spacer\"></span>\n\n <!-- Show more options -->\n <ion-button color=\"light\" *ngIf=\"formArray?.length === 0\"\n [title]=\"'SETTINGS.BTN_SHOW_MORE_HELP'|translate\"\n (click)=\"helper.add()\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n\n <ng-container *ngFor=\"let fieldForm of fieldForms; let i=index\">\n <ion-row class=\"ion-no-padding\" [formGroupName]=\"i\">\n\n <!-- property key -->\n <ion-col size=\"6\" class=\"ion-no-padding\">\n <mat-form-field floatLabel=\"never\" *ngIf=\"fieldForm|formGetControl:'key' as control\">\n <mat-select [formControl]=\"control\"\n [placeholder]=\"'SETTINGS.PROPERTY_KEY'|translate\"\n (selectionChange)=\"updateDefinitionAt(i)\"\n [tabindex]=\"20+i*2\"\n required>\n\n <!-- When option's key not a well known option, add it as first select option -->\n <mat-option *ngIf=\"isUnknownField(fieldForm)\" [value]=\"control.value\">\n {{control.value}}\n </mat-option>\n\n <mat-option *ngFor=\"let item of definitions\" [value]=\"item.key\">{{ item.label | translate }}\n </mat-option>\n\n </mat-select>\n\n <mat-error *ngIf=\"control.hasError('required') && !helper.isLast(i)\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n </ion-col>\n\n <!-- property value -->\n <ion-col class=\"ion-no-padding\" padding-left >\n <app-form-field *ngIf=\"getDefinitionAt(i) else unknownValue; let definition; \"\n floatLabel=\"never\"\n [definition]=\"definition\"\n [formControl]=\"fieldForm|formGetControl:'value'\"\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [required]=\"true\"\n [tabindex]=\"20+i*2 + 1\">\n </app-form-field>\n <ng-template #unknownValue>\n <mat-form-field floatLabel=\"never\">\n <input type=\"text\" matInput\n [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n [formControl]=\"fieldForm|formGetControl:'value'\"\n [required]=\"true\"\n [tabindex]=\"20+i*2 + 1\">\n </mat-form-field>\n </ng-template>\n </ion-col>\n\n <ion-col size=\"auto\" class=\"ion-no-padding\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'COMMON.BTN_DELETE'|translate\"\n (click)=\"removeAt(i)\">\n <mat-icon>close</mat-icon>\n </button>\n <button [hidden]=\"!helper.isLast(i)\"\n type=\"button\"\n mat-icon-button\n color=\"light\"\n [disabled]=\"disabled\"\n [title]=\"'SETTINGS.BTN_ADD_PROPERTY'|translate\"\n (click)=\"helper.add()\">\n <mat-icon>add</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n </ng-container>\n </ion-grid>\n</form>\n\n<ng-template #propertiesSkeleton>\n\n <ion-grid class=\"ion-no-padding\">\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n </ion-grid>\n\n</ng-template>\n\n<ng-template #propertyRowSkeleton>\n\n <ion-row>\n <!-- property key -->\n <ion-col>\n <mat-form-field>\n <input matInput hidden>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n </mat-form-field>\n </ion-col>\n <!-- value -->\n <ion-col>\n <mat-form-field>\n <input matInput hidden>\n <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n </mat-form-field>\n </ion-col>\n <!-- buttons -->\n <ion-col size=\"2\">\n <button type=\"button\" mat-icon-button color=\"light\"\n [disabled]=\"true\">\n <mat-icon>close</mat-icon>\n </button>\n </ion-col>\n </ion-row>\n\n</ng-template>\n" }]
115
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.DateAdapter }, { type: i3.LocalSettingsService }, { type: i0.ChangeDetectorRef }, { type: i1.FormGroupDirective, decorators: [{
116
- type: Optional
117
- }] }]; }, propDecorators: { formArrayName: [{
118
- type: Input
119
- }], formArray: [{
120
- type: Input
121
- }], options: [{
122
- type: Input
123
- }], definitions: [{
124
- type: Input
125
- }] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy5mb3JtLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vcHJvcGVydGllcy5mb3JtLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFxQixTQUFTLEVBQVksS0FBSyxFQUFVLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQTZFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RILE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUzRCxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSTNELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDckMsT0FBTyxFQUFDLGVBQWUsRUFBeUIsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVFyRSxNQUFNLE9BQU8saUJBQWdDLFNBQVEsT0FBWTtJQTBCL0QsWUFDRSxRQUFrQixFQUNSLFdBQStCLEVBQy9CLFdBQWdDLEVBQ2hDLFFBQThCLEVBQzlCLEVBQXFCLEVBQ1gsWUFBZ0M7UUFFcEQsS0FBSyxDQUFDLFFBQVEsRUFDWixJQUFJLENBQUMsQ0FBQztRQVBFLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFDaEMsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFDOUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDWCxpQkFBWSxHQUFaLFlBQVksQ0FBb0I7UUE5QnRELHdCQUFtQixHQUEyQixFQUFFLENBQUM7UUFDakQsdUJBQWtCLEdBQTZDLEVBQUUsQ0FBQztRQWtDaEUsdUNBQXVDO0lBQ3pDLENBQUM7SUF4QkQsSUFBSSxL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QUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBGb3JtR3JvdXBEaXJlY3RpdmUsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7RW50aXR5VXRpbHN9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQge0Zvcm1GaWVsZERlZmluaXRpb24sIEZvcm1GaWVsZERlZmluaXRpb25NYXB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05pbH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0RhdGVBZGFwdGVyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtMb2NhbFNldHRpbmdzU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQge0FwcEZvcm19IGZyb20gJy4vZm9ybS5jbGFzcyc7XG5pbXBvcnQge0Zvcm1BcnJheUhlbHBlciwgRm9ybUFycmF5SGVscGVyT3B0aW9uc30gZnJvbSAnLi9mb3JtLnV0aWxzJztcbmltcG9ydCB7UHJvcGVydHl9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9wZXJ0aWVzLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ3Byb3BlcnRpZXMuZm9ybS5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQXBwUHJvcGVydGllc0Zvcm08VCA9IFByb3BlcnR5PiBleHRlbmRzIEFwcEZvcm08VFtdPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgZGVmaW5pdGlvbnNNYXBCeUtleTogRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCA9IHt9O1xuICBkZWZpbml0aW9uc0J5SW5kZXg6IHsgW2luZGV4OiBudW1iZXJdOiBGb3JtRmllbGREZWZpbml0aW9uIH0gPSB7fTtcbiAgaGVscGVyOiBGb3JtQXJyYXlIZWxwZXI8UHJvcGVydHk+O1xuXG4gIEBJbnB1dCgpIGZvcm1BcnJheU5hbWU6IHN0cmluZztcblxuICBASW5wdXQoKSBmb3JtQXJyYXk6IFVudHlwZWRGb3JtQXJyYXk7XG5cbiAgQElucHV0KCkgb3B0aW9uczogRm9ybUFycmF5SGVscGVyT3B0aW9ucztcblxuICBASW5wdXQoKSBkZWZpbml0aW9uczogRm9ybUZpZWxkRGVmaW5pdGlvbltdO1xuXG4gIHNldCB2YWx1ZShkYXRhOiBUW10pIHtcbiAgICB0aGlzLnNldFZhbHVlKGRhdGEpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5LnZhbHVlIGFzIFRbXTtcbiAgfVxuXG4gIGdldCBmaWVsZEZvcm1zKCk6IFVudHlwZWRGb3JtR3JvdXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5LmNvbnRyb2xzIGFzIFVudHlwZWRGb3JtR3JvdXBbXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPE1vbWVudD4sXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybUdyb3VwRGlyOiBGb3JtR3JvdXBEaXJlY3RpdmVcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IsXG4gICAgICBudWxsKTtcblxuICAgIC8vdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKGlzRW1wdHlBcnJheSh0aGlzLmRlZmluaXRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgYXR0cmlidXRlIFxcJ2RlZmluaXRpb25zXFwnJyk7XG4gICAgfVxuXG4gICAgLy8gRmlsbCBvcHRpb25zIG1hcFxuICAgIHRoaXMuZGVmaW5pdGlvbnNNYXBCeUtleSA9IHt9O1xuICAgIHRoaXMuZGVmaW5pdGlvbnMuZm9yRWFjaChvID0+IHtcbiAgICAgIHRoaXMuZGVmaW5pdGlvbnNNYXBCeUtleVtvLmtleV0gPSBvO1xuICAgIH0pO1xuXG4gICAgLy8gUmV0cmlldmUgdGhlIGZvcm1cbiAgICBjb25zdCBmb3JtID0gKHRoaXMuZm9ybUFycmF5ICYmIHRoaXMuZm9ybUFycmF5LnBhcmVudCBhcyBVbnR5cGVkRm9ybUdyb3VwIHx8IHRoaXMuZm9ybUdyb3VwRGlyICYmIHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0gfHwgdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7fSkpO1xuICAgIHRoaXMuc2V0Rm9ybShmb3JtKTtcblxuICAgIHRoaXMuZm9ybUFycmF5ID0gdGhpcy5mb3JtQXJyYXkgfHwgdGhpcy5mb3JtQXJyYXlOYW1lICYmIGZvcm0uZ2V0KHRoaXMuZm9ybUFycmF5TmFtZSkgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICB0aGlzLmZvcm1BcnJheU5hbWUgPSB0aGlzLmZvcm1BcnJheU5hbWUgfHwgdGhpcy5mb3JtQXJyYXkgJiYgT2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZmluZChrZXkgPT4gZm9ybS5nZXQoa2V5KSA9PT0gdGhpcy5mb3JtQXJyYXkpIHx8ICdwcm9wZXJ0aWVzJztcbiAgICBpZiAoIXRoaXMuZm9ybUFycmF5KSB7XG4gICAgICBjb25zb2xlLndhcm4oYE1pc3NpbmcgYXJyYXkgY29udHJvbCAnJHt0aGlzLmZvcm1BcnJheU5hbWV9Jy4gV2lsbCBjcmVhdGUgaXQhYCk7XG4gICAgICB0aGlzLmZvcm1BcnJheSA9IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pO1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2wodGhpcy5mb3JtQXJyYXlOYW1lLCB0aGlzLmZvcm1BcnJheSk7XG4gICAgfVxuXG4gICAgdGhpcy5oZWxwZXIgPSBuZXcgRm9ybUFycmF5SGVscGVyPFByb3BlcnR5PihcbiAgICAgIHRoaXMuZm9ybUFycmF5LFxuICAgICAgKHZhbHVlKSA9PiB0aGlzLmdldFByb3BlcnR5Rm9ybUdyb3VwKHZhbHVlKSxcbiAgICAgICh2MSwgdjIpID0+ICghdjEgJiYgIXYyKSB8fCB2MS5rZXkgPT09IHYyLmtleSxcbiAgICAgICh2YWx1ZSkgPT4gaXNOaWwodmFsdWUpIHx8IChpc05pbCh2YWx1ZS5rZXkpICYmIGlzTmlsKHZhbHVlLnZhbHVlKSksXG4gICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgfVxuXG4gIGdldERlZmluaXRpb25BdChpbmRleDogbnVtYmVyKTogRm9ybUZpZWxkRGVmaW5pdGlvbiB7XG4gICAgbGV0IGRlZmluaXRpb24gPSB0aGlzLmRlZmluaXRpb25zQnlJbmRleFtpbmRleF07XG4gICAgaWYgKCFkZWZpbml0aW9uKSB7XG4gICAgICBkZWZpbml0aW9uID0gdGhpcy51cGRhdGVEZWZpbml0aW9uQXQoaW5kZXgpO1xuICAgICAgdGhpcy5kZWZpbml0aW9uc0J5SW5kZXhbaW5kZXhdID0gZGVmaW5pdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmluaXRpb247XG4gIH1cblxuICB1cGRhdGVEZWZpbml0aW9uQXQoaW5kZXg6IG51bWJlcik6IEZvcm1GaWVsZERlZmluaXRpb24ge1xuICAgIGNvbnN0IGtleSA9ICh0aGlzLmZvcm1BcnJheS5hdChpbmRleCkgYXMgVW50eXBlZEZvcm1Hcm91cCkuY29udHJvbHMua2V5LnZhbHVlO1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBrZXkgJiYgdGhpcy5kZWZpbml0aW9uc01hcEJ5S2V5W2tleV0gfHwgbnVsbDtcbiAgICB0aGlzLmRlZmluaXRpb25zQnlJbmRleFtpbmRleF0gPSBkZWZpbml0aW9uOyAvLyB1cGRhdGUgbWFwIGJ5IGluZGV4XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHJlbW92ZUF0KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlbHBlci5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5kZWZpbml0aW9uc0J5SW5kZXggPSB7fTsgLy8gY2xlYXIgbWFwIGJ5IGluZGV4XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGlzVW5rbm93bkZpZWxkKGZpZWxkRm9ybTogVW50eXBlZEZvcm1Hcm91cCkge1xuICAgIGNvbnN0IGtleUNvbnRyb2wgPSBmaWVsZEZvcm0uZ2V0KCdrZXknKTtcbiAgICBjb25zdCBrZXkgPSBrZXlDb250cm9sICYmIGtleUNvbnRyb2wudmFsdWU7XG4gICAgcmV0dXJuIGtleSAmJiBpc05pbCh0aGlzLmRlZmluaXRpb25zTWFwQnlLZXlba2V5XSk7XG4gIH1cblxuICBzZXRWYWx1ZShkYXRhOiBUW10gfCBhbnkpIHtcbiAgICBpZiAoIWRhdGEpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgLy8gVHJhbnNmb3JtIHByb3BlcnRpZXMgbWFwIGludG8gYXJyYXlcbiAgICBjb25zdCB2YWx1ZXMgPSBFbnRpdHlVdGlscy5nZXRNYXBBc0FycmF5PFQ+KGRhdGEpO1xuICAgIHRoaXMuaGVscGVyLnJlc2l6ZSh2YWx1ZXMubGVuZ3RoKTtcbiAgICB0aGlzLmhlbHBlci5mb3JtQXJyYXkucGF0Y2hWYWx1ZSh2YWx1ZXMsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG5cbiAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgdGhpcy5tYXJrQXNMb2FkZWQoKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGdldFByb3BlcnR5Rm9ybUdyb3VwKGRhdGE/OiB7a2V5OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nfSk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGtleTogW2RhdGEgJiYgZGF0YS5rZXkgfHwgbnVsbCwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heCg1MCldKV0sXG4gICAgICB2YWx1ZTogW2RhdGEgJiYgZGF0YS52YWx1ZSB8fCBudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbn1cblxuIiwiXG48IS0tIFByb3BlcnRpZXMgLS0+XG48Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gIDxpb24tZ3JpZCAqbmdJZj1cIiFsb2FkaW5nOyBlbHNlIHByb3BlcnRpZXNTa2VsZXRvblwiXG4gICAgICAgICAgICBmb3JtQXJyYXlOYW1lPVwicHJvcGVydGllc1wiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiA+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBpb24tYWxpZ24tc2VsZi1lbmRcIiBzaXplPVwiMTJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvc3Bhbj5cblxuICAgICAgICA8IS0tIFNob3cgbW9yZSBvcHRpb25zIC0tPlxuICAgICAgICA8aW9uLWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCIgKm5nSWY9XCJmb3JtQXJyYXk/Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInU0VUVElOR1MuQlROX1NIT1dfTU9SRV9IRUxQJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGVscGVyLmFkZCgpXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9TSE9XX01PUkU8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8bWF0LWljb24gc2xvdD1cImVuZFwiPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZEZvcm0gb2YgZmllbGRGb3JtczsgbGV0IGk9aW5kZXhcIj5cbiAgICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XG5cbiAgICAgICAgPCEtLSBwcm9wZXJ0eSBrZXkgLS0+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCI2XCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIiAqbmdJZj1cImZpZWxkRm9ybXxmb3JtR2V0Q29udHJvbDona2V5JyBhcyBjb250cm9sXCI+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NFVFRJTkdTLlBST1BFUlRZX0tFWSd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwidXBkYXRlRGVmaW5pdGlvbkF0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIyMCtpKjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ+XG5cbiAgICAgICAgICAgICAgPCEtLSBXaGVuIG9wdGlvbidzIGtleSBub3QgYSB3ZWxsIGtub3duIG9wdGlvbiwgYWRkIGl0IGFzIGZpcnN0IHNlbGVjdCBvcHRpb24gLS0+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiaXNVbmtub3duRmllbGQoZmllbGRGb3JtKVwiIFt2YWx1ZV09XCJjb250cm9sLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAge3tjb250cm9sLnZhbHVlfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRlZmluaXRpb25zXCIgW3ZhbHVlXT1cIml0ZW0ua2V5XCI+e3sgaXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImNvbnRyb2wuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgIWhlbHBlci5pc0xhc3QoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgICA8IS0tIHByb3BlcnR5IHZhbHVlIC0tPlxuICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgcGFkZGluZy1sZWZ0ID5cbiAgICAgICAgICA8YXBwLWZvcm0tZmllbGQgKm5nSWY9XCJnZXREZWZpbml0aW9uQXQoaSkgZWxzZSB1bmtub3duVmFsdWU7IGxldCBkZWZpbml0aW9uOyBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmaW5pdGlvbl09XCJkZWZpbml0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZpZWxkRm9ybXxmb3JtR2V0Q29udHJvbDondmFsdWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTRVRUSU5HUy5QUk9QRVJUWV9WQUxVRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIyMCtpKjIgKyAxXCI+XG4gICAgICAgICAgPC9hcHAtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3Vua25vd25WYWx1ZT5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU0VUVElOR1MuUFJPUEVSVFlfVkFMVUUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJmaWVsZEZvcm18Zm9ybUdldENvbnRyb2w6J3ZhbHVlJ1wiXG4gICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiMjAraSoyICsgMVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIiBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9ERUxFVEUnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQXQoaSlcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBbaGlkZGVuXT1cIiFoZWxwZXIuaXNMYXN0KGkpXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1NFVFRJTkdTLkJUTl9BRERfUFJPUEVSVFknfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGVscGVyLmFkZCgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2lvbi1ncmlkPlxuPC9mb3JtPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnRpZXNTa2VsZXRvbj5cblxuICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eVJvd1NrZWxldG9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5Um93U2tlbGV0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlSb3dTa2VsZXRvblwiPjwvbmctY29udGFpbmVyPlxuICA8L2lvbi1ncmlkPlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5Um93U2tlbGV0b24+XG5cbiAgPGlvbi1yb3c+XG4gICAgPCEtLSBwcm9wZXJ0eSBrZXkgLS0+XG4gICAgPGlvbi1jb2w+XG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4+XG4gICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBhbmltYXRlZCBzdHlsZT1cIndpZHRoOiA2MCVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LWRyb3Bkb3duXCIgbWF0U3VmZml4PjwvaW9uLWljb24+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvaW9uLWNvbD5cbiAgICA8IS0tIHZhbHVlIC0tPlxuICAgIDxpb24tY29sPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuPlxuICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgYW5pbWF0ZWQgc3R5bGU9XCJ3aWR0aDogNjAlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9pb24tY29sPlxuICAgIDwhLS0gYnV0dG9ucyAtLT5cbiAgICA8aW9uLWNvbCBzaXplPVwiMlwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9pb24tY29sPlxuICA8L2lvbi1yb3c+XG5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -1,143 +0,0 @@
1
- import { Directive, Input } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { debounceTime } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- export class MatBadgeIconDirective {
6
- constructor(el) {
7
- this.el = el;
8
- this._subscription = null;
9
- this._$update = new Subject();
10
- }
11
- set size(value) {
12
- if (this._size !== value) {
13
- this._size = value;
14
- this.updateView();
15
- }
16
- }
17
- get size() {
18
- return this._size;
19
- }
20
- set color(value) {
21
- if (this._color !== value) {
22
- this._color = value;
23
- this.updateView();
24
- }
25
- }
26
- get color() {
27
- return this._color;
28
- }
29
- set fill(value) {
30
- if (this._fill !== value) {
31
- this._fill = value;
32
- this.updateView();
33
- }
34
- }
35
- get fill() {
36
- return this._fill;
37
- }
38
- set matIcon(icon) {
39
- if (this._matIcon !== icon) {
40
- this._matIcon = icon;
41
- this.updateView();
42
- }
43
- }
44
- set ionIcon(icon) {
45
- if (this._ionIcon !== icon) {
46
- this._ionIcon = icon;
47
- this.updateView();
48
- }
49
- }
50
- ngOnInit() {
51
- // Default value
52
- this._size = this._size || 'medium';
53
- this._color = this._color || 'primary';
54
- if (this._color === 'warn')
55
- this._color = 'warning';
56
- this.updateView(true);
57
- this._subscription = this._$update
58
- .pipe(debounceTime(100))
59
- .subscribe(() => this.updateView(true));
60
- }
61
- ngOnDestroy() {
62
- this._subscription?.unsubscribe();
63
- }
64
- updateView(immediate) {
65
- // Async by default
66
- if (!immediate) {
67
- this._$update.next();
68
- return;
69
- }
70
- const badge = this.el.nativeElement.querySelector('.mat-badge-content');
71
- if (!badge)
72
- return;
73
- let fontSize;
74
- switch (this._size) {
75
- case 'large':
76
- fontSize = '24px';
77
- break;
78
- case 'medium':
79
- fontSize = '22px';
80
- break;
81
- case 'small':
82
- fontSize = '16px';
83
- break;
84
- }
85
- let html = '';
86
- if (this._matIcon) {
87
- html = `<i class="material-icons" style="font-size: ${fontSize};">${this._matIcon}</i>`;
88
- }
89
- else if (this._ionIcon) {
90
- html = `<ion-icon style="font-size: ${fontSize}; pointer-events: none;" name="${this._ionIcon}"></ion-icon>`;
91
- }
92
- if (this._html !== html) {
93
- this._html = html;
94
- badge.innerHTML = html;
95
- }
96
- // Update style
97
- // fill: 'clear'
98
- if (this._fill === 'clear') {
99
- badge.style.color = `var(--ion-color-${this._color})`;
100
- badge.style.background = 'transparent';
101
- }
102
- // fill: 'solid' (default value)
103
- else {
104
- badge.style.background = `var(--ion-color-${this._color})`;
105
- badge.style.color = `var(--ion-color-${this._color}-contrast)`;
106
- }
107
- if (badge.style.display !== 'inline-block')
108
- badge.style.display = 'inline-block';
109
- if (badge.style.alignItems !== 'center')
110
- badge.style.alignItems = 'center';
111
- if (badge.style.justifyContent !== 'center')
112
- badge.style.justifyContent = 'center';
113
- }
114
- }
115
- MatBadgeIconDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: MatBadgeIconDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
116
- MatBadgeIconDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.1", type: MatBadgeIconDirective, selector: "[matBadgeIcon], [ionBadgeIcon]", inputs: { size: ["matBadgeSize", "size"], color: ["matBadgeColor", "color"], fill: ["matBadgeFill", "fill"], matIcon: ["matBadgeIcon", "matIcon"], ionIcon: ["ionBadgeIcon", "ionIcon"] }, ngImport: i0 });
117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: MatBadgeIconDirective, decorators: [{
118
- type: Directive,
119
- args: [{
120
- selector: '[matBadgeIcon], [ionBadgeIcon]',
121
- inputs: [
122
- 'size: matBadgeSize',
123
- 'color: matBadgeColor',
124
- 'fill: matBadgeFill',
125
- ]
126
- }]
127
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { size: [{
128
- type: Input,
129
- args: ['matBadgeSize']
130
- }], color: [{
131
- type: Input,
132
- args: ['matBadgeColor']
133
- }], fill: [{
134
- type: Input,
135
- args: ['matBadgeFill']
136
- }], matIcon: [{
137
- type: Input,
138
- args: ['matBadgeIcon']
139
- }], ionIcon: [{
140
- type: Input,
141
- args: ['ionBadgeIcon']
142
- }] } });
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFkZ2UtaWNvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9iYWRnZS9iYWRnZS1pY29uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUEyQixLQUFLLEVBQXdELE1BQU0sZUFBZSxDQUFDO0FBSS9ILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDOztBQWE1QyxNQUFNLE9BQU8scUJBQXFCO0lBMERoQyxZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUgxQixrQkFBYSxHQUFpQixJQUFJLENBQUM7UUFDbkMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFRixDQUFDO0lBeER0QyxJQUEyQixJQUFJLENBQUMsS0FBbUI7UUFDakQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRTtZQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUE0QixLQUFLLENBQUMsS0FBZ0I7UUFDaEQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtZQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUEyQixJQUFJLENBQUMsS0FBbUI7UUFDakQs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dCB7RGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0QmFkZ2VTaXplfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQge1ByZWRlZmluZWRDb2xvcnN9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7VGhlbWVQYWxldHRlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0FwcENvbG9yc30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIE1hdEJhZGdlRmlsbCA9ICdjbGVhcicgfCAnc29saWQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbWF0QmFkZ2VJY29uXSwgW2lvbkJhZGdlSWNvbl0nLFxuICBpbnB1dHM6IFtcbiAgICAnc2l6ZTogbWF0QmFkZ2VTaXplJyxcbiAgICAnY29sb3I6IG1hdEJhZGdlQ29sb3InLFxuICAgICdmaWxsOiBtYXRCYWRnZUZpbGwnLFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE1hdEJhZGdlSWNvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoJ21hdEJhZGdlU2l6ZScpIHNldCBzaXplKHZhbHVlOiBNYXRCYWRnZVNpemUpIHtcbiAgICBpZiAodGhpcy5fc2l6ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3NpemUgPSB2YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzaXplKCk6IE1hdEJhZGdlU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBASW5wdXQoJ21hdEJhZGdlQ29sb3InKSBzZXQgY29sb3IodmFsdWU6IEFwcENvbG9ycykge1xuICAgIGlmICh0aGlzLl9jb2xvciAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX2NvbG9yID0gdmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY29sb3IoKTogQXBwQ29sb3JzIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3I7XG4gIH1cblxuICBASW5wdXQoJ21hdEJhZGdlRmlsbCcpIHNldCBmaWxsKHZhbHVlOiBNYXRCYWRnZUZpbGwpIHtcbiAgICBpZiAodGhpcy5fZmlsbCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX2ZpbGwgPSB2YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmaWxsKCk6IE1hdEJhZGdlRmlsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGw7XG4gIH1cblxuICBASW5wdXQoJ21hdEJhZGdlSWNvbicpIHNldCBtYXRJY29uKGljb246IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9tYXRJY29uICE9PSBpY29uKSB7XG4gICAgICB0aGlzLl9tYXRJY29uID0gaWNvbjtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoJ2lvbkJhZGdlSWNvbicpIHNldCBpb25JY29uKGljb246IHN0cmluZyl7XG4gICAgaWYgKHRoaXMuX2lvbkljb24gIT09IGljb24pIHtcbiAgICAgIHRoaXMuX2lvbkljb24gPSBpY29uO1xuICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2l6ZTogTWF0QmFkZ2VTaXplO1xuICBwcml2YXRlIF9jb2xvcjogQXBwQ29sb3JzO1xuICBwcml2YXRlIF9maWxsOiBNYXRCYWRnZUZpbGw7XG4gIHByaXZhdGUgX21hdEljb246IHN0cmluZztcbiAgcHJpdmF0ZSBfaW9uSWNvbjogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2h0bWw6IHN0cmluZztcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBudWxsO1xuICBwcml2YXRlIF8kdXBkYXRlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIERlZmF1bHQgdmFsdWVcbiAgICB0aGlzLl9zaXplID0gdGhpcy5fc2l6ZSB8fCAnbWVkaXVtJztcbiAgICB0aGlzLl9jb2xvciA9IHRoaXMuX2NvbG9yIHx8ICdwcmltYXJ5JztcbiAgICBpZiAodGhpcy5fY29sb3IgPT09ICd3YXJuJykgdGhpcy5fY29sb3IgPSAnd2FybmluZyc7XG5cbiAgICB0aGlzLnVwZGF0ZVZpZXcodHJ1ZSk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSB0aGlzLl8kdXBkYXRlXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVWaWV3KHRydWUpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmlldyhpbW1lZGlhdGU/OiBib29sZWFuKSB7XG5cbiAgICAvLyBBc3luYyBieSBkZWZhdWx0XG4gICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgIHRoaXMuXyR1cGRhdGUubmV4dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJhZGdlOiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm1hdC1iYWRnZS1jb250ZW50Jyk7XG4gICAgaWYgKCFiYWRnZSkgcmV0dXJuO1xuXG4gICAgbGV0IGZvbnRTaXplO1xuICAgIHN3aXRjaCAodGhpcy5fc2l6ZSkge1xuICAgICAgY2FzZSAnbGFyZ2UnOlxuICAgICAgICBmb250U2l6ZSA9ICcyNHB4JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICBmb250U2l6ZSA9ICcyMnB4JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzbWFsbCc6XG4gICAgICAgIGZvbnRTaXplID0gJzE2cHgnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbGV0IGh0bWwgPSAnJztcbiAgICBpZiAodGhpcy5fbWF0SWNvbikge1xuICAgICAgaHRtbCA9IGA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCIgc3R5bGU9XCJmb250LXNpemU6ICR7Zm9udFNpemV9O1wiPiR7dGhpcy5fbWF0SWNvbn08L2k+YDtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5faW9uSWNvbikge1xuICAgICAgaHRtbCA9IGA8aW9uLWljb24gc3R5bGU9XCJmb250LXNpemU6ICR7Zm9udFNpemV9OyBwb2ludGVyLWV2ZW50czogbm9uZTtcIiBuYW1lPVwiJHt0aGlzLl9pb25JY29ufVwiPjwvaW9uLWljb24+YDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2h0bWwgIT09IGh0bWwpIHtcbiAgICAgIHRoaXMuX2h0bWwgPSBodG1sO1xuICAgICAgYmFkZ2UuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3R5bGVcbiAgICAvLyBmaWxsOiAnY2xlYXInXG4gICAgaWYgKHRoaXMuX2ZpbGwgPT09ICdjbGVhcicpIHtcbiAgICAgIGJhZGdlLnN0eWxlLmNvbG9yID0gYHZhcigtLWlvbi1jb2xvci0ke3RoaXMuX2NvbG9yfSlgO1xuICAgICAgYmFkZ2Uuc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgfVxuICAgIC8vIGZpbGw6ICdzb2xpZCcgKGRlZmF1bHQgdmFsdWUpXG4gICAgZWxzZSB7XG4gICAgICBiYWRnZS5zdHlsZS5iYWNrZ3JvdW5kID0gYHZhcigtLWlvbi1jb2xvci0ke3RoaXMuX2NvbG9yfSlgO1xuICAgICAgYmFkZ2Uuc3R5bGUuY29sb3IgPSBgdmFyKC0taW9uLWNvbG9yLSR7dGhpcy5fY29sb3J9LWNvbnRyYXN0KWA7XG4gICAgfVxuXG4gICAgaWYgKGJhZGdlLnN0eWxlLmRpc3BsYXkgIT09ICdpbmxpbmUtYmxvY2snKSBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG4gICAgaWYgKGJhZGdlLnN0eWxlLmFsaWduSXRlbXMgIT09ICdjZW50ZXInKSBiYWRnZS5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7XG4gICAgaWYgKGJhZGdlLnN0eWxlLmp1c3RpZnlDb250ZW50ICE9PSAnY2VudGVyJykgYmFkZ2Uuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSAnY2VudGVyJztcbiAgfVxufVxuIl19