@sumaris-net/ngx-components 18.24.24 → 21.0.0-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 (801) hide show
  1. package/README.md +2 -0
  2. package/doc/build.md +2 -2
  3. package/doc/changelog.md +6 -5
  4. package/fesm2022/sumaris-net-ngx-components-testing.mjs +496 -0
  5. package/fesm2022/sumaris-net-ngx-components-testing.mjs.map +1 -0
  6. package/fesm2022/sumaris-net.ngx-components.mjs +2782 -2426
  7. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  8. package/package.json +20 -15
  9. package/src/assets/environments/environment-test.json +2 -2
  10. package/src/assets/i18n/fr.json +6 -5
  11. package/src/assets/manifest.json +1 -1
  12. package/src/theme/_icons.scss +8 -12
  13. package/src/theme/_ionic.globals.scss +15 -1
  14. package/src/theme/_material.globals.scss +4 -1
  15. package/src/theme/_material.scss +16 -13
  16. package/src/theme/_mixins.scss +7 -1
  17. package/src/theme/_ngx-components.forms.scss +87 -84
  18. package/src/theme/_ngx-components.globals.scss +2 -0
  19. package/src/theme/_ngx-components.scss +20 -5
  20. package/src/theme/_ngx-components.table.scss +37 -26
  21. package/src/theme/_ngx-components.tabs.scss +16 -14
  22. package/src/theme/_responsive.scss +2 -0
  23. package/src/theme/_roboto.scss +3 -0
  24. package/src/theme/_theme.scss +11 -14
  25. package/src/theme/_theme.variables.scss +11 -2
  26. package/src/theme/ionic/ionic.functions.color.scss +13 -5
  27. package/src/theme/ionic/ionic.globals.scss +4 -4
  28. package/src/theme/ionic/ionic.theme.default.scss +2 -0
  29. package/types/sumaris-net-ngx-components-testing.d.ts +286 -0
  30. package/types/sumaris-net.ngx-components.d.ts +14216 -0
  31. package/esm2022/public_api.mjs +0 -403
  32. package/esm2022/src/app/admin/admin-routing.module.mjs +0 -34
  33. package/esm2022/src/app/admin/admin.module.mjs +0 -32
  34. package/esm2022/src/app/admin/users/person.filter.mjs +0 -157
  35. package/esm2022/src/app/admin/users/person.service.mjs +0 -226
  36. package/esm2022/src/app/admin/users/person.validator.mjs +0 -78
  37. package/esm2022/src/app/admin/users/users-select.modal.mjs +0 -167
  38. package/esm2022/src/app/admin/users/users.mjs +0 -502
  39. package/esm2022/src/app/admin/users/users.module.mjs +0 -59
  40. package/esm2022/src/app/admin/users/users.utils.mjs +0 -29
  41. package/esm2022/src/app/core/about/about.modal.mjs +0 -119
  42. package/esm2022/src/app/core/about/about.module.mjs +0 -22
  43. package/esm2022/src/app/core/account/account.module.mjs +0 -75
  44. package/esm2022/src/app/core/account/account.page.mjs +0 -426
  45. package/esm2022/src/app/core/account/new-token.form.mjs +0 -109
  46. package/esm2022/src/app/core/account/new-token.modal.mjs +0 -66
  47. package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -63
  48. package/esm2022/src/app/core/account/password/change-password.module.mjs +0 -22
  49. package/esm2022/src/app/core/account/password/change-password.page.mjs +0 -150
  50. package/esm2022/src/app/core/account/token.table.mjs +0 -160
  51. package/esm2022/src/app/core/auth/auth.form.mjs +0 -159
  52. package/esm2022/src/app/core/auth/auth.modal.mjs +0 -76
  53. package/esm2022/src/app/core/auth/auth.module.mjs +0 -56
  54. package/esm2022/src/app/core/auth/reset-password.modal.mjs +0 -89
  55. package/esm2022/src/app/core/core.module.mjs +0 -157
  56. package/esm2022/src/app/core/core.testing.module.mjs +0 -128
  57. package/esm2022/src/app/core/form/array/form-array.mjs +0 -328
  58. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +0 -23
  59. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +0 -97
  60. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -111
  61. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +0 -31
  62. package/esm2022/src/app/core/form/entity/editor.class.mjs +0 -268
  63. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -420
  64. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +0 -753
  65. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  66. package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -33
  67. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -190
  68. package/esm2022/src/app/core/form/form-container.class.mjs +0 -371
  69. package/esm2022/src/app/core/form/form.class.mjs +0 -342
  70. package/esm2022/src/app/core/form/form.module.mjs +0 -77
  71. package/esm2022/src/app/core/form/form.utils.mjs +0 -238
  72. package/esm2022/src/app/core/form/list/list.form.mjs +0 -243
  73. package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
  74. package/esm2022/src/app/core/form/properties/properties-file.service.mjs +0 -133
  75. package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -397
  76. package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -85
  77. package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -267
  78. package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -304
  79. package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -70
  80. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -103
  81. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
  82. package/esm2022/src/app/core/form/text/testing/text-form.testing.mjs +0 -42
  83. package/esm2022/src/app/core/form/text/testing/text-form.testing.module.mjs +0 -25
  84. package/esm2022/src/app/core/form/text/text-form.component.mjs +0 -205
  85. package/esm2022/src/app/core/form/text/text-form.module.mjs +0 -31
  86. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -73
  87. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +0 -22
  88. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -164
  89. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -32
  90. package/esm2022/src/app/core/form/username/username.form.mjs +0 -55
  91. package/esm2022/src/app/core/form/username/username.module.mjs +0 -20
  92. package/esm2022/src/app/core/graphql/graphql.module.mjs +0 -14
  93. package/esm2022/src/app/core/graphql/graphql.service.mjs +0 -781
  94. package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
  95. package/esm2022/src/app/core/home/home.mjs +0 -472
  96. package/esm2022/src/app/core/home/home.module.mjs +0 -54
  97. package/esm2022/src/app/core/icon/icon.component.mjs +0 -40
  98. package/esm2022/src/app/core/icon/icon.module.mjs +0 -20
  99. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +0 -394
  100. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
  101. package/esm2022/src/app/core/menu/menu.component.mjs +0 -273
  102. package/esm2022/src/app/core/menu/menu.model.mjs +0 -327
  103. package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
  104. package/esm2022/src/app/core/menu/menu.service.mjs +0 -666
  105. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -113
  106. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -51
  107. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -165
  108. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +0 -60
  109. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +0 -28
  110. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +0 -31
  111. package/esm2022/src/app/core/peer/select-peer.modal.mjs +0 -350
  112. package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -36
  113. package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
  114. package/esm2022/src/app/core/register/register.form.mjs +0 -197
  115. package/esm2022/src/app/core/register/register.modal.mjs +0 -55
  116. package/esm2022/src/app/core/register/register.module.mjs +0 -23
  117. package/esm2022/src/app/core/services/account.service.mjs +0 -1403
  118. package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
  119. package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -499
  120. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -224
  121. package/esm2022/src/app/core/services/base58.mjs +0 -83
  122. package/esm2022/src/app/core/services/config/core.config.mjs +0 -293
  123. package/esm2022/src/app/core/services/config.service.mjs +0 -384
  124. package/esm2022/src/app/core/services/crypto.service.mjs +0 -110
  125. package/esm2022/src/app/core/services/errors.mjs +0 -54
  126. package/esm2022/src/app/core/services/local-settings.service.mjs +0 -540
  127. package/esm2022/src/app/core/services/model/account.model.mjs +0 -192
  128. package/esm2022/src/app/core/services/model/config.model.mjs +0 -111
  129. package/esm2022/src/app/core/services/model/department.model.mjs +0 -35
  130. package/esm2022/src/app/core/services/model/entity.decorators.mjs +0 -97
  131. package/esm2022/src/app/core/services/model/entity.model.mjs +0 -347
  132. package/esm2022/src/app/core/services/model/filter.model.mjs +0 -169
  133. package/esm2022/src/app/core/services/model/history.model.mjs +0 -2
  134. package/esm2022/src/app/core/services/model/model.enum.mjs +0 -11
  135. package/esm2022/src/app/core/services/model/node-feature.model.mjs +0 -31
  136. package/esm2022/src/app/core/services/model/peer.model.mjs +0 -114
  137. package/esm2022/src/app/core/services/model/person.model.mjs +0 -118
  138. package/esm2022/src/app/core/services/model/referential.model.mjs +0 -207
  139. package/esm2022/src/app/core/services/model/settings.model.mjs +0 -6
  140. package/esm2022/src/app/core/services/model/token.model.mjs +0 -57
  141. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -234
  142. package/esm2022/src/app/core/services/network.service.mjs +0 -759
  143. package/esm2022/src/app/core/services/network.types.mjs +0 -2
  144. package/esm2022/src/app/core/services/network.utils.mjs +0 -35
  145. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +0 -38
  146. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +0 -23
  147. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +0 -23
  148. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +0 -58
  149. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -36
  150. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
  151. package/esm2022/src/app/core/services/platform.service.mjs +0 -788
  152. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +0 -427
  153. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +0 -450
  154. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +0 -25
  155. package/esm2022/src/app/core/services/testing/referential.validator.mjs +0 -46
  156. package/esm2022/src/app/core/services/validator/account.validator.mjs +0 -46
  157. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +0 -49
  158. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +0 -57
  159. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +0 -27
  160. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +0 -55
  161. package/esm2022/src/app/core/settings/settings.module.mjs +0 -23
  162. package/esm2022/src/app/core/settings/settings.page.mjs +0 -406
  163. package/esm2022/src/app/core/table/async-table.class.mjs +0 -1888
  164. package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -137
  165. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -120
  166. package/esm2022/src/app/core/table/column/row-field.component.mjs +0 -116
  167. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +0 -415
  168. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -407
  169. package/esm2022/src/app/core/table/memory-table.class.mjs +0 -57
  170. package/esm2022/src/app/core/table/table-select-columns.component.mjs +0 -46
  171. package/esm2022/src/app/core/table/table.class.mjs +0 -1918
  172. package/esm2022/src/app/core/table/table.model.mjs +0 -21
  173. package/esm2022/src/app/core/table/table.module.mjs +0 -51
  174. package/esm2022/src/app/core/table/table.pipes.mjs +0 -76
  175. package/esm2022/src/app/core/table/table.utils.mjs +0 -34
  176. package/esm2022/src/app/core/table/testing/nested-table.testing.mjs +0 -326
  177. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
  178. package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -342
  179. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -47
  180. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
  181. package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -322
  182. package/esm2022/src/app/shared/alerts.mjs +0 -243
  183. package/esm2022/src/app/shared/audio/audio.mjs +0 -255
  184. package/esm2022/src/app/shared/audio/audio.testing.mjs +0 -32
  185. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +0 -30
  186. package/esm2022/src/app/shared/base64.utils.mjs +0 -59
  187. package/esm2022/src/app/shared/capacitor/keyboard.mjs +0 -42
  188. package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -10
  189. package/esm2022/src/app/shared/constants.mjs +0 -20
  190. package/esm2022/src/app/shared/dates.mjs +0 -216
  191. package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
  192. package/esm2022/src/app/shared/debug/debug.component.mjs +0 -44
  193. package/esm2022/src/app/shared/debug/debug.module.mjs +0 -23
  194. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +0 -91
  195. package/esm2022/src/app/shared/directives/autoresize.directive.mjs +0 -75
  196. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +0 -30
  197. package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +0 -35
  198. package/esm2022/src/app/shared/directives/cell-selection/cell-identifier.directive.mjs +0 -55
  199. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.directive.mjs +0 -206
  200. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.service.mjs +0 -204
  201. package/esm2022/src/app/shared/directives/directives.module.mjs +0 -53
  202. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +0 -52
  203. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +0 -33
  204. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +0 -62
  205. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +0 -96
  206. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
  207. package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +0 -43
  208. package/esm2022/src/app/shared/events.mjs +0 -64
  209. package/esm2022/src/app/shared/file/csv.utils.mjs +0 -97
  210. package/esm2022/src/app/shared/file/file.service.mjs +0 -118
  211. package/esm2022/src/app/shared/file/file.utils.mjs +0 -117
  212. package/esm2022/src/app/shared/file/images.utils.mjs +0 -218
  213. package/esm2022/src/app/shared/file/json.utils.mjs +0 -58
  214. package/esm2022/src/app/shared/file/uri.utils.mjs +0 -29
  215. package/esm2022/src/app/shared/file/url.utils.mjs +0 -213
  216. package/esm2022/src/app/shared/focusable.mjs +0 -6
  217. package/esm2022/src/app/shared/form/field.component.mjs +0 -388
  218. package/esm2022/src/app/shared/form/field.model.mjs +0 -100
  219. package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
  220. package/esm2022/src/app/shared/forms.mjs +0 -593
  221. package/esm2022/src/app/shared/functions.mjs +0 -900
  222. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -94
  223. package/esm2022/src/app/shared/gesture/gesture-config.mjs +0 -46
  224. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +0 -2
  225. package/esm2022/src/app/shared/graph/colors.utils.mjs +0 -85
  226. package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -214
  227. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -68
  228. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  229. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -147
  230. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
  231. package/esm2022/src/app/shared/html.utils.mjs +0 -35
  232. package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
  233. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -452
  234. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +0 -62
  235. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -26
  236. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -92
  237. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -37
  238. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +0 -59
  239. package/esm2022/src/app/shared/image/image.model.mjs +0 -2
  240. package/esm2022/src/app/shared/image/image.module.mjs +0 -24
  241. package/esm2022/src/app/shared/image/image.service.mjs +0 -118
  242. package/esm2022/src/app/shared/inputs.mjs +0 -281
  243. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  244. package/esm2022/src/app/shared/logging/log-level.model.mjs +0 -48
  245. package/esm2022/src/app/shared/logging/logger.model.mjs +0 -47
  246. package/esm2022/src/app/shared/logging/logging-service.class.mjs +0 -125
  247. package/esm2022/src/app/shared/logging/logging-service.config.mjs +0 -2
  248. package/esm2022/src/app/shared/logging/logging-service.module.mjs +0 -30
  249. package/esm2022/src/app/shared/markdown/markdown.component.mjs +0 -321
  250. package/esm2022/src/app/shared/markdown/markdown.directive.mjs +0 -34
  251. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +0 -99
  252. package/esm2022/src/app/shared/markdown/markdown.module.mjs +0 -87
  253. package/esm2022/src/app/shared/markdown/markdown.service.mjs +0 -204
  254. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +0 -87
  255. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +0 -55
  256. package/esm2022/src/app/shared/markdown/testing/markdown.testing.module.mjs +0 -30
  257. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -46
  258. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -1373
  259. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -81
  260. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -18
  261. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -244
  262. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +0 -251
  263. package/esm2022/src/app/shared/material/badge/badge.module.mjs +0 -20
  264. package/esm2022/src/app/shared/material/badge/badge.test.mjs +0 -42
  265. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +0 -70
  266. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -374
  267. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -83
  268. package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -74
  269. package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -843
  270. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -151
  271. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -79
  272. package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -474
  273. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
  274. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -852
  275. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -140
  276. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -127
  277. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -118
  278. package/esm2022/src/app/shared/material/duration/duration.module.mjs +0 -61
  279. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -16
  280. package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -283
  281. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -85
  282. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -319
  283. package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +0 -471
  284. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -231
  285. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -68
  286. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -138
  287. package/esm2022/src/app/shared/material/material.animations.mjs +0 -200
  288. package/esm2022/src/app/shared/material/material.config.mjs +0 -3
  289. package/esm2022/src/app/shared/material/material.module.mjs +0 -224
  290. package/esm2022/src/app/shared/material/material.testing.module.mjs +0 -234
  291. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -51
  292. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -23
  293. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +0 -379
  294. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  295. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -67
  296. package/esm2022/src/app/shared/material/test/test-component.mjs +0 -264
  297. package/esm2022/src/app/shared/material/testing/common.test.mjs +0 -111
  298. package/esm2022/src/app/shared/modules.mjs +0 -12
  299. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -306
  300. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +0 -49
  301. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +0 -24
  302. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +0 -69
  303. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +0 -74
  304. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +0 -28
  305. package/esm2022/src/app/shared/observables.mjs +0 -104
  306. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -251
  307. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -25
  308. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
  309. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -50
  310. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +0 -72
  311. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +0 -28
  312. package/esm2022/src/app/shared/pipes/date-from.pipe.mjs +0 -29
  313. package/esm2022/src/app/shared/pipes/dates.pipe.mjs +0 -18
  314. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +0 -23
  315. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +0 -34
  316. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +0 -53
  317. package/esm2022/src/app/shared/pipes/form.pipes.mjs +0 -258
  318. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +0 -50
  319. package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -102
  320. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
  321. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -65
  322. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
  323. package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -77
  324. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
  325. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -17
  326. package/esm2022/src/app/shared/pipes/observable.pipes.mjs +0 -63
  327. package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -316
  328. package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -148
  329. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -177
  330. package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -196
  331. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +0 -44
  332. package/esm2022/src/app/shared/pipes/types.pipes.mjs +0 -74
  333. package/esm2022/src/app/shared/pipes/url.pipes.mjs +0 -35
  334. package/esm2022/src/app/shared/platforms.mjs +0 -81
  335. package/esm2022/src/app/shared/print/print.service.mjs +0 -305
  336. package/esm2022/src/app/shared/regexps.mjs +0 -103
  337. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +0 -193
  338. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +0 -19
  339. package/esm2022/src/app/shared/rx-state/rx-state.types.mjs +0 -2
  340. package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -44
  341. package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
  342. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -362
  343. package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
  344. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -144
  345. package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -118
  346. package/esm2022/src/app/shared/services/translate-context.service.mjs +0 -107
  347. package/esm2022/src/app/shared/services/validator-service.class.mjs +0 -2
  348. package/esm2022/src/app/shared/services.mjs +0 -85
  349. package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
  350. package/esm2022/src/app/shared/shared.module.mjs +0 -229
  351. package/esm2022/src/app/shared/shared.testing.module.mjs +0 -108
  352. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -281
  353. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +0 -42
  354. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +0 -27
  355. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +0 -25
  356. package/esm2022/src/app/shared/storage/storage.service.mjs +0 -134
  357. package/esm2022/src/app/shared/storage/storage.utils.mjs +0 -13
  358. package/esm2022/src/app/shared/testing/maskito.test.mjs +0 -41
  359. package/esm2022/src/app/shared/testing/observable.test.mjs +0 -94
  360. package/esm2022/src/app/shared/testing/tests.page.mjs +0 -37
  361. package/esm2022/src/app/shared/toast/toast.testing.mjs +0 -54
  362. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -31
  363. package/esm2022/src/app/shared/toast/toasts.mjs +0 -134
  364. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
  365. package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -279
  366. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +0 -26
  367. package/esm2022/src/app/shared/types.mjs +0 -2
  368. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -59
  369. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +0 -30
  370. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -114
  371. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -216
  372. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +0 -26
  373. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +0 -122
  374. package/esm2022/src/app/shared/validator/validators.mjs +0 -658
  375. package/esm2022/src/app/shared/version/versions.mjs +0 -80
  376. package/esm2022/src/app/social/config/social.config.mjs +0 -9
  377. package/esm2022/src/app/social/feed/feed.component.mjs +0 -317
  378. package/esm2022/src/app/social/feed/feed.directive.mjs +0 -151
  379. package/esm2022/src/app/social/feed/feed.model.mjs +0 -60
  380. package/esm2022/src/app/social/feed/feed.module.mjs +0 -24
  381. package/esm2022/src/app/social/feed/feed.page.mjs +0 -67
  382. package/esm2022/src/app/social/feed/feed.service.mjs +0 -222
  383. package/esm2022/src/app/social/feed/testing/feed.testing.mjs +0 -66
  384. package/esm2022/src/app/social/feed/testing/feed.testing.module.mjs +0 -23
  385. package/esm2022/src/app/social/job/job.module.mjs +0 -23
  386. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -38
  387. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -241
  388. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -50
  389. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +0 -29
  390. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +0 -91
  391. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +0 -38
  392. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +0 -34
  393. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +0 -22
  394. package/esm2022/src/app/social/message/message.form.mjs +0 -149
  395. package/esm2022/src/app/social/message/message.modal.mjs +0 -116
  396. package/esm2022/src/app/social/message/message.model.mjs +0 -86
  397. package/esm2022/src/app/social/message/message.module.mjs +0 -25
  398. package/esm2022/src/app/social/message/message.service.mjs +0 -198
  399. package/esm2022/src/app/social/social.errors.mjs +0 -11
  400. package/esm2022/src/app/social/social.module.mjs +0 -22
  401. package/esm2022/src/app/social/social.testing.module.mjs +0 -72
  402. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -191
  403. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -280
  404. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +0 -84
  405. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -273
  406. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -129
  407. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +0 -22
  408. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -128
  409. package/esm2022/src/app/social/user-event/user-event.model.mjs +0 -2
  410. package/esm2022/src/app/social/user-event/user-event.module.mjs +0 -24
  411. package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -512
  412. package/esm2022/src/environments/environment.class.mjs +0 -69
  413. package/esm2022/src/environments/environment.loader.mjs +0 -77
  414. package/esm2022/src/environments/environment.mjs +0 -133
  415. package/esm2022/sumaris-net.ngx-components.mjs +0 -5
  416. package/index.d.ts +0 -5
  417. package/public_api.d.ts +0 -364
  418. package/src/app/admin/admin-routing.module.d.ts +0 -9
  419. package/src/app/admin/admin.module.d.ts +0 -10
  420. package/src/app/admin/users/person.filter.d.ts +0 -37
  421. package/src/app/admin/users/person.service.d.ts +0 -61
  422. package/src/app/admin/users/person.validator.d.ts +0 -23
  423. package/src/app/admin/users/users-select.modal.d.ts +0 -73
  424. package/src/app/admin/users/users.d.ts +0 -89
  425. package/src/app/admin/users/users.module.d.ts +0 -15
  426. package/src/app/admin/users/users.utils.d.ts +0 -6
  427. package/src/app/core/about/about.modal.d.ts +0 -44
  428. package/src/app/core/about/about.module.d.ts +0 -11
  429. package/src/app/core/account/account.module.d.ts +0 -18
  430. package/src/app/core/account/account.page.d.ts +0 -93
  431. package/src/app/core/account/new-token.form.d.ts +0 -30
  432. package/src/app/core/account/new-token.modal.d.ts +0 -29
  433. package/src/app/core/account/password/change-password.form.d.ts +0 -19
  434. package/src/app/core/account/password/change-password.module.d.ts +0 -11
  435. package/src/app/core/account/password/change-password.page.d.ts +0 -36
  436. package/src/app/core/account/token.table.d.ts +0 -28
  437. package/src/app/core/auth/auth.form.d.ts +0 -38
  438. package/src/app/core/auth/auth.modal.d.ts +0 -24
  439. package/src/app/core/auth/auth.module.d.ts +0 -13
  440. package/src/app/core/auth/reset-password.modal.d.ts +0 -29
  441. package/src/app/core/core.module.d.ts +0 -28
  442. package/src/app/core/core.testing.module.d.ts +0 -16
  443. package/src/app/core/form/array/form-array.d.ts +0 -147
  444. package/src/app/core/form/array/testing/form-array-test.module.d.ts +0 -12
  445. package/src/app/core/form/array/testing/form-array.test.d.ts +0 -27
  446. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -38
  447. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +0 -9
  448. package/src/app/core/form/entity/editor.class.d.ts +0 -86
  449. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +0 -126
  450. package/src/app/core/form/entity/entity-editor.class.d.ts +0 -211
  451. package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
  452. package/src/app/core/form/entity/entity.module.d.ts +0 -11
  453. package/src/app/core/form/entity/tab-editor.class.d.ts +0 -66
  454. package/src/app/core/form/form-container.class.d.ts +0 -132
  455. package/src/app/core/form/form.class.d.ts +0 -148
  456. package/src/app/core/form/form.module.d.ts +0 -15
  457. package/src/app/core/form/form.utils.d.ts +0 -301
  458. package/src/app/core/form/list/list.form.d.ts +0 -83
  459. package/src/app/core/form/list/list.module.d.ts +0 -9
  460. package/src/app/core/form/properties/properties-file.service.d.ts +0 -26
  461. package/src/app/core/form/properties/properties.form.d.ts +0 -109
  462. package/src/app/core/form/properties/properties.module.d.ts +0 -18
  463. package/src/app/core/form/properties/properties.table.d.ts +0 -73
  464. package/src/app/core/form/properties/properties.utils.d.ts +0 -59
  465. package/src/app/core/form/properties/property.validator.d.ts +0 -27
  466. package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -22
  467. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
  468. package/src/app/core/form/text/testing/text-form.testing.d.ts +0 -19
  469. package/src/app/core/form/text/testing/text-form.testing.module.d.ts +0 -14
  470. package/src/app/core/form/text/text-form.component.d.ts +0 -66
  471. package/src/app/core/form/text/text-form.module.d.ts +0 -9
  472. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +0 -16
  473. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +0 -11
  474. package/src/app/core/form/text-popover/text-popover.component.d.ts +0 -81
  475. package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -10
  476. package/src/app/core/form/username/username.form.d.ts +0 -19
  477. package/src/app/core/form/username/username.module.d.ts +0 -9
  478. package/src/app/core/graphql/graphql.module.d.ts +0 -7
  479. package/src/app/core/graphql/graphql.service.d.ts +0 -138
  480. package/src/app/core/graphql/graphql.utils.d.ts +0 -47
  481. package/src/app/core/home/home.d.ts +0 -135
  482. package/src/app/core/home/home.module.d.ts +0 -16
  483. package/src/app/core/icon/icon.component.d.ts +0 -13
  484. package/src/app/core/icon/icon.module.d.ts +0 -9
  485. package/src/app/core/install/install-upgrade-card.component.d.ts +0 -63
  486. package/src/app/core/install/install-upgrade-card.module.d.ts +0 -9
  487. package/src/app/core/menu/menu.component.d.ts +0 -69
  488. package/src/app/core/menu/menu.model.d.ts +0 -163
  489. package/src/app/core/menu/menu.module.d.ts +0 -12
  490. package/src/app/core/menu/menu.service.d.ts +0 -93
  491. package/src/app/core/menu/sub-menu-tab.directive.d.ts +0 -29
  492. package/src/app/core/menu/testing/menu-other.testing.d.ts +0 -15
  493. package/src/app/core/menu/testing/menu.testing.d.ts +0 -53
  494. package/src/app/core/menu/testing/menu.testing.module.d.ts +0 -12
  495. package/src/app/core/offline/update-offline-mode-card.component.d.ts +0 -11
  496. package/src/app/core/offline/update-offline-mode-card.module.d.ts +0 -9
  497. package/src/app/core/peer/select-peer.modal.d.ts +0 -108
  498. package/src/app/core/peer/select-peer.module.d.ts +0 -12
  499. package/src/app/core/register/register-confirm.page.d.ts +0 -24
  500. package/src/app/core/register/register.form.d.ts +0 -49
  501. package/src/app/core/register/register.modal.d.ts +0 -14
  502. package/src/app/core/register/register.module.d.ts +0 -12
  503. package/src/app/core/services/account.service.d.ts +0 -236
  504. package/src/app/core/services/auth-guard.service.d.ts +0 -17
  505. package/src/app/core/services/base-entity-service.class.d.ts +0 -134
  506. package/src/app/core/services/base-graphql-service.class.d.ts +0 -77
  507. package/src/app/core/services/base58.d.ts +0 -7
  508. package/src/app/core/services/config/core.config.d.ts +0 -52
  509. package/src/app/core/services/config.service.d.ts +0 -63
  510. package/src/app/core/services/crypto.service.d.ts +0 -45
  511. package/src/app/core/services/errors.d.ts +0 -65
  512. package/src/app/core/services/local-settings.service.d.ts +0 -130
  513. package/src/app/core/services/model/account.model.d.ts +0 -66
  514. package/src/app/core/services/model/config.model.d.ts +0 -37
  515. package/src/app/core/services/model/department.model.d.ts +0 -11
  516. package/src/app/core/services/model/entity.decorators.d.ts +0 -17
  517. package/src/app/core/services/model/entity.model.d.ts +0 -133
  518. package/src/app/core/services/model/filter.model.d.ts +0 -37
  519. package/src/app/core/services/model/history.model.d.ts +0 -20
  520. package/src/app/core/services/model/model.enum.d.ts +0 -7
  521. package/src/app/core/services/model/node-feature.model.d.ts +0 -14
  522. package/src/app/core/services/model/peer.model.d.ts +0 -35
  523. package/src/app/core/services/model/person.model.d.ts +0 -39
  524. package/src/app/core/services/model/referential.model.d.ts +0 -85
  525. package/src/app/core/services/model/settings.model.d.ts +0 -29
  526. package/src/app/core/services/model/token.model.d.ts +0 -22
  527. package/src/app/core/services/model/tree-item-entity.model.d.ts +0 -62
  528. package/src/app/core/services/network.service.d.ts +0 -184
  529. package/src/app/core/services/network.types.d.ts +0 -4
  530. package/src/app/core/services/network.utils.d.ts +0 -39
  531. package/src/app/core/services/pipes/account.pipes.d.ts +0 -15
  532. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +0 -9
  533. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +0 -11
  534. package/src/app/core/services/pipes/pipes.module.d.ts +0 -11
  535. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +0 -23
  536. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
  537. package/src/app/core/services/platform.service.d.ts +0 -127
  538. package/src/app/core/services/storage/entities-storage.service.d.ts +0 -108
  539. package/src/app/core/services/storage/entity-store.class.d.ts +0 -113
  540. package/src/app/core/services/testing/referential-filter.model.d.ts +0 -9
  541. package/src/app/core/services/testing/referential.validator.d.ts +0 -22
  542. package/src/app/core/services/validator/account.validator.d.ts +0 -24
  543. package/src/app/core/services/validator/base.validator.class.d.ts +0 -21
  544. package/src/app/core/services/validator/local-settings.validator.d.ts +0 -18
  545. package/src/app/core/services/validator/user-settings.validator.d.ts +0 -10
  546. package/src/app/core/services/validator/user-token.validator.d.ts +0 -13
  547. package/src/app/core/settings/settings.module.d.ts +0 -12
  548. package/src/app/core/settings/settings.page.d.ts +0 -89
  549. package/src/app/core/table/async-table.class.d.ts +0 -445
  550. package/src/app/core/table/column/actions-column.component.d.ts +0 -65
  551. package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -47
  552. package/src/app/core/table/column/row-field.component.d.ts +0 -41
  553. package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -103
  554. package/src/app/core/table/entities-table-datasource.class.d.ts +0 -102
  555. package/src/app/core/table/memory-table.class.d.ts +0 -25
  556. package/src/app/core/table/table-select-columns.component.d.ts +0 -22
  557. package/src/app/core/table/table.class.d.ts +0 -427
  558. package/src/app/core/table/table.model.d.ts +0 -31
  559. package/src/app/core/table/table.module.d.ts +0 -14
  560. package/src/app/core/table/table.pipes.d.ts +0 -30
  561. package/src/app/core/table/table.utils.d.ts +0 -13
  562. package/src/app/core/table/testing/nested-table.testing.d.ts +0 -54
  563. package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
  564. package/src/app/core/table/testing/table.testing.d.ts +0 -55
  565. package/src/app/core/table/testing/table.testing.module.d.ts +0 -17
  566. package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
  567. package/src/app/core/table/testing/table2.testing.d.ts +0 -53
  568. package/src/app/shared/alerts.d.ts +0 -55
  569. package/src/app/shared/audio/audio.d.ts +0 -45
  570. package/src/app/shared/audio/audio.testing.d.ts +0 -13
  571. package/src/app/shared/audio/audio.testing.module.d.ts +0 -11
  572. package/src/app/shared/base64.utils.d.ts +0 -7
  573. package/src/app/shared/capacitor/keyboard.d.ts +0 -16
  574. package/src/app/shared/capacitor/plugins.d.ts +0 -8
  575. package/src/app/shared/constants.d.ts +0 -16
  576. package/src/app/shared/dates.d.ts +0 -85
  577. package/src/app/shared/debug/debug-service.class.d.ts +0 -5
  578. package/src/app/shared/debug/debug.component.d.ts +0 -14
  579. package/src/app/shared/debug/debug.module.d.ts +0 -12
  580. package/src/app/shared/directives/autofocus.directive.d.ts +0 -18
  581. package/src/app/shared/directives/autoresize.directive.d.ts +0 -20
  582. package/src/app/shared/directives/autotitle.directive.d.ts +0 -11
  583. package/src/app/shared/directives/autotooltip.directive.d.ts +0 -14
  584. package/src/app/shared/directives/cell-selection/cell-identifier.directive.d.ts +0 -17
  585. package/src/app/shared/directives/cell-selection/cell-selection.directive.d.ts +0 -29
  586. package/src/app/shared/directives/cell-selection/cell-selection.service.d.ts +0 -67
  587. package/src/app/shared/directives/directives.module.d.ts +0 -15
  588. package/src/app/shared/directives/drag-and-drop.directive.d.ts +0 -17
  589. package/src/app/shared/directives/ng-var.directive.d.ts +0 -12
  590. package/src/app/shared/directives/resizable/resizable.component.d.ts +0 -21
  591. package/src/app/shared/directives/resizable/resizable.directive.d.ts +0 -24
  592. package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
  593. package/src/app/shared/directives/throttled-click.directive.d.ts +0 -16
  594. package/src/app/shared/events.d.ts +0 -29
  595. package/src/app/shared/file/csv.utils.d.ts +0 -30
  596. package/src/app/shared/file/file.service.d.ts +0 -23
  597. package/src/app/shared/file/file.utils.d.ts +0 -20
  598. package/src/app/shared/file/images.utils.d.ts +0 -42
  599. package/src/app/shared/file/json.utils.d.ts +0 -19
  600. package/src/app/shared/file/uri.utils.d.ts +0 -8
  601. package/src/app/shared/file/url.utils.d.ts +0 -108
  602. package/src/app/shared/focusable.d.ts +0 -4
  603. package/src/app/shared/form/field.component.d.ts +0 -83
  604. package/src/app/shared/form/field.model.d.ts +0 -88
  605. package/src/app/shared/form/loading-spinner.d.ts +0 -8
  606. package/src/app/shared/forms.d.ts +0 -170
  607. package/src/app/shared/functions.d.ts +0 -325
  608. package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -25
  609. package/src/app/shared/gesture/gesture-config.d.ts +0 -15
  610. package/src/app/shared/gesture/hammer.utils.d.ts +0 -16
  611. package/src/app/shared/graph/colors.utils.d.ts +0 -34
  612. package/src/app/shared/graph/graph-colors.d.ts +0 -63
  613. package/src/app/shared/guard/component-dirty.guard.d.ts +0 -14
  614. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
  615. package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -48
  616. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
  617. package/src/app/shared/html.utils.d.ts +0 -17
  618. package/src/app/shared/http/http.utils.d.ts +0 -28
  619. package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -139
  620. package/src/app/shared/image/gallery/image-gallery.module.d.ts +0 -15
  621. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +0 -12
  622. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +0 -33
  623. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +0 -16
  624. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +0 -13
  625. package/src/app/shared/image/image.model.d.ts +0 -7
  626. package/src/app/shared/image/image.module.d.ts +0 -8
  627. package/src/app/shared/image/image.service.d.ts +0 -39
  628. package/src/app/shared/inputs.d.ts +0 -37
  629. package/src/app/shared/interceptors/progess.interceptor.d.ts +0 -8
  630. package/src/app/shared/logging/log-level.model.d.ts +0 -38
  631. package/src/app/shared/logging/logger.model.d.ts +0 -68
  632. package/src/app/shared/logging/logging-service.class.d.ts +0 -39
  633. package/src/app/shared/logging/logging-service.config.d.ts +0 -25
  634. package/src/app/shared/logging/logging-service.module.d.ts +0 -9
  635. package/src/app/shared/markdown/markdown.component.d.ts +0 -86
  636. package/src/app/shared/markdown/markdown.directive.d.ts +0 -13
  637. package/src/app/shared/markdown/markdown.modal.d.ts +0 -49
  638. package/src/app/shared/markdown/markdown.module.d.ts +0 -17
  639. package/src/app/shared/markdown/markdown.service.d.ts +0 -37
  640. package/src/app/shared/markdown/markdown.utils.d.ts +0 -26
  641. package/src/app/shared/markdown/testing/markdown.test.d.ts +0 -18
  642. package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +0 -12
  643. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -74
  644. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -231
  645. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -23
  646. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +0 -5
  647. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +0 -48
  648. package/src/app/shared/material/badge/badge.directive.d.ts +0 -43
  649. package/src/app/shared/material/badge/badge.module.d.ts +0 -10
  650. package/src/app/shared/material/badge/badge.test.d.ts +0 -21
  651. package/src/app/shared/material/boolean/boolean.module.d.ts +0 -21
  652. package/src/app/shared/material/boolean/material.boolean.d.ts +0 -94
  653. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -31
  654. package/src/app/shared/material/chips/chips.module.d.ts +0 -22
  655. package/src/app/shared/material/chips/material.chips.d.ts +0 -167
  656. package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
  657. package/src/app/shared/material/datetime/datetime.module.d.ts +0 -25
  658. package/src/app/shared/material/datetime/material.date.d.ts +0 -90
  659. package/src/app/shared/material/datetime/material.dateshort.d.ts +0 -89
  660. package/src/app/shared/material/datetime/material.datetime.d.ts +0 -136
  661. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -38
  662. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +0 -32
  663. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +0 -31
  664. package/src/app/shared/material/duration/duration.module.d.ts +0 -18
  665. package/src/app/shared/material/duration/duration.utils.d.ts +0 -2
  666. package/src/app/shared/material/duration/material.duration.d.ts +0 -64
  667. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -23
  668. package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -59
  669. package/src/app/shared/material/latlong/material.latlong-input.d.ts +0 -93
  670. package/src/app/shared/material/latlong/material.latlong.d.ts +0 -90
  671. package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -21
  672. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -30
  673. package/src/app/shared/material/material.animations.d.ts +0 -8
  674. package/src/app/shared/material/material.config.d.ts +0 -3
  675. package/src/app/shared/material/material.module.d.ts +0 -44
  676. package/src/app/shared/material/material.testing.module.d.ts +0 -31
  677. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -12
  678. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +0 -10
  679. package/src/app/shared/material/swipe/material.swipe.d.ts +0 -89
  680. package/src/app/shared/material/swipe/swipe.module.d.ts +0 -16
  681. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +0 -22
  682. package/src/app/shared/material/test/test-component.d.ts +0 -75
  683. package/src/app/shared/material/testing/common.test.d.ts +0 -25
  684. package/src/app/shared/modules.d.ts +0 -9
  685. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -63
  686. package/src/app/shared/named-filter/named-filter.model.d.ts +0 -32
  687. package/src/app/shared/named-filter/named-filter.module.d.ts +0 -13
  688. package/src/app/shared/named-filter/named-filter.service.d.ts +0 -32
  689. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +0 -34
  690. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +0 -10
  691. package/src/app/shared/observables.d.ts +0 -32
  692. package/src/app/shared/pipes/arrays.pipe.d.ts +0 -93
  693. package/src/app/shared/pipes/badge.pipes.d.ts +0 -7
  694. package/src/app/shared/pipes/colors.pipe.d.ts +0 -9
  695. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +0 -25
  696. package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
  697. package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -14
  698. package/src/app/shared/pipes/date-from.pipe.d.ts +0 -14
  699. package/src/app/shared/pipes/dates.pipe.d.ts +0 -10
  700. package/src/app/shared/pipes/display-with.pipe.d.ts +0 -8
  701. package/src/app/shared/pipes/duration.pipe.d.ts +0 -23
  702. package/src/app/shared/pipes/file-size.pipe.d.ts +0 -30
  703. package/src/app/shared/pipes/form.pipes.d.ts +0 -84
  704. package/src/app/shared/pipes/highlight.pipe.d.ts +0 -11
  705. package/src/app/shared/pipes/html.pipes.d.ts +0 -50
  706. package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
  707. package/src/app/shared/pipes/maps.pipe.d.ts +0 -23
  708. package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
  709. package/src/app/shared/pipes/math.pipes.d.ts +0 -26
  710. package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
  711. package/src/app/shared/pipes/number-format.pipe.d.ts +0 -9
  712. package/src/app/shared/pipes/observable.pipes.d.ts +0 -25
  713. package/src/app/shared/pipes/pipes.module.d.ts +0 -36
  714. package/src/app/shared/pipes/property.pipes.d.ts +0 -46
  715. package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
  716. package/src/app/shared/pipes/string.pipes.d.ts +0 -72
  717. package/src/app/shared/pipes/translate-context.pipe.d.ts +0 -17
  718. package/src/app/shared/pipes/types.pipes.d.ts +0 -30
  719. package/src/app/shared/pipes/url.pipes.d.ts +0 -27
  720. package/src/app/shared/platforms.d.ts +0 -16
  721. package/src/app/shared/print/print.service.d.ts +0 -94
  722. package/src/app/shared/regexps.d.ts +0 -32
  723. package/src/app/shared/rx-state/rx-state.decorators.d.ts +0 -33
  724. package/src/app/shared/rx-state/rx-state.module.d.ts +0 -10
  725. package/src/app/shared/rx-state/rx-state.types.d.ts +0 -5
  726. package/src/app/shared/services/entity-service.class.d.ts +0 -117
  727. package/src/app/shared/services/job.utils.d.ts +0 -20
  728. package/src/app/shared/services/memory-entity-service.class.d.ts +0 -87
  729. package/src/app/shared/services/progress-bar.service.d.ts +0 -20
  730. package/src/app/shared/services/startable-observable-service.class.d.ts +0 -51
  731. package/src/app/shared/services/startable-service.class.d.ts +0 -38
  732. package/src/app/shared/services/translate-context.service.d.ts +0 -29
  733. package/src/app/shared/services/validator-service.class.d.ts +0 -11
  734. package/src/app/shared/services.d.ts +0 -17
  735. package/src/app/shared/shared-routing.module.d.ts +0 -23
  736. package/src/app/shared/shared.module.d.ts +0 -33
  737. package/src/app/shared/shared.testing.module.d.ts +0 -20
  738. package/src/app/shared/storage/storage-explorer.component.d.ts +0 -60
  739. package/src/app/shared/storage/storage-explorer.module.d.ts +0 -13
  740. package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +0 -9
  741. package/src/app/shared/storage/storage-explorer.testing.module.d.ts +0 -10
  742. package/src/app/shared/storage/storage.service.d.ts +0 -22
  743. package/src/app/shared/storage/storage.utils.d.ts +0 -19
  744. package/src/app/shared/testing/maskito.test.d.ts +0 -10
  745. package/src/app/shared/testing/observable.test.d.ts +0 -25
  746. package/src/app/shared/testing/tests.page.d.ts +0 -20
  747. package/src/app/shared/toast/toast.testing.d.ts +0 -15
  748. package/src/app/shared/toast/toast.testing.module.d.ts +0 -12
  749. package/src/app/shared/toast/toasts.d.ts +0 -16
  750. package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
  751. package/src/app/shared/toolbar/toolbar.d.ts +0 -72
  752. package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
  753. package/src/app/shared/types.d.ts +0 -45
  754. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +0 -21
  755. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +0 -11
  756. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +0 -49
  757. package/src/app/shared/upload-file/upload-file.component.d.ts +0 -50
  758. package/src/app/shared/upload-file/upload-file.model.d.ts +0 -30
  759. package/src/app/shared/validator/form-error-adapter.class.d.ts +0 -33
  760. package/src/app/shared/validator/validators.d.ts +0 -145
  761. package/src/app/shared/version/versions.d.ts +0 -14
  762. package/src/app/social/config/social.config.d.ts +0 -4
  763. package/src/app/social/feed/feed.component.d.ts +0 -91
  764. package/src/app/social/feed/feed.directive.d.ts +0 -32
  765. package/src/app/social/feed/feed.model.d.ts +0 -69
  766. package/src/app/social/feed/feed.module.d.ts +0 -13
  767. package/src/app/social/feed/feed.page.d.ts +0 -24
  768. package/src/app/social/feed/feed.service.d.ts +0 -85
  769. package/src/app/social/feed/testing/feed.testing.d.ts +0 -23
  770. package/src/app/social/feed/testing/feed.testing.module.d.ts +0 -12
  771. package/src/app/social/job/job.module.d.ts +0 -12
  772. package/src/app/social/job/progression/job-progression.component.d.ts +0 -24
  773. package/src/app/social/job/progression/job-progression.icon.d.ts +0 -63
  774. package/src/app/social/job/progression/job-progression.list.d.ts +0 -20
  775. package/src/app/social/job/progression/job-progression.model.d.ts +0 -10
  776. package/src/app/social/job/progression/job-progression.service.d.ts +0 -33
  777. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -13
  778. package/src/app/social/job/testing/job-progression.testing.service.d.ts +0 -9
  779. package/src/app/social/job/testing/job.testing.module.d.ts +0 -11
  780. package/src/app/social/message/message.form.d.ts +0 -36
  781. package/src/app/social/message/message.modal.d.ts +0 -47
  782. package/src/app/social/message/message.model.d.ts +0 -36
  783. package/src/app/social/message/message.module.d.ts +0 -14
  784. package/src/app/social/message/message.service.d.ts +0 -44
  785. package/src/app/social/social.errors.d.ts +0 -10
  786. package/src/app/social/social.module.d.ts +0 -20
  787. package/src/app/social/social.testing.module.d.ts +0 -14
  788. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -47
  789. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -77
  790. package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +0 -37
  791. package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -44
  792. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -42
  793. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +0 -11
  794. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +0 -41
  795. package/src/app/social/user-event/user-event.model.d.ts +0 -44
  796. package/src/app/social/user-event/user-event.module.d.ts +0 -14
  797. package/src/app/social/user-event/user-event.service.d.ts +0 -124
  798. package/src/environments/environment.class.d.ts +0 -86
  799. package/src/environments/environment.d.ts +0 -2
  800. package/src/environments/environment.loader.d.ts +0 -24
  801. package/src/theme/_globals.scss +0 -5
