@sumaris-net/ngx-components 2.6.4-manfilt1 → 2.6.4-rc10

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 (1182) hide show
  1. package/esm2020/public_api.mjs +314 -0
  2. package/esm2020/src/app/admin/admin-routing.module.mjs +41 -0
  3. package/esm2020/src/app/admin/admin.module.mjs +34 -0
  4. package/esm2020/src/app/admin/services/filter/person.filter.mjs +59 -0
  5. package/esm2020/src/app/admin/services/person.service.mjs +161 -0
  6. package/esm2020/src/app/admin/services/validator/person.validator.mjs +34 -0
  7. package/esm2020/src/app/admin/users/users.mjs +234 -0
  8. package/esm2020/src/app/admin/users/users.module.mjs +54 -0
  9. package/esm2020/src/app/core/about/about.modal.mjs +71 -0
  10. package/esm2020/src/app/core/about/about.module.mjs +34 -0
  11. package/esm2020/src/app/core/account/account.module.mjs +61 -0
  12. package/esm2020/src/app/core/account/account.page.mjs +316 -0
  13. package/esm2020/src/app/core/account/new-token.modal.mjs +115 -0
  14. package/esm2020/src/app/core/account/token.table.mjs +137 -0
  15. package/esm2020/src/app/core/auth/auth.form.mjs +131 -0
  16. package/esm2020/src/app/core/auth/auth.modal.mjs +72 -0
  17. package/esm2020/src/app/core/auth/auth.module.mjs +47 -0
  18. package/esm2020/src/app/core/core.module.mjs +184 -0
  19. package/esm2020/src/app/core/core.testing.module.mjs +86 -0
  20. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +71 -0
  21. package/esm2020/src/app/core/form/buttons/form-buttons-bar.module.mjs +35 -0
  22. package/esm2020/src/app/core/form/entity/editor.class.mjs +679 -0
  23. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +421 -0
  24. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +687 -0
  25. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +25 -0
  26. package/esm2020/src/app/core/form/entity/entity.module.mjs +38 -0
  27. package/esm2020/src/app/core/form/form.class.mjs +340 -0
  28. package/esm2020/src/app/core/form/form.module.mjs +66 -0
  29. package/esm2020/src/app/core/form/form.utils.mjs +473 -0
  30. package/esm2020/src/app/core/form/list/list.form.mjs +222 -0
  31. package/esm2020/src/app/core/form/list/list.module.mjs +35 -0
  32. package/esm2020/src/app/core/form/properties/properties.form.mjs +132 -0
  33. package/esm2020/src/app/core/form/properties/properties.module.mjs +43 -0
  34. package/esm2020/src/app/core/form/properties/properties.table.mjs +264 -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 +70 -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 +146 -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 +762 -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 +343 -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 +329 -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 +182 -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 +1212 -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 +444 -0
  67. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +219 -0
  68. package/esm2020/src/app/core/services/base58.mjs +78 -0
  69. package/esm2020/src/app/core/services/config/core.config.mjs +175 -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/esm2020/src/app/core/services/errors.mjs +50 -0
  73. package/esm2020/src/app/core/services/local-settings.service.mjs +449 -0
  74. package/esm2020/src/app/core/services/model/account.model.mjs +122 -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 +240 -0
  79. package/esm2020/src/app/core/services/model/filter.model.mjs +94 -0
  80. package/esm2020/src/app/core/services/model/history.model.mjs +2 -0
  81. package/esm2020/src/app/core/services/model/model.enum.mjs +11 -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 +164 -0
  85. package/esm2020/src/app/core/services/model/settings.model.mjs +3 -0
  86. package/esm2020/src/app/core/services/model/token.model.mjs +48 -0
  87. package/esm2020/src/app/core/services/network.service.mjs +589 -0
  88. package/esm2020/src/app/core/services/network.types.mjs +20 -0
  89. package/esm2020/src/app/core/services/network.utils.mjs +15 -0
  90. package/esm2020/src/app/core/services/pipes/account.pipes.mjs +38 -0
  91. package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
  92. package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
  93. package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
  94. package/esm2020/src/app/core/services/platform.service.mjs +525 -0
  95. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +428 -0
  96. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +449 -0
  97. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +23 -0
  98. package/esm2020/src/app/core/services/testing/referential.validator.mjs +45 -0
  99. package/esm2020/src/app/core/services/validator/account.validator.mjs +56 -0
  100. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +47 -0
  101. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +66 -0
  102. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +27 -0
  103. package/esm2020/src/app/core/services/validator/user-token.validator.mjs +52 -0
  104. package/esm2020/src/app/core/settings/settings.module.mjs +34 -0
  105. package/esm2020/src/app/core/settings/settings.page.mjs +312 -0
  106. package/esm2020/src/app/core/table/actions-column.component.mjs +102 -0
  107. package/esm2020/src/app/core/table/async-table.class.mjs +1697 -0
  108. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +384 -0
  109. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +399 -0
  110. package/esm2020/src/app/core/table/memory-table.class.mjs +53 -0
  111. package/esm2020/src/app/core/table/table-select-columns.component.mjs +43 -0
  112. package/esm2020/src/app/core/table/table.class.mjs +1728 -0
  113. package/esm2020/src/app/core/table/table.model.mjs +12 -0
  114. package/esm2020/src/app/core/table/table.module.mjs +40 -0
  115. package/esm2020/src/app/core/table/table.utils.mjs +30 -0
  116. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +27 -0
  117. package/esm2020/src/app/core/table/testing/table.testing.mjs +280 -0
  118. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +38 -0
  119. package/esm2020/src/app/shared/alerts.mjs +239 -0
  120. package/esm2020/src/app/shared/audio/audio.mjs +248 -0
  121. package/esm2020/src/app/shared/audio/audio.testing.mjs +31 -0
  122. package/esm2020/src/app/shared/audio/audio.testing.module.mjs +45 -0
  123. package/esm2020/src/app/shared/capacitor/keyboard.mjs +40 -0
  124. package/esm2020/src/app/shared/capacitor/plugins.mjs +9 -0
  125. package/esm2020/src/app/shared/constants.mjs +10 -0
  126. package/esm2020/src/app/shared/dates.mjs +147 -0
  127. package/esm2020/src/app/shared/debug/debug-service.class.mjs +3 -0
  128. package/esm2020/src/app/shared/debug/debug.component.mjs +39 -0
  129. package/esm2020/src/app/shared/debug/debug.module.mjs +44 -0
  130. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +92 -0
  131. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +30 -0
  132. package/esm2020/src/app/shared/directives/directives.module.mjs +43 -0
  133. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +53 -0
  134. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +31 -0
  135. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +59 -0
  136. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +40 -0
  137. package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
  138. package/esm2020/src/app/shared/events.mjs +64 -0
  139. package/esm2020/src/app/shared/file/csv.utils.mjs +74 -0
  140. package/esm2020/src/app/shared/file/file.service.mjs +117 -0
  141. package/esm2020/src/app/shared/file/file.utils.mjs +113 -0
  142. package/esm2020/src/app/shared/file/images.utils.mjs +161 -0
  143. package/esm2020/src/app/shared/file/json.utils.mjs +51 -0
  144. package/esm2020/src/app/shared/file/uri.utils.mjs +23 -0
  145. package/esm2020/src/app/shared/focusable.mjs +6 -0
  146. package/esm2020/src/app/shared/form/field.component.mjs +307 -0
  147. package/esm2020/src/app/shared/form/field.model.mjs +25 -0
  148. package/esm2020/src/app/shared/form/loading-spinner.mjs +36 -0
  149. package/esm2020/src/app/shared/forms.mjs +396 -0
  150. package/esm2020/src/app/shared/functions.mjs +477 -0
  151. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +80 -0
  152. package/esm2020/src/app/shared/gesture/gesture-config.mjs +49 -0
  153. package/esm2020/src/app/shared/gesture/hammer.utils.mjs +2 -0
  154. package/esm2020/src/app/shared/graph/colors.utils.mjs +64 -0
  155. package/esm2020/src/app/shared/graph/graph-colors.mjs +212 -0
  156. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +57 -0
  157. package/esm2020/src/app/shared/help/help.modal.mjs +53 -0
  158. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  159. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +84 -0
  160. package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +42 -0
  161. package/esm2020/src/app/shared/http/http.utils.mjs +52 -0
  162. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +365 -0
  163. package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +59 -0
  164. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +27 -0
  165. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
  166. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +39 -0
  167. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +56 -0
  168. package/esm2020/src/app/shared/image/image.model.mjs +2 -0
  169. package/esm2020/src/app/shared/image/image.module.mjs +29 -0
  170. package/esm2020/src/app/shared/image/image.service.mjs +98 -0
  171. package/esm2020/src/app/shared/inputs.mjs +231 -0
  172. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +27 -0
  173. package/esm2020/src/app/shared/logging/log-level.model.mjs +48 -0
  174. package/esm2020/src/app/shared/logging/logger.model.mjs +47 -0
  175. package/esm2020/src/app/shared/logging/logging-service.class.mjs +121 -0
  176. package/esm2020/src/app/shared/logging/logging-service.config.mjs +2 -0
  177. package/esm2020/src/app/shared/logging/logging-service.module.mjs +30 -0
  178. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +47 -0
  179. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +920 -0
  180. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +78 -0
  181. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +19 -0
  182. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +209 -0
  183. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +194 -0
  184. package/esm2020/src/app/shared/material/badge/badge.module.mjs +32 -0
  185. package/esm2020/src/app/shared/material/badge/badge.test.mjs +41 -0
  186. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +68 -0
  187. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +253 -0
  188. package/esm2020/src/app/shared/material/chips/chips.module.mjs +76 -0
  189. package/esm2020/src/app/shared/material/chips/material.chips.mjs +697 -0
  190. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +143 -0
  191. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +91 -0
  192. package/esm2020/src/app/shared/material/datetime/material.date.mjs +376 -0
  193. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +385 -0
  194. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +499 -0
  195. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +108 -0
  196. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +110 -0
  197. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +103 -0
  198. package/esm2020/src/app/shared/material/duration/duration.module.mjs +67 -0
  199. package/esm2020/src/app/shared/material/duration/duration.utils.mjs +36 -0
  200. package/esm2020/src/app/shared/material/duration/material.duration.mjs +257 -0
  201. package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
  202. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +381 -0
  203. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +67 -0
  204. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +102 -0
  205. package/esm2020/src/app/shared/material/material.animations.mjs +104 -0
  206. package/esm2020/src/app/shared/material/material.module.mjs +224 -0
  207. package/esm2020/src/app/shared/material/material.testing.module.mjs +168 -0
  208. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +98 -0
  209. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +80 -0
  210. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +190 -0
  211. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +17 -0
  212. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +162 -0
  213. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +37 -0
  214. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +15 -0
  215. package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +60 -0
  216. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +46 -0
  217. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +46 -0
  218. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +22 -0
  219. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +344 -0
  220. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +52 -0
  221. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +64 -0
  222. package/esm2020/src/app/shared/modules.mjs +11 -0
  223. package/esm2020/src/app/shared/named-filter/named-filter.service.mjs +123 -0
  224. package/esm2020/src/app/shared/observables.mjs +103 -0
  225. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +141 -0
  226. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +23 -0
  227. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +48 -0
  228. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +66 -0
  229. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +27 -0
  230. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +34 -0
  231. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +62 -0
  232. package/esm2020/src/app/shared/pipes/form.pipes.mjs +187 -0
  233. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +48 -0
  234. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +46 -0
  235. package/esm2020/src/app/shared/pipes/maps.pipe.mjs +63 -0
  236. package/esm2020/src/app/shared/pipes/math.pipes.mjs +59 -0
  237. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +21 -0
  238. package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +30 -0
  239. package/esm2020/src/app/shared/pipes/pipes.module.mjs +239 -0
  240. package/esm2020/src/app/shared/pipes/property.pipes.mjs +93 -0
  241. package/esm2020/src/app/shared/pipes/string.pipes.mjs +121 -0
  242. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +43 -0
  243. package/esm2020/src/app/shared/pipes/types.pipes.mjs +45 -0
  244. package/esm2020/src/app/shared/platforms.mjs +43 -0
  245. package/esm2020/src/app/shared/services/entity-service.class.mjs +7 -0
  246. package/esm2020/src/app/shared/services/job.utils.mjs +92 -0
  247. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +337 -0
  248. package/esm2020/src/app/shared/services/progress-bar.service.mjs +33 -0
  249. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +119 -0
  250. package/esm2020/src/app/shared/services/startable-service.class.mjs +110 -0
  251. package/esm2020/src/app/shared/services/translate-context.service.mjs +105 -0
  252. package/esm2020/src/app/shared/services/validator-service.class.mjs +2 -0
  253. package/esm2020/src/app/shared/services.mjs +62 -0
  254. package/esm2020/src/app/shared/shared-routing.module.mjs +70 -0
  255. package/esm2020/src/app/shared/shared.module.mjs +208 -0
  256. package/esm2020/src/app/shared/shared.testing.module.mjs +84 -0
  257. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +268 -0
  258. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +60 -0
  259. package/esm2020/src/app/shared/storage/storage.service.mjs +132 -0
  260. package/esm2020/src/app/shared/storage/storage.utils.mjs +13 -0
  261. package/esm2020/src/app/shared/testing/observable.test.mjs +95 -0
  262. package/esm2020/src/app/shared/testing/tests.page.mjs +33 -0
  263. package/esm2020/src/app/shared/toast/toast.testing.mjs +51 -0
  264. package/esm2020/src/app/shared/toast/toast.testing.module.mjs +45 -0
  265. package/esm2020/src/app/shared/toast/toasts.mjs +144 -0
  266. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +58 -0
  267. package/esm2020/src/app/shared/toolbar/toolbar.mjs +251 -0
  268. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +53 -0
  269. package/esm2020/src/app/shared/types.mjs +2 -0
  270. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +57 -0
  271. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +45 -0
  272. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +97 -0
  273. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +204 -0
  274. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +20 -0
  275. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +104 -0
  276. package/esm2020/src/app/shared/validator/validators.mjs +573 -0
  277. package/esm2020/src/app/shared/version/versions.mjs +81 -0
  278. package/esm2020/src/app/social/job/job.module.mjs +42 -0
  279. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +20 -0
  280. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +216 -0
  281. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +43 -0
  282. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +23 -0
  283. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +71 -0
  284. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +52 -0
  285. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +55 -0
  286. package/esm2020/src/app/social/job/testing/job.testing.module.mjs +35 -0
  287. package/esm2020/src/app/social/message/message.form.mjs +81 -0
  288. package/esm2020/src/app/social/message/message.modal.mjs +93 -0
  289. package/esm2020/src/app/social/message/message.model.mjs +65 -0
  290. package/esm2020/src/app/social/message/message.module.mjs +35 -0
  291. package/esm2020/src/app/social/message/message.service.mjs +84 -0
  292. package/esm2020/src/app/social/social.errors.mjs +10 -0
  293. package/esm2020/src/app/social/social.module.mjs +47 -0
  294. package/esm2020/src/app/social/social.testing.module.mjs +51 -0
  295. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +114 -0
  296. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +246 -0
  297. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +227 -0
  298. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +112 -0
  299. package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +35 -0
  300. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +111 -0
  301. package/esm2020/src/app/social/user-event/user-event.model.mjs +2 -0
  302. package/esm2020/src/app/social/user-event/user-event.module.mjs +39 -0
  303. package/esm2020/src/app/social/user-event/user-event.service.mjs +487 -0
  304. package/esm2020/src/environments/environment.class.mjs +5 -0
  305. package/esm2020/src/environments/environment.mjs +94 -0
  306. package/esm2020/sumaris-net.ngx-components.mjs +5 -0
  307. package/fesm2015/sumaris-net.ngx-components.mjs +38957 -0
  308. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -0
  309. package/fesm2020/sumaris-net.ngx-components.mjs +38062 -0
  310. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -0
  311. package/index.d.ts +5 -0
  312. package/package.json +23 -137
  313. package/public_api.d.ts +287 -0
  314. package/src/app/admin/admin-routing.module.d.ts +9 -0
  315. package/src/app/admin/admin.module.d.ts +10 -0
  316. package/src/app/admin/services/filter/person.filter.d.ts +21 -0
  317. package/src/app/admin/services/person.service.d.ts +44 -0
  318. package/src/app/admin/services/validator/person.validator.d.ts +14 -0
  319. package/src/app/admin/users/users.d.ts +44 -0
  320. package/src/app/admin/users/users.module.d.ts +13 -0
  321. package/src/app/core/about/about.modal.d.ts +32 -0
  322. package/src/app/core/about/about.module.d.ts +10 -0
  323. package/src/app/core/account/account.module.d.ts +15 -0
  324. package/src/app/core/account/account.page.d.ts +68 -0
  325. package/src/app/core/account/new-token.modal.d.ts +41 -0
  326. package/src/app/core/account/token.table.d.ts +25 -0
  327. package/src/app/core/auth/auth.form.d.ts +36 -0
  328. package/src/app/core/auth/auth.modal.d.ts +24 -0
  329. package/src/app/core/auth/auth.module.d.ts +11 -0
  330. package/src/app/core/core.module.d.ts +31 -0
  331. package/src/app/core/core.testing.module.d.ts +14 -0
  332. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +26 -0
  333. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +9 -0
  334. package/src/app/core/form/entity/editor.class.d.ts +243 -0
  335. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +128 -0
  336. package/src/app/core/form/entity/entity-editor.class.d.ts +205 -0
  337. package/src/app/core/form/entity/entity-metadata.component.d.ts +13 -0
  338. package/src/app/core/form/entity/entity.module.d.ts +10 -0
  339. package/src/app/core/form/form.class.d.ts +155 -0
  340. package/src/app/core/form/form.module.d.ts +13 -0
  341. package/src/app/core/form/form.utils.d.ts +338 -0
  342. package/src/app/core/form/list/list.form.d.ts +81 -0
  343. package/src/app/core/form/list/list.module.d.ts +9 -0
  344. package/src/app/core/form/properties/properties.form.d.ts +44 -0
  345. package/src/app/core/form/properties/properties.module.d.ts +11 -0
  346. package/src/app/core/form/properties/properties.table.d.ts +78 -0
  347. package/src/app/core/form/properties/property.validator.d.ts +13 -0
  348. package/src/app/core/form/properties/testing/properties-form.test.d.ts +19 -0
  349. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
  350. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +14 -0
  351. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +11 -0
  352. package/src/app/core/form/text-popover/text-form.component.d.ts +32 -0
  353. package/src/app/core/form/text-popover/text-popover.component.d.ts +70 -0
  354. package/src/app/core/form/text-popover/text-popover.module.d.ts +10 -0
  355. package/src/app/core/graphql/graphql.module.d.ts +8 -0
  356. package/src/app/core/graphql/graphql.service.d.ts +148 -0
  357. package/src/app/core/graphql/graphql.utils.d.ts +42 -0
  358. package/src/app/core/home/home.d.ts +74 -0
  359. package/src/app/core/home/home.module.d.ts +12 -0
  360. package/src/app/core/icon/icon.component.d.ts +13 -0
  361. package/src/app/core/icon/icon.module.d.ts +9 -0
  362. package/src/app/core/install/install-upgrade-card.component.d.ts +63 -0
  363. package/src/app/core/install/install-upgrade-card.module.d.ts +9 -0
  364. package/src/app/core/menu/menu.component.d.ts +62 -0
  365. package/src/app/core/menu/menu.model.d.ts +28 -0
  366. package/src/app/core/menu/menu.module.d.ts +10 -0
  367. package/src/app/core/menu/menu.service.d.ts +21 -0
  368. package/src/app/core/offline/update-offline-mode-card.component.d.ts +11 -0
  369. package/src/app/core/offline/update-offline-mode-card.module.d.ts +9 -0
  370. package/src/app/core/peer/select-peer.modal.d.ts +53 -0
  371. package/src/app/core/peer/select-peer.module.d.ts +11 -0
  372. package/src/app/core/register/register-confirm.page.d.ts +24 -0
  373. package/src/app/core/register/register.form.d.ts +48 -0
  374. package/src/app/core/register/register.modal.d.ts +14 -0
  375. package/src/app/core/register/register.module.d.ts +12 -0
  376. package/src/app/core/services/account.service.d.ts +191 -0
  377. package/src/app/core/services/auth-guard.service.d.ts +17 -0
  378. package/src/app/core/services/base-entity-service.class.d.ts +104 -0
  379. package/src/app/core/services/base-graphql-service.class.d.ts +77 -0
  380. package/src/app/core/services/base58.d.ts +7 -0
  381. package/src/app/core/services/config/core.config.d.ts +29 -0
  382. package/src/app/core/services/config.service.d.ts +60 -0
  383. package/src/app/core/services/crypto.service.d.ts +44 -0
  384. package/src/app/core/services/errors.d.ts +51 -0
  385. package/src/app/core/services/local-settings.service.d.ts +90 -0
  386. package/src/app/core/services/model/account.model.d.ts +35 -0
  387. package/src/app/core/services/model/config.model.d.ts +36 -0
  388. package/src/app/core/services/model/department.model.d.ts +11 -0
  389. package/src/app/core/services/model/entity.decorators.d.ts +17 -0
  390. package/src/app/core/services/model/entity.model.d.ts +89 -0
  391. package/src/app/core/services/model/filter.model.d.ts +35 -0
  392. package/src/app/core/services/model/history.model.d.ts +20 -0
  393. package/src/app/core/services/model/model.enum.d.ts +7 -0
  394. package/src/app/core/services/model/peer.model.d.ts +29 -0
  395. package/src/app/core/services/model/person.model.d.ts +31 -0
  396. package/src/app/core/services/model/referential.model.d.ts +77 -0
  397. package/src/app/core/services/model/settings.model.d.ts +26 -0
  398. package/src/app/core/services/model/token.model.d.ts +21 -0
  399. package/src/app/core/services/network.service.d.ts +149 -0
  400. package/src/app/core/services/network.types.d.ts +5 -0
  401. package/src/app/core/services/network.utils.d.ts +31 -0
  402. package/src/app/core/services/pipes/account.pipes.d.ts +15 -0
  403. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +9 -0
  404. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +9 -0
  405. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +15 -0
  406. package/src/app/core/services/platform.service.d.ts +96 -0
  407. package/src/app/core/services/storage/entities-storage.service.d.ts +108 -0
  408. package/src/app/core/services/storage/entity-store.class.d.ts +113 -0
  409. package/src/app/core/services/testing/referential-filter.model.d.ts +9 -0
  410. package/src/app/core/services/testing/referential.validator.d.ts +22 -0
  411. package/src/app/core/services/validator/account.validator.d.ts +17 -0
  412. package/src/app/core/services/validator/base.validator.class.d.ts +21 -0
  413. package/src/app/core/services/validator/local-settings.validator.d.ts +18 -0
  414. package/src/app/core/services/validator/user-settings.validator.d.ts +10 -0
  415. package/src/app/core/services/validator/user-token.validator.d.ts +13 -0
  416. package/src/app/core/settings/settings.module.d.ts +10 -0
  417. package/src/app/core/settings/settings.page.d.ts +68 -0
  418. package/src/app/core/table/actions-column.component.d.ts +48 -0
  419. package/src/app/core/table/async-table.class.d.ts +383 -0
  420. package/src/app/core/table/entities-async-table-datasource.class.d.ts +80 -0
  421. package/src/app/core/table/entities-table-datasource.class.d.ts +94 -0
  422. package/src/app/core/table/memory-table.class.d.ts +25 -0
  423. package/src/app/core/table/table-select-columns.component.d.ts +22 -0
  424. package/src/app/core/table/table.class.d.ts +386 -0
  425. package/src/app/core/table/table.model.d.ts +26 -0
  426. package/src/app/core/table/table.module.d.ts +10 -0
  427. package/src/app/core/table/table.utils.d.ts +11 -0
  428. package/src/app/core/table/testing/table-validator.service.d.ts +17 -0
  429. package/src/app/core/table/testing/table.testing.d.ts +53 -0
  430. package/src/app/core/table/testing/table.testing.module.d.ts +11 -0
  431. package/src/app/shared/alerts.d.ts +53 -0
  432. package/src/app/shared/audio/audio.d.ts +44 -0
  433. package/src/app/shared/audio/audio.testing.d.ts +13 -0
  434. package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
  435. package/src/app/shared/capacitor/keyboard.d.ts +16 -0
  436. package/src/app/shared/capacitor/plugins.d.ts +7 -0
  437. package/src/app/shared/constants.d.ts +7 -0
  438. package/src/app/shared/dates.d.ts +39 -0
  439. package/src/app/shared/debug/debug-service.class.d.ts +5 -0
  440. package/src/app/shared/debug/debug.component.d.ts +13 -0
  441. package/src/app/shared/debug/debug.module.d.ts +12 -0
  442. package/src/app/shared/directives/autofocus.directive.d.ts +19 -0
  443. package/src/app/shared/directives/autotitle.directive.d.ts +10 -0
  444. package/src/app/shared/directives/directives.module.d.ts +12 -0
  445. package/src/app/shared/directives/drag-and-drop.directive.d.ts +17 -0
  446. package/src/app/shared/directives/ng-var.directive.d.ts +12 -0
  447. package/src/app/shared/directives/resizable/resizable.component.d.ts +21 -0
  448. package/src/app/shared/directives/resizable/resizable.directive.d.ts +12 -0
  449. package/src/app/shared/directives/resizable/resizable.module.d.ts +8 -0
  450. package/src/app/shared/events.d.ts +27 -0
  451. package/src/app/shared/file/csv.utils.d.ts +19 -0
  452. package/src/app/shared/file/file.service.d.ts +23 -0
  453. package/src/app/shared/file/file.utils.d.ts +20 -0
  454. package/src/app/shared/file/images.utils.d.ts +19 -0
  455. package/src/app/shared/file/json.utils.d.ts +16 -0
  456. package/src/app/shared/file/uri.utils.d.ts +7 -0
  457. package/src/app/shared/focusable.d.ts +4 -0
  458. package/src/app/shared/form/field.component.d.ts +71 -0
  459. package/src/app/shared/form/field.model.d.ts +37 -0
  460. package/src/app/shared/form/loading-spinner.d.ts +8 -0
  461. package/src/app/shared/forms.d.ts +90 -0
  462. package/src/app/shared/functions.d.ts +132 -0
  463. package/src/app/shared/geolocation/geolocation.utils.d.ts +19 -0
  464. package/src/app/shared/gesture/gesture-config.d.ts +15 -0
  465. package/src/app/shared/gesture/hammer.utils.d.ts +16 -0
  466. package/src/app/shared/graph/colors.utils.d.ts +17 -0
  467. package/src/app/shared/graph/graph-colors.d.ts +63 -0
  468. package/src/app/shared/guard/component-dirty.guard.d.ts +19 -0
  469. package/src/app/shared/help/help.modal.d.ts +33 -0
  470. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +10 -0
  471. package/src/app/shared/hotkeys/hotkeys.service.d.ts +28 -0
  472. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +11 -0
  473. package/src/app/shared/http/http.utils.d.ts +27 -0
  474. package/src/app/shared/image/gallery/image-gallery.component.d.ts +98 -0
  475. package/src/app/shared/image/gallery/image-gallery.module.d.ts +14 -0
  476. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
  477. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
  478. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +16 -0
  479. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +12 -0
  480. package/src/app/shared/image/image.model.d.ts +5 -0
  481. package/src/app/shared/image/image.module.d.ts +8 -0
  482. package/src/app/shared/image/image.service.d.ts +32 -0
  483. package/src/app/shared/inputs.d.ts +32 -0
  484. package/src/app/shared/interceptors/progess.interceptor.d.ts +8 -0
  485. package/src/app/shared/logging/log-level.model.d.ts +38 -0
  486. package/src/app/shared/logging/logger.model.d.ts +68 -0
  487. package/src/app/shared/logging/logging-service.class.d.ts +39 -0
  488. package/src/app/shared/logging/logging-service.config.d.ts +25 -0
  489. package/src/app/shared/logging/logging-service.module.d.ts +9 -0
  490. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +36 -0
  491. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +139 -0
  492. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +21 -0
  493. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +4 -0
  494. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +45 -0
  495. package/src/app/shared/material/badge/badge.directive.d.ts +37 -0
  496. package/src/app/shared/material/badge/badge.module.d.ts +10 -0
  497. package/src/app/shared/material/badge/badge.test.d.ts +21 -0
  498. package/src/app/shared/material/boolean/boolean.module.d.ts +19 -0
  499. package/src/app/shared/material/boolean/material.boolean.d.ts +66 -0
  500. package/src/app/shared/material/chips/chips.module.d.ts +21 -0
  501. package/src/app/shared/material/chips/material.chips.d.ts +126 -0
  502. package/src/app/shared/material/chips/testing/chips.test.d.ts +31 -0
  503. package/src/app/shared/material/datetime/datetime.module.d.ts +24 -0
  504. package/src/app/shared/material/datetime/material.date.d.ts +74 -0
  505. package/src/app/shared/material/datetime/material.dateshort.d.ts +75 -0
  506. package/src/app/shared/material/datetime/material.datetime.d.ts +100 -0
  507. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +31 -0
  508. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +30 -0
  509. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +29 -0
  510. package/src/app/shared/material/duration/duration.module.d.ts +18 -0
  511. package/src/app/shared/material/duration/duration.utils.d.ts +3 -0
  512. package/src/app/shared/material/duration/material.duration.d.ts +57 -0
  513. package/src/app/shared/material/latlong/latlong.utils.d.ts +13 -0
  514. package/src/app/shared/material/latlong/material.latlong.d.ts +65 -0
  515. package/src/app/shared/material/latlong/material.latlong.module.d.ts +19 -0
  516. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +21 -0
  517. package/src/app/shared/material/material.animations.d.ts +4 -0
  518. package/src/app/shared/material/material.module.d.ts +45 -0
  519. package/src/app/shared/material/material.testing.module.d.ts +25 -0
  520. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +22 -0
  521. package/src/app/shared/material/numpad/numpad.component.d.ts +26 -0
  522. package/src/app/shared/material/numpad/numpad.container.d.ts +40 -0
  523. package/src/app/shared/material/numpad/numpad.content.d.ts +7 -0
  524. package/src/app/shared/material/numpad/numpad.directive.d.ts +35 -0
  525. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +16 -0
  526. package/src/app/shared/material/numpad/numpad.model.d.ts +30 -0
  527. package/src/app/shared/material/numpad/numpad.module.d.ts +16 -0
  528. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +13 -0
  529. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +15 -0
  530. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +10 -0
  531. package/src/app/shared/material/swipe/material.swipe.d.ts +89 -0
  532. package/src/app/shared/material/swipe/swipe.module.d.ts +15 -0
  533. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +22 -0
  534. package/src/app/shared/modules.d.ts +8 -0
  535. package/src/app/shared/named-filter/named-filter.service.d.ts +73 -0
  536. package/src/app/shared/observables.d.ts +29 -0
  537. package/src/app/shared/pipes/arrays.pipe.d.ts +54 -0
  538. package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
  539. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +23 -0
  540. package/src/app/shared/pipes/date-format.pipe.d.ts +34 -0
  541. package/src/app/shared/pipes/date-from-now.pipe.d.ts +12 -0
  542. package/src/app/shared/pipes/duration.pipe.d.ts +13 -0
  543. package/src/app/shared/pipes/file-size.pipe.d.ts +30 -0
  544. package/src/app/shared/pipes/form.pipes.d.ts +59 -0
  545. package/src/app/shared/pipes/highlight.pipe.d.ts +11 -0
  546. package/src/app/shared/pipes/latlong-format.pipe.d.ts +20 -0
  547. package/src/app/shared/pipes/maps.pipe.d.ts +22 -0
  548. package/src/app/shared/pipes/math.pipes.d.ts +20 -0
  549. package/src/app/shared/pipes/ng-init.pipe.d.ts +8 -0
  550. package/src/app/shared/pipes/number-format.pipe.d.ts +10 -0
  551. package/src/app/shared/pipes/pipes.module.d.ts +27 -0
  552. package/src/app/shared/pipes/property.pipes.d.ts +26 -0
  553. package/src/app/shared/pipes/string.pipes.d.ts +47 -0
  554. package/src/app/shared/pipes/translate-context.pipe.d.ts +17 -0
  555. package/src/app/shared/pipes/types.pipes.d.ts +18 -0
  556. package/src/app/shared/platforms.d.ts +8 -0
  557. package/src/app/shared/services/entity-service.class.d.ts +73 -0
  558. package/src/app/shared/services/job.utils.d.ts +20 -0
  559. package/src/app/shared/services/memory-entity-service.class.d.ts +71 -0
  560. package/src/app/shared/services/progress-bar.service.d.ts +20 -0
  561. package/src/app/shared/services/startable-observable-service.class.d.ts +33 -0
  562. package/src/app/shared/services/startable-service.class.d.ts +34 -0
  563. package/src/app/shared/services/translate-context.service.d.ts +29 -0
  564. package/src/app/shared/services/validator-service.class.d.ts +10 -0
  565. package/src/app/shared/services.d.ts +9 -0
  566. package/src/app/shared/shared-routing.module.d.ts +22 -0
  567. package/src/app/shared/shared.module.d.ts +31 -0
  568. package/src/app/shared/shared.testing.module.d.ts +17 -0
  569. package/src/app/shared/storage/storage-explorer.component.d.ts +58 -0
  570. package/src/app/shared/storage/storage-explorer.module.d.ts +16 -0
  571. package/src/app/shared/storage/storage.service.d.ts +23 -0
  572. package/src/app/shared/storage/storage.utils.d.ts +19 -0
  573. package/src/app/shared/testing/observable.test.d.ts +25 -0
  574. package/src/app/shared/testing/tests.page.d.ts +20 -0
  575. package/src/app/shared/toast/toast.testing.d.ts +15 -0
  576. package/src/app/shared/toast/toast.testing.module.d.ts +11 -0
  577. package/src/app/shared/toast/toasts.d.ts +17 -0
  578. package/src/app/shared/toolbar/modal-toolbar.d.ts +21 -0
  579. package/src/app/shared/toolbar/toolbar.d.ts +63 -0
  580. package/src/app/shared/toolbar/toolbar.module.d.ts +15 -0
  581. package/src/app/shared/types.d.ts +26 -0
  582. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +20 -0
  583. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +11 -0
  584. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +39 -0
  585. package/src/app/shared/upload-file/upload-file.component.d.ts +48 -0
  586. package/src/app/shared/upload-file/upload-file.model.d.ts +30 -0
  587. package/src/app/shared/validator/form-error-adapter.class.d.ts +27 -0
  588. package/src/app/shared/validator/validators.d.ts +115 -0
  589. package/src/app/shared/version/versions.d.ts +26 -0
  590. package/src/app/social/job/job.module.d.ts +12 -0
  591. package/src/app/social/job/progression/job-progression.component.d.ts +9 -0
  592. package/src/app/social/job/progression/job-progression.icon.d.ts +49 -0
  593. package/src/app/social/job/progression/job-progression.list.d.ts +21 -0
  594. package/src/app/social/job/progression/job-progression.model.d.ts +11 -0
  595. package/src/app/social/job/progression/job-progression.service.d.ts +34 -0
  596. package/src/app/social/job/testing/job-progression.testing.d.ts +17 -0
  597. package/src/app/social/job/testing/job-progression.testing.service.d.ts +17 -0
  598. package/src/app/social/job/testing/job.testing.module.d.ts +11 -0
  599. package/src/app/social/message/message.form.d.ts +30 -0
  600. package/src/app/social/message/message.modal.d.ts +39 -0
  601. package/src/app/social/message/message.model.d.ts +31 -0
  602. package/src/app/social/message/message.module.d.ts +11 -0
  603. package/src/app/social/message/message.service.d.ts +27 -0
  604. package/src/app/social/social.errors.d.ts +9 -0
  605. package/src/app/social/social.module.d.ts +20 -0
  606. package/src/app/social/social.testing.module.d.ts +13 -0
  607. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +31 -0
  608. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +71 -0
  609. package/src/app/social/user-event/testing/user-event.testing.d.ts +34 -0
  610. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +44 -0
  611. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +11 -0
  612. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +41 -0
  613. package/src/app/social/user-event/user-event.model.d.ts +45 -0
  614. package/src/app/social/user-event/user-event.module.d.ts +12 -0
  615. package/src/app/social/user-event/user-event.service.d.ts +124 -0
  616. package/src/environments/environment.class.d.ts +57 -0
  617. package/src/environments/environment.d.ts +3 -0
  618. package/.editorconfig +0 -24
  619. package/.eslintrc.json +0 -74
  620. package/.gitattribute +0 -1
  621. package/.github/CONTRIBUTING.md +0 -10
  622. package/.github/ISSUE_TEMPLATE.md +0 -6
  623. package/.github/PULL_REQUEST_TEMPLATE.md +0 -10
  624. package/.github/github_disclaimer.md +0 -14
  625. package/.gitlab-ci.yml +0 -46
  626. package/.graphqlconfig +0 -15
  627. package/angular.json +0 -230
  628. package/capacitor.config.json +0 -9
  629. package/ionic.config.json +0 -7
  630. package/karma.conf.js +0 -32
  631. package/ng-package.json +0 -19
  632. package/ngcc.config.js +0 -14
  633. package/public_api.ts +0 -343
  634. package/resources/android/build/tools/android-accept-licenses.sh +0 -14
  635. package/resources/android/icon/drawable-hdpi-icon.png +0 -0
  636. package/resources/android/icon/drawable-ldpi-icon.png +0 -0
  637. package/resources/android/icon/drawable-mdpi-icon.png +0 -0
  638. package/resources/android/icon/drawable-xhdpi-icon.png +0 -0
  639. package/resources/android/icon/drawable-xxhdpi-icon.png +0 -0
  640. package/resources/android/icon/drawable-xxxhdpi-icon.png +0 -0
  641. package/resources/android/splash/drawable-land-hdpi-screen.png +0 -0
  642. package/resources/android/splash/drawable-land-ldpi-screen.png +0 -0
  643. package/resources/android/splash/drawable-land-mdpi-screen.png +0 -0
  644. package/resources/android/splash/drawable-land-xhdpi-screen.png +0 -0
  645. package/resources/android/splash/drawable-land-xxhdpi-screen.png +0 -0
  646. package/resources/android/splash/drawable-land-xxxhdpi-screen.png +0 -0
  647. package/resources/android/splash/drawable-port-hdpi-screen.png +0 -0
  648. package/resources/android/splash/drawable-port-ldpi-screen.png +0 -0
  649. package/resources/android/splash/drawable-port-mdpi-screen.png +0 -0
  650. package/resources/android/splash/drawable-port-xhdpi-screen.png +0 -0
  651. package/resources/android/splash/drawable-port-xxhdpi-screen.png +0 -0
  652. package/resources/android/splash/drawable-port-xxxhdpi-screen.png +0 -0
  653. package/resources/android/splash/drawable-xxxhdpi-screen.png +0 -0
  654. package/resources/icon/TODO.md +0 -11
  655. package/resources/icon.png +0 -0
  656. package/resources/icon.png.md5 +0 -1
  657. package/resources/icon.xcf +0 -0
  658. package/resources/ios/icon/icon-1024.png +0 -0
  659. package/resources/ios/icon/icon-108@2x.png +0 -0
  660. package/resources/ios/icon/icon-20.png +0 -0
  661. package/resources/ios/icon/icon-20@2x.png +0 -0
  662. package/resources/ios/icon/icon-20@3x.png +0 -0
  663. package/resources/ios/icon/icon-24@2x.png +0 -0
  664. package/resources/ios/icon/icon-27.5@2x.png +0 -0
  665. package/resources/ios/icon/icon-29.png +0 -0
  666. package/resources/ios/icon/icon-29@2x.png +0 -0
  667. package/resources/ios/icon/icon-29@3x.png +0 -0
  668. package/resources/ios/icon/icon-40.png +0 -0
  669. package/resources/ios/icon/icon-40@2x.png +0 -0
  670. package/resources/ios/icon/icon-40@3x.png +0 -0
  671. package/resources/ios/icon/icon-44@2x.png +0 -0
  672. package/resources/ios/icon/icon-50.png +0 -0
  673. package/resources/ios/icon/icon-50@2x.png +0 -0
  674. package/resources/ios/icon/icon-60.png +0 -0
  675. package/resources/ios/icon/icon-60@2x.png +0 -0
  676. package/resources/ios/icon/icon-60@3x.png +0 -0
  677. package/resources/ios/icon/icon-72.png +0 -0
  678. package/resources/ios/icon/icon-72@2x.png +0 -0
  679. package/resources/ios/icon/icon-76.png +0 -0
  680. package/resources/ios/icon/icon-76@2x.png +0 -0
  681. package/resources/ios/icon/icon-83.5@2x.png +0 -0
  682. package/resources/ios/icon/icon-86@2x.png +0 -0
  683. package/resources/ios/icon/icon-98@2x.png +0 -0
  684. package/resources/ios/icon/icon-small.png +0 -0
  685. package/resources/ios/icon/icon-small@2x.png +0 -0
  686. package/resources/ios/icon/icon-small@3x.png +0 -0
  687. package/resources/ios/icon/icon.png +0 -0
  688. package/resources/ios/icon/icon@2x.png +0 -0
  689. package/resources/ios/splash/Default-1792h~iphone.png +0 -0
  690. package/resources/ios/splash/Default-2436h.png +0 -0
  691. package/resources/ios/splash/Default-2688h~iphone.png +0 -0
  692. package/resources/ios/splash/Default-568h@2x~iphone.png +0 -0
  693. package/resources/ios/splash/Default-667h.png +0 -0
  694. package/resources/ios/splash/Default-736h.png +0 -0
  695. package/resources/ios/splash/Default-Landscape-1792h~iphone.png +0 -0
  696. package/resources/ios/splash/Default-Landscape-2436h.png +0 -0
  697. package/resources/ios/splash/Default-Landscape-2688h~iphone.png +0 -0
  698. package/resources/ios/splash/Default-Landscape-736h.png +0 -0
  699. package/resources/ios/splash/Default-Landscape@2x~ipad.png +0 -0
  700. package/resources/ios/splash/Default-Landscape@~ipadpro.png +0 -0
  701. package/resources/ios/splash/Default-Landscape~ipad.png +0 -0
  702. package/resources/ios/splash/Default-Portrait@2x~ipad.png +0 -0
  703. package/resources/ios/splash/Default-Portrait@~ipadpro.png +0 -0
  704. package/resources/ios/splash/Default-Portrait~ipad.png +0 -0
  705. package/resources/ios/splash/Default@2x~iphone.png +0 -0
  706. package/resources/ios/splash/Default@2x~universal~anyany.png +0 -0
  707. package/resources/ios/splash/Default~iphone.png +0 -0
  708. package/resources/splash.png +0 -0
  709. package/resources/splash.png.md5 +0 -1
  710. package/scripts/build-android.sh +0 -18
  711. package/scripts/build-i18n.js +0 -24
  712. package/scripts/docker-start.sh +0 -6
  713. package/scripts/emulate-android.sh +0 -17
  714. package/scripts/env-android.sh +0 -83
  715. package/scripts/env-clean.sh +0 -23
  716. package/scripts/env-global.sh +0 -156
  717. package/scripts/install-android-sdk-tools.sh +0 -73
  718. package/scripts/ionic-update.sh +0 -24
  719. package/scripts/node/playground.ts +0 -9
  720. package/scripts/node/resources.js +0 -90
  721. package/scripts/release.sh +0 -149
  722. package/scripts/run-android.sh +0 -59
  723. package/scripts/test.sh +0 -19
  724. package/src/app/admin/admin-routing.module.ts +0 -30
  725. package/src/app/admin/admin.module.ts +0 -23
  726. package/src/app/admin/services/filter/person.filter.ts +0 -77
  727. package/src/app/admin/services/person.service.ts +0 -212
  728. package/src/app/admin/services/validator/person.validator.ts +0 -37
  729. package/src/app/admin/users/users.html +0 -427
  730. package/src/app/admin/users/users.module.ts +0 -34
  731. package/src/app/admin/users/users.scss +0 -59
  732. package/src/app/admin/users/users.ts +0 -257
  733. package/src/app/app-routing.module.ts +0 -126
  734. package/src/app/app.component.html +0 -12
  735. package/src/app/app.component.scss +0 -4
  736. package/src/app/app.component.ts +0 -205
  737. package/src/app/app.module.ts +0 -326
  738. package/src/app/core/about/about.modal.html +0 -140
  739. package/src/app/core/about/about.modal.scss +0 -23
  740. package/src/app/core/about/about.modal.ts +0 -71
  741. package/src/app/core/about/about.module.ts +0 -24
  742. package/src/app/core/account/account.module.ts +0 -38
  743. package/src/app/core/account/account.page.html +0 -241
  744. package/src/app/core/account/account.page.scss +0 -21
  745. package/src/app/core/account/account.page.ts +0 -366
  746. package/src/app/core/account/new-token.modal.html +0 -120
  747. package/src/app/core/account/new-token.modal.ts +0 -138
  748. package/src/app/core/account/token.table.html +0 -177
  749. package/src/app/core/account/token.table.scss +0 -7
  750. package/src/app/core/account/token.table.ts +0 -141
  751. package/src/app/core/auth/auth.form.html +0 -77
  752. package/src/app/core/auth/auth.form.scss +0 -1
  753. package/src/app/core/auth/auth.form.ts +0 -145
  754. package/src/app/core/auth/auth.modal.html +0 -57
  755. package/src/app/core/auth/auth.modal.scss +0 -1
  756. package/src/app/core/auth/auth.modal.ts +0 -80
  757. package/src/app/core/auth/auth.module.ts +0 -33
  758. package/src/app/core/core.module.ts +0 -100
  759. package/src/app/core/core.testing.module.ts +0 -64
  760. package/src/app/core/form/buttons/form-buttons-bar.component.html +0 -59
  761. package/src/app/core/form/buttons/form-buttons-bar.component.scss +0 -14
  762. package/src/app/core/form/buttons/form-buttons-bar.component.ts +0 -70
  763. package/src/app/core/form/buttons/form-buttons-bar.module.ts +0 -24
  764. package/src/app/core/form/entity/editor.class.ts +0 -803
  765. package/src/app/core/form/entity/entity-editor-modal.class.ts +0 -537
  766. package/src/app/core/form/entity/entity-editor.class.ts +0 -885
  767. package/src/app/core/form/entity/entity-metadata.component.html +0 -53
  768. package/src/app/core/form/entity/entity-metadata.component.scss +0 -28
  769. package/src/app/core/form/entity/entity-metadata.component.ts +0 -19
  770. package/src/app/core/form/entity/entity.module.ts +0 -25
  771. package/src/app/core/form/form.class.ts +0 -401
  772. package/src/app/core/form/form.module.ts +0 -37
  773. package/src/app/core/form/form.utils.ts +0 -639
  774. package/src/app/core/form/list/list.form.html +0 -67
  775. package/src/app/core/form/list/list.form.scss +0 -40
  776. package/src/app/core/form/list/list.form.ts +0 -278
  777. package/src/app/core/form/list/list.module.ts +0 -25
  778. package/src/app/core/form/properties/properties.form.html +0 -129
  779. package/src/app/core/form/properties/properties.form.ts +0 -147
  780. package/src/app/core/form/properties/properties.module.ts +0 -30
  781. package/src/app/core/form/properties/properties.table.html +0 -219
  782. package/src/app/core/form/properties/properties.table.scss +0 -0
  783. package/src/app/core/form/properties/properties.table.ts +0 -291
  784. package/src/app/core/form/properties/property.validator.ts +0 -22
  785. package/src/app/core/form/properties/testing/properties-form.test.html +0 -21
  786. package/src/app/core/form/properties/testing/properties-form.test.ts +0 -102
  787. package/src/app/core/form/properties/testing/properties-form.testing.module.ts +0 -25
  788. package/src/app/core/form/text-popover/testing/text-popover.testing.html +0 -45
  789. package/src/app/core/form/text-popover/testing/text-popover.testing.module.ts +0 -32
  790. package/src/app/core/form/text-popover/testing/text-popover.testing.ts +0 -77
  791. package/src/app/core/form/text-popover/text-form.component.html +0 -44
  792. package/src/app/core/form/text-popover/text-form.component.scss +0 -8
  793. package/src/app/core/form/text-popover/text-form.component.ts +0 -65
  794. package/src/app/core/form/text-popover/text-popover.component.html +0 -86
  795. package/src/app/core/form/text-popover/text-popover.component.scss +0 -7
  796. package/src/app/core/form/text-popover/text-popover.component.ts +0 -165
  797. package/src/app/core/form/text-popover/text-popover.module.ts +0 -27
  798. package/src/app/core/graphql/graphql.module.ts +0 -17
  799. package/src/app/core/graphql/graphql.service.ts +0 -969
  800. package/src/app/core/graphql/graphql.utils.ts +0 -167
  801. package/src/app/core/home/home.html +0 -211
  802. package/src/app/core/home/home.module.ts +0 -32
  803. package/src/app/core/home/home.scss +0 -242
  804. package/src/app/core/home/home.ts +0 -298
  805. package/src/app/core/icon/icon.component.html +0 -15
  806. package/src/app/core/icon/icon.component.ts +0 -23
  807. package/src/app/core/icon/icon.module.ts +0 -22
  808. package/src/app/core/install/install-upgrade-card.component.html +0 -144
  809. package/src/app/core/install/install-upgrade-card.component.scss +0 -4
  810. package/src/app/core/install/install-upgrade-card.component.ts +0 -412
  811. package/src/app/core/install/install-upgrade-card.module.ts +0 -23
  812. package/src/app/core/menu/menu.component.html +0 -135
  813. package/src/app/core/menu/menu.component.scss +0 -225
  814. package/src/app/core/menu/menu.component.ts +0 -352
  815. package/src/app/core/menu/menu.model.ts +0 -64
  816. package/src/app/core/menu/menu.module.ts +0 -27
  817. package/src/app/core/menu/menu.service.ts +0 -62
  818. package/src/app/core/offline/update-offline-mode-card.component.html +0 -45
  819. package/src/app/core/offline/update-offline-mode-card.component.scss +0 -4
  820. package/src/app/core/offline/update-offline-mode-card.component.ts +0 -28
  821. package/src/app/core/offline/update-offline-mode-card.module.ts +0 -24
  822. package/src/app/core/peer/select-peer.modal.html +0 -123
  823. package/src/app/core/peer/select-peer.modal.scss +0 -20
  824. package/src/app/core/peer/select-peer.modal.ts +0 -197
  825. package/src/app/core/peer/select-peer.module.ts +0 -28
  826. package/src/app/core/register/register-confirm.page.html +0 -55
  827. package/src/app/core/register/register-confirm.page.scss +0 -121
  828. package/src/app/core/register/register-confirm.page.ts +0 -94
  829. package/src/app/core/register/register.form.html +0 -125
  830. package/src/app/core/register/register.form.scss +0 -10
  831. package/src/app/core/register/register.form.ts +0 -213
  832. package/src/app/core/register/register.modal.html +0 -70
  833. package/src/app/core/register/register.modal.ts +0 -52
  834. package/src/app/core/register/register.module.ts +0 -31
  835. package/src/app/core/services/account.service.ts +0 -1431
  836. package/src/app/core/services/auth-guard.service.ts +0 -70
  837. package/src/app/core/services/base-entity-service.class.ts +0 -598
  838. package/src/app/core/services/base-graphql-service.class.ts +0 -298
  839. package/src/app/core/services/base58.ts +0 -83
  840. package/src/app/core/services/config/account.config.ts +0 -35
  841. package/src/app/core/services/config/core.config.ts +0 -180
  842. package/src/app/core/services/config.service.ts +0 -414
  843. package/src/app/core/services/crypto.service.ts +0 -126
  844. package/src/app/core/services/device-position-service.class.ts +0 -25
  845. package/src/app/core/services/errors.ts +0 -67
  846. package/src/app/core/services/local-settings.service.spec.ts +0 -32
  847. package/src/app/core/services/local-settings.service.ts +0 -548
  848. package/src/app/core/services/model/account.model.ts +0 -141
  849. package/src/app/core/services/model/config.model.ts +0 -122
  850. package/src/app/core/services/model/department.model.ts +0 -34
  851. package/src/app/core/services/model/entity.decorators.ts +0 -112
  852. package/src/app/core/services/model/entity.model.ts +0 -326
  853. package/src/app/core/services/model/filter.model.ts +0 -139
  854. package/src/app/core/services/model/history.model.ts +0 -25
  855. package/src/app/core/services/model/model.enum.ts +0 -11
  856. package/src/app/core/services/model/peer.model.ts +0 -86
  857. package/src/app/core/services/model/person.model.ts +0 -112
  858. package/src/app/core/services/model/referential.model.ts +0 -244
  859. package/src/app/core/services/model/settings.model.ts +0 -32
  860. package/src/app/core/services/model/token.model.ts +0 -54
  861. package/src/app/core/services/network.service.spec.ts +0 -49
  862. package/src/app/core/services/network.service.ts +0 -729
  863. package/src/app/core/services/network.types.ts +0 -26
  864. package/src/app/core/services/network.utils.ts +0 -57
  865. package/src/app/core/services/pipes/account.pipes.ts +0 -25
  866. package/src/app/core/services/pipes/department-to-string.pipe.ts +0 -15
  867. package/src/app/core/services/pipes/person-to-string.pipe.ts +0 -15
  868. package/src/app/core/services/pipes/usage-mode.pipes.ts +0 -26
  869. package/src/app/core/services/platform.service.spec.ts +0 -56
  870. package/src/app/core/services/platform.service.ts +0 -605
  871. package/src/app/core/services/storage/entities-storage.service.ts +0 -542
  872. package/src/app/core/services/storage/entity-store.class.ts +0 -598
  873. package/src/app/core/services/testing/referential-filter.model.ts +0 -28
  874. package/src/app/core/services/testing/referential.validator.ts +0 -57
  875. package/src/app/core/services/validator/account.validator.ts +0 -58
  876. package/src/app/core/services/validator/base.validator.class.ts +0 -54
  877. package/src/app/core/services/validator/local-settings.validator.ts +0 -72
  878. package/src/app/core/services/validator/user-settings.validator.ts +0 -25
  879. package/src/app/core/services/validator/user-token.validator.ts +0 -55
  880. package/src/app/core/settings/settings.module.ts +0 -24
  881. package/src/app/core/settings/settings.page.html +0 -264
  882. package/src/app/core/settings/settings.page.ts +0 -365
  883. package/src/app/core/table/actions-column.component.html +0 -91
  884. package/src/app/core/table/actions-column.component.ts +0 -70
  885. package/src/app/core/table/async-table.class.ts +0 -1934
  886. package/src/app/core/table/entities-async-table-datasource.class.ts +0 -482
  887. package/src/app/core/table/entities-table-datasource.class.ts +0 -496
  888. package/src/app/core/table/memory-table.class.ts +0 -65
  889. package/src/app/core/table/table-select-columns.component.html +0 -58
  890. package/src/app/core/table/table-select-columns.component.ts +0 -50
  891. package/src/app/core/table/table.class.ts +0 -1973
  892. package/src/app/core/table/table.model.ts +0 -35
  893. package/src/app/core/table/table.module.ts +0 -26
  894. package/src/app/core/table/table.utils.ts +0 -38
  895. package/src/app/core/table/testing/multi-table.testing.ts +0 -261
  896. package/src/app/core/table/testing/table-validator.service.ts +0 -25
  897. package/src/app/core/table/testing/table.testing.html +0 -396
  898. package/src/app/core/table/testing/table.testing.module.ts +0 -25
  899. package/src/app/core/table/testing/table.testing.scss +0 -23
  900. package/src/app/core/table/testing/table.testing.ts +0 -292
  901. package/src/app/shared/alerts.ts +0 -292
  902. package/src/app/shared/audio/audio.testing.html +0 -33
  903. package/src/app/shared/audio/audio.testing.module.ts +0 -32
  904. package/src/app/shared/audio/audio.testing.ts +0 -31
  905. package/src/app/shared/audio/audio.ts +0 -278
  906. package/src/app/shared/base64.utils.ts +0 -66
  907. package/src/app/shared/capacitor/keyboard.ts +0 -40
  908. package/src/app/shared/capacitor/plugins.ts +0 -12
  909. package/src/app/shared/constants.ts +0 -12
  910. package/src/app/shared/dates.ts +0 -163
  911. package/src/app/shared/debug/debug-service.class.ts +0 -8
  912. package/src/app/shared/debug/debug.component.html +0 -13
  913. package/src/app/shared/debug/debug.component.scss +0 -24
  914. package/src/app/shared/debug/debug.component.spec.ts +0 -25
  915. package/src/app/shared/debug/debug.component.ts +0 -27
  916. package/src/app/shared/debug/debug.module.ts +0 -28
  917. package/src/app/shared/directives/autofocus.directive.ts +0 -109
  918. package/src/app/shared/directives/autotitle.directive.ts +0 -24
  919. package/src/app/shared/directives/directives.module.ts +0 -29
  920. package/src/app/shared/directives/drag-and-drop.directive.ts +0 -47
  921. package/src/app/shared/directives/ng-var.directive.ts +0 -32
  922. package/src/app/shared/directives/resizable/resizable.component.ts +0 -47
  923. package/src/app/shared/directives/resizable/resizable.directive.ts +0 -43
  924. package/src/app/shared/directives/resizable/resizable.module.ts +0 -9
  925. package/src/app/shared/directives/resizable/resizable.style.scss +0 -44
  926. package/src/app/shared/directives/resizable/resizable.template.html +0 -6
  927. package/src/app/shared/events.ts +0 -96
  928. package/src/app/shared/file/csv.utils.ts +0 -94
  929. package/src/app/shared/file/file.service.ts +0 -132
  930. package/src/app/shared/file/file.utils.ts +0 -138
  931. package/src/app/shared/file/images.utils.ts +0 -198
  932. package/src/app/shared/file/json.utils.ts +0 -73
  933. package/src/app/shared/file/uri.utils.ts +0 -25
  934. package/src/app/shared/focusable.ts +0 -10
  935. package/src/app/shared/form/field.component.html +0 -261
  936. package/src/app/shared/form/field.component.scss +0 -7
  937. package/src/app/shared/form/field.component.ts +0 -318
  938. package/src/app/shared/form/field.model.ts +0 -64
  939. package/src/app/shared/form/loading-spinner.ts +0 -16
  940. package/src/app/shared/forms.ts +0 -458
  941. package/src/app/shared/functions.ts +0 -492
  942. package/src/app/shared/geolocation/geolocation.utils.ts +0 -101
  943. package/src/app/shared/gesture/gesture-config.ts +0 -45
  944. package/src/app/shared/gesture/hammer.utils.ts +0 -14
  945. package/src/app/shared/graph/colors.utils.ts +0 -74
  946. package/src/app/shared/graph/graph-colors.ts +0 -295
  947. package/src/app/shared/guard/component-dirty.guard.ts +0 -70
  948. package/src/app/shared/help/help.modal.html +0 -42
  949. package/src/app/shared/help/help.modal.ts +0 -61
  950. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.html +0 -11
  951. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.scss +0 -39
  952. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.ts +0 -16
  953. package/src/app/shared/hotkeys/hotkeys.service.ts +0 -89
  954. package/src/app/shared/hotkeys/shared-hotkeys.module.ts +0 -27
  955. package/src/app/shared/http/http.utils.ts +0 -89
  956. package/src/app/shared/image/gallery/image-gallery.component.html +0 -231
  957. package/src/app/shared/image/gallery/image-gallery.component.scss +0 -196
  958. package/src/app/shared/image/gallery/image-gallery.component.ts +0 -389
  959. package/src/app/shared/image/gallery/image-gallery.module.ts +0 -34
  960. package/src/app/shared/image/gallery/testing/gallegry.model.testing.ts +0 -27
  961. package/src/app/shared/image/gallery/testing/gallery.service.testing.ts +0 -102
  962. package/src/app/shared/image/gallery/testing/gallery.testing.html +0 -15
  963. package/src/app/shared/image/gallery/testing/gallery.testing.module.ts +0 -39
  964. package/src/app/shared/image/gallery/testing/gallery.testing.ts +0 -38
  965. package/src/app/shared/image/image.model.ts +0 -6
  966. package/src/app/shared/image/image.module.ts +0 -16
  967. package/src/app/shared/image/image.service.ts +0 -94
  968. package/src/app/shared/image/image.testing.module.ts +0 -23
  969. package/src/app/shared/inputs.ts +0 -282
  970. package/src/app/shared/interceptors/progess.interceptor.ts +0 -25
  971. package/src/app/shared/logging/log-level.model.ts +0 -53
  972. package/src/app/shared/logging/logger.model.ts +0 -120
  973. package/src/app/shared/logging/logging-service.class.ts +0 -134
  974. package/src/app/shared/logging/logging-service.config.ts +0 -29
  975. package/src/app/shared/logging/logging-service.module.ts +0 -22
  976. package/src/app/shared/material/autocomplete/material.autocomplete.config.ts +0 -83
  977. package/src/app/shared/material/autocomplete/material.autocomplete.html +0 -262
  978. package/src/app/shared/material/autocomplete/material.autocomplete.module.ts +0 -45
  979. package/src/app/shared/material/autocomplete/material.autocomplete.scss +0 -21
  980. package/src/app/shared/material/autocomplete/material.autocomplete.ts +0 -1022
  981. package/src/app/shared/material/autocomplete/material.autocomplete.utils.ts +0 -20
  982. package/src/app/shared/material/autocomplete/testing/autocomplete.test.html +0 -876
  983. package/src/app/shared/material/autocomplete/testing/autocomplete.test.spec.ts +0 -38
  984. package/src/app/shared/material/autocomplete/testing/autocomplete.test.ts +0 -247
  985. package/src/app/shared/material/badge/badge.directive.ts +0 -164
  986. package/src/app/shared/material/badge/badge.module.ts +0 -22
  987. package/src/app/shared/material/badge/badge.test.html +0 -261
  988. package/src/app/shared/material/badge/badge.test.ts +0 -36
  989. package/src/app/shared/material/boolean/boolean.module.ts +0 -40
  990. package/src/app/shared/material/boolean/material.boolean.html +0 -155
  991. package/src/app/shared/material/boolean/material.boolean.scss +0 -34
  992. package/src/app/shared/material/boolean/material.boolean.ts +0 -239
  993. package/src/app/shared/material/chips/chips.module.ts +0 -44
  994. package/src/app/shared/material/chips/material.chips.html +0 -146
  995. package/src/app/shared/material/chips/material.chips.scss +0 -65
  996. package/src/app/shared/material/chips/material.chips.ts +0 -768
  997. package/src/app/shared/material/chips/testing/chips.test.html +0 -137
  998. package/src/app/shared/material/chips/testing/chips.test.ts +0 -175
  999. package/src/app/shared/material/datetime/datetime.module.ts +0 -52
  1000. package/src/app/shared/material/datetime/material.date.html +0 -132
  1001. package/src/app/shared/material/datetime/material.date.scss +0 -17
  1002. package/src/app/shared/material/datetime/material.date.ts +0 -408
  1003. package/src/app/shared/material/datetime/material.dateshort.html +0 -134
  1004. package/src/app/shared/material/datetime/material.dateshort.scss +0 -23
  1005. package/src/app/shared/material/datetime/material.dateshort.ts +0 -422
  1006. package/src/app/shared/material/datetime/material.datetime.html +0 -224
  1007. package/src/app/shared/material/datetime/material.datetime.scss +0 -90
  1008. package/src/app/shared/material/datetime/material.datetime.ts +0 -575
  1009. package/src/app/shared/material/datetime/testing/mat-date-time.test.html +0 -354
  1010. package/src/app/shared/material/datetime/testing/mat-date-time.test.ts +0 -134
  1011. package/src/app/shared/material/datetime/testing/mat-date.test.html +0 -418
  1012. package/src/app/shared/material/datetime/testing/mat-date.test.ts +0 -135
  1013. package/src/app/shared/material/datetime/testing/mat-dateshort.test.html +0 -370
  1014. package/src/app/shared/material/datetime/testing/mat-dateshort.test.ts +0 -127
  1015. package/src/app/shared/material/duration/duration.module.ts +0 -39
  1016. package/src/app/shared/material/duration/duration.utils.ts +0 -41
  1017. package/src/app/shared/material/duration/material.duration.html +0 -44
  1018. package/src/app/shared/material/duration/material.duration.scss +0 -28
  1019. package/src/app/shared/material/duration/material.duration.ts +0 -294
  1020. package/src/app/shared/material/latlong/latlong.utils.ts +0 -300
  1021. package/src/app/shared/material/latlong/material.latlong.html +0 -127
  1022. package/src/app/shared/material/latlong/material.latlong.module.ts +0 -40
  1023. package/src/app/shared/material/latlong/material.latlong.scss +0 -48
  1024. package/src/app/shared/material/latlong/material.latlong.ts +0 -421
  1025. package/src/app/shared/material/latlong/testing/latlong.test.html +0 -341
  1026. package/src/app/shared/material/latlong/testing/latlong.test.ts +0 -121
  1027. package/src/app/shared/material/material.animations.ts +0 -129
  1028. package/src/app/shared/material/material.module.ts +0 -94
  1029. package/src/app/shared/material/material.testing.module.ts +0 -135
  1030. package/src/app/shared/material/memory/memory.utils.ts +0 -54
  1031. package/src/app/shared/material/numpad/numpad.animation.ts +0 -1
  1032. package/src/app/shared/material/numpad/numpad.append-to-input.directive.ts +0 -109
  1033. package/src/app/shared/material/numpad/numpad.component.ts +0 -78
  1034. package/src/app/shared/material/numpad/numpad.container.html +0 -32
  1035. package/src/app/shared/material/numpad/numpad.container.scss +0 -50
  1036. package/src/app/shared/material/numpad/numpad.container.ts +0 -176
  1037. package/src/app/shared/material/numpad/numpad.content.html +0 -13
  1038. package/src/app/shared/material/numpad/numpad.content.ts +0 -10
  1039. package/src/app/shared/material/numpad/numpad.directive.ts +0 -173
  1040. package/src/app/shared/material/numpad/numpad.dom-service.ts +0 -46
  1041. package/src/app/shared/material/numpad/numpad.model.ts +0 -55
  1042. package/src/app/shared/material/numpad/numpad.module.ts +0 -38
  1043. package/src/app/shared/material/numpad/testing/numpad.test.html +0 -146
  1044. package/src/app/shared/material/numpad/testing/numpad.test.ts +0 -55
  1045. package/src/app/shared/material/paginator/material.paginator-i18n.ts +0 -49
  1046. package/src/app/shared/material/stepper/material.stepper-i18n.ts +0 -18
  1047. package/src/app/shared/material/swipe/material.swipe.html +0 -63
  1048. package/src/app/shared/material/swipe/material.swipe.scss +0 -39
  1049. package/src/app/shared/material/swipe/material.swipe.ts +0 -350
  1050. package/src/app/shared/material/swipe/swipe.module.ts +0 -33
  1051. package/src/app/shared/material/swipe/testing/swipe.test.html +0 -128
  1052. package/src/app/shared/material/swipe/testing/swipe.test.ts +0 -81
  1053. package/src/app/shared/modules.ts +0 -11
  1054. package/src/app/shared/observables.ts +0 -132
  1055. package/src/app/shared/pipes/arrays.pipe.ts +0 -111
  1056. package/src/app/shared/pipes/colors.pipe.ts +0 -19
  1057. package/src/app/shared/pipes/date-diff-duration.pipe.ts +0 -48
  1058. package/src/app/shared/pipes/date-format.pipe.ts +0 -78
  1059. package/src/app/shared/pipes/date-from-now.pipe.ts +0 -20
  1060. package/src/app/shared/pipes/duration.pipe.spec.ts +0 -51
  1061. package/src/app/shared/pipes/duration.pipe.ts +0 -34
  1062. package/src/app/shared/pipes/file-size.pipe.ts +0 -58
  1063. package/src/app/shared/pipes/form.pipes.ts +0 -204
  1064. package/src/app/shared/pipes/highlight.pipe.ts +0 -37
  1065. package/src/app/shared/pipes/latlong-format.pipe.ts +0 -30
  1066. package/src/app/shared/pipes/maps.pipe.ts +0 -39
  1067. package/src/app/shared/pipes/math.pipes.ts +0 -39
  1068. package/src/app/shared/pipes/ng-init.pipe.ts +0 -14
  1069. package/src/app/shared/pipes/number-format.pipe.ts +0 -21
  1070. package/src/app/shared/pipes/pipes.module.ts +0 -134
  1071. package/src/app/shared/pipes/property.pipes.ts +0 -87
  1072. package/src/app/shared/pipes/string.pipes.ts +0 -85
  1073. package/src/app/shared/pipes/translate-context.pipe.ts +0 -33
  1074. package/src/app/shared/pipes/types.pipes.ts +0 -31
  1075. package/src/app/shared/platforms.ts +0 -58
  1076. package/src/app/shared/services/entity-service.class.ts +0 -127
  1077. package/src/app/shared/services/job.utils.ts +0 -121
  1078. package/src/app/shared/services/memory-entity-service.class.ts +0 -447
  1079. package/src/app/shared/services/progress-bar.service.ts +0 -42
  1080. package/src/app/shared/services/startable-observable-service.class.ts +0 -137
  1081. package/src/app/shared/services/startable-service.class.ts +0 -131
  1082. package/src/app/shared/services/storage.utils.ts +0 -47
  1083. package/src/app/shared/services/translate-context.service.ts +0 -116
  1084. package/src/app/shared/services/validator-service.class.ts +0 -14
  1085. package/src/app/shared/services.ts +0 -91
  1086. package/src/app/shared/shared-routing.module.ts +0 -66
  1087. package/src/app/shared/shared.module.spec.ts +0 -13
  1088. package/src/app/shared/shared.module.ts +0 -146
  1089. package/src/app/shared/shared.testing.module.ts +0 -50
  1090. package/src/app/shared/storage/storage-explorer.component.html +0 -175
  1091. package/src/app/shared/storage/storage-explorer.component.scss +0 -39
  1092. package/src/app/shared/storage/storage-explorer.component.spec.ts +0 -24
  1093. package/src/app/shared/storage/storage-explorer.component.ts +0 -292
  1094. package/src/app/shared/storage/storage-explorer.module.ts +0 -44
  1095. package/src/app/shared/storage/storage.service.ts +0 -133
  1096. package/src/app/shared/storage/storage.utils.ts +0 -25
  1097. package/src/app/shared/testing/observable.test.html +0 -53
  1098. package/src/app/shared/testing/observable.test.scss +0 -3
  1099. package/src/app/shared/testing/observable.test.ts +0 -117
  1100. package/src/app/shared/testing/tests.page.html +0 -30
  1101. package/src/app/shared/testing/tests.page.ts +0 -34
  1102. package/src/app/shared/toast/toast.testing.html +0 -42
  1103. package/src/app/shared/toast/toast.testing.module.ts +0 -32
  1104. package/src/app/shared/toast/toast.testing.ts +0 -58
  1105. package/src/app/shared/toast/toasts.ts +0 -183
  1106. package/src/app/shared/toolbar/modal-toolbar.html +0 -32
  1107. package/src/app/shared/toolbar/modal-toolbar.scss +0 -0
  1108. package/src/app/shared/toolbar/modal-toolbar.ts +0 -63
  1109. package/src/app/shared/toolbar/toolbar.html +0 -71
  1110. package/src/app/shared/toolbar/toolbar.module.ts +0 -35
  1111. package/src/app/shared/toolbar/toolbar.scss +0 -0
  1112. package/src/app/shared/toolbar/toolbar.ts +0 -254
  1113. package/src/app/shared/types.ts +0 -31
  1114. package/src/app/shared/upload-file/testing/upload-file.testing.html +0 -25
  1115. package/src/app/shared/upload-file/testing/upload-file.testing.module.ts +0 -32
  1116. package/src/app/shared/upload-file/testing/upload-file.testing.ts +0 -68
  1117. package/src/app/shared/upload-file/upload-file-popover.component.html +0 -43
  1118. package/src/app/shared/upload-file/upload-file-popover.component.scss +0 -6
  1119. package/src/app/shared/upload-file/upload-file-popover.component.ts +0 -115
  1120. package/src/app/shared/upload-file/upload-file.component.html +0 -46
  1121. package/src/app/shared/upload-file/upload-file.component.scss +0 -130
  1122. package/src/app/shared/upload-file/upload-file.component.ts +0 -218
  1123. package/src/app/shared/upload-file/upload-file.model.ts +0 -41
  1124. package/src/app/shared/validator/form-error-adapter.class.ts +0 -123
  1125. package/src/app/shared/validator/validators.ts +0 -639
  1126. package/src/app/shared/version/versions.ts +0 -91
  1127. package/src/app/social/job/job.module.ts +0 -26
  1128. package/src/app/social/job/progression/job-progression.component.html +0 -22
  1129. package/src/app/social/job/progression/job-progression.component.scss +0 -15
  1130. package/src/app/social/job/progression/job-progression.component.ts +0 -17
  1131. package/src/app/social/job/progression/job-progression.icon.html +0 -28
  1132. package/src/app/social/job/progression/job-progression.icon.scss +0 -5
  1133. package/src/app/social/job/progression/job-progression.icon.ts +0 -238
  1134. package/src/app/social/job/progression/job-progression.list.html +0 -21
  1135. package/src/app/social/job/progression/job-progression.list.scss +0 -17
  1136. package/src/app/social/job/progression/job-progression.list.ts +0 -49
  1137. package/src/app/social/job/progression/job-progression.model.ts +0 -28
  1138. package/src/app/social/job/progression/job-progression.service.ts +0 -86
  1139. package/src/app/social/job/testing/job-progression.testing.html +0 -20
  1140. package/src/app/social/job/testing/job-progression.testing.service.ts +0 -60
  1141. package/src/app/social/job/testing/job-progression.testing.ts +0 -51
  1142. package/src/app/social/job/testing/job.testing.module.ts +0 -22
  1143. package/src/app/social/message/message.form.html +0 -60
  1144. package/src/app/social/message/message.form.scss +0 -6
  1145. package/src/app/social/message/message.form.ts +0 -79
  1146. package/src/app/social/message/message.modal.html +0 -65
  1147. package/src/app/social/message/message.modal.ts +0 -118
  1148. package/src/app/social/message/message.model.ts +0 -81
  1149. package/src/app/social/message/message.module.ts +0 -22
  1150. package/src/app/social/message/message.service.ts +0 -88
  1151. package/src/app/social/social.errors.ts +0 -11
  1152. package/src/app/social/social.module.ts +0 -36
  1153. package/src/app/social/social.testing.module.ts +0 -40
  1154. package/src/app/social/user-event/notification/user-event-notification.icon.html +0 -16
  1155. package/src/app/social/user-event/notification/user-event-notification.icon.ts +0 -108
  1156. package/src/app/social/user-event/notification/user-event-notification.list.html +0 -135
  1157. package/src/app/social/user-event/notification/user-event-notification.list.scss +0 -73
  1158. package/src/app/social/user-event/notification/user-event-notification.list.ts +0 -287
  1159. package/src/app/social/user-event/testing/user-event.testing.html +0 -27
  1160. package/src/app/social/user-event/testing/user-event.testing.model.ts +0 -146
  1161. package/src/app/social/user-event/testing/user-event.testing.module.ts +0 -22
  1162. package/src/app/social/user-event/testing/user-event.testing.service.ts +0 -141
  1163. package/src/app/social/user-event/testing/user-event.testing.ts +0 -253
  1164. package/src/app/social/user-event/user-event.model.ts +0 -73
  1165. package/src/app/social/user-event/user-event.module.ts +0 -25
  1166. package/src/app/social/user-event/user-event.service.ts +0 -679
  1167. package/src/browserslist +0 -9
  1168. package/src/environments/environment.class.ts +0 -83
  1169. package/src/environments/environment.prod.ts +0 -47
  1170. package/src/environments/environment.test.ts +0 -90
  1171. package/src/environments/environment.ts +0 -108
  1172. package/src/favicon.ico +0 -0
  1173. package/src/global.scss +0 -27
  1174. package/src/index.html +0 -80
  1175. package/src/main.ts +0 -17
  1176. package/src/polyfills.ts +0 -68
  1177. package/src/schema.graphql +0 -3112
  1178. package/src/service-worker.js +0 -31
  1179. package/src/zone-flags.ts +0 -31
  1180. package/tsconfig.app.json +0 -15
  1181. package/tsconfig.json +0 -47
  1182. package/tsconfig.spec.json +0 -19
