@sumaris-net/ngx-components 1.4.7 → 1.4.19

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 (793) hide show
  1. package/README.md +9 -7
  2. package/doc/build.md +2 -2
  3. package/doc/changelog.md +417 -0
  4. package/esm2020/public_api.mjs +298 -0
  5. package/esm2020/src/app/admin/admin-routing.module.mjs +41 -0
  6. package/esm2020/src/app/admin/admin.module.mjs +34 -0
  7. package/esm2020/src/app/admin/services/filter/person.filter.mjs +59 -0
  8. package/esm2020/src/app/admin/services/person.service.mjs +161 -0
  9. package/esm2020/src/app/admin/services/validator/person.validator.mjs +34 -0
  10. package/esm2020/src/app/admin/users/users.mjs +234 -0
  11. package/esm2020/src/app/admin/users/users.module.mjs +54 -0
  12. package/esm2020/src/app/core/about/about.modal.mjs +71 -0
  13. package/esm2020/src/app/core/about/about.module.mjs +34 -0
  14. package/esm2020/src/app/core/account/account.module.mjs +43 -0
  15. package/esm2020/src/app/core/account/account.page.mjs +245 -0
  16. package/esm2020/src/app/core/auth/auth.form.mjs +131 -0
  17. package/esm2020/src/app/core/auth/auth.modal.mjs +72 -0
  18. package/esm2020/src/app/core/auth/auth.module.mjs +47 -0
  19. package/esm2020/src/app/core/core.module.mjs +184 -0
  20. package/esm2020/src/app/core/core.testing.module.mjs +86 -0
  21. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +71 -0
  22. package/esm2020/src/app/core/form/buttons/form-buttons-bar.module.mjs +35 -0
  23. package/esm2020/src/app/core/form/entity/editor.class.mjs +675 -0
  24. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +419 -0
  25. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +652 -0
  26. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +25 -0
  27. package/esm2020/src/app/core/form/entity/entity.module.mjs +38 -0
  28. package/esm2020/src/app/core/form/form.class.mjs +340 -0
  29. package/esm2020/src/app/core/form/form.module.mjs +66 -0
  30. package/esm2020/src/app/core/form/form.utils.mjs +473 -0
  31. package/esm2020/src/app/core/form/list/list.form.mjs +222 -0
  32. package/esm2020/src/app/core/form/list/list.module.mjs +35 -0
  33. package/esm2020/src/app/core/form/properties/properties.form.mjs +129 -0
  34. package/esm2020/src/app/core/form/properties/properties.module.mjs +35 -0
  35. package/esm2020/src/app/core/form/properties/property.validator.mjs +23 -0
  36. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +90 -0
  37. package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +39 -0
  38. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +37 -0
  39. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +45 -0
  40. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +89 -0
  41. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +105 -0
  42. package/esm2020/src/app/core/form/text-popover/text-popover.module.mjs +40 -0
  43. package/esm2020/src/app/core/graphql/graphql.module.mjs +22 -0
  44. package/esm2020/src/app/core/graphql/graphql.service.mjs +749 -0
  45. package/esm2020/src/app/core/graphql/graphql.utils.mjs +117 -0
  46. package/esm2020/src/app/core/home/home.mjs +257 -0
  47. package/esm2020/src/app/core/home/home.module.mjs +48 -0
  48. package/esm2020/src/app/core/icon/icon.component.mjs +41 -0
  49. package/esm2020/src/app/core/icon/icon.module.mjs +29 -0
  50. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +337 -0
  51. package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +35 -0
  52. package/esm2020/src/app/core/menu/menu.component.mjs +330 -0
  53. package/esm2020/src/app/core/menu/menu.model.mjs +35 -0
  54. package/esm2020/src/app/core/menu/menu.module.mjs +44 -0
  55. package/esm2020/src/app/core/menu/menu.service.mjs +55 -0
  56. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +27 -0
  57. package/esm2020/src/app/core/offline/update-offline-mode-card.module.mjs +35 -0
  58. package/esm2020/src/app/core/peer/select-peer.modal.mjs +174 -0
  59. package/esm2020/src/app/core/peer/select-peer.module.mjs +42 -0
  60. package/esm2020/src/app/core/register/register-confirm.page.mjs +81 -0
  61. package/esm2020/src/app/core/register/register.form.mjs +181 -0
  62. package/esm2020/src/app/core/register/register.modal.mjs +52 -0
  63. package/esm2020/src/app/core/register/register.module.mjs +44 -0
  64. package/esm2020/src/app/core/services/account.service.mjs +1111 -0
  65. package/esm2020/src/app/core/services/auth-guard.service.mjs +71 -0
  66. package/esm2020/src/app/core/services/base-entity-service.class.mjs +441 -0
  67. package/{esm2015/src/app/core/services/base-graphql-service.class.js → esm2020/src/app/core/services/base-graphql-service.class.mjs} +36 -34
  68. package/{esm2015/src/app/core/services/base58.js → esm2020/src/app/core/services/base58.mjs} +2 -2
  69. package/esm2020/src/app/core/services/config/core.config.mjs +168 -0
  70. package/esm2020/src/app/core/services/config.service.mjs +354 -0
  71. package/esm2020/src/app/core/services/crypto.service.mjs +114 -0
  72. package/{esm2015/src/app/core/services/errors.js → esm2020/src/app/core/services/errors.mjs} +1 -1
  73. package/esm2020/src/app/core/services/local-settings.service.mjs +445 -0
  74. package/esm2020/src/app/core/services/model/account.model.mjs +50 -0
  75. package/esm2020/src/app/core/services/model/config.model.mjs +92 -0
  76. package/esm2020/src/app/core/services/model/department.model.mjs +30 -0
  77. package/esm2020/src/app/core/services/model/entity.decorators.mjs +97 -0
  78. package/esm2020/src/app/core/services/model/entity.model.mjs +228 -0
  79. package/esm2020/src/app/core/services/model/filter.model.mjs +94 -0
  80. package/{esm2015/src/app/core/services/model/history.model.js → esm2020/src/app/core/services/model/history.model.mjs} +0 -0
  81. package/{esm2015/src/app/core/services/model/model.enum.js → esm2020/src/app/core/services/model/model.enum.mjs} +0 -0
  82. package/esm2020/src/app/core/services/model/peer.model.mjs +68 -0
  83. package/esm2020/src/app/core/services/model/person.model.mjs +83 -0
  84. package/esm2020/src/app/core/services/model/referential.model.mjs +153 -0
  85. package/esm2020/src/app/core/services/model/settings.model.mjs +75 -0
  86. package/esm2020/src/app/core/services/network.service.mjs +574 -0
  87. package/esm2020/src/app/core/services/network.types.mjs +20 -0
  88. package/esm2020/src/app/core/services/network.utils.mjs +16 -0
  89. package/esm2020/src/app/core/services/pipes/account.pipes.mjs +38 -0
  90. package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
  91. package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
  92. package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
  93. package/esm2020/src/app/core/services/platform.service.mjs +493 -0
  94. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +427 -0
  95. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +449 -0
  96. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +23 -0
  97. package/esm2020/src/app/core/services/testing/referential.validator.mjs +45 -0
  98. package/esm2020/src/app/core/services/validator/account.validator.mjs +52 -0
  99. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +47 -0
  100. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +66 -0
  101. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +29 -0
  102. package/esm2020/src/app/core/settings/settings.module.mjs +34 -0
  103. package/esm2020/src/app/core/settings/settings.page.mjs +293 -0
  104. package/esm2020/src/app/core/table/actions-column.component.mjs +96 -0
  105. package/esm2020/src/app/core/table/async-table.class.mjs +1619 -0
  106. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +382 -0
  107. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +399 -0
  108. package/esm2020/src/app/core/table/memory-table.class.mjs +53 -0
  109. package/esm2020/src/app/core/table/table-select-columns.component.mjs +43 -0
  110. package/esm2020/src/app/core/table/table.class.mjs +1666 -0
  111. package/esm2020/src/app/core/table/table.model.mjs +12 -0
  112. package/esm2020/src/app/core/table/table.module.mjs +40 -0
  113. package/esm2020/src/app/core/table/table.utils.mjs +13 -0
  114. package/esm2020/src/app/core/table/testing/table.testing.mjs +265 -0
  115. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +38 -0
  116. package/esm2020/src/app/shared/alerts.mjs +238 -0
  117. package/esm2020/src/app/shared/audio/audio.mjs +201 -0
  118. package/esm2020/src/app/shared/audio/audio.testing.mjs +31 -0
  119. package/esm2020/src/app/shared/audio/audio.testing.module.mjs +45 -0
  120. package/esm2020/src/app/shared/capacitor/keyboard.mjs +40 -0
  121. package/esm2020/src/app/shared/capacitor/plugins.mjs +9 -0
  122. package/esm2020/src/app/shared/constants.mjs +10 -0
  123. package/esm2020/src/app/shared/dates.mjs +142 -0
  124. package/esm2020/src/app/shared/debug/debug.component.mjs +39 -0
  125. package/esm2020/src/app/shared/debug/debug.module.mjs +44 -0
  126. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +92 -0
  127. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +30 -0
  128. package/esm2020/src/app/shared/directives/directives.module.mjs +43 -0
  129. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +53 -0
  130. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +31 -0
  131. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +59 -0
  132. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +40 -0
  133. package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
  134. package/esm2020/src/app/shared/events.mjs +64 -0
  135. package/esm2020/src/app/shared/file/csv.utils.mjs +74 -0
  136. package/esm2020/src/app/shared/file/file.service.mjs +117 -0
  137. package/esm2020/src/app/shared/file/file.utils.mjs +113 -0
  138. package/esm2020/src/app/shared/file/images.utils.mjs +161 -0
  139. package/esm2020/src/app/shared/file/json.utils.mjs +33 -0
  140. package/esm2020/src/app/shared/file/uri.utils.mjs +23 -0
  141. package/{esm2015/src/app/shared/focusable.js → esm2020/src/app/shared/focusable.mjs} +0 -0
  142. package/esm2020/src/app/shared/form/field.component.mjs +244 -0
  143. package/{esm2015/src/app/shared/form/field.model.js → esm2020/src/app/shared/form/field.model.mjs} +1 -1
  144. package/esm2020/src/app/shared/form/loading-spinner.mjs +36 -0
  145. package/esm2020/src/app/shared/forms.mjs +391 -0
  146. package/esm2020/src/app/shared/functions.mjs +462 -0
  147. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +41 -0
  148. package/{esm2015/src/app/shared/gesture/gesture-config.js → esm2020/src/app/shared/gesture/gesture-config.mjs} +7 -5
  149. package/esm2020/src/app/shared/gesture/hammer.utils.mjs +2 -0
  150. package/{esm2015/src/app/shared/graph/colors.utils.js → esm2020/src/app/shared/graph/colors.utils.mjs} +1 -1
  151. package/esm2020/src/app/shared/graph/graph-colors.mjs +208 -0
  152. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +57 -0
  153. package/esm2020/src/app/shared/help/help.modal.mjs +53 -0
  154. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  155. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +84 -0
  156. package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +42 -0
  157. package/esm2020/src/app/shared/http/http.utils.mjs +52 -0
  158. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +355 -0
  159. package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +58 -0
  160. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +27 -0
  161. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +89 -0
  162. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +39 -0
  163. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +56 -0
  164. package/esm2020/src/app/shared/image/image.model.mjs +2 -0
  165. package/esm2020/src/app/shared/image/image.module.mjs +29 -0
  166. package/esm2020/src/app/shared/image/image.service.mjs +98 -0
  167. package/{esm2015/src/app/shared/inputs.js → esm2020/src/app/shared/inputs.mjs} +4 -4
  168. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +27 -0
  169. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +47 -0
  170. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +911 -0
  171. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +78 -0
  172. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +19 -0
  173. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +209 -0
  174. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +176 -0
  175. package/esm2020/src/app/shared/material/badge/badge.module.mjs +32 -0
  176. package/esm2020/src/app/shared/material/badge/badge.test.mjs +28 -0
  177. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +68 -0
  178. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +253 -0
  179. package/esm2020/src/app/shared/material/chips/chips.module.mjs +76 -0
  180. package/esm2020/src/app/shared/material/chips/material.chips.mjs +697 -0
  181. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +143 -0
  182. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +91 -0
  183. package/esm2020/src/app/shared/material/datetime/material.date.mjs +376 -0
  184. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +385 -0
  185. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +436 -0
  186. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +108 -0
  187. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +110 -0
  188. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +103 -0
  189. package/esm2020/src/app/shared/material/duration/duration.module.mjs +67 -0
  190. package/{esm2015/src/app/shared/material/duration/duration.utils.js → esm2020/src/app/shared/material/duration/duration.utils.mjs} +0 -0
  191. package/esm2020/src/app/shared/material/duration/material.duration.mjs +257 -0
  192. package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
  193. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +381 -0
  194. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +67 -0
  195. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +102 -0
  196. package/{esm2015/src/app/shared/material/material.animations.js → esm2020/src/app/shared/material/material.animations.mjs} +1 -1
  197. package/esm2020/src/app/shared/material/material.module.mjs +224 -0
  198. package/esm2020/src/app/shared/material/material.testing.module.mjs +168 -0
  199. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +98 -0
  200. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +80 -0
  201. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +190 -0
  202. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +17 -0
  203. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +162 -0
  204. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +37 -0
  205. package/{esm2015/src/app/shared/material/numpad/numpad.model.js → esm2020/src/app/shared/material/numpad/numpad.model.mjs} +1 -1
  206. package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +60 -0
  207. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +46 -0
  208. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +42 -0
  209. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +22 -0
  210. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +334 -0
  211. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +51 -0
  212. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +64 -0
  213. package/esm2020/src/app/shared/modules.mjs +11 -0
  214. package/esm2020/src/app/shared/observables.mjs +103 -0
  215. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +135 -0
  216. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +23 -0
  217. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +48 -0
  218. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +66 -0
  219. package/{esm2015/src/app/shared/pipes/date-from-now.pipe.js → esm2020/src/app/shared/pipes/date-from-now.pipe.mjs} +13 -12
  220. package/{esm2015/src/app/shared/pipes/duration.pipe.js → esm2020/src/app/shared/pipes/duration.pipe.mjs} +13 -12
  221. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +62 -0
  222. package/esm2020/src/app/shared/pipes/form.pipes.mjs +187 -0
  223. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +48 -0
  224. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +46 -0
  225. package/esm2020/src/app/shared/pipes/maps.pipe.mjs +63 -0
  226. package/esm2020/src/app/shared/pipes/math.pipes.mjs +59 -0
  227. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +21 -0
  228. package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +30 -0
  229. package/esm2020/src/app/shared/pipes/pipes.module.mjs +218 -0
  230. package/esm2020/src/app/shared/pipes/property.pipes.mjs +93 -0
  231. package/esm2020/src/app/shared/pipes/string.pipes.mjs +95 -0
  232. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +43 -0
  233. package/esm2020/src/app/shared/platforms.mjs +43 -0
  234. package/esm2020/src/app/shared/services/entity-service.class.mjs +7 -0
  235. package/esm2020/src/app/shared/services/job.utils.mjs +92 -0
  236. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +337 -0
  237. package/esm2020/src/app/shared/services/progress-bar.service.mjs +33 -0
  238. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +119 -0
  239. package/esm2020/src/app/shared/services/startable-service.class.mjs +105 -0
  240. package/esm2020/src/app/shared/services/storage/storage.service.mjs +132 -0
  241. package/esm2020/src/app/shared/services/storage/storage.utils.mjs +13 -0
  242. package/esm2020/src/app/shared/services/translate-context.service.mjs +81 -0
  243. package/esm2020/src/app/shared/services/validator-service.class.mjs +2 -0
  244. package/esm2020/src/app/shared/services.mjs +62 -0
  245. package/esm2020/src/app/shared/shared-routing.module.mjs +63 -0
  246. package/esm2020/src/app/shared/shared.module.mjs +208 -0
  247. package/esm2020/src/app/shared/shared.testing.module.mjs +76 -0
  248. package/esm2020/src/app/shared/testing/observable.test.mjs +95 -0
  249. package/esm2020/src/app/shared/testing/tests.page.mjs +33 -0
  250. package/esm2020/src/app/shared/toast/toast.testing.mjs +51 -0
  251. package/esm2020/src/app/shared/toast/toast.testing.module.mjs +45 -0
  252. package/esm2020/src/app/shared/toast/toasts.mjs +144 -0
  253. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +58 -0
  254. package/esm2020/src/app/shared/toolbar/toolbar.mjs +249 -0
  255. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +53 -0
  256. package/esm2020/src/app/shared/types.mjs +2 -0
  257. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +57 -0
  258. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +45 -0
  259. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +97 -0
  260. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +204 -0
  261. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +20 -0
  262. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +104 -0
  263. package/esm2020/src/app/shared/validator/validators.mjs +543 -0
  264. package/esm2020/src/app/shared/version/versions.mjs +81 -0
  265. package/esm2020/src/app/social/job/job.module.mjs +35 -0
  266. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +213 -0
  267. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +22 -0
  268. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +23 -0
  269. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +71 -0
  270. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +52 -0
  271. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +55 -0
  272. package/esm2020/src/app/social/job/testing/job.testing.module.mjs +35 -0
  273. package/esm2020/src/app/social/message/message.form.mjs +81 -0
  274. package/esm2020/src/app/social/message/message.modal.mjs +93 -0
  275. package/esm2020/src/app/social/message/message.model.mjs +65 -0
  276. package/esm2020/src/app/social/message/message.module.mjs +35 -0
  277. package/esm2020/src/app/social/message/message.service.mjs +84 -0
  278. package/esm2020/src/app/social/social.errors.mjs +10 -0
  279. package/esm2020/src/app/social/social.module.mjs +47 -0
  280. package/esm2020/src/app/social/social.testing.module.mjs +51 -0
  281. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +108 -0
  282. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +242 -0
  283. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +229 -0
  284. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +112 -0
  285. package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +35 -0
  286. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +111 -0
  287. package/esm2020/src/app/social/user-event/user-event.model.mjs +2 -0
  288. package/esm2020/src/app/social/user-event/user-event.module.mjs +39 -0
  289. package/esm2020/src/app/social/user-event/user-event.service.mjs +487 -0
  290. package/esm2020/src/environments/environment.class.mjs +5 -0
  291. package/esm2020/src/environments/environment.mjs +86 -0
  292. package/esm2020/sumaris-net.ngx-components.mjs +5 -0
  293. package/fesm2015/sumaris-net.ngx-components.mjs +36564 -0
  294. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -0
  295. package/fesm2020/sumaris-net.ngx-components.mjs +35737 -0
  296. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -0
  297. package/index.d.ts +5 -0
  298. package/package.json +34 -32
  299. package/public_api.d.ts +137 -30
  300. package/resources/README.md +7 -0
  301. package/src/app/admin/admin-routing.module.d.ts +7 -0
  302. package/src/app/admin/admin.module.d.ts +7 -0
  303. package/src/app/admin/services/person.service.d.ts +5 -1
  304. package/src/app/admin/services/validator/person.validator.d.ts +8 -5
  305. package/src/app/admin/users/users.d.ts +44 -0
  306. package/src/app/admin/users/users.module.d.ts +13 -0
  307. package/src/app/core/about/{modal-about.d.ts → about.modal.d.ts} +3 -0
  308. package/src/app/core/about/about.module.d.ts +10 -0
  309. package/src/app/core/account/account.module.d.ts +11 -0
  310. package/src/app/core/account/{account.d.ts → account.page.d.ts} +23 -10
  311. package/src/app/core/auth/auth.form.d.ts +36 -0
  312. package/src/app/core/auth/auth.modal.d.ts +24 -0
  313. package/src/app/core/auth/auth.module.d.ts +11 -0
  314. package/src/app/core/core.module.d.ts +27 -0
  315. package/src/app/core/core.testing.module.d.ts +14 -0
  316. package/src/app/core/form/{form-buttons-bar.component.d.ts → buttons/form-buttons-bar.component.d.ts} +7 -2
  317. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +9 -0
  318. package/src/app/core/form/{editor.class.d.ts → entity/editor.class.d.ts} +84 -22
  319. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +129 -0
  320. package/src/app/core/form/{entity-editor.class.d.ts → entity/entity-editor.class.d.ts} +53 -28
  321. package/src/app/core/form/entity/entity-metadata.component.d.ts +13 -0
  322. package/src/app/core/form/entity/entity.module.d.ts +10 -0
  323. package/src/app/core/form/form.class.d.ts +57 -30
  324. package/src/app/core/form/form.module.d.ts +13 -0
  325. package/src/app/core/form/form.utils.d.ts +123 -114
  326. package/src/app/core/form/{list.form.d.ts → list/list.form.d.ts} +14 -11
  327. package/src/app/core/form/list/list.module.d.ts +9 -0
  328. package/src/app/core/form/properties/properties.form.d.ts +43 -0
  329. package/src/app/core/form/properties/properties.module.d.ts +9 -0
  330. package/src/app/core/form/properties/property.validator.d.ts +13 -0
  331. package/src/app/core/form/properties/testing/properties-form.test.d.ts +19 -0
  332. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
  333. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +10 -0
  334. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +11 -0
  335. package/src/app/core/form/text-popover/text-form.component.d.ts +32 -0
  336. package/src/app/core/form/text-popover/text-popover.component.d.ts +45 -0
  337. package/src/app/core/form/text-popover/text-popover.module.d.ts +10 -0
  338. package/src/app/core/graphql/graphql.module.d.ts +5 -0
  339. package/src/app/core/graphql/graphql.service.d.ts +16 -5
  340. package/src/app/core/graphql/graphql.utils.d.ts +12 -1
  341. package/src/app/core/home/home.d.ts +9 -4
  342. package/src/app/core/home/home.module.d.ts +12 -0
  343. package/src/app/core/icon/icon.component.d.ts +6 -2
  344. package/src/app/core/icon/icon.module.d.ts +9 -0
  345. package/src/app/core/install/install-upgrade-card.component.d.ts +6 -8
  346. package/src/app/core/install/install-upgrade-card.module.d.ts +9 -0
  347. package/src/app/core/menu/menu.component.d.ts +22 -15
  348. package/src/app/core/menu/menu.model.d.ts +2 -0
  349. package/src/app/core/menu/menu.module.d.ts +8 -0
  350. package/src/app/core/menu/menu.service.d.ts +18 -6
  351. package/src/app/core/offline/update-offline-mode-card.component.d.ts +11 -0
  352. package/src/app/core/offline/update-offline-mode-card.module.d.ts +9 -0
  353. package/src/app/core/peer/select-peer.modal.d.ts +25 -8
  354. package/src/app/core/peer/select-peer.module.d.ts +11 -0
  355. package/src/app/core/register/{confirm/confirm.d.ts → register-confirm.page.d.ts} +6 -3
  356. package/src/app/core/register/{form/form-register.d.ts → register.form.d.ts} +15 -12
  357. package/src/app/core/register/{modal/modal-register.d.ts → register.modal.d.ts} +4 -1
  358. package/src/app/core/register/register.module.d.ts +12 -0
  359. package/src/app/core/services/account.service.d.ts +34 -13
  360. package/src/app/core/services/auth-guard.service.d.ts +3 -0
  361. package/src/app/core/services/base-entity-service.class.d.ts +10 -19
  362. package/src/app/core/services/base-graphql-service.class.d.ts +13 -9
  363. package/src/app/core/services/config/core.config.d.ts +25 -24
  364. package/src/app/core/services/config.service.d.ts +9 -3
  365. package/src/app/core/services/crypto.service.d.ts +26 -18
  366. package/src/app/core/services/errors.d.ts +1 -1
  367. package/src/app/core/services/local-settings.service.d.ts +15 -7
  368. package/src/app/core/services/model/config.model.d.ts +1 -0
  369. package/src/app/core/services/model/entity.decorators.d.ts +1 -9
  370. package/src/app/core/services/model/entity.model.d.ts +4 -1
  371. package/src/app/core/services/model/filter.model.d.ts +13 -2
  372. package/src/app/core/services/model/referential.model.d.ts +20 -14
  373. package/src/app/core/services/model/settings.model.d.ts +0 -1
  374. package/src/app/core/services/network.service.d.ts +34 -22
  375. package/src/app/core/services/network.types.d.ts +5 -0
  376. package/src/app/core/services/network.utils.d.ts +16 -0
  377. package/src/app/core/services/pipes/account.pipes.d.ts +7 -0
  378. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +4 -0
  379. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +4 -0
  380. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +7 -0
  381. package/src/app/core/services/platform.service.d.ts +40 -25
  382. package/src/app/core/services/storage/entities-storage.service.d.ts +16 -9
  383. package/src/app/core/services/storage/entity-store.class.d.ts +5 -5
  384. package/src/app/core/services/testing/referential-filter.model.d.ts +9 -0
  385. package/src/app/core/services/testing/referential.validator.d.ts +22 -0
  386. package/src/app/core/services/validator/account.validator.d.ts +6 -3
  387. package/src/app/core/services/validator/base.validator.class.d.ts +9 -6
  388. package/src/app/core/services/validator/local-settings.validator.d.ts +8 -5
  389. package/src/app/core/services/validator/user-settings.validator.d.ts +6 -3
  390. package/src/app/core/settings/settings.module.d.ts +10 -0
  391. package/src/app/core/settings/settings.page.d.ts +13 -12
  392. package/src/app/core/table/actions-column.component.d.ts +4 -1
  393. package/src/app/core/table/async-table.class.d.ts +368 -0
  394. package/src/app/core/table/entities-async-table-datasource.class.d.ts +80 -0
  395. package/src/app/core/table/entities-table-datasource.class.d.ts +59 -36
  396. package/src/app/core/table/memory-table.class.d.ts +5 -3
  397. package/src/app/core/table/table-select-columns.component.d.ts +4 -5
  398. package/src/app/core/table/table.class.d.ts +66 -69
  399. package/src/app/core/table/table.model.d.ts +26 -0
  400. package/src/app/core/table/table.module.d.ts +10 -0
  401. package/src/app/core/table/table.utils.d.ts +2 -1
  402. package/src/app/core/table/testing/table.testing.d.ts +51 -0
  403. package/src/app/core/table/testing/table.testing.module.d.ts +11 -0
  404. package/src/app/shared/alerts.d.ts +4 -4
  405. package/src/app/shared/audio/audio.d.ts +20 -11
  406. package/src/app/shared/audio/audio.testing.d.ts +13 -0
  407. package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
  408. package/src/app/shared/capacitor/keyboard.d.ts +16 -0
  409. package/src/app/shared/capacitor/plugins.d.ts +7 -0
  410. package/src/app/shared/constants.d.ts +2 -0
  411. package/src/app/shared/dates.d.ts +25 -4
  412. package/src/app/shared/debug/debug.component.d.ts +13 -0
  413. package/src/app/shared/debug/debug.module.d.ts +12 -0
  414. package/src/app/shared/directives/autofocus.directive.d.ts +11 -9
  415. package/src/app/shared/directives/autotitle.directive.d.ts +10 -0
  416. package/src/app/shared/directives/directives.module.d.ts +10 -0
  417. package/src/app/shared/directives/drag-and-drop.directive.d.ts +17 -0
  418. package/src/app/shared/directives/ng-var.directive.d.ts +12 -0
  419. package/src/app/shared/directives/resizable/resizable.component.d.ts +21 -0
  420. package/src/app/shared/directives/resizable/resizable.directive.d.ts +12 -0
  421. package/src/app/shared/directives/resizable/resizable.module.d.ts +8 -0
  422. package/src/app/shared/events.d.ts +6 -6
  423. package/src/app/shared/file/csv.utils.d.ts +19 -0
  424. package/src/app/shared/file/file.service.d.ts +8 -5
  425. package/src/app/shared/file/file.utils.d.ts +20 -0
  426. package/src/app/shared/file/images.utils.d.ts +19 -0
  427. package/src/app/shared/file/json.utils.d.ts +11 -0
  428. package/src/app/shared/file/uri.utils.d.ts +7 -0
  429. package/src/app/shared/form/field.component.d.ts +12 -3
  430. package/src/app/shared/form/field.model.d.ts +7 -6
  431. package/src/app/shared/form/loading-spinner.d.ts +3 -0
  432. package/src/app/shared/forms.d.ts +89 -0
  433. package/src/app/shared/functions.d.ts +21 -13
  434. package/src/app/shared/geolocation/geolocation.utils.d.ts +11 -0
  435. package/src/app/shared/gesture/gesture-config.d.ts +3 -0
  436. package/src/app/shared/gesture/hammer.utils.d.ts +11 -11
  437. package/src/app/shared/graph/graph-colors.d.ts +8 -8
  438. package/src/app/shared/guard/component-dirty.guard.d.ts +3 -0
  439. package/src/app/shared/help/help.modal.d.ts +7 -4
  440. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +3 -0
  441. package/src/app/shared/hotkeys/hotkeys.service.d.ts +7 -3
  442. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +9 -0
  443. package/src/app/shared/http/http.utils.d.ts +14 -1
  444. package/src/app/shared/image/gallery/image-gallery.component.d.ts +101 -0
  445. package/src/app/shared/image/gallery/image-gallery.module.d.ts +14 -0
  446. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
  447. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
  448. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +16 -0
  449. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +12 -0
  450. package/src/app/shared/image/image.model.d.ts +5 -0
  451. package/src/app/shared/image/image.module.d.ts +8 -0
  452. package/src/app/shared/image/image.service.d.ts +32 -0
  453. package/src/app/shared/inputs.d.ts +3 -3
  454. package/src/app/shared/interceptors/progess.interceptor.d.ts +2 -2
  455. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +36 -0
  456. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +62 -72
  457. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +19 -0
  458. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +4 -0
  459. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +24 -17
  460. package/src/app/shared/material/badge/badge.directive.d.ts +30 -0
  461. package/src/app/shared/material/badge/badge.module.d.ts +10 -0
  462. package/src/app/shared/material/badge/badge.test.d.ts +13 -0
  463. package/src/app/shared/material/boolean/boolean.module.d.ts +17 -0
  464. package/src/app/shared/material/boolean/material.boolean.d.ts +9 -6
  465. package/src/app/shared/material/chips/chips.module.d.ts +20 -1
  466. package/src/app/shared/material/chips/material.chips.d.ts +52 -19
  467. package/src/app/shared/material/chips/testing/chips.test.d.ts +12 -7
  468. package/src/app/shared/material/datetime/datetime.module.d.ts +22 -0
  469. package/src/app/shared/material/datetime/material.date.d.ts +45 -38
  470. package/src/app/shared/material/datetime/material.dateshort.d.ts +47 -38
  471. package/src/app/shared/material/datetime/material.datetime.d.ts +37 -36
  472. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +12 -9
  473. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +30 -0
  474. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +29 -0
  475. package/src/app/shared/material/duration/duration.module.d.ts +16 -0
  476. package/src/app/shared/material/duration/material.duration.d.ts +14 -10
  477. package/src/app/shared/material/latlong/latlong.utils.d.ts +2 -2
  478. package/src/app/shared/material/latlong/material.latlong.d.ts +27 -23
  479. package/src/app/shared/material/latlong/material.latlong.module.d.ts +17 -0
  480. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +13 -7
  481. package/src/app/shared/material/material.module.d.ts +43 -0
  482. package/src/app/shared/material/material.testing.module.d.ts +25 -0
  483. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +3 -0
  484. package/src/app/shared/material/numpad/numpad.component.d.ts +4 -1
  485. package/src/app/shared/material/numpad/numpad.container.d.ts +5 -2
  486. package/src/app/shared/material/numpad/numpad.content.d.ts +3 -0
  487. package/src/app/shared/material/numpad/numpad.directive.d.ts +4 -1
  488. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -0
  489. package/src/app/shared/material/numpad/numpad.model.d.ts +1 -1
  490. package/src/app/shared/material/numpad/numpad.module.d.ts +14 -0
  491. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +13 -0
  492. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +3 -0
  493. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +3 -0
  494. package/src/app/shared/material/swipe/material.swipe.d.ts +12 -8
  495. package/src/app/shared/material/swipe/swipe.module.d.ts +13 -0
  496. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +11 -9
  497. package/src/app/shared/modules.d.ts +8 -0
  498. package/src/app/shared/observables.d.ts +18 -10
  499. package/src/app/shared/pipes/arrays.pipe.d.ts +27 -2
  500. package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
  501. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +10 -2
  502. package/src/app/shared/pipes/date-format.pipe.d.ts +25 -9
  503. package/src/app/shared/pipes/date-from-now.pipe.d.ts +4 -0
  504. package/src/app/shared/pipes/duration.pipe.d.ts +4 -0
  505. package/src/app/shared/pipes/file-size.pipe.d.ts +3 -0
  506. package/src/app/shared/pipes/form.pipes.d.ts +43 -3
  507. package/src/app/shared/pipes/highlight.pipe.d.ts +4 -0
  508. package/src/app/shared/pipes/latlong-format.pipe.d.ts +13 -4
  509. package/src/app/shared/pipes/maps.pipe.d.ts +10 -0
  510. package/src/app/shared/pipes/math.pipes.d.ts +10 -0
  511. package/src/app/shared/pipes/ng-init.pipe.d.ts +3 -0
  512. package/src/app/shared/pipes/number-format.pipe.d.ts +7 -1
  513. package/src/app/shared/pipes/pipes.module.d.ts +24 -0
  514. package/src/app/shared/pipes/property.pipes.d.ts +26 -0
  515. package/src/app/shared/pipes/string.pipes.d.ts +24 -0
  516. package/src/app/shared/pipes/translate-context.pipe.d.ts +8 -1
  517. package/src/app/shared/platforms.d.ts +8 -0
  518. package/src/app/shared/services/entity-service.class.d.ts +28 -15
  519. package/src/app/shared/services/job.utils.d.ts +4 -2
  520. package/src/app/shared/services/memory-entity-service.class.d.ts +31 -10
  521. package/src/app/shared/services/progress-bar.service.d.ts +15 -4
  522. package/src/app/shared/services/startable-observable-service.class.d.ts +33 -0
  523. package/src/app/shared/services/startable-service.class.d.ts +13 -9
  524. package/src/app/shared/services/storage/storage.service.d.ts +23 -0
  525. package/src/app/shared/services/storage/storage.utils.d.ts +19 -0
  526. package/src/app/shared/services/translate-context.service.d.ts +3 -0
  527. package/src/app/shared/services/validator-service.class.d.ts +2 -2
  528. package/src/app/shared/services.d.ts +9 -0
  529. package/src/app/shared/shared-routing.module.d.ts +7 -0
  530. package/src/app/shared/shared.module.d.ts +25 -1
  531. package/src/app/shared/shared.testing.module.d.ts +14 -0
  532. package/src/app/shared/testing/observable.test.d.ts +25 -0
  533. package/src/app/shared/{material/testing/material.testing.page.d.ts → testing/tests.page.d.ts} +6 -2
  534. package/src/app/shared/toast/toast.testing.d.ts +15 -0
  535. package/src/app/shared/toast/toast.testing.module.d.ts +11 -0
  536. package/src/app/shared/{toasts.d.ts → toast/toasts.d.ts} +5 -2
  537. package/src/app/shared/toolbar/modal-toolbar.d.ts +5 -2
  538. package/src/app/shared/toolbar/toolbar.d.ts +22 -10
  539. package/src/app/shared/toolbar/toolbar.module.d.ts +15 -0
  540. package/src/app/shared/types.d.ts +4 -0
  541. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +20 -0
  542. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +11 -0
  543. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +39 -0
  544. package/src/app/shared/upload-file/upload-file.component.d.ts +48 -0
  545. package/src/app/shared/upload-file/upload-file.model.d.ts +30 -0
  546. package/src/app/shared/validator/form-error-adapter.class.d.ts +4 -1
  547. package/src/app/shared/validator/validators.d.ts +47 -11
  548. package/src/app/shared/version/versions.d.ts +2 -0
  549. package/src/app/social/job/job.module.d.ts +11 -0
  550. package/src/app/social/job/progression/job-progression.icon.d.ts +47 -0
  551. package/src/app/social/job/progression/job-progression.list.d.ts +15 -0
  552. package/src/app/social/job/progression/job-progression.model.d.ts +11 -0
  553. package/src/app/social/job/progression/job-progression.service.d.ts +34 -0
  554. package/src/app/social/job/testing/job-progression.testing.d.ts +17 -0
  555. package/src/app/social/job/testing/job-progression.testing.service.d.ts +17 -0
  556. package/src/app/social/job/testing/job.testing.module.d.ts +11 -0
  557. package/src/app/social/message/message.form.d.ts +30 -0
  558. package/src/app/social/message/message.modal.d.ts +39 -0
  559. package/src/app/social/message/message.model.d.ts +31 -0
  560. package/src/app/social/message/message.module.d.ts +11 -0
  561. package/src/app/social/message/message.service.d.ts +27 -0
  562. package/src/app/social/social.errors.d.ts +9 -0
  563. package/src/app/social/social.module.d.ts +18 -2
  564. package/src/app/social/social.testing.module.d.ts +13 -0
  565. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +29 -0
  566. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +67 -0
  567. package/src/app/social/user-event/testing/user-event.testing.d.ts +34 -0
  568. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +44 -0
  569. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +11 -0
  570. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +41 -0
  571. package/src/app/social/user-event/user-event.model.d.ts +45 -0
  572. package/src/app/social/user-event/user-event.module.d.ts +12 -0
  573. package/src/app/social/user-event/user-event.service.d.ts +124 -0
  574. package/src/assets/audio/beep-notification.mp3 +0 -0
  575. package/src/assets/i18n/en-US.json +83 -18
  576. package/src/assets/i18n/en.json +83 -18
  577. package/src/assets/i18n/fr.json +95 -21
  578. package/src/assets/manifest.json +5 -5
  579. package/src/environments/environment.class.d.ts +12 -1
  580. package/src/environments/environment.d.ts +1 -1
  581. package/src/theme/_icons.scss +1 -1
  582. package/src/theme/_ionic.globals.scss +6 -1
  583. package/src/theme/_material.globals.scss +32 -32
  584. package/src/theme/_material.scss +32 -6
  585. package/src/theme/_mixins.scss +6 -4
  586. package/src/theme/_ngx-components.globals.scss +1 -0
  587. package/src/theme/_ngx-components.scss +233 -39
  588. package/src/theme/_print.scss +24 -0
  589. package/src/theme/_responsive.scss +12 -3
  590. package/bundles/sumaris-net.ngx-components.umd.js +0 -28785
  591. package/bundles/sumaris-net.ngx-components.umd.js.map +0 -1
  592. package/bundles/sumaris-net.ngx-components.umd.min.js +0 -25
  593. package/bundles/sumaris-net.ngx-components.umd.min.js.map +0 -1
  594. package/esm2015/public_api.js +0 -183
  595. package/esm2015/src/app/admin/admin-routing.module.js +0 -32
  596. package/esm2015/src/app/admin/admin.module.js +0 -33
  597. package/esm2015/src/app/admin/services/errors.js +0 -6
  598. package/esm2015/src/app/admin/services/filter/person.filter.js +0 -59
  599. package/esm2015/src/app/admin/services/person.service.js +0 -179
  600. package/esm2015/src/app/admin/services/validator/person.validator.js +0 -37
  601. package/esm2015/src/app/admin/users/list/users.js +0 -196
  602. package/esm2015/src/app/core/about/modal-about.js +0 -63
  603. package/esm2015/src/app/core/account/account.js +0 -196
  604. package/esm2015/src/app/core/auth/form/form-auth.js +0 -126
  605. package/esm2015/src/app/core/auth/modal/modal-auth.js +0 -66
  606. package/esm2015/src/app/core/core.module.js +0 -114
  607. package/esm2015/src/app/core/form/editor.class.js +0 -559
  608. package/esm2015/src/app/core/form/entity-editor.class.js +0 -617
  609. package/esm2015/src/app/core/form/entity-metadata.component.js +0 -22
  610. package/esm2015/src/app/core/form/form-buttons-bar.component.js +0 -60
  611. package/esm2015/src/app/core/form/form.class.js +0 -278
  612. package/esm2015/src/app/core/form/form.utils.js +0 -599
  613. package/esm2015/src/app/core/form/list.form.js +0 -219
  614. package/esm2015/src/app/core/form/properties.form.js +0 -119
  615. package/esm2015/src/app/core/graphql/graphql.module.js +0 -18
  616. package/esm2015/src/app/core/graphql/graphql.service.js +0 -733
  617. package/esm2015/src/app/core/graphql/graphql.utils.js +0 -107
  618. package/esm2015/src/app/core/home/home.js +0 -263
  619. package/esm2015/src/app/core/icon/icon.component.js +0 -29
  620. package/esm2015/src/app/core/install/install-upgrade-card.component.js +0 -388
  621. package/esm2015/src/app/core/menu/menu.component.js +0 -279
  622. package/esm2015/src/app/core/menu/menu.model.js +0 -33
  623. package/esm2015/src/app/core/menu/menu.module.js +0 -28
  624. package/esm2015/src/app/core/menu/menu.service.js +0 -28
  625. package/esm2015/src/app/core/peer/select-peer.modal.js +0 -134
  626. package/esm2015/src/app/core/register/confirm/confirm.js +0 -86
  627. package/esm2015/src/app/core/register/form/form-register.js +0 -172
  628. package/esm2015/src/app/core/register/modal/modal-register.js +0 -55
  629. package/esm2015/src/app/core/services/account.service.js +0 -1101
  630. package/esm2015/src/app/core/services/auth-guard.service.js +0 -77
  631. package/esm2015/src/app/core/services/base-entity-service.class.js +0 -448
  632. package/esm2015/src/app/core/services/config/core.config.js +0 -162
  633. package/esm2015/src/app/core/services/config.service.js +0 -377
  634. package/esm2015/src/app/core/services/crypto.service.js +0 -127
  635. package/esm2015/src/app/core/services/local-settings.service.js +0 -456
  636. package/esm2015/src/app/core/services/model/account.model.js +0 -50
  637. package/esm2015/src/app/core/services/model/config.model.js +0 -89
  638. package/esm2015/src/app/core/services/model/department.model.js +0 -30
  639. package/esm2015/src/app/core/services/model/entity.decorators.js +0 -104
  640. package/esm2015/src/app/core/services/model/entity.model.js +0 -230
  641. package/esm2015/src/app/core/services/model/filter.model.js +0 -68
  642. package/esm2015/src/app/core/services/model/peer.model.js +0 -68
  643. package/esm2015/src/app/core/services/model/person.model.js +0 -81
  644. package/esm2015/src/app/core/services/model/referential.model.js +0 -149
  645. package/esm2015/src/app/core/services/model/settings.model.js +0 -75
  646. package/esm2015/src/app/core/services/network.service.js +0 -581
  647. package/esm2015/src/app/core/services/network.utils.js +0 -19
  648. package/esm2015/src/app/core/services/pipes/account.pipes.js +0 -28
  649. package/esm2015/src/app/core/services/pipes/department-to-string.pipe.js +0 -18
  650. package/esm2015/src/app/core/services/pipes/person-to-string.pipe.js +0 -18
  651. package/esm2015/src/app/core/services/pipes/usage-mode.pipes.js +0 -27
  652. package/esm2015/src/app/core/services/platform.service.js +0 -420
  653. package/esm2015/src/app/core/services/storage/entities-storage.service.js +0 -451
  654. package/esm2015/src/app/core/services/storage/entity-store.class.js +0 -462
  655. package/esm2015/src/app/core/services/validator/account.validator.js +0 -55
  656. package/esm2015/src/app/core/services/validator/base.validator.class.js +0 -48
  657. package/esm2015/src/app/core/services/validator/local-settings.validator.js +0 -72
  658. package/esm2015/src/app/core/services/validator/user-settings.validator.js +0 -30
  659. package/esm2015/src/app/core/settings/settings.page.js +0 -307
  660. package/esm2015/src/app/core/table/actions-column.component.js +0 -74
  661. package/esm2015/src/app/core/table/entities-table-datasource.class.js +0 -326
  662. package/esm2015/src/app/core/table/memory-table.class.js +0 -64
  663. package/esm2015/src/app/core/table/table-select-columns.component.js +0 -44
  664. package/esm2015/src/app/core/table/table.class.js +0 -1553
  665. package/esm2015/src/app/core/table/table.utils.js +0 -13
  666. package/esm2015/src/app/shared/alerts.js +0 -251
  667. package/esm2015/src/app/shared/audio/audio.js +0 -178
  668. package/esm2015/src/app/shared/colors.utils.js +0 -2
  669. package/esm2015/src/app/shared/constants.js +0 -6
  670. package/esm2015/src/app/shared/dates.js +0 -82
  671. package/esm2015/src/app/shared/directives/autofocus.directive.js +0 -97
  672. package/esm2015/src/app/shared/directives/directives.module.js +0 -21
  673. package/esm2015/src/app/shared/events.js +0 -56
  674. package/esm2015/src/app/shared/file/base64-image-reader.js +0 -141
  675. package/esm2015/src/app/shared/file/file.service.js +0 -121
  676. package/esm2015/src/app/shared/form/field.component.js +0 -206
  677. package/esm2015/src/app/shared/form/loading-spinner.js +0 -24
  678. package/esm2015/src/app/shared/functions.js +0 -448
  679. package/esm2015/src/app/shared/gesture/hammer.utils.js +0 -2
  680. package/esm2015/src/app/shared/graph/graph-colors.js +0 -256
  681. package/esm2015/src/app/shared/guard/component-dirty.guard.js +0 -61
  682. package/esm2015/src/app/shared/help/help.modal.js +0 -56
  683. package/esm2015/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.js +0 -20
  684. package/esm2015/src/app/shared/hotkeys/hotkeys.service.js +0 -87
  685. package/esm2015/src/app/shared/hotkeys/shared-hotkeys.module.js +0 -29
  686. package/esm2015/src/app/shared/http/http.utils.js +0 -23
  687. package/esm2015/src/app/shared/interceptors/progess.interceptor.js +0 -20
  688. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +0 -723
  689. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.module.js +0 -46
  690. package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +0 -167
  691. package/esm2015/src/app/shared/material/badge/badge-icon.directive.js +0 -62
  692. package/esm2015/src/app/shared/material/badge/badge-icon.module.js +0 -23
  693. package/esm2015/src/app/shared/material/badge/badge-icon.test.js +0 -10
  694. package/esm2015/src/app/shared/material/boolean/boolean.module.js +0 -41
  695. package/esm2015/src/app/shared/material/boolean/material.boolean.js +0 -223
  696. package/esm2015/src/app/shared/material/chips/chips.module.js +0 -45
  697. package/esm2015/src/app/shared/material/chips/material.chips.js +0 -342
  698. package/esm2015/src/app/shared/material/chips/testing/chips.test.js +0 -100
  699. package/esm2015/src/app/shared/material/datetime/datetime.module.js +0 -54
  700. package/esm2015/src/app/shared/material/datetime/material.date.js +0 -307
  701. package/esm2015/src/app/shared/material/datetime/material.dateshort.js +0 -315
  702. package/esm2015/src/app/shared/material/datetime/material.datetime.js +0 -390
  703. package/esm2015/src/app/shared/material/datetime/testing/mat-date-time.test.js +0 -102
  704. package/esm2015/src/app/shared/material/duration/duration.module.js +0 -40
  705. package/esm2015/src/app/shared/material/duration/material.duration.js +0 -245
  706. package/esm2015/src/app/shared/material/latlong/latlong.utils.js +0 -249
  707. package/esm2015/src/app/shared/material/latlong/material.latlong.js +0 -345
  708. package/esm2015/src/app/shared/material/latlong/material.latlong.module.js +0 -41
  709. package/esm2015/src/app/shared/material/latlong/testing/latlong.test.js +0 -70
  710. package/esm2015/src/app/shared/material/material.module.js +0 -93
  711. package/esm2015/src/app/shared/material/numpad/numpad.append-to-input.directive.js +0 -96
  712. package/esm2015/src/app/shared/material/numpad/numpad.component.js +0 -73
  713. package/esm2015/src/app/shared/material/numpad/numpad.container.js +0 -149
  714. package/esm2015/src/app/shared/material/numpad/numpad.content.js +0 -14
  715. package/esm2015/src/app/shared/material/numpad/numpad.directive.js +0 -148
  716. package/esm2015/src/app/shared/material/numpad/numpad.dom-service.js +0 -37
  717. package/esm2015/src/app/shared/material/numpad/numpad.module.js +0 -39
  718. package/esm2015/src/app/shared/material/paginator/material.paginator-i18n.js +0 -44
  719. package/esm2015/src/app/shared/material/stepper/material.stepper-i18n.js +0 -24
  720. package/esm2015/src/app/shared/material/swipe/material.swipe.js +0 -306
  721. package/esm2015/src/app/shared/material/swipe/swipe.module.js +0 -33
  722. package/esm2015/src/app/shared/material/swipe/testing/swipe.test.js +0 -68
  723. package/esm2015/src/app/shared/material/testing/material.testing.module.js +0 -92
  724. package/esm2015/src/app/shared/material/testing/material.testing.page.js +0 -34
  725. package/esm2015/src/app/shared/observables.js +0 -68
  726. package/esm2015/src/app/shared/pipes/arrays.pipe.js +0 -92
  727. package/esm2015/src/app/shared/pipes/date-diff-duration.pipe.js +0 -46
  728. package/esm2015/src/app/shared/pipes/date-format.pipe.js +0 -40
  729. package/esm2015/src/app/shared/pipes/file-size.pipe.js +0 -58
  730. package/esm2015/src/app/shared/pipes/form.pipes.js +0 -70
  731. package/esm2015/src/app/shared/pipes/highlight.pipe.js +0 -43
  732. package/esm2015/src/app/shared/pipes/latlong-format.pipe.js +0 -43
  733. package/esm2015/src/app/shared/pipes/maps.pipe.js +0 -48
  734. package/esm2015/src/app/shared/pipes/math.pipes.js +0 -44
  735. package/esm2015/src/app/shared/pipes/ng-init.pipe.js +0 -18
  736. package/esm2015/src/app/shared/pipes/number-format.pipe.js +0 -22
  737. package/esm2015/src/app/shared/pipes/pipes.module.js +0 -100
  738. package/esm2015/src/app/shared/pipes/properties.pipe.js +0 -20
  739. package/esm2015/src/app/shared/pipes/string.pipes.js +0 -52
  740. package/esm2015/src/app/shared/pipes/translate-context.pipe.js +0 -38
  741. package/esm2015/src/app/shared/services/entity-service.class.js +0 -17
  742. package/esm2015/src/app/shared/services/job.utils.js +0 -78
  743. package/esm2015/src/app/shared/services/memory-entity-service.class.js +0 -226
  744. package/esm2015/src/app/shared/services/progress-bar.service.js +0 -30
  745. package/esm2015/src/app/shared/services/startable-service.class.js +0 -95
  746. package/esm2015/src/app/shared/services/storage.utils.js +0 -41
  747. package/esm2015/src/app/shared/services/translate-context.service.js +0 -83
  748. package/esm2015/src/app/shared/services/validator-service.class.js +0 -2
  749. package/esm2015/src/app/shared/shared-routing.module.js +0 -54
  750. package/esm2015/src/app/shared/shared.module.js +0 -125
  751. package/esm2015/src/app/shared/shared.testing.module.js +0 -19
  752. package/esm2015/src/app/shared/toasts.js +0 -119
  753. package/esm2015/src/app/shared/toolbar/modal-toolbar.js +0 -53
  754. package/esm2015/src/app/shared/toolbar/toolbar.js +0 -197
  755. package/esm2015/src/app/shared/types.js +0 -2
  756. package/esm2015/src/app/shared/validator/form-error-adapter.class.js +0 -99
  757. package/esm2015/src/app/shared/validator/validators.js +0 -421
  758. package/esm2015/src/app/shared/version/versions.js +0 -77
  759. package/esm2015/src/app/social/list/user-events.table.js +0 -159
  760. package/esm2015/src/app/social/services/errors.js +0 -5
  761. package/esm2015/src/app/social/services/model/user-event.model.js +0 -46
  762. package/esm2015/src/app/social/services/social.fragments.js +0 -27
  763. package/esm2015/src/app/social/services/user-event.service.js +0 -367
  764. package/esm2015/src/app/social/social.module.js +0 -31
  765. package/esm2015/src/app/vendor.js +0 -5
  766. package/esm2015/src/environments/environment.class.js +0 -5
  767. package/esm2015/src/environments/environment.js +0 -75
  768. package/esm2015/sumaris-net.ngx-components.js +0 -17
  769. package/fesm2015/sumaris-net.ngx-components.js +0 -24486
  770. package/fesm2015/sumaris-net.ngx-components.js.map +0 -1
  771. package/src/app/admin/services/errors.d.ts +0 -5
  772. package/src/app/admin/users/list/users.d.ts +0 -49
  773. package/src/app/core/auth/form/form-auth.d.ts +0 -33
  774. package/src/app/core/auth/modal/modal-auth.d.ts +0 -14
  775. package/src/app/core/form/entity-metadata.component.d.ts +0 -10
  776. package/src/app/core/form/properties.form.d.ts +0 -40
  777. package/src/app/shared/colors.utils.d.ts +0 -3
  778. package/src/app/shared/file/base64-image-reader.d.ts +0 -18
  779. package/src/app/shared/material/badge/badge-icon.directive.d.ts +0 -15
  780. package/src/app/shared/material/badge/badge-icon.module.d.ts +0 -2
  781. package/src/app/shared/material/badge/badge-icon.test.d.ts +0 -2
  782. package/src/app/shared/material/testing/material.testing.module.d.ts +0 -2
  783. package/src/app/shared/pipes/properties.pipe.d.ts +0 -7
  784. package/src/app/shared/services/storage.utils.d.ts +0 -13
  785. package/src/app/social/list/user-events.table.d.ts +0 -59
  786. package/src/app/social/services/errors.d.ts +0 -4
  787. package/src/app/social/services/model/user-event.model.d.ts +0 -29
  788. package/src/app/social/services/social.fragments.d.ts +0 -4
  789. package/src/app/social/services/user-event.service.d.ts +0 -82
  790. package/src/app/vendor.d.ts +0 -4
  791. package/src/assets/manifest.sumaris.json +0 -17
  792. package/sumaris-net.ngx-components.d.ts +0 -16
  793. package/sumaris-net.ngx-components.metadata.json +0 -1