package/README.md CHANGED
@@ -8,6 +8,8 @@ Features :
8
8
  - v2.6.x for Angular 14
9
9
  - v2.7.x for Angular 17
10
10
  - v18.x for Angular 18
11
+ - v20.x for Angular 20
12
+ - v21.x for Angular 21
11
13
  - Angular Material design
12
14
  - Ionic framework
13
15
  - i18n
package/doc/build.md CHANGED
@@ -8,9 +8,9 @@ This article will explain how to install your environment, then build the librar
8
8
 
9
9
  1. Install [NVM](https://github.com/nvm-sh/nvm)
10
10
 
11
- 2. Install Node (v20+) (e.g 20.17.0)
11
+ 2. Install Node (v22+) (e.g 22.21.1)
12
12
  ```bash
13
- nvm install 20.17.0
13
+ nvm install 22.21.1
14
14
  ```
15
15
  > Check versions in `package.json`
16
16
 
package/doc/changelog.md CHANGED
@@ -2197,7 +2197,7 @@ enh: Environment: add useHash property to configure Angular router to use hash U
2197
2197
 
2198
2198
  ## 18.23.68
2199
2199
  - enh(theme): add responsive `min-width` utility classes for select panel - Allow to use panelClass with :
2200
- * mobile/desktop: `min-width-fit-content`, `min-width-medium`, `min-width-large`, `min-width-xlarge` , `min-width-80vw` :
2200
+ * mobile/desktop: `min-width-fit-content`, `min-width-medium`, `min-width-large`, `min-width-xlarge` , `min-width-80vw` :
2201
2201
  * mobile only: `mat-select-panel-fit-content`|`mat-select-panel-medium-size`|`mat-select-panel-large-size`|`mat-select-panel-xlarge-size`|`mat-select-panel-80vw-size`
2202
2202
 
2203
2203
  ## 18.23.69
@@ -2213,7 +2213,7 @@ enh: Environment: add useHash property to configure Angular router to use hash U
2213
2213
  ## 18.24.0
2214
2214
  - enh(form-container) Allow to call `addForm()`, `addForms()` and `removeForm()` with a FormGroup argument (it will be wrapped into AppForm)
2215
2215
 
2216
- ## 18.24.1 - 18.24.2
2216
+ ## 18.24.1 - 18.24.2
2217
2217
  - enh(editor) Fix error in `saveDirtyChildren()` error, when having no children
2218
2218
 
2219
2219
  ## 18.24.3
@@ -2246,8 +2246,9 @@ enh: Environment: add useHash property to configure Angular router to use hash U
2246
2246
  ## 18.24.22
2247
2247
  - fix(menu) Allow to hide the footer, on small screens
2248
2248
 
2249
- ## 18.24.23
2250
- - fix(material.date) Prevent event propagation in `openDatePicker()`
2251
-
2252
2249
  ## 18.24.24
2253
2250
  - enh(FileUtils) Add more options to `showUploadPopover()` like `backdropDismiss`, `keyboardClose` and `translucent`.
2251
+
2252
+ ## 21.0.0
2253
+ - enh(core) Migration to Angular 21 and Ionic 8
2254
+ - enh(e2e) Allow to run e2e on many peer/login, using file `e2e/.environments.json` or `.environments.json` (or `.local/environments.json`)
@@ -0,0 +1,496 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import { test } from '@playwright/test';
4
+
5
+ /**
6
+ * Utility selectors and helpers for Ionic components in e2e tests.
7
+ */
8
+ const IonicSelectors = {
9
+ /** Ionic button */
10
+ button: 'ion-button',
11
+ /** Ionic modal */
12
+ modal: 'ion-modal',
13
+ /** Ionic content area */
14
+ content: 'ion-content',
15
+ /** Ionic item */
16
+ item: 'ion-item',
17
+ /** Ionic label */
18
+ label: 'ion-label',
19
+ /** Ionic spinner */
20
+ spinner: 'ion-spinner',
21
+ /** Ionic skeleton text (loading placeholder) */
22
+ skeletonText: 'ion-skeleton-text',
23
+ /** Ionic back button */
24
+ backButton: 'ion-back-button',
25
+ /** Ionic toolbar */
26
+ toolbar: 'ion-toolbar',
27
+ /** Ionic footer */
28
+ footer: 'ion-footer',
29
+ /** Ionic header */
30
+ header: 'ion-header',
31
+ };
32
+ /**
33
+ * Helper functions for interacting with Ionic components.
34
+ */
35
+ class IonicHelper {
36
+ page;
37
+ constructor(page) {
38
+ this.page = page;
39
+ }
40
+ /** Get an Ionic button by text content */
41
+ buttonByText(text) {
42
+ return this.page.locator(IonicSelectors.button, { hasText: text });
43
+ }
44
+ /** Get an Ionic button by CSS selector */
45
+ button(selector, options) {
46
+ const fullSelector = selector ? `${IonicSelectors.button}${selector}` : IonicSelectors.button;
47
+ return this.page.locator(fullSelector, options);
48
+ }
49
+ /**
50
+ * Get an Ionic modal by its inner component selector (e.g. 'app-auth-form').
51
+ * Automatically wraps the selector in `ion-modal:has(...)` so callers
52
+ * only need to provide the component tag name.
53
+ */
54
+ modal(selector) {
55
+ const fullSelector = selector.startsWith('ion-modal') ? selector : `ion-modal:has(${selector})`;
56
+ return this.page.locator(fullSelector);
57
+ }
58
+ /** Wait for the Ionic app to be ready */
59
+ async waitForAppReady(timeout = 15_000) {
60
+ // Wait for ion-app to be attached (Angular bootstrap complete)
61
+ await this.page.waitForSelector('ion-app', { state: 'attached', timeout });
62
+ }
63
+ /** Wait for loading spinners to disappear */
64
+ async waitForLoadingComplete(timeout = 15_000) {
65
+ await this.page.locator(IonicSelectors.spinner).waitFor({ state: 'hidden', timeout }).catch(() => {
66
+ // Spinner may not appear at all — that's fine
67
+ });
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Utility selectors and helpers for Angular Material components in e2e tests.
73
+ */
74
+ const MaterialSelectors = {
75
+ /** Material table row */
76
+ row: 'mat-row, tr[mat-row]',
77
+ /** Material header row */
78
+ headerRow: 'mat-header-row, tr[mat-header-row]',
79
+ /** Material cell */
80
+ cell: 'mat-cell, td[mat-cell]',
81
+ /** Material form field */
82
+ formField: 'mat-form-field',
83
+ /** Material input */
84
+ input: 'input[matInput]',
85
+ /** Material tab group */
86
+ tabGroup: 'mat-tab-group',
87
+ /** Material tab label */
88
+ tabLabel: '.mat-mdc-tab',
89
+ /** Material paginator */
90
+ paginator: 'mat-paginator',
91
+ /** Material icon */
92
+ icon: 'mat-icon',
93
+ /** Material autocomplete panel */
94
+ autocompletePanel: '.mat-mdc-autocomplete-panel',
95
+ /** Material autocomplete option */
96
+ autocompleteOption: 'mat-option',
97
+ };
98
+ /**
99
+ * Helper functions for interacting with Angular Material components.
100
+ */
101
+ class MaterialHelper {
102
+ page;
103
+ constructor(page) {
104
+ this.page = page;
105
+ }
106
+ /** Get all visible table rows, optionally scoped to a parent locator */
107
+ tableRows(scope) {
108
+ const root = scope ?? this.page;
109
+ return root.locator(MaterialSelectors.row);
110
+ }
111
+ /** Get a single table row by index (0-based), optionally scoped to a parent locator */
112
+ tableRow(index, scope) {
113
+ return this.tableRows(scope).nth(index);
114
+ }
115
+ /** Click on a table row by index (0-based), optionally scoped to a parent locator */
116
+ async clickRow(index, scope) {
117
+ await this.tableRow(index, scope).click();
118
+ }
119
+ /** Get a tab by its label text */
120
+ tabByLabel(text) {
121
+ return this.page.locator(MaterialSelectors.tabLabel, { hasText: text });
122
+ }
123
+ /** Click a tab by its label text */
124
+ async clickTab(text) {
125
+ await this.tabByLabel(text).click();
126
+ }
127
+ /** Fill a mat-form-field input identified by its formControlName.
128
+ * Supports both native inputs with formcontrolname and custom components (e.g. mat-autocomplete-field) wrapping an input. */
129
+ async fillFormControl(formControlName, value) {
130
+ // Try native input first, then fall back to custom component wrapper
131
+ const nativeInput = this.page.locator(`${MaterialSelectors.formField} input[formcontrolname="${formControlName}"]`);
132
+ const wrappedInput = this.page.locator(`[formcontrolname="${formControlName}"] input`);
133
+ const input = (await nativeInput.count()) > 0 ? nativeInput : wrappedInput;
134
+ // Click the parent mat-form-field to ensure focus reaches the input
135
+ const formField = input.locator('xpath=ancestor::mat-form-field');
136
+ if ((await formField.count()) > 0) {
137
+ await formField.first().click();
138
+ }
139
+ else {
140
+ await input.click({ force: true });
141
+ }
142
+ await input.pressSequentially(value, { delay: 50 });
143
+ }
144
+ /**
145
+ * Select an option from a mat-select dropdown by formControlName.
146
+ * Opens the dropdown, waits for options to render, clicks the matching option, then waits for the dropdown to close.
147
+ */
148
+ async selectMatSelectOption(formControlName, optionText) {
149
+ const select = this.page.locator(`mat-select[formcontrolname="${formControlName}"]`);
150
+ await select.click();
151
+ // Use role-based selector: mat-select renders options with role="option" in a listbox
152
+ const option = this.page.getByRole('option', { name: optionText });
153
+ await option.waitFor({ state: 'visible', timeout: 10_000 });
154
+ await option.click();
155
+ // Wait for the option to disappear (dropdown closed)
156
+ await option.waitFor({ state: 'hidden', timeout: 5_000 });
157
+ }
158
+ /** Select an autocomplete option by text after typing in a form control */
159
+ async selectAutocompleteOption(formControlName, searchText, optionText) {
160
+ await this.fillFormControl(formControlName, searchText);
161
+ const panel = this.page.locator(MaterialSelectors.autocompletePanel);
162
+ await panel.waitFor({ state: 'visible', timeout: 10_000 });
163
+ await panel.locator(MaterialSelectors.autocompleteOption, { hasText: optionText }).click();
164
+ }
165
+ /** Wait for table rows to be loaded (at least one row visible), optionally scoped to a parent locator */
166
+ async waitForTableRows(timeout = 15_000, scope) {
167
+ await this.tableRows(scope).first().waitFor({ state: 'visible', timeout });
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Common UI helper functions to improve readability of e2e tests.
173
+ * This helper centralizes access to Ionic and Material specific helpers.
174
+ */
175
+ class UiHelper {
176
+ page;
177
+ ionic;
178
+ mat;
179
+ constructor(page) {
180
+ this.page = page;
181
+ this.ionic = new IonicHelper(page);
182
+ this.mat = new MaterialHelper(page);
183
+ }
184
+ /**
185
+ * Click an element and wait for it to be ready.
186
+ * @param locator The locator to click.
187
+ * @param timeout The maximum time to wait.
188
+ */
189
+ async click(locator, timeout = 10_000) {
190
+ await locator.waitFor({ state: 'visible', timeout });
191
+ // force: true bypasses Ionic overlay elements (ion-col, ion-toolbar) that intercept pointer events
192
+ await locator.click({ force: true });
193
+ }
194
+ /**
195
+ * Fill an input and wait for it to be ready.
196
+ * @param locator The locator to fill.
197
+ * @param value The value to enter.
198
+ * @param timeout The maximum time to wait.
199
+ */
200
+ async fill(locator, value, timeout = 10_000) {
201
+ await locator.waitFor({ state: 'visible', timeout });
202
+ await locator.fill(value);
203
+ }
204
+ /**
205
+ * Wait for an element to be visible.
206
+ * @param locator The locator to wait for.
207
+ * @param timeout The maximum time to wait.
208
+ */
209
+ async waitForVisible(locator, timeout = 10_000) {
210
+ await locator.waitFor({ state: 'visible', timeout });
211
+ }
212
+ /**
213
+ * Wait for an element to be hidden.
214
+ * @param locator The locator to wait for.
215
+ * @param timeout The maximum time to wait.
216
+ */
217
+ async waitForHidden(locator, timeout = 15_000) {
218
+ await locator.waitFor({ state: 'hidden', timeout });
219
+ }
220
+ /* --- Unified Selectors --- */
221
+ /**
222
+ * Get a button by its text content.
223
+ * Supports both Ionic and Material buttons.
224
+ * @param text The text content to match.
225
+ * @param scope Optional locator to scope the search within.
226
+ */
227
+ button(text, scope) {
228
+ // Combine selectors for both Ionic and Material buttons
229
+ const selectors = [
230
+ IonicSelectors.button,
231
+ 'button[mat-button]',
232
+ 'button[mat-raised-button]',
233
+ 'button[mat-flat-button]',
234
+ 'button[mat-stroked-button]',
235
+ 'button[mat-icon-button]',
236
+ 'button[mat-fab]',
237
+ 'button[mat-mini-fab]',
238
+ ].join(', ');
239
+ const root = scope ?? this.page;
240
+ return root.locator(selectors, { hasText: text });
241
+ }
242
+ /**
243
+ * Get an icon button by its icon name.
244
+ * Supports both Ionic and Material icon buttons.
245
+ * @param iconName The icon name (e.g. 'mail', 'search', 'ellipsis-horizontal').
246
+ * @param scope Optional locator to scope the search within.
247
+ */
248
+ iconButton(iconName, scope) {
249
+ const matIconSelector = `${MaterialSelectors.icon}:has-text("${iconName}")`;
250
+ const ionIconSelector = `ion-icon[name="${iconName}"]`;
251
+ const root = scope ?? this.page;
252
+ return root.locator(`button, ion-button`).filter({
253
+ has: this.page.locator(`${matIconSelector}, ${ionIconSelector}`),
254
+ });
255
+ }
256
+ /**
257
+ * Access to the underlying Playwright Page object.
258
+ */
259
+ get pageObj() {
260
+ return this.page;
261
+ }
262
+ /** Get a modal by its selector */
263
+ modal(selector) {
264
+ return this.ionic.modal(selector);
265
+ }
266
+ /** Get a tab by its label text */
267
+ tab(text) {
268
+ return this.mat.tabByLabel(text);
269
+ }
270
+ /* --- Specialized Helpers (delegated) --- */
271
+ /** Wait for the app to be ready */
272
+ async waitForAppReady(timeout = 15_000) {
273
+ await this.ionic.waitForAppReady(timeout);
274
+ }
275
+ /** Wait for loading spinners to disappear */
276
+ async waitForLoadingComplete(timeout = 15_000) {
277
+ await this.ionic.waitForLoadingComplete(timeout);
278
+ }
279
+ /** Wait for table rows to be loaded, optionally scoped to a parent locator */
280
+ async waitForTableRows(timeout = 15_000, scope) {
281
+ await this.mat.waitForTableRows(timeout, scope);
282
+ }
283
+ /** Get a single table row by index (0-based), optionally scoped to a parent locator */
284
+ tableRow(index, scope) {
285
+ return this.mat.tableRow(index, scope);
286
+ }
287
+ /** Click on a table row by index, optionally scoped to a parent locator */
288
+ async clickRow(index, scope) {
289
+ await this.click(this.tableRow(index, scope));
290
+ }
291
+ /** Fill a mat-form-field input identified by its formControlName */
292
+ async fillFormControl(formControlName, value) {
293
+ await this.mat.fillFormControl(formControlName, value);
294
+ }
295
+ /** Select an autocomplete option */
296
+ async selectAutocompleteOption(formControlName, searchText, optionText) {
297
+ await this.mat.selectAutocompleteOption(formControlName, searchText, optionText);
298
+ }
299
+ /**
300
+ * Select an option from a mat-select dropdown.
301
+ * Opens the dropdown, waits for options, clicks the matching one, then waits for the dropdown to close.
302
+ */
303
+ async selectOption(formControlName, optionText) {
304
+ await this.mat.selectMatSelectOption(formControlName, optionText);
305
+ }
306
+ }
307
+
308
+ const STARTUP_DATA_STORAGE_KEY = '__appStartupData';
309
+ /**
310
+ * Helper for authentication in e2e tests.
311
+ */
312
+ class AuthHelper {
313
+ page;
314
+ ui;
315
+ constructor(page, ui) {
316
+ this.page = page;
317
+ this.ui = ui ?? new UiHelper(page);
318
+ }
319
+ /** Login with given test credentials */
320
+ async login(username, password) {
321
+ const ui = this.ui;
322
+ await this.page.goto('/');
323
+ // Wait for the app to fully load (backend connection can take time)
324
+ await ui.waitForAppReady(30_000);
325
+ await ui.waitForLoadingComplete(30_000);
326
+ // Click the login button on the home page
327
+ const loginButton = ui.button(/Se connecter|Log In/).first();
328
+ await ui.click(loginButton, 30_000);
329
+ // Wait for the auth modal to appear
330
+ const modal = ui.modal('app-auth-form');
331
+ await ui.waitForVisible(modal);
332
+ // Fill credentials (may or may not be pre-filled depending on the environment)
333
+ const usernameInput = modal.locator('input[formcontrolname="username"]');
334
+ await usernameInput.click({ force: true });
335
+ await usernameInput.fill(username);
336
+ const passwordInput = modal.locator('input[formcontrolname="password"]');
337
+ await passwordInput.click({ force: true });
338
+ await passwordInput.fill(password);
339
+ // Click the submit button in the modal footer
340
+ const ionModal = ui.pageObj.locator('ion-modal:has(app-auth-form)');
341
+ const submitButton = ionModal.locator('ion-footer ion-button[color="tertiary"]');
342
+ await submitButton.waitFor({ state: 'visible', timeout: 10_000 });
343
+ // Wait for the button to be enabled (form valid)
344
+ await ui.pageObj.waitForFunction((btn) => !btn.hasAttribute('disabled'), await submitButton.elementHandle(), { timeout: 5_000 });
345
+ await submitButton.click();
346
+ // Wait for the modal to close and verify the user is logged in
347
+ await ui.waitForHidden(modal, 30_000);
348
+ // After login, the login button should no longer be visible (replaced by user menu)
349
+ await loginButton.waitFor({ state: 'hidden', timeout: 10_000 });
350
+ }
351
+ /** Wait until the user is logged in and return the email shown in the side menu */
352
+ async waitForLoggedIn() {
353
+ const emailEl = this.page.locator('ion-menu h4').first();
354
+ await emailEl.waitFor({ state: 'visible', timeout: 30_000 });
355
+ return emailEl.textContent();
356
+ }
357
+ /** Setup startup data with provided credentials or environment variables */
358
+ async loginByEnv(opts) {
359
+ const username = opts?.username ?? process.env.E2E_USERNAME;
360
+ const password = opts?.password ?? process.env.E2E_PASSWORD;
361
+ const offline = opts?.offline ?? process.env.E2E_OFFLINE === 'true';
362
+ const peerUrl = opts?.peerUrl ?? process.env.E2E_PEER_URL;
363
+ if (!username && !password && !peerUrl)
364
+ return;
365
+ await this.page.addInitScript(({ key, username, password, offline, peerUrl }) => {
366
+ window[key] = { username, password, offline, peerUrl };
367
+ }, { key: STARTUP_DATA_STORAGE_KEY, username, password, offline, peerUrl });
368
+ }
369
+ }
370
+
371
+ // GPL v3 License
372
+ /**
373
+ * Search environments based on provided criteria.
374
+ *
375
+ * Use when you need to run tests with one or more environments.
376
+ * Test can use `testWithEnv` to run tests with a specific environment.
377
+ * Example :
378
+ *
379
+ * ```
380
+ * test.describe('Sample test with environment', () => {
381
+ * withEnvs({
382
+ * peerTags: ['local'],
383
+ * userTags: ['admin'],
384
+ * }).forEach((env) => {
385
+ * testWithEnv(env)(`Some test with environment ${env.id}`, async ({ page }) => {
386
+ * // Test implementation
387
+ * });
388
+ * });
389
+ * });
390
+ * ```
391
+ *
392
+ * Environments are loaded from a JSON config file located at one of four paths :
393
+ * - `LOGIN_ENVS_PATH` environment variable
394
+ * - `.environments.json` in the current directory (e.g. `.environments.json`)
395
+ * - `.environments.json` in the `.local` directory (e.g. `.local/environments.json`)
396
+ * - `.environments.json` in the `e2e` directory (e.g. `e2e/.environments.json`)
397
+ *
398
+ * Example of JSON :
399
+ *
400
+ * ```
401
+ * {
402
+ * "peers": [
403
+ * {
404
+ * "id": "local",
405
+ * "tags": ["local"],
406
+ * "url": "http://localhost:8080",
407
+ * "users": [
408
+ * {
409
+ * "tags": ["admin"],
410
+ * "username": "admin@sumaris.net",
411
+ * "password": "admin"
412
+ * }
413
+ * ]
414
+ * }
415
+ * ]
416
+ * }
417
+ * ```
418
+ *
419
+ * @see testWithEnv
420
+ * @param filter Search criteria.
421
+ */
422
+ function withEnvs(filter) {
423
+ const startupEnvs = [];
424
+ // Search startup env config file
425
+ const candidates = [
426
+ process.env.LOGIN_ENVS_PATH,
427
+ path.resolve(process.cwd(), '.environments.json'),
428
+ path.resolve(process.cwd(), '.local/environments.json'),
429
+ path.resolve(process.cwd(), 'e2e/.environments.json'),
430
+ ].filter(Boolean);
431
+ const environmentsFile = candidates.find((p) => fs.existsSync(p));
432
+ if (!environmentsFile) {
433
+ throw new Error(`Startup envs config file not found.\nTried: ${candidates.join('\n')}`);
434
+ }
435
+ // Load startup config file
436
+ let config;
437
+ try {
438
+ config = JSON.parse(fs.readFileSync(environmentsFile, 'utf8'));
439
+ }
440
+ catch (error) {
441
+ console.error('Error parsing startup envs config file:', error);
442
+ throw error;
443
+ }
444
+ finally {
445
+ fs.closeSync(fs.openSync(environmentsFile, 'r'));
446
+ }
447
+ // Filter startup envs based on criteria
448
+ for (const peerConfig of config.peers) {
449
+ const matchPeerId = filter.peerId && peerConfig.id === filter.peerId;
450
+ const matchPeerTag = filter.peerTags && peerConfig.tags.some((tag) => filter.peerTags?.includes(tag));
451
+ if (!matchPeerId && !matchPeerTag)
452
+ continue;
453
+ for (const userConfig of peerConfig.users) {
454
+ const matchUserTag = filter.userTags && userConfig.tags.some((tag) => filter.userTags?.includes(tag));
455
+ if (!matchUserTag)
456
+ continue;
457
+ startupEnvs.push({
458
+ id: peerConfig.id,
459
+ peerUrl: peerConfig.url,
460
+ username: userConfig.username,
461
+ password: userConfig.password,
462
+ });
463
+ }
464
+ }
465
+ return startupEnvs;
466
+ }
467
+ /**
468
+ * Currying function that returns a test function that can be used to run tests with a specific environment.
469
+ *
470
+ * ```
471
+ * testWithEnv(env)(`Some test with environment ${env.id}`, async ({ page }) => {
472
+ * // Test implementation
473
+ * })
474
+ * ```
475
+ *
476
+ * @see withEnvs
477
+ * @param env Environment to use for the test.
478
+ */
479
+ function testWithEnv(env) {
480
+ return (title, testFn) => {
481
+ test(title, async ({ page, context: playwrightContext, browser, request }) => {
482
+ const auth = new AuthHelper(page);
483
+ await auth.loginByEnv(env);
484
+ await testFn({ page, context: playwrightContext, browser, request });
485
+ });
486
+ };
487
+ }
488
+
489
+ // utils
490
+
491
+ /**
492
+ * Generated bundle index. Do not edit.
493
+ */
494
+
495
+ export { AuthHelper, IonicHelper, IonicSelectors, MaterialHelper, MaterialSelectors, UiHelper, testWithEnv, withEnvs };
496
+ //# sourceMappingURL=sumaris-net-ngx-components-testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sumaris-net-ngx-components-testing.mjs","sources":["../../testing/utils/ionic.utils.ts","../../testing/utils/material.utils.ts","../../testing/utils/ui.utils.ts","../../testing/utils/auth.utils.ts","../../testing/test/login-env.ts","../../testing/testing_api.ts","../../testing/sumaris-net-ngx-components-testing.ts"],"sourcesContent":["// GPL v3 License\nimport { Locator, Page } from 'playwright';\n\n/**\n * Utility selectors and helpers for Ionic components in e2e tests.\n */\nexport const IonicSelectors = {\n /** Ionic button */\n button: 'ion-button',\n /** Ionic modal */\n modal: 'ion-modal',\n /** Ionic content area */\n content: 'ion-content',\n /** Ionic item */\n item: 'ion-item',\n /** Ionic label */\n label: 'ion-label',\n /** Ionic spinner */\n spinner: 'ion-spinner',\n /** Ionic skeleton text (loading placeholder) */\n skeletonText: 'ion-skeleton-text',\n /** Ionic back button */\n backButton: 'ion-back-button',\n /** Ionic toolbar */\n toolbar: 'ion-toolbar',\n /** Ionic footer */\n footer: 'ion-footer',\n /** Ionic header */\n header: 'ion-header',\n};\n\n/**\n * Helper functions for interacting with Ionic components.\n */\nexport class IonicHelper {\n constructor(private page: Page) {}\n\n /** Get an Ionic button by text content */\n buttonByText(text: string | RegExp): Locator {\n return this.page.locator(IonicSelectors.button, { hasText: text });\n }\n\n /** Get an Ionic button by CSS selector */\n button(selector?: string, options?: { hasText?: string | RegExp }): Locator {\n const fullSelector = selector ? `${IonicSelectors.button}${selector}` : IonicSelectors.button;\n return this.page.locator(fullSelector, options);\n }\n\n /**\n * Get an Ionic modal by its inner component selector (e.g. 'app-auth-form').\n * Automatically wraps the selector in `ion-modal:has(...)` so callers\n * only need to provide the component tag name.\n */\n modal(selector: string): Locator {\n const fullSelector = selector.startsWith('ion-modal') ? selector : `ion-modal:has(${selector})`;\n return this.page.locator(fullSelector);\n }\n\n /** Wait for the Ionic app to be ready */\n async waitForAppReady(timeout = 15_000): Promise<void> {\n // Wait for ion-app to be attached (Angular bootstrap complete)\n await this.page.waitForSelector('ion-app', { state: 'attached', timeout });\n }\n\n /** Wait for loading spinners to disappear */\n async waitForLoadingComplete(timeout = 15_000): Promise<void> {\n await this.page.locator(IonicSelectors.spinner).waitFor({ state: 'hidden', timeout }).catch(() => {\n // Spinner may not appear at all — that's fine\n });\n }\n}\n","// GPL v3 License\nimport { Locator, Page } from 'playwright';\n\n/**\n * Utility selectors and helpers for Angular Material components in e2e tests.\n */\nexport const MaterialSelectors = {\n /** Material table row */\n row: 'mat-row, tr[mat-row]',\n /** Material header row */\n headerRow: 'mat-header-row, tr[mat-header-row]',\n /** Material cell */\n cell: 'mat-cell, td[mat-cell]',\n /** Material form field */\n formField: 'mat-form-field',\n /** Material input */\n input: 'input[matInput]',\n /** Material tab group */\n tabGroup: 'mat-tab-group',\n /** Material tab label */\n tabLabel: '.mat-mdc-tab',\n /** Material paginator */\n paginator: 'mat-paginator',\n /** Material icon */\n icon: 'mat-icon',\n /** Material autocomplete panel */\n autocompletePanel: '.mat-mdc-autocomplete-panel',\n /** Material autocomplete option */\n autocompleteOption: 'mat-option',\n};\n\n/**\n * Helper functions for interacting with Angular Material components.\n */\nexport class MaterialHelper {\n constructor(private page: Page) {}\n\n /** Get all visible table rows, optionally scoped to a parent locator */\n tableRows(scope?: Locator): Locator {\n const root = scope ?? this.page;\n return root.locator(MaterialSelectors.row);\n }\n\n /** Get a single table row by index (0-based), optionally scoped to a parent locator */\n tableRow(index: number, scope?: Locator): Locator {\n return this.tableRows(scope).nth(index);\n }\n\n /** Click on a table row by index (0-based), optionally scoped to a parent locator */\n async clickRow(index: number, scope?: Locator): Promise<void> {\n await this.tableRow(index, scope).click();\n }\n\n /** Get a tab by its label text */\n tabByLabel(text: string | RegExp): Locator {\n return this.page.locator(MaterialSelectors.tabLabel, { hasText: text });\n }\n\n /** Click a tab by its label text */\n async clickTab(text: string | RegExp): Promise<void> {\n await this.tabByLabel(text).click();\n }\n\n /** Fill a mat-form-field input identified by its formControlName.\n * Supports both native inputs with formcontrolname and custom components (e.g. mat-autocomplete-field) wrapping an input. */\n async fillFormControl(formControlName: string, value: string): Promise<void> {\n // Try native input first, then fall back to custom component wrapper\n const nativeInput = this.page.locator(`${MaterialSelectors.formField} input[formcontrolname=\"${formControlName}\"]`);\n const wrappedInput = this.page.locator(`[formcontrolname=\"${formControlName}\"] input`);\n const input = (await nativeInput.count()) > 0 ? nativeInput : wrappedInput;\n // Click the parent mat-form-field to ensure focus reaches the input\n const formField = input.locator('xpath=ancestor::mat-form-field');\n if ((await formField.count()) > 0) {\n await formField.first().click();\n } else {\n await input.click({ force: true });\n }\n await input.pressSequentially(value, { delay: 50 });\n }\n\n /**\n * Select an option from a mat-select dropdown by formControlName.\n * Opens the dropdown, waits for options to render, clicks the matching option, then waits for the dropdown to close.\n */\n async selectMatSelectOption(formControlName: string, optionText: string | RegExp): Promise<void> {\n const select = this.page.locator(`mat-select[formcontrolname=\"${formControlName}\"]`);\n await select.click();\n // Use role-based selector: mat-select renders options with role=\"option\" in a listbox\n const option = this.page.getByRole('option', { name: optionText });\n await option.waitFor({ state: 'visible', timeout: 10_000 });\n await option.click();\n // Wait for the option to disappear (dropdown closed)\n await option.waitFor({ state: 'hidden', timeout: 5_000 });\n }\n\n /** Select an autocomplete option by text after typing in a form control */\n async selectAutocompleteOption(formControlName: string, searchText: string, optionText: string | RegExp): Promise<void> {\n await this.fillFormControl(formControlName, searchText);\n const panel = this.page.locator(MaterialSelectors.autocompletePanel);\n await panel.waitFor({ state: 'visible', timeout: 10_000 });\n await panel.locator(MaterialSelectors.autocompleteOption, { hasText: optionText }).click();\n }\n\n /** Wait for table rows to be loaded (at least one row visible), optionally scoped to a parent locator */\n async waitForTableRows(timeout = 15_000, scope?: Locator): Promise<void> {\n await this.tableRows(scope).first().waitFor({ state: 'visible', timeout });\n }\n}\n","// GPL v3 License\nimport { Locator, Page } from 'playwright';\nimport { IonicHelper, IonicSelectors } from './ionic.utils';\nimport { MaterialHelper, MaterialSelectors } from './material.utils';\n\n/**\n * Common UI helper functions to improve readability of e2e tests.\n * This helper centralizes access to Ionic and Material specific helpers.\n */\nexport class UiHelper {\n protected ionic: IonicHelper;\n protected mat: MaterialHelper;\n\n constructor(protected page: Page) {\n this.ionic = new IonicHelper(page);\n this.mat = new MaterialHelper(page);\n }\n\n /**\n * Click an element and wait for it to be ready.\n * @param locator The locator to click.\n * @param timeout The maximum time to wait.\n */\n async click(locator: Locator, timeout = 10_000): Promise<void> {\n await locator.waitFor({ state: 'visible', timeout });\n // force: true bypasses Ionic overlay elements (ion-col, ion-toolbar) that intercept pointer events\n await locator.click({ force: true });\n }\n\n /**\n * Fill an input and wait for it to be ready.\n * @param locator The locator to fill.\n * @param value The value to enter.\n * @param timeout The maximum time to wait.\n */\n async fill(locator: Locator, value: string, timeout = 10_000): Promise<void> {\n await locator.waitFor({ state: 'visible', timeout });\n await locator.fill(value);\n }\n\n /**\n * Wait for an element to be visible.\n * @param locator The locator to wait for.\n * @param timeout The maximum time to wait.\n */\n async waitForVisible(locator: Locator, timeout = 10_000): Promise<void> {\n await locator.waitFor({ state: 'visible', timeout });\n }\n\n /**\n * Wait for an element to be hidden.\n * @param locator The locator to wait for.\n * @param timeout The maximum time to wait.\n */\n async waitForHidden(locator: Locator, timeout = 15_000): Promise<void> {\n await locator.waitFor({ state: 'hidden', timeout });\n }\n\n /* --- Unified Selectors --- */\n\n /**\n * Get a button by its text content.\n * Supports both Ionic and Material buttons.\n * @param text The text content to match.\n * @param scope Optional locator to scope the search within.\n */\n button(text: string | RegExp, scope?: Locator): Locator {\n // Combine selectors for both Ionic and Material buttons\n const selectors = [\n IonicSelectors.button,\n 'button[mat-button]',\n 'button[mat-raised-button]',\n 'button[mat-flat-button]',\n 'button[mat-stroked-button]',\n 'button[mat-icon-button]',\n 'button[mat-fab]',\n 'button[mat-mini-fab]',\n ].join(', ');\n\n const root = scope ?? this.page;\n return root.locator(selectors, { hasText: text });\n }\n\n /**\n * Get an icon button by its icon name.\n * Supports both Ionic and Material icon buttons.\n * @param iconName The icon name (e.g. 'mail', 'search', 'ellipsis-horizontal').\n * @param scope Optional locator to scope the search within.\n */\n iconButton(iconName: string, scope?: Locator): Locator {\n const matIconSelector = `${MaterialSelectors.icon}:has-text(\"${iconName}\")`;\n const ionIconSelector = `ion-icon[name=\"${iconName}\"]`;\n const root = scope ?? this.page;\n return root.locator(`button, ion-button`).filter({\n has: this.page.locator(`${matIconSelector}, ${ionIconSelector}`),\n });\n }\n\n /**\n * Access to the underlying Playwright Page object.\n */\n get pageObj(): Page {\n return this.page;\n }\n\n /** Get a modal by its selector */\n modal(selector: string): Locator {\n return this.ionic.modal(selector);\n }\n\n /** Get a tab by its label text */\n tab(text: string | RegExp): Locator {\n return this.mat.tabByLabel(text);\n }\n\n /* --- Specialized Helpers (delegated) --- */\n\n /** Wait for the app to be ready */\n async waitForAppReady(timeout = 15_000): Promise<void> {\n await this.ionic.waitForAppReady(timeout);\n }\n\n /** Wait for loading spinners to disappear */\n async waitForLoadingComplete(timeout = 15_000): Promise<void> {\n await this.ionic.waitForLoadingComplete(timeout);\n }\n\n /** Wait for table rows to be loaded, optionally scoped to a parent locator */\n async waitForTableRows(timeout = 15_000, scope?: Locator): Promise<void> {\n await this.mat.waitForTableRows(timeout, scope);\n }\n\n /** Get a single table row by index (0-based), optionally scoped to a parent locator */\n tableRow(index: number, scope?: Locator): Locator {\n return this.mat.tableRow(index, scope);\n }\n\n /** Click on a table row by index, optionally scoped to a parent locator */\n async clickRow(index: number, scope?: Locator): Promise<void> {\n await this.click(this.tableRow(index, scope));\n }\n\n /** Fill a mat-form-field input identified by its formControlName */\n async fillFormControl(formControlName: string, value: string): Promise<void> {\n await this.mat.fillFormControl(formControlName, value);\n }\n\n /** Select an autocomplete option */\n async selectAutocompleteOption(formControlName: string, searchText: string, optionText: string | RegExp): Promise<void> {\n await this.mat.selectAutocompleteOption(formControlName, searchText, optionText);\n }\n\n /**\n * Select an option from a mat-select dropdown.\n * Opens the dropdown, waits for options, clicks the matching one, then waits for the dropdown to close.\n */\n async selectOption(formControlName: string, optionText: string | RegExp): Promise<void> {\n await this.mat.selectMatSelectOption(formControlName, optionText);\n }\n}\n","// GPL v3 License\nimport { Page } from 'playwright';\nimport { UiHelper } from './ui.utils';\n\nconst STARTUP_DATA_STORAGE_KEY = '__appStartupData';\n\n/**\n * Helper for authentication in e2e tests.\n */\nexport class AuthHelper {\n protected ui: UiHelper;\n\n constructor(\n private page: Page,\n ui?: UiHelper\n ) {\n this.ui = ui ?? new UiHelper(page);\n }\n\n /** Login with given test credentials */\n async login(username: string, password: string): Promise<void> {\n const ui = this.ui;\n\n await this.page.goto('/');\n\n // Wait for the app to fully load (backend connection can take time)\n await ui.waitForAppReady(30_000);\n await ui.waitForLoadingComplete(30_000);\n\n // Click the login button on the home page\n const loginButton = ui.button(/Se connecter|Log In/).first();\n await ui.click(loginButton, 30_000);\n\n // Wait for the auth modal to appear\n const modal = ui.modal('app-auth-form');\n await ui.waitForVisible(modal);\n\n // Fill credentials (may or may not be pre-filled depending on the environment)\n const usernameInput = modal.locator('input[formcontrolname=\"username\"]');\n await usernameInput.click({ force: true });\n await usernameInput.fill(username);\n const passwordInput = modal.locator('input[formcontrolname=\"password\"]');\n await passwordInput.click({ force: true });\n await passwordInput.fill(password);\n\n // Click the submit button in the modal footer\n const ionModal = ui.pageObj.locator('ion-modal:has(app-auth-form)');\n const submitButton = ionModal.locator('ion-footer ion-button[color=\"tertiary\"]');\n await submitButton.waitFor({ state: 'visible', timeout: 10_000 });\n // Wait for the button to be enabled (form valid)\n await ui.pageObj.waitForFunction(\n (btn) => !btn.hasAttribute('disabled'),\n await submitButton.elementHandle(),\n { timeout: 5_000 }\n );\n await submitButton.click();\n\n // Wait for the modal to close and verify the user is logged in\n await ui.waitForHidden(modal, 30_000);\n\n // After login, the login button should no longer be visible (replaced by user menu)\n await loginButton.waitFor({ state: 'hidden', timeout: 10_000 });\n }\n\n /** Wait until the user is logged in and return the email shown in the side menu */\n async waitForLoggedIn(): Promise<string | null> {\n const emailEl = this.page.locator('ion-menu h4').first();\n await emailEl.waitFor({ state: 'visible', timeout: 30_000 });\n return emailEl.textContent();\n }\n\n /** Setup startup data with provided credentials or environment variables */\n async loginByEnv(opts?: { username?: string; password?: string; offline?: boolean; peerUrl?: string }): Promise<void> {\n const username = opts?.username ?? process.env.E2E_USERNAME;\n const password = opts?.password ?? process.env.E2E_PASSWORD;\n const offline = opts?.offline ?? process.env.E2E_OFFLINE === 'true';\n const peerUrl = opts?.peerUrl ?? process.env.E2E_PEER_URL;\n\n if (!username && !password && !peerUrl) return;\n\n await this.page.addInitScript(\n ({ key, username, password, offline, peerUrl }) => {\n (window as any)[key] = { username, password, offline, peerUrl };\n },\n { key: STARTUP_DATA_STORAGE_KEY, username, password, offline, peerUrl }\n );\n }\n}\n","// GPL v3 License\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { PlaywrightTestArgs, test } from '@playwright/test';\nimport { AuthHelper } from '../utils/auth.utils';\n\n/**\n * Search environments based on provided criteria.\n *\n * Use when you need to run tests with one or more environments.\n * Test can use `testWithEnv` to run tests with a specific environment.\n * Example :\n *\n * ```\n * test.describe('Sample test with environment', () => {\n * withEnvs({\n * peerTags: ['local'],\n * userTags: ['admin'],\n * }).forEach((env) => {\n * testWithEnv(env)(`Some test with environment ${env.id}`, async ({ page }) => {\n * // Test implementation\n * });\n * });\n * });\n * ```\n *\n * Environments are loaded from a JSON config file located at one of four paths :\n * - `LOGIN_ENVS_PATH` environment variable\n * - `.environments.json` in the current directory (e.g. `.environments.json`)\n * - `.environments.json` in the `.local` directory (e.g. `.local/environments.json`)\n * - `.environments.json` in the `e2e` directory (e.g. `e2e/.environments.json`)\n *\n * Example of JSON :\n *\n * ```\n * {\n * \"peers\": [\n * {\n * \"id\": \"local\",\n * \"tags\": [\"local\"],\n * \"url\": \"http://localhost:8080\",\n * \"users\": [\n * {\n * \"tags\": [\"admin\"],\n * \"username\": \"admin@sumaris.net\",\n * \"password\": \"admin\"\n * }\n * ]\n * }\n * ]\n * }\n * ```\n *\n * @see testWithEnv\n * @param filter Search criteria.\n */\nexport function withEnvs(filter: EnvFilter): LoginEnv[] {\n const startupEnvs: LoginEnv[] = [];\n\n // Search startup env config file\n const candidates = [\n process.env.LOGIN_ENVS_PATH,\n path.resolve(process.cwd(), '.environments.json'),\n path.resolve(process.cwd(), '.local/environments.json'),\n path.resolve(process.cwd(), 'e2e/.environments.json'),\n ].filter(Boolean);\n const environmentsFile = candidates.find((p) => fs.existsSync(p!));\n if (!environmentsFile) {\n throw new Error(`Startup envs config file not found.\\nTried: ${candidates.join('\\n')}`);\n }\n\n // Load startup config file\n let config: TestEnvironments;\n try {\n config = JSON.parse(fs.readFileSync(environmentsFile, 'utf8'));\n } catch (error) {\n console.error('Error parsing startup envs config file:', error);\n throw error;\n } finally {\n fs.closeSync(fs.openSync(environmentsFile, 'r'));\n }\n\n // Filter startup envs based on criteria\n for (const peerConfig of config.peers) {\n const matchPeerId = filter.peerId && peerConfig.id === filter.peerId;\n const matchPeerTag = filter.peerTags && peerConfig.tags.some((tag) => filter.peerTags?.includes(tag));\n if (!matchPeerId && !matchPeerTag) continue;\n\n for (const userConfig of peerConfig.users) {\n const matchUserTag = filter.userTags && userConfig.tags.some((tag) => filter.userTags?.includes(tag));\n if (!matchUserTag) continue;\n\n startupEnvs.push({\n id: peerConfig.id,\n peerUrl: peerConfig.url,\n username: userConfig.username,\n password: userConfig.password,\n });\n }\n }\n\n return startupEnvs;\n}\n\n/**\n * Currying function that returns a test function that can be used to run tests with a specific environment.\n *\n * ```\n * testWithEnv(env)(`Some test with environment ${env.id}`, async ({ page }) => {\n * // Test implementation\n * })\n * ```\n *\n * @see withEnvs\n * @param env Environment to use for the test.\n */\nexport function testWithEnv(env: LoginEnv) {\n return (title: string, testFn: (args: PlaywrightTestArgs) => Promise<void>) => {\n test(title, async ({ page, context: playwrightContext, browser, request }) => {\n const auth = new AuthHelper(page);\n await auth.loginByEnv(env);\n\n await testFn({ page, context: playwrightContext, browser, request } as any);\n });\n };\n}\n\nexport interface EnvFilter {\n peerId?: string;\n peerTags?: string[];\n userTags?: string[];\n}\n\nexport interface LoginEnv {\n id?: string;\n peerUrl: string;\n username: string;\n password: string;\n}\n\ninterface TestEnvironments {\n peers: TestPeer[];\n}\n\ninterface TestPeer {\n id?: string;\n tags: string[];\n url: string;\n users: TestUser[];\n}\n\ninterface TestUser {\n tags: string[];\n username: string;\n password: string;\n}\n","// utils\nexport * from './utils/auth.utils';\nexport * from './utils/ionic.utils';\nexport * from './utils/material.utils';\nexport * from './utils/ui.utils';\n\n// test\nexport * from './test/login-env';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './testing_api';\n"],"names":[],"mappings":"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"}