@@ -1,1973 +0,0 @@
1
- import {AfterViewInit, Directive, EventEmitter, Injector, Input, OnDestroy, OnInit, Output, ViewChild} from '@angular/core';
2
- import {MatPaginator} from '@angular/material/paginator';
3
- import {MatSort, MatSortable, SortDirection} from '@angular/material/sort';
4
- import {MatTable} from '@angular/material/table';
5
- import {BehaviorSubject, EMPTY, merge, Observable, of, Subject, Subscription} from 'rxjs';
6
- import {catchError, debounceTime, distinctUntilChanged, filter, first, mergeMap, startWith, switchMap, takeUntil, tap} from 'rxjs/operators';
7
- import {TableElement} from '@e-is/ngx-material-table';
8
- import {EntitiesTableDataSource} from './entities-table-datasource.class';
9
- import {SelectionModel} from '@angular/cdk/collections';
10
- import {EntityUtils, IEntity} from '../services/model/entity.model';
11
- import {AlertController, ModalController, NavController, ToastController} from '@ionic/angular';
12
- import {ActivatedRoute, Router} from '@angular/router';
13
- import {ColumnItem, TableSelectColumnsComponent} from './table-select-columns.component';
14
- import {Location} from '@angular/common';
15
- import {ErrorCodes} from '../services/errors';
16
- import {AppFormUtils, IAppForm, OnReady} from '../form/form.utils';
17
- import {LocalSettingsService} from '../services/local-settings.service';
18
- import {TranslateService} from '@ngx-translate/core';
19
- import {MatAutocompleteConfigHolder, MatAutocompleteFieldAddOptions, MatAutocompleteFieldConfig} from '../../shared/material/autocomplete/material.autocomplete.config';
20
- import {CompletableEvent, createPromiseEventEmitter, emitPromiseEvent} from '../../shared/events';
21
- import {changeCaseToUnderscore, isEmptyArray, isNil, isNotNil, toBoolean} from '../../shared/functions';
22
- import {waitFor, waitForFalse, WaitForOptions, waitForTrue} from '../../shared/observables';
23
- import {ShowToastOptions, Toasts} from '../../shared/toast/toasts';
24
- import {Alerts} from '../../shared/alerts';
25
- import {CdkColumnDef} from '@angular/cdk/table';
26
- import {LoadResult} from '../../shared/services/entity-service.class';
27
- import {FormErrorTranslator, FormErrorTranslatorOptions, IFormControlPathTranslator} from '../../shared/validator/form-error-adapter.class';
28
- import {
29
- CellValueChangeListener,
30
- DEFAULT_PAGE_SIZE,
31
- DEFAULT_PAGE_SIZE_OPTIONS,
32
- DEFAULT_REQUIRED_COLUMNS,
33
- RESERVED_END_COLUMNS,
34
- RESERVED_START_COLUMNS,
35
- SaveActionType,
36
- SETTINGS_DISPLAY_COLUMNS,
37
- SETTINGS_PAGE_SIZE,
38
- SETTINGS_SORTED_COLUMN
39
- } from './table.model';
40
- import {AppTableUtils} from './table.utils';
41
-
42
- // @dynamic
43
- @Directive()
44
- // eslint-disable-next-line @angular-eslint/directive-class-suffix
45
- export abstract class AppTable<T extends IEntity<T, ID>,
46
- F = any,
47
- ID = number>
48
- implements OnInit, OnDestroy, AfterViewInit, IAppForm, IFormControlPathTranslator {
49
-
50
- private _initialized = false;
51
- private _subscription = new Subscription();
52
- private _dataSourceLoadingSubscription: Subscription;
53
-
54
- private _cellValueChangesDefs: {
55
- [key: string]: CellValueChangeListener;
56
- } = {};
57
-
58
- protected _enabled = true;
59
- protected _autocompleteConfigHolder: MatAutocompleteConfigHolder;
60
- protected allowRowDetail = true;
61
- protected route: ActivatedRoute;
62
- protected router: Router;
63
- protected navController: NavController;
64
- protected location: Location;
65
- protected settings: LocalSettingsService;
66
- protected translate: TranslateService;
67
- protected modalCtrl: ModalController;
68
- protected alertCtrl: AlertController;
69
- protected toastController: ToastController;
70
- protected previouslyEditedRowId: number;
71
- protected formErrorAdapter: FormErrorTranslator;
72
- protected readonly destroySubject = new Subject<void>();
73
-
74
- excludesColumns: string[] = [];
75
- displayedColumns: string[];
76
- totalRowCount: number | null = null;
77
- visibleRowCount: number;
78
- errorTranslatorOptions: FormErrorTranslatorOptions;
79
-
80
- readonly readySubject = new BehaviorSubject<boolean>(false);
81
- readonly loadingSubject = new BehaviorSubject<boolean>(true);
82
- readonly savingSubject = new BehaviorSubject<boolean>(false);
83
- readonly touchedSubject = new BehaviorSubject<boolean>(false);
84
- readonly dirtySubject = new BehaviorSubject<boolean>(false);
85
- readonly errorSubject = new BehaviorSubject<string>(undefined);
86
-
87
- get error(): string {
88
- return this.errorSubject.value;
89
- }
90
-
91
- /**
92
- * @deprecated
93
- */
94
- get error$(): Observable<string> {
95
- return this.errorSubject.asObservable();
96
- }
97
-
98
-
99
- set error(error: string) {
100
- this.setError(error);
101
- }
102
-
103
- selection = new SelectionModel<TableElement<T>>(true, []);
104
- permanentSelection: SelectionModel<T> = null;
105
- permanentSelectionChangedPrevented = false;
106
- editedRow: TableElement<T> = undefined;
107
- autocompleteFields: {[key: string]: MatAutocompleteFieldConfig};
108
- readonly mobile: boolean;
109
-
110
- // Table options
111
- @Input() settingsId: string;
112
- @Input() debug: boolean;
113
- @Input() i18nColumnPrefix = 'COMMON.';
114
- @Input() i18nColumnSuffix: string;
115
- @Input() autoLoad = true;
116
- @Input() readOnly: boolean;
117
- @Input() inlineEdition: boolean;
118
- @Input() focusFirstColumn = false;
119
- @Input() confirmBeforeDelete = false;
120
- @Input() confirmBeforeCancel = false;
121
- @Input() undoableDeletion = false;
122
- @Input() saveBeforeDelete: boolean;
123
- @Input() keepEditedRowOnSave: boolean;
124
- @Input() saveBeforeSort: boolean;
125
- @Input() saveBeforeFilter: boolean;
126
- @Input() propagateRowError = false;
127
- @Input() permanentSelectionAllowed = false; // Allow keep selected rows over page change or sort change
128
-
129
- @Input() defaultSortBy: string;
130
- @Input() defaultSortDirection: SortDirection;
131
- @Input() defaultPageSize = DEFAULT_PAGE_SIZE;
132
- @Input() defaultPageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS;
133
-
134
- // Focus manager
135
- @Input() focusColumn: string;
136
-
137
- get firstUserColumn(): string {
138
- return this.displayedColumns[RESERVED_START_COLUMNS.length];
139
- }
140
-
141
- get lastUserColumn(): string {
142
- return this.displayedColumns[this.displayedColumns.length - RESERVED_END_COLUMNS.length - 1];
143
- }
144
-
145
- @Input() set dataSource(value: EntitiesTableDataSource<T, F, ID>) {
146
- this.setDatasource(value);
147
- }
148
-
149
- get dataSource(): EntitiesTableDataSource<T, F, ID> {
150
- return this._dataSource;
151
- }
152
-
153
- @Input() set filter(value: F) {
154
- this.setFilter(value);
155
- }
156
-
157
- get filter(): F {
158
- return this._filter;
159
- }
160
-
161
- get empty(): boolean {
162
- return this.loading || this.totalRowCount === 0;
163
- }
164
-
165
- get selectedEntities(): T[] {
166
- return this.permanentSelection?.selected
167
- || AppTableUtils.getEntities(this.selection.selected);
168
- }
169
-
170
- @Output() onRefresh = new EventEmitter<any>();
171
- @Output() onOpenRow = new EventEmitter<TableElement<T>>();
172
- @Output() onNewRow = new EventEmitter<any>();
173
- @Output() onStartEditingRow = new EventEmitter<TableElement<T>>();
174
- @Output() onConfirmEditCreateRow = new EventEmitter<TableElement<T>>();
175
- @Output() onCancelOrDeleteRow = new EventEmitter<TableElement<T>>();
176
- @Output() onBeforeDeleteRows = createPromiseEventEmitter<boolean, {rows: TableElement<T>[]}>();
177
- @Output() onBeforeCancelRows = createPromiseEventEmitter<boolean, {rows: TableElement<T>[]}>();
178
- @Output() onBeforeSave = createPromiseEventEmitter<{confirmed: boolean; save: boolean}, {action: SaveActionType; valid: boolean}>();
179
- @Output() onAfterDeletedRows = new EventEmitter<TableElement<T>[]>();
180
- @Output() onSort = new EventEmitter<any>();
181
- @Output() onDirty = new EventEmitter<boolean>();
182
- @Output() onError = new EventEmitter<string>();
183
-
184
- get dirty(): boolean {
185
- return this.dirtySubject.value;
186
- }
187
-
188
- get valid(): boolean {
189
- return this.editedRow && this.editedRow.editing ? this.editedRow.validator?.valid : true;
190
- }
191
-
192
- get invalid(): boolean {
193
- return this.editedRow && this.editedRow.editing ? this.editedRow.validator?.invalid : false;
194
- }
195
-
196
- get pending(): boolean {
197
- return this.editedRow && this.editedRow.editing ? this.editedRow.validator?.pending : false;
198
- }
199
-
200
- get touched(): boolean {
201
- return this.touchedSubject.value;
202
- }
203
-
204
- get untouched(): boolean {
205
- return !this.touchedSubject.value;
206
- }
207
-
208
- disable(opts?: {onlySelf?: boolean; emitEvent?: boolean }) {
209
- if (this.sort) this.sort.disabled = true;
210
- this._enabled = false;
211
- if (!opts || opts.emitEvent != false) this.markForCheck();
212
- }
213
-
214
- enable(opts?: {onlySelf?: boolean; emitEvent?: boolean }) {
215
- if (this.sort) this.sort.disabled = false;
216
- this._enabled = true;
217
- if (!opts || opts.emitEvent != false) this.markForCheck();
218
- }
219
-
220
- get enabled(): boolean {
221
- return this._enabled;
222
- }
223
-
224
- // FIXME: need to hidden buttons (in HTML), etc. when disabled
225
- @Input() set disabled(value: boolean) {
226
- if (value !== !this._enabled) {
227
- if (value) this.disable({emitEvent: false});
228
- else this.enable({emitEvent: false});
229
- }
230
- }
231
-
232
- get disabled(): boolean {
233
- return !this._enabled;
234
- }
235
-
236
- markAsDirty(opts?: {onlySelf?: boolean; emitEvent?: boolean }) {
237
- if (this.dirtySubject.value !== true) {
238
- this.dirtySubject.next(true);
239
- if (!opts || opts.emitEvent !== false) {
240
- this.markForCheck();
241
- }
242
- }
243
- }
244
-
245
- markAsPristine(opts?: {onlySelf?: boolean; emitEvent?: boolean }) {
246
- if (this.dirtySubject.value !== false) {
247
- this.dirtySubject.next(false);
248
- if (!opts || opts.emitEvent !== false) {
249
- this.markForCheck();
250
- }
251
- }
252
- }
253
-
254
- markAsUntouched(opts?: {onlySelf?: boolean; emitEvent?: boolean }) {
255
- let needEmitEvent = false;
256
- if (this.touchedSubject.value) {
257
- this.touchedSubject.next(false);
258
- needEmitEvent = true;
259
- }
260
- if (this.dirty || (this.editedRow && this.editedRow.id !== this.previouslyEditedRowId)) {
261
- // Cancel the current editing row only if editing and if it was not previously saved
262
- if (this.editedRow?.editing) {
263
- this.dataSource.cancelOrDelete(this.editedRow);
264
-
265
- // Mark row as pristine
266
- this.checkIfRowPristine(this.editedRow, {emitEvent: false});
267
- }
268
- this.editedRow = null;
269
- needEmitEvent = true;
270
- }
271
- this.previouslyEditedRowId = undefined;
272
- if (needEmitEvent && (!opts || opts.emitEvent !== false)) this.markForCheck();
273
- }
274
-
275
- /**
276
- * @deprecated prefer to use markAllAsTouched()
277
- * @param opts
278
- */
279
- markAsTouched(opts?: {onlySelf?: boolean; emitEvent?: boolean }) {
280
- console.warn('TODO: Replace this call by markAllAsTouched() - because of changes in ngx-components >= 0.16.0');
281
- if (this.editedRow?.editing) {
282
- this.editedRow.validator?.markAllAsTouched();
283
- if (!opts || opts.emitEvent !== false) {
284
- this.markForCheck();
285
- }
286
- }
287
- }
288
-
289
- markAllAsTouched(opts?: { emitEvent?: boolean }) {
290
- if (this.touchedSubject.value !== true) {
291
- this.touchedSubject.next(true);
292
- if (!opts || opts.emitEvent !== false) this.markForCheck();
293
- }
294
- if (this.editedRow?.editing) {
295
- this.editedRow.validator?.markAllAsTouched();
296
- }
297
- }
298
-
299
- markAsSaving(opts?: { emitEvent?: boolean }) {
300
- if (this.savingSubject.value !== true) {
301
- this.focusColumn = undefined; // unselect focus column
302
- this.savingSubject.next(true);
303
- if (!opts || opts.emitEvent !== false) this.markForCheck();
304
- }
305
- }
306
-
307
- markAsSaved(opts?: { emitEvent?: boolean }) {
308
- if (this.savingSubject.value !== false) {
309
- this.savingSubject.next(false);
310
- if (!opts || opts.emitEvent !== false) this.markForCheck();
311
- }
312
- }
313
-
314
- markAsLoading(opts?: {emitEvent?: boolean}) {
315
- this.setLoading(true, opts);
316
- }
317
-
318
- markAsLoaded(opts?: {emitEvent?: boolean}) {
319
- this.setLoading(false, opts);
320
- }
321
-
322
- markAsReady(opts?: { emitEvent?: boolean }) {
323
- if (this.readySubject.value !== true) {
324
- this.readySubject.next(true);
325
-
326
- // If subclasses implements OnReady
327
- if (typeof this['ngOnReady'] === 'function') {
328
- (this as any as OnReady).ngOnReady();
329
- }
330
- }
331
- }
332
-
333
- get loading(): boolean {
334
- return this.loadingSubject.value;
335
- }
336
-
337
- get loaded(): boolean {
338
- return !this.loadingSubject.value;
339
- }
340
-
341
- enableSort() {
342
- if (this.sort) this.sort.disabled = false;
343
- }
344
-
345
- disableSort() {
346
- if (this.sort) this.sort.disabled = true;
347
- }
348
-
349
- set pageSize(value: number) {
350
- this.defaultPageSize = value;
351
- if (this.paginator) {
352
- this.paginator.pageSize = value;
353
- }
354
- }
355
-
356
- get pageSize(): number {
357
- return this.paginator && this.paginator.pageSize || this.defaultPageSize || DEFAULT_PAGE_SIZE;
358
- }
359
-
360
- get pageOffset(): number {
361
- return this.paginator && this.paginator.pageIndex * this.paginator.pageSize || 0;
362
- }
363
-
364
- get sortActive(): string {
365
- return this.sort && this.sort.active;
366
- }
367
-
368
- get sortDirection(): 'asc' | 'desc' {
369
- return this.sort && this.sort.direction && (this.sort.direction === 'desc' ? 'desc' : 'asc') || undefined;
370
- }
371
-
372
- private _paginator: MatPaginator | null = null;
373
-
374
- @Input() set paginator(value: MatPaginator) {
375
- this._paginator = value;
376
- }
377
-
378
- get paginator(): MatPaginator {
379
- return this._paginator || this.childPaginator;
380
- }
381
-
382
- get destroyed(): boolean {
383
- return this.destroySubject?.closed !== false;
384
- }
385
-
386
- @ViewChild(MatTable, {static: false}) table: MatTable<T>;
387
- @ViewChild(MatPaginator, {static: false}) childPaginator: MatPaginator;
388
- @ViewChild(MatSort, {static: false}) sort: MatSort;
389
-
390
- protected constructor(
391
- injector: Injector,
392
- protected columns: string[],
393
- protected _dataSource?: EntitiesTableDataSource<T, F, ID>,
394
- private _filter?: F
395
- ) {
396
- this.route = injector.get(ActivatedRoute);
397
- this.router = injector.get(Router);
398
- this.navController = injector.get(NavController);
399
- this.location = injector.get(Location);
400
- this.settings = injector.get(LocalSettingsService);
401
- this.translate = injector.get(TranslateService);
402
- this.modalCtrl = injector.get(ModalController);
403
- this.alertCtrl = injector.get(AlertController);
404
- this.toastController = injector.get(ToastController);
405
- this.formErrorAdapter = injector.get(FormErrorTranslator);
406
- this.mobile = this.settings.mobile;
407
-
408
- // Autocomplete fields
409
- this._autocompleteConfigHolder = new MatAutocompleteConfigHolder({
410
- getUserAttributes: (a, b) => this.settings.getFieldDisplayAttributes(a, b)
411
- });
412
- this.autocompleteFields = this._autocompleteConfigHolder.fields;
413
- }
414
-
415
- ngOnInit() {
416
- if (this._initialized) return; // Init only once
417
- this._initialized = true;
418
-
419
- // Set defaults
420
- this.readOnly = toBoolean(this.readOnly, this.dataSource?.config.readOnly || false); // read/write by default
421
- this.inlineEdition = !this.readOnly && toBoolean(this.inlineEdition, false); // force to false when readonly
422
- this.saveBeforeDelete = toBoolean(this.saveBeforeDelete, !this.readOnly); // force to false when readonly
423
- this.saveBeforeSort = toBoolean(this.saveBeforeSort, !this.readOnly); // force to false when readonly
424
- this.saveBeforeFilter = toBoolean(this.saveBeforeFilter, !this.readOnly); // force to false when readonly
425
- this.keepEditedRowOnSave = toBoolean(this.keepEditedRowOnSave, this.inlineEdition);
426
- this.errorTranslatorOptions = this.errorTranslatorOptions || { separator: ', ', controlPathTranslator: this }; // Can be override in subclasses constructors
427
-
428
- // Check ask user confirmation is possible
429
- if (this.confirmBeforeDelete && !this.alertCtrl) throw Error('Missing \'alertCtrl\' or \'injector\' in component\'s constructor.');
430
-
431
- // Defined unique id for settings for the page
432
- this.settingsId = this.settingsId || this.generateTableId();
433
-
434
- this.displayedColumns = this.getDisplayColumns();
435
-
436
- // Load the sorted columns, from settings
437
- {
438
- const sortedColumn = this.getSortedColumn();
439
- this.defaultSortBy = sortedColumn.id;
440
- this.defaultSortDirection = sortedColumn.start;
441
- }
442
-
443
- this.defaultPageSize = this.getPageSize();
444
-
445
- // Propagate error to event emitter
446
- this.registerSubscription(this.errorSubject
447
- .subscribe(value => this.onError.emit(value)));
448
-
449
- // Propagate dirty to event emitter
450
- this.registerSubscription(this.dirtySubject
451
- .subscribe(value => this.onDirty.emit(value)));
452
-
453
- // Propagate row dirty state to table
454
- this.registerSubscription(
455
- this.onStartEditingRow
456
- .pipe(
457
- filter(row => row?.validator && true),
458
- mergeMap(row => row.validator.valueChanges
459
- .pipe(
460
- filter(row => row.dirty),
461
- first(),
462
- // DEBUG
463
- //tap(() => console.debug("Propagate row's dirty to table..."))
464
-
465
- // Stop if next another row, or destroying
466
- takeUntil(this.onStartEditingRow),
467
- takeUntil(this.destroySubject)
468
- ))
469
- )
470
- .subscribe(() => this.markAsDirty())
471
- );
472
-
473
- // Call datasource refresh, on each refresh events
474
- this.registerSubscription(
475
- this.onRefresh
476
- .pipe(
477
- startWith<any, any>((this.autoLoad ? {} : 'skip') as any),
478
- switchMap(
479
- (event: any) => {
480
- this.dirtySubject.next(false);
481
- this.selection.clear();
482
- if (event === 'skip') {
483
- return of(undefined);
484
- }
485
- if (!this._dataSource) {
486
- if (this.debug) console.debug('[table] Skipping data load: no dataSource defined');
487
- return of(undefined);
488
- }
489
- if (this.debug) console.debug('[table] Calling dataSource.watchAll()...');
490
- return this._dataSource.watchAll(
491
- this.pageOffset,
492
- this.pageSize,
493
- this.sortActive,
494
- this.sortDirection,
495
- this._filter
496
- );
497
- }),
498
- catchError(err => {
499
- if (this.debug) console.error(err);
500
- this.setError(err && err.message || err);
501
- return of(undefined); // Continue
502
- })
503
- )
504
- .subscribe(res => this.updateView(res as LoadResult<T> | undefined)));
505
-
506
- // Listen dataSource loading events
507
- if (this._dataSource) this.listenDatasourceLoading(this._dataSource);
508
-
509
- // Permanent selection behavior
510
- if (this.permanentSelectionAllowed) this.initPermanentSelection();
511
- }
512
-
513
- ngAfterViewInit() {
514
- // Detect when parent ngOnInit() not call
515
- if (this.debug && !this.displayedColumns) console.warn(`[table] Missing 'displayedColumns'. Did you call parent ngOnInit() in component ${this.constructor.name} ?`);
516
-
517
- // Start listening sort and paginator events
518
- // noinspection JSIgnoredPromiseFromCall
519
- this.listenSortAndPaginationEvents();
520
- }
521
-
522
- ngOnDestroy() {
523
- this._subscription.unsubscribe();
524
-
525
- // Unsubscribe column value changes
526
- Object.keys(this._cellValueChangesDefs).forEach(col => this.stopCellValueChanges(col, true));
527
- this._cellValueChangesDefs = {};
528
-
529
- this.readySubject.unsubscribe();
530
- this.loadingSubject.unsubscribe();
531
- this.savingSubject.unsubscribe();
532
- this.errorSubject.unsubscribe();
533
- this.dirtySubject.unsubscribe();
534
-
535
- this.onRefresh.unsubscribe();
536
- this.onOpenRow.unsubscribe();
537
- this.onNewRow.unsubscribe();
538
- this.onStartEditingRow.unsubscribe();
539
- this.onConfirmEditCreateRow.unsubscribe();
540
- this.onCancelOrDeleteRow.unsubscribe();
541
- this.onBeforeDeleteRows.unsubscribe();
542
- this.onBeforeCancelRows.unsubscribe();
543
- this.onBeforeSave.unsubscribe();
544
- this.onAfterDeletedRows.unsubscribe();
545
- this.onSort.unsubscribe();
546
- this.onDirty.unsubscribe();
547
- this.onError.unsubscribe();
548
-
549
- this.destroySubject.next();
550
- this.destroySubject.unsubscribe();
551
- }
552
-
553
- async updateView(res: LoadResult<T> | undefined, opts?: {
554
- emitEvent?: boolean;
555
- }): Promise<void> {
556
- if (!res) return; // Skip (e.g error)
557
- if (res && res.data) {
558
- this.visibleRowCount = res.data.length;
559
- this.totalRowCount = isNotNil(res.total) ? res.total : ((this.paginator && this.paginator.pageIndex * (this.paginator.pageSize || DEFAULT_PAGE_SIZE) || 0) + this.visibleRowCount);
560
- if (this.debug) console.debug(`[table] ${res.data.length} rows loaded`);
561
- } else {
562
- //if (this.debug) console.debug('[table] NO rows loaded');
563
- this.totalRowCount = 0;
564
- this.visibleRowCount = 0;
565
- }
566
-
567
- if (!opts || opts.emitEvent !== false) {
568
- this.markAsUntouched({emitEvent: false});
569
- this.markAsPristine({emitEvent: false});
570
- this.markAsLoaded({emitEvent: false});
571
- }
572
-
573
- this.markForCheck();
574
- }
575
-
576
- setDatasource(datasource: EntitiesTableDataSource<T, F, ID>) {
577
- if (this._dataSource) throw new Error('[table] dataSource already set !');
578
- if (datasource && this._dataSource !== datasource) {
579
- this._dataSource = datasource;
580
- if (this._initialized) this.listenDatasourceLoading(datasource);
581
- }
582
- }
583
-
584
- resetDataSource() {
585
- if (this._dataSourceLoadingSubscription) {
586
- this._dataSourceLoadingSubscription.unsubscribe();
587
- this._subscription.remove(this._dataSourceLoadingSubscription);
588
- }
589
- //this._dataSource?.close();
590
- this._dataSource = null;
591
- }
592
-
593
- addColumnDef(column: CdkColumnDef) {
594
- this.table.addColumnDef(column);
595
- }
596
-
597
- removeColumnDef(column: CdkColumnDef) {
598
- this.table.removeColumnDef(column);
599
- }
600
-
601
- setFilter(filter: F, opts?: { emitEvent?: boolean; permanentSelectionChangedPrevented?: boolean }) {
602
- opts = opts || { emitEvent: true };
603
-
604
- // Prevent permanent selection change events
605
- this.permanentSelectionChangedPrevented = toBoolean(opts.permanentSelectionChangedPrevented, this.permanentSelectionChangedPrevented);
606
-
607
- if (this.saveBeforeFilter) {
608
-
609
- // if a dirty table is to be saved before filter
610
- if (this.dirty) {
611
-
612
- // Save
613
- this.saveBeforeAction('filter').then(saved => {
614
- // Apply filter only if user didn't cancel the save or the save is ok
615
- if (saved) {
616
- this.applyFilter(filter, opts);
617
- }
618
- });
619
-
620
- } else {
621
- // apply filter on non-dirty table
622
- this.applyFilter(filter, opts);
623
- }
624
-
625
- } else {
626
-
627
- // apply filter directly
628
- this.applyFilter(filter, opts);
629
- }
630
- }
631
-
632
- confirmAndAdd(event?: Event, row?: TableElement<T>): Promise<boolean> {
633
- if (!this.confirmEditCreate(event, row)) {
634
- return Promise.resolve(false);
635
- }
636
- // Add row
637
- return this.addRow(event);
638
- }
639
-
640
- confirmAndBackward(event?: Event, row?: TableElement<T>): boolean {
641
-
642
- // Deleting edited row, if empty and not dirty
643
- const previousRow = this.editedRow;
644
- if (previousRow && (previousRow.id === -1) && previousRow.validator?.invalid && !(previousRow.validator?.dirty)) {
645
- this.deleteNewRow(event, previousRow);
646
-
647
- // Wait deletion is done, then edit previous row (by id, because of reloading)
648
- this.waitIdle()
649
- .then(() => this.editRowById(event, row.id, {focusColumn: this.lastUserColumn}));
650
- return true;
651
- }
652
-
653
- // Edit previous row
654
- this.editRow(event, row, {focusColumn: this.lastUserColumn});
655
- return true;
656
- }
657
-
658
- confirmAndForward(event?: Event, row?: TableElement<T>): boolean | Promise<boolean> {
659
- if (!this.inlineEdition) return false;
660
- row = row || this.editedRow;
661
- if (!this.confirmEditCreate(event, row)) {
662
- // If pending: Wait end of validation, then loop
663
- if (row.validator?.pending) {
664
- return AppFormUtils.waitWhilePending(row.validator).then(() => this.confirmAndForward(event, row));
665
- }
666
-
667
- return false;
668
- }
669
- // Edit next row
670
- this.editRowById(event, row.id + 1, {focusColumn: this.firstUserColumn});
671
- return true;
672
- }
673
-
674
- /**
675
- * Confirm the creation of the given row, or if not specified the currently edited row
676
- *
677
- * @param event
678
- * @param row
679
- */
680
- confirmEditCreate(event?: Event, row?: TableElement<T>): boolean {
681
- row = row || this.editedRow;
682
- if (!row || !row.editing) return true; // no row to confirm
683
-
684
- // Stop event
685
- event?.stopPropagation();
686
-
687
- // Confirmation edition or creation
688
- // TODO: add await ?
689
- const confirmed = row.confirmEditCreate();
690
-
691
- if (confirmed) {
692
- // If edit finished, forget edited row
693
- if (row === this.editedRow) {
694
- this.editedRow = undefined;
695
- }
696
-
697
- // Mark table as dirty (if row is dirty)
698
- if (row.dirty) {
699
- this.markAsDirty({ emitEvent: false /* because of resetError() */ });
700
- }
701
-
702
- // Clear error
703
- this.resetError();
704
-
705
- // Emit the confirm event
706
- this.onConfirmEditCreateRow.next(row);
707
-
708
- return true; // Continue
709
- }
710
-
711
- if (row.validator) {
712
- // If pending: Wait end of validation, then loop
713
- // TODO: remove when using async isValid() function
714
- if (row.validator.pending) {
715
- AppFormUtils.waitWhilePending(row.validator).then(() => this.confirmEditCreate(event, row));
716
- return false;
717
- }
718
-
719
- // NOT confirmed = row has error
720
- if (this.debug) {
721
- console.warn('[table] Cannot confirm row, because invalid');
722
- AppFormUtils.logFormErrors(row.validator, '[table] ');
723
- }
724
-
725
- // fix: mark all controls as touched to show errors
726
- row.validator.markAllAsTouched();
727
-
728
- // Compute row error, and propagate to table's error
729
- if (this.propagateRowError) {
730
- const error = this.getRowError(row);
731
- this.setError(error);
732
- }
733
- }
734
-
735
- // Not confirmed
736
- return false;
737
- }
738
-
739
- cancelOrDelete(event: Event, row: TableElement<T>, opts?: { interactive?: boolean; keepEditing?: boolean; }) {
740
- // Delete new row
741
- if (row.id === -1) {
742
- this.deleteNewRow(event, row);
743
- }
744
- // Delete existing (but not editing) row
745
- else if (!row.editing) {
746
- this.deleteExistingRow(event, row, opts);
747
- }
748
- // Cancel existing (and editing) row
749
- else {
750
- this.cancelExistingRow(event, row, opts);
751
- }
752
- }
753
-
754
- async addRow(event?: Event, insertAt?: number, opts?: {focusColumn?: string; editing?: boolean }): Promise<boolean> {
755
- if (this.debug) console.debug('[table] Asking for new row...');
756
- if (!this._enabled) return false;
757
-
758
- // Use modal if inline edition is disabled
759
- if (!this.inlineEdition) {
760
- this.openNewRowDetail(event);
761
- return false;
762
- }
763
-
764
- // Try to finish edited row first
765
- if (!this.confirmEditCreate()) {
766
- return false;
767
- }
768
-
769
- // Add new row
770
- const row = await this.addRowToTable(insertAt, opts);
771
- return !!row;
772
- }
773
-
774
- async save(opts?: { keepEditing?: boolean }): Promise<boolean> {
775
- opts = {
776
- keepEditing: this.keepEditedRowOnSave,
777
- ...opts
778
- };
779
- if (this.readOnly) {
780
- throw {code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY'};
781
- }
782
-
783
- this.resetError();
784
-
785
- // Keep edited row id (should be done BEFORE confirmEditCreate() )
786
- this.previouslyEditedRowId = opts.keepEditing ? ((this.editedRow?.editing ? this.editedRow.id : undefined) || this.singleSelectedRow?.id) : undefined;
787
- const previouslyEditedRowId = this.previouslyEditedRowId;
788
- const previouslyEditedData = opts.keepEditing ? (isNotNil(previouslyEditedRowId) && this.editedRow?.currentData || this.singleSelectedRow?.currentData) : undefined;
789
-
790
- if (!this.confirmEditCreate()) {
791
- throw {code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR'};
792
- }
793
-
794
- // Mark as saving
795
- this.markAsSaving();
796
-
797
- try {
798
-
799
- // Calling service save()
800
- if (this.debug) console.debug('[table] Calling dataSource.save()...');
801
- const isOK = await this._dataSource.save();
802
-
803
- if (isOK) this.markAsPristine();
804
-
805
- return isOK;
806
- } catch (err) {
807
- this.setError(err && err.message || err);
808
- throw err;
809
- } finally {
810
- this.markAsSaved();
811
-
812
- // Restore previous row
813
- if (isNotNil(previouslyEditedRowId)) {
814
- await this.selectRowByIdOrData(previouslyEditedRowId, previouslyEditedData);
815
- }
816
- }
817
- }
818
-
819
- cancel(event?: Event, opts?: { interactive?: boolean; }) {
820
-
821
- // Check confirmation
822
- if ((!opts || opts.interactive !== false) && this.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observers.length > 0)) {
823
- event?.stopPropagation();
824
- this.canCancelRows().then(confirm => {
825
- // If confirmed, loop
826
- if (confirm) this.cancel(null, {interactive: false});
827
- });
828
- return;
829
- }
830
-
831
- this.onRefresh.emit();
832
- }
833
-
834
- async duplicateRow(event?: Event, row?: TableElement<T>, opts?: {
835
- skipProperties?: string[];
836
- }) {
837
- event?.stopPropagation();
838
-
839
- row = row || this.singleSelectedRow;
840
- if (!row || !this.confirmEditCreate(event, row)) {
841
- return false;
842
- }
843
-
844
- const newRow = await this.addRowToTable(row.id + 1);
845
- if (!newRow) throw new Error('Cannot add new row to table');
846
- const json = {...row.currentData, id: null};
847
-
848
- // Reset some properties (e.g. rankOrder, etc)
849
- if (opts && opts.skipProperties) {
850
- const newData = newRow.currentData;
851
- opts.skipProperties.forEach(key => json[key] = newData[key]);
852
- }
853
-
854
- if (newRow.validator) {
855
- newRow.validator.patchValue(json);
856
- newRow.validator.markAsDirty();
857
- } else {
858
- if (newRow.currentData?.fromObject) {
859
- newRow.currentData.fromObject(json);
860
- } else {
861
- newRow.currentData = json;
862
- }
863
- this.markAsDirty();
864
- }
865
-
866
- // select
867
- this.clickRow(undefined, newRow);
868
- }
869
-
870
- /** Whether the number of selected elements matches the total number of rows. */
871
- isAllSelected() {
872
- // DEBUG
873
- //console.debug('isAllSelected. lengths', this.selection.selected.length, this.totalRowCount);
874
-
875
- return this.selection.selected.length === this.visibleRowCount;
876
- }
877
-
878
- /** Selects all rows if they are not all selected; otherwise clear selection. */
879
- async masterToggle() {
880
-
881
- if (this.loading) return;
882
- if (this.isAllSelected()) {
883
- this.selection.clear();
884
- } else {
885
- const rows = this._dataSource.getRows();
886
- rows.forEach(row => this.selection.select(row));
887
- }
888
- }
889
-
890
- async deleteSelection(event: Event, opts?: {interactive?: boolean}): Promise<number> {
891
- const deleteCount = await this.deleteRows(event, this.selection.selected, opts);
892
- if (deleteCount > 0) {
893
- this.selection.clear();
894
- }
895
- return deleteCount;
896
- }
897
-
898
- /**
899
- *
900
- * @param event
901
- * @param row
902
- * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
903
- * And to force deletion even if table is busy
904
- */
905
- async deleteRow(event: Event|null, row: TableElement<T>, opts?: {interactive?: boolean;}): Promise<boolean> {
906
- const isSelected = this.selection.isSelected(row);
907
- const deleteCount = await this.deleteRows(event, [row], opts);
908
-
909
- // Unselect the deleted row
910
- if (deleteCount && isSelected) this.selection.deselect(row);
911
-
912
- return deleteCount === 1;
913
- }
914
-
915
- /**
916
- *
917
- * @param event
918
- * @param rows
919
- * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)
920
- * And to force deletion even if table is busy
921
- */
922
- async deleteRows(event: Event|null, rows: TableElement<T>[], opts?: {interactive?: boolean;}): Promise<number> {
923
- if (this.readOnly) {
924
- throw {code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY'};
925
- }
926
- if (event?.defaultPrevented) return 0; // SKip
927
- event?.preventDefault();
928
- this.resetError();
929
-
930
- if (!this._enabled || isEmptyArray(rows)) return 0; // Skip is disabled, or no rows to delete
931
-
932
- if (this.loading && (!opts || opts.interactive !== false)) {
933
- console.warn('[app-table] Skip deleteRows() because table is busy (loading). Use opts.interactive = false to force deletion');
934
- return 0; // Skip if loading
935
- }
936
-
937
- // Make sure to keep newly created row
938
- if (this.editedRow?.id === -1 && this.editedRow.editing && !rows.includes(this.editedRow)) {
939
- const confirmed = this.confirmEditCreate();
940
- if (!confirmed) return 0; // Cannot delete (e.g. edited row is invalid)
941
- }
942
-
943
- // Check if can delete
944
- const canDelete = await this.canDeleteRows(rows, opts);
945
- if (!canDelete) return 0; // Cannot delete
946
-
947
- // Reverse row order (on a copy)
948
- // This is a workaround, need because row.delete() has async execution
949
- // and index cache is updated with a delay
950
- let tempRows = rows.slice()
951
- .sort((a, b) => a.id > b.id ? -1 : 1);
952
-
953
- let deletedRows: TableElement<T>[] = [];
954
-
955
- // If data need to be saved first
956
- if (this.saveBeforeDelete) {
957
- // Exclude invalid rows (because of save() will fail, when exists some invalid rows)
958
- tempRows = tempRows.filter(row => {
959
- // Delete the row :
960
- // - if newly created row (id = -1),
961
- // - or if invalid and not editing (= not cancellable)
962
- if (row.id === -1 || (!row.editing && row.invalid /*do not use !valid because if row is disabled, it will be always !valid */)) {
963
- if (this.debug) console.debug(`[table] Delete row #${row.id}`);
964
- row.delete();
965
- this.visibleRowCount--;
966
- this.totalRowCount--;
967
- deletedRows.push(row);
968
- if (this.editedRow === row) this.editedRow = undefined;
969
- return false; // Exclude from the list to delete using the service
970
- }
971
- // Cancel the row (and mark as pristine), when not valid but in edition
972
- else if (row.editing && !row.valid) {
973
- row.cancel();
974
- // Mark row as pristine (if possible)
975
- this.checkIfRowPristine(row, {emitEvent: false, onlySelf: true /*avoid propagation to table*/});
976
- return true; // Keep the row. the row will be deleted after the save
977
- }
978
-
979
- return true;
980
- });
981
-
982
- // Apply save, only if there is still some rows to delete
983
- // WARN: If no more rows (e.g. because all has been cancelled) then continue anyway to clear editedRow and selection (issue IMAGINE-669)
984
- if (deletedRows.length || tempRows.length) {
985
-
986
- // Save data (e.g. when using memory service)
987
- const saved = await this.saveBeforeAction('delete');
988
- if (!saved) {
989
- // Stop if save cancelled or save failed
990
- return;
991
- }
992
- }
993
- }
994
-
995
- try {
996
-
997
- // Apply deletion on datasource
998
- // If no more rows to delete, continue anyway to clear editedRow and selection (issue IMAGINE-669)
999
- if (tempRows.length) {
1000
- if (this.debug) console.debug(`[table] Delete ${tempRows.length} rows...`);
1001
- await this._dataSource.deleteAll(tempRows);
1002
- }
1003
-
1004
- // DO not update manually, because watchALl().subscribe() will update this count
1005
- //this.totalRowCount -= deleteCount;
1006
- //this.visibleRowCount -= deleteCount;
1007
-
1008
- // Deselect deleted rows
1009
- this.selection.deselect(...rows);
1010
-
1011
- this.editedRow = undefined;
1012
- this.markAsDirty({emitEvent: false /*markForCheck() is called just after*/});
1013
- this.markForCheck();
1014
-
1015
- this.onAfterDeletedRows.next(rows);
1016
-
1017
- return rows.length;
1018
- } catch (err) {
1019
- this.setError(err && err.message || err);
1020
- throw err;
1021
- }
1022
- }
1023
-
1024
- async selectRowById(id: number): Promise<boolean> {
1025
- if (id === undefined) return false;
1026
- await this.waitIdle();
1027
- const row = this.dataSource.getRow(id);
1028
- if (!row) return false;
1029
- return this.clickRow(null, row);
1030
- }
1031
-
1032
- /**
1033
- * Try to select row by data. Will use equals() to find same row's data
1034
- * @param data
1035
- */
1036
- async selectRowByData(data: T): Promise<boolean> {
1037
- if (data === undefined) return Promise.resolve(false);
1038
- await this.waitIdle();
1039
- const row = this.dataSource.getRows()
1040
- .find(row => this.equals(row.currentData, data));
1041
- if (!row) return false;
1042
- return this.clickRow(null, row);
1043
- }
1044
-
1045
- clickRow(event: Event|undefined, row: TableElement<T>): boolean {
1046
- if (this.loading) {
1047
- // Wait while loading, and loop
1048
- if (this.debug) console.debug("[table] Waiting before apply clickRow() (datasource is busy)...");
1049
- this.waitIdle({timeout: 2000}).then(() => this.clickRow(event, row));
1050
- return false;
1051
- }
1052
-
1053
- // DEBUG
1054
- //console.debug("[table] Detect click on row");
1055
-
1056
- // Cancelled by event
1057
- if (event?.defaultPrevented) {
1058
- if (this.debug) console.debug("[table] clickRow event is defaultPrevented");
1059
- return false;
1060
- }
1061
-
1062
- // Already in edition
1063
- if (row.id === -1 || row.editing) {
1064
- if (this.debug) console.debug("[table] Row already editing. Skip clickRow event");
1065
- return true;
1066
- }
1067
-
1068
- // Open the detail page (if not inline editing)
1069
- if (!this.inlineEdition) {
1070
-
1071
- if (event) {
1072
- event.stopPropagation();
1073
- event.preventDefault();
1074
- }
1075
-
1076
- this.markAsLoading();
1077
-
1078
- this.openRow(row.currentData.id, row)
1079
- .then(() => this.markAsLoaded())
1080
- .catch(() => this.markAsLoaded());
1081
-
1082
- return true;
1083
- }
1084
-
1085
- // Start editing row
1086
- return this.editRow(event, row, {focusColumn: undefined /*force to use the click target*/});
1087
- }
1088
-
1089
- moveRow(id: number, direction: number) {
1090
- this.dataSource.move(id, direction);
1091
- }
1092
-
1093
- ready(opts?: WaitForOptions): Promise<void> {
1094
- return waitForTrue(this.readySubject, opts);
1095
- }
1096
-
1097
- waitIdle(opts?: WaitForOptions): Promise<void> {
1098
- return waitForFalse(this.loadingSubject, opts);
1099
- }
1100
-
1101
- async openSelectColumnsModal(event?: Event): Promise<any> {
1102
-
1103
- // Copy current columns (deep copy)
1104
- const columns = this.getCurrentColumns();
1105
-
1106
- const hasTopModal = !!(await this.modalCtrl.getTop());
1107
- const modal = await this.modalCtrl.create({
1108
- component: TableSelectColumnsComponent,
1109
- componentProps: {columns},
1110
- cssClass: hasTopModal && 'stack-modal'
1111
- });
1112
-
1113
- // Open the modal
1114
- await modal.present();
1115
-
1116
- // On dismiss
1117
- const {data} = await modal.onDidDismiss();
1118
- if (!data) return; // CANCELLED
1119
-
1120
- // Apply columns
1121
- const userColumns = (data || []).filter(c => c.canHide === false || c.visible).map(c => c.name) || [];
1122
- this.displayedColumns = RESERVED_START_COLUMNS.concat(userColumns).concat(RESERVED_END_COLUMNS);
1123
- this.markForCheck();
1124
-
1125
- // Update user settings
1126
- await this.savePageSettings(userColumns, SETTINGS_DISPLAY_COLUMNS);
1127
- }
1128
-
1129
- trackByFn(index: number, row: TableElement<T>) {
1130
- return row.id;
1131
- }
1132
-
1133
- doRefresh(event?: CompletableEvent) {
1134
- this.onRefresh.emit(event);
1135
-
1136
- // When target wait for a complete (e.g. IonRefresher)
1137
- if (event?.target && event.target.complete) {
1138
- setTimeout(async () => {
1139
- await this.waitIdle();
1140
- event.target.complete();
1141
- });
1142
- }
1143
- }
1144
-
1145
- getCurrentColumns(): ColumnItem[] {
1146
- const hiddenColumns = this.columns.slice(RESERVED_START_COLUMNS.length)
1147
- .filter(name => this.displayedColumns.indexOf(name) === -1);
1148
- return this.displayedColumns
1149
- .concat(hiddenColumns)
1150
- .filter(name => !RESERVED_START_COLUMNS.includes(name) && !RESERVED_END_COLUMNS.includes(name)
1151
- && !this.excludesColumns.includes(name))
1152
- .map(name => ({
1153
- name,
1154
- label: this.getI18nColumnName(name),
1155
- visible: this.displayedColumns.indexOf(name) !== -1,
1156
- canHide: this.getRequiredColumns().indexOf(name) === -1
1157
- }));
1158
- }
1159
-
1160
- escapeEditingRow(event?: Event, row?: TableElement<T>) {
1161
- row = row || this.editedRow;
1162
- if (!row || !row.editing) return;
1163
-
1164
- // DEBUG
1165
- //console.debug('[app-table] Cancel the row (keydown.escape)');
1166
-
1167
- if (event) {
1168
- // Avoid to cancel the editor
1169
- event.preventDefault();
1170
- event.stopPropagation();
1171
- }
1172
-
1173
- // If new row (no id)
1174
- if (row.id === -1) {
1175
- if (row.validator) {
1176
- // If pending: Wait end of validation, then loop
1177
- if (row.validator.pending) {
1178
- AppFormUtils.waitWhilePending(row.validator).then(() => this.escapeEditingRow(event, row));
1179
- return;
1180
- }
1181
-
1182
- // Row is invalid: delete the row
1183
- if (row.validator.invalid) {
1184
- this.deleteNewRow(event, row);
1185
- return;
1186
- }
1187
- }
1188
- }
1189
- // If the row exists (has an id)
1190
- else {
1191
- // need to call cancel function (if confirmation will be call before before)
1192
- if (this.confirmBeforeCancel) {
1193
- this.cancelExistingRow(event, row, {keepEditing: false});
1194
- return;
1195
- }
1196
- }
1197
-
1198
- // By default, try to confirm the row
1199
- this.confirmEditCreate(event, row);
1200
- }
1201
-
1202
- translateControlPath(path: string): string {
1203
- // Can be override by subclasses, to resolve all field name
1204
-
1205
- // Use columns key, has default name
1206
- const i18nColumnKey = this.getI18nColumnName(path);
1207
- return this.translate?.instant(i18nColumnKey) || i18nColumnKey;
1208
- }
1209
-
1210
- /* -- protected method -- */
1211
-
1212
-
1213
- protected editRow(event: Event|undefined, row: TableElement<T>, opts?: {focusColumn?: string}): boolean {
1214
-
1215
- if (!this._enabled || !this.inlineEdition) return false;
1216
- if (this.editedRow === row) return true; // Already the edited row
1217
- if (event?.defaultPrevented) return false;
1218
-
1219
- const confirmed = this.confirmEditCreate();
1220
- if (!confirmed) return false;
1221
-
1222
- if (!row.editing && !this.loading) {
1223
- this.focusColumn = opts && opts.focusColumn || this.focusColumn;
1224
- this._dataSource.startEdit(row);
1225
- }
1226
- this.editedRow = row;
1227
- this.onStartEditingRow.emit(row);
1228
- return true;
1229
- }
1230
-
1231
- /**
1232
- * Try to select row, by row.id, or by data. WIll use EntityUtils.equals()
1233
- * @param id
1234
- * @param data
1235
- * @protected
1236
- */
1237
- protected async selectRowByIdOrData(id: number, data?: T): Promise<boolean> {
1238
- let done = false;
1239
- try {
1240
-
1241
- // Select by row id (if NOT a new row)
1242
- if (isNotNil(id) || id !== -1) {
1243
- done = await this.selectRowById(id);
1244
- if (done) return true;
1245
- console.warn('[app-table] Save: Cannot reselect row by row.id: ', id);
1246
- }
1247
-
1248
- // Try by data
1249
- if (data) {
1250
- done = await this.selectRowByData(data);
1251
- if (done) return true;
1252
- console.warn('[app-table] Save: Cannot reselect row by data: ', data);
1253
- }
1254
-
1255
- return false;
1256
- }
1257
- catch(err) {
1258
- // Log, but continue
1259
- console.error(err && err.message || err);
1260
- return false;
1261
- }
1262
- }
1263
-
1264
- /**
1265
- * return the selected row if unique in selection
1266
- */
1267
- protected get singleSelectedRow(): TableElement<T> {
1268
- return this.selection.selected?.length === 1 ? this.selection.selected[0] : undefined;
1269
- }
1270
-
1271
- protected async canDeleteRows(rows: TableElement<T>[], opts?: { interactive?: boolean; }): Promise<boolean> {
1272
-
1273
- // Check using emitter
1274
- if (this.onBeforeDeleteRows.observers.length > 0) {
1275
- try {
1276
- const canDelete = await emitPromiseEvent(this.onBeforeDeleteRows, 'canDelete', {
1277
- detail: {rows}
1278
- });
1279
- if (!canDelete) return false;
1280
- }
1281
- catch (err) {
1282
- if (err === 'CANCELLED') return false; // User cancel
1283
- console.error('Error while checking if can delete rows', err);
1284
- throw err;
1285
- }
1286
- }
1287
-
1288
- // Ask user confirmation
1289
- if (this.confirmBeforeDelete && (!opts || opts.interactive !== false)) {
1290
- return this.askDeleteConfirmation(null, rows);
1291
- }
1292
- return true;
1293
- }
1294
-
1295
- protected async canCancelRows(rows?: TableElement<T>[], opts?: { interactive?: boolean; }): Promise<boolean> {
1296
-
1297
- // Get dirty rows
1298
- rows = rows || this.dataSource.getRows().filter(row => row.validator?.dirty);
1299
-
1300
- if (isEmptyArray(rows)) return true; // No dirty: OK
1301
-
1302
- // Check using emitter
1303
- if (this.onBeforeCancelRows.observers.length > 0) {
1304
- try {
1305
- const isCancel = await emitPromiseEvent(this.onBeforeCancelRows, 'canCancel', {
1306
- detail: {rows}
1307
- });
1308
- if (!isCancel) return false;
1309
- }
1310
- catch (err) {
1311
- if (err === 'CANCELLED') return false; // User cancel
1312
- console.error('Error while checking if can cancel rows', err);
1313
- throw err;
1314
- }
1315
- }
1316
-
1317
- // Ask user confirmation
1318
- if (this.confirmBeforeCancel && (!opts || opts.interactive !== false)) {
1319
- return this.askCancelConfirmation(null, rows);
1320
- }
1321
- return true;
1322
- }
1323
-
1324
- protected async saveBeforeAction(saveAction: SaveActionType): Promise<boolean> {
1325
-
1326
- if (!this.dirty) {
1327
- // Continue without save
1328
- return true;
1329
- }
1330
-
1331
- let save: boolean;
1332
- switch (saveAction) {
1333
- case 'delete':
1334
- save = this.saveBeforeDelete;
1335
- break;
1336
- case 'filter':
1337
- save = this.saveBeforeFilter;
1338
- break;
1339
- case 'sort':
1340
- save = this.saveBeforeSort;
1341
- break;
1342
- default:
1343
- save = true;
1344
- }
1345
-
1346
- // Default behavior
1347
- let confirmed = true;
1348
-
1349
- if (save) {
1350
- if (this.onBeforeSave.observers.length > 0) {
1351
- // Ask confirmation
1352
- try {
1353
- const res = await emitPromiseEvent(this.onBeforeSave, 'beforeSave', {
1354
- detail: {action: saveAction, valid: this.valid}
1355
- });
1356
- confirmed = res.confirmed;
1357
- save = res.save;
1358
- }
1359
- catch (err) {
1360
- if (err === 'CANCELLED') return false; // User cancel
1361
- console.error('Error while checking if can delete rows', err);
1362
- throw err;
1363
- }
1364
-
1365
- }
1366
- }
1367
-
1368
- if (confirmed) {
1369
- if (save) {
1370
- // User confirmed save
1371
- const saved = await this.save();
1372
- this.markAsDirty(); // Restore dirty flag
1373
- return saved;
1374
- }
1375
- return true; // No save but continue action
1376
- }
1377
-
1378
- return false; // User cancel the action
1379
- }
1380
-
1381
- /**
1382
- * Open a row detail view. By default, will to open row detail page.
1383
- * Can be override by subclasses, BUT prefer to subscribe on onOpenRow
1384
- * @param id
1385
- * @param row
1386
- * @protected
1387
- */
1388
- protected async openRow(id: ID, row: TableElement<T>): Promise<boolean> {
1389
- if (this.allowRowDetail) {
1390
- if (this.debug && this.dirty) {
1391
- console.warn('[table] Opening row details, but table has unsaved changes!');
1392
- }
1393
-
1394
- if (this.onOpenRow.observers.length) {
1395
- this.onOpenRow.emit(row);
1396
- return true;
1397
- }
1398
-
1399
- // No ID defined: unable to open details
1400
- if (isNil(id)) {
1401
- console.warn('[table] Opening row details, but data has no id!');
1402
- return false;
1403
- }
1404
-
1405
- return this.navController.navigateForward(`${this.router.url}/${id.toString()}`, {
1406
- queryParams: {}
1407
- });
1408
- }
1409
- return false;
1410
- }
1411
-
1412
- protected async openNewRowDetail(event?: any): Promise<boolean> {
1413
- if (!this.allowRowDetail) return false;
1414
-
1415
- if (this.onNewRow.observers.length > 0) {
1416
- this.onNewRow.emit(event);
1417
- return true;
1418
- }
1419
-
1420
- return this.navController.navigateForward(`${this.router.url}/new`);
1421
- }
1422
-
1423
- // can be overridden to add more required columns
1424
- protected getRequiredColumns() {
1425
- return DEFAULT_REQUIRED_COLUMNS;
1426
- }
1427
-
1428
- protected getUserColumns(): string[] {
1429
- return this.getPageSettings(SETTINGS_DISPLAY_COLUMNS);
1430
- }
1431
-
1432
- protected getSortedColumn(): MatSortable {
1433
- const data = this.getPageSettings(SETTINGS_SORTED_COLUMN);
1434
- const parts = data && data.split(':');
1435
- if (parts && parts.length === 2 && this.columns.includes(parts[0])) {
1436
- return {id: parts[0], start: parts[1] === 'desc' ? 'desc' : 'asc', disableClear: false};
1437
- }
1438
- if (this.defaultSortBy) {
1439
- return {id: this.defaultSortBy, start: this.defaultSortDirection || 'asc', disableClear: false};
1440
- }
1441
- return {id: 'id', start: 'asc', disableClear: false};
1442
- }
1443
-
1444
- protected getPageSize(): number {
1445
- const pageSize = this.getPageSettings<number>(SETTINGS_PAGE_SIZE);
1446
- return pageSize || this.defaultPageSize;
1447
- }
1448
-
1449
- protected getDisplayColumns(): string[] {
1450
- let userColumns = this.getUserColumns();
1451
-
1452
- // No user override
1453
- if (!userColumns) {
1454
- // Return default, without columns to hide
1455
- return this.columns.filter(column => !this.excludesColumns.includes(column));
1456
- }
1457
-
1458
- // Get fixed start columns
1459
- const fixedStartColumns = this.columns.filter(c => RESERVED_START_COLUMNS.includes(c));
1460
-
1461
- // Remove end columns
1462
- const fixedEndColumns = this.columns.filter(c => RESERVED_END_COLUMNS.includes(c));
1463
-
1464
- // Remove fixed columns from user columns
1465
- userColumns = userColumns.filter(c => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && this.columns.includes(c));
1466
-
1467
- // Add required columns if missing
1468
- userColumns.push(...this.getRequiredColumns().filter(c => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && !userColumns.includes(c)));
1469
-
1470
- return fixedStartColumns
1471
- .concat(userColumns)
1472
- .concat(fixedEndColumns)
1473
- // Remove columns to hide
1474
- .filter(column => !this.excludesColumns.includes(column));
1475
- }
1476
-
1477
- /**
1478
- * Recompute display columns
1479
- *
1480
- * @protected
1481
- */
1482
- protected updateColumns() {
1483
- this.displayedColumns = this.getDisplayColumns();
1484
- if (!this.loading) this.markForCheck();
1485
- }
1486
-
1487
- protected registerSubscription(sub: Subscription) {
1488
- this._subscription.add(sub);
1489
- }
1490
-
1491
- protected unregisterSubscription(sub: Subscription) {
1492
- this._subscription.remove(sub);
1493
- }
1494
-
1495
- protected registerAutocompleteField<E = any, EF = any>(fieldName: string, options?: MatAutocompleteFieldAddOptions<E, EF>): MatAutocompleteFieldConfig<E, EF> {
1496
- return this._autocompleteConfigHolder.add(fieldName, options);
1497
- }
1498
-
1499
- protected getI18nColumnName(columnName: string) {
1500
- return (this.i18nColumnPrefix || '') + changeCaseToUnderscore(columnName).toUpperCase();
1501
- }
1502
-
1503
- protected generateTableId() {
1504
- const id = this.location.path(true)
1505
- .replace(/[?].*$/g, '')
1506
- .replace(/\/[\d]+/g, '_id')
1507
- + '_'
1508
- // Get a component unique name - See https://stackoverflow.com/questions/60114682/how-to-access-components-unique-encapsulation-id-in-angular-9
1509
- + (this.constructor['ɵcmp']?.id || this.constructor.name);
1510
- //if (this.debug) console.debug("[table] id = " + id);
1511
- return id;
1512
- }
1513
-
1514
- protected async addRowToTable(insertAt?: number, opts?: {focusColumn?: string; editing?: boolean; emitEvent?: boolean; }): Promise<TableElement<T>|undefined> {
1515
- // Try to finish edited row first
1516
- if (!this.confirmEditCreate()) {
1517
- console.warn('[table] Cannot add new row, because the previous edited row cannot be confirmed');
1518
- return undefined;
1519
- }
1520
-
1521
- const editing = this.inlineEdition && (!opts || opts.editing !== false); // true by default, if inlineEdition
1522
-
1523
- const row = await this._dataSource.createNew(insertAt, {editing});
1524
- if (!row) return undefined;
1525
-
1526
- if (row.editing) {
1527
- // Update focused column
1528
- this.focusFirstColumn = true;
1529
- this.focusColumn = opts?.focusColumn || this.firstUserColumn;
1530
-
1531
- // Emit start editing event
1532
- this.editedRow = row;
1533
- this.onStartEditingRow.emit(row);
1534
- }
1535
-
1536
- this.totalRowCount++;
1537
- this.visibleRowCount++;
1538
-
1539
- this.markAsDirty({emitEvent: false /*markForCheck() is called just after*/});
1540
-
1541
- // Emit event
1542
- if (!opts || opts.emitEvent !== false) this.markForCheck();
1543
-
1544
- return row;
1545
- }
1546
-
1547
- protected registerCellValueChanges(name: string, formPath?: string, emitInitialValue?: boolean): Observable<any> {
1548
- formPath = formPath || name;
1549
- emitInitialValue = emitInitialValue || false;
1550
- let def = this._cellValueChangesDefs[name];
1551
- if (def && (def.formPath !== formPath || def.emitInitialValue !== emitInitialValue)) {
1552
- throw Error('Already register a cell value change for this name, with different \'formPath\' or \'emitInitialValue\'. Please use same arguments.');
1553
- }
1554
-
1555
- // Not exists: register new definition
1556
- if (!def) {
1557
- if (this.debug) console.debug(`[table] New listener {${name}} for value changes on path ${formPath}`);
1558
- def = {
1559
- subject: new Subject<any>(),
1560
- subscription: null,
1561
- formPath,
1562
- emitInitialValue
1563
- };
1564
- this._cellValueChangesDefs[name] = def;
1565
-
1566
- // Start the listener, when editing starts
1567
- this.registerSubscription(
1568
- this.onStartEditingRow.subscribe(row => this.startCellValueChanges(name, row)));
1569
- }
1570
-
1571
- return def.subject;
1572
- }
1573
-
1574
- protected setShowColumn(columnName: string, show: boolean, opts?: { emitEvent?: boolean }) {
1575
- if (!this.excludesColumns.includes(columnName) !== show) {
1576
- if (!show) {
1577
- this.excludesColumns.push(columnName);
1578
- } else {
1579
- const index = this.excludesColumns.findIndex(value => value === columnName);
1580
- if (index >= 0) this.excludesColumns.splice(index, 1);
1581
- }
1582
-
1583
- // Recompute display columns
1584
- if (this.displayedColumns && (!opts || opts.emitEvent !== false)) {
1585
- this.updateColumns();
1586
- }
1587
- }
1588
- }
1589
-
1590
- protected getShowColumn(columnName: string): boolean {
1591
- return !this.excludesColumns.includes(columnName);
1592
- }
1593
-
1594
- protected startsWithUpperCase(input: string, search: string): boolean {
1595
- return input && input.toUpperCase().startsWith(search);
1596
- }
1597
-
1598
- protected markForCheck() {
1599
- // Should be override by subclasses, depending on ChangeDetectionStrategy
1600
- }
1601
-
1602
- protected async askDeleteConfirmation(event?: Event, rows?: TableElement<T>[]): Promise<boolean> {
1603
- if (this.undoableDeletion) {
1604
- // Special message, for undoable deletion
1605
- return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.DELETE_ROW' : 'CONFIRM.DELETE_ROWS', this.alertCtrl, this.translate, event);
1606
- }
1607
- // Immediate deletion action
1608
- return Alerts.askActionConfirmation(this.alertCtrl, this.translate, true, event);
1609
- }
1610
-
1611
- protected async askCancelConfirmation(event?: Event, rows?: TableElement<T>[]): Promise<boolean> {
1612
- return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.CANCEL_ROW' : 'CONFIRM.CANCEL_ROWS', this.alertCtrl, this.translate, event);
1613
- }
1614
-
1615
- protected async askRestoreConfirmation(event?: Event): Promise<boolean> {
1616
- return Alerts.askActionConfirmation(this.alertCtrl, this.translate, false, event);
1617
- }
1618
-
1619
- protected async showToast(opts: ShowToastOptions) {
1620
- if (!this.toastController) throw new Error('Missing toastController in component\'s constructor');
1621
- return Toasts.show(this.toastController, this.translate, opts);
1622
- }
1623
-
1624
- protected resetError(opts?: {emitEvent?: boolean;}) {
1625
- this.setError(undefined, opts);
1626
- }
1627
-
1628
- protected getRowError(row?: TableElement<T>, opts?: FormErrorTranslatorOptions): string {
1629
- row = row || this.editedRow;
1630
- if (!row || !this.formErrorAdapter) return undefined;
1631
-
1632
- return this.formErrorAdapter.translateFormErrors(row.validator, {
1633
- ...this.errorTranslatorOptions,
1634
- ...opts
1635
- });
1636
- }
1637
-
1638
- protected setError(value: string, opts?: {emitEvent?: boolean;}) {
1639
- if (this.errorSubject.value !== value) {
1640
- this.errorSubject.next(value);
1641
- if (!opts || opts.emitEvent !== false) {
1642
- this.markForCheck();
1643
- }
1644
- }
1645
- }
1646
-
1647
- /**
1648
- * Compare data equality (default by id, using EntityUtils.equals())
1649
- * Can be overridden to add additional properties to compare
1650
- *
1651
- * @param d1
1652
- * @param d2
1653
- * @protected
1654
- */
1655
- protected equals(d1: T, d2: T): boolean {
1656
- return EntityUtils.equals(d1, d2, 'id');
1657
- }
1658
-
1659
- protected markRowAsDirty(row?: TableElement<T>, opts?: { onlySelf?: boolean; emitEVent?: boolean; }) {
1660
- row = row || this.editedRow;
1661
- if (row) row.validator?.markAsDirty(opts);
1662
- this.markAsDirty(opts);
1663
- }
1664
-
1665
- protected getPageSettings<T = any>(propertyName?: string): T {
1666
- return this.settings.getPageSettings(this.settingsId, propertyName);
1667
- }
1668
-
1669
- protected async savePageSettings(value: any, propertyName?: string) {
1670
- await this.settings.savePageSetting(this.settingsId, value, propertyName);
1671
- }
1672
-
1673
- /* -- private method -- */
1674
-
1675
- private async listenSortAndPaginationEvents() {
1676
-
1677
- if (!this.table) {
1678
-
1679
- // DEBUG only -- alert user that table not found in template
1680
- if (this.debug) {
1681
- setTimeout(() => !this.table && console.warn(`[table] Missing <mat-table> in the HTML template (after waiting 500ms)! Component: ${this.constructor.name}`), 500);
1682
- }
1683
-
1684
- // Make sure to wait the table
1685
- await waitFor(() => !!this.table, {stop: this.destroySubject, stopError: false/*avoid error when destorying the table*/});
1686
- }
1687
-
1688
- this.registerSubscription(
1689
- merge(
1690
- // Listen sort events
1691
- this.sort && this.sort.sortChange
1692
- .pipe(
1693
- filter(() => !this.sort.disabled),
1694
- mergeMap(async () => this.saveBeforeAction('sort')),
1695
- filter(res => res === true),
1696
- // Save sort in settings
1697
- tap(() => {
1698
- const value = [this.sort.active, this.sort.direction || 'asc'].join(':');
1699
- this.savePageSettings(value, SETTINGS_SORTED_COLUMN);
1700
- })
1701
- )
1702
- || EMPTY,
1703
-
1704
- // Listen paginator events
1705
- this.paginator && this.paginator.page
1706
- .pipe(
1707
- mergeMap((_) => this.saveBeforeAction('sort')),
1708
- filter(saved => saved === true),
1709
- // Save page size in settings
1710
- tap(() => this.savePageSettings(this.paginator.pageSize, SETTINGS_PAGE_SIZE))
1711
- ) || EMPTY
1712
- )
1713
- // Refresh on any sort or paginator events
1714
- .subscribe(value => {
1715
- this.onSort.emit(value);
1716
- this.onRefresh.emit(value)
1717
- })
1718
- );
1719
-
1720
- // If the user changes the sort order, reset back to the first page.
1721
- if (this.sort && this.paginator) {
1722
- this.registerSubscription(
1723
- this.sort.sortChange
1724
- .pipe(
1725
- filter(() => !this.sort.disabled),
1726
- )
1727
- .subscribe(() => this.paginator.pageIndex = 0)
1728
- );
1729
- }
1730
- }
1731
-
1732
- private async editRowById(event: Event|undefined, id: number, opts?: {focusColumn?: string}) {
1733
- if (id < 0) return;
1734
- if (id >= this.visibleRowCount) {
1735
- this.addRow(event, undefined, {...opts, editing: true});
1736
- }
1737
- else {
1738
- const row = await this.dataSource.getRow(id);
1739
- this.editRow(event, row, opts);
1740
- }
1741
- }
1742
-
1743
- private setLoading(value: boolean, opts?: {emitEvent?: boolean}) {
1744
- if (this.loadingSubject.value !== value) {
1745
- this.loadingSubject.next(value);
1746
-
1747
- if (!opts || opts.emitEvent !== false) {
1748
- this.markForCheck();
1749
- }
1750
- }
1751
- }
1752
-
1753
- private deleteNewRow(event: Event|undefined, row: TableElement<T>) {// Make sure row will be cancelled, and NOT deleted
1754
- if (row.id !== -1) throw new Error('Row must have id = -1');
1755
- event?.stopPropagation();
1756
-
1757
- this.selection.clear();
1758
- this.editedRow = undefined; // unselect row
1759
- this._dataSource.cancelOrDelete(row);
1760
- this.resetError();
1761
-
1762
- this.onCancelOrDeleteRow.next(row);
1763
- this.totalRowCount--;
1764
- this.visibleRowCount--;
1765
- }
1766
-
1767
- private deleteExistingRow(event: Event|null, row: TableElement<T>, opts?: {interactive?: boolean;}) {
1768
- // Make sure row will be cancelled, and NOT deleted
1769
- if (row.id === -1) throw new Error('Row must have an id');
1770
-
1771
- if (event?.defaultPrevented) return 0; // SKip
1772
- event?.preventDefault();
1773
-
1774
- this.deleteRow(null, row, opts);
1775
- }
1776
-
1777
- private cancelExistingRow(event: Event|undefined, row: TableElement<T>, opts?: {interactive?: boolean; keepEditing?: boolean;}) {
1778
- // Make sure row will be cancelled, and NOT deleted
1779
- if (row.id === -1 || !row.editing) throw new Error('Row cannot be canceling, but only deleting');
1780
-
1781
- const confirmed = (!opts || opts.interactive !== false);
1782
-
1783
- // Ask user confirmation, if cancel
1784
- if (!confirmed && row.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observers.length > 0)) {
1785
- event.stopPropagation();
1786
- this.canCancelRows([row], opts)
1787
- .then(confirm => {
1788
- // If confirmed, loop
1789
- if (confirm) this.cancelExistingRow(event, row, {interactive: false});
1790
- });
1791
- return;
1792
- }
1793
-
1794
- const keepEditing = row.editing && (!opts || opts.keepEditing !== false);
1795
- this.editedRow = undefined; // unselect row
1796
- this._dataSource.cancelOrDelete(row);
1797
- this.onCancelOrDeleteRow.next(row);
1798
-
1799
- // Mark row as pristine
1800
- this.checkIfRowPristine(row);
1801
-
1802
- // Restore editing state
1803
- if (keepEditing) {
1804
- this.editRow(undefined, row);
1805
- }
1806
- }
1807
-
1808
- private async checkIfRowPristine(row: TableElement<T>, opts?: {emitEvent?: boolean; onlySelf?: boolean}) {
1809
- // Mark row as pristine
1810
- const markRowAsPristine = this.dataSource?.config.restoreOriginalDataOnCancel === true;
1811
- if (markRowAsPristine) {
1812
- row.validator?.markAsPristine();
1813
-
1814
- // Check if table is now pristine
1815
- if (!opts || opts.onlySelf !== true) {
1816
- await this.checkIfPristine(opts);
1817
- }
1818
- }
1819
- }
1820
-
1821
- private async checkIfPristine(opts?: {emitEvent?: boolean;}) {
1822
- if (!this.dirty) return; // Already pristine
1823
-
1824
- const rows = this._dataSource.getRows();
1825
- const pristine = (rows || []).findIndex(row => row.dirty) === -1;
1826
- if (pristine) this.markAsPristine(opts);
1827
- }
1828
-
1829
- private applyFilter(filter: F, opts: { emitEvent?: boolean; }) {
1830
- if (this.debug) console.debug('[table] Applying filter', filter);
1831
- this._filter = filter;
1832
- if (opts && opts.emitEvent) {
1833
- if (this.paginator && this.paginator.pageIndex > 0) {
1834
- this.paginator.pageIndex = 0;
1835
- }
1836
- this.onRefresh.emit();
1837
- }
1838
- }
1839
-
1840
- private listenDatasourceLoading(dataSource: EntitiesTableDataSource<T, F, ID>) {
1841
- if (!dataSource) throw new Error('[table] dataSource not set !');
1842
-
1843
- // Cleaning previous subscription on datasource
1844
- if (isNotNil(this._dataSourceLoadingSubscription)) {
1845
- if (this.debug) console.debug('[table] Many call to listenDatasource(): Cleaning previous subscriptions...');
1846
- this._dataSourceLoadingSubscription.unsubscribe();
1847
- this.unregisterSubscription(this._dataSourceLoadingSubscription);
1848
- }
1849
-
1850
- // Propage loading to table
1851
- this._dataSourceLoadingSubscription = this._dataSource.loadingSubject
1852
- .pipe(
1853
- distinctUntilChanged(),
1854
-
1855
- // If changed to True: propagate as soon as possible
1856
- tap((loading) => loading && this.setLoading(true)),
1857
-
1858
- // If changed to False: wait 250ms before propagate (to make sure the spinner has been displayed)
1859
- debounceTime(250),
1860
- tap(loading => !loading && this.setLoading(false))
1861
- )
1862
- .subscribe();
1863
- this.registerSubscription(this._dataSourceLoadingSubscription);
1864
- }
1865
-
1866
-
1867
- private startCellValueChanges(name: string, row: TableElement<T>) {
1868
- const def = this._cellValueChangesDefs[name];
1869
- if (!def) {
1870
- console.warn('[table] Listener with name {' + name + '} not registered! Please call registerCellValueChanges() before;');
1871
- return;
1872
- }
1873
- // Stop previous subscription
1874
- if (def.subscription) {
1875
- def.subscription.unsubscribe();
1876
- def.subscription = null;
1877
- } else {
1878
- if (this.debug) console.debug(`[table] Start values changes on row path {${def.formPath}}`);
1879
- }
1880
-
1881
- // Listen value changes, and redirect to event emitter
1882
- const control = row.validator && AppFormUtils.getControlFromPath(row.validator, def.formPath);
1883
- if (!control) {
1884
- console.warn(`[table] Could not listen cell changes: no validator or invalid form path {${def.formPath}}`);
1885
- } else {
1886
- def.subscription = control.valueChanges
1887
- .pipe(
1888
- // don't emit if control is disabled
1889
- filter(() => control.enabled)
1890
- )
1891
- .subscribe((value) => def.subject.next(value));
1892
-
1893
- // Emit the actual value
1894
- if (def.emitInitialValue !== false) {
1895
- def.subject.next(control.value);
1896
- }
1897
- }
1898
- }
1899
-
1900
- private stopCellValueChanges(name: string, destroy?: boolean) {
1901
- const def = this._cellValueChangesDefs[name];
1902
- if (!def) return;
1903
- if (def.subscription) {
1904
- if (this.debug) console.debug('[table] Stop value changes on row path {' + def.formPath + '}');
1905
- def.subscription.unsubscribe();
1906
- def.subscription = null;
1907
- }
1908
- if (destroy && def.subject) {
1909
- def.subject.complete();
1910
- def.subject.unsubscribe();
1911
- }
1912
- }
1913
-
1914
- /**
1915
- * Initialize the permanent selection model
1916
- * @protected
1917
- */
1918
- private initPermanentSelection() {
1919
- if (this.permanentSelection) throw new Error('initPermanentSelection() already called!');
1920
-
1921
- this.permanentSelection = new SelectionModel<T>(true, []);
1922
-
1923
- // Listen sort change
1924
- this.registerSubscription(
1925
- this.onSort.subscribe(() => (this.permanentSelectionChangedPrevented = true)) // prevent selection change on sort
1926
- );
1927
-
1928
- // Listen datasource update
1929
- this.registerSubscription(
1930
- this.dataSource.rowsSubject
1931
- // restore the 'adding' selection (for example after a page or sort change)
1932
- .subscribe((rows) => {
1933
- this.permanentSelectionChangedPrevented = true;
1934
- try {
1935
- const permanentSelectionIds = (this.permanentSelection.selected || []).map(EntityUtils.getId);
1936
- this.selection.setSelection(...rows.filter((row) => permanentSelectionIds.includes(AppTableUtils.getEntityId(row))));
1937
- this.markForCheck();
1938
- }
1939
- finally {
1940
- this.permanentSelectionChangedPrevented = false;
1941
- }
1942
- })
1943
- );
1944
-
1945
- // Listen selection change
1946
- this.registerSubscription(
1947
- this.selection.changed
1948
- .pipe(filter(() => !this.permanentSelectionChangedPrevented))
1949
- .subscribe((selectionChange) => {
1950
- // add to selection
1951
- if (selectionChange.added.length) {
1952
- this.permanentSelection.setSelection(
1953
- ...(this.permanentSelection.selected || [])
1954
- // Add new elements
1955
- .concat(...AppTableUtils.getEntities(selectionChange.added))
1956
- // Avoid duplicated entities (Mantis #55351)
1957
- .filter(EntityUtils.arrayDistinctFilterFn)
1958
- );
1959
- }
1960
- // remove from selection
1961
- if (selectionChange.removed.length) {
1962
- const removedIds = AppTableUtils.getEntityIds(selectionChange.removed);
1963
- this.permanentSelection.setSelection(
1964
- ...(this.permanentSelection.selected || [])
1965
- .filter((entity) => !removedIds.includes(entity.id))
1966
- );
1967
- }
1968
- this.markForCheck();
1969
- })
1970
- );
1971
- }
1972
- }
1973
-