@@ -1,390 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, Input, Optional, ViewChild, ViewChildren } from '@angular/core';
3
- import { Platform } from '@ionic/angular';
4
- import { DateAdapter } from '@angular/material/core';
5
- import { FormBuilder, FormGroupDirective, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
6
- import { TranslateService } from '@ngx-translate/core';
7
- import { isMoment } from 'moment';
8
- import { DEFAULT_PLACEHOLDER_CHAR, KEYBOARD_HIDE_DELAY_MS } from '../../constants';
9
- import { SharedValidators } from '../../validator/validators';
10
- import { Keyboard } from '@ionic-native/keyboard/ngx';
11
- import { filter, first } from 'rxjs/operators';
12
- import { setTabIndex } from '../../inputs';
13
- import { isFocusableElement } from '../../focusable';
14
- import { merge, Subscription } from 'rxjs';
15
- import { isNil, isNilOrBlank, sleep, toBoolean } from '../../functions';
16
- import { fromDateISOString, toDateISOString } from '../../dates';
17
- const DEFAULT_VALUE_ACCESSOR = {
18
- provide: NG_VALUE_ACCESSOR,
19
- useExisting: forwardRef(() => MatDateTime),
20
- multi: true
21
- };
22
- const DAY_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
23
- const HOUR_REGEXP = /^[012][0-9][:][012345][0-9]$/;
24
- const HOUR_MASK = [/[012]/, /\d/, ':', /[012345]/, /\d/];
25
- const noop = () => {
26
- };
27
- const ɵ0 = noop;
28
- export class MatDateTime {
29
- constructor(platform, dateAdapter, translate, formBuilder, keyboard, cd, formGroupDir) {
30
- this.platform = platform;
31
- this.dateAdapter = dateAdapter;
32
- this.translate = translate;
33
- this.formBuilder = formBuilder;
34
- this.keyboard = keyboard;
35
- this.cd = cd;
36
- this.formGroupDir = formGroupDir;
37
- this._onChangeCallback = noop;
38
- this._onTouchedCallback = noop;
39
- this._subscription = new Subscription();
40
- this.writing = true;
41
- this.disabling = false;
42
- this._readonly = false;
43
- this.dayMask = DAY_MASK;
44
- this.hourMask = HOUR_MASK;
45
- this.floatLabel = 'auto';
46
- this.compact = false;
47
- this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
48
- this.autofocus = false;
49
- this.startDate = null;
50
- this.clearable = false;
51
- this.locale = (translate.currentLang || translate.defaultLang).substr(0, 2);
52
- }
53
- set readonly(value) {
54
- this._readonly = value;
55
- this.markForCheck();
56
- }
57
- get readonly() {
58
- return this._readonly;
59
- }
60
- set tabindex(value) {
61
- if (this._tabindex !== value) {
62
- this._tabindex = value;
63
- setTimeout(() => this.updateTabIndex());
64
- }
65
- }
66
- get tabindex() {
67
- return this._tabindex;
68
- }
69
- get value() {
70
- return this.formControl.value;
71
- }
72
- ngOnInit() {
73
- this.mobile = isNil(this.mobile) ? this.platform.is('mobile') : this.mobile;
74
- this.waitHideKeyboardDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
75
- this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
76
- if (!this.formControl)
77
- throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-time-field>.');
78
- this.required = toBoolean(this.required, this.formControl.validator === Validators.required);
79
- // Add 'validDate' validator (when existing validator are null or required, to be sure to keep it)
80
- if (!this.formControl.validator || this.formControl.validator === Validators.required) {
81
- this.formControl.setValidators(this.required ? [Validators.required, SharedValidators.validDate] : SharedValidators.validDate);
82
- }
83
- else {
84
- this.formControl.setValidators(this.required ? [this.formControl.validator, Validators.required, SharedValidators.validDate] :
85
- [this.formControl.validator, SharedValidators.validDate]);
86
- }
87
- // Create the date control
88
- this.dateFormControl = this.formBuilder.control(null, this.required ? Validators.required : null);
89
- // Create the time control
90
- const timeValidator = this.required ?
91
- (this.mobile ? Validators.required : Validators.compose([Validators.required, Validators.pattern(HOUR_REGEXP)])) :
92
- (this.mobile ? null : Validators.pattern(HOUR_REGEXP));
93
- this.timeFormControl = this.formBuilder.control(null, timeValidator);
94
- // Get patterns to display date and date+time
95
- this._subscription.add(this.translate.get(['COMMON.DATE_PATTERN', 'COMMON.DATE_TIME_PATTERN'])
96
- .subscribe((patterns) => this.updatePattern(patterns)));
97
- this._subscription.add(merge(this.dateFormControl.valueChanges, this.timeFormControl.valueChanges)
98
- .subscribe((event) => this.onFormChange(event)));
99
- // Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
100
- this._subscription.add(this.formControl.statusChanges
101
- .pipe(filter((_) => !this.readonly && !this.writing && !this.disabling) // Skip
102
- )
103
- .subscribe(() => this.markForCheck()));
104
- this.updateTabIndex();
105
- this.writing = false;
106
- }
107
- ngOnDestroy() {
108
- this._subscription.unsubscribe();
109
- }
110
- writeValue(valueStr) {
111
- if (this.writing)
112
- return; // Skip
113
- this.writing = true;
114
- // DEBUG
115
- // console.debug("[mat-date-time] writeValue() with:", valueStr);
116
- const value = fromDateISOString(valueStr);
117
- if (!value || !value.isValid()) {
118
- this.dateFormControl.patchValue(null, { emitEvent: false });
119
- this.timeFormControl.patchValue(null, { emitEvent: false });
120
- }
121
- else {
122
- // Parse day
123
- const day = value.clone().startOf('day');
124
- const dayStr = this.dateAdapter.format(day, this.dayPattern);
125
- // Parse time
126
- // - Format hh
127
- let hour = value.hour();
128
- hour = hour < 10 ? ('0' + hour) : hour;
129
- // - Format mm
130
- let minutes = value.minutes();
131
- minutes = minutes < 10 ? ('0' + minutes) : minutes;
132
- const timeStr = `${hour}:${minutes}`;
133
- // Update controls
134
- this.dateFormControl.patchValue(dayStr, { emitEvent: false });
135
- this.timeFormControl.patchValue(timeStr, { emitEvent: false });
136
- }
137
- this.writing = false;
138
- this.markForCheck();
139
- }
140
- onFormChange(event) {
141
- if (this.writing)
142
- return; // Skip if call by self
143
- this.writing = true;
144
- let dayStr = this.dateFormControl.value;
145
- const time = this.timeFormControl.value;
146
- // DEBUG
147
- //console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
148
- const incompleteValue = isNilOrBlank(time) !== isNilOrBlank(dayStr);
149
- if (incompleteValue || this.dateFormControl.invalid || this.timeFormControl.invalid) {
150
- this.formControl.markAsPending({ onlySelf: true });
151
- this.formControl.setErrors(Object.assign(Object.assign(Object.assign({ validDate: incompleteValue }, this.formControl.errors), this.dateFormControl.errors), this.timeFormControl.errors));
152
- this.formControl.markAsDirty();
153
- // Reset the value
154
- //this.emitChange(null);
155
- this.writing = false;
156
- return;
157
- }
158
- // Make to remove placeholder chars
159
- while (dayStr && dayStr.indexOf(this.placeholderChar) !== -1) {
160
- dayStr = dayStr.replace(this.placeholderChar, '');
161
- }
162
- // Parse day
163
- const day = dayStr && this.dateAdapter.parse(dayStr, this.dayPattern) || null;
164
- // Parse time
165
- const hourParts = (time || '').split(':');
166
- const hour = parseInt(hourParts[0] || 0);
167
- const minutes = parseInt(hourParts[1] || 0);
168
- const dateTime = day && day
169
- .locale(this.locale) // set as time as locale time
170
- .hour(hour).minute(minutes) // Set local hour
171
- .seconds(0).millisecond(0) // Reset seconds/millisecond
172
- .utc(); // Convert to UTC (avoid TZ offset in final string)
173
- // Set model value
174
- this.emitChange(dateTime);
175
- this.writing = false;
176
- }
177
- registerOnChange(fn) {
178
- this._onChangeCallback = fn;
179
- }
180
- registerOnTouched(fn) {
181
- this._onTouchedCallback = fn;
182
- }
183
- setDisabledState(isDisabled) {
184
- if (this.disabling)
185
- return; // Skip
186
- this.disabling = true;
187
- if (isDisabled) {
188
- this.dateFormControl.disable({ emitEvent: false });
189
- this.timeFormControl.disable({ emitEvent: false });
190
- }
191
- else {
192
- this.dateFormControl.enable({ emitEvent: false });
193
- this.timeFormControl.enable({ emitEvent: false });
194
- }
195
- this.disabling = false;
196
- this.markForCheck();
197
- }
198
- updatePattern(patterns) {
199
- this.displayPattern = (patterns['COMMON.DATE_TIME_PATTERN'] !== 'COMMON.DATE_TIME_PATTERN' ? patterns['COMMON.DATE_TIME_PATTERN'] : 'L LT');
200
- this.dayPattern = (patterns['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? patterns['COMMON.DATE_PATTERN'] : 'L');
201
- }
202
- onDatePickerChange(event) {
203
- // Make sure event is valid
204
- if (!event || (event.value !== null && !isMoment(event.value))) {
205
- console.warn('Invalid MatDatepicker event. Skipping', event);
206
- return; // Skip
207
- }
208
- // Convert to usable date, then convert to day pattern (e.g DD/MM/YYYY)
209
- const day = event.value && event.value
210
- .locale(this.locale) // set as time as locale time
211
- .hour(0).minute(0).seconds(0).millisecond(0) // Reset hour
212
- .utc(true);
213
- const dayStr = day && this.dateAdapter.format(day, this.dayPattern) || null;
214
- // Update the day control
215
- if (this.dateFormControl.value !== dayStr) {
216
- // DEBUG
217
- // console.debug("[mat-date-time] onDatePickerChange() new value:", dayStr);
218
- this.dateFormControl.setValue(dayStr, {
219
- emitEvent: true // Will call onFormChange
220
- });
221
- }
222
- }
223
- onTimePickerChange(timeStr) {
224
- // Update the time control, if need
225
- if (this.timeFormControl.value !== timeStr) {
226
- // DEBUG
227
- // console.debug("[mat-date-time] onTimePickerChange() new value:", timeStr);
228
- this.timeFormControl.setValue(timeStr, {
229
- emitEvent: true // Will call onFormChange
230
- });
231
- }
232
- }
233
- openDatePickerIfMobile(event, datePicker) {
234
- return __awaiter(this, void 0, void 0, function* () {
235
- if (!this.mobile || event.defaultPrevented)
236
- return;
237
- this.preventEvent(event);
238
- // Make sure the keyboard is closed
239
- yield this.hideKeyboard(false);
240
- // Open the picker
241
- this.openDatePicker(null, datePicker);
242
- });
243
- }
244
- openDatePicker(event, datePicker) {
245
- datePicker = datePicker || this.datePicker;
246
- if (datePicker) {
247
- if (event)
248
- this.preventEvent(event);
249
- if (!datePicker.opened) {
250
- datePicker.open();
251
- }
252
- }
253
- }
254
- openTimePickerIfMobile(event) {
255
- return __awaiter(this, void 0, void 0, function* () {
256
- if (!this.mobile || event.defaultPrevented)
257
- return;
258
- this.preventEvent(event);
259
- // Make sure the keyboard is closed
260
- yield this.hideKeyboard(true);
261
- // Open the picker
262
- this.openTimePicker(null);
263
- });
264
- }
265
- openTimePicker(event) {
266
- if (!this.timePicker)
267
- return; // Skip
268
- this.preventEvent(event);
269
- this.timePicker.open();
270
- }
271
- preventEvent(event) {
272
- if (!event)
273
- return;
274
- event.preventDefault();
275
- if (event.stopPropagation)
276
- event.stopPropagation();
277
- event.returnValue = false;
278
- }
279
- checkIfTouched() {
280
- if (this.dateFormControl.touched || this.timeFormControl.touched) {
281
- this._onTouchedCallback();
282
- this.markForCheck();
283
- }
284
- }
285
- focus() {
286
- if (!this.matInputs.length)
287
- return;
288
- setTimeout(() => {
289
- const elementRef = this.matInputs[0]; // get the first element
290
- if (isFocusableElement(elementRef)) {
291
- elementRef.focus();
292
- }
293
- });
294
- }
295
- clear() {
296
- this.formControl.setValue(null);
297
- this.markAsTouched();
298
- this.markAsDirty();
299
- }
300
- /* -- protected method -- */
301
- emitChange(value) {
302
- // Get the model value
303
- const dateStr = toDateISOString(value) || null;
304
- if (this.formControl.value !== dateStr) {
305
- // DEBUG
306
- //console.debug('[matèdate-time] Emit new value: ' + dateStr);
307
- // Changes comes from inside function: use the callback
308
- this._onChangeCallback(dateStr);
309
- // Check if need to update controls
310
- this.checkIfTouched();
311
- }
312
- }
313
- hideKeyboard(waitIsHidden) {
314
- return __awaiter(this, void 0, void 0, function* () {
315
- if (!this.keyboard.isVisible)
316
- return; // ok, already hidden
317
- // Force keyboard to be hide
318
- this.keyboard.hide();
319
- // Wait hide occur
320
- yield this.keyboard.onKeyboardHide().pipe(first()).toPromise();
321
- // Wait an additional delay if need (depending on the OS)
322
- if (this.waitHideKeyboardDelay > 0 && waitIsHidden) {
323
- yield sleep(this.waitHideKeyboardDelay);
324
- }
325
- });
326
- }
327
- updateTabIndex() {
328
- if (isNil(this._tabindex) || this._tabindex === -1)
329
- return; // skip
330
- // Focus to first input
331
- setTimeout(() => {
332
- this.matInputs.forEach((elementRef, index) => {
333
- setTabIndex(elementRef, this._tabindex + index);
334
- });
335
- this.markForCheck();
336
- });
337
- }
338
- markAsTouched() {
339
- this.dateFormControl.markAsTouched();
340
- this.timeFormControl.markAsTouched();
341
- this._onTouchedCallback();
342
- this.markForCheck();
343
- }
344
- markAsDirty(opts) {
345
- this.formControl.markAsDirty(opts);
346
- }
347
- markForCheck() {
348
- this.cd.markForCheck();
349
- }
350
- }
351
- MatDateTime.decorators = [
352
- { type: Component, args: [{
353
- selector: 'mat-date-time-field',
354
- template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: displayPattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable + time -->\n<ng-template #writable >\n <ion-grid class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding no-wrap\" nowrap>\n\n <!-- day -->\n <ion-col class=\"day ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"dateFormControl\"\n [textMask]=\"{mask: dayMask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowdown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"dateFormControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix #datePickerButton2 (click)=\"openDatePicker($event, datePicker)\" [disabled]=\"formControl.disabled\">\n <div *ngIf=\"mobile; then iconDate; else iconDesktop\"></div>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"></mat-datepicker>\n <div class=\"mat-form-field-subscript mat-form-field-subscript-wrapper\" >\n <!-- errors -->\n <ng-container [ngSwitch]=\"formControl.touched && formControl.errors|mapKeys|arrayFirst\">\n <mat-error *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n <mat-error *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</mat-error>\n <mat-error *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n <mat-error *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n <mat-error *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</mat-error>\n </ng-container>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </div>\n\n </ion-col>\n\n <!-- hour -->\n <ion-col class=\"hour ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-invalid]=\"formControl.touched && (timeFormControl.invalid || formControl.invalid)\">\n <mat-label *ngIf=\"placeholder && floatLabel != 'never'\" translate>COMMON.TIME</mat-label>\n <input matInput #matInput type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"timeFormControl\"\n autocomplete=\"off\"\n min=\"0\" max=\"23\"\n [textMask]=\"{mask: hourMask, keepCharPositions: true, placeholderChar: placeholderChar, guide: true}\"\n [placeholder]=\"'COMMON.TIME_PLACEHOLDER'|translate\"\n [required]=\"required\"\n (keyup.arrowdown)=\"openTimePicker($event)\"\n (keyup.escape)=\"preventEvent($event)\"\n (blur)=\"checkIfTouched()\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n\n <input matInput #matInput type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"timeFormControl\"\n (click)=\"openTimePickerIfMobile($event)\"\n readonly>\n\n <input matInput type=\"text\"\n [formControl]=\"timeFormControl\"\n hidden\n [ngxTimepicker]=\"timePicker\"\n [format]=\"24\">\n\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && !mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePicker($event)\" >\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n <button matSuffix type=\"button\" mat-icon-button\n tabindex=\"-1\"\n *ngIf=\"!compact && mobile\"\n [disabled]=\"formControl.disabled\"\n (click)=\"openTimePickerIfMobile($event)\">\n <mat-icon>access_time</mat-icon>\n </button>\n\n <ngx-material-timepicker #timePicker [@.disabled]=\"true\"\n (timeSet)=\"onTimePickerChange($event)\"\n [ESC]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"false\"\n [disableAnimation]=\"true\">\n <!-- cancel button -->\n <ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n </ng-template>\n\n <!-- confirm button -->\n <ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ng-template>\n\n </ngx-material-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n",
355
- providers: [
356
- DEFAULT_VALUE_ACCESSOR,
357
- ],
358
- changeDetection: ChangeDetectionStrategy.OnPush,
359
- styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field .datetime-md{padding:0!important}ion-row.no-wrap{flex-wrap:nowrap}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field input[type=text],ion-col.hour mat-form-field mat-label{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}"]
360
- },] }
361
- ];
362
- MatDateTime.ctorParameters = () => [
363
- { type: Platform },
364
- { type: DateAdapter },
365
- { type: TranslateService },
366
- { type: FormBuilder },
367
- { type: Keyboard },
368
- { type: ChangeDetectorRef },
369
- { type: FormGroupDirective, decorators: [{ type: Optional }] }
370
- ];
371
- MatDateTime.propDecorators = {
372
- formControl: [{ type: Input }],
373
- formControlName: [{ type: Input }],
374
- placeholder: [{ type: Input }],
375
- floatLabel: [{ type: Input }],
376
- required: [{ type: Input }],
377
- mobile: [{ type: Input }],
378
- compact: [{ type: Input }],
379
- placeholderChar: [{ type: Input }],
380
- autofocus: [{ type: Input }],
381
- startDate: [{ type: Input }],
382
- clearable: [{ type: Input }],
383
- readonly: [{ type: Input }],
384
- tabindex: [{ type: Input }],
385
- datePicker: [{ type: ViewChild, args: ['datePicker',] }],
386
- timePicker: [{ type: ViewChild, args: ['timePicker',] }],
387
- matInputs: [{ type: ViewChildren, args: ['matInput',] }]
388
- };
389
- export { ɵ0 };
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9kYXRldGltZS9tYXRlcmlhbC5kYXRldGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUdULFVBQVUsRUFDVixLQUFLLEVBR0wsUUFBUSxFQUVSLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRCxPQUFPLEVBRUwsV0FBVyxFQUVYLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLFFBQVEsRUFBUyxNQUFNLFFBQVEsQ0FBQztBQUN4QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQWUsV0FBVyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxLQUFLLEVBQUUs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YSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVTLFdBQVcsQ0FBQyxJQUFVO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFUyxZQUFZO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7O1lBbmJGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQiw2b1FBQXVDO2dCQUV2QyxTQUFTLEVBQUU7b0JBQ1Qsc0JBQXNCO2lCQUN2QjtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQXJETyxRQUFRO1lBQ1IsV0FBVztZQVVYLGdCQUFnQjtZQU50QixXQUFXO1lBVUwsUUFBUTtZQTVCZCxpQkFBaUI7WUFvQmpCLGtCQUFrQix1QkFpSGYsUUFBUTs7OzBCQWhEVixLQUFLOzhCQUNMLEtBQUs7MEJBQ0wsS0FBSzt5QkFDTCxLQUFLO3VCQUNMLEtBQUs7cUJBQ0wsS0FBSztzQkFDTCxLQUFLOzhCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7dUJBRUwsS0FBSzt1QkFTTCxLQUFLO3lCQWVMLFNBQVMsU0FBQyxZQUFZO3lCQUN0QixTQUFTLFNBQUMsWUFBWTt3QkFFdEIsWUFBWSxTQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLCBQcm92aWRlcixcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UGxhdGZvcm19IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7RGF0ZUFkYXB0ZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtGbG9hdExhYmVsVHlwZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge2lzTW9tZW50LCBNb21lbnR9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0RFRkFVTFRfUExBQ0VIT0xERVJfQ0hBUiwgS0VZQk9BUkRfSElERV9ERUxBWV9NU30gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7U2hhcmVkVmFsaWRhdG9yc30gZnJvbSAnLi4vLi4vdmFsaWRhdG9yL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtLZXlib2FyZH0gZnJvbSAnQGlvbmljLW5hdGl2ZS9rZXlib2FyZC9uZ3gnO1xuaW1wb3J0IHtmaWx0ZXIsIGZpcnN0fSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0lucHV0RWxlbWVudCwgc2V0VGFiSW5kZXh9IGZyb20gJy4uLy4uL2lucHV0cyc7XG5pbXBvcnQge2lzRm9jdXNhYmxlRWxlbWVudH0gZnJvbSAnLi4vLi4vZm9jdXNhYmxlJztcbmltcG9ydCB7bWVyZ2UsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge01hdERhdGVwaWNrZXIsIE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7aXNOaWwsIGlzTmlsT3JCbGFuaywgc2xlZXAsIHRvQm9vbGVhbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7ZnJvbURhdGVJU09TdHJpbmcsIHRvRGF0ZUlTT1N0cmluZ30gZnJvbSAnLi4vLi4vZGF0ZXMnO1xuXG5jb25zdCBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdERhdGVUaW1lKSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbmNvbnN0IERBWV9NQVNLID0gWy9cXGQvLCAvXFxkLywgJy8nLCAvXFxkLywgL1xcZC8sICcvJywgL1xcZC8sIC9cXGQvLCAvXFxkLywgL1xcZC9dO1xuXG5jb25zdCBIT1VSX1JFR0VYUCA9IC9eWzAxMl1bMC05XVs6XVswMTIzNDVdWzAtOV0kLztcbmNvbnN0IEhPVVJfTUFTSyA9IFsvWzAxMl0vLCAvXFxkLywgJzonLCAvWzAxMjM0NV0vLCAvXFxkL107XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7XG59O1xuXG5kZWNsYXJlIGludGVyZmFjZSBOZ3hUaW1lUGlja2VyIHtcbiAgc2VsZWN0ZWRIb3VyOiB7IHRpbWU6IG51bWJlciB9O1xuICBzZWxlY3RlZE1pbnV0ZTogeyB0aW1lOiBudW1iZXIgfTtcbiAgb3BlbigpO1xuICBjbG9zZSgpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtZGF0ZS10aW1lLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmRhdGV0aW1lLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5kYXRldGltZS5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIERFRkFVTFRfVkFMVUVfQUNDRVNTT1IsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGVUaW1lIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBJbnB1dEVsZW1lbnQge1xuICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByb3RlY3RlZCB3cml0aW5nID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGRpc2FibGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX3RhYmluZGV4OiBudW1iZXI7XG4gIHByb3RlY3RlZCB3YWl0SGlkZUtleWJvYXJkRGVsYXk6IG51bWJlcjtcblxuICBfcmVhZG9ubHkgPSBmYWxzZTtcbiAgZGF0ZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcbiAgdGltZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcbiAgZGlzcGxheVBhdHRlcm46IHN0cmluZztcbiAgZGF5UGF0dGVybjogc3RyaW5nO1xuICBsb2NhbGU6IHN0cmluZztcbiAgcmVhZG9ubHkgZGF5TWFzayA9IERBWV9NQVNLO1xuICByZWFkb25seSBob3VyTWFzayA9IEhPVVJfTUFTSztcblxuICBASW5wdXQoKSBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgY29tcGFjdCA9IGZhbHNlO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlckNoYXI6IHN0cmluZyA9IERFRkFVTFRfUExBQ0VIT0xERVJfQ0hBUjtcbiAgQElucHV0KCkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN0YXJ0RGF0ZTogTW9tZW50IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbil7XG4gICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0YWJpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3RhYmluZGV4ICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFiaW5kZXggPSB2YWx1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVUYWJJbmRleCgpKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdGFiaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiaW5kZXg7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2RhdGVQaWNrZXInKSBkYXRlUGlja2VyOiBNYXREYXRlcGlja2VyPE1vbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RpbWVQaWNrZXInKSB0aW1lUGlja2VyOiBOZ3hUaW1lUGlja2VyO1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ21hdElucHV0JykgbWF0SW5wdXRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8TW9tZW50PixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGtleWJvYXJkOiBLZXlib2FyZCxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICApIHtcbiAgICB0aGlzLmxvY2FsZSA9ICh0cmFuc2xhdGUuY3VycmVudExhbmcgfHwgdHJhbnNsYXRlLmRlZmF1bHRMYW5nKS5zdWJzdHIoMCwgMik7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIHRoaXMubW9iaWxlID0gaXNOaWwodGhpcy5tb2JpbGUpID8gdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJykgOiB0aGlzLm1vYmlsZTtcbiAgICB0aGlzLndhaXRIaWRlS2V5Ym9hcmREZWxheSA9IHRoaXMubW9iaWxlICYmIEtFWUJPQVJEX0hJREVfREVMQVlfTVMgfHwgMDtcblxuICAgIHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sIHx8IHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmIHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0uZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlIFxcJ2Zvcm1Db250cm9sXFwnIG9yIFxcJ2Zvcm1Db250cm9sTmFtZVxcJyBpbiA8bWF0LWRhdGUtdGltZS1maWVsZD4uJyk7XG5cbiAgICB0aGlzLnJlcXVpcmVkID0gdG9Cb29sZWFuKHRoaXMucmVxdWlyZWQsIHRoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yID09PSBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcblxuICAgIC8vIEFkZCAndmFsaWREYXRlJyB2YWxpZGF0b3IgKHdoZW4gZXhpc3RpbmcgdmFsaWRhdG9yIGFyZSBudWxsIG9yIHJlcXVpcmVkLCB0byBiZSBzdXJlIHRvIGtlZXAgaXQpXG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciB8fCB0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZCkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMucmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVdIDogU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnJlcXVpcmVkID8gW3RoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZV0gOlxuICAgICAgICBbdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IsIFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlXSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBkYXRlIGNvbnRyb2xcbiAgICB0aGlzLmRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLFxuICAgICAgdGhpcy5yZXF1aXJlZCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBudWxsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgdGltZSBjb250cm9sXG4gICAgY29uc3QgdGltZVZhbGlkYXRvciA9IHRoaXMucmVxdWlyZWQgP1xuICAgICAgKHRoaXMubW9iaWxlID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKEhPVVJfUkVHRVhQKV0pKSA6XG4gICAgICAodGhpcy5tb2JpbGUgPyBudWxsIDogVmFsaWRhdG9ycy5wYXR0ZXJuKEhPVVJfUkVHRVhQKSk7XG4gICAgdGhpcy50aW1lRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgdGltZVZhbGlkYXRvcik7XG5cbiAgICAvLyBHZXQgcGF0dGVybnMgdG8gZGlzcGxheSBkYXRlIGFuZCBkYXRlK3RpbWVcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZS5nZXQoWydDT01NT04uREFURV9QQVRURVJOJywgJ0NPTU1PTi5EQVRFX1RJTUVfUEFUVEVSTiddKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocGF0dGVybnMpID0+IHRoaXMudXBkYXRlUGF0dGVybihwYXR0ZXJucykpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBtZXJnZShcbiAgICAgICAgdGhpcy5kYXRlRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLFxuICAgICAgICB0aGlzLnRpbWVGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHRoaXMub25Gb3JtQ2hhbmdlKGV2ZW50KSlcbiAgICApO1xuXG4gICAgLy8gTGlzdGVuIHN0YXR1cyBjaGFuZ2VzICh3aGVuIGRvbmUgb3V0c2lkZSB0aGUgY29tcG9uZW50ICAtIGUuZy4gd2hlbiBzZXRFcnJvcnMoKSBpcyBjYWxsaW5nIG9uIHRoZSBmb3JtQ29udHJvbClcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoXykgPT4gIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMud3JpdGluZyAmJiAhdGhpcy5kaXNhYmxpbmcpIC8vIFNraXBcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubWFya0ZvckNoZWNrKCkpXG4gICAgKTtcblxuICAgIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcblxuICAgIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlU3RyOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53cml0aW5nKSByZXR1cm47IC8vIFNraXBcbiAgICB0aGlzLndyaXRpbmcgPSB0cnVlO1xuXG4gICAgLy8gREVCVUdcbiAgICAvLyBjb25zb2xlLmRlYnVnKFwiW21hdC1kYXRlLXRpbWVdIHdyaXRlVmFsdWUoKSB3aXRoOlwiLCB2YWx1ZVN0cik7XG5cbiAgICBjb25zdCB2YWx1ZSA9IGZyb21EYXRlSVNPU3RyaW5nKHZhbHVlU3RyKTtcblxuICAgIGlmICghdmFsdWUgfHwgIXZhbHVlLmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy5kYXRlRm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy50aW1lRm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIFBhcnNlIGRheVxuICAgICAgY29uc3QgZGF5ID0gdmFsdWUuY2xvbmUoKS5zdGFydE9mKCdkYXknKTtcbiAgICAgIGNvbnN0IGRheVN0ciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KGRheSwgdGhpcy5kYXlQYXR0ZXJuKTtcblxuICAgICAgLy8gUGFyc2UgdGltZVxuICAgICAgLy8gLSBGb3JtYXQgaGhcbiAgICAgIGxldCBob3VyOiBudW1iZXIgfCBzdHJpbmcgPSB2YWx1ZS5ob3VyKCk7XG4gICAgICBob3VyID0gaG91ciA8IDEwID8gKCcwJyArIGhvdXIpIDogaG91cjtcbiAgICAgIC8vIC0gRm9ybWF0IG1tXG4gICAgICBsZXQgbWludXRlczogbnVtYmVyIHwgc3RyaW5nID0gdmFsdWUubWludXRlcygpO1xuICAgICAgbWludXRlcyA9IG1pbnV0ZXMgPCAxMCA/ICgnMCcgKyBtaW51dGVzKSA6IG1pbnV0ZXM7XG4gICAgICBjb25zdCB0aW1lU3RyID0gYCR7aG91cn06JHttaW51dGVzfWA7XG5cbiAgICAgIC8vIFVwZGF0ZSBjb250cm9sc1xuICAgICAgdGhpcy5kYXRlRm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShkYXlTdHIsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLnRpbWVGb3JtQ29udHJvbC5wYXRjaFZhbHVlKHRpbWVTdHIsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgdGhpcy53cml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Gb3JtQ2hhbmdlKGV2ZW50PzogYW55KSB7XG4gICAgaWYgKHRoaXMud3JpdGluZykgcmV0dXJuOyAvLyBTa2lwIGlmIGNhbGwgYnkgc2VsZlxuICAgIHRoaXMud3JpdGluZyA9IHRydWU7XG5cbiAgICBsZXQgZGF5U3RyID0gdGhpcy5kYXRlRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgY29uc3QgdGltZSA9IHRoaXMudGltZUZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcoYFttYXQtZGF0ZS10aW1lXSBvbkZvcm1DaGFuZ2UoKSBmcm9tIGV2ZW50OiAke2V2ZW50fSAtIGNvbnRyb2xzIHZhbHVlczogYCwgW2RheVN0ciwgdGltZV0pO1xuXG4gICAgY29uc3QgaW5jb21wbGV0ZVZhbHVlID0gaXNOaWxPckJsYW5rKHRpbWUpICE9PSBpc05pbE9yQmxhbmsoZGF5U3RyKTtcbiAgICBpZiAoaW5jb21wbGV0ZVZhbHVlIHx8IHRoaXMuZGF0ZUZvcm1Db250cm9sLmludmFsaWQgfHzCoHRoaXMudGltZUZvcm1Db250cm9sLmludmFsaWQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzUGVuZGluZyh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgICAgdmFsaWREYXRlOiBpbmNvbXBsZXRlVmFsdWUsXG4gICAgICAgIC4uLnRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzLFxuICAgICAgICAuLi50aGlzLmRhdGVGb3JtQ29udHJvbC5lcnJvcnMsXG4gICAgICAgIC4uLnRoaXMudGltZUZvcm1Db250cm9sLmVycm9yc1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAvLyBSZXNldCB0aGUgdmFsdWVcbiAgICAgIC8vdGhpcy5lbWl0Q2hhbmdlKG51bGwpO1xuICAgICAgdGhpcy53cml0aW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICAvLyBNYWtlIHRvIHJlbW92ZSBwbGFjZWhvbGRlciBjaGFyc1xuICAgIHdoaWxlIChkYXlTdHIgJiYgZGF5U3RyLmluZGV4T2YodGhpcy5wbGFjZWhvbGRlckNoYXIpICE9PSAtMSkge1xuICAgICAgZGF5U3RyID0gZGF5U3RyLnJlcGxhY2UodGhpcy5wbGFjZWhvbGRlckNoYXIsICcnKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBkYXlcbiAgICBjb25zdCBkYXk6IE1vbWVudCA9IGRheVN0ciAmJiB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGRheVN0ciwgdGhpcy5kYXlQYXR0ZXJuKSB8fCBudWxsO1xuXG4gICAgLy8gUGFyc2UgdGltZVxuICAgIGNvbnN0IGhvdXJQYXJ0cyA9ICh0aW1lIHx8ICcnKS5zcGxpdCgnOicpO1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChob3VyUGFydHNbMF0gfHwgMCk7XG4gICAgY29uc3QgbWludXRlcyA9IHBhcnNlSW50KGhvdXJQYXJ0c1sxXSB8fCAwKTtcbiAgICBjb25zdCBkYXRlVGltZSA9IGRheSAmJiBkYXlcbiAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUpIC8vIHNldCBhcyB0aW1lIGFzIGxvY2FsZSB0aW1lXG4gICAgICAuaG91cihob3VyKS5taW51dGUobWludXRlcykvLyBTZXQgbG9jYWwgaG91clxuICAgICAgLnNlY29uZHMoMCkubWlsbGlzZWNvbmQoMCkgLy8gUmVzZXQgc2Vjb25kcy9taWxsaXNlY29uZFxuICAgICAgLnV0YygpOyAvLyBDb252ZXJ0IHRvIFVUQyAoYXZvaWQgVFogb2Zmc2V0IGluIGZpbmFsIHN0cmluZylcblxuICAgIC8vIFNldCBtb2RlbCB2YWx1ZVxuICAgIHRoaXMuZW1pdENoYW5nZShkYXRlVGltZSk7XG4gICAgdGhpcy53cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGluZykgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICB0aGlzLmRpc2FibGluZyA9IHRydWU7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGF0ZUZvcm1Db250cm9sLmRpc2FibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgIHRoaXMudGltZUZvcm1Db250cm9sLmRpc2FibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRlRm9ybUNvbnRyb2wuZW5hYmxlKHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLnRpbWVGb3JtQ29udHJvbC5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgdGhpcy5kaXNhYmxpbmcgPSBmYWxzZTtcblxuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhdHRlcm4ocGF0dGVybnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgdGhpcy5kaXNwbGF5UGF0dGVybiA9IChwYXR0ZXJuc1snQ09NTU9OLkRBVEVfVElNRV9QQVRURVJOJ10gIT09ICdDT01NT04uREFURV9USU1FX1BBVFRFUk4nID8gcGF0dGVybnNbJ0NPTU1PTi5EQVRFX1RJTUVfUEFUVEVSTiddIDogJ0wgTFQnKTtcbiAgICB0aGlzLmRheVBhdHRlcm4gPSAocGF0dGVybnNbJ0NPTU1PTi5EQVRFX1BBVFRFUk4nXSAhPT0gJ0NPTU1PTi5EQVRFX1BBVFRFUk4nID8gcGF0dGVybnNbJ0NPTU1PTi5EQVRFX1BBVFRFUk4nXSA6ICdMJyk7XG4gIH1cblxuICBvbkRhdGVQaWNrZXJDaGFuZ2UoZXZlbnQ6IE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50PE1vbWVudD4pOiB2b2lkIHtcbiAgICAvLyBNYWtlIHN1cmUgZXZlbnQgaXMgdmFsaWRcbiAgICBpZiAoIWV2ZW50IHx8IChldmVudC52YWx1ZSAhPT0gbnVsbCAmJiAhaXNNb21lbnQoZXZlbnQudmFsdWUpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIE1hdERhdGVwaWNrZXIgZXZlbnQuIFNraXBwaW5nJywgZXZlbnQpO1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgLy8gQ29udmVydCB0byB1c2FibGUgZGF0ZSwgdGhlbiBjb252ZXJ0IHRvIGRheSBwYXR0ZXJuIChlLmcgREQvTU0vWVlZWSlcbiAgICBjb25zdCBkYXkgPSBldmVudC52YWx1ZSAmJiBldmVudC52YWx1ZVxuICAgICAgLmxvY2FsZSh0aGlzLmxvY2FsZSkgLy8gc2V0IGFzIHRpbWUgYXMgbG9jYWxlIHRpbWVcbiAgICAgIC5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmRzKDApLm1pbGxpc2Vjb25kKDApIC8vIFJlc2V0IGhvdXJcbiAgICAgIC51dGModHJ1ZSk7XG4gICAgY29uc3QgZGF5U3RyID0gZGF5ICYmIHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KGRheSwgdGhpcy5kYXlQYXR0ZXJuKSB8fMKgbnVsbDtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF5IGNvbnRyb2xcbiAgICBpZiAodGhpcy5kYXRlRm9ybUNvbnRyb2wudmFsdWUgIT09IGRheVN0cikge1xuXG4gICAgICAvLyBERUJVR1xuICAgICAgLy8gY29uc29sZS5kZWJ1ZyhcIlttYXQtZGF0ZS10aW1lXSBvbkRhdGVQaWNrZXJDaGFuZ2UoKSBuZXcgdmFsdWU6XCIsIGRheVN0cik7XG5cbiAgICAgIHRoaXMuZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKGRheVN0ciwge1xuICAgICAgICBlbWl0RXZlbnQ6IHRydWUgLy8gV2lsbCBjYWxsIG9uRm9ybUNoYW5nZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICBvblRpbWVQaWNrZXJDaGFuZ2UodGltZVN0cjogc3RyaW5nKSB7XG4gICAgLy8gVXBkYXRlIHRoZSB0aW1lIGNvbnRyb2wsIGlmIG5lZWRcbiAgICBpZiAodGhpcy50aW1lRm9ybUNvbnRyb2wudmFsdWUgIT09IHRpbWVTdHIpIHtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vIGNvbnNvbGUuZGVidWcoXCJbbWF0LWRhdGUtdGltZV0gb25UaW1lUGlja2VyQ2hhbmdlKCkgbmV3IHZhbHVlOlwiLCB0aW1lU3RyKTtcblxuICAgICAgdGhpcy50aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUodGltZVN0ciwge1xuICAgICAgICBlbWl0RXZlbnQ6IHRydWUgLy8gV2lsbCBjYWxsIG9uRm9ybUNoYW5nZVxuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICBhc3luYyBvcGVuRGF0ZVBpY2tlcklmTW9iaWxlKGV2ZW50OiBVSUV2ZW50LCBkYXRlUGlja2VyPzogTWF0RGF0ZXBpY2tlcjxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLm1vYmlsZSB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICB0aGlzLnByZXZlbnRFdmVudChldmVudCk7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGtleWJvYXJkIGlzIGNsb3NlZFxuICAgIGF3YWl0IHRoaXMuaGlkZUtleWJvYXJkKGZhbHNlKTtcblxuICAgIC8vIE9wZW4gdGhlIHBpY2tlclxuICAgIHRoaXMub3BlbkRhdGVQaWNrZXIobnVsbCwgZGF0ZVBpY2tlcik7XG4gIH1cblxuICBwdWJsaWMgb3BlbkRhdGVQaWNrZXIoZXZlbnQ/OiBVSUV2ZW50LCBkYXRlUGlja2VyPzogTWF0RGF0ZXBpY2tlcjxhbnk+KSB7XG4gICAgZGF0ZVBpY2tlciA9IGRhdGVQaWNrZXIgfHwgdGhpcy5kYXRlUGlja2VyO1xuICAgIGlmIChkYXRlUGlja2VyKSB7XG5cbiAgICAgIGlmIChldmVudCkgdGhpcy5wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWRhdGVQaWNrZXIub3BlbmVkKSB7XG4gICAgICAgIGRhdGVQaWNrZXIub3BlbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9wZW5UaW1lUGlja2VySWZNb2JpbGUoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMubW9iaWxlIHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIHRoaXMucHJldmVudEV2ZW50KGV2ZW50KTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGUga2V5Ym9hcmQgaXMgY2xvc2VkXG4gICAgYXdhaXQgdGhpcy5oaWRlS2V5Ym9hcmQodHJ1ZSk7XG5cbiAgICAvLyBPcGVuIHRoZSBwaWNrZXJcbiAgICB0aGlzLm9wZW5UaW1lUGlja2VyKG51bGwpO1xuICB9XG5cbiAgb3BlblRpbWVQaWNrZXIoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMudGltZVBpY2tlcikgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICB0aGlzLnByZXZlbnRFdmVudChldmVudCk7XG5cbiAgICB0aGlzLnRpbWVQaWNrZXIub3BlbigpO1xuICB9XG5cbiAgcHJldmVudEV2ZW50KGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgaWYgKCFldmVudCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIGNoZWNrSWZUb3VjaGVkKCkge1xuICAgIGlmICh0aGlzLmRhdGVGb3JtQ29udHJvbC50b3VjaGVkIHx8IHRoaXMudGltZUZvcm1Db250cm9sLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIGlmICghdGhpcy5tYXRJbnB1dHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRSZWYgPSB0aGlzLm1hdElucHV0c1swXTsgLy8gZ2V0IHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICBpZiAoaXNGb2N1c2FibGVFbGVtZW50KGVsZW1lbnRSZWYpKSB7XG4gICAgICAgIGVsZW1lbnRSZWYuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAtLSAqL1xuXG4gIHByb3RlY3RlZCBlbWl0Q2hhbmdlKHZhbHVlOiBNb21lbnQpIHtcblxuICAgIC8vIEdldCB0aGUgbW9kZWwgdmFsdWVcbiAgICBjb25zdCBkYXRlU3RyID0gdG9EYXRlSVNPU3RyaW5nKHZhbHVlKSB8fCBudWxsO1xuXG5cbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWx1ZSAhPT0gZGF0ZVN0cikge1xuXG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0w6hkYXRlLXRpbWVdIEVtaXQgbmV3IHZhbHVlOiAnICsgZGF0ZVN0cik7XG5cbiAgICAgIC8vIENoYW5nZXMgY29tZXMgZnJvbSBpbnNpZGUgZnVuY3Rpb246IHVzZSB0aGUgY2FsbGJhY2tcbiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soZGF0ZVN0cik7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5lZWQgdG8gdXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLmNoZWNrSWZUb3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhpZGVLZXlib2FyZCh3YWl0SXNIaWRkZW46IGJvb2xlYW4pIHtcblxuICAgIGlmICghdGhpcy5rZXlib2FyZC5pc1Zpc2libGUpIHJldHVybjsgLy8gb2ssIGFscmVhZHkgaGlkZGVuXG5cbiAgICAvLyBGb3JjZSBrZXlib2FyZCB0byBiZSBoaWRlXG4gICAgdGhpcy5rZXlib2FyZC5oaWRlKCk7XG5cbiAgICAvLyBXYWl0IGhpZGUgb2NjdXJcbiAgICBhd2FpdCB0aGlzLmtleWJvYXJkLm9uS2V5Ym9hcmRIaWRlKCkucGlwZShmaXJzdCgpKS50b1Byb21pc2UoKTtcblxuICAgIC8vIFdhaXQgYW4gYWRkaXRpb25hbCBkZWxheSBpZiBuZWVkIChkZXBlbmRpbmcgb24gdGhlIE9TKVxuICAgIGlmICh0aGlzLndhaXRIaWRlS2V5Ym9hcmREZWxheSA+IDAgJiYgd2FpdElzSGlkZGVuKSB7XG4gICAgICBhd2FpdCBzbGVlcCh0aGlzLndhaXRIaWRlS2V5Ym9hcmREZWxheSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVRhYkluZGV4KCkge1xuICAgIGlmIChpc05pbCh0aGlzLl90YWJpbmRleCkgfHwgdGhpcy5fdGFiaW5kZXggPT09IC0xKSByZXR1cm47IC8vIHNraXBcblxuICAgIC8vIEZvY3VzIHRvIGZpcnN0IGlucHV0XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1hdElucHV0cy5mb3JFYWNoKChlbGVtZW50UmVmLCBpbmRleCkgPT4ge1xuICAgICAgICBzZXRUYWJJbmRleChlbGVtZW50UmVmLCB0aGlzLl90YWJpbmRleCArIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNUb3VjaGVkKCkge1xuICAgIHRoaXMuZGF0ZUZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLnRpbWVGb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtBc0RpcnR5KG9wdHM/OiBhbnkpIHtcbiAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbn1cblxuIl19
@@ -1,102 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { ChangeDetectorRef, Component } from '@angular/core';
3
- import { FormBuilder, Validators } from '@angular/forms';
4
- import { Platform } from '@ionic/angular';
5
- import { debounceTime } from 'rxjs/operators';
6
- import { SharedFormGroupValidators } from '../../../validator/validators';
7
- import { AppFormUtils } from '../../../../core/form/form.utils';
8
- import { toDateISOString } from '../../../dates';
9
- import * as momentImported from 'moment';
10
- const moment = momentImported;
11
- export class DateTimeTestPage {
12
- constructor(platform, formBuilder, cd) {
13
- this.platform = platform;
14
- this.formBuilder = formBuilder;
15
- this.cd = cd;
16
- this.showLogPanel = true;
17
- this.logContent = '';
18
- this.memoryHide = false;
19
- this.memoryMobile = true;
20
- this.stringify = JSON.stringify;
21
- this.form = formBuilder.group({
22
- empty: [null, Validators.required],
23
- enable: [null, Validators.required],
24
- disable: [null, Validators.required],
25
- readonly: [null]
26
- }, {
27
- validators: SharedFormGroupValidators.dateRange('empty', 'enable')
28
- });
29
- const disableControl = this.form.get('disable');
30
- disableControl.disable();
31
- // Copy the 'enable' value, into the disable control
32
- this.form.get('enable').valueChanges.subscribe(value => disableControl.setValue(value));
33
- const mobile = platform.is('mobile');
34
- this.showLogPanel = this.showLogPanel || mobile;
35
- }
36
- ngOnInit() {
37
- setTimeout(() => this.loadData(), 250);
38
- }
39
- // Load the form with data
40
- loadData() {
41
- return __awaiter(this, void 0, void 0, function* () {
42
- const now = moment();
43
- const data = {
44
- empty: toDateISOString(now.clone().add(2, 'hours')),
45
- enable: toDateISOString(now),
46
- disable: now,
47
- readonly: now
48
- };
49
- this.form.setValue(data);
50
- this.log('[test-page] Data loaded: ' + JSON.stringify(data));
51
- this.form.get('empty').valueChanges
52
- .pipe(debounceTime(300))
53
- .subscribe(value => this.log('[test-page] Value n°1: ' + JSON.stringify(value)));
54
- this.form.get('enable').valueChanges
55
- .pipe(debounceTime(300))
56
- .subscribe(value => this.log('[test-page] Value n°2: ' + JSON.stringify(value)));
57
- });
58
- }
59
- doSubmit(event) {
60
- this.form.markAllAsTouched();
61
- this.log('[test-page] Form content: ' + JSON.stringify(this.form.value));
62
- this.log('[test-page] Form status: ' + this.form.status);
63
- if (this.form.invalid) {
64
- this.log('[test-page] Form errors: ' + JSON.stringify(this.form.errors));
65
- // DEBUG
66
- AppFormUtils.logFormErrors(this.form);
67
- }
68
- }
69
- log(message) {
70
- console.debug(message);
71
- if (this.showLogPanel) {
72
- this.logContent += message + '<br/>';
73
- this.cd.markForCheck();
74
- }
75
- }
76
- clearLogPanel() {
77
- this.logContent = '';
78
- this.cd.markForCheck();
79
- }
80
- startMemoryTimer() {
81
- this.memoryTimer = setInterval(() => {
82
- this.memoryHide = !this.memoryHide;
83
- }, 50);
84
- }
85
- stopMemoryTimer() {
86
- clearInterval(this.memoryTimer);
87
- this.memoryTimer = null;
88
- this.memoryHide = false;
89
- }
90
- }
91
- DateTimeTestPage.decorators = [
92
- { type: Component, args: [{
93
- selector: 'app-data-time-test',
94
- template: "<ion-header>\n <ion-toolbar color=\"primary\">\n\n <ion-buttons slot=\"start\">\n <ion-back-button></ion-back-button>\n </ion-buttons>\n\n <ion-title>Date/Time field test page</ion-title>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n\n <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n\n <ion-grid>\n\n <!-- debugging memory leak -->\n <ion-row><ion-col><ion-text><h4>Debug memory leak</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col size=\"2\">\n <ion-button *ngIf=\"!memoryTimer\" (click)=\"startMemoryTimer()\">Start timer</ion-button>\n <ion-button *ngIf=\"memoryTimer\" (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n </ion-col>\n <ion-col size=\"2\">\n <mat-form-field floatLabel=\"never\">\n <input matInput type=\"text\" hidden>\n <mat-checkbox (change)=\"memoryMobile=$event.checked\" [value]=\"memoryMobile\">\n Mobile ?\n </mat-checkbox>\n </mat-form-field>\n </ion-col>\n <ion-col>\n <mat-date-time-field formControlName=\"empty\"\n *ngIf=\"!memoryHide\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"memoryMobile\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-time-field>\n </ion-col>\n </ion-row>\n\n <!-- Mobile mode -->\n <ion-row><ion-col><ion-text><h4>Mobile mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field formControlName=\"empty\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field formControlName=\"enable\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"true\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field formControlName=\"disable\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-time-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n <!-- debug console -->\n <ion-row>\n <!-- buttons -->\n <ion-col size=\"2\">\n <!-- submit form -->\n <ion-button (click)=\"doSubmit($event)\"\n fill=\"outline\">\n <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n\n <!-- clear log -->\n <ion-button (click)=\"clearLogPanel()\"\n fill=\"outline\">\n <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col size=\"10\" *ngIf=\"showLogPanel\">\n <ion-text color=\"primary\">Log:<br/></ion-text>\n <div class=\"ion-padding-start\">\n <ion-text color=\"medium\">\n <small [innerHTML]=\"logContent\"></small>\n </ion-text>\n </div>\n </ion-col>\n </ion-row>\n\n <!-- Desktop mode -->\n <ion-row><ion-col><ion-text><h4>Desktop mode</h4></ion-text></ion-col></ion-row>\n <ion-row>\n <ion-col>\n\n <!-- Empty value -->\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Empty value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.empty.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field formControlName=\"empty\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Enable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n With value\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.enable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field formControlName=\"enable\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Disable -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Disable\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.disable.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-date-time-field formControlName=\"disable\"\n placeholder=\"Date/Time\"\n [required]=\"true\"\n [mobile]=\"false\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-time-field>\n\n </ion-card-content>\n </ion-card>\n </ion-col>\n\n <!-- Readonly -->\n <ion-col>\n <ion-card>\n <ion-card-header>\n <ion-card-title>\n <ion-label color=\"primary\">\n Readonly toggle\n </ion-label>\n </ion-card-title>\n <ion-card-subtitle>\n <ion-text color=\"medium\">\n <small><pre>{{stringify(form.controls.readonly.value)}}</pre></small>\n </ion-text>\n </ion-card-subtitle>\n </ion-card-header>\n <ion-card-content>\n <mat-checkbox (change)=\"readonlyField.readonly=$event.checked\" [checked]=\"readonlyField.readonly\">\n </mat-checkbox>\n\n <mat-date-time-field #readonlyField formControlName=\"readonly\"\n placeholder=\"Date/Time\"\n [readonly]=\"true\"\n [mobile]=\"false\"\n [clearable]=\"true\">\n <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n </mat-date-time-field>\n </ion-card-content>\n </ion-card>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n</ion-content>\n"
95
- },] }
96
- ];
97
- DateTimeTestPage.ctorParameters = () => [
98
- { type: Platform },
99
- { type: FormBuilder },
100
- { type: ChangeDetectorRef }
101
- ];
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWRhdGUtdGltZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvZGF0ZXRpbWUvdGVzdGluZy9tYXQtZGF0ZS10aW1lLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBMEIsaUJBQWlCLEVBQUUsU0FBUyxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQzVGLE9BQU8sRUFBQyxXQUFXLEVBQWEsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxjQUFjLE1BQU0sUUFBUSxDQUFDO0FBR3pDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQztBQU05QixNQUFNLE9BQU8sZ0JBQWdCO0lBWTNCLFlBQ1ksUUFBa0IsRUFDbEIsV0FBd0IsRUFDeEIsRUFBcUI7UUFGckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQVpqQyxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFrR3BCLGNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBeEZ6QixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxL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IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7U2hhcmVkRm9ybUdyb3VwVmFsaWRhdG9yc30gZnJvbSAnLi4vLi4vLi4vdmFsaWRhdG9yL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtBcHBGb3JtVXRpbHN9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvZm9ybS9mb3JtLnV0aWxzJztcbmltcG9ydCB7dG9EYXRlSVNPU3RyaW5nfSBmcm9tICcuLi8uLi8uLi9kYXRlcyc7XG5pbXBvcnQgKiBhcyBtb21lbnRJbXBvcnRlZCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IFRpbWVyID0gTm9kZUpTLlRpbWVyO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnRJbXBvcnRlZDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRhdGEtdGltZS10ZXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdC1kYXRlLXRpbWUudGVzdC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXRlVGltZVRlc3RQYWdlIGltcGxlbWVudHMgT25Jbml0IHtcblxuXG4gIHNob3dMb2dQYW5lbCA9IHRydWU7XG4gIGxvZ0NvbnRlbnQgPSAnJztcblxuICBtZW1vcnlIaWRlID0gZmFsc2U7XG4gIG1lbW9yeU1vYmlsZSA9IHRydWU7XG4gIG1lbW9yeVRpbWVyOiBUaW1lcjtcblxuICBmb3JtOiBGb3JtR3JvdXA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5mb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgZW1wdHk6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGVuYWJsZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZGlzYWJsZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgcmVhZG9ubHk6IFtudWxsXVxuICAgIH0sIHtcbiAgICAgIHZhbGlkYXRvcnM6IFNoYXJlZEZvcm1Hcm91cFZhbGlkYXRvcnMuZGF0ZVJhbmdlKCdlbXB0eScsICdlbmFibGUnKVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGlzYWJsZUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KCdkaXNhYmxlJyk7XG4gICAgZGlzYWJsZUNvbnRyb2wuZGlzYWJsZSgpO1xuXG4gICAgLy8gQ29weSB0aGUgJ2VuYWJsZScgdmFsdWUsIGludG8gdGhlIGRpc2FibGUgY29udHJvbFxuICAgIHRoaXMuZm9ybS5nZXQoJ2VuYWJsZScpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4gZGlzYWJsZUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpKTtcblxuICAgIGNvbnN0IG1vYmlsZSA9IHBsYXRmb3JtLmlzKCdtb2JpbGUnKTtcbiAgICB0aGlzLnNob3dMb2dQYW5lbCA9IHRoaXMuc2hvd0xvZ1BhbmVsIHx8wqBtb2JpbGU7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWREYXRhKCksIDI1MCk7XG5cblxuICB9XG5cbiAgLy8gTG9hZCB0aGUgZm9ybSB3aXRoIGRhdGFcbiAgYXN5bmMgbG9hZERhdGEoKSB7XG4gICAgY29uc3Qgbm93ID0gbW9tZW50KCk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGVtcHR5OiB0b0RhdGVJU09TdHJpbmcobm93LmNsb25lKCkuYWRkKDIsICdob3VycycpKSxcbiAgICAgIGVuYWJsZTogdG9EYXRlSVNPU3RyaW5nKG5vdyksXG4gICAgICBkaXNhYmxlOiBub3csXG4gICAgICByZWFkb25seTogbm93XG4gICAgfTtcblxuICAgIHRoaXMuZm9ybS5zZXRWYWx1ZShkYXRhKTtcblxuICAgIHRoaXMubG9nKCdbdGVzdC1wYWdlXSBEYXRhIGxvYWRlZDogJyArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuICAgIHRoaXMuZm9ybS5nZXQoJ2VtcHR5JykudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoMzAwKSlcbiAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy5sb2coJ1t0ZXN0LXBhZ2VdIFZhbHVlIG7CsDE6ICcgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpKTtcblxuICAgIHRoaXMuZm9ybS5nZXQoJ2VuYWJsZScpLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXG4gICAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMubG9nKCdbdGVzdC1wYWdlXSBWYWx1ZSBuwrAyOiAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpKSk7XG4gIH1cblxuICBkb1N1Ym1pdChldmVudCkge1xuICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5sb2coJ1t0ZXN0LXBhZ2VdIEZvcm0gY29udGVudDogJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybS52YWx1ZSkpO1xuICAgIHRoaXMubG9nKCdbdGVzdC1wYWdlXSBGb3JtIHN0YXR1czogJyArIHRoaXMuZm9ybS5zdGF0dXMpO1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgdGhpcy5sb2coJ1t0ZXN0LXBhZ2VdIEZvcm0gZXJyb3JzOiAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5mb3JtLmVycm9ycykpO1xuXG4gICAgICAvLyBERUJVR1xuICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnModGhpcy5mb3JtKTtcbiAgICB9XG4gIH1cblxuICBsb2cobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlKTtcblxuICAgIGlmICh0aGlzLnNob3dMb2dQYW5lbCkge1xuICAgICAgdGhpcy5sb2dDb250ZW50ICs9IG1lc3NhZ2UgKyAnPGJyLz4nO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckxvZ1BhbmVsKCkge1xuICAgIHRoaXMubG9nQ29udGVudCA9ICcnO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzdGFydE1lbW9yeVRpbWVyKCkge1xuICAgIHRoaXMubWVtb3J5VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLm1lbW9yeUhpZGUgPSAhdGhpcy5tZW1vcnlIaWRlO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIHN0b3BNZW1vcnlUaW1lcigpIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMubWVtb3J5VGltZXIpO1xuICAgIHRoaXMubWVtb3J5VGltZXIgPSBudWxsO1xuICAgIHRoaXMubWVtb3J5SGlkZSA9IGZhbHNlO1xuICB9XG5cbiAgc3RyaW5naWZ5ID0gSlNPTi5zdHJpbmdpZnk7XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuXG59XG5cbiJdfQ==