{"version":3,"file":"sumaris-net.ngx-components.mjs","sources":["../../src/environments/environment.class.ts","../../src/app/shared/constants.ts","../../src/app/shared/regexps.ts","../../src/app/shared/modules.ts","../../src/app/shared/functions.ts","../../src/environments/environment.loader.ts","../../src/app/shared/pipes/date-format.pipe.ts","../../src/app/shared/dates.ts","../../src/app/shared/pipes/date-diff-duration.pipe.ts","../../src/app/shared/pipes/date-from-now.pipe.ts","../../src/app/shared/focusable.ts","../../src/app/shared/inputs.ts","../../src/app/shared/material/latlong/latlong.utils.ts","../../src/app/shared/pipes/latlong-format.pipe.ts","../../src/app/shared/pipes/number-format.pipe.ts","../../src/app/shared/pipes/highlight.pipe.ts","../../src/app/shared/pipes/file-size.pipe.ts","../../src/app/shared/pipes/duration.pipe.ts","../../src/app/shared/pipes/math.pipes.ts","../../src/app/shared/pipes/arrays.pipe.ts","../../src/app/shared/pipes/maps.pipe.ts","../../src/app/shared/services/translate-context.service.ts","../../src/app/shared/pipes/translate-context.pipe.ts","../../src/app/shared/pipes/ng-init.pipe.ts","../../src/app/shared/observables.ts","../../src/app/shared/validator/validators.ts","../../src/app/core/form/array/form-array.ts","../../src/app/shared/forms.ts","../../src/app/core/form/form.utils.ts","../../src/app/shared/validator/form-error-adapter.class.ts","../../src/app/shared/pipes/form.pipes.ts","../../src/app/shared/pipes/property.pipes.ts","../../src/app/shared/pipes/colors.pipe.ts","../../src/app/shared/pipes/types.pipes.ts","../../src/app/shared/pipes/maskito.pipe.ts","../../src/app/shared/pipes/selection.pipes.ts","../../src/app/shared/pipes/badge.pipes.ts","../../src/app/shared/pipes/string.pipes.ts","../../src/app/shared/html.utils.ts","../../src/app/shared/pipes/html.pipes.ts","../../src/app/shared/pipes/display-with.pipe.ts","../../src/app/shared/pipes/dates.pipe.ts","../../src/app/shared/pipes/observable.pipes.ts","../../src/app/shared/file/url.utils.ts","../../src/app/shared/pipes/url.pipes.ts","../../src/app/shared/pipes/date-from.pipe.ts","../../src/app/shared/pipes/pipes.module.ts","../../src/app/shared/material/duration/duration.utils.ts","../../src/app/shared/material/duration/material.duration.ts","../../src/app/shared/material/duration/material.duration.html","../../src/app/shared/capacitor/plugins.ts","../../src/app/shared/capacitor/keyboard.ts","../../src/app/shared/directives/autofocus.directive.ts","../../src/app/shared/directives/ng-var.directive.ts","../../src/app/shared/directives/drag-and-drop.directive.ts","../../src/app/shared/directives/autotitle.directive.ts","../../src/app/shared/directives/throttled-click.directive.ts","../../src/app/shared/directives/autoresize.directive.ts","../../src/app/shared/directives/autotooltip.directive.ts","../../src/app/shared/directives/directives.module.ts","../../src/app/shared/material/duration/duration.module.ts","../../src/app/shared/material/boolean/material.boolean.ts","../../src/app/shared/material/boolean/material.boolean.html","../../src/app/shared/material/boolean/boolean.module.ts","../../src/app/shared/material/badge/badge.directive.ts","../../src/app/shared/material/badge/badge.module.ts","../../src/app/shared/events.ts","../../src/app/shared/platforms.ts","../../src/app/core/services/model/tree-item-entity.model.ts","../../src/app/core/form/properties/properties.utils.ts","../../src/app/core/services/model/entity.model.ts","../../src/app/shared/services.ts","../../src/app/shared/material/autocomplete/material.autocomplete.utils.ts","../../src/app/shared/material/autocomplete/material.autocomplete.directive.ts","../../src/app/shared/material/autocomplete/material.autocomplete.ts","../../src/app/shared/material/autocomplete/material.autocomplete.html","../../src/app/shared/rx-state/rx-state.module.ts","../../src/app/shared/material/autocomplete/material.autocomplete.module.ts","../../src/app/shared/material/material.config.ts","../../src/app/shared/material/datetime/material.date.ts","../../src/app/shared/material/datetime/material.date.html","../../src/app/shared/material/datetime/material.datetime.ts","../../src/app/shared/material/datetime/material.datetime.html","../../src/app/shared/material/datetime/material.dateshort.ts","../../src/app/shared/material/datetime/material.dateshort.html","../../src/app/shared/material/datetime/datetime.module.ts","../../src/app/shared/material/swipe/material.swipe.ts","../../src/app/shared/material/swipe/material.swipe.html","../../src/app/shared/material/swipe/swipe.module.ts","../../src/app/shared/material/chips/material.chips.ts","../../src/app/shared/material/chips/material.chips.html","../../src/app/shared/material/chips/chips.module.ts","../../src/app/shared/material/latlong/material.latlong-input.ts","../../src/app/shared/material/latlong/material.latlong-input.html","../../src/app/shared/material/latlong/material.latlong.ts","../../src/app/shared/material/latlong/material.latlong.html","../../src/app/shared/material/latlong/material.latlong.module.ts","../../src/app/shared/material/material.module.ts","../../src/app/shared/material/paginator/material.paginator-i18n.ts","../../src/app/shared/form/field.model.ts","../../src/app/shared/graph/colors.utils.ts","../../src/app/shared/form/field.component.ts","../../src/app/shared/form/field.component.html","../../src/app/shared/services/startable-service.class.ts","../../src/app/shared/audio/audio.ts","../../src/app/shared/hotkeys/dialog/hotkeys-dialog.component.ts","../../src/app/shared/hotkeys/dialog/hotkeys-dialog.component.html","../../src/app/shared/hotkeys/hotkeys.service.ts","../../src/app/shared/hotkeys/shared-hotkeys.module.ts","../../src/app/shared/upload-file/upload-file.model.ts","../../src/app/shared/file/images.utils.ts","../../src/app/shared/file/file.service.ts","../../src/app/shared/form/loading-spinner.ts","../../src/app/shared/material/stepper/material.stepper-i18n.ts","../../src/app/shared/upload-file/upload-file.component.ts","../../src/app/shared/upload-file/upload-file.component.html","../../src/app/shared/upload-file/upload-file-popover.component.ts","../../src/app/shared/upload-file/upload-file-popover.component.html","../../src/app/shared/testing/tests.page.ts","../../src/app/shared/testing/tests.page.html","../../src/app/shared/storage/storage.utils.ts","../../src/app/shared/storage/storage.service.ts","../../src/app/shared/services/progress-bar.service.ts","../../src/app/shared/gesture/gesture-config.ts","../../src/app/shared/toolbar/toolbar.ts","../../src/app/shared/toolbar/toolbar.html","../../src/app/shared/toolbar/modal-toolbar.ts","../../src/app/shared/toolbar/modal-toolbar.html","../../src/app/shared/toolbar/toolbar.module.ts","../../src/app/core/services/model/settings.model.ts","../../src/environments/environment.ts","../../src/app/core/services/model/entity.decorators.ts","../../src/app/core/services/model/node-feature.model.ts","../../src/app/core/services/model/peer.model.ts","../../src/app/core/services/local-settings.service.ts","../../src/app/shared/material/autocomplete/material.autocomplete.config.ts","../../src/app/core/form/form.class.ts","../../src/app/shared/file/file.utils.ts","../../src/app/shared/toast/toasts.ts","../../src/app/core/services/model/model.enum.ts","../../src/app/core/services/model/referential.model.ts","../../src/app/core/services/model/filter.model.ts","../../src/app/shared/named-filter/named-filter.model.ts","../../src/app/core/services/errors.ts","../../src/app/core/services/crypto.service.ts","../../src/app/core/graphql/graphql.utils.ts","../../src/app/shared/material/material.animations.ts","../../src/app/shared/http/http.utils.ts","../../src/app/core/services/network.utils.ts","../../src/app/shared/version/versions.ts","../../src/app/core/form/text/text-form.component.ts","../../src/app/core/form/text/text-form.component.html","../../src/app/core/form/text-popover/text-popover.component.ts","../../src/app/core/form/text-popover/text-popover.component.html","../../src/app/shared/logging/log-level.model.ts","../../src/app/shared/logging/logger.model.ts","../../src/app/shared/logging/logging-service.class.ts","../../src/app/core/services/pipes/referential-to-string.pipe.ts","../../src/app/core/peer/select-peer.modal.ts","../../src/app/core/peer/select-peer.modal.html","../../src/app/shared/services/startable-observable-service.class.ts","../../src/app/core/services/network.service.ts","../../src/app/core/graphql/graphql.service.ts","../../src/app/core/services/base-graphql-service.class.ts","../../src/app/core/services/config/core.config.ts","../../src/app/shared/file/uri.utils.ts","../../src/app/core/services/storage/entity-store.class.ts","../../src/app/core/services/storage/entities-storage.service.ts","../../src/app/core/services/model/department.model.ts","../../src/app/core/services/model/person.model.ts","../../src/app/core/services/model/token.model.ts","../../src/app/core/services/model/account.model.ts","../../src/app/core/services/base58.ts","../../src/app/core/services/startup.constants.ts","../../src/app/core/services/startup.service.ts","../../src/app/core/services/account.service.ts","../../src/app/core/services/model/config.model.ts","../../src/app/core/services/config.service.ts","../../src/app/core/services/platform.service.ts","../../src/app/core/services/base-entity-service.class.ts","../../src/app/shared/named-filter/named-filter.service.ts","../../src/app/shared/named-filter/named-filter-selector.component.ts","../../src/app/shared/named-filter/named-filter-selector.component.html","../../src/app/shared/named-filter/named-filter.module.ts","../../src/app/shared/shared.module.ts","../../src/app/shared/alerts.ts","../../src/app/shared/guard/component-dirty.guard.ts","../../src/app/shared/shared-routing.module.ts","../../src/app/shared/rx-state/rx-state.decorators.ts","../../src/app/core/form/text/text-form.module.ts","../../src/app/core/icon/icon-selector.service.ts","../../src/app/core/icon/icon-selector.modal.ts","../../src/app/core/icon/icon-selector.modal.html","../../src/app/core/icon/icon.component.ts","../../src/app/core/icon/icon.component.html","../../src/app/core/icon/icon-selector.field.ts","../../src/app/core/icon/icon-selector.field.html","../../src/app/core/icon/icon.module.ts","../../src/app/core/icon/icon-selector.module.ts","../../src/app/shared/interceptors/progess.interceptor.ts","../../src/app/shared/image/gallery/slideshow/image-gallery-slideshow.component.ts","../../src/app/shared/image/gallery/slideshow/image-gallery-slideshow.component.html","../../src/app/shared/image/image.service.ts","../../src/app/shared/image/gallery/image-gallery.component.ts","../../src/app/shared/image/gallery/image-gallery.component.html","../../src/app/shared/image/gallery/image-gallery.module.ts","../../src/app/shared/image/image.module.ts","../../src/app/shared/debug/debug-service.class.ts","../../src/app/shared/file/json.utils.ts","../../src/app/shared/storage/storage-explorer.component.ts","../../src/app/shared/storage/storage-explorer.component.html","../../src/app/shared/storage/storage-explorer.module.ts","../../src/app/shared/logging/logging-service.module.ts","../../src/app/shared/directives/resizable/resizable.directive.ts","../../src/app/shared/directives/resizable/resizable.component.ts","../../src/app/shared/directives/resizable/resizable.template.html","../../src/app/shared/directives/resizable/resizable.module.ts","../../src/app/shared/directives/cell-selection/cell-selection.service.ts","../../src/app/shared/directives/cell-selection/cell-selection.directive.ts","../../src/app/shared/directives/cell-selection/cell-identifier.directive.ts","../../src/app/shared/services/entity-service.class.ts","../../src/app/shared/services/memory-entity-service.class.ts","../../src/app/shared/services/job.utils.ts","../../src/app/shared/base64.utils.ts","../../src/app/shared/geolocation/geolocation.utils.ts","../../src/app/shared/file/csv.utils.ts","../../src/app/shared/graph/graph-colors.ts","../../src/app/shared/debug/debug.component.ts","../../src/app/shared/debug/debug.component.html","../../src/app/shared/debug/debug.module.ts","../../src/app/shared/markdown/markdown.utils.ts","../../src/app/shared/markdown/markdown.service.ts","../../src/app/shared/markdown/markdown.directive.ts","../../src/app/shared/print/print.service.ts","../../src/app/shared/markdown/markdown.component.ts","../../src/app/shared/markdown/markdown.component.html","../../src/app/shared/markdown/markdown.modal.ts","../../src/app/shared/markdown/markdown.modal.html","../../src/app/shared/markdown/markdown.module.ts","../../src/app/core/graphql/graphql.module.ts","../../src/app/core/about/about.modal.ts","../../src/app/core/about/about.modal.html","../../src/app/core/menu/menu.model.ts","../../src/app/core/menu/menu.service.ts","../../src/app/core/menu/menu.component.ts","../../src/app/core/menu/menu.component.html","../../src/app/core/menu/sub-menu-tab.directive.ts","../../src/app/core/menu/menu.module.ts","../../src/app/core/form/text-popover/text-popover.module.ts","../../src/app/core/services/pipes/usage-mode.pipes.ts","../../src/app/core/services/pipes/person-to-string.pipe.ts","../../src/app/core/services/pipes/account.pipes.ts","../../src/app/core/services/pipes/department-to-string.pipe.ts","../../src/app/core/services/pipes/pipes.module.ts","../../src/app/core/peer/select-peer.module.ts","../../src/app/core/install/install-upgrade-card.component.ts","../../src/app/core/install/install-upgrade-card.component.html","../../src/app/core/install/install-upgrade-card.module.ts","../../src/app/core/services/validator/base.validator.class.ts","../../src/app/admin/users/person.validator.ts","../../src/app/core/services/validator/user-settings.validator.ts","../../src/app/core/services/validator/account.validator.ts","../../src/app/core/register/register.form.ts","../../src/app/core/register/register.form.html","../../src/app/core/register/register.modal.ts","../../src/app/core/register/register.modal.html","../../src/app/core/form/username/username.form.ts","../../src/app/core/form/username/username.form.html","../../src/app/core/auth/reset-password.modal.ts","../../src/app/core/auth/reset-password.modal.html","../../src/app/core/auth/auth.form.ts","../../src/app/core/auth/auth.form.html","../../src/app/core/auth/auth.modal.ts","../../src/app/core/auth/auth.modal.html","../../src/app/social/config/social.config.ts","../../src/app/social/social.errors.ts","../../src/app/social/user-event/user-event.service.ts","../../src/app/social/user-event/notification/user-event-notification.list.ts","../../src/app/social/user-event/notification/user-event-notification.list.html","../../src/app/social/user-event/notification/user-event-notification.modal.ts","../../src/app/social/user-event/notification/user-event-notification.modal.html","../../src/app/social/user-event/notification/user-event-notification.icon.ts","../../src/app/social/user-event/notification/user-event-notification.icon.html","../../src/app/social/feed/feed.model.ts","../../src/app/admin/users/person.filter.ts","../../src/app/social/message/message.model.ts","../../src/app/social/message/message.form.ts","../../src/app/social/message/message.form.html","../../src/app/social/message/message.modal.ts","../../src/app/social/message/message.modal.html","../../src/app/admin/users/person.service.ts","../../src/app/social/message/message.service.ts","../../src/app/social/feed/feed.service.ts","../../src/app/social/feed/feed.directive.ts","../../src/app/social/feed/feed.component.ts","../../src/app/social/feed/feed.component.html","../../src/app/core/home/home.ts","../../src/app/core/home/home.html","../../src/app/core/register/register-confirm.page.ts","../../src/app/core/register/register-confirm.page.html","../../src/app/core/register/register.module.ts","../../src/app/core/form/username/username.module.ts","../../src/app/core/auth/auth.module.ts","../../src/app/social/user-event/user-event.module.ts","../../src/app/social/feed/feed.page.ts","../../src/app/social/feed/feed.page.html","../../src/app/social/feed/feed.module.ts","../../src/app/core/home/home.module.ts","../../src/app/core/about/about.module.ts","../../src/app/core/form/properties/property.validator.ts","../../src/app/core/services/validator/local-settings.validator.ts","../../src/app/core/form/buttons/form-buttons-bar.component.ts","../../src/app/core/form/buttons/form-buttons-bar.component.html","../../src/app/core/form/properties/properties-file.service.ts","../../src/app/core/form/properties/properties.form.ts","../../src/app/core/form/properties/properties.form.html","../../src/app/core/settings/settings.page.ts","../../src/app/core/settings/settings.page.html","../../src/app/core/form/buttons/form-buttons-bar.module.ts","../../src/app/core/table/table.utils.ts","../../src/app/core/table/entities-table-datasource.class.ts","../../src/app/core/table/table-select-columns.component.ts","../../src/app/core/table/table-select-columns.component.html","../../src/app/core/table/table.model.ts","../../src/app/core/table/table.class.ts","../../src/app/core/table/memory-table.class.ts","../../src/app/core/table/column/actions-column.component.ts","../../src/app/core/table/column/actions-column.component.html","../../src/app/core/table/column/row-field.component.ts","../../src/app/core/table/column/row-field.component.html","../../src/app/core/form/properties/properties.table.ts","../../src/app/core/form/properties/properties.table.html","../../src/app/core/table/table.pipes.ts","../../src/app/core/table/entities-async-table-datasource.class.ts","../../src/app/core/table/async-table.class.ts","../../src/app/core/table/column/nav-actions-column.component.ts","../../src/app/core/table/column/nav-actions-column.component.html","../../src/app/core/table/table.module.ts","../../src/app/core/form/properties/properties.module.ts","../../src/app/core/settings/settings.module.ts","../../src/app/core/form/list/list.form.ts","../../src/app/core/form/list/list.form.html","../../src/app/core/form/list/list.module.ts","../../src/app/core/form/entity/entity-metadata.component.ts","../../src/app/core/form/entity/entity-metadata.component.html","../../src/app/core/form/entity/entity.module.ts","../../src/app/core/form/form.module.ts","../../src/app/core/offline/update-offline-mode-card.component.ts","../../src/app/core/offline/update-offline-mode-card.component.html","../../src/app/core/offline/update-offline-mode-card.module.ts","../../src/app/core/services/validator/user-token.validator.ts","../../src/app/core/form/form-container.class.ts","../../src/app/core/form/entity/editor.class.ts","../../src/app/core/form/entity/tab-editor.class.ts","../../src/app/core/form/entity/entity-editor-modal.class.ts","../../src/app/core/account/new-token.form.ts","../../src/app/core/account/new-token.form.html","../../src/app/core/account/new-token.modal.ts","../../src/app/core/account/new-token.modal.html","../../src/app/core/account/token.table.ts","../../src/app/core/account/token.table.html","../../src/app/core/account/account.page.ts","../../src/app/core/account/account.page.html","../../src/app/core/account/password/change-password.form.ts","../../src/app/core/account/password/change-password.form.html","../../src/app/core/account/password/change-password.page.ts","../../src/app/core/account/password/change-password.page.html","../../src/app/core/account/password/change-password.module.ts","../../src/app/core/account/account.module.ts","../../src/app/core/core.module.ts","../../src/app/core/services/auth-guard.service.ts","../../src/app/core/form/entity/entity-editor.class.ts","../../src/app/social/message/message.module.ts","../../src/app/social/job/progression/job-progression.model.ts","../../src/app/social/job/progression/job-progression.service.ts","../../src/app/social/job/progression/job-progression.component.ts","../../src/app/social/job/progression/job-progression.component.html","../../src/app/social/job/progression/job-progression.list.ts","../../src/app/social/job/progression/job-progression.list.html","../../src/app/social/job/progression/job-progression.icon.ts","../../src/app/social/job/progression/job-progression.icon.html","../../src/app/social/job/job.module.ts","../../src/app/social/social.module.ts","../../src/app/admin/users/users.ts","../../src/app/admin/users/users.html","../../src/app/admin/users/users-select.modal.ts","../../src/app/admin/users/users-select.modal.html","../../src/app/admin/users/users.module.ts","../../src/app/admin/admin.module.ts","../../src/app/admin/admin-routing.module.ts","../../src/app/admin/users/users.utils.ts","../../src/app/shared/material/datetime/testing/mat-date-time.test.ts","../../src/app/shared/material/datetime/testing/mat-date-time.test.html","../../src/app/shared/material/datetime/testing/mat-date.test.ts","../../src/app/shared/material/datetime/testing/mat-date.test.html","../../src/app/shared/testing/observable.test.ts","../../src/app/shared/testing/observable.test.html","../../src/app/shared/material/datetime/testing/mat-dateshort.test.ts","../../src/app/shared/material/datetime/testing/mat-dateshort.test.html","../../src/app/shared/material/autocomplete/testing/autocomplete.test.ts","../../src/app/shared/material/autocomplete/testing/autocomplete.test.html","../../src/app/shared/material/latlong/testing/latlong.test.ts","../../src/app/shared/material/latlong/testing/latlong.test.html","../../src/app/shared/material/swipe/testing/swipe.test.ts","../../src/app/shared/material/swipe/testing/swipe.test.html","../../src/app/shared/material/chips/testing/chips.test.ts","../../src/app/shared/material/chips/testing/chips.test.html","../../src/app/shared/material/badge/badge.test.ts","../../src/app/shared/material/badge/badge.test.html","../../src/app/shared/material/duration/testing/mat-duration.test.ts","../../src/app/shared/material/duration/testing/mat-duration.test.html","../../src/app/shared/material/testing/common.test.ts","../../src/app/shared/material/testing/common.test.html","../../src/app/shared/material/boolean/testing/boolean.test.page.ts","../../src/app/shared/material/boolean/testing/boolean.test.page.html","../../src/app/shared/testing/maskito.test.ts","../../src/app/shared/testing/maskito.test.html","../../src/app/shared/material/test/test-component.ts","../../src/app/shared/material/test/test-component.html","../../src/app/shared/material/material.testing.module.ts","../../src/app/shared/toast/toast.testing.ts","../../src/app/shared/toast/toast.testing.html","../../src/app/shared/toast/toast.testing.module.ts","../../src/app/shared/upload-file/testing/upload-file.testing.ts","../../src/app/shared/upload-file/testing/upload-file.testing.html","../../src/app/shared/upload-file/testing/upload-file.testing.module.ts","../../src/app/shared/image/gallery/testing/gallery.service.testing.ts","../../src/app/shared/image/gallery/testing/gallery.testing.ts","../../src/app/shared/image/gallery/testing/gallery.testing.html","../../src/app/shared/image/gallery/testing/gallery.testing.module.ts","../../src/app/shared/audio/audio.testing.ts","../../src/app/shared/audio/audio.testing.html","../../src/app/shared/audio/audio.testing.module.ts","../../src/app/shared/storage/storage-explorer.testing.module.ts","../../src/app/core/menu/testing/menu.testing.ts","../../src/app/core/menu/testing/menu.testing.html","../../src/app/core/menu/testing/menu-other.testing.ts","../../src/app/core/menu/testing/menu.testing.module.ts","../../src/app/shared/named-filter/testing/named-filter-selector.testing.ts","../../src/app/shared/named-filter/testing/named-filter-selector.testing.html","../../src/app/shared/named-filter/testing/named-filter.testing.module.ts","../../src/app/shared/markdown/testing/markdown.test.ts","../../src/app/shared/markdown/testing/markdown.test.html","../../src/app/shared/markdown/testing/markdown.testing.module.ts","../../src/app/shared/shared.testing.module.ts","../../src/app/shared/storage/storage-explorer.testing-routing.module.ts","../../src/app/core/services/testing/referential-filter.model.ts","../../src/app/core/services/testing/referential.validator.ts","../../src/app/core/table/testing/table-validator.service.ts","../../src/app/core/table/testing/table2-validator.service.ts","../../src/app/core/table/testing/table2.testing.ts","../../src/app/core/table/testing/table2.testing.html","../../src/app/core/table/testing/table.testing.ts","../../src/app/core/table/testing/table.testing.html","../../src/app/core/table/testing/nested-table.testing.ts","../../src/app/core/table/testing/nested-table.testing.html","../../src/app/core/table/testing/table.testing.module.ts","../../src/app/core/form/text-popover/testing/text-popover.testing.ts","../../src/app/core/form/text-popover/testing/text-popover.testing.html","../../src/app/core/form/text-popover/testing/text-popover.testing.module.ts","../../src/app/core/form/properties/testing/properties-form.test.ts","../../src/app/core/form/properties/testing/properties-form.test.html","../../src/app/core/form/properties/testing/properties-form.testing.module.ts","../../src/app/core/form/array/testing/form-array.test.ts","../../src/app/core/form/array/testing/form-array.test.html","../../src/app/core/form/array/testing/form-array-test.module.ts","../../src/app/core/form/text/testing/text-form.testing.ts","../../src/app/core/form/text/testing/text-form.testing.html","../../src/app/core/form/text/testing/text-form.testing.module.ts","../../src/app/core/icon/testing/icon-selector.test.ts","../../src/app/core/icon/testing/icon-selector.test.html","../../src/app/core/icon/testing/icon-selector.testing.module.ts","../../src/app/core/core.testing.module.ts","../../src/app/social/job/testing/job-progression.testing.ts","../../src/app/social/job/testing/job-progression.testing.html","../../src/app/social/job/testing/job.testing.module.ts","../../src/app/social/user-event/testing/user-event.testing.model.ts","../../src/app/social/user-event/testing/user-event.testing.service.ts","../../src/app/social/user-event/testing/user-event.testing.ts","../../src/app/social/user-event/testing/user-event.testing.html","../../src/app/social/user-event/testing/user-event.testing.module.ts","../../src/app/social/feed/testing/feed.testing.ts","../../src/app/social/feed/testing/feed.testing.html","../../src/app/social/feed/testing/feed.testing.module.ts","../../src/app/social/social.testing.module.ts","../../src/app/social/job/testing/job-progression.testing.service.ts","../../public_api.ts","../../sumaris-net.ngx-components.ts"],"sourcesContent":["import { FetchPolicy } from '@apollo/client/core';\nimport { StorageConfig } from '@ionic/storage';\nimport { InjectionToken } from '@angular/core';\nimport { CacheConfig } from 'ionic-cache/lib/interfaces/cache-config.interface';\nimport { LoggingServiceConfig } from '../app/shared/logging/logging-service.config';\nimport { StartupMethod } from '../app/core/services/startup.model';\n\nexport const ENVIRONMENT = new InjectionToken<Environment>('ENV');\n\nexport class Environment {\n  name: string;\n  version: string;\n  buildDate?: string;\n  production: boolean;\n\n  // An URL to load external environment file (e.g. 'assets/environments/environment.json'\n  externalEnvironmentUrl?: string;\n  baseUrl: string;\n  connectionTimeout?: number;\n\n  sameUrlPeer?: boolean;\n\n  // The peer to use (if defined)\n  peer?: { host: string; port: number; useSsl?: boolean; path?: string } | undefined | null;\n\n  // A peer to use at startup (useful on a web site deployment)\n  defaultPeer?: { host: string; port: number; useSsl?: boolean; path?: string } | undefined | null;\n\n  // A list of peers, to select as peer, in settings\n  defaultPeers?: { host: string; port: number; useSsl?: boolean; path?: string }[];\n\n  // Min compatible version for the peer\n  peerMinVersion?: string;\n\n  // Default peer prefix, when fix peer url manually (default: 'https://')\n  peerDefaultPrefix?: string;\n\n  // Allow to select a peer by feature\n  enableSelectPeerByFeature?: boolean;\n\n  // Send app version headers (X-App-Version, X-App-Name) in HTTP requests\n  sendAppVersionHeaders?: boolean;\n\n  // Interval to check if web page must be reload, in millis\n  checkAppVersionIntervalInSeconds?: number;\n\n  // Enable cache persistence ?\n  persistCache?: boolean;\n\n  // Force offline mode ? /!\\ For DEV only\n  offline?: boolean;\n\n  // Apollo (graphQL) config\n  apolloFetchPolicy?: FetchPolicy;\n\n  // Default values\n  defaultLocale: string;\n  defaultLatLongFormat?: 'DD' | 'DDMM' | 'DDMMSS';\n  defaultDepartmentId?: number;\n  defaultAppName?: string;\n  defaultAndroidInstallUrl?: string;\n  defaultIOSInstallUrl?: string;\n  defaultDesktopInstallUrl?: string;\n\n  // Route and style\n  useHash?: boolean; // Configure Angular router to use '#' in URL (need by web-ext artifact)\n  allowDarkMode?: boolean;\n  defaultRoute?: string; // Configure the default route ('/' by default)\n  enableMenu?: boolean; // Enable by default\n\n  // Logging\n  logging?: Partial<LoggingServiceConfig>;\n\n  // Storage\n  cache?: Partial<CacheConfig>;\n  storage?: Partial<StorageConfig>;\n  storageSavePeriodMs?: number;\n\n  // About\n  sourceUrl?: string;\n  reportIssueUrl?: string;\n\n  forumUrl?: string; // TODO allow a map by locale ? ex: { [lang: string]: string };\n  helpUrl?: string; // TODO allow a map by locale ?\n  privacyPolicyUrl?: string; // TODO allow a map by locale ?\n  termsOfUseUrl?: string; // TODO allow a map by locale ?\n\n  // Default authentication /!\\ For DEV only\n  // (see values in the test database - XML files in Pod's module)\n  defaultAuthValues?: {\n    username?: string;\n    password?: string;\n    token?: string;\n  };\n\n  // Auto login /!\\ For DEV only\n  // (the order defines the method precedence)\n  startupOrder?: StartupMethod[];\n\n  // Account\n  account?: {\n    showAccountButton?: boolean; // Show account button in home page (if undefined = true)\n    enableListenChanges?: boolean;\n    // If undefined or 0, then listen only changes made by the pod\n    // If greater than 0 : will check concurrent changes in the DB (e.g. changes mde by another software) AND changes made the pod\n    listenIntervalInSeconds?: number;\n    // Enable avatar view/edit on account page (disabled by default)\n    enableAvatarEdit?: boolean;\n  };\n\n  entityEditor?: {\n    enableListenChanges?: boolean;\n    // If undefined or 0, then listen only changes made by the pod\n    // If greater than 0 : will check concurrent changes in the DB (e.g. changes made by another software) AND changes made the pod\n    listenIntervalInSeconds?: number;\n  };\n\n  feed?: {\n    jsonFeed: { [key: string]: string[] };\n    maxContentLength: number;\n    maxAgeInMonths: number;\n    maxCount: number;\n  };\n}\n","import { InjectionToken } from '@angular/core';\n\nexport const DATE_ISO_PATTERN = 'YYYY-MM-DDTHH:mm:ss.SSSZ';\n// ISO date time patterns accepted by strict parsing (with and without milliseconds)\nexport const DATE_ISO_PATTERNS = [DATE_ISO_PATTERN, 'YYYY-MM-DDTHH:mm:ssZ'];\nexport const DATE_PATTERN = 'YYYY-MM-DD';\nexport const DATE_MATCH_REGEXP = /^\\d+[-]\\d+-\\d+$/;\nexport const DEFAULT_PLACEHOLDER_CHAR = '\\u005F'; // underscore\nexport const PUBKEY_REGEXP = /^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}$/;\nexport const SPACE_PLACEHOLDER_CHAR = '\\u2000';\nexport const SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL = /\\u2000/g;\n\n// See https://unicode-search.net/unicode-namesearch.pl?term=ZERO\nexport const EMPTY_PLACEHOLDER_CHAR = '\\uFEFF'; // ZERO WIDTH NO-BREAK SPACE\nexport const EMPTY_PLACEHOLDER_CHAR_REGEXP_GLOBAL = /\\uFEFF/g; // ZERO WIDTH NO-BREAK SPACE\n\nexport const PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL = /[+]/g;\n\nexport const KEYBOARD_HIDE_DELAY_MS = 250; // 1s\n\n// Separator to join properties (see `joinPropertiesPath()` or `referentialToString()` )\nexport const DEFAULT_JOIN_PROPERTIES_SEPARATOR: string = ' - ';\nexport const DEFAULT_JOIN_ARRAY_VALUES_SEPARATOR: string = ', ';\nexport const APP_SHOW_TOOLTIP = new InjectionToken<boolean>('Use Material Tooltip or not');\n","export abstract class RegExpUtils {\n  private static _cachedSearchRegexps: { [key: string]: RegExp } = {};\n  private static _cachedSearchTexts: string[] = [];\n\n  private static MAX_CACHE_SIZE = 100;\n  private static SPECIAL_CHARACTERS_REGEXP = /[.\\[\\](){}\\\\$^|+*?]/g;\n  private static SPECIAL_CHARACTERS_REPLACEMENT_MAP = {\n    // Escape some characters\n    '.': '[.]', // Escape point\n    '(': '\\\\(', // Escape parenthesis\n    ')': '\\\\)', // Escape parenthesis\n    '[': '\\\\[', // Escape character class opening bracket\n    ']': '\\\\]', // Escape character class closing bracket\n    '{': '\\\\{', // Escape quantifier opening brace\n    '}': '\\\\}', // Escape quantifier closing brace\n    '\\\\': '\\\\\\\\', // Escape backslash itself\n    $: '\\\\$', // Escape dollar sign\n    '^': '\\\\^', // Escape caret\n    '|': '\\\\|', // Escape pipe (alternation)\n    '+': '\\\\+', // Escape plus\n\n    // Transform wildcard characters to regexp\n    '?': '.', // Exactly one character\n    '*': '.*', // Zero or more character\n  };\n\n  /**\n   * Cleans the provided search text by trimming whitespace and removing or condensing\n   * wildcard characters based on the specified options.\n   * (e.g. 'a**' becomes 'a', '*' becomes '', etc.)\n   *\n   * @param {string} searchText - The search text to be cleaned.\n   * @param {Object} [opts] - Optional settings for cleaning the search text.\n   * @param {boolean} [opts.anySearch] - If true, the search text is cleaned for any match. If false, search as a prefix\n   * @return {string} - The cleaned search text.\n   */\n  static cleanSearchText(searchText: string, opts: { trim?: boolean } = { trim: true }): string {\n    if (!searchText?.length) return searchText;\n\n    // DEBUG\n    //console.debug(`[regexp-utils] Cleaning searchText '${searchText}'`);\n\n    searchText = searchText.replace(/[*]{2,}/g, '*'); // Replace many '*' into only one\n\n    // Trim whitespace\n    if (opts?.trim !== false) {\n      searchText = searchText.trim();\n    }\n\n    // Remove trailing wildcard characters\n    searchText = searchText.replace(/^[*]+$/g, '');\n\n    // Clean any match expression\n    if (searchText === '*') return '';\n\n    return searchText;\n  }\n\n  /**\n   * Compiles a regular expression from the provided search text, using a static cache to store\n   * previously compiled regular expressions for faster retrieval.\n   *\n   * @param {string} searchText - The text to compile into a regular expression.\n   * @param flags\n   * @return {RegExp} - The compiled regular expression.\n   */\n  static compileSearchRegexp(searchText: string, flags = 'gi'): RegExp {\n    if (!searchText?.length) return null;\n\n    // Use cached regexp if exists\n    const cacheKey = searchText + '|' + flags;\n    const cachedRegexp = RegExpUtils._cachedSearchRegexps[cacheKey];\n    if (cachedRegexp) return cachedRegexp;\n\n    const searchRegexpText = searchText.replace(RegExpUtils.SPECIAL_CHARACTERS_REGEXP, (match) => RegExpUtils.SPECIAL_CHARACTERS_REPLACEMENT_MAP[match] || match);\n\n    // DEBUG\n    //console.debug(`[regexp-utils] Computing new regexp '${searchRegexpText}' from searchText '${searchText}'`);\n\n    const regexp = new RegExp(`[ ]*${searchRegexpText}`, flags);\n\n    // If cache is full: remove older cache element\n    if (RegExpUtils._cachedSearchTexts.length >= RegExpUtils.MAX_CACHE_SIZE) {\n      // DEBUG\n      //console.debug('[regexp-utils] Removing older cached regexp');\n\n      // Clear half cache's elements\n      while (RegExpUtils._cachedSearchTexts.length > RegExpUtils.MAX_CACHE_SIZE / 2) {\n        const cacheKeyToEvict = RegExpUtils._cachedSearchTexts.shift();\n        delete RegExpUtils._cachedSearchRegexps[cacheKeyToEvict];\n      }\n    }\n\n    // Add to static cache\n    RegExpUtils._cachedSearchRegexps[cacheKey] = regexp;\n    RegExpUtils._cachedSearchTexts.push(cacheKey);\n\n    return regexp;\n  }\n\n  static match(input: string, regexp: string | RegExp): boolean {\n    if (!input) return false;\n    if (regexp instanceof RegExp) {\n      return regexp.test(input);\n    }\n    // Si c'est une string, on garde match qui fera la conversion implicite\n    // ou on pourrait faire new RegExp(regexp).test(input)\n    return !!input.match(regexp);\n  }\n\n  static matchUpperCase(input: string, regexp: string | RegExp): boolean {\n    return RegExpUtils.match(input?.toUpperCase(), regexp);\n  }\n\n  static hasWildcardCharacter(input: string): boolean {\n    return (input && (input.includes('*') || input.includes('?'))) || false;\n  }\n}\n","export function isESModule<T>(value: any | T): value is { default: T } {\n  return value && value['__esModule'] === true && !!value['default'];\n}\n\n/**\n * Workaround need for CommonJS library (eg. moment), because of packagr's issue - see https://github.com/ng-packagr/ng-packagr/issues/2215\n *\n * @param commonJSModule\n */\nexport function unwrapESModule<T = any>(commonJSModule: T | any): T {\n  return isESModule<T>(commonJSModule) ? commonJSModule.default : (commonJSModule as T);\n}\n","import * as cloneImported from 'clone';\nimport { KeysEnum, KeyValueType } from './types';\nimport { DEFAULT_JOIN_PROPERTIES_SEPARATOR } from './constants';\nimport { RegExpUtils } from './regexps';\nimport { unwrapESModule } from './modules';\n\nexport function isNil<T>(obj: T | null | undefined): boolean {\n  return obj === undefined || obj === null;\n}\nexport function isNilOrBlank<T>(obj: T | null | undefined): boolean {\n  return obj === undefined || obj === null || (typeof obj === 'string' && obj.trim() === '');\n}\nexport function isNotNil<T>(obj: T | null | undefined): boolean {\n  return obj !== undefined && obj !== null;\n}\nexport function isNotNilOrBlank<T>(obj: T | null | undefined): boolean {\n  return obj !== undefined && obj !== null && (typeof obj !== 'string' || obj.trim() !== '');\n}\nexport function isNotNilOrNaN<T>(obj: T | null | undefined): boolean {\n  return obj !== undefined && obj !== null && (typeof obj !== 'number' || !isNaN(obj));\n}\nexport function isNilOrNaN<T>(obj: T | null | undefined): boolean {\n  return obj === undefined || obj === null || (typeof obj === 'number' && isNaN(obj));\n}\nexport function isNotEmptyArray<T>(obj: T[] | readonly T[] | null | undefined): boolean {\n  return obj !== undefined && obj !== null && obj.length > 0;\n}\nexport function firstArrayValue<T>(obj: T[] | readonly T[] | null | undefined): T | undefined {\n  return isNotEmptyArray(obj) ? obj[0] : undefined;\n}\nexport function lastArrayValue<T>(obj: T[] | readonly T[] | null | undefined): T | undefined {\n  return isNotEmptyArray(obj) ? obj[obj.length - 1] : undefined;\n}\nexport function isEmptyArray<T>(obj: T[] | readonly T[] | null | undefined): boolean {\n  return obj === undefined || obj === null || !obj.length;\n}\nexport function arrayResize<T>(array: T[] | null | undefined, size: number, defaultValue?: T): T[] {\n  if (size < 0) throw new Error(\"Argument 'size' must be a positive number\");\n  if (!array) return newArray(size, defaultValue);\n\n  // Reduce size\n  if (array.length > size) {\n    return array.slice(0, size);\n  }\n  // Increase size\n  else if (array.length < size) {\n    return [...array, ...newArray(size - array.length, defaultValue)];\n  }\n\n  return array;\n}\nexport function newArray<T>(size: number, defaultValue?: T): T[] {\n  if (size < 0) throw new Error(\"Argument 'size' must be a positive number\");\n  return new Array(size).fill(defaultValue);\n}\nexport function isNotNilBoolean(obj: any | null | undefined): obj is boolean {\n  return (obj !== undefined && obj !== null && typeof obj === 'boolean') || false;\n}\nexport function isNotNilString(obj: any | null | undefined): obj is string {\n  return (obj !== undefined && obj !== null && typeof obj === 'string') || false;\n}\nexport function isNotNilObject(obj: any | null | undefined): obj is object {\n  return (obj !== undefined && obj !== null && typeof obj === 'object') || false;\n}\nexport function isBlankString(obj: any | null | undefined): obj is string {\n  return typeof obj === 'string' && obj.trim().length === 0;\n}\nexport function notNilOrDefault<T>(obj: T | null | undefined, defaultValue: T): T {\n  return obj !== undefined && obj !== null ? obj : defaultValue;\n}\nexport function arraySize<T>(obj: T[] | null | undefined): number {\n  return (isNotEmptyArray(obj) && obj.length) || 0;\n}\n\n/**\n * Remove duplicated value, in array. Will compute a unique key (from given properties, or given function).\n * If propertiesOrKeyFn is nil or undefined, will use all object properties\n *\n * @param values\n * @param propertiesOrKeyFn\n */\nexport function arrayDistinct<T = any>(values: T[], propertiesOrKeyFn?: string | string[] | ((obj: T) => string)): T[] {\n  if (isEmptyArray(values)) return values;\n  const firstValue = values[0];\n  const properties: string[] = (!propertiesOrKeyFn && firstValue && typeof firstValue === 'object' && !Array.isArray(firstValue) && Object.keys(firstValue)) || (Array.isArray(propertiesOrKeyFn) && propertiesOrKeyFn);\n  const getKey: (obj: T) => string =\n    (typeof propertiesOrKeyFn === 'function' && propertiesOrKeyFn) ||\n    (typeof propertiesOrKeyFn === 'string' && ((obj) => getPropertyByPathAsString(obj, propertiesOrKeyFn))) ||\n    (isEmptyArray(properties) && ((obj) => obj?.toString())) ||\n    ((obj) => joinPropertiesPath(obj, properties, { separator: '|', omitEmptyStrings: false }));\n  const existingIds = new Set<string>();\n  return values.reduce((res, item) => {\n    const uniqueKey = getKey(item);\n    if (existingIds.has(uniqueKey)) return res; // Skip if duplicate\n    existingIds.add(uniqueKey);\n    return res.concat(item);\n  }, []);\n}\nexport function nullIfUndefined<T>(obj: T | null | undefined): T | null {\n  return obj === undefined ? null : obj;\n}\nexport function nullIfNilOrBlank<T>(obj: T | null | undefined): T | null {\n  return isNilOrBlank(obj) ? null : obj;\n}\nexport function undefinedIfNull<T>(obj: T | null | undefined): T | undefined {\n  return obj === null ? undefined : obj;\n}\nexport function trimEmptyToNull<T>(str: string | null | undefined): string | null {\n  const value = (str && str.trim()) || undefined;\n  return (value && value.length && value) || null;\n}\nexport function toBoolean(obj: boolean | null | undefined | string, defaultValue?: boolean): boolean {\n  return obj !== undefined && obj !== null ? (obj !== 'false' ? !!obj : false) : defaultValue;\n}\nexport function toNumber(obj: number | null | undefined | string, defaultValue?: number): number {\n  return isNotNilOrNaN(obj) ? +obj : defaultValue;\n}\nexport function toFloat(obj: string | null | undefined, defaultValue?: number): number | null {\n  return obj !== undefined && obj !== null ? parseFloat(obj) : defaultValue;\n}\nexport function toInt(obj: string | null | undefined, defaultValue?: number): number | null {\n  return obj !== undefined && obj !== null ? parseInt(obj, 0) : defaultValue;\n}\nexport function toNotNil<T = any>(obj: T, defaultValue?: T): any | null {\n  return obj !== undefined && obj !== null ? obj : defaultValue;\n}\nexport function removeDuplicatesFromArray<T>(obj: T[] | null | undefined, property?: string): T[] | null | undefined {\n  if (isEmptyArray(obj)) return obj;\n  if (property) {\n    return obj.filter((item, i, array) => array.findIndex((t) => t && item && t[property] === item[property]) === i);\n  }\n  return obj.filter((item, i, array) => array.findIndex((t) => t && item && t === item) === i);\n}\n\nexport function startsWithUpperCase(input: string, search: string): boolean {\n  return input?.toUpperCase().startsWith(search) || false;\n}\n\n/**\n * @deprecated Use Regexps.matchUpperCase instead\n */\nexport const matchUpperCase = RegExpUtils.matchUpperCase;\n\n/**\n * Remove trailing slash if any. Examples :\n * - '/test/' -> '/test'\n * - '/' -> undefined\n */\nexport function noTrailingSlash(path: string): string {\n  if (!path || path.trim() === '/') return undefined;\n  if (path.trim().lastIndexOf('/') === path.length - 1) return path.substring(0, path.length - 1);\n  return path;\n}\n\nexport function replaceAll(value: string, searchString: any, replacement): string | undefined {\n  while (value && value.indexOf(searchString) !== -1) {\n    value = value.replace(searchString, replacement);\n  }\n  return value;\n}\n\nexport function escapeRegExp(value: string) {\n  // eslint-disable-next-line no-useless-escape\n  return value.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nexport function removeEnd(value: string, end: string): string {\n  return value?.endsWith(end || '') ? value.substr(0, value.length - end.length) : value;\n}\n\n/**\n * Replace case change by an underscore (.e.g 'myString' becomes 'my_string')\n *\n * @param value\n */\nexport function changeCaseToUnderscore(value: string): string {\n  if (isNilOrBlank(value)) return value;\n  return value.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n}\n\n/**\n * Replace underscore by a change case (.e.g 'MY_STRING' becomes 'MyString')\n *\n * @param value\n */\nexport function underscoreToChangeCase(value: string): string {\n  if (isNilOrBlank(value)) return value;\n  return value\n    .toLowerCase()\n    .split('_')\n    .filter(isNotNilOrBlank)\n    .map((str, index) => (index === 0 ? str : capitalizeFirstLetter(str)))\n    .join('');\n}\n\nexport function removeDiacritics(text: string): string {\n  return text.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n}\n\nexport function suggestFromStringArray(values: string[], searchText: any, opts?: { anySearch?: boolean }): string[] {\n  searchText = (typeof searchText === 'string' && searchText !== '*' && searchText) || undefined;\n  let cleanSearchText = RegExpUtils.cleanSearchText(searchText as string);\n  if (!cleanSearchText?.length) return values;\n\n  // If wildcard, search using regexp\n  if (opts?.anySearch || RegExpUtils.hasWildcardCharacter(cleanSearchText)) {\n    const regexp = RegExpUtils.compileSearchRegexp(cleanSearchText, 'gi');\n    return values.filter((v) => RegExpUtils.match(v, regexp));\n  } else {\n    // If no wildcard, search using startsWith\n    cleanSearchText = cleanSearchText.toUpperCase();\n    return values.filter((v) => startsWithUpperCase(v, cleanSearchText));\n  }\n}\n\nexport interface JoinOptions {\n  separator?: string;\n  omitEmptyStrings?: boolean;\n  trimResults?: boolean;\n}\n\n/**\n * Joins the values of the specified properties from an object into a single string, using a specified separator\n * and optional configurations for trimming and omitting empty strings.\n *\n * @param {T} obj The object containing the properties to be joined.\n * @param {string[]} properties An array of strings representing the property paths to be accessed and joined.\n * @param {string | JoinOptions} [separatorOrOpts] A string separator or an object defining additional options\n * for joining, such as the separator, whether to trim results, and whether to omit empty strings.\n * @return {string | undefined} A string formed by joining the selected property values, or undefined if no valid\n * values are found after processing.\n */\nexport function joinPropertiesPath<T = any>(obj: T, properties: string[], separatorOrOpts?: string | JoinOptions): string | undefined {\n  if (!obj) throw new Error('Could not display an undefined entity.');\n  if (isEmptyArray(properties)) throw new Error(\"Missing or empty 'properties' argument\");\n\n  const opts: JoinOptions = typeof separatorOrOpts === 'string' ? { separator: separatorOrOpts } : separatorOrOpts || {};\n  const omitEmptyStrings = opts.omitEmptyStrings ?? true;\n  const trimResults = opts.trimResults ?? true;\n  const separator = opts.separator ?? DEFAULT_JOIN_PROPERTIES_SEPARATOR;\n\n  let values = properties.map((path) => getPropertyByPath(obj, path));\n\n  if (trimResults) {\n    values = values.map((v) => (typeof v === 'string' ? v.trim() : v));\n  }\n\n  if (omitEmptyStrings) {\n    values = values.filter(isNotNilOrBlank);\n  } else {\n    values = values.map((value) => (isNotNilOrBlank(value) ? value : ''));\n  }\n\n  return values.join(separator);\n}\n\n/**\n * Joins the specified properties of an object into a single string using a given separator or options.\n *\n * @param {T} obj The object containing the properties to join.\n * @param {K[]} keys An array of keys representing the properties to retrieve and join.\n * @param {string | JoinOptions} [separatorOrOpts] A string to use as the separator or an options object specifying configuration for the join operation.\n * @return {string | undefined} A string containing the joined property values, or undefined if the object is not provided.\n */\nexport function joinProperties<T = any, K extends keyof T = any>(obj: T, keys: K[], separatorOrOpts?: string | JoinOptions): string | undefined {\n  if (!obj) throw new Error('Could not display an undefined entity.');\n\n  const opts: JoinOptions = typeof separatorOrOpts === 'string' ? { separator: separatorOrOpts } : separatorOrOpts || {};\n  const omitEmptyStrings = opts.omitEmptyStrings ?? true;\n  const trimResults = opts.trimResults ?? true;\n  const separator = opts.separator ?? DEFAULT_JOIN_PROPERTIES_SEPARATOR;\n\n  let values: any[] = keys.map((key) => getProperty(obj, key));\n\n  if (trimResults) {\n    values = values.map((v) => (typeof v === 'string' ? v.trim() : v));\n  }\n\n  if (omitEmptyStrings) {\n    values = values.filter(isNotNilOrBlank);\n  } else {\n    values = values.map((value) => (isNotNilOrBlank(value) ? value : ''));\n  }\n\n  return values.join(separator);\n}\n\n/**\n * Generic comparison between two values.\n *\n * Compares two values using the JavaScript greater-than operator.\n * Works for numbers, strings, dates, and any types that provide\n * a meaningful `>` comparison. Use for ascending order.\n *\n * @typeParam T - Type of the compared values.\n * @param a - Left value to compare.\n * @param b - Right value to compare.\n * @returns 0 if equal, -1 if a < b, 1 if a > b.\n */\nexport function compareValues<T>(a: T, b: T): number {\n  if (a === b) return 0;\n  return a > b ? 1 : -1;\n}\n\n/**\n * Reverse comparison between two values (descending order).\n *\n * Same semantics as {@link compareValues} but inverted, to sort\n * in descending order.\n *\n * @typeParam T - Type of the compared values.\n * @param a - Left value to compare.\n * @param b - Right value to compare.\n * @returns 0 if equal, 1 if a < b, -1 if a > b.\n */\nexport function compareValuesDesc<T>(a: T, b: T): number {\n  if (a === b) return 0;\n  return a > b ? -1 : 1;\n}\n\n/**\n * Build a comparator function based on a nested property path.\n *\n * Uses {@link getPropertyByPath} to extract values and compares them\n * in ascending or descending order.\n *\n * @typeParam T - Type of compared objects.\n * @param path - Property path or array path (e.g. \"a.b[0].c\").\n * @param direction - Sort direction, 'asc' by default.\n * @param nullsFirst\n * @returns A comparator compatible with `Array.prototype.sort`.\n */\nexport function propertyPathComparator<T = any>(\n  path: string | string[],\n  direction: 'asc' | 'desc' = 'asc',\n  nullsFirst?: boolean\n): (a: T, b: T) => number {\n  nullsFirst = nullsFirst ?? direction == 'desc';\n  const compareFn = direction === 'asc' ? compareValues : compareValuesDesc;\n  return (a: T, b: T) => {\n    const valueA = getPropertyByPath(a, path);\n    const valueB = getPropertyByPath(b, path);\n    if (valueA == null && valueB == null) return 0;\n    if (valueA == null) return nullsFirst ? -1 : 1;\n    if (valueB == null) return nullsFirst ? 1 : -1;\n    return compareFn(valueA, valueB);\n  };\n}\n\n/**\n * Build a comparator based on a direct property of the compared objects.\n *\n * Falls back to `defaultValue` when the property is `undefined` on an item.\n *\n * @typeParam T - Type of compared objects.\n * @typeParam K - Key of the property in `T`.\n * @param property - Property name to compare.\n * @param direction - Sort direction, 'asc' by default.\n * @param nullsFirst - If true, nil values are placed first, else last. By default, 'false' if direction='asc', 'true' if direction='desc'\n * @returns A comparator compatible with `Array.prototype.sort`.\n */\nexport function propertyComparator<T = any, K extends keyof T = any>(\n  property: K,\n  direction: 'asc' | 'desc' = 'asc',\n  nullsFirst?: boolean\n): (a: T, b: T) => number {\n  nullsFirst = nullsFirst ?? direction === 'desc';\n  const compareFn = direction === 'asc' ? compareValues : compareValuesDesc;\n  return (a: T, b: T) => {\n    const valueA = a[property];\n    const valueB = b[property];\n    if (valueA == null && valueB == null) return 0;\n    if (valueA == null) return nullsFirst ? -1 : 1;\n    if (valueB == null) return nullsFirst ? 1 : -1;\n    return compareFn(valueA, valueB);\n  };\n}\n\n/**\n * Build a comparator using multiple property paths as tie-breakers.\n *\n * Each key in `keys` is resolved via {@link getPropertyByPath}. The first\n * non-zero comparison result is returned. If provided, `defaultValues[i]`\n * is used when a value at `keys[i]` is undefined.\n *\n * @typeParam T - Type of compared objects.\n * @param keys - Ordered list of property paths to compare.\n * @param direction - Sort direction applied to each key, 'asc' by default.\n * @param nullsFirst - Optional\n * @throws Error when `keys` is empty or when `defaultValues` length is invalid.\n * @returns A comparator compatible with `Array.prototype.sort`.\n */\nexport function propertiesPathComparator<T = any>(keys: string[], direction: 'asc' | 'desc' = 'asc', nullsFirst?: boolean): (a: T, b: T) => number {\n  if (isEmptyArray(keys)) {\n    throw new Error(\"Invalid arguments: missing 'keys' or array 'defaultValues' has a bad length\");\n  }\n  nullsFirst = nullsFirst ?? direction === 'desc';\n  const compareFn = direction === 'asc' ? compareValues : compareValuesDesc;\n  return (a: T, b: T) =>\n    keys\n      .map((key, index) => {\n        const valueA = getPropertyByPath(a, key);\n        const valueB = getPropertyByPath(b, key);\n        if (valueA == null && valueB == null) return 0;\n        if (valueA == null) return nullsFirst ? -1 : 1;\n        if (valueB == null) return nullsFirst ? 1 : -1;\n        return compareFn(valueA, valueB);\n      })\n      // Stop if not equals, otherwise continue with the next key\n      .find((res) => res !== 0) || 0;\n}\n\n/**\n * Compose a comparator from multiple comparators (multi-level sort).\n *\n * Each comparator is applied sequentially. The first non-zero result is\n * returned, allowing you to define primary, secondary, tertiary criteria, etc.\n * If all comparators return 0, the items are considered equivalent.\n *\n * @typeParam T - Type of the compared items.\n * @param comparators - List of comparator functions to apply in order.\n * @returns A comparator compatible with `Array.prototype.sort`.\n */\nexport function composeComparators<T>(...comparators: Array<(a: T, b: T) => number>): (a: T, b: T) => number {\n  return (a: T, b: T) => {\n    return (\n      comparators\n        ?.map((comparator) => comparator(a, b))\n        // Stop if not equals, otherwise continue with the next key\n        .find((res) => res !== 0) || 0\n    );\n  };\n}\n\nexport function sort<T>(array: T[], attribute?: string, opts?: Intl.CollatorOptions): T[] {\n  if (isEmptyArray(array)) return array;\n  const compareFn: (a: any, b: any) => number = opts ? new Intl.Collator(undefined, opts).compare : (v1, v2) => (v1 === v2 ? 0 : v1 > v2 ? 1 : -1);\n  return array\n    .slice() // copy\n    .sort(attribute ? (a, b) => compareFn(a[attribute], b[attribute]) : compareFn);\n}\nconst INTEGER_REGEXP = /^[-]?\\d+$/;\nexport function isInt(value: string): boolean {\n  return isNotNil(value) && INTEGER_REGEXP.test(value);\n}\nconst NUMBER_REGEXP = /^[-]?\\d+(\\.\\d+)?$/;\nexport function isNumber(value: string): boolean {\n  return isNotNil(value) && NUMBER_REGEXP.test(value);\n}\n\nconst NUMBER_RANGE_REGEXP = /^(\\d+-\\d+)|([><=]*\\d+)$/;\nexport function isNumberRange(value: string): boolean {\n  return isNotNil(value) && NUMBER_RANGE_REGEXP.test(value);\n}\n\nexport function getPropertyByPath(obj: any, path: string | Array<string | number>, defaultValue?: any): any {\n  if (isNil(obj)) return defaultValue;\n  // Path is an array: convert path to string\n  if (Array.isArray(path)) {\n    return getPropertyByPath(obj, path.join('.'), defaultValue);\n  }\n  if (isNilOrBlank(path)) return obj;\n  if (path.indexOf('[') !== -1) {\n    path = path.replace(/[.]?\\[([^\\[\\]]*)]([.])?/, '.$1$2');\n  }\n  const i = path.indexOf('.');\n  // Simple property path\n  if (i === -1) {\n    const res = obj[path];\n    return isNotNil(res) || isNil(defaultValue) ? res : defaultValue;\n  }\n  // Complex property path\n  const optional = path.charAt(i - 1) === '?';\n  const key = path.substring(0, optional ? i - 1 : i);\n  if (isNil(obj[key])) return defaultValue;\n  if (typeof obj[key] === 'object') {\n    // Object or Array\n    // Recursive call\n    return getPropertyByPath(obj[key], path.substring(i + 1));\n  }\n  if (optional) return defaultValue;\n  throw new Error(`Invalid property path: '${key}' is not an valid object.`);\n}\n\nexport function getProperty<T = any, K extends keyof T = any>(obj: T, key: K): T[K] {\n  if (isNil(obj)) return undefined;\n  return obj[key]; // Inferred type is T[K]\n}\n\nexport function getPropertyByPathAsString(obj: any, path: string | string[], defaultValue?: string): string | undefined {\n  const res = getPropertyByPath(obj, path, defaultValue);\n  return typeof res === 'string' ? res : isNil(res) ? res : '' + res;\n}\n\n/**\n * Update an object's property, using a path (like '<property_1>.<sub_property_1>')\n * @param obj\n * @param path\n * @param value\n * @return the given obj\n */\nexport function setPropertyByPath<T = any>(obj: T, path: string | string[], value: any): T {\n  // Path is an array: convert path to string\n  if (Array.isArray(path)) {\n    return setPropertyByPath(obj, path.join('.'), value);\n  }\n  if (isNil(obj)) return obj; // Skip\n  const i = path.indexOf('.');\n  // Simple property path\n  if (i === -1) {\n    obj[path] = value;\n    return obj;\n  }\n  const key = path.substring(0, i);\n  if (isNil(obj[key])) return undefined;\n  if (obj[key] && typeof obj[key] === 'object') {\n    return setPropertyByPath(obj[key], path.substring(i + 1), value);\n  }\n  throw new Error(`Invalid form path: '${key}' is not an valid object.`);\n}\n\nexport function sleep(ms: number): Promise<void> {\n  if (ms <= 0) return Promise.resolve();\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n  return typeof value?.['then'] === 'function' && typeof value?.['catch'] === 'function';\n}\n\n/**\n * Rounds a numeric value to 'nbDecimal' decimal places.\n *\n * @param {number | undefined | null} value - The value to be rounded. Can be a number, undefined, or null.\n * @param nbDecimal the number of decimal (default: 2)\n * @return {number} The rounded value with two decimal places if the input value is a valid number; otherwise, returns the input value.\n */\nexport function round(value: number | undefined | null, nbDecimal?: number): number {\n  if (isNotNilOrNaN(+value)) {\n    nbDecimal = nbDecimal ?? 2;\n    const factor = Math.pow(10, nbDecimal);\n    return Math.round((+value + Number.EPSILON) * factor) / factor;\n  }\n  return value;\n}\n\nexport function equalsOrNil(value1: any, value2: any) {\n  return value1 === value2 || (isNil(value1) && isNil(value2));\n}\n\n/**\n * remove elements from an array\n *\n * @return the removed elements\n * @param array the array on which elements will be removed\n * @param predicate the selection predicate\n */\nexport function removeAll<T>(array: T[], predicate: (value: T) => boolean): T[] {\n  let nbRemove = 0;\n  return array\n    .slice()\n    .map((value, index) => {\n      if (predicate(value)) {\n        nbRemove++; // glitch counter to avoid index gap\n        return array.splice(index - nbRemove + 1, 1)[0];\n      }\n      return null;\n    })\n    .filter(isNotNil);\n}\n\n/**\n * remove the first element from an array\n *\n * @return the removed element\n * @param array the array on which the element will be removed\n * @param predicate the selection predicate\n */\nexport function remove<T>(array: T[], predicate: (value: T) => boolean): T {\n  return array.slice().find((value, index) => {\n    if (predicate(value)) {\n      array.splice(index, 1);\n      return true;\n    }\n    return false;\n  });\n}\n\nexport function capitalizeFirstLetter(value: string) {\n  if (!value || value.length === 0) return value;\n  return value.charAt(0).toUpperCase() + value.substring(1);\n}\nexport function uncapitalizeFirstLetter(value: string) {\n  if (!value || value.length === 0) return value;\n  return value.charAt(0).toLowerCase() + value.substring(1);\n}\nexport function booleanToString(value: any, opts: { yesLabel: string; noLabel: string } = { yesLabel: 'COMMON.YES', noLabel: 'COMMON.NO' }) {\n  if (isNil(value)) return undefined;\n  return value === 1 || value === true || value === 'true' ? opts.yesLabel : opts.noLabel;\n}\n\nexport function splitByProperty<T, M extends KeyValueType<T> = KeyValueType<T>>(array: T[] | readonly T[], propertyName: keyof T | string): M {\n  return (array || []).reduce((res, value) => {\n    const key = (value as unknown as any)?.[propertyName];\n    if (isNotNil(key)) {\n      res[key] = value;\n    }\n    return res;\n  }, {}) as M;\n}\n\nexport function splitById<T, M extends KeyValueType<T> = KeyValueType<T>>(array: T[] | readonly T[]): M {\n  return (array || []).reduce(\n    (res, value) => {\n      const key = value?.['id'];\n      if (isNotNil(key)) {\n        res[key] = value;\n      }\n      return res;\n    },\n    <M>{}\n  );\n}\n\n/**\n * Split an array, into a map of array, group by property\n */\nexport function collectByProperty<T>(values: T[], propertyName: keyof T, defaultValue?: string | number): KeyValueType<T[]> {\n  return (values || []).reduce(\n    (res, item) => {\n      const key = item?.[propertyName] ?? defaultValue;\n      if (typeof key === 'number' || typeof key === 'string') {\n        res[key] = res[key] || [];\n        res[key].push(item);\n      }\n      return res;\n    },\n    <KeyValueType<T[]>>{}\n  );\n}\n\n\n/**\n * Split an array, into a map of array, group by property path\n */\nexport function collectByPropertyPath<T>(values: T[], propertyPath: string | Array<string | number>, defaultValue?: string | number): KeyValueType<T[]> {\n  return (values || []).reduce(\n    (res, item) => {\n      const key = getPropertyByPath(item, propertyPath, defaultValue);\n      if (typeof key === 'number' || typeof key === 'string') {\n        res[key] = res[key] || [];\n        res[key].push(item);\n      }\n      return res;\n    },\n    <KeyValueType<T[]>>{}\n  );\n}\n\n\n/**\n * Split an array into chunks with fixed size\n */\nexport function splitArrayInChunks<T = any>(value: T[], chunkSize: number): T[][] {\n  if (!value?.length) return [];\n  if (chunkSize === -1) return [value]; // Only one page\n  if (!chunkSize || isNaN(chunkSize) || chunkSize < 1) {\n    throw '[splitArrayInChunks] Number of row must be a positive number !';\n  }\n  if (value.length <= chunkSize) {\n    return [value];\n  }\n  let length = Math.round(value.length / chunkSize + 0.5);\n  if (value.length === (length - 1) * chunkSize) {\n    length = length - 1;\n  }\n  const result = new Array(length);\n  for (let i = 0; i < length; i++) {\n    const start = i * chunkSize;\n    const end = Math.min(value.length, start + chunkSize);\n    result[i] = value.slice(start, end);\n  }\n  return result;\n}\n\n/**\n * Determines if two objects or two values are equivalent.\n *\n * Two objects or values are considered equivalent if at least one of the following is true:\n *\n * * Both objects or values pass `===` comparison.\n * * Both objects or values are of the same type and all of their properties are equal by\n *   comparing them with `equals`.\n *\n * @param o1 Object or value to compare.\n * @param o2 Object or value to compare.\n * @returns true if arguments are equal.\n */\nexport function equals(o1: any, o2: any): boolean {\n  if (o1 === o2) return true;\n  if (o1 === null || o2 === null) return false;\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\n  const t1 = typeof o1;\n  const t2 = typeof o2;\n  let length: number;\n  let key: any;\n  let keySet: any;\n  if (t1 === t2 && t1 === 'object') {\n    if (Array.isArray(o1)) {\n      if (!Array.isArray(o2)) return false;\n      if ((length = o1.length) === o2.length) {\n        for (key = 0; key < length; key++) {\n          if (!equals(o1[key], o2[key])) return false;\n        }\n        return true;\n      }\n    } else {\n      if (Array.isArray(o2)) {\n        return false;\n      }\n      keySet = Object.create(null);\n      // eslint-disable-next-line guard-for-in\n      for (key in o1) {\n        if (!equals(o1[key], o2[key])) {\n          return false;\n        }\n        keySet[key] = true;\n      }\n      for (key in o2) {\n        if (!(key in keySet) && typeof o2[key] !== 'undefined') {\n          return false;\n        }\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\nconst _clone = unwrapESModule<typeof cloneImported>(cloneImported);\n\n// @dynamic\nexport class Beans {\n  /**\n   * Deep clone.\n   * See https://github.com/pvorb/clone\n   */\n  static clone = _clone;\n\n  /**\n   * Copy a source object, by including only properties of the given dataType.\n   * IMPORTANT: extra properties that are NOT in the targetClass are NOT copied.\n   *\n   * @param source The source object to copy\n   * @param dataType the class to use as target class\n   * @param keys The keys to copy. If empty, will copy only NOT optional properties from the dataType\n   */\n  static copy<T>(source: T, dataType: new () => T, keys?: KeysEnum<T>): T {\n    if (isNil(source)) return source;\n    const target = new dataType();\n    Object.keys(keys || target).forEach((key) => {\n      target[key] = source[key];\n    });\n    return target;\n  }\n\n  /**\n   * Says if an object all all properties to nil\n   */\n  static isEmpty<T>(\n    data: T,\n    keys?: KeysEnum<T> | string[],\n    opts?: {\n      blankStringLikeEmpty?: boolean;\n    }\n  ): boolean {\n    return (\n      isNil(data) ||\n      (Array.isArray(keys) ? keys : Object.keys(keys || data))\n        // Find index of the first NOT nil value\n        .findIndex((key) => {\n          const value = data[key];\n          if (value && typeof value === 'object') return !Beans.isEmpty(value, null, opts); // Loop\n          if (opts && opts.blankStringLikeEmpty === true && typeof value === 'string') return isNotNilOrBlank(value);\n          return isNotNil(value);\n        }) === -1\n    );\n  }\n\n  static collectById<T>(array: T[]): KeyValueType<T[]> {\n    return collectByProperty(array, 'id' as keyof T);\n  }\n\n  static collectByProperty = collectByProperty;\n}\n\nexport function findParentWithClass(elem: HTMLElement, className: string): HTMLElement {\n  if (!className) return undefined;\n  let currentElement = elem?.parentElement;\n  while (currentElement) {\n    if (currentElement.classList.contains(className)) return currentElement;\n    currentElement = currentElement.parentElement;\n  }\n  return undefined;\n}\n\nexport function intersectArrays<T = any>(values: T[][]): T[] {\n  if (isEmptyArray(values)) return [];\n\n  // Utilise la méthode reduce pour obtenir l'intersection des tableaux\n  return values.reduce((acc, curr) => acc.filter((x) => curr.includes(x)), values[0].slice());\n}\n\n/**\n * Interpolates a string by replacing placeholders with corresponding values from the provided object.\n *\n * @param {string} message - The string containing placeholders enclosed in double curly braces (e.g., {{key}}).\n * @param {Record<string, any>} interpolateParams - An object containing key-value pairs for interpolation.\n * @return {string} The interpolated string with placeholders replaced by corresponding values, or the original string if no placeholders are matched.\n */\nexport function interpolateString(message: string, interpolateParams: Record<string, any>): string {\n  if (isNilOrBlank(message)) return message;\n\n  return message.replace(/{{([^}]+)}}/g, (match: string, path: string) => {\n    try {\n      const paramValue = getPropertyByPathAsString(interpolateParams, path.trim());\n      return paramValue || '';\n    } catch (e) {\n      console.error(`Unable to bind an expression:\\n\\t- message: ${message}\\n\\t- expression: ${match}`);\n      return match;\n    }\n  });\n}\n\n/**\n *\n * Transforms a value (typically a string) to a number.\n * Intended to be used as a transform function of an input.\n * Should return n=undefined when for a nil input\n * @param value Value to be transformed.\n * @param fallbackValue Value to use if the provided value can't be parsed as a number.\n *\n *  @usageNotes\n *  ```ts\n *  @Input({ transform: numberAttribute }) id!: number;\n *  ```\n *\n * @publicApi\n */\nexport function numberOrNilAttribute(value: unknown, fallbackValue = NaN): number | undefined | null {\n  if (value === undefined || value === null) return value as undefined | null;\n  // parseFloat(value) handles most of the cases we're interested in (it treats null, empty string,\n  // and other non-number values as NaN, where Number just uses 0) but it considers the string\n  // '123hello' to be a valid number. Therefore we also check if Number(value) is NaN.\n  const isNumberValue = !isNaN(parseFloat(value as any)) && !isNaN(Number(value));\n  return isNumberValue ? Number(value) : fallbackValue;\n}\n\n/**\n * Formats a given number according to the specified options.\n *\n * @param {number} val - The number to be formatted.\n * @param {Intl.NumberFormatOptions & { fixedDecimals?: number }} [opts] - An optional object containing formatting options. It can include standard `Intl.NumberFormatOptions` properties and an additional `fixedDecimals` property to specify the number of fixed decimal places.\n * @return {string} The formatted number as a string, based on the provided options.\n */\nexport function numberToString(val: number, opts?: Intl.NumberFormatOptions & { fixedDecimals?: number }): string {\n  // Format the output to display any way you want here.\n  if (val !== undefined && val !== null && !isNaN(val)) {\n    if (opts?.fixedDecimals) {\n      return val.toFixed(opts.fixedDecimals);\n    }\n    return val.toLocaleString(undefined, opts);\n  } else {\n    return '';\n  }\n}\n\n/**\n * @deprecated Use deepMergeSkipUndefined instead\n */\nexport function mergeObjectsWithoutUndefined(...objects: unknown[]): unknown {\n  return _safeDeepMergeSkipUndefined({}, objects, new WeakSet());\n}\n\n/**\n * @deprecated Use deepMergeSkipUndefined instead\n */\nexport function assignSkipUndefined(target: unknown, ...sources: unknown[]): unknown {\n  return _safeDeepMergeSkipUndefined(target, sources, new WeakSet());\n}\n\n/**\n * Merge many objects into one new object, skipping undefined objects or properties with `undefined` values.\n * This function is recursive, but prevents circular references - fix issue sumaris-app#1929.\n *\n * @param {Partial<T>} target - The target object to merge properties into. Defaults to an empty object if not provided.\n * @param {...unknown[]} sources - One or more source objects to merge into the target object.\n * @return {T} The resulting object after merging the target and source objects.\n */\nexport function deepMergeSkipUndefined<T = Record<string, unknown>>(target: Partial<T> = {} as T, ...sources: unknown[]): T {\n  return _safeDeepMergeSkipUndefined(target, sources, new WeakSet());\n}\n\n/**\n * Safely merge properties from source objects to the target object while skipping undefined values.\n * Prevents circular references by keeping track of processed sources.\n *\n * @param {unknown} target - The target object to which properties should be assigned.\n * @param {unknown[]} sources - An array of source objects containing properties to be assigned.\n * @param {unknown[]} visited - An optional array to track processed source objects to prevent infinite loops.\n * @return {unknown} The updated target object after merging the source objects, excluding undefined properties.\n */\nfunction _safeDeepMergeSkipUndefined<T>(\n  target: any,\n  sources: unknown[],\n  visited: WeakSet<object>\n): T {\n  if (!sources.length) {\n    return target;\n  }\n\n  // Si target est falsy, on prend le premier source valide\n  if (!target || typeof target !== 'object' || Array.isArray(target)) {\n    return _safeDeepMergeSkipUndefined(sources[0], sources.slice(1), visited) as T;\n  }\n\n  for (const source of sources) {\n    if (!source || typeof source !== 'object' || Array.isArray(source)) {\n      continue;\n    }\n\n    // Skip if already visited\n    if (visited.has(source)) {\n      continue;\n    }\n    visited.add(source);\n\n    for (const [key, value] of Object.entries(source)) {\n      if (value === undefined) {\n        continue;\n      }\n\n      if (\n        value &&\n        typeof value === 'object' &&\n        !Array.isArray(value) &&\n        !visited.has(value as object)\n      ) {\n        // Merge récursif\n        target[key] = _safeDeepMergeSkipUndefined(\n          target[key] ?? {},\n          [value],\n          visited\n        );\n      } else {\n        // Primitive, null, array, etc. → replace\n        target[key] = value;\n      }\n    }\n  }\n\n  return target;\n}\n","import { Directive } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom, of, shareReplay, tap } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Environment } from './environment.class';\nimport { isNotNilOrBlank } from '../app/shared/functions';\n\n@Directive()\nexport abstract class EnvironmentLoader<T extends Environment = Environment> {\n  abstract load(): Promise<T>;\n\n  abstract get(): T;\n}\n\nexport class EnvironmentHttpLoader<T extends Environment = Environment> extends EnvironmentLoader<T> {\n  private readonly _logPrefix = '[environment-loader] ';\n\n  protected _debug: boolean;\n  protected _environment: T;\n  protected _loaded = false;\n  protected readonly _externalEnvironmentUrl: string;\n\n  constructor(\n    protected http: HttpClient,\n    defaultEnvironment?: T\n  ) {\n    super();\n    // Copy default environment (because can be readonly)\n    this._environment = Object.assign({}, defaultEnvironment || <T>{});\n    this._externalEnvironmentUrl = this._environment.externalEnvironmentUrl;\n    this._debug = !this._environment.production;\n  }\n\n  /**\n   * Get the loaded environment. Should be call after loaded\n   */\n  get(): T {\n    if (!this._loaded && isNotNilOrBlank(this._externalEnvironmentUrl)) {\n      console.warn(`${this._logPrefix}EnvironmentHttpLoader.get() should be called AFTER load() finished.`);\n    }\n    return this._environment;\n  }\n\n  async load(): Promise<T> {\n    if (this._loaded) return this._environment; // Already loaded\n\n    try {\n      // If it has an external url\n      if (isNotNilOrBlank(this._externalEnvironmentUrl)) {\n        // DEBUG\n        //await sleep(4000);\n\n        // Load external environment file\n        const json = await this.fetch(this._externalEnvironmentUrl);\n\n        // Patch the existing environment\n        if (json) {\n          Object.assign(this._environment, json);\n        }\n      }\n\n      return this._environment;\n    } finally {\n      this._loaded = true;\n    }\n  }\n\n  /* -- protected function -- */\n\n  protected async fetch(url: string): Promise<Partial<T>> {\n    if (this._debug) console.debug(`${this._logPrefix}Loading external environment from {${url}}...`);\n\n    return firstValueFrom(\n      this.http.get<Partial<T>>(url).pipe(\n        shareReplay(1),\n        tap((json) => {\n          if (this._debug) console.debug(`${this._logPrefix}External environment loaded`, json);\n        }),\n        catchError((error) => {\n          if (error.status === 404) {\n            if (this._debug) console.error(`${this._logPrefix}External environment not found (404)`);\n          } else {\n            console.error(`${this._logPrefix}Failed to load external environment: ${error.message}`, error);\n          }\n          return of(null);\n        })\n      )\n    );\n  }\n}\n","import { Injectable, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { isMoment, Moment } from 'moment';\nimport { DATE_ISO_PATTERN } from '../constants';\nimport { TranslateService } from '@ngx-translate/core';\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\nimport { Subscription } from 'rxjs';\n\nabstract class AbstractDateFormat {\n  private datePattern: string;\n  private dateTimePattern: string;\n  private dateTimeSecondsPattern: string;\n\n  protected constructor(\n    protected dateAdapter: MomentDateAdapter,\n    protected translate: TranslateService\n  ) {\n    const translations = translate.instant(['COMMON.DATE_PATTERN', 'COMMON.DATE_TIME_PATTERN', 'COMMON.DATE_TIME_SECONDS_PATTERN']);\n    this._updateTranslations(translations);\n  }\n\n  transform(value: string | Moment | Date, args?: { pattern?: string; time?: boolean; seconds?: boolean }): string {\n    const pattern =\n      (args && args.pattern) || (args && args.time ? (args.seconds ? this.dateTimeSecondsPattern : this.dateTimePattern) : this.datePattern);\n    // Keep original moment object, if possible (to avoid a conversion)\n    const date: Moment = isMoment(value) ? value : this.dateAdapter.parse(value, DATE_ISO_PATTERN);\n    return (date && this.dateAdapter.format(date, pattern)) || '';\n  }\n\n  protected _updateTranslations(translations: any) {\n    this.datePattern = this._getTranslationValue(translations, 'COMMON.DATE_PATTERN', 'DD/MM/YYYY');\n    this.dateTimePattern = this._getTranslationValue(translations, 'COMMON.DATE_TIME_PATTERN', 'DD/MM/YYYY HH:mm');\n    this.dateTimeSecondsPattern = this._getTranslationValue(translations, 'COMMON.DATE_TIME_SECONDS_PATTERN', 'DD/MM/YYYY HH:mm:ss');\n  }\n\n  protected _getTranslationValue(translations: any, key: string, defaultValue: string): string {\n    return translations[key] !== key ? translations[key] : defaultValue;\n  }\n}\n\n@Pipe({\n  name: 'dateFormat',\n})\nexport class DateFormatPipe extends AbstractDateFormat implements PipeTransform {\n  constructor(dateAdapter: MomentDateAdapter, translate: TranslateService) {\n    super(dateAdapter, translate);\n  }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DateFormatService extends AbstractDateFormat implements OnDestroy {\n  private _subscription: Subscription;\n\n  constructor(dateAdapter: MomentDateAdapter, translate: TranslateService) {\n    super(dateAdapter, translate);\n\n    // Subscribe to changes (e.g. when platform not ready yet)\n    this._subscription = translate\n      .get(['COMMON.DATE_PATTERN', 'COMMON.DATE_TIME_PATTERN', 'COMMON.DATE_TIME_SECONDS_PATTERN'])\n      .subscribe((translations) => this._updateTranslations(translations));\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n\n  format(date: Moment, pattern: any): string {\n    return this.dateAdapter.format(date, pattern);\n  }\n\n  parse(value: string, parseFormat: any): Moment {\n    return isMoment(value) ? value : this.dateAdapter.parse(value, parseFormat || DATE_ISO_PATTERN);\n  }\n}\n","import * as momentImported from 'moment';\nimport {Duration, DurationInputArg1, DurationInputArg2, isMoment, Moment, MomentFormatSpecification, MomentInput, unitOfTime} from 'moment/moment';\nimport {DATE_ISO_PATTERNS, DATE_MATCH_REGEXP, DATE_PATTERN} from './constants';\nimport {unwrapESModule} from './modules';\n\n// // Workaround for issue https://github.com/ng-packagr/ng-packagr/issues/2215\ntype MomentFn = {\n  (inp?: MomentInput, strict?: boolean): Moment;\n  (inp?: MomentInput, format?: MomentFormatSpecification, strict?: boolean): Moment;\n  (inp?: MomentInput, format?: MomentFormatSpecification, language?: string, strict?: boolean): Moment;\n  duration: (inp?: DurationInputArg1, unit?: DurationInputArg2) => Duration;\n};\nconst _moment = unwrapESModule<MomentFn>(momentImported);\n\nexport const DATE_UNIX_TIMESTAMP = 'X';\nexport const DATE_UNIX_MS_TIMESTAMP = 'x';\nexport const MOMENT_NO_TIME_PROPERTY = '_hasNoTime';\n\nexport class DateUtils {\n  static moment = _moment;\n\n  static toDateISOString = toDateISOString;\n  static fromDateISOString = fromDateISOString;\n  static fromUnixTimestamp = fromUnixTimestamp;\n  static fromUnixMsTimestamp = fromUnixMsTimestamp;\n  static toDuration = toDuration;\n\n  static min(date1: Moment, date2: Moment): Moment {\n    const d1 = fromDateISOString(date1);\n    const d2 = fromDateISOString(date2);\n    return d1 && (!d2 || d1.isSameOrBefore(d2)) ? d1 : d2;\n  }\n\n  static max(date1: Moment | string, date2: Moment | string): Moment {\n    const d1 = fromDateISOString(date1);\n    const d2 = fromDateISOString(date2);\n    return d1 && (!d2 || d1.isSameOrAfter(d2)) ? d1 : d2;\n  }\n\n  static equals(date1: Moment | string, date2: Moment | string): boolean {\n    return DateUtils.isSame(date1, date2);\n  }\n\n  static isSame(date1: Moment | string, date2: Moment | string, granularity?: unitOfTime.StartOf): boolean {\n    const d1 = fromDateISOString(date1);\n    const d2 = fromDateISOString(date2);\n    return (!d1 && !d2) || (d1 && d1.isSame(d2, granularity));\n  }\n\n  static compare(date1: Moment | string, date2: Moment | string, granularity?: unitOfTime.StartOf): number {\n    const d1 = fromDateISOString(date1);\n    const d2 = fromDateISOString(date2);\n    if ((!d1 && !d2) || d1?.isSame(d2, granularity)) return 0; // Equals\n    if (d1?.isAfter(d2, granularity)) return 1; // After\n    return -1; // Before\n  }\n\n  /**\n   * Calculates the absolute difference between two dates in the specified units.\n   *\n   * @param {Moment | string} date1 - The first date to compare.\n   * @param {Moment | string} date2 - The second date to compare.\n   * @param {unitOfTime.Base} [durationUnit='seconds'] - The unit of time to express the difference in (default is 'seconds').\n   * @return {number} The absolute difference between the two dates expressed in the specified units.\n   */\n  static diffAbs(date1: Moment | string, date2: Moment | string, durationUnit: unitOfTime.Base = 'seconds'): number {\n    const d1 = fromDateISOString(date1);\n    const d2 = fromDateISOString(date2);\n    if (!d1 || !d2) throw new Error('Missing 2 first required arguments'); // Cannot compute\n    return DateUtils.moment.duration(d1.diff(d2)).abs().as(durationUnit);\n  }\n\n  /**\n   * Create a copy of a date, without time fields (always return a new Moment object, or undefined).\n   * Same implementation as the Java class Dates.resetTime() (see any SUMARiS like Pod)\n   *\n   * @param value\n   * @param timezone a timezone (see https://momentjs.com/timezone/)\n   * @param keepLocalTime if true, only the timezone (and offset) is updated, keeping the local time same. Consequently, it will now point to a different point in time if the offset has changed.\n   */\n  static resetTime(value: Moment | string, timezone?: string, keepLocalTime?: boolean): Moment | undefined {\n    if (!value) return undefined;\n    const date = fromDateISOString(value);\n    // No timezone\n    if (!timezone) {\n      return date.clone().startOf('day');\n    }\n    // Use timezone\n    return date\n      .clone() // clone the original date\n      .tz(timezone, keepLocalTime)\n      .startOf('day');\n  }\n\n  static markNoTime(value: Moment | undefined): Moment | undefined {\n    if (!value) return undefined;\n    value[MOMENT_NO_TIME_PROPERTY] = true;\n    return value;\n  }\n\n  static markTime(value: Moment): Moment | undefined {\n    if (!value) return undefined;\n    delete value[MOMENT_NO_TIME_PROPERTY];\n    return value;\n  }\n\n  static isNoTime(value: Moment): boolean {\n    return value?.[MOMENT_NO_TIME_PROPERTY] === true;\n  }\n\n  /**\n   * Test if a date is on the given day of week\n   *\n   * @param date\n   * @param weekday\n   * @param timezone\n   */\n  static isAtDay(date: string | Moment, weekday: number, timezone?: string): boolean {\n    let momentDate = date && fromDateISOString(date);\n    if (!momentDate) return false;\n    if (timezone) momentDate = momentDate.clone().tz(timezone).startOf('day');\n    return momentDate.day() === weekday;\n  }\n\n  static durationToString(\n    value: number,\n    dayUnit: string,\n    opts?: unitOfTime.DurationConstructor | { unit?: unitOfTime.DurationConstructor; seconds?: boolean } | any\n  ): string {\n    if (!value) return '';\n    const unit: unitOfTime.DurationConstructor = opts?.unit || opts || 'hours';\n\n    // try with moment\n    const duration = toDuration(value, unit);\n\n    const days = duration.days();\n    const hours = duration.hours().toString().padStart(3, '0');\n    const minutes = duration.minutes().toString().padStart(2, '0');\n    const seconds = opts?.seconds ? duration.seconds().toString().padStart(2, '0') : null;\n\n    return (days > 0 ? days.toString() + (dayUnit + ' ') : '') + hours + ':' + minutes + (seconds ? ':' + seconds : '');\n  }\n}\n\n/**\n * Converts the given value to an ISO date string representation.\n *\n * @param {any} value - The value to be transformed into an ISO date string. This can be a date, a string, or other compatible formats.\n * @return {string | undefined} Returns the ISO date string if the conversion is successful; otherwise, returns undefined.\n */\nexport function toDateISOString(value: any): string | undefined {\n  if (!value) return undefined;\n\n  // Already a valid ISO date time string (without timezone): use it\n  if (typeof value === 'string' && value.indexOf('+') === -1 && value.lastIndexOf('Z') === value.length - 1) {\n    return value;\n  }\n  // Make sure to have a Moment object\n  const date = fromDateISOString(value);\n  if (!date) return undefined;\n  return DateUtils.isNoTime(date) ? date.toISOString(true /* important ! */).substring(0, 10) : date.toISOString();\n}\n\n/**\n * Converts a given value to a Moment object if possible.\n * If the given value is already a Moment object, it will simply return it.\n * The method handles strings in ISO date formats, UNIX timestamps, and performs validation based on provided options.\n *\n * @param {any} value - The value to be converted to a Moment object. This can be a string representing a date, a UNIX timestamp, or a Moment object.\n * @param {Object} [opts] - Optional parameters for controlling the method's behavior.\n * @param {boolean} [opts.undefinedIfInvalid=true] - Determines if the method should return undefined for invalid dates. If set to false, an invalid Moment object will be returned instead.\n * @param {boolean} [opts.strict=false] - Controls whether strict validation is performed. Strict mode enforces stricter date parsing rules.\n * @param {boolean} [opts.requiredTime=false] - Allow to parse a date without any time\n * @return {Moment | undefined} A Moment object if the value is successfully converted, or undefined if the conversion is not possible and undefinedIfInvalid is true.\n */\nexport function fromDateISOString(\n  value: any,\n  opts: { undefinedIfInvalid?: boolean; strict?: boolean; requiredTime?: boolean } = { undefinedIfInvalid: true, strict: false, requiredTime: false }\n): Moment | undefined {\n  // Already a moment object: use it\n  if (!value || isMoment(value)) return value;\n\n  let date: Moment;\n\n  // Try without time\n  if (typeof value === 'string' && DATE_MATCH_REGEXP.test(value) && !opts?.requiredTime) {\n    // Parse the input value, as a date only\n    date = DateUtils.moment(value, DATE_PATTERN, true);\n\n    // Mark as no time, if valid\n    if (date.isValid()) return DateUtils.markNoTime(date); // OK\n  } else {\n    // Parse the input value, as a ISO date time.\n    // If time is required, we use strict parsing to ensure the input matches an ISO pattern that includes time.\n    // We accept the ISO date time with or without milliseconds (e.g. '...10:30:00+02:00' and '...10:30:00.000+02:00'),\n    // but NOT a date-only value (handled above), so 'requiredTime' still rejects values without time.\n    const strictForParsing = opts?.requiredTime;\n    date = DateUtils.moment(value, DATE_ISO_PATTERNS, strictForParsing);\n\n    if (date.isValid()) return date; // OK\n\n    // Not valid: trying to convert from unix timestamp (if not strict mode)\n    if (typeof value === 'string' && !opts?.strict) {\n      // Log debug\n      console.debug('Wrong date format - Trying to convert from local time: ' + value);\n\n      if (value.length === 10) {\n        date = fromUnixTimestamp(value);\n      } else if (value.length === 13) {\n        date = fromUnixMsTimestamp(value);\n      }\n\n      if (date.isValid()) return date; // OK\n    }\n  }\n\n  // Return invalid date, if allowed\n  if (opts?.undefinedIfInvalid === false) return date; // Return invalid\n\n  console.warn('Unable to parse date: ' + value, opts);\n  return undefined; // Return undefined, if invalid not allowed\n}\n\nexport function fromUnixTimestamp(timeInSec: MomentInput) {\n  return DateUtils.moment(timeInSec, DATE_UNIX_TIMESTAMP);\n}\nexport function fromUnixMsTimestamp(timeInMs: MomentInput) {\n  return DateUtils.moment(timeInMs, DATE_UNIX_MS_TIMESTAMP);\n}\n\nexport function toDuration(value: number, unit?: unitOfTime.DurationConstructor): Duration | undefined {\n  if (!value) return undefined;\n\n  const duration = DateUtils.moment.duration(value, unit);\n\n  // fix 990+ ms\n  if (duration.milliseconds() >= 990) {\n    duration.add(1000 - duration.milliseconds(), 'ms');\n  }\n  // fix 59 s\n  if (duration.seconds() >= 59) {\n    duration.add(60 - duration.seconds(), 's');\n  }\n\n  return duration;\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { Moment } from 'moment';\nimport { DateAdapter } from '@angular/material/core';\nimport { DATE_ISO_PATTERN } from '../constants';\nimport { TranslateService } from '@ngx-translate/core';\nimport { DateUtils } from '../dates';\nimport { unitOfTime } from 'moment/moment';\n\n@Pipe({\n  name: 'dateDiffDuration',\n})\n@Injectable({ providedIn: 'root' })\nexport class DateDiffDurationPipe implements PipeTransform {\n  protected dayUnit: string;\n\n  constructor(\n    private dateAdapter: DateAdapter<Moment>,\n    translate: TranslateService\n  ) {\n    this.dayUnit = translate.instant('COMMON.DAY_UNIT');\n    translate.get('COMMON.DAY_UNIT').subscribe((dayUnit) => (this.dayUnit = dayUnit));\n  }\n\n  transform(\n    value: { startValue: string | Moment; endValue: string | Moment },\n    opts?: { seconds?: boolean; unit?: unitOfTime.Base }\n  ): string | Promise<string> {\n    if (!value.startValue || !value.endValue) return '';\n\n    const startDate = this.dateAdapter.parse(value.startValue, DATE_ISO_PATTERN);\n    const endDate = this.dateAdapter.parse(value.endValue, DATE_ISO_PATTERN);\n\n    return this.format(startDate, endDate, opts);\n  }\n\n  format(startDate: Moment, endDate: Moment, opts: { seconds?: boolean; unit?: unitOfTime.Base }): string {\n    const duration = DateUtils.moment.duration(endDate.diff(startDate));\n\n    // Convert to the expected unit, if any\n    if (opts?.unit) return '' + duration.as(opts.unit);\n\n    const withSeconds = opts?.seconds;\n    if (!withSeconds && duration.asMinutes() < 0) return '';\n\n    const timeDuration = DateUtils.moment(0).hour(duration.hours()).minute(duration.minutes());\n    if (withSeconds) {\n      timeDuration.second(duration.seconds());\n    }\n\n    const days = Math.floor(duration.asDays());\n    return (days > 0 ? days.toString() + (this.dayUnit + ' ') : '') + timeDuration.format(withSeconds ? 'HH:mm:ss' : 'HH:mm');\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { isMoment, Moment } from 'moment';\nimport { DATE_ISO_PATTERN } from '../constants';\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\n\n@Pipe({\n  name: 'dateFromNow',\n})\n@Injectable({ providedIn: 'root' })\nexport class DateFromNowPipe implements PipeTransform {\n  constructor(private dateAdapter: MomentDateAdapter) {}\n\n  transform(value: string | Moment, opts?: { withoutSuffix?: boolean }): string | Promise<string> {\n    const date: Moment = isMoment(value) ? (value as Moment) : this.dateAdapter.parse(value, DATE_ISO_PATTERN);\n    return date ? date.fromNow(opts?.withoutSuffix) : '';\n  }\n}\n","export interface FocusableElement {\n  focus();\n}\n\nexport function isFocusableElement(object: any): object is FocusableElement {\n  if (!object) return false;\n  return 'focus' in object;\n}\n","import { ElementRef, QueryList } from '@angular/core';\nimport { FocusableElement, isFocusableElement } from './focusable';\nimport { isNil, isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrBlank, toBoolean, toNumber } from './functions';\n\nexport function selectInputContentFromEvent(event: Event): boolean {\n  if (!event || event.defaultPrevented) return false;\n  return selectInputContent(event.target as HTMLInputElement);\n}\n\nexport function selectInputContent(input: HTMLInputElement | HTMLTextAreaElement | any): boolean {\n  // Detect deprecated usage (before 18.2.21)\n  if (input?.target || input instanceof Event) {\n    console.warn('DEPRECATED usage since 18.2.21 - Please use selectInputContentFromEvent() instead selectInputContent()');\n    input = input.target;\n  }\n  if (!input) return true;\n\n  // Nothing to select\n  if (isNilOrBlank(input.value)) return false;\n\n  if (typeof input.selectRange === 'function') {\n    try {\n      input.selectRange(input.value.length, 0);\n      return true;\n    } catch (err) {\n      console.error('Could not select input content, using selectRange()', err);\n      return false;\n    }\n  }\n\n  if (input && typeof input.select === 'function') {\n    try {\n      input.select();\n      return true;\n    } catch (err) {\n      console.error('Could not select input content, using select()', err);\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function selectInputRange(\n  input: HTMLInputElement | HTMLTextAreaElement,\n  startIndex: number,\n  endIndex?: number,\n  direction?: 'backward' | 'forward' | 'none'\n) {\n  if (input && typeof input.setSelectionRange === 'function') {\n    // No content\n    if (isNilOrBlank(input.value)) return false;\n\n    try {\n      input.setSelectionRange(startIndex, endIndex ?? startIndex, direction);\n    } catch (err) {\n      console.error('Could not select input range', err);\n      return false;\n    }\n  }\n  return true;\n}\n\nexport function getCaretPosition(input: any): number {\n  if (input && input.selectionStart != null) {\n    return input.selectionDirection ? (input.selectionDirection === 'backward' ? input.selectionStart : input.selectionEnd) : input.selectionStart;\n  }\n  return -1;\n}\n\nexport function moveInputCaretToSeparator(event: KeyboardEvent, separator: string, forward?: boolean) {\n  if (event.defaultPrevented || !separator) return false;\n  const input = event.target as any;\n  if (!input) return true;\n\n  const caretPosition = getCaretPosition(input);\n\n  // DEBUG\n  //console.debug('caretPosition=', caretPosition);\n\n  if (caretPosition === -1) return true; // Caret pos not found: skip\n\n  // Get input value\n  const value = input.value as string;\n\n  // No content: skip\n  if (isNilOrBlank(value)) return false;\n\n  try {\n    if (value && caretPosition <= value.length) {\n      // DEBUG\n      //console.debug(\"Input text value: \", value);\n      //console.debug(\"Cursor at: \", caretPosition);\n      //console.debug(\"Text after cursor: \", value.substring(caretPosition));\n\n      forward = forward !== false;\n\n      const separatorIndex = forward ? value.indexOf(separator, caretPosition) : value.lastIndexOf(separator, caretPosition);\n      if (separatorIndex !== -1 && ((forward && separatorIndex + 1 < value.length) || (!forward && separatorIndex > 0))) {\n        if (input.setSelectionRange) {\n          // Move after the next separator\n          if (selectInputRange(input, separatorIndex + (forward ? 1 : -1))) {\n            // Stop the keyboard event\n            event.preventDefault();\n            event.stopPropagation();\n          }\n        }\n      }\n    }\n  } catch (err) {\n    console.error('Could not move caret to next separator', err);\n    return false;\n  }\n  return true;\n}\n\nexport function filterNumberInput(event: KeyboardEvent, allowDecimals: boolean, decimalSeparator?: string) {\n  //input number entered or one of the 4 direction up, down, left and right\n  if ((event.which >= 48 && event.which <= 57) || (event.which >= 37 && event.which <= 40)) {\n    //console.debug('input number entered :' + event.which + ' ' + event.keyCode + ' ' + event.charCode);\n    // OK\n  }\n  // Decimal separator\n  else if (\n    allowDecimals &&\n    ((!decimalSeparator && (event.key === '.' || event.key === ',')) || (decimalSeparator && event.key === decimalSeparator))\n  ) {\n    //console.debug('input decimal separator entered :' + event.code);\n    // OK\n  } else {\n    //input command entered of delete, backspace or one of the 4 direction up, down, left and right, or negative sign\n    if ((event.keyCode >= 37 && event.keyCode <= 40) || event.keyCode === 46 || event.which === 8 || event.keyCode === 9 || event.keyCode === 45) {\n      //console.debug('input command entered :' + event.which + ' ' + event.keyCode + ' ' + event.charCode);\n      // OK\n    }\n    // Cancel other keyboard events\n    else {\n      //console.debug('input not number entered :' + event.which + ' ' + event.keyCode + ' ' + event.charCode + ' ' + event.code );\n      event.preventDefault();\n    }\n  }\n}\n\nexport function focusInput<T = any>(element: ElementRef<T>) {\n  const inputElement = asInputElement(element);\n  if (inputElement) inputElement.focus();\n  else {\n    console.warn('Trying to focus on this element:', element);\n  }\n}\n\nexport function setTabIndex<T = any>(element: ElementRef<T>, tabIndex: number) {\n  if (isInputElement(element)) {\n    element.tabindex = tabIndex;\n  } else if (element && isInputElement(element.nativeElement)) {\n    element.nativeElement.tabIndex = tabIndex;\n  } else {\n    console.warn('Trying to change tabindex on this element:', element);\n  }\n}\n\nexport interface InputElement extends FocusableElement {\n  tabindex?: number;\n  tabIndex?: number;\n  hidden?: boolean;\n  disabled?: boolean;\n  readonly?: boolean;\n  value: any;\n}\nexport function isInputElement(object: any): object is InputElement {\n  return (\n    isFocusableElement(object) &&\n    ('value' in object ||\n      // has value is not always set (neither tabindex) check on 2 properties with a logical OR\n      'tabindex' in object ||\n      'tabIndex' in object)\n  );\n}\n\nexport function asInputElement<T = any>(object: ElementRef<T>): InputElement | undefined {\n  if (object) {\n    if (isInputElement(object)) return object;\n    if (object.nativeElement && isInputElement(object.nativeElement)) return object.nativeElement;\n  }\n  return undefined;\n}\n\nexport function tabindexComparator(a: InputElement, b: InputElement) {\n  const valueA = a.tabindex || a.tabIndex;\n  const valueB = b.tabindex || b.tabIndex;\n  return valueA === valueB ? 0 : valueA > valueB ? 1 : -1;\n}\n\nexport interface CanGainFocusOptions {\n  minTabindex?: number;\n  maxTabindex?: number;\n  isEmpty?: boolean;\n  isNotEmpty?: boolean;\n}\n\nexport interface GetFocusableInputOptions extends CanGainFocusOptions {\n  sortByTabIndex?: boolean;\n  debug?: boolean;\n}\n\nexport function canHaveFocus(input: InputElement, opts?: CanGainFocusOptions): boolean {\n  if (!input) return false;\n  if (opts?.isEmpty && opts.isNotEmpty)\n    throw new Error('Cannot use both options onlyEmptyInput and onlyNotEmptyInput at the same time. Please use only one of them.');\n  return (\n    // Exclude disabled element\n    !toBoolean(input.disabled, false) &&\n    // Exclude readonly element\n    !toBoolean(input.readonly, false) &&\n    // Exclude hidden element\n    !toBoolean(input.hidden, false) &&\n    // Exclude minTabIndex < element.tabIndex\n    (isNil(opts?.minTabindex) || toNumber(input.tabIndex, input.tabindex) > opts.minTabindex) &&\n    // Exclude maxTabIndex > element.tabIndex\n    (isNil(opts?.maxTabindex) || toNumber(input.tabIndex, input.tabindex) < opts.maxTabindex) &&\n    // Exclude not nil input value\n    (!opts?.isEmpty || isNilOrBlank(input.value)) &&\n    // Exclude nil input value\n    (!opts?.isNotEmpty || isNotNilOrBlank(input.value))\n  );\n}\n\nexport function getFocusableInputElements(elements: QueryList<ElementRef>, opts?: GetFocusableInputOptions): InputElement[] {\n  opts = { sortByTabIndex: false, ...opts };\n\n  // Focus to first input\n  const filteredElements: InputElement[] = elements\n\n    // Transform to input\n    .map(asInputElement)\n\n    .filter((input) => {\n      const included = canHaveFocus(input, opts);\n      // DEBUG\n      if (input && opts.debug)\n        console.debug(`[inputs] Focusable input {canFocus: ${included}, tabIndex: ${input.tabIndex || input.tabindex}}`, input);\n      return included;\n    });\n\n  // Sort by tabIndex\n  if (opts.sortByTabIndex) {\n    return filteredElements.sort(tabindexComparator);\n  }\n\n  return filteredElements;\n}\n\nexport function focusNextInput<T = any>(event: Event | undefined, elements: QueryList<ElementRef<T>>,\n                                        opts?: GetFocusableInputOptions): boolean {\n  // Cancelling event (e.g. when emitted by (keydown.tab) )\n  if (event) {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  // Get current index\n  const minTabindex = event && isInputElement(event.target) ? (event.target.tabIndex ?? event.target.tabindex) : undefined;\n\n  // Get focusable input elements\n  const focusableInputs: InputElement[] = getFocusableInputElements(elements, { minTabindex, ...opts });\n\n  if (isNotEmptyArray(focusableInputs)) {\n    // Focus on first inputs\n    focusableInputs[0].focus();\n    return true;\n  }\n\n  return false;\n}\n\nexport function focusPreviousInput<T = any>(event: Event | undefined, elements: QueryList<ElementRef<T>>, opts?: GetFocusableInputOptions): boolean {\n  // Cancelling event (e.g. when emitted by (keydown.tab) )\n  if (event) {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  // Get current index\n  const maxTabindex = event && isInputElement(event.target) ? event.target.tabIndex || event.target.tabindex : undefined;\n\n  // Get focusable input elements\n  const focusableInputs: InputElement[] = getFocusableInputElements(elements, { maxTabindex, ...opts });\n\n  if (isNotEmptyArray(focusableInputs)) {\n    // Focus on last inputs\n    focusableInputs[focusableInputs.length - 1].focus();\n    return true;\n  }\n\n  return false;\n}\n\nexport function getInputSelectionRangesFromMask(mask: (string | RegExp)[]): number[][] {\n  const result = [];\n  let first_index: number;\n  let last_index: number;\n  for (let i = 0; i < mask.length; i++) {\n    if (i === 0 && mask[i].toString() === '/[+-]/') {\n      // DEBUG\n      //console.debug('TODO push start mask', { i, mask: mask[i].toString() });\n\n      result.push([0, 0]);\n    } else if (mask[i] instanceof RegExp) {\n      if (isNil(first_index)) {\n        first_index = i;\n      }\n    } else {\n      if (isNotNil(first_index)) {\n        last_index = i - 1;\n        result.push([first_index, last_index]);\n        first_index = null;\n        last_index = null;\n      }\n    }\n  }\n  if (mask[mask.length - 1] instanceof RegExp) {\n    last_index = mask.length - 1;\n    result.push([first_index, last_index]);\n  }\n  return result;\n}\n\nexport function getInputRangeFromCaretIndex(caretIndex: number, inputRanges: number[][]): number[] {\n  for (const inputRange of inputRanges) {\n    if (caretIndex >= inputRange[0] && caretIndex <= inputRange[1] + 1) {\n      return inputRange;\n    }\n  }\n  return null;\n}\n","import {\n  DEFAULT_PLACEHOLDER_CHAR,\n  EMPTY_PLACEHOLDER_CHAR,\n  EMPTY_PLACEHOLDER_CHAR_REGEXP_GLOBAL,\n  PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL,\n  SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL,\n} from '../../constants';\nimport { getInputSelectionRangesFromMask } from '../../inputs';\nimport { isNil } from '../../functions';\n\nexport type LatLongType = 'latitude' | 'longitude';\nexport type LatLongPattern = 'DDMMSS' | 'DDMM' | 'DD';\nexport const LAT_LONG_PATTERNS: LatLongPattern[] = ['DDMMSS', 'DDMM', 'DD'];\n\nconst D = /\\d|\\s/;\nconst D5 = /[0-5]|\\s/;\nconst M = D;\nconst M5 = D5;\nconst S = D;\nconst S5 = D5;\nconst SIGN = /[+-]/;\n\nexport type LatLongSign = '+' | '-';\nexport type LatLongSignValue = 1 | -1;\n\nexport interface ILatLongData {\n  degrees: number;\n  minutes: number;\n  seconds: number;\n  sign: LatLongSignValue;\n}\n\nexport const MASKS = {\n  latitude: {\n    DDMMSS: [D, D, '°', ' ', M5, M, \"'\", ' ', S5, S, '.', S, S, '\"'],\n    DDMM: [D, D, '°', ' ', M5, M, '.', M, M, M, \"'\"],\n    DD: [SIGN, ' ', D, D, '.', D, D, D, D, D, D, D, '°'],\n  },\n  longitude: {\n    DDMMSS: [D, D, D, '°', ' ', M5, M, \"'\", ' ', S5, S, '.', S, S, '\"'],\n    DDMM: [D, D, D, '°', ' ', M5, M, '.', M, M, M, \"'\"],\n    DD: [SIGN, D, D, D, '.', D, D, D, D, D, D, D, '°'],\n  },\n};\nexport const MASK_RANGES = {\n  latitude: {\n    DDMMSS: getInputSelectionRangesFromMask(MASKS.latitude.DDMMSS),\n    DDMM: getInputSelectionRangesFromMask(MASKS.latitude.DDMM),\n    DD: getInputSelectionRangesFromMask(MASKS.latitude.DD),\n  },\n  longitude: {\n    DDMMSS: getInputSelectionRangesFromMask(MASKS.longitude.DDMMSS),\n    DDMM: getInputSelectionRangesFromMask(MASKS.longitude.DDMM),\n    DD: getInputSelectionRangesFromMask(MASKS.longitude.DD),\n  },\n};\n\nexport declare class LatLongFormatOptions {\n  pattern: LatLongPattern;\n  maxDecimals?: number;\n  placeholderChar?: string;\n  hideSign?: boolean;\n  fixLatLong?: boolean;\n}\n\nexport const LAT_LONG_PATTERN_MAX_DECIMALS = 3;\nexport const LAT_LONG_VALUE_MAX_DECIMALS = 7;\n\nconst DEFAULT_OPTIONS = <LatLongFormatOptions>{\n  pattern: 'DDMM',\n  maxDecimals: LAT_LONG_PATTERN_MAX_DECIMALS,\n  placeholderChar: DEFAULT_PLACEHOLDER_CHAR,\n};\nconst DEFAULT_LATITUDE_OPTIONS: LatLongFormatOptions & { longitude: boolean } = {\n  ...DEFAULT_OPTIONS,\n  longitude: false,\n};\nconst DEFAULT_LONGITUDE_OPTIONS: LatLongFormatOptions & { longitude: boolean } = {\n  ...DEFAULT_OPTIONS,\n  longitude: true,\n};\n\nexport function computeDecimalPart(value: number, nbOfDecimals: number): number {\n  return value * 10 ** (nbOfDecimals * -1);\n}\n\nexport function formatLatLong(value: number, type: LatLongType, opts?: Partial<LatLongFormatOptions>) {\n  switch (type) {\n    case 'latitude':\n      return formatLatitude(value, opts);\n    case 'longitude':\n      return formatLongitude(value, opts);\n  }\n}\n\nexport function formatLatitude(value: number | null, opts?: Partial<LatLongFormatOptions>): string {\n  if (value === undefined || value === null) return null;\n\n  const finalOpts = {\n    ...DEFAULT_LATITUDE_OPTIONS,\n    fixLatLong: true,\n    ...opts,\n  };\n\n  let fieldsValues: any[];\n  switch (opts.pattern) {\n    case 'DDMMSS':\n      fieldsValues = splitDegreesToDDMMSSArray(value, finalOpts);\n      break;\n    case 'DDMM':\n      fieldsValues = splitDegreesToDDMMArray(value, finalOpts);\n      break;\n    default: // DD is the default\n      fieldsValues = splitDegreesToDDArray(value, finalOpts);\n  }\n\n  return fieldsValues.length > 0 ? formatFieldsArrayToString(fieldsValues, finalOpts) : '';\n}\n\nexport function formatLongitude(value: number | null, opts?: Partial<LatLongFormatOptions>): string {\n  if (value === undefined || value === null) return null;\n\n  const finalOpts = {\n    ...DEFAULT_LONGITUDE_OPTIONS,\n    fixLatLong: true,\n    ...opts,\n  };\n\n  let parts: any[];\n  switch (opts.pattern) {\n    case 'DDMMSS':\n      parts = splitDegreesToDDMMSSArray(value, finalOpts);\n      break;\n    case 'DDMM':\n      parts = splitDegreesToDDMMArray(value, finalOpts);\n      break;\n    default: // DD is the default\n      parts = splitDegreesToDDArray(value, finalOpts);\n  }\n\n  return parts.length > 0 ? formatFieldsArrayToString(parts, finalOpts) : '';\n}\n\nexport function splitDegreesToDDArray(value: number, opts: LatLongFormatOptions & { longitude: boolean }): (number | string)[] {\n  const negative = value < 0;\n  if (negative) value *= -1;\n\n  if (opts.fixLatLong) {\n    value = fixValue(value, opts.longitude);\n  }\n\n  const sign = negative ? '-' : '+';\n  const degreesFields = roundFloat(value, opts.maxDecimals).toString().split('.');\n  const degrees = parseInt(degreesFields[0]);\n  if (degreesFields.length > 1) {\n    const degreesTeens = parseInt(degreesFields[1]) * 10 ** (opts.maxDecimals - degreesFields[1].length);\n    return [sign, degrees, degreesTeens];\n  } else {\n    if (degreesFields[0] === `1e-${opts.maxDecimals}`) {\n      return [sign, 0, 1 / (parseFloat(degreesFields[0]) * 10 ** opts.maxDecimals)];\n    } else {\n      return [sign, degrees];\n    }\n  }\n}\n\nexport function splitDegreesToDDMMArray(value: number, opts: LatLongFormatOptions & { longitude: boolean }): number[] {\n  const negative = value < 0;\n  value = Math.abs(value);\n\n  if (opts.fixLatLong) {\n    value = fixValue(value, opts.longitude);\n  }\n\n  let degrees: number = (negative ? -1 : 1) * Math.trunc(value);\n  const minutesFields = roundFloat((value - degrees) * 60, opts.maxDecimals)\n    .toString()\n    .split('.');\n\n  let minutes = parseInt(minutesFields[0]);\n  let minutesTeens: number;\n  if (minutesFields.length > 1) {\n    minutesTeens = parseInt(minutesFields[1]);\n    if (minutesFields[1].length === 1) minutesTeens *= 100;\n    else if (minutesFields[1].length === 2) minutesTeens *= 10;\n  } else {\n    minutesTeens = 0;\n  }\n\n  while (minutes >= 60) {\n    minutes -= 60;\n    degrees += 1;\n  }\n\n  // The reduce remove all right zeros\n  const result = [minutesTeens, minutes, degrees]\n    .reduce((acc, val) => {\n      if (acc.length > 0 || val > 0) {\n        acc.push(val);\n      }\n      return acc;\n    }, [])\n    .reverse();\n\n  // Re-add sign on degrees\n  if (negative) result[0] = -1 * result[0];\n\n  return result;\n}\n\nexport function splitDegreesToDDMMSSArray(value: number, opts: LatLongFormatOptions & { longitude: boolean }): number[] {\n  const negative = value < 0;\n  value = Math.abs(value);\n\n  if (opts.fixLatLong) {\n    value = fixValue(value, opts.longitude);\n  }\n\n  let degrees: number = Math.trunc(value);\n  let minutes: number | string = Math.trunc((value - degrees) * 60);\n  const secondFields: string[] = roundFloat(((value - degrees) * 60 - minutes) * 60, opts.maxDecimals)\n    .toString()\n    .split('.');\n  let seconds: number = parseInt(secondFields[0]);\n  const miliseconds: number = secondFields.length > 1 ? parseInt(secondFields[1]) * (secondFields[1].length === 1 ? 10 : 1) : 0;\n\n  while (seconds >= 60) {\n    seconds -= 60;\n    minutes += 1;\n  }\n  while (minutes >= 60) {\n    minutes -= 60;\n    degrees += 1;\n  }\n\n  // The reduce remove all right zeros\n  const result = [miliseconds, seconds, minutes, degrees]\n    .reduce((acc, val) => {\n      if (acc.length > 0 || val > 0) {\n        acc.push(val);\n      }\n      return acc;\n    }, [])\n    .reverse();\n\n  // Re-add sign on degrees\n  if (negative) result[0] = -1 * result[0];\n\n  return result;\n}\n\nfunction fixValue(value: number, longitude: boolean) {\n  // Fix longitude when outside [-180, 180]\n  if (longitude && (value > 180 || value < -180)) {\n    value %= 180;\n  }\n  // Fix latitude when outside [-90, 90]\n  else if (!longitude && (value > 90 || value < -90)) {\n    value %= 90;\n  }\n  return value;\n}\n\nfunction formatFieldsArrayToString(values: (string | number)[], opts: LatLongFormatOptions & { longitude: boolean }): string {\n  const pattern = opts.pattern || 'DD';\n  const mask = MASKS[opts.longitude ? 'longitude' : 'latitude'][pattern];\n  const inputSelectionRanges = MASK_RANGES[opts.longitude ? 'longitude' : 'latitude'][pattern];\n\n  const negative = values[0].toString().slice(0, 1) === '-';\n  if (typeof values[0] === 'number') {\n    // Normalize degrees to be OK when convert to string\n    values[0] = Math.abs(values[0]);\n  }\n\n  let result = '';\n  const placeholderChar = opts.placeholderChar;\n  inputSelectionRanges.forEach((range, idx) => {\n    // \"start\" and \"end\" are used to get symbol chars from mask placeholder\n    // (between valuables characters)\n    const last = idx === inputSelectionRanges.length - 1;\n    const start = range[1] + 1;\n    const end = last ? mask.length : inputSelectionRanges[idx + 1][0];\n    const size = range[1] - range[0] + 1;\n    const symbol = mask.slice(start, end).join('');\n    if (idx < values.length) {\n      let value = values[idx].toString();\n      value = value.padStart(size, last ? '0' : placeholderChar);\n      if (last && placeholderChar === '') {\n        value = value.replace(/0*$/, placeholderChar);\n      }\n      result += value + symbol;\n    } else {\n      // '' as fillChar = don't fill\n      if (placeholderChar !== '') {\n        const value = ''.toString().padStart(size, placeholderChar);\n        result += value + symbol;\n      }\n      // Avoid last char dot, replace it with real last symbol\n      // 01.00\" ->\n      //      OK:  1\"\n      //      KO:  1.\n      if (last && result.slice(-1) === '.') {\n        result = result.slice(0, -1);\n        if (symbol) {\n          result += symbol;\n        }\n      }\n    }\n  });\n\n  let sign = '';\n  if (!opts?.hideSign && opts.pattern !== 'DD') {\n    if (opts.longitude) {\n      sign = negative ? ' W' : ' E';\n    } else {\n      sign = negative ? ' S' : ' N';\n    }\n  } else if (opts.hideSign && opts.pattern === 'DD') {\n    result = result.replace(/^\\+/, ' ');\n  }\n\n  return result + sign;\n}\n\n// 36°57'9\" N  = 36.9525000\n// 10°4'21\" W = -10.0725000\nexport function parseLatitudeOrLongitude(input: string, pattern: string, maxDecimals?: number, placeholderChar?: string): number | null {\n  placeholderChar = placeholderChar || DEFAULT_PLACEHOLDER_CHAR;\n  let inputFix = input.trim();\n  if (placeholderChar === EMPTY_PLACEHOLDER_CHAR) {\n    inputFix = inputFix\n      // Replace empty char placeholder\n      .replace(EMPTY_PLACEHOLDER_CHAR_REGEXP_GLOBAL, '')\n      // Remove space and '+' (= trim on each parts)\n      .replace(SPACE_PLACEHOLDER_CHAR_REGEXP_GLOBAL, '')\n      .replace(PLUS_PLACEHOLDER_CHAR_REGEXP_GLOBAL, '');\n  }\n  // Remove all placeholder (= trim on each parts)\n  else {\n    inputFix = inputFix.replace(new RegExp(`[ +${placeholderChar}]+`, 'g'), '');\n  }\n\n  //DEBUG console.debug(\"Parsing lat= \" + inputFix);\n  const parts = inputFix.split(/[^-\\d\\w.,]+/);\n  let degrees = parseFloat(parts[0].replace(/,/g, '.'));\n  if (isNaN(degrees)) {\n    console.debug('parseLatitudeOrLongitude ' + input + ' -> Invalid degrees (NaN). Parts found:', parts);\n    return NaN;\n  }\n\n  if (pattern === 'DD') {\n    return roundFloat(degrees, maxDecimals);\n  }\n\n  const minutes = ((pattern === 'DDMMSS' || pattern === 'DDMM') && parts[1] && parseFloat(parts[1].replace(/,/g, '.'))) || 0;\n  const seconds = (pattern === 'DDMMSS' && parts[2] && parseFloat(parts[2].replace(/,/g, '.'))) || 0;\n  const direction = (pattern === 'DDMMSS' && parts[3]) || (pattern === 'DDMM' && parts[2]) || undefined;\n  const sign = direction && (direction === 's' || direction === 'S' || direction === 'w' || direction === 'W') ? -1 : 1;\n\n  return computeDecimalDegrees(degrees, minutes, seconds, sign, maxDecimals);\n}\n\nexport function computeDecimalDegrees(degrees: number, minutes: number, seconds: number, sign: -1 | 1, maxDecimals?: number) {\n  if (isNil(degrees)) return null;\n  degrees = (sign || 1) * (degrees + (minutes || 0) / 60 + (seconds || 0) / (60 * 60));\n  return roundFloat(degrees, maxDecimals);\n}\n\nfunction roundFloat(input: number, maxDecimals?: number): number {\n  if (maxDecimals !== undefined && maxDecimals >= 0) {\n    // Utilisation de toFixed pour gérer les problèmes de précision\n    const str = input.toFixed(maxDecimals);\n    return parseFloat(str);\n  }\n  return input;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { formatLatitude, formatLongitude, LatLongFormatOptions } from '../material/latlong/latlong.utils';\n\n@Pipe({\n  name: 'latitudeFormat',\n})\nexport class LatitudeFormatPipe implements PipeTransform {\n  transform = formatLatitude;\n}\n\n@Pipe({\n  name: 'longitudeFormat',\n})\nexport class LongitudeFormatPipe implements PipeTransform {\n  transform = formatLongitude;\n}\n\n@Pipe({\n  name: 'latLongFormat',\n})\n/**\n * @deprecated use 'latitudeFormat' or 'longitudeFormat' instead\n */\nexport class LatLongFormatPipe implements PipeTransform {\n  transform(value: number, opts?: Partial<LatLongFormatOptions> & { type: 'latitude' | 'longitude' }): string | Promise<string> {\n    return (!opts || opts?.type === 'latitude' ? formatLatitude : formatLongitude)(value, opts);\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { numberToString } from '../functions';\n\n@Pipe({\n  name: 'numberFormat',\n})\nexport class NumberFormatPipe implements PipeTransform {\n  transform(val: number, opts?: Intl.NumberFormatOptions & { fixedDecimals?: number }): string | Promise<string> {\n    return numberToString(val, opts);\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { removeDiacritics, toBoolean } from '../functions';\nimport { RegExpUtils } from '../regexps';\n\n@Pipe({\n  name: 'highlight',\n})\n@Injectable({ providedIn: 'root' })\nexport class HighlightPipe implements PipeTransform {\n  // Replace search text by bold representation\n  transform(value: any, args?: string | { search: string; withAccent?: boolean }): string {\n    if (typeof value !== 'string' || !args) return value;\n    let searchText = typeof args === 'string' ? args : args.search;\n    const withAccent = typeof args !== 'string' ? toBoolean(args?.withAccent, false) : false;\n\n    // Skip if :\n    // - not a string (e.g. an object)\n    // - or blank string\n    if (typeof searchText !== 'string') return value;\n\n    // Remove unnecessary wildcard (e.g. 'a**' becomes 'a')\n    searchText = RegExpUtils.cleanSearchText(searchText);\n    if (!searchText?.length) return value;\n\n    if (withAccent) {\n      // Remove all accent characters to allow versatile comparison\n      const cleanedSearchText = removeDiacritics(searchText.toUpperCase());\n      const cleanValue = removeDiacritics(value.toUpperCase());\n      const startIndex = cleanValue.indexOf(cleanedSearchText);\n      if (startIndex === -1) return value; // no match\n      const endIndex = startIndex + cleanedSearchText.length;\n      return value.substring(0, startIndex) + '<b>' + value.substring(startIndex, endIndex) + '</b>' + value.substring(endIndex);\n    }\n\n    // Default behaviour, using regexp\n    else {\n      const regexp = RegExpUtils.compileSearchRegexp(searchText, 'i');\n      return value.replace(regexp, '<b>$&</b>');\n    }\n  }\n}\n","/**\n * @license\n * Copyright (c) 2019 Jonathan Catmull.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nimport { Pipe, PipeTransform } from '@angular/core';\n\n/*\n * Convert bytes into largest possible unit.\n * Takes an precision argument that defaults to 2.\n * Usage:\n *   bytes | fileSize:precision\n * Example:\n *   {{ 1024 |  fileSize}}\n *   formats to: 1 KB\n */\n@Pipe({ name: 'fileSize' })\nexport class FileSizePipe implements PipeTransform {\n  private units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n  transform(bytes: number = 0, precision: number = 2): string {\n    if (isNaN(parseFloat(String(bytes))) || !isFinite(bytes)) return '?';\n\n    let unit = 0;\n\n    while (bytes >= 1024) {\n      bytes /= 1024;\n      unit++;\n    }\n\n    return bytes.toFixed(+precision) + ' ' + this.units[unit];\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { DateUtils } from '../dates';\nimport { unitOfTime } from 'moment';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Pipe({\n  name: 'duration',\n})\n@Injectable({ providedIn: 'root' })\nexport class DurationPipe implements PipeTransform {\n  protected dayUnit: string;\n\n  constructor(translate: TranslateService) {\n    this.dayUnit = translate.instant('COMMON.DAY_UNIT');\n  }\n\n  /**\n   * Format a diff between two dates.\n   *\n   * @param value\n   * @param opts\n   * @param opts.unit allow to convert into a particular unit. If not defined, result will be like `x days HH:MM`\n   * @param opts.seconds Should display or ignore the seconds ?\n   **/\n  transform(value: number, opts?: unitOfTime.DurationConstructor | { unit?: unitOfTime.DurationConstructor; seconds?: boolean } | any): string {\n    return DateUtils.durationToString(value, this.dayUnit, opts);\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { round } from '../functions';\n\n@Pipe({\n  name: 'mathAbs',\n})\n@Injectable({ providedIn: 'root' })\nexport class MathAbsPipe implements PipeTransform {\n  transform(val: number): any {\n    if (val !== undefined && val !== null) {\n      return Math.abs(val);\n    } else {\n      return val;\n    }\n  }\n}\n\n@Pipe({\n  name: 'even',\n})\n@Injectable({ providedIn: 'root' })\nexport class EvenPipe implements PipeTransform {\n  transform(val: number): any {\n    return val % 2 === 0;\n  }\n}\n\n@Pipe({\n  name: 'odd',\n})\n@Injectable({ providedIn: 'root' })\nexport class OddPipe implements PipeTransform {\n  transform(val: number): any {\n    return val % 2 !== 0;\n  }\n}\n\n@Pipe({\n  name: 'round',\n})\n@Injectable({ providedIn: 'root' })\nexport class RoundPipe implements PipeTransform {\n  transform(val: number, nbDecimal?: number): any {\n    return round(val, nbDecimal);\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport {\n  arrayDistinct,\n  getPropertyByPath,\n  isNotNil,\n  propertiesPathComparator,\n  propertyPathComparator,\n  splitArrayInChunks\n} from '../functions';\nimport { CompareFn } from '../types';\n\n@Pipe({\n  name: 'isNotEmptyArray',\n})\nexport class NotEmptyArrayPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[]): boolean {\n    if (!Array.isArray(val)) return false;\n    return val.length > 0;\n  }\n}\n\n@Pipe({\n  name: 'isEmptyArray',\n})\nexport class EmptyArrayPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[]): boolean {\n    if (!Array.isArray(val)) return true;\n    return val.length === 0;\n  }\n}\n\n@Pipe({\n  name: 'isArrayLength',\n})\nexport class ArrayLengthPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[], args?: { greaterThan?: number; equals?: number; lessThan?: number }): boolean {\n    args = args || {};\n    const size = !Array.isArray(val) ? 0 : val.length;\n    if (isNotNil(args.lessThan)) {\n      return size < args.lessThan;\n    }\n    if (isNotNil(args.greaterThan)) {\n      return size > args.greaterThan;\n    }\n    if (isNotNil(args.equals)) {\n      return size === args.equals;\n    }\n    return false;\n  }\n}\n\n@Pipe({\n  name: 'arrayFirst',\n})\nexport class ArrayFirstPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[]): T | null {\n    if (!Array.isArray(val)) return null;\n    return val.length > 0 ? val[0] : null;\n  }\n}\n\n@Pipe({\n  name: 'arrayLast',\n})\nexport class ArrayLastPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[]): T | null {\n    if (!Array.isArray(val)) return null;\n    return val.length > 0 ? val[val.length - 1] : null;\n  }\n}\n\n@Pipe({\n  name: 'arrayPluck',\n})\nexport class ArrayPluckPipe implements PipeTransform {\n  /**\n   *\n   * @param val\n   * @param opts property to get, or options\n   */\n  transform<T = any>(\n    val: unknown | T[],\n    opts:\n      | string\n      | string[]\n      | {\n          property: string | string[];\n          omitNil?: boolean;\n        }\n  ): any[] {\n    if (!Array.isArray(val) || !opts) return null;\n    const property = typeof opts === 'string' || Array.isArray(opts) ? (opts as string | string[]) : opts.property;\n    return opts['omitNil'] !== true\n      ? val.map((value) => getPropertyByPath(value, property))\n      : val.map((value) => getPropertyByPath(value, property)).filter(isNotNil);\n  }\n}\n\n@Pipe({\n  name: 'arrayIncludes',\n})\nexport class ArrayIncludesPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[], searchElement: T, fromIndex?: number): boolean {\n    if (!Array.isArray(val)) return false;\n    return (val && val.includes(searchElement, fromIndex)) || false;\n  }\n}\n\n@Pipe({\n  name: 'arrayFilter',\n})\nexport class ArrayFilterPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[], filterFn: (T, ...args: any[]) => boolean, ...otherArguments: any[]): T[] | null {\n    if (!Array.isArray(val)) return null;\n    return val.filter((v) => filterFn.call(this, v, ...otherArguments));\n  }\n}\n\n@Pipe({\n  name: 'arraySort',\n})\nexport class ArraySortPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[], propertyOrCompareFn: string | string[] | CompareFn<T>): T[] | null {\n    if (!propertyOrCompareFn) throw new Error('propertyOrCompareFn is required');\n    if (!Array.isArray(val)) return null;\n    const compareFn = typeof propertyOrCompareFn === 'function' ? propertyOrCompareFn :\n      (typeof propertyOrCompareFn === 'string' ? propertyPathComparator(propertyOrCompareFn) : propertiesPathComparator(propertyOrCompareFn));\n    return val.sort(compareFn);\n  }\n}\n\n@Pipe({\n  name: 'arrayFindByProperty',\n})\nexport class ArrayFindByPropertyPipe implements PipeTransform {\n  transform<T = any>(items: unknown | T[], property: string | Array<string | number>, findValue: any): T | null {\n    if (!Array.isArray(items)) return null;\n\n    return items.find((item) => {\n      return getPropertyByPath(item, property) == findValue;\n    });\n  }\n}\n\n@Pipe({\n  name: 'arrayJoin',\n})\nexport class ArrayJoinPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[], separator: string): string {\n    if (!Array.isArray(val)) return '';\n    return val.join(separator) || '';\n  }\n}\n\n@Pipe({\n  name: 'arrayDistinct',\n})\nexport class ArrayDistinctPipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[], opts?: string | { property: string; omitNil?: boolean }): any[] {\n    if (!Array.isArray(val)) return null;\n    const property = typeof opts === 'string' ? (opts as string) : opts?.property;\n    return opts?.['omitNil'] !== true ? arrayDistinct(val, property) : arrayDistinct(val, property).filter(isNotNil);\n  }\n}\n\n@Pipe({\n  name: 'splitArrayInChunks',\n})\nexport class SplitArrayInChunksPipe implements PipeTransform {\n  transform<T = any>(value: T[], chunkSize: number): T[][] {\n    return splitArrayInChunks<T>(value, chunkSize);\n  }\n}\n\n@Pipe({\n  name: 'arrayMap',\n})\nexport class ArrayMapPipe implements PipeTransform {\n  transform<T, R>(val: unknown | T[], mapFn: (value: T, ...args: any[]) => R, ...otherArguments: any[]): R[] | null {\n    if (!Array.isArray(val)) return null;\n    return val.map((v) => mapFn.call(this, v, ...otherArguments)) as R[];\n  }\n}\n\n@Pipe({\n  name: 'arraySlice',\n})\nexport class ArraySlicePipe implements PipeTransform {\n  transform<T = any>(val: unknown | T[], start?: number, end?: number): T[] | null {\n    if (!Array.isArray(val)) return null;\n    return val.slice(start, end);\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'mapGet',\n})\n@Injectable({ providedIn: 'root' })\nexport class MapGetPipe implements PipeTransform {\n  transform<T = any, R = any>(val: T, args: keyof T | string | number | { key: keyof T | string | number; defaultValue?: any }): R {\n    // No map: return default value (or undefined)\n    if (!val) return args && (args as any)?.defaultValue;\n\n    const key = (args && typeof args === 'object' ? args.key : args) as any;\n\n    // No key: return default value (or undefined)\n    if (key === null || key === undefined) return args && (args as any)?.defaultValue;\n\n    return val[key] as R;\n  }\n}\n\n@Pipe({\n  name: 'mapKeys',\n})\n@Injectable({ providedIn: 'root' })\nexport class MapKeysPipe implements PipeTransform {\n  transform(map: any, defaultValue?: any[]): any[] {\n    if (!map) return defaultValue;\n    return Object.keys(map);\n  }\n}\n\n@Pipe({\n  name: 'mapValues',\n})\n@Injectable({ providedIn: 'root' })\nexport class MapValuesPipe implements PipeTransform {\n  transform<K = any, V = any>(map: any | Map<K, V>, defaultValue?: V[]): V[] {\n    if (!map) return defaultValue;\n    return Object.values(map);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { map } from 'rxjs/operators';\nimport { Observable, of } from 'rxjs';\nimport { isNil, isNilOrBlank, isNotNilOrBlank } from '../functions';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslateContextService {\n  constructor(protected translate: TranslateService) {}\n\n  get(key: string | string[], context?: string, interpolateParams?: any): Observable<any> {\n    // No context: do a normal translate\n    if (!key || isNil(context)) return this.translate.get(key, interpolateParams);\n\n    if (Array.isArray(key)) {\n      if (!key.length) return of();\n      // Observe the first key, then add other\n      return this.get(key[0]).pipe(\n        map((translation) =>\n          key\n            .slice(1) // Skip 1, because we already have it\n            .reduce(\n              (map, k) => {\n                map[k] = this.instant(k, context);\n                return map;\n              },\n              // Init with the first value\n              {\n                [key[0]]: translation,\n              }\n            )\n        )\n      );\n    }\n\n    // Compute a contextual i18n key, using the context as suffix\n    const contextualKeys = this.contextualKeys(key, context);\n\n    // Return the contextual translation, or default of not exists\n    return this.translate.get(contextualKeys, interpolateParams).pipe(map((translations) => this.findFirstValid(contextualKeys, translations)));\n  }\n\n  instant(key: string | string[], context?: string, interpolateParams?: any): any {\n    // No context: do a normal translate\n    if (!key || isNilOrBlank(context)) return this.translate.instant(key, interpolateParams);\n\n    if (Array.isArray(key)) {\n      return key.reduce((map, k) => {\n        map[k] = this.instant(k, context);\n        return map;\n      }, {});\n    }\n\n    // Compute a contextual i18n key, using the context as suffix\n    const contextualKeys = this.contextualKeys(key, context);\n    const translations = this.translate.instant(contextualKeys, interpolateParams);\n\n    return this.findFirstValid(contextualKeys, translations);\n  }\n\n  /**\n   * Compute contextual i18n keys, using the context as suffix.<br>\n   * Suffix can be simple name (like 'aaa' - will return ['<key>.aaa']) or complexe (like 'aaa.bbb' - will return ['<key>.aaa.bbb', '<key>.aaa']\n   *\n   * @param key\n   * @param context\n   * @private\n   */\n  contextualKeys(key: string, context: string): string[] {\n    return context\n      .split('.')\n      .filter(isNotNilOrBlank)\n      .reduce((res, item) => {\n        const inheritedContext = res.length > 0 ? res[res.length - 1] + '.' : '';\n        return res.concat(inheritedContext + item);\n      }, [])\n      .reverse() // Start with children, ends with parent key\n      .map((contextItem) => this.contextualKey(key, contextItem))\n      .concat(key);\n  }\n\n  /**\n   * Compute a contextual i18n key, using the context as suffix\n   *\n   * @param key\n   * @param context\n   * @private\n   */\n  contextualKey(key: string, context: string): string {\n    // Append a dot on context if missing\n    if (!context.endsWith('.')) {\n      context = context + '.';\n    }\n\n    // Compute a contextual i18n key, using the context as suffix\n    const parts = key.split('.');\n    return parts.length === 1\n      ? `${context}${key}`\n      : parts\n          .slice(0, parts.length - 1)\n          .concat(context + parts[parts.length - 1])\n          .join('.');\n  }\n\n  private findFirstValid(keys: string[], translations: { [key: string]: string }): string {\n    // For eac contextual key: try to find translation, then use the first valid\n    for (const key of keys) {\n      if (translations[key] !== key) return translations[key];\n    }\n    return translations[keys[keys.length - 1]]; // Return the last keys translation\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { TranslateContextService } from '../services/translate-context.service';\nimport { changeCaseToUnderscore } from '../functions';\n\n@Injectable()\n@Pipe({\n  name: 'translateContext',\n})\nexport class TranslateContextPipe implements PipeTransform {\n  constructor(private translate: TranslateContextService) {}\n\n  transform(query: string, context?: string, interpolateParams?: any): string {\n    if (!query || !query.length) return query;\n    return this.translate.instant(query, context, interpolateParams);\n  }\n}\n\n@Pipe({\n  name: 'translatable',\n})\n@Injectable()\nexport class TranslatablePipe implements PipeTransform {\n  transform(value: string): string {\n    // transform a string to a i18n compatible string (ex: QualitativeValue -> QUALITATIVE_VALUE)\n    return changeCaseToUnderscore(value)?.toUpperCase();\n  }\n}\n","import { Directive, OnInit, Output, EventEmitter } from '@angular/core';\n\n@Directive({\n  selector: '[ngInit]',\n})\nexport class NgInitDirective implements OnInit {\n  @Output()\n  ngInit = new EventEmitter<any>();\n\n  ngOnInit() {\n    this.ngInit.emit();\n  }\n}\n","import { firstValueFrom, Observable, timer } from 'rxjs';\nimport { filter, first, map, switchMap, takeUntil } from 'rxjs/operators';\nimport { isNotNil } from './functions';\nimport { Predicate } from '@angular/core';\n\nexport declare interface FirstOptions {\n  timeout?: number;\n  stop?: Observable<any>;\n  stopError?: boolean | string | Error;\n}\n\nexport declare interface WaitForOptions extends FirstOptions {\n  dueTime?: number;\n  checkPeriod?: number;\n}\n\nexport function filterNotNil<T = any>(obs: Observable<T>): Observable<T> {\n  return obs.pipe(filter(isNotNil));\n}\n\nexport function filterTrue(obs: Observable<boolean>): Observable<boolean> {\n  return obs.pipe(filter((v) => v === true));\n}\nexport function filterFalse(obs: Observable<boolean>): Observable<boolean> {\n  return obs.pipe(filter((v) => v === false));\n}\n\nexport function decorateWithTakeUntil<T = any>(obs: Observable<T>, opts?: FirstOptions): Observable<T> {\n  // Set take until notifier\n  let takeUntil$: Observable<any> = opts?.stop || (opts?.timeout && timer(opts.timeout));\n\n  if (!takeUntil$) return obs; // Skip\n\n  // When stop, throw an error (useful when used with a toPromise())\n  if (opts.stopError) {\n    let error: Error;\n    if (opts.stopError === true) {\n      error = new Error(opts.timeout ? `Timeout ${opts.timeout}ms` : `stop`);\n    } else if (typeof opts.stopError === 'string') {\n      error = new Error(opts.stopError);\n    } else {\n      error = opts.stopError;\n    }\n    takeUntil$ = takeUntil$.pipe(\n      map(() => {\n        throw error;\n      })\n    );\n  }\n\n  return obs.pipe(takeUntil(takeUntil$));\n}\n\nexport function firstNotNil<T = any>(obs: Observable<T>, opts?: FirstOptions): Observable<T> {\n  return decorateWithTakeUntil(obs.pipe(first(isNotNil)), opts);\n}\nexport function firstTrue<T = void>(obs: Observable<boolean>, opts?: FirstOptions, result?: T): Observable<T> {\n  return decorateWithTakeUntil(\n    obs.pipe(\n      first((v) => v === true),\n      map((_) => result) // Convert to T\n    ),\n    opts\n  );\n}\nexport function firstFalse<T = void>(obs: Observable<boolean>, opts?: FirstOptions, result?: T): Observable<T> {\n  return decorateWithTakeUntil(\n    obs.pipe(\n      first((v) => v === false),\n      // Convert to expected type\n      map((_) => result as T)\n    ),\n    opts\n  );\n}\nexport function firstTruePromise(obs: Observable<boolean>, opts?: FirstOptions): Promise<void> {\n  return firstTrue(obs, { stopError: true, ...opts }).toPromise();\n}\nexport function firstFalsePromise(obs: Observable<boolean>, opts?: FirstOptions): Promise<void> {\n  return firstFalse(obs, { stopError: true, ...opts }).toPromise();\n}\nexport function firstNotNilPromise<T = any>(obs: Observable<T>, opts?: FirstOptions): Promise<T> {\n  return firstNotNil(obs, { stopError: true, ...opts }).toPromise();\n}\nexport function firstPromise<T = any>(obs: Observable<T>, opts?: FirstOptions): Promise<T> {\n  return decorateWithTakeUntil(\n    obs,\n    { stopError: true, ...opts }\n  ).toPromise();\n}\nexport function chainPromises<T = any>(defers: (() => Promise<any>)[]): Promise<T[]> {\n  return (defers || []).reduce((previous: Promise<any> | null, defer) => {\n    // First job\n    if (!previous) {\n      return (\n        defer()\n          // Init the final result array, with the first result\n          .then((jobRes) => [jobRes])\n      );\n    }\n    // Other jobs\n    return previous.then((finalResult) =>\n      defer()\n        // Add job result to final result array\n        .then((jobRes) => finalResult.concat(jobRes))\n    );\n  }, null);\n}\n\n/**\n * Wait form a predicate return true. This need to implement AppFormUtils.waitWhilePending(), AppFormUtils.waitIdle()\n *\n * @param predicate\n * @param opts\n */\nexport async function waitFor(predicate: Predicate<void>, opts?: WaitForOptions): Promise<void> {\n  if (predicate()) return Promise.resolve();\n\n  const period = (opts && opts.checkPeriod) || 300;\n  const dueTime = (opts && opts.dueTime) || period;\n  const wait$: Observable<boolean> = timer(dueTime, period).pipe(\n    // For DEBUG :\n    //tap(() => console.debug(\"Waiting form idle...\", form)),\n    filter((_) => predicate()),\n    map((_) => true)\n  );\n\n  await firstNotNilPromise(wait$, opts);\n}\n\nexport function waitForTrue(observable: Observable<boolean>, opts?: WaitForOptions): Promise<void> {\n  opts = { stopError: true, ...opts };\n  // dueTime (without timeout)\n  if (opts && opts.dueTime > 0) {\n    observable = timer(opts.dueTime).pipe(switchMap(() => observable));\n  }\n  return firstTrue(observable, opts).toPromise();\n}\n\nexport function waitForFalse(observable: Observable<boolean>, opts?: WaitForOptions): Promise<void> {\n  return waitForTrue(\n    // Inverse the logic\n    observable.pipe(map((v) => v === false)),\n    opts\n  );\n}\n","import {\n  AbstractControl,\n  AsyncValidatorFn,\n  UntypedFormArray,\n  UntypedFormControl,\n  UntypedFormGroup,\n  ValidationErrors,\n  ValidatorFn,\n} from '@angular/forms';\nimport { isMoment, Moment, unitOfTime } from 'moment';\nimport { PUBKEY_REGEXP } from '../constants';\nimport { isEmptyArray, isNil, isNilOrBlank, isNotNil, isNotNilOrBlank, isNotNilOrNaN, toBoolean, toNumber } from '../functions';\nimport { DateUtils, fromDateISOString } from '../dates';\nimport { delay, from, isObservable, merge, Observable, of, Subject, Subscription } from 'rxjs';\nimport { catchError, first, switchMap, takeUntil, tap } from 'rxjs/operators';\n\n// @dynamic\nexport class SharedValidators {\n  private static _DOUBLE_REGEXP_CACHE = {\n    NO_LIMIT: /^-?\\d+([.,]\\d*)?$/,\n    1: /^-?\\d+([.,]\\d)?$/, // 1 decimal max\n    2: /^-?\\d+([.,]\\d{1,2})?$/, // 2 decimals max\n    3: /^-?\\d+([.,]\\d{1,3})?$/, // 3 decimals max\n  };\n\n  private static getDoubleRegexp(maxDecimals: number): RegExp {\n    if (isNil(maxDecimals)) return this._DOUBLE_REGEXP_CACHE.NO_LIMIT;\n\n    if (maxDecimals < 0) throw new Error(`Invalid maxDecimals value: ${maxDecimals}`);\n    const regexp = this._DOUBLE_REGEXP_CACHE[maxDecimals];\n    if (regexp) return regexp;\n\n    // New: add to cache\n    this._DOUBLE_REGEXP_CACHE[maxDecimals] = new RegExp(`^-?\\\\d+([.,]\\\\d{1,${maxDecimals}})?$`);\n    return this._DOUBLE_REGEXP_CACHE[maxDecimals];\n  }\n\n  static equals(otherControlName: string): ValidatorFn {\n    return (c: AbstractControl): ValidationErrors | null => {\n      const otherControl = c.parent?.get(otherControlName);\n      if (otherControl && c.value !== otherControl.value) {\n        return {\n          equals: true,\n        };\n      }\n      return null;\n    };\n  }\n\n  static readonly I18N_ERROR_KEYS = {\n    required: 'ERROR.FIELD_REQUIRED',\n    min: 'ERROR.FIELD_MIN',\n    max: 'ERROR.FIELD_MAX',\n    minlength: 'ERROR.FIELD_MIN_LENGTH',\n    maxlength: 'ERROR.FIELD_MAX_LENGTH',\n    pubkey: 'ERROR.FIELD_NOT_VALID_PUBKEY',\n    validDate: 'ERROR.FIELD_NOT_VALID_DATE',\n    dateIsAfter: 'ERROR.FIELD_NOT_VALID_DATE_AFTER',\n    dateIsBefore: 'ERROR.FIELD_NOT_VALID_DATE_BEFORE',\n    dateRange: 'ERROR.FIELD_NOT_VALID_DATE_RANGE',\n    dateMinDuration: 'ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION',\n    dateMaxDuration: 'ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION',\n    maxDecimals: 'ERROR.FIELD_MAXIMUM_DECIMALS',\n    decimal: 'ERROR.FIELD_NOT_VALID_DECIMAL',\n    integer: 'ERROR.FIELD_NOT_VALID_INTEGER',\n    precision: 'ERROR.FIELD_NOT_VALID_PRECISION',\n    email: 'ERROR.FIELD_NOT_VALID_EMAIL',\n    latitude: 'ERROR.FIELD_NOT_VALID_LATITUDE',\n    longitude: 'ERROR.FIELD_NOT_VALID_LONGITUDE',\n    pattern: 'ERROR.FIELD_NOT_VALID_PATTERN',\n    unique: 'ERROR.FIELD_NOT_UNIQUE',\n    entity: 'ERROR.FIELD_INVALID',\n    invalid: 'ERROR.FIELD_INVALID',\n    inconsistent: 'ERROR.FIELD_INCONSISTENT',\n    equals: 'ERROR.FIELD_NOT_EQUALS',\n  };\n\n  static latitude(control: UntypedFormControl): ValidationErrors | null {\n    const value = control.value;\n    if (isNotNil(value) && (value < -90 || value > 90)) {\n      return { latitude: true };\n    }\n    return null;\n  }\n\n  static longitude(control: UntypedFormControl): ValidationErrors | null {\n    const value = control.value;\n    if (isNotNil(value) && (value < -180 || value > 180)) {\n      return { longitude: true };\n    }\n    return null;\n  }\n\n  static object(control: UntypedFormControl): ValidationErrors | null {\n    const value = control.value;\n    if (value && typeof value !== 'object') {\n      return { object: true };\n    }\n    return null;\n  }\n\n  static entity(control: UntypedFormControl): ValidationErrors | null {\n    const value = control.value;\n    if (value && (typeof value !== 'object' || isNil(value.id))) {\n      return { entity: true };\n    }\n    return null;\n  }\n\n  static entities(control: UntypedFormControl): ValidationErrors | null {\n    const value = control.value;\n    if (value && (!Array.isArray(value) || value.every((e) => isNil(e?.id)))) {\n      return { entity: true };\n    }\n    return null;\n  }\n\n  static empty(control: UntypedFormControl): ValidationErrors | null {\n    if (isNotNilOrBlank(control.value)) {\n      return { empty: true };\n    }\n    return null;\n  }\n\n  static pubkey(control: UntypedFormControl): ValidationErrors | null {\n    const value = control.value;\n    if (value && (typeof value !== 'string' || !PUBKEY_REGEXP.test(value))) {\n      return { pubkey: true };\n    }\n    return null;\n  }\n\n  static integer(control: UntypedFormControl): ValidationErrors | null {\n    if (isNilOrBlank(control.value)) return null;\n    const value = parseFloat(control.value);\n    if (isNaN(value) || (value | 0) !== value) {\n      return { integer: true };\n    }\n    return null;\n  }\n\n  static decimal(opts?: { maxDecimals?: number }): ValidatorFn {\n    const regexp = this.getDoubleRegexp(opts?.maxDecimals);\n    return (control: UntypedFormControl): ValidationErrors | null => {\n      const value = control.value;\n      if (Number.isNaN(value)) {\n        // DEBUG\n        //console.debug(\"WARN: Getting a NaN value (decimal was expected) !\");\n        return null;\n      }\n      if (isNotNil(value) && value !== '' && !regexp.test(value as string)) {\n        return isNotNil(opts?.maxDecimals) ? { maxDecimals: { maxDecimals: opts.maxDecimals } } : { decimal: true };\n      }\n      return null;\n    };\n  }\n\n  /**\n   * Check precision. e.g. if precision=0.5 then value=0.6 is invalid, but 1.5 is valid\n   *\n   * @param precision\n   */\n  static precision(precision: number): ValidatorFn {\n    if (isNil(precision)) throw new Error('Required a not nil precision');\n\n    // WARN: we should define a multiplier, because modulo in javascript will only work on integer\n    // (e.g. \"7 % 0.1\" in javascript will NOT return zero (but 0.09999999999999962)\n    const precisionNbDecimals = (precision.toString().split('.')[1] || '').length;\n    const multiplier = Math.pow(10, precisionNbDecimals);\n    const multipliedPrecision = Math.round(multiplier * precision);\n\n    // The validator function\n    return (control: UntypedFormControl): ValidationErrors | null => {\n      const value = control.value;\n      if (isNilOrBlank(value) || Number.isNaN(value)) {\n        return null;\n      }\n      // WARN: Convert value into integer, before applying modulo operator\n      const mod = Math.round(+value * multiplier) % multipliedPrecision;\n      if (mod !== 0) {\n        // DEBUG\n        //console.debug(`WARN Getting a ${value} with an invalid precision (expected precision is: ${precision})`);\n        return { precision: { precision } };\n      }\n      return null;\n    };\n  }\n\n  static validDateTime(requiredTime = true): ValidatorFn {\n    return (control: UntypedFormControl): ValidationErrors | null => {\n      const value = control.value;\n      const date = !value || isMoment(value) ? value : fromDateISOString(value, { strict: requiredTime, undefinedIfInvalid: false, requiredTime });\n      if (date && (!date.isValid() || date.year() < 1900 || (requiredTime && DateUtils.isNoTime(date)))) {\n        return { validDate: true };\n      }\n      return null;\n    };\n  }\n\n  static validDate = SharedValidators.validDateTime(true);\n  static validDateAllowNoTime = SharedValidators.validDateTime(false);\n\n  static dateIsAfter(previousValue: Moment, errorParam: string, granularity?: unitOfTime.StartOf): ValidatorFn {\n    return (control: AbstractControl): ValidationErrors | null => {\n      const value = fromDateISOString(control.value);\n      if (isNotNil(value) && isNotNil(previousValue) && value.isSameOrBefore(previousValue, granularity)) {\n        // Return the error\n        return { dateIsAfter: { minDate: errorParam } };\n      }\n      return null;\n    };\n  }\n\n  static dateIsBefore(maxValue: Moment, errorParam: string, granularity?: unitOfTime.StartOf): ValidatorFn {\n    return (control: AbstractControl): ValidationErrors | null => {\n      const value = fromDateISOString(control.value);\n      if (isNotNil(value) && isNotNil(maxValue) && value.isSameOrAfter(maxValue, granularity)) {\n        // Return the error\n        return { dateIsBefore: { maxDate: errorParam } };\n      }\n      return null;\n    };\n  }\n\n  static dateRangeEnd(startDateFieldName: string, msg?: string): ValidatorFn {\n    const errorCode = msg ? 'msg' : 'dateRange';\n    const error = msg ? { msg } : { dateRange: true };\n    return (control: AbstractControl): ValidationErrors | null => {\n      // Form group not created yet: skip\n      if (!control.parent) return null;\n\n      const startControl = control.parent.get(startDateFieldName);\n      if (!startControl) {\n        console.warn(`Cannot find brother control '${startDateFieldName}' in the parent form`);\n        return null;\n      }\n      const startDate = fromDateISOString(startControl.value);\n      const endDate = fromDateISOString(control.value);\n      // Error if value <= beforeDate\n      if (isNotNil(endDate) && isNotNil(startDate) && endDate.isSameOrBefore(startDate)) {\n        return error;\n      }\n      // OK: clear existing errors\n      SharedValidators.clearError(control, errorCode);\n      return null;\n    };\n  }\n\n  static dateRangeStart(endDateFieldName: string, msg?: string): ValidatorFn {\n    const errorCode = msg ? 'msg' : 'dateRange';\n    const error = msg ? { msg } : { dateRange: true };\n    return (control: AbstractControl): ValidationErrors | null => {\n      // Form group not created yet: skip\n      if (!control.parent) return null;\n\n      const endDateControl = control.parent.get(endDateFieldName);\n      if (!endDateControl) {\n        console.warn(`Cannot find control '${endDateFieldName}' in the parent form`);\n        return null;\n      }\n      const endDate = fromDateISOString(endDateControl.value);\n      const startDate = fromDateISOString(control.value);\n      // Error if value <= beforeDate\n      if (isNotNil(startDate) && isNotNil(endDate) && startDate.isSameOrAfter(endDate)) {\n        return error;\n      }\n      // OK: clear existing errors\n      SharedValidators.clearError(control, errorCode);\n      return null;\n    };\n  }\n\n  static copyParentErrors(errorNames?: string[]): ValidatorFn {\n    return (control: AbstractControl): ValidationErrors | null => {\n      // Skip if control already has some errors\n      if (control.errors) return null;\n      // Skip if parent form group not created yet\n      if (!control.parent) return null;\n\n      // Form group not created yet\n      if (!control.parent) return null;\n\n      const errors = control.parent.errors;\n\n      // No errors, or copy all errors\n      if (!errors || isEmptyArray(errorNames)) return errors;\n\n      // Copy only expected errors\n      return Object.keys(errors).reduce((res, key) => {\n        if (errorNames.includes(key)) {\n          res[key] = errors[key];\n        }\n        return res;\n      }, {});\n    };\n  }\n\n  static clearError(control: AbstractControl, errorCode: string) {\n    if (control.hasError(errorCode)) {\n      const errors = control.errors;\n      if (errors && errors[errorCode]) {\n        // Only one error: reset errors\n        if (Object.getOwnPropertyNames(errors).length === 1) {\n          control.setErrors(null);\n        }\n        // Other errors exists: just remove this error\n        else {\n          delete errors[errorCode];\n          control.setErrors(errors);\n        }\n      }\n    }\n  }\n\n  static copyError(sourceControl: AbstractControl, targetControl: AbstractControl, errorCode: string) {\n    if (sourceControl.hasError(errorCode)) {\n      const errors = sourceControl.errors;\n      if (errors?.[errorCode]) {\n        targetControl.setErrors({\n          ...targetControl.errors,\n          [errorCode]: errors[errorCode]\n        });\n      }\n    } else {\n      SharedValidators.clearError(targetControl, errorCode);\n    }\n  }\n}\n\n// @dynamic\nexport class SharedFormGroupValidators {\n  static dateRange(\n    startDateField: string,\n    endDateField: string,\n    opts?: { msg?: string; fieldOnly?: boolean; skipIfNoTime?: boolean } | string\n  ): ValidatorFn {\n    const msg = typeof opts === 'string' ? opts : opts?.msg;\n    const fieldOnly = typeof opts === 'object' ? opts?.fieldOnly : undefined;\n    const skipIfNoTime = typeof opts === 'object' ? opts?.skipIfNoTime : undefined;\n\n    const errorCode = isNotNilOrBlank(msg) ? 'msg' : 'dateRange';\n    const rangeError = msg ? { msg } : { dateRange: true };\n    return (group: UntypedFormGroup): ValidationErrors | null => {\n      const startDate = fromDateISOString(group.get(startDateField).value);\n      const endField = group.get(endDateField);\n      const endDate = fromDateISOString(endField.value);\n\n      const hasStartDate = isNotNil(startDate) && (!skipIfNoTime || DateUtils.isNoTime(startDate));\n      const hasEndDate = isNotNil(endDate) && (!skipIfNoTime || DateUtils.isNoTime(endDate));\n      if (hasStartDate && hasEndDate && startDate.isAfter(endDate)) {\n        // Update end field\n        endField.markAsPending();\n        endField.setErrors({\n          ...endField.errors,\n          ...rangeError,\n        });\n        // Return the error (should be applied to the parent form, by default)\n        return fieldOnly ? null : rangeError;\n      }\n      // OK: remove the existing on the end field\n      SharedValidators.clearError(endField, errorCode);\n      return null;\n    };\n  }\n\n  static dateMaxDuration(\n    startDateField: string,\n    endDateField: string,\n    maxDuration: number,\n    durationUnit?: moment.unitOfTime.Diff,\n    opts?: { skipIfNoTime?: boolean }\n  ): ValidatorFn {\n    const maxDurationError = { dateMaxDuration: true };\n    const skipIfNoTime = opts?.skipIfNoTime;\n\n    return (group: UntypedFormGroup): ValidationErrors | null => {\n      const startDate = fromDateISOString(group.get(startDateField).value);\n      const endField = group.get(endDateField);\n      const endDate = fromDateISOString(endField.value);\n\n      const hasStartDate = isNotNil(startDate) && (!skipIfNoTime || DateUtils.isNoTime(startDate));\n      const hasEndDate = isNotNil(endDate) && (!skipIfNoTime || DateUtils.isNoTime(endDate));\n\n      if (hasStartDate && hasEndDate && Math.abs(startDate.diff(endDate, durationUnit)) > maxDuration) {\n        // Update end field\n        endField.markAsTouched({ onlySelf: true });\n        endField.markAsPending();\n        endField.setErrors({\n          ...endField.errors,\n          ...maxDurationError,\n        });\n        // Return the error (should be apply to the parent form)\n        return maxDurationError;\n      }\n      // OK: remove the existing on the end field\n      SharedValidators.clearError(endField, 'dateMaxDuration');\n      return null;\n    };\n  }\n\n  static dateMinDuration(startDateField: string, endDateField: string, minDuration: number, durationUnit?: moment.unitOfTime.Diff): ValidatorFn {\n    return (group: UntypedFormGroup): ValidationErrors | null => {\n      const endField = group.get(endDateField);\n      const startDate = fromDateISOString(group.get(startDateField).value);\n      const endDate = fromDateISOString(endField.value);\n      if (isNotNil(startDate) && isNotNil(endDate) && Math.abs(startDate.diff(endDate, durationUnit)) < minDuration) {\n        // Update end field\n        const endFieldErrors: ValidationErrors = endField.errors || {};\n        endFieldErrors['dateMinDuration'] = true;\n        endField.setErrors(endFieldErrors);\n        endField.markAsTouched({ onlySelf: true });\n        // Return the error (should be apply to the parent form)\n        return { dateMinDuration: true };\n      }\n      // OK: remove the existing on the end field\n      else {\n        SharedValidators.clearError(endField, 'dateMinDuration');\n      }\n      return null;\n    };\n  }\n\n  static requiredIf(\n    fieldName: string,\n    anotherFieldToCheck: string | AbstractControl,\n    opts?: {\n      fieldOnly?: boolean;\n      isEmpty?: (control: AbstractControl) => boolean;\n      predicate?: (control: AbstractControl) => boolean;\n    }\n  ): ValidatorFn {\n    const isEmpty = opts?.isEmpty || ((control) => isNilOrBlank(control?.value));\n    const predicate = opts?.predicate || ((control) => isNotNilOrBlank(control?.value));\n    return (group: UntypedFormGroup): ValidationErrors | null => {\n      const control = group.get(fieldName);\n      if (!control) throw new Error(`Unable to find control '${fieldName}' used by ShareFormGroupValidators.requiredIf validator!`);\n      const anotherControl = anotherFieldToCheck instanceof AbstractControl ? anotherFieldToCheck : group.get(anotherFieldToCheck);\n      if (!anotherControl) throw new Error(`Unable to find control ${typeof anotherFieldToCheck === 'string' ? anotherFieldToCheck  + ' ' : ''}used by ShareFormGroupValidators.requiredIf validator!`);\n      if (isEmpty(control) && predicate(anotherControl)) {\n        const error = { required: true };\n        control.setErrors(error);\n        control.markAsTouched({ onlySelf: true });\n        return opts?.fieldOnly ? null : error;\n      }\n      SharedValidators.clearError(control, 'required');\n      return null;\n    };\n  }\n\n  static requiredIfTrue(\n    fieldName: string,\n    anotherFieldToCheck: string | AbstractControl,\n    opts?: {\n      fieldOnly?: boolean;\n      isEmpty?: (control: AbstractControl) => boolean;\n    }\n  ): ValidatorFn {\n    const isEmpty = opts?.isEmpty || ((control) => isNilOrBlank(control.value));\n    return (group: UntypedFormGroup): ValidationErrors | null => {\n      const control = group.get(fieldName);\n      const anotherControl = anotherFieldToCheck instanceof AbstractControl ? anotherFieldToCheck : group.get(anotherFieldToCheck);\n      if (!anotherControl) throw new Error('Unable to find field to check!');\n      if (isEmpty(control) && toBoolean(anotherControl.value, false)) {\n        const error = { required: true };\n        control.setErrors(error);\n        control.markAsTouched({ onlySelf: true });\n        return opts?.fieldOnly ? null : error;\n      }\n      SharedValidators.clearError(control, 'required');\n      return null;\n    };\n  }\n\n  static requiredIfFalse(\n    fieldName: string,\n    anotherFieldToCheck: string | AbstractControl,\n    opts?: {\n      fieldOnly?: boolean;\n      isEmpty?: (control: AbstractControl) => boolean;\n    }\n  ): ValidatorFn {\n    const isEmpty = opts?.isEmpty || ((control) => isNilOrBlank(control.value));\n    return (group: UntypedFormGroup): ValidationErrors | null => {\n      const control = group.get(fieldName);\n      const anotherControl = anotherFieldToCheck instanceof AbstractControl ? anotherFieldToCheck : group.get(anotherFieldToCheck);\n      if (!anotherControl) throw new Error('Unable to find field to check!');\n      if (isEmpty(control) && !toBoolean(anotherControl.value, false)) {\n        const error = { required: true };\n        control.setErrors(error);\n        control.markAsTouched({ onlySelf: true });\n        return opts?.fieldOnly ? null : error;\n      }\n      SharedValidators.clearError(control, 'required');\n      return null;\n    };\n  }\n\n  static requiredIfEmpty(\n    fieldName: string,\n    anotherFieldToCheck: string,\n    opts?: {\n      fieldOnly?: boolean;\n      isEmpty?: (control: AbstractControl) => boolean;\n    }\n  ): ValidatorFn {\n    const isEmpty = opts?.isEmpty || ((control) => isNilOrBlank(control.value));\n    return (group: UntypedFormGroup): ValidationErrors | null => {\n      const control = group.get(fieldName);\n      if (isEmpty(control) && isNilOrBlank(group.get(anotherFieldToCheck).value)) {\n        const error = { required: true };\n        control.setErrors(error);\n        control.markAsTouched({ onlySelf: true });\n        return opts?.fieldOnly ? null : error;\n      }\n      SharedValidators.clearError(control, 'required');\n      return null;\n    };\n  }\n\n  static propagateIfDirty(fieldName: string, fieldNameToPropagate: string, valueToPropagate: any): ValidatorFn {\n    return (group: UntypedFormGroup): null => {\n      const control = group.get(fieldName);\n      const controlToPropagate = group.get(fieldNameToPropagate);\n      if (control.dirty && controlToPropagate.value !== valueToPropagate) {\n        controlToPropagate.setValue(valueToPropagate);\n      }\n      return null;\n    };\n  }\n\n  /**\n   * Same as compose, but keep only the first errors (instead of the union)\n   *\n   * @param validators\n   */\n  first(validators: (ValidatorFn | null | undefined)[]): ValidationErrors | null {\n    return (control) =>\n      validators\n        .filter(isNotNil)\n        .map((validator) => validator(control))\n        .find(isNotNil) || null;\n  }\n}\n\n// @dynamic\nexport class SharedFormArrayValidators {\n  /**\n   * Validate uniqueness of an entity in a FormArray\n   *\n   * @param controlName the name of the control in FormArray\n   */\n  static uniqueEntity(controlName: string): ValidatorFn {\n    return (array: UntypedFormArray): ValidationErrors | null => {\n      const controls: AbstractControl[] = [];\n      if (array.length) {\n        // gather controls in array with valid entity\n        for (const control of array.controls) {\n          const fromGroup = control as UntypedFormGroup;\n          if (fromGroup.controls[controlName]) {\n            const value = fromGroup.controls[controlName].value;\n            if (!!value && !!value.id) controls.push(fromGroup.controls[controlName]);\n          }\n        }\n        // get occurrences of entity by id\n        const occurrences = controls.reduce((acc, control) => {\n          const id = control.value.id;\n          if (acc[id]) acc[id]++;\n          else acc[id] = 1;\n          return acc;\n        }, {});\n        // get controls with value occurrences > 1\n        const error = { uniqueEntity: true };\n        let returnError = false;\n        controls\n          .filter((control) => occurrences[control.value.id] > 1)\n          .forEach((control) => {\n            let errors: ValidationErrors = control.errors || {};\n            errors = { ...errors, ...error };\n            control.setErrors(errors);\n            control.markAsTouched({ onlySelf: true });\n            returnError = true;\n          });\n        if (returnError) return error;\n      }\n      controls.forEach((control) => SharedValidators.clearError(control, 'uniqueEntity'));\n      return null;\n    };\n  }\n\n  static requiredArrayMinLength(minLength?: number): ValidatorFn {\n    minLength = minLength || 1;\n    return (array: UntypedFormArray): ValidationErrors | null => {\n      if (!array || array.length < minLength) {\n        return { required: true };\n      }\n      return null;\n    };\n  }\n\n  static arrayMaxLength(maxLength?: number): ValidatorFn {\n    maxLength = maxLength || 1;\n    return (array: UntypedFormArray): ValidationErrors | null => {\n      if (array && array.length > maxLength) {\n        return { maxLength: maxLength };\n      }\n      return null;\n    };\n  }\n\n  /**\n   * Validate the sum of control values in an FormArray not overflow the max value\n   *\n   * @param controlName the name of the control in FormArray\n   * @param max the maximum value\n   */\n  static validSumMaxValue(controlName: string, max: number): ValidatorFn {\n    return (array: UntypedFormArray): ValidationErrors | null => {\n      const controls: AbstractControl[] = [];\n      if (array.length) {\n        for (const control of array.controls) {\n          const fromGroup = control as UntypedFormGroup;\n          if (fromGroup.controls[controlName] && isNotNilOrNaN(fromGroup.controls[controlName].value)) {\n            controls.push(fromGroup.controls[controlName]);\n          }\n        }\n        if (controls.reduce((sum, control) => sum + control.value, 0) > max) {\n          const error = { sumMaxValue: true };\n          controls.forEach((control) => {\n            let errors: ValidationErrors = control.errors || {};\n            errors = { ...errors, ...error };\n            control.setErrors(errors);\n            control.markAsTouched({ onlySelf: true });\n          });\n          return error;\n        }\n      }\n      controls.forEach((control) => SharedValidators.clearError(control, 'sumMaxValue'));\n      return null;\n    };\n  }\n}\n\nexport type ObservableValidatorFn = (control: AbstractControl) => Observable<ValidationErrors | null>;\nexport type PromiseValidatorFn = (control: AbstractControl) => Promise<ValidationErrors | null>;\n\n// @dynamic\nexport class SharedAsyncValidators {\n  private static DEBOUNCE_TIME_VALIDATOR_ID = 0;\n\n  static get lastDebounceTimeId() {\n    return SharedAsyncValidators.DEBOUNCE_TIME_VALIDATOR_ID;\n  }\n\n  /**\n   * Add a debounce time to a validator.\n   *\n   * @param form\n   * @param validatorFn\n   * @param opts Use opts.stopSubject to stop the validator, before end\n   */\n  static debounceTime(\n    validatorFn: ValidatorFn | AsyncValidatorFn,\n    opts?: {\n      dispose?: Observable<any>;\n      debounceTime?: number;\n      markForCheck?: () => void;\n      debug?: boolean;\n    }\n  ): ObservableValidatorFn {\n    // DEBUG only\n    const debug = opts?.debug || false;\n    const logPrefix = debug && `[debounceTime-validator] #${SharedAsyncValidators.DEBOUNCE_TIME_VALIDATOR_ID++} - `;\n    const debounceTime = toNumber(opts?.debounceTime, 250);\n\n    // DEBUG\n    if (debug) console.debug(logPrefix + `New validator with a debounceTime at ${debounceTime}ms`);\n\n    const $disposeSubject = new Subject<void>();\n    const disposeEvent$ = opts?.dispose ? merge($disposeSubject, opts?.dispose) : $disposeSubject;\n\n    // DEBUG\n    if (debug && opts?.dispose) {\n      opts?.dispose.pipe(first()).subscribe(() => {\n        console.debug(logPrefix + 'Stopping');\n      });\n    }\n\n    return (control) => {\n      if (debug) console.debug(logPrefix + 'Form ask validation...');\n\n      // Stop previous observables\n      $disposeSubject.next();\n      let now: number;\n\n      return of(null).pipe(\n        // Add a delay before execution\n        delay(debounceTime),\n        // DEBUG\n        tap((_) => {\n          if (debug) {\n            console.debug(logPrefix + 'Executing...');\n            now = Date.now();\n          }\n        }),\n        switchMap((_) => {\n          // Call the validator\n          const res = validatorFn(control);\n          // Make sure to return an Observable\n          if (isObservable(res)) return res;\n          if (res instanceof Promise) return from(res);\n          return of(res);\n        }),\n        // DEBUG\n        tap((res) => debug && console.debug(logPrefix + `Finished in ${Date.now() - now}ms (${res ? 'with errors' : 'no error'})`, res)),\n        catchError((error) => {\n          console.error(logPrefix + 'Error while executing validator. Stopping job', error);\n          $disposeSubject.next();\n          //throw error;\n          return null;\n        }),\n        // Refresh UI, after a successful execution\n        tap(() => opts?.markForCheck && opts?.markForCheck()),\n        // Make sure to stop, because of the switchMap\n        takeUntil(disposeEvent$)\n      );\n    };\n  }\n\n  /**\n   * Add an async validator, that can be disposed by the returned subscription\n   *\n   * @param form\n   * @param validatorFn the validator or job to execute\n   * @param opts\n   */\n  static registerAsyncValidator(\n    form: AbstractControl,\n    validatorFn: ValidatorFn | AsyncValidatorFn,\n    opts?: {\n      debounceTime?: number;\n      markForCheck?: () => void;\n      debug?: boolean;\n    }\n  ): Subscription {\n    if (form.asyncValidator) throw Error('Form already have an async validator. Cannot configure job');\n\n    const debounceTime = toNumber(opts?.debounceTime, 250);\n    const $dispose = new Subject<void>();\n\n    const asyncValidatorFn = SharedAsyncValidators.debounceTime(validatorFn, { ...opts, debounceTime, dispose: $dispose });\n    form.setAsyncValidators(asyncValidatorFn);\n\n    const subscription = new Subscription();\n\n    // When unsubscribing, remove async validator\n    subscription.add(() => {\n      // Clear added validator. Must be done NOW (without delay) because generally a new Job is given just after\n      form.clearAsyncValidators();\n\n      // Stop the job, with a delay to let the last execution finished\n      setTimeout(() => {\n        $dispose.next();\n        $dispose.unsubscribe();\n      }, debounceTime);\n    });\n\n    return subscription;\n  }\n}\n","import { Entity } from '../../services/model/entity.model';\nimport { AbstractControl, AbstractControlOptions, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, ValidatorFn } from '@angular/forms';\nimport { toBoolean } from '../../../shared/functions';\nimport { addValueInArray, clearValueInArray, copyEntity2Form, removeValueInArray, resizeArray } from '../../../shared/forms';\nimport { SharedFormArrayValidators } from '../../../shared/validator/validators';\n\nexport interface FormArrayHelperOptions {\n  allowEmptyArray: boolean; // false by default /!\\ TRUE in the AppFormArray\n  allowManyNullValues?: boolean; // false by default\n  allowDuplicatedValues?: boolean; // false by default\n  validators?: ValidatorFn[];\n}\n\nexport class FormArrayHelper<T = Entity<any>, C extends AbstractControl = AbstractControl> {\n  static getOrCreateArray(formBuilder: UntypedFormBuilder, form: UntypedFormGroup, arrayName: string): UntypedFormArray {\n    const disabled = form.disabled;\n    let arrayControl = form.get(arrayName) as UntypedFormArray;\n    if (!arrayControl) {\n      arrayControl = formBuilder.array([]);\n\n      // Apply parent disabled state, before to push it into the array\n      // This is need to avoid parent form to be enabled, after calling resizeArray()\n      if (disabled && arrayControl.enabled) arrayControl.disable({ emitEvent: false });\n\n      form.addControl(arrayName, arrayControl);\n    }\n    return arrayControl;\n  }\n\n  private _allowEmptyArray: boolean;\n  private _allowManyNullValues: boolean;\n  private _allowDuplicatedValues: boolean;\n\n  private readonly _validators: ValidatorFn[];\n\n  get allowEmptyArray(): boolean {\n    return this._allowEmptyArray;\n  }\n\n  set allowEmptyArray(value: boolean) {\n    this.setAllowEmptyArray(value);\n  }\n\n  get allowManyNullValues(): boolean {\n    return this._allowManyNullValues;\n  }\n\n  set allowManyNullValues(value: boolean) {\n    this._allowManyNullValues = value;\n  }\n\n  get allowDuplicatedValues(): boolean {\n    return this._allowDuplicatedValues;\n  }\n\n  set allowDuplicatedValues(value: boolean) {\n    this._allowDuplicatedValues = value;\n  }\n\n  get formArray(): UntypedFormArray {\n    return this._formArray;\n  }\n\n  constructor(\n    private readonly _formArray: UntypedFormArray,\n    private createControl: (value?: T, index?: number) => C,\n    private equals: (v1: T, v2: T) => boolean,\n    private isEmpty: (value: T) => boolean,\n    options?: FormArrayHelperOptions\n  ) {\n    this._validators = options && options.validators;\n\n    // empty array not allow by default\n    this.setAllowEmptyArray(toBoolean(options?.allowEmptyArray, false));\n    this._allowManyNullValues = toBoolean(options?.allowManyNullValues, false);\n    this._allowDuplicatedValues = toBoolean(options?.allowDuplicatedValues, false);\n  }\n\n  /**\n   * @param value\n   * @param opts\n   */\n  add(value?: T, opts?: { emitEvent: boolean; insertAt?: number }): boolean {\n    return addValueInArray(this._formArray, this.createControl, this.equals, this.isEmpty, value, {\n      allowManyNullValues: this.allowManyNullValues,\n      allowDuplicateValue: this.allowDuplicatedValues,\n      ...opts,\n    });\n  }\n\n  removeAt(index: number, opts?: { emitEvent?: boolean; onlySelf?: boolean }) {\n    // Do not remove if last criterion\n    if (!this._allowEmptyArray && this._formArray.length === 1) {\n      return clearValueInArray(this._formArray, this.isEmpty, index, opts);\n    } else {\n      return removeValueInArray(this._formArray, index, opts);\n    }\n  }\n\n  resize(length: number, opts?: { emitEvent?: boolean }): boolean {\n    return resizeArray(this._formArray, this.createControl, length, opts);\n  }\n\n  clearAt(index: number, opts?: { emitEvent?: boolean }): boolean {\n    return clearValueInArray(this._formArray, this.isEmpty, index, opts);\n  }\n\n  isLast(index: number): boolean {\n    return this._formArray.length - 1 === index;\n  }\n\n  removeAllEmpty(opts?: { emitEvent?: boolean; onlySelf?: boolean }) {\n    let index = this._formArray.controls.findIndex((c) => this.isEmpty(c.value));\n    while (index !== -1) {\n      this.removeAt(index, opts);\n      index = this._formArray.controls.findIndex((c) => this.isEmpty(c.value));\n    }\n  }\n\n  size(): number {\n    return this._formArray.length;\n  }\n\n  at(index: number): C {\n    return this._formArray.at(index) as C;\n  }\n\n  /**\n   * Resize the FormArray, then set values\n   *\n   * @param values\n   * @param options\n   */\n  setValue(\n    values: T[],\n    options?: {\n      onlySelf?: boolean;\n      emitEvent?: boolean;\n    }\n  ): void {\n    this.resize(values?.length || 0);\n    this._formArray.setValue(values, options);\n  }\n\n  /**\n   * Resize the FormArray, then patch values\n   *\n   * @param values\n   * @param opts\n   */\n  patchValue(\n    values: T[],\n    opts?: {\n      onlySelf?: boolean;\n      emitEvent?: boolean;\n    }\n  ): void {\n    this.resize(values?.length || 0);\n    this._formArray.patchValue(values, opts);\n  }\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this._formArray.controls.forEach((c) => c.disable(opts));\n  }\n\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this._formArray.controls.forEach((c) => c.enable(opts));\n  }\n\n  forEach(ite: (control: C) => void) {\n    const size = this.size();\n    for (let i = 0; i < size; i++) {\n      const control = this._formArray.at(i) as C;\n      if (control) ite(control);\n    }\n  }\n\n  /* -- internal methods -- */\n\n  protected setAllowEmptyArray(value: boolean) {\n    if (this._allowEmptyArray === value) return; // Skip if same\n\n    this._allowEmptyArray = value;\n\n    // Set required (or reste) min length validator\n    if (this._allowEmptyArray) {\n      this._formArray.setValidators(this._validators || null);\n    } else {\n      this._formArray.setValidators((this._validators || []).concat(SharedFormArrayValidators.requiredArrayMinLength(1)));\n    }\n  }\n}\n\nexport declare interface AppFormArrayOptions extends AbstractControlOptions {\n  allowEmptyArray?: boolean; // true by default\n  allowReuseControls?: boolean; // true by default\n  allowManyNullValues?: boolean; // false by default\n  allowDuplicateValue?: boolean; // false by default\n}\n\nexport class AppFormArray<T = Entity<any>, C extends AbstractControl = AbstractControl> extends UntypedFormArray {\n  private readonly options: AppFormArrayOptions;\n\n  get allowEmptyArray(): boolean {\n    return this.options.allowEmptyArray;\n  }\n\n  set allowEmptyArray(value: boolean) {\n    this.setAllowEmptyArray(value);\n  }\n\n  get allowManyNullValues(): boolean {\n    return this.options.allowManyNullValues;\n  }\n\n  set allowManyNullValues(value: boolean) {\n    this.options.allowManyNullValues = value;\n  }\n\n  get allowDuplicateValue(): boolean {\n    return this.options.allowDuplicateValue;\n  }\n\n  set allowDuplicateValue(value: boolean) {\n    this.options.allowDuplicateValue = value;\n  }\n\n  constructor(\n    public createControl: (value?: T | undefined, index?: number) => C,\n    private equals: (v1: T, v2: T) => boolean,\n    private isEmpty: (value: T) => boolean,\n    options?: AppFormArrayOptions | undefined | null\n  ) {\n    super([], options);\n    this.options = {\n      allowEmptyArray: true,\n      allowReuseControls: true,\n      allowManyNullValues: false,\n      allowDuplicateValue: false,\n      ...options,\n    };\n    this.setAllowEmptyArray(this.options.allowEmptyArray);\n  }\n\n  /**\n   * WIll rebuild the array, using the given values\n   *\n   * @param values\n   * @param options\n   */\n  setValue(\n    values: any[],\n    options?: {\n      onlySelf?: boolean;\n      emitEvent?: boolean;\n    }\n  ): void {\n    if (values === undefined) throw new Error(\"'undefined' value not allowed in AppFormArray.setValue(). Use 'null' or '[]' to clear the array\");\n\n    if (this.options.allowReuseControls === false) {\n      const disabled = this.disabled;\n\n      // Clean all\n      this.resize(0, { emitEvent: options?.emitEvent });\n\n      // Recreate each control, with a default value\n      (values || []).forEach((value, index) => {\n        const control = this.createControl(value, index);\n\n        // Apply parent disabled state, before to push it into the array\n        // This is need to avoid parent form to be enabled, after calling AppFormArray.patchValue() (e.g. in table's row validator)\n        if (disabled && control.enabled) control.disable({ emitEvent: false });\n        else if (!disabled && control.disabled) control.enable({ emitEvent: false });\n\n        this.push(control, options);\n      });\n    } else {\n      this.resize(values?.length || 0, { emitEvent: false });\n      super.setValue(values, options);\n    }\n  }\n\n  patchValue(\n    values: any[] | null | undefined,\n    options?: {\n      onlySelf?: boolean;\n      emitEvent?: boolean;\n    }\n  ): void {\n    // --- /!\\ From official Angular doc of 'FormGroup.patchValue()' :\n    //   Even though the `value` argument type doesn't allow `null` and `undefined` values, the\n    //   `patchValue` can be called recursively and inner data structures might have these values, so\n    //   we just ignore such cases when a field containing FormGroup instance receives `null` or\n    //   `undefined` as a value.\n    // ---\n    if (values == null) return; // Ignore\n\n    if (this.options.allowReuseControls === false) {\n      const disabled = this.disabled;\n\n      // Clean all\n      this.resize(0, { emitEvent: options?.emitEvent });\n\n      // Recreate each control, with a default value\n      (values || []).forEach((value, index) => {\n        const control = this.createControl(value, index);\n\n        // Apply parent disabled state, before to push it into the array\n        // This is need to avoid parent form to be enabled, after calling AppFormArray.patchValue() (e.g. in table's row validator)\n        if (disabled && control.enabled) control.disable({ emitEvent: false });\n        else if (!disabled && control.disabled) control.enable({ emitEvent: false });\n\n        this.push(control, options);\n      });\n    } else {\n      this.resize(values?.length || 0, { emitEvent: false });\n      super.patchValue(values, options);\n    }\n  }\n\n  resize(length: number, options?: { emitEvent?: boolean }): boolean {\n    return resizeArray(this, this.createControl, length, options);\n  }\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    super.disable(opts);\n    this.controls.forEach((c) => c.disable(opts));\n  }\n\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    super.enable(opts);\n    this.controls.forEach((c) => c.enable(opts));\n  }\n\n  forEach(ite: (control: C) => void) {\n    const size = this.length;\n    for (let i = 0; i < size; i++) {\n      const control = this.at(i) as C;\n      if (control) ite(control);\n    }\n  }\n\n  /**\n   * @param value\n   * @param opts\n   */\n  add(value?: T, opts?: { emitEvent: boolean; insertAt?: number }) {\n    addValueInArray(this, this.createControl, this.equals, this.isEmpty, value, { ...this.options, ...opts });\n  }\n\n  removeAt(index: number, opts?: { emitEvent: boolean; onlySelf?: boolean }) {\n    // Do not remove if last criterion\n    if (this.options.allowEmptyArray === false && this.length === 1) {\n      this.clearAt(index, opts);\n      return false;\n    } else if (index < this.length) {\n      super.removeAt(index, opts);\n      this.markAsDirty(opts);\n      return true;\n    }\n    return false;\n  }\n\n  clearAt(index: number, opts?: { emitEvent: boolean; onlySelf?: boolean }) {\n    const control = this.at(index);\n    if (this.isEmpty(control.value)) return; // skip (not need to clear)\n\n    if (control instanceof UntypedFormGroup) {\n      copyEntity2Form({}, control, opts);\n    } else if (control instanceof UntypedFormArray) {\n      control.setValue([], opts);\n    } else {\n      control.setValue(null, opts);\n    }\n    this.markAsDirty(opts);\n  }\n\n  isLast(index: number): boolean {\n    return this.length - 1 === index;\n  }\n\n  removeAllEmpty() {\n    let index = this.controls.findIndex((c) => this.isEmpty(c.value));\n    while (index !== -1) {\n      this.removeAt(index);\n      index = this.controls.findIndex((c) => this.isEmpty(c.value));\n    }\n  }\n\n  clone(): AppFormArray<T, C> {\n    return new AppFormArray<T, C>(this.createControl, this.equals, this.isEmpty, { ...this.options });\n  }\n\n  /* -- internal -- */\n\n  protected setAllowEmptyArray(value: boolean) {\n    if (this.options.allowEmptyArray === value) return; // Skip if same\n\n    this.options.allowEmptyArray = value;\n\n    // Set required (or reset) min length validator\n    if (this.options.allowEmptyArray) {\n      this.setValidators(this.options.validators || null);\n    } else {\n      const validators = this.options?.validators || [];\n      this.setValidators((Array.isArray(validators) ? validators : [validators]).concat(SharedFormArrayValidators.requiredArrayMinLength(1)));\n    }\n  }\n}\n","import {\n  AbstractControl,\n  FormArray,\n  FormControl,\n  FormGroup,\n  UntypedFormArray,\n  UntypedFormControl,\n  UntypedFormGroup,\n  ValidationErrors,\n  Validators,\n} from '@angular/forms';\nimport { isMoment } from 'moment';\nimport { isEmptyArray, isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrNaN, nullIfUndefined } from './functions';\nimport { toDateISOString } from './dates';\nimport { waitFor, WaitForOptions } from './observables';\nimport { Predicate } from '@angular/core';\n\nimport { AppFormArray } from '../core/form/array/form-array';\n\nexport interface FormErrors {\n  [key: string]: ValidationErrors;\n}\n\n/**\n * Fill a form using a source entity\n *\n * @param target\n * @param entity\n * @param opts\n */\nexport function copyEntity2Form(entity: any, target: UntypedFormGroup, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n  const json = getFormValueFromEntity(entity, target);\n  target.patchValue(json, opts);\n}\n\nexport function getFormValueFromEntity(entity: any | undefined, form: UntypedFormGroup): { [key: string]: any } {\n  return adaptValueToControl(entity, form) as { [key: string]: any };\n}\n\n/**\n * Transform an entity into a simple object, compatible with the given form\n *\n * @param source an entity (or subentity)\n * @param control\n * @param path\n */\nexport function adaptValueToControl(source: any | undefined, control: AbstractControl, path?: string): any {\n  const pathPrefix = path ? path + '.' : '';\n\n  // Form group\n  if (control instanceof FormGroup) {\n    const result = {};\n    // eslint-disable-next-line guard-for-in\n    for (const key in control.controls) {\n      result[key] = adaptValueToControl(source && source[key], control.controls[key], pathPrefix + key);\n    }\n    return result;\n  }\n\n  // Array\n  if (control instanceof FormArray) {\n    // Split, if many values in a string\n    if (typeof source === 'string') {\n      source = source.split('|');\n    }\n    // Skip if value is not an array\n    if (!Array.isArray(source)) {\n      return [];\n    }\n\n    // Resizable array\n    if (control instanceof AppFormArray) {\n      // Make sure to have one value, if empty array are not allowed\n      if (control.allowEmptyArray === false && source.length === 0) {\n        source = [null];\n      }\n\n      const exampleControl = control.createControl(undefined, control.length);\n      return source.map((item, index) => adaptValueToControl(item, exampleControl, pathPrefix + '#' + index)) as any[];\n    }\n\n    // Legacy array\n    else if (control.length > 0) {\n      const firstControl = control.at(0);\n      // Use the first form group, as model\n      let result = source.map((item, index) => adaptValueToControl(item, firstControl, pathPrefix + '#' + index)) as any[];\n\n      // Truncate if too many values\n      if (result.length > control.length) {\n        if (firstControl instanceof UntypedFormControl) {\n          for (let i = control.length; i < result.length; i++) {\n            control.push(new UntypedFormControl(null, firstControl.validator));\n          }\n        } else {\n          console.warn(`WARN: please resize the FormArray '${path || ''}' to the same length of the input array`);\n          result = result.slice(0, control.length);\n        }\n      }\n\n      // Add values if not enought\n      else if (result.length < control.length) {\n        //console.warn(`WARN: Adding null value to array values`);\n        for (let i = result.length; i < control.length; i++) {\n          result.push(null);\n        }\n      }\n      return result;\n    }\n    // Skip if unable to find a control in the array\n    else {\n      if (isNotEmptyArray(source)) console.warn(`WARN: please resize the FormArray '${path}' to the same length of the input array`);\n      return [];\n    }\n  }\n\n  // Form control\n  if (control instanceof FormControl) {\n    // Date\n    if (isMoment(source)) {\n      return toDateISOString(source);\n    }\n  }\n\n  // Any other control: replace undefined by null value\n  // because Undefined is not authorized as control value\n  return nullIfUndefined(source);\n}\n\nexport function logFormErrors(control: AbstractControl, logPrefix?: string, path?: string) {\n  if (!control || control.valid) return;\n  logPrefix = logPrefix || '';\n  // Form group\n  if (control instanceof UntypedFormGroup) {\n    if (!path) console.warn(`${logPrefix} Form errors:`);\n    if (control.errors) {\n      Object.keys(control.errors).forEach((error) => console.warn(`${logPrefix} -> ${path || ''} (${error})`));\n    }\n    if (control.controls) {\n      Object.keys(control.controls).forEach(\n        (child) => logFormErrors(control.controls[child], logPrefix, path ? `${path}.${child}` : child) // Recursive call\n      );\n    }\n  }\n  // Form array\n  else if (control instanceof UntypedFormArray) {\n    if (control.errors) {\n      Object.keys(control.errors).forEach((error) => console.warn(`${logPrefix} -> ${path || ''} (${error})`));\n    }\n    control.controls.forEach((child, index) => {\n      logFormErrors(child, logPrefix, path ? `${path}.${index}` : `${index}`); // Recursive call\n    });\n  }\n  // Other control's errors\n  else if (control.errors) {\n    Object.keys(control.errors).forEach((error) => console.warn(`${logPrefix} -> ${path || ''} (${error})`));\n  }\n}\n\n/**\n * Retrieves all validation errors from a given form control, including its child controls if it is a form group or array.\n *\n * @param {AbstractControl} control - The form control to retrieve errors from. This can be a form group, a form array, or a simple form control.\n * @param {Object} [opts] - Optional configurations for error retrieval.\n * @param {string} [opts.controlName] - The name or path of the control being processed, used for structuring error keys in the result.\n * @param {FormErrors} [opts.result] - The object to which errors will be added, allowing for aggregation and persistence between calls.\n * @param {boolean} [opts.recursive=true] - Whether to recursively collect errors from child controls within a form group or array. Defaults to true.\n * @return {FormErrors} The collected errors as a key-value object where keys represent control names or paths and values represent their respective errors. Returns `undefined` if the provided control is valid and has no errors.\n */\nexport function getFormErrors(\n  control: AbstractControl,\n  opts?: {\n    controlName?: string;\n    result?: FormErrors;\n    recursive?: boolean;\n  }\n): FormErrors {\n  if (!control || control.valid) return undefined;\n\n  opts = opts || {};\n  opts.result = opts.result || {};\n\n  // Form group\n  if (control instanceof FormGroup) {\n    // Copy errors\n    if (control.errors) {\n      if (opts.controlName) {\n        opts.result[opts.controlName] = {\n          ...control.errors,\n        };\n      } else {\n        opts.result = {\n          ...opts.result,\n          ...control.errors,\n        };\n      }\n    }\n\n    if (!opts || opts.recursive !== false) {\n      // Loop on children controls\n      for (const key in control.controls) {\n        const child = control.controls[key];\n        if (child?.enabled) {\n          getFormErrors(child, {\n            ...opts,\n            controlName: opts.controlName ? [opts.controlName, key].join('.') : key,\n            result: opts.result, // Make sure to keep the same result object\n          });\n        }\n      }\n    }\n  }\n\n  // Form array\n  else if (control instanceof FormArray) {\n    // Copy errors\n    if (control.errors) {\n      if (opts.controlName) {\n        opts.result[opts.controlName] = {\n          ...control.errors,\n        };\n      } else {\n        opts.result = {\n          ...opts.result,\n          ...control.errors,\n        };\n      }\n    }\n\n    control.controls.forEach((child, index) => {\n      getFormErrors(child, {\n        ...opts,\n        controlName: (opts.controlName || '') + '.' + index,\n        result: opts.result, // Make sure to keep the same result object\n      });\n    });\n  }\n\n  // Other type of control (e.g simple control)\n  else if (control.errors) {\n    if (opts.controlName) {\n      opts.result[opts.controlName] = {\n        ...control.errors,\n      };\n    } else {\n      opts.result = {\n        ...opts.result,\n        ...control.errors,\n      };\n    }\n  }\n  return opts.result;\n}\n\n/**\n * Retrieves a control from the provided form/control structure using a dot-separated path.\n *\n * @param {AbstractControl} form - The root form group, form array, or control to start searching from.\n * @param {string} path - The dot-separated path specifying the control. For example, 'groupName.controlName' or 'arrayName.0.controlName'.\n * @param {boolean} [strict=true] - If true, throws an error if the full path cannot be resolved; if false, returns the last valid control encountered.\n * @param failIfMissing - If true, throw an error if the control not exists.\n * @return {AbstractControl} - The control at the specified path or the closest valid control if strict mode is disabled.\n * @throws {Error} - Throws an error if the path cannot be resolved and strict mode is enabled.\n */\nexport function getControlFromPath(form: AbstractControl, path: string, strict: boolean = true, failIfMissing: boolean = false): AbstractControl {\n  if (isNilOrBlank(path)) return form; // not path = the input control itself\n\n  // Form group\n  if (form instanceof FormGroup) {\n    const i = path.indexOf('.');\n    if (i === -1) {\n      return form.get(path);\n    }\n    const key = path.substring(0, i);\n    if (form.contains(key)) {\n      return getControlFromPath(form.get(key), path.substring(i + 1), strict, failIfMissing);\n    }\n  }\n\n  // Form array\n  else if (form instanceof FormArray) {\n    const i = path.indexOf('.');\n    if (i === -1) {\n      return form.at(+path);\n    }\n    const index = +path.substring(0, i);\n    if (index < form.length) {\n      return getControlFromPath(form.at(index), path.substring(i + 1), strict, failIfMissing);\n    }\n  }\n\n  // The path if not blank, but we cannot go deeper inside the control\n  // Return the current control, if NOT strict mode (path is too long, but this is OK)\n  else if (!strict) {\n    return form;\n  }\n\n  if (failIfMissing) throw new Error(`Invalid control path: '${path}' should be an existing control.`);\n\n  return null; // Not found\n}\n\nexport function disableControls(form: UntypedFormGroup, paths: string[], opts?: { onlySelf?: boolean; emitEvent?: boolean; required?: boolean }) {\n  (paths || []).forEach((path) => {\n    const control = getControlFromPath(form, path);\n    if (control) disableControl(control, opts);\n  });\n}\nexport function disableAndClearControls(\n  form: UntypedFormGroup,\n  paths: string[],\n  opts?: { onlySelf?: boolean; emitEvent?: boolean; required?: boolean }\n) {\n  (paths || []).forEach((path) => {\n    const control = getControlFromPath(form, path);\n    if (control) disableAndClearControl(control, opts);\n  });\n}\nexport function enableControls(form: UntypedFormGroup, paths: string[], opts?: { onlySelf?: boolean; emitEvent?: boolean; required?: boolean }) {\n  (paths || []).forEach((path) => {\n    const control = getControlFromPath(form, path);\n    if (control) enableControl(control, opts);\n  });\n}\n\nexport function setControlsEnabled(\n  form: UntypedFormGroup,\n  enabled: boolean,\n  paths: string[],\n  opts?: { onlySelf?: boolean; emitEvent?: boolean; required?: boolean }\n) {\n  (paths || []).forEach((path) => {\n    const control = getControlFromPath(form, path);\n    if (control) setControlEnabled(control, enabled, opts);\n  });\n}\n\nexport function setControlRequired(\n  control: AbstractControl,\n  required: boolean\n) {\n  if (!control) return;\n  if (required && !control.hasValidator(Validators.required)) {\n    control.addValidators(Validators.required);\n  } else if (!required && control.hasValidator(Validators.required)) {\n    control.removeValidators(Validators.required);\n  }\n}\n\n\n/**\n * Sets form errors on an AbstractControl, including nested controls within form groups or arrays.\n *\n * @param {AbstractControl} control - The form control, form group, or form array to apply the errors to.\n * @param {FormErrors} errors - An object representing the errors to be set on the control or its children.\n * @return {void} Does not return a value.\n */\nexport function setFormErrors(control: AbstractControl, errors: FormErrors): void {\n  if (!control || !errors) return;\n\n  // Form group or array\n  if (control instanceof FormGroup || control instanceof FormArray) {\n    Object.entries(errors).forEach(([childPath, childError]) => {\n      const childControl = getControlFromPath(control, childPath);\n      if (childControl) childControl.setErrors(childError);\n    });\n  }\n  // Simple control\n  else {\n    control.setErrors(errors);\n  }\n}\n\nexport function enableControl(control: AbstractControl, opts?: { onlySelf?: boolean; emitEvent?: boolean; required?: boolean }) {\n  setControlEnabled(control, true, opts);\n}\n\nexport function disableControl(control: AbstractControl, opts?: { onlySelf?: boolean; emitEvent?: boolean; required?: boolean }) {\n  setControlEnabled(control, false, { required: false, ...opts });\n}\n\nexport function disableAndClearControl(control: AbstractControl, opts?: { onlySelf?: boolean; emitEvent?: boolean; required?: boolean }) {\n  const wasDisabled = control.disabled;\n\n  // Apply disable\n  setControlEnabled(control, false, { required: false, ...opts });\n\n  // Important, should not use reset() to mark the control as dirty.\n  // Otherwise, optimization using dirty (.e.g MeasurementForm) will not be notified by this changed\n  if (isNotNil(control.value)) {\n    if (wasDisabled) {\n      control.reset(null, opts);\n    } else {\n      control.setValue(null, opts);\n    }\n  }\n}\n\nexport function setControlEnabled(\n  control: AbstractControl,\n  enabled: boolean,\n  opts?: { onlySelf?: boolean; emitEvent?: boolean; required?: boolean }\n) {\n  if (!control) return; // SKip if no control\n  if (enabled) {\n    if (isNotNil(opts?.required) && opts.required && !control.hasValidator(Validators.required)) {\n      control.addValidators(Validators.required);\n    }\n    control.enable(opts);\n  } else {\n    control.disable(opts);\n    if (isNotNil(opts?.required) && !opts.required && control.hasValidator(Validators.required)) {\n      control.removeValidators(Validators.required);\n    }\n  }\n}\n\nexport function addValueInArray(\n  arrayControl: UntypedFormArray,\n  createControl: (value: any | undefined, index: number) => AbstractControl,\n  equals: (v1: any, v2: any) => boolean,\n  isEmpty: (value: any) => boolean,\n  value: any,\n  opts?: { onlySelf?: boolean; emitEvent?: boolean; insertAt?: number; allowManyNullValues?: boolean; allowDuplicateValue?: boolean }\n): boolean {\n  const disabled = arrayControl.disabled;\n\n  let hasChanged = false;\n  let index = -1;\n  let isEmptyValue = isEmpty(value);\n\n  // Search if value already exists\n  if (!isEmptyValue && opts?.allowDuplicateValue !== true) {\n    index = (arrayControl.value || []).findIndex((v) => equals(value, v));\n  }\n\n  // If value not exists, but last value is empty: reuse last value\n  if (index === -1 && opts?.allowManyNullValues !== true && arrayControl.length > 0) {\n    const lastValue = arrayControl.at(arrayControl.length - 1).value;\n    if (isEmpty(lastValue)) {\n      index = arrayControl.length - 1;\n    }\n  }\n\n  // Replace the existing value\n  if (index !== -1) {\n    if (!isEmptyValue) {\n      arrayControl.at(index).patchValue(value, opts);\n      hasChanged = true;\n    }\n  } else {\n    const control = createControl(value, arrayControl.length);\n\n    // Apply parent disabled state, before to push it into the array\n    // This is need to avoid parent form to be enabled\n    if (disabled && control.enabled) control.disable({ emitEvent: false });\n    else if (!disabled && control.disabled) control.enable({ emitEvent: false });\n\n    if (isNotNilOrNaN(opts?.insertAt)) {\n      arrayControl.insert(opts.insertAt, control, opts);\n    } else {\n      arrayControl.push(control, opts);\n    }\n    hasChanged = true;\n  }\n\n  if (hasChanged) {\n    if (!opts || opts.emitEvent !== false) {\n      // Mark array control dirty\n      if (!isEmptyValue) {\n        arrayControl.markAsDirty(opts);\n      }\n    }\n  }\n\n  return hasChanged;\n}\n\n/**\n * Set an array using given default values. Each default value will be pass to the 'createControl()' function\n *\n * @param arrayControl\n * @param createControl\n * @param defaultValues\n * @param opts\n */\nexport function initArrayControlsFromValues(\n  arrayControl: UntypedFormArray,\n  createControl: (value?: any, index?: number) => AbstractControl,\n  defaultValues: any[],\n  opts?: { emitEvent?: boolean }\n): boolean {\n  if (arrayControl.length === 0 && (!defaultValues || defaultValues.length === 0)) return false; // No changes need\n\n  const disabled = arrayControl.disabled;\n\n  while (arrayControl.length > 0) {\n    arrayControl.removeAt(arrayControl.length - 1, opts);\n  }\n\n  (defaultValues || []).forEach((value, index) => {\n    const control = createControl(value, index);\n\n    // Apply parent disabled state, before to push it into the array\n    // This is need to avoid parent form to be enabled\n    if (disabled && control.enabled) control.disable({ emitEvent: false });\n    else if (!disabled && control.disabled) control.enable({ emitEvent: false });\n\n    arrayControl.push(control, opts);\n  });\n\n  return true; // Has some changes\n}\n\nexport function resizeArray(\n  arrayControl: UntypedFormArray,\n  createControl: (value?: any | undefined, index?: number) => AbstractControl,\n  length: number,\n  opts?: { emitEvent?: boolean }\n): boolean {\n  if (arrayControl.length === length || length < 0) return false; // No changes need\n\n  const disabled = arrayControl.disabled;\n\n  // Reduce size\n  let currentLength = arrayControl.length;\n  while (currentLength > length) {\n    arrayControl.removeAt(currentLength - 1, opts);\n\n    // If deletion was not done; stop (Avoid infinite loop when AppFormArray refused deletion - fix issue sumaris-app#1389)\n    if (arrayControl.length === currentLength) break; // Stop (avoid infinite loop)\n    currentLength = arrayControl.length;\n  }\n\n  // Increase size\n  while (arrayControl.length < length) {\n    const control = createControl(undefined, arrayControl.length);\n\n    // Apply parent disabled state, before to push it into the array\n    // This is need to avoid parent form to be enabled, after calling resizeArray()\n    if (disabled && control.enabled) control.disable({ emitEvent: false });\n    else if (!disabled && control.disabled) control.enable({ emitEvent: false });\n\n    arrayControl.push(control, opts);\n  }\n\n  return true; // Has some changes\n}\n\nexport function removeValueInArray(arrayControl: UntypedFormArray, index: number, opts?: { emitEvent?: boolean }): boolean {\n  arrayControl.removeAt(index, opts);\n  arrayControl.markAsDirty(opts);\n  return true;\n}\n\nexport function clearValueInArray(\n  arrayControl: UntypedFormArray,\n  isEmpty: (value: any) => boolean,\n  index: number,\n  opts?: { onlySelf?: boolean; emitEvent?: boolean }\n): boolean {\n  const control = arrayControl.at(index);\n  if (isEmpty(control.value)) return false; // skip (not need to clear)\n\n  if (control instanceof UntypedFormGroup) {\n    copyEntity2Form({}, control, opts);\n  } else if (control instanceof UntypedFormArray) {\n    control.setValue([], opts);\n  } else {\n    control.setValue(null, opts);\n  }\n  arrayControl.markAsDirty(opts);\n  return true;\n}\n\nexport function markAllAsTouched(control: AbstractControl, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n  if (!control) return;\n  if (control instanceof UntypedFormGroup) {\n    markFormGroupAsTouched(control, { ...opts, onlySelf: true }); // recursive call\n  } else if (control instanceof UntypedFormArray) {\n    control.markAsTouched({ onlySelf: true });\n    (control.controls || []).forEach((c) => markControlAsTouched(c, { ...opts, onlySelf: true })); // recursive call\n  } else {\n    control.markAsTouched({ onlySelf: true });\n    control.updateValueAndValidity({ ...opts, onlySelf: true });\n  }\n}\n\nexport function markFormGroupAsTouched(form: UntypedFormGroup, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n  if (!form) return;\n  form.markAsTouched(opts);\n  Object.keys(form.controls)\n    .map((key) => form.controls[key])\n    .filter((control) => control.enabled)\n    .forEach((control) => markControlAsTouched(control, opts));\n  form.updateValueAndValidity({ ...opts, onlySelf: true });\n}\n\nexport function markControlAsTouched(control: AbstractControl, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n  if (!control) return;\n  if (control instanceof UntypedFormGroup) {\n    markAllAsTouched(control, { ...opts, onlySelf: true }); // recursive call\n  } else if (control instanceof UntypedFormArray) {\n    (control.controls || []).forEach((c) => markControlAsTouched(c, { ...opts, onlySelf: true })); // recursive call\n  } else {\n    control.markAsTouched({ onlySelf: true });\n    control.updateValueAndValidity({ ...opts, onlySelf: true });\n  }\n}\n\nexport function updateValueAndValidity(form: UntypedFormGroup, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n  if (!form) return;\n  form.updateValueAndValidity(opts);\n  Object.keys(form.controls)\n    .map((key) => form.controls[key])\n    .filter((control) => control.enabled)\n    .forEach((control) => {\n      if (control instanceof UntypedFormGroup) {\n        updateValueAndValidity(control, { ...opts, onlySelf: true }); // recursive call\n      } else {\n        control.updateValueAndValidity({ ...opts, onlySelf: true });\n      }\n    });\n}\n\nexport function markAsUntouched(form: UntypedFormGroup, opts?: { onlySelf?: boolean }) {\n  if (!form) return;\n  form.markAsUntouched(opts);\n  Object.getOwnPropertyNames(form.controls).forEach((key) => {\n    const control = form.get(key);\n    if (control instanceof UntypedFormGroup) {\n      markAsUntouched(control, { onlySelf: true }); // recursive call\n    } else {\n      control.markAsUntouched({ onlySelf: true });\n      control.setErrors(null);\n    }\n  });\n}\n\n/**\n * Wait end of async validation (not pending). This need to implement {pending: boolean}\n * return false\n */\nexport function waitWhilePending<T extends { pending: boolean }>(form: T, opts?: WaitForOptions): Promise<void> {\n  const predicate: Predicate<void> = () => form.pending !== true;\n  return waitFor(predicate, opts);\n}\n\n/**\n * Wait form is idle (not loading). This need to implement {loading: boolean}\n *\n * @param form\n * @param opts\n */\nexport function waitIdle<T extends { loading: boolean }>(form: T, opts?: WaitForOptions): Promise<void> {\n  const predicate: Predicate<void> = () => form.loading !== true;\n  return waitFor(predicate, opts);\n}\n\nexport function filterFormErrorsByPrefix(errors: FormErrors, ...prefixes: string[]): FormErrors {\n  if (isEmptyArray(prefixes)) return errors;\n  return filterFormErrorsByPath(errors, (path) => prefixes?.some((prefix) => path.startsWith(prefix)));\n}\n\nexport function filterFormErrorsByPath(errors: FormErrors, filter: Predicate<string>): FormErrors {\n  if (typeof filter !== 'function') return errors;\n  return filterFormErrors(errors, ([path, _]) => filter(path));\n}\n\nexport function filterFormErrors(errors: FormErrors, filter: Predicate<[string, any]>): FormErrors {\n  if (typeof filter !== 'function') return errors;\n  return Object.entries(errors)\n    .filter(filter)\n    .reduce(\n      (res, [path, error]) => {\n        // Init error map\n        res = res || {};\n        // Add current error\n        res[path] = error;\n        return res;\n      },\n      <FormErrors>undefined\n    );\n}\n","import {AbstractControl, FormGroup} from '@angular/forms';\nimport {round, toBoolean} from '../../shared/functions';\nimport {filterNumberInput, selectInputContent, selectInputContentFromEvent} from '../../shared/inputs';\nimport {waitFor, WaitForOptions, waitForTrue} from '../../shared/observables';\nimport {\n  adaptValueToControl,\n  addValueInArray,\n  clearValueInArray,\n  copyEntity2Form,\n  disableAndClearControl,\n  disableAndClearControls,\n  disableControl,\n  disableControls,\n  enableControl,\n  enableControls,\n  filterFormErrors,\n  filterFormErrorsByPath,\n  filterFormErrorsByPrefix,\n  getControlFromPath,\n  getFormErrors,\n  getFormValueFromEntity,\n  logFormErrors,\n  markAllAsTouched,\n  markAsUntouched,\n  removeValueInArray,\n  resizeArray,\n  setControlEnabled,\n  setControlRequired,\n  setControlsEnabled,\n  setFormErrors,\n  updateValueAndValidity,\n  waitIdle,\n  waitWhilePending,\n} from '../../shared/forms';\nimport {BehaviorSubject, Subject} from 'rxjs';\n\nexport type IAppFormGetter = () => IAppForm;\n\nexport declare interface OnReady {\n  ngOnReady();\n}\n\nexport interface IAppForm<T = any> {\n  // From Angular form\n  invalid: boolean;\n  valid: boolean;\n  dirty: boolean;\n  pending: boolean;\n  error: string;\n  enabled: boolean;\n  disabled: boolean;\n  touched: boolean;\n  untouched: boolean;\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n\n  // Specific to IAppForm\n  empty?: boolean;\n  loading?: boolean;\n  loaded?: boolean;\n  destroyed?: boolean;\n  ready(opts?: WaitForOptions): Promise<void>;\n  waitIdle(opts?: WaitForOptions): Promise<any>;\n\n  // Optional functions\n  setValue?: (data: T, opts?: { onlySelf?: boolean; emitEvent?: boolean }) => Promise<void> | void;\n  patchValue?: (data: T, opts?: { onlySelf?: boolean; emitEvent?: boolean }) => Promise<void> | void;\n  reset?: (data?: T, opts?: { onlySelf?: boolean; emitEvent?: boolean }) => void;\n  getValue?: () => Promise<T> | T;\n\n  markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n  markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n  markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n  markAllAsTouched(opts?: { emitEvent?: boolean }): void;\n  markAsDirty(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n  markAsLoading(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n  markAsLoaded(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n  markAsReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n  markAsNotReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void;\n}\n\nexport interface CanSave {\n  dirty: boolean;\n  valid: boolean;\n  save(): Promise<boolean>;\n}\n\nexport interface CanLeave extends CanSave {\n  cancel(event?: Event): Promise<void>;\n  deactivate?: (() => Promise<void>) | ((navigateForward: boolean) => Promise<void>);\n}\n\n/**\n * A form that do nothing\n */\nexport class AppNullForm implements IAppForm {\n  readonly invalid = false;\n  readonly valid = false;\n  readonly dirty = false;\n  readonly empty = true;\n  readonly pending = false;\n  readonly error = null;\n  readonly enabled = false;\n  readonly loading = false;\n  readonly touched = false;\n  get disabled(): boolean {\n    return !this.enabled;\n  }\n  get untouched(): boolean {\n    return !this.touched;\n  }\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n\n  markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n  markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n  markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n  markAllAsTouched(opts?: { emitEvent?: boolean }) {}\n  markAsDirty(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n  markAsLoading(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n  markAsLoaded(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n  markAsReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n  markAsNotReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {}\n\n  waitIdle(opts?: WaitForOptions): Promise<any> {\n    return Promise.reject(false);\n  }\n  ready(): Promise<any> {\n    return Promise.reject(true);\n  }\n}\n\nexport class AppFormProvider<F extends IAppForm = IAppForm> implements IAppForm {\n  static NULL_FORM = new AppNullForm();\n\n  constructor(private getterFn: () => F) {}\n\n  private get delegate(): IAppForm {\n    return this.getterFn() || AppFormProvider.NULL_FORM;\n  }\n\n  waitDelegate(opts?: WaitForOptions): Promise<F> {\n    let content: F;\n    return waitFor(() => {\n      content = this.getterFn();\n      return !!content;\n    }, opts).then((_) => content);\n  }\n\n  /* -- delegated methods -- */\n\n  get enabled(): boolean {\n    return this.delegate.enabled;\n  }\n  get disabled(): boolean {\n    return this.delegate.disabled;\n  }\n  get error(): string {\n    return this.delegate.error;\n  }\n  get invalid(): boolean {\n    return this.delegate.invalid;\n  }\n  get valid(): boolean {\n    return this.delegate.valid;\n  }\n  get dirty(): boolean {\n    return this.delegate.dirty;\n  }\n  get empty(): boolean {\n    return this.delegate.empty;\n  }\n  get pending(): boolean {\n    return this.delegate.pending;\n  }\n  get loading(): boolean {\n    return this.delegate.loading;\n  }\n  get touched(): boolean {\n    return this.delegate.touched;\n  }\n  get untouched(): boolean {\n    return this.delegate.untouched;\n  }\n  ready(): Promise<any> {\n    return this.delegate.ready();\n  }\n  waitIdle(opts?: WaitForOptions): Promise<any> {\n    return this.delegate.waitIdle();\n  }\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.disable(opts);\n  }\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.enable(opts);\n  }\n  markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.markAsPristine(opts);\n  }\n  markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.markAsUntouched(opts);\n  }\n  markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.markAsTouched(opts);\n  }\n  markAllAsTouched(opts?: { emitEvent?: boolean }) {\n    return this.delegate.markAllAsTouched(opts);\n  }\n  markAsDirty(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.markAsDirty(opts);\n  }\n  markAsLoading(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.markAsLoading(opts);\n  }\n  markAsLoaded(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.markAsLoaded(opts);\n  }\n  markAsReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.markAsReady(opts);\n  }\n  markAsNotReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    return this.delegate.markAsNotReady(opts);\n  }\n\n  async save(): Promise<boolean> {\n    if (AppFormUtils.canSave(this.delegate)) {\n      return this.delegate.save();\n    }\n    return true;\n  }\n}\n\n/**\n * Helper class, for angular forms\n */\nexport class AppFormUtils {\n  static copyEntity2Form = copyEntity2Form;\n  static getFormValueFromEntity = getFormValueFromEntity;\n  static getControlValueFromEntity = adaptValueToControl;\n\n  /**\n   * Retrieves a control from the provided form/control structure using a dot-separated path.\n   *\n   * @param {AbstractControl} form - The root form group, form array, or control to start searching from.\n   * @param {string} path - The dot-separated path specifying the control. For example, 'groupName.controlName' or 'arrayName.0.controlName'.\n   * @param {boolean} [strict=true] - If true, throws an error if the full path cannot be resolved; if false, returns the last valid control encountered.\n   * @return {AbstractControl} - The control at the specified path or the closest valid control if strict mode is disabled.\n   * @throws {Error} - Throws an error if the path cannot be resolved and strict mode is enabled.\n   */\n  static getControlFromPath = getControlFromPath;\n\n  static filterNumberInput = filterNumberInput;\n  static enableControls = enableControls;\n  static enableControl = enableControl;\n  static disableControl = disableControl;\n  static disableControls = disableControls;\n  static disableAndClearControl = disableAndClearControl;\n  static disableAndClearControls = disableAndClearControls;\n  static setControlEnabled = setControlEnabled;\n  static setControlsEnabled = setControlsEnabled;\n  static setControlRequired = setControlRequired;\n  static selectInputContentFromEvent = selectInputContentFromEvent;\n  static selectInputContent = selectInputContent;\n  /**\n   * @deprecated use markAllAsTouched() instead (naming was wrong)\n   */\n  static markAsTouched = markAllAsTouched;\n\n  /**\n   * Marks the control and all its descendant controls as touched.\n   * See also:\n   * - `markAsTouched()`\n   */\n  static markAllAsTouched = markAllAsTouched;\n  static markAsUntouched = markAsUntouched;\n  static waitWhilePending = waitWhilePending;\n  static waitIdle = waitIdle;\n  static updateValueAndValidity = updateValueAndValidity;\n\n  static isForm(object: any): object is IAppForm {\n    return object instanceof AppFormProvider || ('dirty' in object && 'enabled' in object && 'valid' in object);\n  }\n\n  static canSave(object: any): object is IAppForm & CanSave {\n    return 'save' in object && AppFormUtils.isForm(object);\n  }\n\n  // ArrayForm\n  static addValueInArray = addValueInArray;\n  static removeValueInArray = removeValueInArray;\n  static resizeArray = resizeArray;\n  static clearValueInArray = clearValueInArray;\n\n  // Calculated fields\n  static calculatedSuffix = 'Calculated';\n  static isControlHasInput = isControlHasInput;\n  static setCalculatedValue = setCalculatedValue;\n  static resetCalculatedValue = resetCalculatedValue;\n\n  // Form errors\n  static logFormErrors = logFormErrors;\n  static filterErrorsByPrefix = filterFormErrorsByPrefix;\n  static filterErrorsByPath = filterFormErrorsByPath;\n  static filterErrors = filterFormErrors;\n\n  /**\n   * Retrieves all validation errors from a given form control, including its child controls if it is a form group or array.\n   *\n   * @param {AbstractControl} control - The form control to retrieve errors from. This can be a form group, a form array, or a simple form control.\n   * @param {Object} [opts] - Optional configurations for error retrieval.\n   * @param {string} [opts.controlName] - The name or path of the control being processed, used for structuring error keys in the result.\n   * @param {FormErrors} [opts.result] - The object to which errors will be added, allowing for aggregation and persistence between calls.\n   * @param {boolean} [opts.recursive=true] - Whether to recursively collect errors from child controls within a form group or array. Defaults to true.\n   * @return {FormErrors} The collected errors as a key-value object where keys represent control names or paths and values represent their respective errors. Returns `undefined` if the provided control is valid and has no errors.\n   */\n  static getFormErrors = getFormErrors;\n\n  /**\n   * Sets form errors on an AbstractControl, including nested controls within form groups or arrays.\n   *\n   * @param {AbstractControl} control - The form control, form group, or form array to apply the errors to.\n   * @param {FormErrors} errors - An object representing the errors to be set on the control or its children.\n   * @return {void} Does not return a value.\n   */\n  static setFormErrors = setFormErrors;\n}\n\nexport function isControlHasInput(controls: { [key: string]: AbstractControl }, controlName: string): boolean {\n  // true if the control has a value and its 'calculated' control has the value 'false'\n  return controls[controlName].value && !toBoolean(controls[controlName + AppFormUtils.calculatedSuffix].value, false);\n}\n\nexport function setCalculatedValue(controls: { [key: string]: AbstractControl }, controlName: string, value: number | undefined) {\n  // set value to control\n  controls[controlName].setValue(round(value));\n  // set 'calculated' control to 'true'\n  controls[controlName + AppFormUtils.calculatedSuffix].setValue(true);\n}\n\nexport function resetCalculatedValue(controls: { [key: string]: AbstractControl }, controlName: string) {\n  if (!isControlHasInput(controls, controlName)) {\n    // set undefined only if control already calculated\n    AppFormUtils.setCalculatedValue(controls, controlName, undefined);\n  }\n}\n","import { changeCaseToUnderscore, isEmptyArray, isNil } from '../functions';\nimport { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { AbstractControl } from '@angular/forms';\nimport { AppFormUtils } from '../../core/form/form.utils';\nimport { SharedValidators } from './validators';\nimport { ObjectMap } from '../types';\nimport { FormErrors } from '../forms';\nimport { TranslateContextService } from '../services/translate-context.service';\n\nexport const APP_FORM_ERROR_I18N_KEYS = new InjectionToken<ObjectMap<string>>('appFormErrorKeys');\nconst I18N_KEYS_REGEXP = /^[a-zA-Z0-9_.]+$/;\n\nexport interface IFormPathTranslatorOptions {\n  i18nPrefix?: string;\n  i18nSuffix?: string;\n  [key: string]: any;\n}\nexport interface IFormPathTranslator<O extends IFormPathTranslatorOptions = IFormPathTranslatorOptions> {\n  translateFormPath: (path: string, opts?: O) => string;\n}\n\nexport interface FormErrorTranslateOptions extends IFormPathTranslatorOptions {\n  pathTranslator?: IFormPathTranslator;\n  separator?: string;\n  recursive?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class FormErrorTranslator implements IFormPathTranslator {\n  private readonly errorI18nKeys: ObjectMap<string>;\n\n  constructor(\n    private translate: TranslateService,\n    private translateContext: TranslateContextService,\n    @Optional() @Inject(APP_FORM_ERROR_I18N_KEYS) errorI18nKeys: ObjectMap<string>\n  ) {\n    this.errorI18nKeys = {\n      ...SharedValidators.I18N_ERROR_KEYS,\n      ...errorI18nKeys,\n    };\n  }\n\n  translateFormErrors(control: AbstractControl, opts?: FormErrorTranslateOptions): string {\n    if (!control || !control.invalid) return '';\n\n    const separator = (opts && opts.separator) || ', ';\n    const recursive = !opts || opts.recursive !== false;\n    const errors = AppFormUtils.getFormErrors(control, { recursive });\n    return (\n      errors &&\n      Object.keys(errors).reduce((res, path) => {\n        const childControl = control.get(path);\n        let childErrors = errors[path];\n        // Should be a control map of errors\n        if (childControl) {\n          // Try to convert the control path\n          const i18nPath = this.translateFormPath(path, opts);\n\n          // OK, we have a field name: use it\n          childErrors = { ...childErrors, ...childControl.errors }\n          const columnErrors = Object.keys(childErrors).map((errorKey) =>\n            this.translateError(errorKey, childErrors[errorKey])\n          );\n          if (isEmptyArray(columnErrors)) return res;\n          // Add separator\n          if (res.length) res += separator;\n          return res + i18nPath + ': ' + columnErrors.join(separator);\n        }\n\n        // Or try as global form error\n        const formError = this.translateError(path, errors[path]);\n        if (isNil(formError)) return res;\n        return res + (res.length ? separator : '') + formError;\n      }, '')\n    );\n  }\n\n  translateErrors(errors: FormErrors, opts?: FormErrorTranslateOptions): string {\n    const separator = (opts && opts.separator) || ', ';\n    return (\n      errors &&\n      Object.keys(errors).reduce((res, path) => {\n        const pathErrors = errors[path];\n        // Should be a control map of errors\n\n        if (typeof pathErrors === 'object' && !Array.isArray(pathErrors)) {\n          // Try to convert the control path\n          const i18nPath = this.translateFormPath(path, opts);\n\n          // OK, we have a field name: use it\n          const columnErrors = Object.keys(pathErrors).map((errorKey) => this.translateError(errorKey, pathErrors[errorKey]));\n          if (isEmptyArray(columnErrors)) return res;\n          // Add separator\n          if (res.length) res += separator;\n          return res + i18nPath + ': ' + columnErrors.join(separator);\n        }\n\n        // Or try as global form error\n        const formError = this.translateError(path, pathErrors);\n        if (isNil(formError)) return res;\n        return res + (res.length ? separator : '') + formError;\n      }, '')\n    );\n  }\n\n  translateFormPath(path: string, opts?: FormErrorTranslateOptions): string {\n    // Delegate to a path translator, if any\n    if (opts?.pathTranslator && opts.pathTranslator !== this) {\n      return opts.pathTranslator.translateFormPath(path, { ...opts, pathTranslator: null /*avoid recursive call*/ });\n    }\n\n    // Default translation\n    const fieldName = path.substring(path.lastIndexOf('.') + 1);\n    const i18nKey = (opts?.i18nPrefix || '') + changeCaseToUnderscore(fieldName).toUpperCase();\n    return this.translateContext.instant(i18nKey, opts?.i18nSuffix);\n  }\n\n  translateError(errorKey: string, errorContent?: any) {\n    const i18nKey =\n      this.errorI18nKeys[errorKey] ||\n      // Try to generate a standard error key, like 'ERROR.FIELD_xxx_xxx'\n      'ERROR.FIELD_' + changeCaseToUnderscore(errorKey).toUpperCase();\n\n    let i18nMessage = this.translate.instant(i18nKey, errorContent);\n    if (i18nKey !== i18nMessage) return i18nMessage;\n\n    // Try to use the error content, as an i18n key\n    if (typeof errorContent === 'string') {\n      // Not an i18n keys: use it\n      if (!I18N_KEYS_REGEXP.test(errorContent)) {\n        return errorContent;\n      }\n      i18nMessage = this.translate.instant(errorContent);\n\n      if (errorContent !== i18nMessage) return i18nMessage; // OK; resolved\n\n      // Continue\n    }\n\n    // Not translated: show error\n    console.error(\n      `[form-error-adapter] Cannot translate error key '${errorKey}'. Please add more formErrorsKey into APP_FORM_ERROR_I18N_KEYS injection token`\n    );\n\n    return errorKey;\n  }\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport {AbstractControl, FormArray, UntypedFormArray, UntypedFormControl, UntypedFormGroup} from '@angular/forms';\nimport { FormErrorTranslateOptions, FormErrorTranslator } from '../validator/form-error-adapter.class';\nimport { Subscription } from 'rxjs';\nimport { equals, isNotNil } from '../functions';\n\n@Pipe({\n  name: 'formError',\n  pure: false,\n})\nexport class FormErrorPipe implements PipeTransform, OnDestroy {\n  private _value = '';\n  private _lastForm: UntypedFormGroup | null = null;\n  private _lastOptions: FormErrorTranslateOptions | null = null;\n  private _onFormStatusChanges: Subscription | undefined;\n\n  constructor(\n    private service: FormErrorTranslator,\n    private _ref: ChangeDetectorRef\n  ) {}\n\n  transform(form: UntypedFormGroup, opts?: FormErrorTranslateOptions): string {\n    if (!form) {\n      this._dispose();\n      return '';\n    }\n\n    // if we ask another time for the same form and opts, return the last value\n    if (form === this._lastForm && equals(opts, this._lastOptions)) {\n      return this._value;\n    }\n\n    // store the query, in case it changes\n    this._lastForm = form;\n\n    // store the params, in case they change\n    this._lastOptions = opts;\n\n    // set the value\n    this._updateValue(form, opts);\n\n    // if there is a subscription to onLangChange, clean it\n    this._dispose();\n\n    // subscribe to onTranslationChange event, in case the translations change\n    if (!this._onFormStatusChanges) {\n      this._onFormStatusChanges = form.statusChanges.subscribe((status) => {\n        this._updateValue(form, opts, status);\n      });\n    }\n\n    return this._value;\n  }\n\n  ngOnDestroy(): void {\n    this._dispose();\n  }\n\n  private _updateValue(form: UntypedFormGroup, opts?: FormErrorTranslateOptions, status?: any) {\n    if (status ? status === 'INVALID' : form.invalid) {\n      const newValue = this.service.translateFormErrors(form, opts);\n      if (newValue !== this._value) {\n        this._value = newValue;\n        this._ref.markForCheck();\n      }\n    } else if (this._value !== undefined) {\n      this._value = undefined;\n      this._ref.markForCheck();\n    }\n  }\n\n  /**\n   * Clean any existing subscription to change events\n   */\n  private _dispose(): void {\n    this._onFormStatusChanges?.unsubscribe();\n    this._onFormStatusChanges = undefined;\n  }\n}\n\n/**\n * Same a FormErrorPipe\n * @deprecated use `formError` instead\n */\n@Pipe({\n  name: 'translateFormError',\n  pure: false,\n})\nexport class FormErrorTranslatePipe extends FormErrorPipe {\n  constructor(service: FormErrorTranslator, _ref: ChangeDetectorRef) {\n    super(service, _ref);\n  }\n  transform(form: UntypedFormGroup, opts?: FormErrorTranslateOptions): string {\n    return super.transform(form, opts);\n  }\n}\n\n@Pipe({\n  name: 'formGet',\n})\nexport class FormGetPipe implements PipeTransform {\n  transform(form: AbstractControl, path: Array<string | number> | string): AbstractControl {\n    return form.get(path);\n  }\n}\n\n@Pipe({\n  name: 'formGetControl',\n})\nexport class FormGetControlPipe implements PipeTransform {\n  transform(form: AbstractControl, path?: Array<string | number> | string): UntypedFormControl {\n    return (form && isNotNil(path) ? form.get(path) : form) as UntypedFormControl;\n  }\n}\n\n@Pipe({\n  name: 'formGetArray',\n})\nexport class FormGetArrayPipe implements PipeTransform {\n  transform(form: AbstractControl, path?: Array<string | number> | string): UntypedFormArray {\n    return (form && isNotNil(path) ? form.get(path) : form) as UntypedFormArray;\n  }\n}\n\n@Pipe({\n  name: 'formAtControl',\n})\nexport class FormArrayAtControlPipe implements PipeTransform {\n  transform(form: FormArray, index: number): UntypedFormControl {\n    return form?.at(index) as UntypedFormControl;\n  }\n}\n\n@Pipe({\n  name: 'formGetGroup',\n})\nexport class FormGetGroupPipe implements PipeTransform {\n  transform(form: AbstractControl, path?: Array<string | number> | string): UntypedFormGroup {\n    return (form && isNotNil(path) ? form.get(path) : form) as UntypedFormGroup;\n  }\n}\n\n@Pipe({\n  name: 'formAtGroup',\n})\nexport class FormArrayAtGroupPipe implements PipeTransform {\n  transform(form: FormArray, index: number): UntypedFormGroup {\n    return form?.at(index) as UntypedFormGroup;\n  }\n}\n\n@Pipe({\n  name: 'formGetValue',\n  pure: false,\n})\nexport class FormGetValuePipe implements PipeTransform, OnDestroy {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _value: any = undefined;\n  private _lastControl: AbstractControl | null = null;\n  private _lastPath: Array<string | number> | string;\n  private _onControlValueChanges: Subscription | undefined;\n  private _onControlStatusChanges: Subscription | undefined;\n\n  constructor(private _ref: ChangeDetectorRef) {}\n\n  transform<T = any>(form: AbstractControl, path?: Array<string | number> | string, listenStatusChanges = false): T {\n    if (!form) {\n      this._dispose();\n      return undefined;\n    }\n\n    // if we ask another time for the same form and opts, return the last value\n    if (form === this._lastControl && equals(path, this._lastPath)) {\n      return this._value;\n    }\n\n    // store the query, in case it changes\n    this._lastControl = form;\n\n    // store the params, in case they change\n    this._lastPath = path;\n\n    // set the value\n    const control = path ? form.get(path) : form;\n    this._value = control?.value;\n\n    // if there is already a subscription, clean it\n    this._dispose();\n\n    if (control) {\n      // subscribe to valueChanges event\n      this._onControlValueChanges = control.valueChanges.subscribe((value) => {\n        if (value !== this._value) {\n          this._value = value;\n          this._ref.markForCheck();\n        }\n      });\n\n      // subscribe to statusChanges event\n      if (listenStatusChanges) {\n        this._onControlStatusChanges = control.statusChanges.subscribe(() => {\n          const value = control.value;\n          if (value !== this._value) {\n            this._value = value;\n            this._ref.markForCheck();\n          }\n        });\n      }\n    }\n\n    return this._value;\n  }\n\n  ngOnDestroy(): void {\n    this._dispose();\n  }\n\n  /**\n   * Clean any existing subscription to change events\n   */\n  private _dispose(): void {\n    this._onControlValueChanges?.unsubscribe();\n    this._onControlValueChanges = undefined;\n    this._onControlStatusChanges?.unsubscribe();\n    this._onControlStatusChanges = undefined;\n  }\n}\n\n\n@Pipe({\n  name: 'formGetName',\n})\nexport class FormGetNamePipe implements PipeTransform {\n  transform(control: AbstractControl): string {\n    return Object.keys(control?.parent?.controls || {}).find(key => control?.parent?.controls[key] === control);\n  }\n}\n","import { inject, Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { booleanToString, getPropertyByPath, isNil, isNotNil, joinPropertiesPath } from '../functions';\nimport { DateFormatService } from './date-format.pipe';\nimport { FormFieldDefinition } from '../form/field.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { DateUtils } from '../dates';\n\n@Pipe({ name: 'propertyGet' })\nexport class PropertyGetPipe implements PipeTransform {\n  transform(obj: any, args: string | Array<string | number> | { key: string; defaultValue?: any }): any {\n    return getPropertyByPath(\n      obj,\n      // Path\n      args && (typeof args === 'string' || Array.isArray(args) ? args : args.key),\n      // Default value\n      args && (args as any)?.defaultValue\n    );\n  }\n}\n\nabstract class AbstractValueFormatPipe {\n  private _i18nYes: string;\n  private _i18nNo: string;\n\n  private dateFormat = inject(DateFormatService);\n  private translate = inject(TranslateService);\n\n  get i18nYes(): string {\n    if (!this._i18nYes) {\n      this._i18nYes = this.translate.instant('COMMON.YES');\n    }\n    return this._i18nYes;\n  }\n\n  get i18nNo(): string {\n    if (!this._i18nNo) {\n      this._i18nNo = this.translate.instant('COMMON.NO');\n    }\n    return this._i18nNo;\n  }\n\n  protected valueToString(value: any, definition?: Partial<FormFieldDefinition>): string {\n    if (isNil(value)) return value;\n    const type = definition?.type || typeof value;\n    switch (type) {\n      case 'date':\n        const date = DateUtils.fromDateISOString(value);\n        return this.dateFormat.transform(date) as string;\n      case 'dateTime':\n        const dateTime = DateUtils.fromDateISOString(value);\n        return this.dateFormat.transform(dateTime, { time: true }) as string;\n      case 'enum': {\n        // DEBUG\n        // console.debug('formatProperty by definition (type='enum', key=' +definition.key+ '):', value );\n        const key = value.key ?? value;\n        const item = ((definition?.values as any[]) || [value]).find((item) => (isNotNil(item?.key) ? item.key : item) === key);\n        return item?.value ?? item ?? value;\n      }\n      case 'object':\n      case 'entity': {\n        if (typeof definition?.autocomplete?.displayWith === 'function') {\n          return definition.autocomplete.displayWith(value);\n        }\n        return joinPropertiesPath(value, definition?.autocomplete?.attributes || ['label', 'name']) || undefined;\n      }\n      case 'entities':\n      case 'enums': {\n        const values = Array.isArray(value) ? value : [value];\n        return values.map((val) => this.valueToString(val, { type: 'enum' })).join(', ');\n      }\n      case 'boolean':\n        return booleanToString(value, { yesLabel: this.i18nYes, noLabel: this.i18nNo });\n      case 'integer':\n      case 'double':\n      case 'string':\n      default:\n        return value;\n    }\n  }\n}\n\n@Pipe({\n  name: 'propertyFormat',\n})\n@Injectable({ providedIn: 'root' })\nexport class PropertyFormatPipe extends AbstractValueFormatPipe implements PipeTransform {\n  transform(obj: any, args: string | Array<string | number> | FormFieldDefinition): string | Promise<string> {\n    if (!obj) return '';\n    const definition = typeof args === 'object' ? (args as FormFieldDefinition) : undefined;\n    const path = definition ? definition.key : (args as (string | number)[]);\n    const value = getPropertyByPath(obj, path);\n    return this.valueToString(value, definition);\n  }\n}\n\n@Pipe({\n  name: 'valueFormat',\n})\n@Injectable({ providedIn: 'root' })\nexport class ValueFormatPipe extends AbstractValueFormatPipe implements PipeTransform {\n  transform(value: any, definition: FormFieldDefinition): string | Promise<string> {\n    return this.valueToString(value, definition);\n  }\n}\n\n@Pipe({\n  name: 'booleanFormat',\n})\nexport class BooleanFormatPipe extends AbstractValueFormatPipe implements PipeTransform {\n  transform(value: any, opts?: { yesLabel: string; noLabel: string }): string {\n    if (isNil(value)) return value;\n    if (!opts) opts = { yesLabel: this.i18nYes, noLabel: this.i18nNo };\n    return booleanToString(value, opts);\n  }\n}\n\n@Pipe({\n  name: 'mapTo',\n})\nexport class MapToPipe implements PipeTransform {\n  transform<T, R>(value: T, mapFn: (value: T, ...args: any[]) => R, ...otherArguments: any[]): R {\n    return mapFn.call(this, value, ...otherArguments);\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { AppColors } from '../types';\nimport { ThemePalette } from '@angular/material/core';\n\n@Pipe({\n  name: 'matColor',\n})\nexport class MatColorPipe implements PipeTransform {\n  transform(color: AppColors): ThemePalette | undefined {\n    if (!color) return undefined;\n    switch (color) {\n      // Redirect 'secondary' and 'tertiary' to primary (not exists in material theme)\n      case 'secondary':\n      case 'tertiary':\n        return 'primary';\n      case 'warning':\n        return 'warn';\n      case 'medium':\n        return undefined; // Use default\n      default:\n        return color as ThemePalette;\n    }\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { isObservable, Observable } from 'rxjs';\nimport { FloatLabelType } from '@angular/material/form-field';\nimport { toBoolean } from '../functions';\nimport { AppFloatLabelType } from '../types';\n\n@Pipe({\n  name: 'asAny',\n})\nexport class AsAnyPipe implements PipeTransform {\n  transform<T = any>(value: unknown | any): T | null {\n    if (value === null || value === undefined) return null;\n    return value as T;\n  }\n}\n\n@Pipe({\n  name: 'asArray',\n})\nexport class AsArrayPipe implements PipeTransform {\n  transform<T = any>(value: unknown): T[] | null {\n    return Array.isArray(value) ? (value as any[]) : null;\n  }\n}\n\n@Pipe({\n  name: 'asObservable',\n})\nexport class AsObservablePipe implements PipeTransform {\n  transform<T = any>(value: unknown): Observable<T> | null {\n    return isObservable(value) ? (value as Observable<T>) : null;\n  }\n}\n\n@Pipe({\n  name: 'asFloatLabelType',\n})\nexport class AsFloatLabelTypePipe implements PipeTransform {\n  transform(value: AppFloatLabelType): FloatLabelType | null {\n    return value === 'never' ? null : value;\n  }\n}\n\n@Pipe({\n  name: 'asBoolean',\n})\nexport class AsBooleanPipe implements PipeTransform {\n  transform(value: any, opts?: boolean | ((value: any, ...args: any[]) => boolean), ...args: any[]): boolean {\n    if (typeof opts === 'function') return opts(value, ...args);\n    return toBoolean(value, opts);\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { isNilOrBlank, isNotNil } from '../functions';\nimport { MaskitoMask, MaskitoOptions, MaskitoPlugin } from '@maskito/core';\nimport { maskitoEventHandler, maskitoWithPlaceholder } from '@maskito/kit';\nimport { getCaretPosition, getInputRangeFromCaretIndex, getInputSelectionRangesFromMask, selectInputRange } from '../inputs';\n\nexport type MaskitoPlaceholderPipeOptions = { defaultPrefix?: string; noDefaults?: boolean } & Partial<MaskitoOptions>;\n\n@Pipe({\n  name: 'maskitoPlaceholder',\n})\nexport class MaskitoPlaceholderPipe implements PipeTransform {\n  transform(placeholder: string, mask: MaskitoMask, opts?: MaskitoPlaceholderPipeOptions): MaskitoOptions {\n    if (isNilOrBlank(placeholder)) return { mask };\n\n    const plugins = [];\n    const preprocessors = [];\n    const postprocessors = [];\n\n    if (!opts?.noDefaults) {\n      const placeholderOptions = maskitoWithPlaceholder(placeholder, true);\n      plugins.push(...placeholderOptions.plugins);\n      preprocessors.push(...placeholderOptions.preprocessors);\n      postprocessors.push(...placeholderOptions.postprocessors);\n    }\n    plugins.push(...(opts?.plugins || []));\n    preprocessors.push(...(opts?.preprocessors || []));\n    postprocessors.push(...(opts?.postprocessors || []));\n\n    if (isNotNil(opts?.defaultPrefix)) {\n      plugins.push(maskitoPrefixPlugin(opts.defaultPrefix, placeholder));\n    }\n    plugins.push(maskitoAutoSelectByMaskPattern());\n\n    return {\n      overwriteMode: opts?.overwriteMode || 'replace',\n      plugins,\n      preprocessors,\n      postprocessors,\n      mask,\n    };\n  }\n}\n\nexport function maskitoPrefixPlugin(prefix: string, placeholder?: string): MaskitoPlugin {\n  return maskitoEventHandler('focus', (element: HTMLInputElement | HTMLTextAreaElement, options: Required<MaskitoOptions>) => {\n    if (element.value === '') {\n      element.value = prefix;\n      element.dispatchEvent(new Event('input'));\n    } else if (element.value === placeholder) {\n      element.value = prefix + placeholder.substring(prefix.length);\n      element.dispatchEvent(new Event('input'));\n    }\n  });\n}\n\nexport function maskitoAutoSelectByMaskPattern(): MaskitoPlugin {\n  return maskitoEventHandler('click', (element: HTMLInputElement | HTMLTextAreaElement, options: Required<MaskitoOptions>) => {\n    if (options?.mask instanceof Array) {\n      const caretIndex = getCaretPosition(element);\n      const maskPatternInputRanges = getInputSelectionRangesFromMask(options.mask);\n      const selectedInputRange = getInputRangeFromCaretIndex(caretIndex, maskPatternInputRanges);\n      if (isNotNil(selectedInputRange)) {\n        selectInputRange(element, selectedInputRange[0], selectedInputRange[1] + 1);\n      }\n    }\n  });\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { SelectionChange, SelectionModel } from '@angular/cdk/collections';\nimport { Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { equals } from '../functions';\n\n@Pipe({\n  name: 'abstract-selection',\n})\nexport abstract class AbstractSelectionModelPipe<T, R, O = void> implements PipeTransform, OnDestroy {\n  protected _result: R = undefined;\n\n  private _lastSelection: SelectionModel<any> | null = null;\n  private _lastValue: T;\n  private _lastOpts: O;\n  protected _shouldSubscribeToChanges = true;\n  private _onSelectionChanges: Subscription | undefined;\n\n  protected constructor(protected _ref: ChangeDetectorRef) {}\n\n  transform(selection: SelectionModel<any>, value?: T, opts?: O): R {\n    if (!selection) {\n      this._dispose();\n      return undefined;\n    }\n\n    // if we ask another time for the same form and opts, return the last value\n    if (selection === this._lastSelection && value === this._lastValue && equals(opts, this._lastOpts)) {\n      return this._result;\n    }\n\n    // store the query, in case it changes\n    this._lastSelection = selection;\n\n    // store the params, in case they change\n    this._lastValue = value;\n    this._lastOpts = opts;\n\n    // set the result\n    this._result = this._transform(selection, value, opts);\n\n    // if there is already a subscription, clean it\n    this._dispose();\n\n    // subscribe to valueChanges event\n    if (this._shouldSubscribeToChanges) {\n      this._onSelectionChanges = this._subscribe(selection, value, opts);\n    }\n\n    return this._result;\n  }\n\n  ngOnDestroy(): void {\n    this._dispose();\n  }\n\n  protected _subscribe(selection: SelectionModel<T>, value: T, opts?: O): Subscription {\n    // subscribe to valueChanges event\n    return selection.changed.pipe(filter((selectionChange) => this._filterSelectionChange(selectionChange, value, opts))).subscribe((_) => {\n      const result = this._transform(selection, value);\n      if (this._result !== result) {\n        this._result = result;\n        this._ref.markForCheck();\n      }\n    });\n  }\n\n  /**\n   * Clean any existing subscription to change events\n   */\n  protected _dispose(): void {\n    this._onSelectionChanges?.unsubscribe();\n    this._onSelectionChanges = undefined;\n  }\n\n  protected abstract _transform(selection: SelectionModel<T>, value?: T, opts?: O): R;\n\n  protected _filterSelectionChange(selectionChange: SelectionChange<any>, value?: T, opts?: O): boolean {\n    return true;\n  }\n}\n\n@Pipe({\n  name: 'isSelected',\n  pure: false,\n})\nexport class IsSelectedPipe extends AbstractSelectionModelPipe<any, boolean> implements PipeTransform, OnDestroy {\n  constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n  protected _transform(selection: SelectionModel<any>, value: any): boolean {\n    return selection.isSelected(value);\n  }\n\n  protected _filterSelectionChange(selectionChange: SelectionChange<any>, value: any) {\n    return selectionChange?.added?.includes(value) || selectionChange?.removed?.includes(value) || false;\n  }\n}\n\n@Pipe({\n  name: 'isNotEmptySelection',\n  pure: false,\n})\nexport class IsNotEmptySelectionPipe extends AbstractSelectionModelPipe<void, boolean> implements PipeTransform, OnDestroy {\n  constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n  protected _transform(selection: SelectionModel<any>): boolean {\n    return selection.hasValue();\n  }\n}\n\n@Pipe({\n  name: 'isEmptySelection',\n  pure: false,\n})\nexport class IsEmptySelectionPipe extends AbstractSelectionModelPipe<void, boolean> {\n  constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n  protected _transform(selection: SelectionModel<any>): boolean {\n    return selection.isEmpty();\n  }\n}\n\n@Pipe({\n  name: 'selectionLength',\n  pure: false,\n})\nexport class SelectionLengthPipe extends AbstractSelectionModelPipe<void, number> implements PipeTransform, OnDestroy {\n  constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n  protected _transform(selection: SelectionModel<any>): number {\n    return selection.selected.length;\n  }\n}\n\n@Pipe({\n  name: 'isMultipleSelection',\n  pure: false,\n})\nexport class IsMultipleSelectionPipe extends AbstractSelectionModelPipe<void, boolean> implements PipeTransform, OnDestroy {\n  constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n  protected _transform(selection: SelectionModel<any>): boolean {\n    return selection.isMultipleSelection();\n  }\n}\n\n@Pipe({\n  name: 'isSingleSelection',\n  pure: false,\n})\nexport class IsSingleSelectionPipe extends AbstractSelectionModelPipe<void, boolean> {\n  constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n  protected _transform(selection: SelectionModel<any>): boolean {\n    return selection.selected.length === 1;\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { isNotNilOrNaN } from '../functions';\n\n@Pipe({\n  name: 'badgeNumber',\n})\nexport class BadgeNumberPipe implements PipeTransform {\n  transform(val: number, max = 99): string {\n    if (isNotNilOrNaN(val)) {\n      if (val > max) {\n        return max.toFixed(0) + '+';\n      }\n      return val.toFixed(0);\n    } else {\n      return '';\n    }\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport {\n  capitalizeFirstLetter,\n  changeCaseToUnderscore,\n  isNil,\n  isNilOrBlank,\n  isNilOrNaN,\n  isNotNil,\n  isNotNilOrBlank,\n  isNotNilOrNaN,\n} from '../functions';\n\n@Pipe({\n  name: 'isNotNilOrBlank',\n})\nexport class IsNotNilOrBlankPipe implements PipeTransform {\n  transform(value: string): boolean {\n    return isNotNilOrBlank(value);\n  }\n}\n\n@Pipe({\n  name: 'isNilOrBlank',\n})\nexport class IsNilOrBlankPipe implements PipeTransform {\n  transform(value: string): boolean {\n    return isNilOrBlank(value);\n  }\n}\n\n@Pipe({\n  name: 'isNilOrNaN',\n})\nexport class IsNilOrNaNPipe implements PipeTransform {\n  transform(value: number): boolean {\n    return isNilOrNaN(value);\n  }\n}\n\n@Pipe({\n  name: 'isNotNilOrNaN',\n})\nexport class IsNotNilOrNaNPipe implements PipeTransform {\n  transform(value: number): boolean {\n    return isNotNilOrNaN(value);\n  }\n}\n\n@Pipe({\n  name: 'isNotNil',\n})\nexport class IsNotNilPipe implements PipeTransform {\n  transform(value: any): boolean {\n    return isNotNil(value);\n  }\n}\n\n@Pipe({\n  name: 'isNil',\n})\nexport class IsNilPipe implements PipeTransform {\n  transform(value: any): boolean {\n    return isNil(value);\n  }\n}\n\n@Pipe({\n  name: 'toString',\n})\nexport class ToStringPipe implements PipeTransform {\n  transform<T>(value: T, displayWith?: (obj: T, ...args: any[]) => string, ...otherArguments: any[]): string {\n    if (displayWith) return displayWith(value, otherArguments);\n    return value !== null && value !== undefined ? value.toString() : '';\n  }\n}\n\n@Pipe({\n  name: 'capitalize',\n})\nexport class CapitalizePipe implements PipeTransform {\n  transform(value: string): string {\n    return capitalizeFirstLetter(value);\n  }\n}\n\n@Pipe({\n  name: 'strLength',\n})\nexport class StrLengthPipe implements PipeTransform {\n  transform(value: string): number {\n    return (value && value.length) || 0;\n  }\n}\n\n@Pipe({\n  name: 'strIncludes',\n})\nexport class StrIncludesPipe implements PipeTransform {\n  transform(value: string, searchString: string, position?: number): boolean {\n    return value?.includes(searchString, position) || false;\n  }\n}\n\n@Pipe({\n  name: 'replace',\n})\nexport class StrReplacePipe implements PipeTransform {\n  transform(input: string, searchValue: string | RegExp, replacement: string): any {\n    if (typeof input !== 'string' || isNilOrBlank(searchValue) || isNil(replacement)) {\n      return input;\n    }\n\n    return input.replace(searchValue, replacement);\n  }\n}\n\n@Pipe({\n  name: 'truncText',\n})\nexport class TruncTextPipe implements PipeTransform {\n  transform(input: string, size = 60, ellipsis = true, ellipsisText = '...'): any {\n    if (!(input?.length > 3) || input.length <= size) return input;\n    return input.substring(0, size - 3) + (ellipsis ? ellipsisText : '');\n  }\n}\n\n@Pipe({\n  name: 'changeCaseToUnderscore',\n})\nexport class ChangeCaseToUnderscorePipe implements PipeTransform {\n  transform(value: string): string {\n    return changeCaseToUnderscore(value);\n  }\n}\n\n@Pipe({\n  name: 'truncHtml',\n})\nexport class TruncHtmlPipe implements PipeTransform {\n  transform(input: string, size = 500, ellipsis = true, ellipsisText = ' (...)'): any {\n    if (!(input?.length > 3) || input.length <= size) return input;\n    const endIndex = Math.max(input.lastIndexOf(' ', size), input.lastIndexOf('<', size));\n    return input.substring(0, endIndex) + (ellipsis ? ellipsisText : '');\n  }\n}\n","/**\n * Removes all HTML tags from a given string.\n *\n * @param {string} value - The input string potentially containing HTML tags.\n * @return {string} A string with all HTML tags removed.\n */\nexport function noHtml(value: string): string {\n  if (value && typeof value === 'string') {\n    // Use regular expression to remove all HTML tags\n    return value.replace(/<[^>]*>.*?<\\/[^>]*>|<[^>]+>/g, '');\n  } else {\n    return value;\n  }\n}\n\n\n/**\n * Truncates the given HTML string to the specified maximum length, ensuring that the truncation\n * does not break HTML structure and attempts to truncate at word or tag boundaries when possible.\n * Appends an ellipsis (\" (...)\") to indicate truncation if the content exceeds the maximum length.\n *\n * @param {string} html - The HTML string to be truncated.\n * @param {number} maxLength - The maximum length for the truncated string, including the ellipsis.\n * @return {string} The truncated HTML string, or the original HTML string if its length is within the maximum length.\n */\nexport function truncateHtml(html: string, maxLength: number): string {\n  maxLength = maxLength ?? 0;\n  if (!html || maxLength <= 0) return html;\n  if (html?.length > maxLength) {\n    const endIndex = Math.max(html.lastIndexOf(' ', maxLength), html.lastIndexOf('<', maxLength));\n    return html.substring(0, endIndex) + ' (...)';\n  }\n  return html;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { noHtml, truncateHtml } from '../html.utils';\n\n/**\n * A custom Angular pipe that removes all HTML tags from a provided string.\n * This is useful for cases where HTML content needs to be sanitized or plain text is required.\n * Applies a function to strip HTML tags from the input value.\n *\n * It implements the `PipeTransform` interface provided by Angular to define its transformation logic.\n */\n@Pipe({\n  name: 'noHtml',\n})\nexport class NoHtmlPipe implements PipeTransform {\n  transform(value: string): string {\n    return noHtml(value);\n  }\n}\n\n@Pipe({\n  name: 'safeHtml',\n})\n/**\n * SafeHtmlPipe is a custom Angular pipe designed to sanitize and transform\n * potentially unsafe HTML content into safe HTML. It leverages the noHtml\n * function to strip away any HTML tags from the input string, ensuring that\n * the output string is safe for display in the frontend without risking\n * security vulnerabilities like Cross-Site Scripting (XSS) attacks.\n *\n * This pipe can be used when there is a need to render user-generated or\n * dynamically fetched HTML content safely within an Angular application.\n *\n * Methods:\n * - transform: Accepts a string as input and returns a sanitized version\n *              of the string with HTML tags removed.\n */\nexport class SafeHtmlPipe implements PipeTransform {\n  constructor(private sanitized: DomSanitizer) {}\n  transform(value: string): SafeHtml {\n    return this.sanitized.bypassSecurityTrustHtml(value);\n  }\n}\n\n@Pipe({\n  name: 'safeStyle',\n})\nexport class SafeStylePipe implements PipeTransform {\n  constructor(private sanitized: DomSanitizer) {}\n  transform(value: string): SafeHtml {\n    return this.sanitized.bypassSecurityTrustStyle(value);\n  }\n}\n\n\n/**\n * A custom Angular pipe that truncates an HTML string to a specified maximum length.\n * This pipe ensures that the HTML structure remains valid and properly closed,\n * even after truncation.\n *\n * It uses the `truncateHtml` function internally to handle the truncation logic.\n * This can be useful when there is a need to display a shortened version of an HTML\n * formatted string while preserving its structure.\n *\n * @pipe TruncateHtmlPipe\n * @member {string} name - The name to use for this pipe in Angular templates.\n * @method transform - Takes an HTML string input and truncates it to the specified length.\n * @param value - The HTML string to be truncated.\n * @param maxLength - The maximum length for the truncated string.\n * @returns The truncated HTML string with valid structure.\n */\n@Pipe({\n  name: 'truncateHtml',\n})\nexport class TruncateHtmlPipe implements PipeTransform {\n  transform(value: string, maxLength: number): string {\n    return truncateHtml(value, maxLength);\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { isNil } from '../functions';\n\n@Pipe({\n  name: 'displayWith',\n})\n@Injectable({ providedIn: 'root' })\nexport class DisplayWithPipe implements PipeTransform {\n  transform(value: any, displayFn: (any) => string): string {\n    if (isNil(value) || !displayFn) return '';\n    return displayFn(value);\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Moment } from 'moment';\nimport { DateUtils, fromDateISOString } from '../dates';\n\n@Pipe({\n  name: 'isValidDate',\n})\nexport class IsValidDatePipe implements PipeTransform {\n  transform(value: string | Moment, opts?: { requiredTime?: boolean }): boolean {\n    const date = fromDateISOString(value);\n    return date?.isValid() && (!opts?.requiredTime || !DateUtils.isNoTime(date));\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { isObservable, Observable } from 'rxjs';\nimport { firstFalse, FirstOptions, firstTrue } from '../observables';\nimport { first, map } from 'rxjs/operators';\n\n@Pipe({\n  name: 'firstTrue',\n})\nexport class FirstTruePipe implements PipeTransform {\n  transform(value: Observable<boolean>, opts?: FirstOptions): Observable<boolean> {\n    return firstTrue(value, opts, true);\n  }\n}\n\n@Pipe({\n  name: 'firstFalse',\n})\nexport class FirstFalsePipe implements PipeTransform {\n  transform(value: Observable<boolean>, opts?: FirstOptions): Observable<boolean> {\n    return firstFalse(value, opts, false);\n  }\n}\n\n@Pipe({\n  name: 'first',\n})\nexport class FirstPipe implements PipeTransform {\n  transform<T = any>(value: Observable<T>): Observable<T> {\n    return value.pipe(first());\n  }\n}\n\n@Pipe({\n  name: 'map',\n})\nexport class MapPipe implements PipeTransform {\n  transform<T, R>(value: Observable<T>, mapFn: (value: T, ...args: any[]) => R, ...otherArguments: any[]): Observable<R>;\n  transform<T, R>(value: T, mapFn: (value: T, ...args: any[]) => R, ...otherArguments: any[]): R;\n  transform<T, R>(value: Observable<T> | T, mapFn: (value: T, ...args: any[]) => R, ...otherArguments: any[]): Observable<R> | R {\n    if (isObservable(value)) {\n      return value.pipe(map((v) => mapFn.call(this, v, ...otherArguments)));\n    } else {\n      return mapFn.call(this, value, ...otherArguments);\n    }\n  }\n}\n","import { isNilOrBlank, isNotNil, noTrailingSlash } from '../functions';\n\nexport abstract class UrlUtils {\n  /**\n   * Determines if a given URL is a relative URL.\n   *\n   * @param {string | null} href - The URL to check.\n   * @return {boolean} True if the URL is relative, false otherwise.\n   */\n  static isRelativeUrl(href: string | null): boolean {\n    if (!href) return false;\n    return !href.startsWith('http:') && !href.startsWith('https:') && !href.startsWith('mailto:') && !href.startsWith('tel:');\n  }\n\n  /**\n   * Determines if a given URL is an internal URL.\n   *\n   * @param {string | null} href - The URL to be checked. Can be a string representing the URL or null.\n   * @return {boolean} Returns true if the URL is internal, otherwise false.\n   */\n  static isInternalUrl(href: string | null): boolean {\n    if (!href) return false;\n    return href.startsWith(window.location.origin) || this.isRelativeUrl(href);\n  }\n\n  static isExternalUrl(href: string | null): boolean {\n    if (!href) return false;\n    return !this.isInternalUrl(href);\n  }\n\n  /**\n   * Removes the query string from the given URL, returning only the base URL.\n   *\n   * @param {string} url - The URL from which the query string will be stripped.\n   * @return {string} The URL without the query string.\n   */\n  static stripQuery(url: string): string {\n    if (!url) return url;\n    return /[^?]*/.exec(url)[0];\n  }\n\n  /**\n   * Removes the fragment and query components from a given URL string.\n   *\n   * @param {string} url - The URL string to process.\n   * @return {string} The URL without its fragment and query components.\n   */\n  static stripFragmentAndQuery(url: string): string {\n    if (!url) return url;\n    return this.stripQuery(/[^#]*/.exec(url)[0]);\n  }\n\n  /**\n   * Extracts the fragment identifier from the given URL.\n   *\n   * @param {string} url - The URL from which to extract the fragment.\n   * @return {string} The fragment identifier of the URL, excluding the '#' symbol.\n   */\n  static getFragment(url: string): string {\n    if (isNilOrBlank(url)) return '';\n\n    const match = url.match(/#(.*)$/);\n    return match ? match[1] : '';\n  }\n\n  static resolveRelativeUrl(baseUrl: string, relativePath: string, opts?: { absoluteByDefault: boolean }): string {\n    if (!baseUrl) throw new Error(\"Missing 'baseUrl' argument\");\n    if (!relativePath) throw new Error(\"Missing 'relativePath' argument\");\n    if (!this.isRelativeUrl(relativePath)) throw new Error('Should be a relative path');\n\n    // Detect absolute URL\n    if (relativePath.startsWith('/') || (opts?.absoluteByDefault && !relativePath.startsWith('.'))) {\n      baseUrl = this.getRootUrl(baseUrl);\n    }\n\n    return UrlUtils.normalizeUrl(UrlUtils.concat(baseUrl, relativePath));\n  }\n\n  /**\n   * Resolves a given URL by normalizing its parts, removing unnecessary path segments like \".\" and \"..\".\n   *\n   * @param {string} url - The URL to be resolved. Must be a non-empty string.\n   * @return {string} The resolved and cleaned URL string.\n   * @throws {Error} If the provided URL is missing or undefined.\n   */\n  static normalizeUrl(url: string): string {\n    if (!url) throw new Error(\"Missing 'url' argument\");\n    return this.cleanUrl(url)\n      .split('/')\n      .reduce((res, part) => {\n        if (part === '.') return res;\n        if (part === '..' && res.length > 0) return res.slice(0, -1);\n        return res.concat(part);\n      }, [])\n      .join('/');\n  }\n\n  /**\n   * This function completes a base URL with an object containing key-value pairs\n   * representing the query parameters to add. It properly encodes the\n   * parameters and ensures they are added with the appropriate separator ('?' or '&').\n   * Parameters with null or undefined values are automatically filtered out.\n   *\n   * @example\n   * // In a template\n   * <a [href]=\"'https://example.com' | appendQueryParams:{id: 123, name: 'test'}\">Link</a>\n   * // Result: https://example.com?id=123&name=test\n   *\n   * @example\n   * // If the URL already contains parameters\n   * <a [href]=\"'https://example.com?page=1' | appendQueryParams:{sort: 'asc'}\">Link</a>\n   * // Result: https://example.com?page=1&sort=asc\n   *\n   * @param url\n   * @param queryParams\n   */\n  static appendQueryParams(url: string | any[], queryParams: { [key: string]: any }): string {\n    const urlStr = typeof url === 'string' ? url : this.addStartingSlash(url.join('/'));\n    if (isNilOrBlank(urlStr) || !queryParams) return urlStr;\n    const queryString = Object.entries(queryParams)\n      .filter(([_, value]) => isNotNil(value))\n      .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n      .join('&');\n    if (isNilOrBlank(queryString)) return urlStr;\n    return urlStr + (urlStr.includes('?') ? '&' : '?') + queryString;\n  }\n\n  /**\n   * Extracts and returns the root URL from the given complete URL string.\n   *\n   * @param {string} url - The complete URL string from which the root URL will be extracted.\n   * @return {string} The root URL including the protocol and host (and port if present).\n   * @throws {Error} Throws an error if the provided URL is missing or is in an invalid format.\n   */\n  static getRootUrl(url: string): string {\n    if (!url) throw new Error(\"Missing 'url' argument\");\n    let [protocol, path] = url.split('//', 2);\n    if (!protocol || isNilOrBlank(path)) throw new Error(`Invalid URL format: ${url}`);\n    const hostAndPort = path.split('/', 2)[0];\n    return `${protocol}//${hostAndPort}`;\n  }\n\n  /**\n   * Retrieves the parent URL or directory path from the provided URL.\n   * This method handles both relative and absolute URLs.\n   *\n   * @param {string} url - The URL from which to derive the parent path.\n   *                       Must be a valid URL or relative path.\n   * @return {string} The parent URL or directory path. Throws an error if the input is invalid.\n   */\n  static getParent(url: string): string {\n    if (!url) throw new Error(\"Missing 'url' argument\");\n    const cleanUrl = this.stripFragmentAndQuery(url);\n    if (cleanUrl.endsWith('/')) return cleanUrl; // Skip if already a parent directory\n    const parentPath = cleanUrl + '/' + '..';\n    if (this.isRelativeUrl(url)) {\n      return this.resolveRelativeUrl(window.location.href, parentPath);\n    }\n    return this.normalizeUrl(parentPath);\n  }\n\n  /**\n   * Cleans the provided URL by encoding it safely and replacing specific patterns.\n   *\n   * @param {string} href - The URL string to be cleaned.\n   * @return {string|null} The cleaned and encoded URL string, or null if an error occurs.\n   */\n  static cleanUrl(href: string): string {\n    try {\n      href = encodeURI(href).replace(/%25/g, '%');\n    } catch (e) {\n      return null;\n    }\n    return href;\n  }\n\n  static addTrailingSlash(url: string): string {\n    if (!url) return '/';\n    return url.endsWith('/') ? url : url + '/';\n  }\n\n  static addStartingSlash(url: string): string {\n    if (!url) return '/';\n    return url.startsWith('/') ? url : '/' + url;\n  }\n\n  static removeStartingSlash(url: string): string {\n    if (!url) return '';\n    return url.startsWith('/') ? url.substring(1) : url;\n  }\n\n  static concat(basePath: string, relativePath: string): string {\n    if (!basePath) return relativePath;\n    if (!relativePath) return basePath;\n    return this.addTrailingSlash(basePath) + this.removeStartingSlash(relativePath);\n  }\n\n  /**\n   * Cleans the given pathname by replacing occurrences of multiple consecutive slashes with a single slash.\n   *\n   * @param {string} pathname - The pathname to be cleaned.\n   * @return {string} The cleaned pathname with redundant slashes removed.\n   */\n  static cleanPath(pathname: string): string {\n    return pathname?.replace(/\\/\\/+/, '/');\n  }\n\n  static noTrailingSlash = noTrailingSlash;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { UrlUtils } from '../file/url.utils';\n\n/**\n * Pipe permettant d'ajouter des paramètres de requête à une URL.\n *\n * Cette pipe prend une URL de base et un objet contenant des paires clé-valeur\n * représentant les paramètres de requête à ajouter. Elle encode correctement les\n * paramètres et s'assure de les ajouter avec le séparateur approprié ('?' ou '&').\n * Les paramètres avec des valeurs nulles ou undefined sont automatiquement filtrés.\n *\n * @example\n * // Dans un template\n * <a [href]=\"'https://example.com' | appendQueryParams:{id: 123, name: 'test'}\">Lien</a>\n * // Résultat: https://example.com?id=123&name=test\n *\n * @example\n * // Si l'URL contient déjà des paramètres\n * <a [href]=\"'https://example.com?page=1' | appendQueryParams:{sort: 'asc'}\">Lien</a>\n * // Résultat: https://example.com?page=1&sort=asc\n */\n@Pipe({\n  name: 'appendQueryParams',\n})\nexport class AppendQueryParamsPipePipe implements PipeTransform {\n  transform(url: string, queryParams: { [key: string]: any }): any {\n    return UrlUtils.appendQueryParams(url, queryParams);\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { isMoment, Moment } from 'moment';\nimport { DATE_ISO_PATTERN } from '../constants';\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\n\n@Pipe({\n  name: 'dateFrom',\n})\n@Injectable({ providedIn: 'root' })\nexport class DateFromPipe implements PipeTransform {\n  constructor(private dateAdapter: MomentDateAdapter) {}\n\n  transform(value: string | Moment, otherValue: string | Moment, opts?: { suffix?: boolean }): string | Promise<string> {\n    const date: Moment = isMoment(value) ? (value as Moment) : this.dateAdapter.parse(value, DATE_ISO_PATTERN);\n    const otherDate: Moment = isMoment(otherValue) ? (otherValue as Moment) : this.dateAdapter.parse(otherValue, DATE_ISO_PATTERN);\n    return date && otherDate ? date.from(otherDate, opts?.suffix) : '';\n  }\n}\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {TranslateModule} from '@ngx-translate/core';\nimport {IonicModule} from '@ionic/angular';\nimport {DateFormatPipe} from './date-format.pipe';\nimport {DateDiffDurationPipe} from './date-diff-duration.pipe';\nimport {DateFromNowPipe} from './date-from-now.pipe';\nimport {LatitudeFormatPipe, LatLongFormatPipe, LongitudeFormatPipe} from './latlong-format.pipe';\nimport {NumberFormatPipe} from './number-format.pipe';\nimport {HighlightPipe} from './highlight.pipe';\nimport {FileSizePipe} from './file-size.pipe';\nimport {DurationPipe} from './duration.pipe';\nimport {EvenPipe, MathAbsPipe, OddPipe, RoundPipe} from './math.pipes';\nimport {\n  ArrayDistinctPipe,\n  ArrayFilterPipe,\n  ArrayFindByPropertyPipe,\n  ArrayFirstPipe,\n  ArrayIncludesPipe,\n  ArrayJoinPipe,\n  ArrayLastPipe,\n  ArrayLengthPipe,\n  ArrayMapPipe,\n  ArrayPluckPipe,\n  ArraySlicePipe,\n  ArraySortPipe,\n  EmptyArrayPipe,\n  NotEmptyArrayPipe,\n  SplitArrayInChunksPipe,\n} from './arrays.pipe';\nimport {MapGetPipe, MapKeysPipe, MapValuesPipe} from './maps.pipe';\nimport {TranslatablePipe, TranslateContextPipe} from './translate-context.pipe';\nimport {NgInitDirective} from './ng-init.pipe';\nimport {\n  FormArrayAtControlPipe,\n  FormArrayAtGroupPipe,\n  FormErrorPipe,\n  FormErrorTranslatePipe,\n  FormGetArrayPipe,\n  FormGetControlPipe,\n  FormGetGroupPipe,\n  FormGetNamePipe,\n  FormGetPipe,\n  FormGetValuePipe\n} from './form.pipes';\nimport {BooleanFormatPipe, MapToPipe, PropertyFormatPipe, PropertyGetPipe, ValueFormatPipe} from './property.pipes';\nimport {MatColorPipe} from './colors.pipe';\nimport {AsAnyPipe, AsArrayPipe, AsBooleanPipe, AsFloatLabelTypePipe, AsObservablePipe} from './types.pipes';\nimport {MaskitoPlaceholderPipe} from './maskito.pipe';\nimport {IsEmptySelectionPipe, IsMultipleSelectionPipe, IsNotEmptySelectionPipe, IsSelectedPipe, IsSingleSelectionPipe, SelectionLengthPipe,} from './selection.pipes';\nimport {BadgeNumberPipe} from './badge.pipes';\nimport {\n  CapitalizePipe,\n  ChangeCaseToUnderscorePipe,\n  IsNilOrBlankPipe,\n  IsNilOrNaNPipe,\n  IsNilPipe,\n  IsNotNilOrBlankPipe,\n  IsNotNilOrNaNPipe,\n  IsNotNilPipe,\n  StrIncludesPipe,\n  StrLengthPipe,\n  StrReplacePipe,\n  ToStringPipe,\n  TruncHtmlPipe,\n  TruncTextPipe,\n} from './string.pipes';\nimport {NoHtmlPipe, SafeHtmlPipe, SafeStylePipe, TruncateHtmlPipe} from './html.pipes';\nimport {DisplayWithPipe} from './display-with.pipe';\nimport {IsValidDatePipe} from './dates.pipe';\nimport {FirstFalsePipe, FirstPipe, FirstTruePipe, MapPipe} from './observable.pipes';\nimport {AppendQueryParamsPipePipe} from './url.pipes';\nimport {DateFromPipe} from './date-from.pipe';\n\nconst components = [\n  PropertyGetPipe,\n  PropertyFormatPipe,\n  ValueFormatPipe,\n  DateFormatPipe,\n  DateDiffDurationPipe,\n  DurationPipe,\n  DateFromPipe,\n  DateFromNowPipe,\n  LatLongFormatPipe,\n  LatitudeFormatPipe,\n  LongitudeFormatPipe,\n  HighlightPipe,\n  NumberFormatPipe,\n  FileSizePipe,\n  MathAbsPipe,\n  OddPipe,\n  EvenPipe,\n  RoundPipe,\n  NotEmptyArrayPipe,\n  EmptyArrayPipe,\n  ArrayLengthPipe,\n  ArrayFirstPipe,\n  ArrayLastPipe,\n  ArrayPluckPipe,\n  ArrayIncludesPipe,\n  ArrayFilterPipe,\n  ArrayJoinPipe,\n  ArrayDistinctPipe,\n  ArraySortPipe,\n  ArrayFindByPropertyPipe,\n  SplitArrayInChunksPipe,\n  ArrayMapPipe,\n  ArraySlicePipe,\n  MapGetPipe,\n  MapKeysPipe,\n  MapValuesPipe,\n  IsNilOrBlankPipe,\n  IsNotNilOrBlankPipe,\n  IsNilOrNaNPipe,\n  IsNotNilOrNaNPipe,\n  IsNotNilPipe,\n  IsNilPipe,\n  IsValidDatePipe,\n  ToStringPipe,\n  CapitalizePipe,\n  ChangeCaseToUnderscorePipe,\n  StrLengthPipe,\n  StrIncludesPipe,\n  StrReplacePipe,\n  TruncHtmlPipe,\n  TruncTextPipe,\n  AppendQueryParamsPipePipe,\n  BooleanFormatPipe,\n  MapToPipe,\n  TranslateContextPipe,\n  TranslatablePipe,\n  NgInitDirective,\n  FormErrorPipe,\n  FormErrorTranslatePipe,\n  FormGetPipe,\n  FormGetControlPipe,\n  FormGetArrayPipe,\n  FormGetGroupPipe,\n  FormGetValuePipe,\n  FormGetNamePipe,\n  FormArrayAtControlPipe,\n  FormArrayAtGroupPipe,\n  MatColorPipe,\n  AsAnyPipe,\n  AsArrayPipe,\n  AsObservablePipe,\n  AsFloatLabelTypePipe,\n  MaskitoPlaceholderPipe,\n  IsSelectedPipe,\n  IsNotEmptySelectionPipe,\n  IsEmptySelectionPipe,\n  SelectionLengthPipe,\n  IsMultipleSelectionPipe,\n  IsSingleSelectionPipe,\n  BadgeNumberPipe,\n  AsBooleanPipe,\n  SafeHtmlPipe,\n  SafeStylePipe,\n  NoHtmlPipe,\n  TruncateHtmlPipe,\n  DisplayWithPipe,\n  FirstTruePipe,\n  FirstFalsePipe,\n  FirstPipe,\n  MapPipe,\n];\n\n@NgModule({\n  imports: [CommonModule, IonicModule, TranslateModule],\n  declarations: components,\n  exports: components,\n})\nexport class SharedPipesModule {}\n","export const DEFAULT_MAX_DECIMALS = 7;\n\n// 111:11  = 111.11 (with maxDecimals=2)\nexport function parseDuration(input: string, maxDecimals?: number, placeholderChar?: string): number | null {\n  let duration = input || '';\n  // Make to remove placeholder chars\n  while (duration.indexOf(placeholderChar) !== -1) {\n    duration = duration.replace(placeholderChar, '');\n  }\n\n  const durationParts = duration.split(':');\n  const hour = parseInt(durationParts[0] || '0');\n  const minute = parseInt(durationParts[1] || '0');\n\n  const powDecimal = Math.pow(10, maxDecimals);\n  const value = hour + minute / 60;\n  return Math.trunc(value * powDecimal + 0.5) / powDecimal;\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  forwardRef,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Provider,\n  QueryList,\n  ViewChildren,\n} from '@angular/core';\nimport { Platform } from '@ionic/angular';\nimport { DateAdapter } from '@angular/material/core';\nimport {\n  ControlValueAccessor,\n  FormGroupDirective,\n  NG_VALUE_ACCESSOR,\n  UntypedFormBuilder,\n  UntypedFormControl,\n  ValidationErrors,\n  Validators,\n} from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Moment } from 'moment';\nimport { DEFAULT_PLACEHOLDER_CHAR } from '../../constants';\nimport { isBlankString, isNil, isNilOrBlank, isNotNilBoolean } from '../../functions';\nimport { InputElement, moveInputCaretToSeparator, setTabIndex } from '../../inputs';\nimport { isFocusableElement } from '../../focusable';\nimport { DEFAULT_MAX_DECIMALS, parseDuration } from './duration.utils';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\nimport { DateUtils } from '../../dates';\nimport { AppFloatLabelType } from '../../types';\n\nconst DEFAULT_VALUE_ACCESSOR: Provider = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => MatDuration),\n  multi: true,\n};\n\nconst HOUR_TIME_PATTERN = /[0-9]\\d\\d:[0-5]\\d/;\nconst DURATION_MASK = [/\\d/, /\\d/, /\\d/, ':', /[0-5]/, /\\d/];\n\nconst noop = () => {};\n\n@Component({\n  selector: 'mat-duration-field',\n  templateUrl: './material.duration.html',\n  styleUrls: ['./material.duration.scss'],\n  providers: [DEFAULT_VALUE_ACCESSOR],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatDuration implements OnInit, OnDestroy, ControlValueAccessor, InputElement {\n  private _subscription = new Subscription();\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n  private writing = true;\n  private disabling = false;\n  private _tabindex: number;\n  private _value: number;\n\n  textControl: UntypedFormControl;\n  maskitoPlaceholder: string;\n  readonly durationMask = DURATION_MASK;\n\n  @Input({ transform: booleanAttribute }) disabled = false;\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() placeholder: string;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() appearance: MatFormFieldAppearance;\n  @Input({ transform: booleanAttribute }) readonly = false;\n  @Input({ transform: booleanAttribute }) required: boolean;\n  @Input({ transform: booleanAttribute }) compact = false;\n  @Input() maxDecimals: number = DEFAULT_MAX_DECIMALS;\n  @Input() placeholderChar: string = DEFAULT_PLACEHOLDER_CHAR;\n\n  @Input() set tabindex(value: number) {\n    if (this._tabindex !== value) {\n      this._tabindex = value;\n      setTimeout(() => this.updateTabIndex());\n    }\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  @Input() clearable = false;\n\n  @ViewChildren('matInput') matInputs: QueryList<ElementRef>;\n\n  get value(): any {\n    return this._value;\n  }\n\n  protected dayUnit: string;\n\n  constructor(\n    platform: Platform,\n    private dateAdapter: DateAdapter<Moment>,\n    private translate: TranslateService,\n    private formBuilder: UntypedFormBuilder,\n    private cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective\n  ) {\n    this.dayUnit = translate.instant('COMMON.DAY_UNIT');\n    this.maskitoPlaceholder = translate.instant('COMMON.DURATION_PLACEHOLDER');\n  }\n\n  ngOnInit() {\n    if (this.maxDecimals) {\n      if (this.maxDecimals < 0) {\n        console.error(\"Invalid attribute 'maxDecimals'. Must a positive value.\");\n        this.maxDecimals = DEFAULT_MAX_DECIMALS;\n      } else if (this.maxDecimals < DEFAULT_MAX_DECIMALS) {\n        console.warn(\n          `Invalid attribute 'maxDecimals' - Value should be more than ${DEFAULT_MAX_DECIMALS}, otherwise the round trip conversion will lose minutes.`\n        );\n        this.maxDecimals = DEFAULT_MAX_DECIMALS;\n      }\n    }\n\n    this.formControl =\n      this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-duration-field>.\");\n\n    this.required = isNotNilBoolean(this.required)\n      ? this.required\n      : this.formControl.validator === Validators.required || isBlankString(this.required);\n\n    // Redirect errors from main control, into day sub control\n    const $error = new BehaviorSubject<ValidationErrors>(null);\n    this.textControl = this.formBuilder.control(null, null);\n    this.textControl.setValidators(\n      this.required\n        ? [Validators.required, () => $error.getValue(), Validators.pattern(HOUR_TIME_PATTERN)]\n        : [() => $error.getValue(), Validators.pattern(HOUR_TIME_PATTERN)]\n    );\n\n    this._subscription.add(this.textControl.valueChanges.subscribe((value) => this.onFormChange(value)));\n\n    // Listen status changes outside the component (e.g. when setErrors() is calling on the formControl)\n    this._subscription.add(\n      this.formControl.statusChanges\n        .pipe(filter(() => !this.readonly && !this.writing && !this.disabling)) // Skip\n        .subscribe((status) => {\n          if (status === 'INVALID') {\n            $error.next(this.formControl.errors);\n          } else if (status === 'VALID') {\n            $error.next(null);\n          }\n          this.textControl.updateValueAndValidity({ onlySelf: true, emitEvent: false });\n          this.markForCheck();\n        })\n    );\n\n    this.updateTabIndex();\n\n    this.writing = false;\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n\n  writeValue(obj: any): void {\n    if (this.writing) return;\n\n    // console.debug('[mat-duration] writeValue:', obj);\n\n    if (isNil(obj)) {\n      this.writing = true;\n      this.textControl.patchValue(null, { emitEvent: false });\n      this._value = undefined;\n      if (this.formControl.value) {\n        this.formControl.patchValue(null, { emitEvent: false });\n        this._onChangeCallback(null);\n      }\n      this.writing = false;\n      this.markForCheck();\n      return;\n    }\n\n    this._value = obj;\n    if (isNaN(this._value)) {\n      // invalid value\n      return;\n    }\n\n    this.writing = true;\n\n    // DEBUG\n    //console.debug(`[mat-duration] Formatted hour: ${this._value} to ${formatDuration(this._value)}`);\n\n    // Set form value\n\n    this.textControl.patchValue(DateUtils.durationToString(this._value, this.dayUnit), { emitEvent: false });\n    this.writing = false;\n    this.markForCheck();\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    if (this.disabling) return;\n\n    this.disabling = true;\n    this.disabled = isDisabled;\n    if (isDisabled) {\n      this.textControl.disable({ onlySelf: true, emitEvent: false });\n    } else {\n      this.textControl.enable({ onlySelf: true, emitEvent: false });\n    }\n    this.disabling = false;\n\n    this.markForCheck();\n  }\n\n  private onFormChange(value): void {\n    if (this.writing || value === this.maskitoPlaceholder || isNilOrBlank(value)) return; // Skip\n    this.writing = true;\n\n    // DEBUG\n    //console.debug('[mat-duration] onFormChange:', value);\n\n    if (this.textControl.hasError('pattern') || this.textControl.hasError('required')) {\n      this.formControl.markAsPending();\n      this.formControl.setErrors({\n        pattern: this.textControl.errors.pattern,\n        required: this.textControl.errors.required,\n      });\n      this.writing = false;\n      return;\n    }\n\n    this._value = parseDuration(value || '', this.maxDecimals, this.placeholderChar);\n\n    // DEBUG\n    //console.debug('[mat-duration] Setting duration: ', this._value);\n\n    this.formControl.patchValue(this._value, { emitEvent: false });\n    //this.formControl.updateValueAndValidity();\n    this.writing = false;\n    this.markForCheck();\n\n    this._onChangeCallback(this._value);\n  }\n\n  checkIfTouched() {\n    if (this.textControl.touched) {\n      this.markForCheck();\n      this._onTouchedCallback();\n    }\n  }\n\n  preventEvent(event: Event) {\n    if (!event) return;\n    event.preventDefault();\n    if (event.stopPropagation) event.stopPropagation();\n    event.returnValue = false;\n  }\n\n  focus() {\n    if (!this.matInputs.length) return;\n\n    setTimeout(() => {\n      const elementRef = this.matInputs[0]; // get the first element\n      if (isFocusableElement(elementRef)) {\n        elementRef.focus();\n      }\n    });\n  }\n\n  moveCaretToSeparator(event: any, forward: boolean): boolean {\n    // Move to the next separator\n    return moveInputCaretToSeparator(event, ':', forward);\n  }\n\n  /* -- protected method -- */\n\n  protected updateTabIndex() {\n    if (isNil(this._tabindex) || this._tabindex === -1) return; // skip\n\n    // Focus to first input\n    setTimeout(() => {\n      this.matInputs.forEach((elementRef, index) => {\n        setTabIndex(elementRef, this._tabindex + index);\n      });\n      this.markForCheck();\n    });\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<!-- readonly -->\n@if (readonly) {\n  <mat-form-field\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    class=\"mat-form-field-disabled\"\n    >\n    @if (floatLabel !== 'never' && !!placeholder) {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n    <ion-text>{{ formControl.value | duration }}</ion-text>\n  </mat-form-field>\n} @else {\n  <!-- writable -->\n  <mat-form-field\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [class.mat-form-field-disabled]=\"formControl.disabled\"\n    [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\"\n    >\n    @if (floatLabel !== 'never' && !!placeholder) {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    <div matPrefix><ng-content select=\"[matPrefix]\"></ng-content></div>\n    <input\n      matInput\n      #matInput\n      type=\"text\"\n      autocomplete=\"off\"\n      [maskito]=\"'COMMON.DURATION_PLACEHOLDER' | translate | maskitoPlaceholder: durationMask\"\n      [formControl]=\"textControl\"\n      [placeholder]=\"'COMMON.DURATION_PLACEHOLDER' | translate\"\n      [required]=\"required\"\n      (keydown.tab)=\"moveCaretToSeparator($event, true)\"\n      (keydown.shift.tab)=\"moveCaretToSeparator($event, false)\"\n      (keyup.escape)=\"preventEvent($event)\"\n      (blur)=\"checkIfTouched()\"\n      [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n    />\n    <!-- errors -->\n    @if (!formControl.hasError('required') && textControl.hasError('pattern')) {\n      <mat-error translate>\n        ERROR.FIELD_NOT_VALID_PATTERN\n      </mat-error>\n    }\n    @if (formControl.hasError('required')) {\n      <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n    }\n    @if (formControl.hasError('min')) {\n      <mat-error>\n        {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate: formControl.errors.min }}\n      </mat-error>\n    }\n    @if (formControl.hasError('max')) {\n      <mat-error>\n        {{ (compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate: formControl.errors.max }}\n      </mat-error>\n    }\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-form-field>\n}\n","import { Capacitor } from '@capacitor/core';\n\nexport type CapacitorPluginType = 'Camera' | 'StatusBar' | 'Keyboard' | 'BarcodeScanner';\n\nexport class CapacitorPlugins {\n  static readonly Camera = 'Camera';\n  static readonly StatusBar = 'StatusBar';\n  static readonly Keyboard = 'Keyboard';\n  static readonly EdgeToEdge = 'EdgeToEdge';\n  //static readonly BarcodeScanner = 'BarcodeScanner';\n\n  static isAvailable = Capacitor.isPluginAvailable;\n}\n","import { Injectable } from '@angular/core';\nimport { Capacitor, PluginListenerHandle } from '@capacitor/core';\nimport { CapacitorPlugins } from './plugins';\nimport { Keyboard } from '@capacitor/keyboard';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Platform } from '@ionic/angular';\n\n@Injectable({ providedIn: 'root' })\nexport class KeyboardService {\n  private _enable = false;\n  private _visibleSubject = new BehaviorSubject<boolean>(false);\n  private _handlers: PluginListenerHandle[];\n\n  get visibleSubject(): Observable<boolean> {\n    return this._visibleSubject.asObservable();\n  }\n\n  get visible(): boolean {\n    return this._visibleSubject.value;\n  }\n  get enable(): boolean {\n    return this._enable;\n  }\n\n  constructor(private platform: Platform) {\n    platform.ready().then(() => this.init());\n  }\n\n  private async init() {\n    this._enable = this.platform.is('capacitor') && Capacitor.isPluginAvailable(CapacitorPlugins.Keyboard);\n    if (this._enable) {\n      this._handlers = await Promise.all([\n        Keyboard.addListener('keyboardWillShow', () => this._visibleSubject.next(true)),\n        Keyboard.addListener('keyboardDidHide', () => this._visibleSubject.next(false)),\n      ]);\n    }\n  }\n}\n","// Import the core angular services.\nimport { AfterContentInit, Directive, ElementRef, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';\nimport { Subscription, timer } from 'rxjs';\nimport { KeyboardService } from '../capacitor/keyboard';\n\n// ----------------------------------------------------------------------------------- //\n// ----------------------------------------------------------------------------------- //\n\nconst BASE_TIMER_DELAY = 100;\n\n@Directive({\n  selector: '[autofocus], input[appAutofocus]',\n  inputs: ['shouldFocusElement: appAutofocus', 'timerDelay: autofocusDelay'],\n})\nexport class AutofocusDirective implements AfterContentInit, OnChanges, OnDestroy {\n  public shouldFocusElement: any;\n  public timerDelay: number;\n\n  private _timer: Subscription = null;\n\n  // I initialize the autofocus directive.\n  constructor(\n    private readonly _elementRef: ElementRef,\n    private readonly keyboard: KeyboardService\n  ) {\n    this.shouldFocusElement = '';\n    this._timer = null;\n    this.timerDelay = BASE_TIMER_DELAY;\n  }\n\n  // I get called once after the contents have been fully initialized.\n  ngAfterContentInit() {\n    // Because this directive can act on the stand-only \"autofocus\" attribute or\n    // the more specialized \"appAutofocus\" property, we need to check to see if the\n    // \"shouldFocusElement\" input property is the empty string. This will signify\n    // that the focus it not being data-driven and should be performed automatically.\n    if (this.shouldFocusElement === '') {\n      this._startFocus();\n    }\n  }\n\n  // I get called every time the input bindings are updated.\n  ngOnChanges(changes: SimpleChanges) {\n    // If the timer delay is being passed-in as a string (ie, someone is using\n    // attribute-input syntax, not property-input syntax), let's coalesce the\n    // attribute to a numeric value so that our type-annotations are consistent.\n    if ((changes.autofocusDelay || changes.timerDelay) && typeof this.timerDelay !== 'number') {\n      // If the coalesce fails, just fall-back to a sane value.\n      if (isNaN((this.timerDelay = +this.timerDelay))) {\n        this.timerDelay = BASE_TIMER_DELAY;\n      }\n    }\n\n    // If the focus input is being data-driven, then we either need to start the\n    // focus workflow if focus is required; or, clear any existing workflow if focus\n    // is no longer required (so that we don't steal focus from another element).\n    if (changes.appAutofocus || changes.shouldFocusElement) {\n      if (this.shouldFocusElement) this._startFocus();\n      else this._stop();\n    }\n  }\n\n  // I get called once when the directive is being unmounted.\n  ngOnDestroy() {\n    this._stop();\n  }\n\n  /* --- private functions -- */\n\n  // I start the timer-based workflow that will focus the current element.\n  private _startFocus() {\n    // Skip focus when keyboard is visible\n    if (this.keyboard.visible) return;\n\n    // If there is already a timer running for this element, just let it play out -\n    // resetting it at this point will only push-out the time at which the focus is\n    // applied to the element.\n    if (this._timer) return;\n\n    this._timer = timer(this.timerDelay).subscribe(() => {\n      if (this._timer) {\n        this._stop();\n        this._elementRef.nativeElement.focus();\n      }\n    });\n  }\n\n  // I stop the timer-based workflow, preventing focus from taking place.\n  private _stop() {\n    this._timer?.unsubscribe();\n    this._timer = null;\n  }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';\n\n@Directive({\n  selector: '[ngVar]',\n})\nexport class NgVarDirective {\n  @Input()\n  set ngVar(context: unknown) {\n    this.context.$implicit = this.context.ngVar = context;\n\n    if (!this.hasView) {\n      this.vcRef.createEmbeddedView(this.templateRef, this.context);\n      this.hasView = true;\n    }\n  }\n\n  private context: {\n    $implicit: unknown;\n    ngVar: unknown;\n  } = {\n    $implicit: null,\n    ngVar: null,\n  };\n\n  private hasView = false;\n\n  constructor(\n    private templateRef: TemplateRef<any>,\n    private vcRef: ViewContainerRef\n  ) {}\n}\n","import { Directive, EventEmitter, HostBinding, HostListener, Output } from '@angular/core';\nimport { isNotEmptyArray } from '../functions';\n\ninterface DropEvent extends Event {\n  dataTransfer?: {\n    files?: File[];\n  };\n}\n\n@Directive({\n  selector: '[appDragAndDrop]',\n})\nexport class DragAndDropDirective {\n  @HostBinding('class.fileover') fileOver: boolean;\n\n  @Output() fileDropped = new EventEmitter<File[]>();\n\n  // Dragover listener\n  @HostListener('dragover', ['$event'])\n  onDragOver(event: Event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.fileOver = true;\n  }\n\n  // Dragleave listener\n  @HostListener('dragleave', ['$event'])\n  public onDragLeave(event: Event) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.fileOver = false;\n  }\n\n  // Drop listener\n  @HostListener('drop', ['$event'])\n  public ondrop(event: DropEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.fileOver = false;\n    const files = event.dataTransfer?.files;\n\n    if (isNotEmptyArray(files)) {\n      this.fileDropped.emit(files);\n    }\n  }\n}\n","import { AfterContentChecked, booleanAttribute, Directive, ElementRef, Inject, Input } from '@angular/core';\n\n@Directive({\n  selector: 'ion-label[appAutoTitle], mat-label[appAutoTitle]',\n})\nexport class AutoTitleDirective implements AfterContentChecked {\n  @Input({ transform: booleanAttribute }) appAutoTitle = true;\n\n  constructor(@Inject(ElementRef) private readonly elementRef: ElementRef<HTMLElement>) {}\n\n  ngAfterContentChecked(): void {\n    // Update title if different\n    if (this.elementRef.nativeElement && this.elementRef.nativeElement.title !== this.elementRef.nativeElement.textContent) {\n      this.elementRef.nativeElement.title = this.elementRef.nativeElement.textContent;\n    }\n  }\n}\n","import { Directive, EventEmitter, HostListener, Input, numberAttribute, OnDestroy, OnInit, Output } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\n\n@Directive({\n  selector: '[appPreventDoubleClick],[throttledClick]',\n})\nexport class ThrottledClickDirective implements OnInit, OnDestroy {\n  @Input({ transform: numberAttribute }) throttleTime = 500;\n\n  @Output() throttledClick = new EventEmitter<UIEvent>();\n\n  private clicks = new Subject<UIEvent>();\n  private subscription: Subscription;\n\n  constructor() {}\n\n  @HostListener('click', ['$event'])\n  clickEvent(event: UIEvent) {\n    if (event.defaultPrevented) return;\n    event.stopPropagation();\n    this.clicks.next(event);\n  }\n\n  ngOnInit() {\n    this.subscription = this.clicks.pipe(throttleTime(this.throttleTime)).subscribe((e) => this.emitThrottledClick(e));\n  }\n\n  emitThrottledClick(e: UIEvent) {\n    this.throttledClick.emit(e);\n  }\n\n  ngOnDestroy() {\n    this.subscription?.unsubscribe();\n  }\n}\n","import { AfterViewInit, Directive, ElementRef, HostListener, Input, numberAttribute } from '@angular/core';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\n\n@Directive({\n  selector: 'textarea[cdkTextareaAutosize]',\n})\n/**\n * Workaround to avoid CDK directive to scroll to top, when resizing\n */\nexport class AutoResizeDirective implements AfterViewInit {\n  private get _cachedLineHeight() {\n    return this.cdkDirective?.['_cachedLineHeight'] || 10;\n  }\n\n  private get _previousValue() {\n    return this.cdkDirective?.['_previousValue'] || '';\n  }\n  private set _previousValue(value: string) {\n    if (this.cdkDirective) {\n      this.cdkDirective['_previousValue'] = value;\n    }\n  }\n\n  @Input({ alias: 'cdkAutosizeMaxRows', transform: numberAttribute })\n  maxRows: number;\n\n  @Input({ alias: 'cdkAutosizeMinRows', transform: numberAttribute })\n  minRows: number;\n\n  constructor(\n    readonly element: ElementRef<HTMLTextAreaElement>,\n    readonly cdkDirective: CdkTextareaAutosize\n  ) {}\n\n  ngAfterViewInit() {}\n\n  @HostListener('input')\n  @HostListener('paste')\n  @HostListener('cut')\n  @HostListener('delete')\n  onInput() {\n    if (this._previousValue !== this.element.nativeElement.value) {\n      // This will avoid CDK directive to trigger\n      this._previousValue = this.element.nativeElement.value;\n      // Resize\n      this.doResize();\n    }\n  }\n\n  private doResize() {\n    const textarea = this.element.nativeElement;\n\n    // Force to recompute the needed height\n    textarea.style.height = 'auto';\n\n    const minHeight = this.minRows ? this.minRows * this._cachedLineHeight : 0;\n    const maxHeight = this.maxRows ? this.maxRows * this._cachedLineHeight : Infinity;\n    const newHeight = Math.min(Math.max(textarea.scrollHeight, minHeight), maxHeight);\n\n    // DEBUG\n    //console.debug(`[autoResizeTextarea] Resizing textarea to ${newHeight}px`);\n\n    textarea.style.height = `${newHeight}px`;\n\n    textarea.style.overflowY = textarea.scrollHeight > maxHeight ? 'auto' : 'hidden';\n  }\n}\n","import { AfterContentChecked, booleanAttribute, Directive, ElementRef, Inject, Input } from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\n\n@Directive({\n  selector: 'ion-label[appAutoTooltip], mat-label[appAutoTooltip]',\n  hostDirectives: [MatTooltip],\n})\nexport class AutoTooltipDirective implements AfterContentChecked {\n  @Input({ transform: booleanAttribute }) appAutoTooltip = true;\n\n  constructor(\n    @Inject(ElementRef) private readonly elementRef: ElementRef<HTMLElement>,\n    private readonly matTooltip: MatTooltip\n  ) {}\n\n  ngAfterContentChecked(): void {\n    // Update Material Tooltip if different\n    if (this.elementRef.nativeElement && this.matTooltip && this.matTooltip.message !== this.elementRef.nativeElement.textContent) {\n      this.matTooltip.message = this.elementRef.nativeElement.textContent;\n    }\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { AutofocusDirective } from './autofocus.directive';\nimport { NgVarDirective } from './ng-var.directive';\nimport { DragAndDropDirective } from './drag-and-drop.directive';\nimport { AutoTitleDirective } from './autotitle.directive';\nimport { ThrottledClickDirective } from './throttled-click.directive';\nimport { AutoResizeDirective } from './autoresize.directive';\nimport { AutoTooltipDirective } from './autotooltip.directive';\n\n@NgModule({\n  imports: [CommonModule, IonicModule],\n  declarations: [\n    AutofocusDirective,\n    NgVarDirective,\n    DragAndDropDirective,\n    AutoTitleDirective,\n    ThrottledClickDirective,\n    AutoResizeDirective,\n    AutoTooltipDirective,\n  ],\n  exports: [\n    AutofocusDirective,\n    NgVarDirective,\n    DragAndDropDirective,\n    AutoTitleDirective,\n    ThrottledClickDirective,\n    AutoResizeDirective,\n    AutoTooltipDirective,\n  ],\n})\nexport class SharedDirectivesModule {}\n","import { NgModule } from '@angular/core';\nimport { MatCommonModule, MatRippleModule } from '@angular/material/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { SharedPipesModule } from '../../pipes/pipes.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatDuration } from './material.duration';\nimport { MatMomentDateModule } from '@angular/material-moment-adapter';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { SharedDirectivesModule } from '../../directives/directives.module';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ReactiveFormsModule,\n    SharedPipesModule,\n    MatCommonModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatRippleModule,\n    MatMomentDateModule,\n    TranslateModule.forChild(),\n    MaskitoDirective,\n    SharedDirectivesModule,\n  ],\n  exports: [MatDuration],\n  declarations: [MatDuration],\n})\nexport class SharedMatDurationModule {}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  Provider,\n  ViewChild,\n} from '@angular/core';\nimport { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormControl } from '@angular/forms';\nimport { MatRadioButton, MatRadioChange } from '@angular/material/radio';\nimport { MatCheckbox, MatCheckboxChange } from '@angular/material/checkbox';\nimport { InputElement } from '../../inputs';\nimport { isNil, isNotNil, numberOrNilAttribute, toNumber } from '../../functions';\nimport { Subscription } from 'rxjs';\nimport { AppFloatLabelType } from '../../types';\n\nimport { APP_SHOW_TOOLTIP } from '../../constants';\n\nconst DEFAULT_VALUE_ACCESSOR: Provider = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => MatBooleanField),\n  multi: true,\n};\n\nconst noop = () => {};\n\n@Component({\n  // eslint-disable-next-line @angular-eslint/component-selector\n  selector: 'mat-boolean-field',\n  templateUrl: './material.boolean.html',\n  styleUrls: ['./material.boolean.scss'],\n  providers: [DEFAULT_VALUE_ACCESSOR],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatBooleanField implements OnInit, ControlValueAccessor, InputElement, OnDestroy {\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n  private readonly _subscription = new Subscription();\n  private _writing = false;\n\n  protected _value: boolean;\n  protected _tabindex: number;\n  protected _showRadio = false; // Will be changed when focus in\n  protected _focused = false;\n\n  @ViewChild('fakeInput') fakeInput: ElementRef;\n  @ViewChild('yesRadioButton') yesRadioButton: MatRadioButton;\n  @ViewChild('noRadioButton') noRadioButton: MatRadioButton;\n  @ViewChild('checkboxButton') checkboxButton: MatCheckbox;\n\n  @Input({ transform: booleanAttribute }) disabled = false;\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() placeholder: string;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() subscriptSizing: SubscriptSizing;\n  @Input({ transform: booleanAttribute }) readonly = false;\n  @Input({ transform: booleanAttribute }) required = false;\n  @Input({ transform: booleanAttribute }) compact = false;\n  @Input({ transform: booleanAttribute }) autofocus = false;\n  @Input() style: 'radio' | 'checkbox' | 'button';\n  @Input({ transform: numberOrNilAttribute }) buttonsColCount: number;\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  @Input('class') classList: string;\n  @Input() yesLabel = 'COMMON.YES';\n  @Input() noLabel = 'COMMON.NO';\n  @Input({ transform: booleanAttribute }) showButtonIcons = true;\n  @Input() yesIcon = 'checkmark';\n  @Input() noIcon = 'close';\n  @Input({ transform: booleanAttribute }) clearable = false;\n  @Input() labelPosition: 'after' | 'before' = 'after';\n\n  @Input({ transform: numberOrNilAttribute }) set tabindex(value: number) {\n    if (this._tabindex !== value) {\n      this._tabindex = value;\n      setTimeout(() => this.updateTabIndex());\n    }\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  @Input({ transform: booleanAttribute })\n  set showRadio(v: any) {\n    if (v !== this._showRadio) {\n      this._showRadio = v;\n      this.updateFakeInput();\n    }\n  }\n\n  get showRadio(): any {\n    return (\n      this._showRadio ||\n      this._focused ||\n      this.floatLabel === 'always' ||\n      this.floatLabel === 'never' ||\n      this.style === 'checkbox' ||\n      isNotNil(this._value)\n    );\n  }\n\n  @Input()\n  set value(v: any) {\n    if (v !== this._value) {\n      this._value = v;\n      this._onChangeCallback(v);\n    }\n  }\n\n  get value(): any {\n    return this._value;\n  }\n  // eslint-disable-next-line @angular-eslint/no-output-on-prefix,@angular-eslint/no-output-rename\n  @Output('keyup.enter') keyupEnter = new EventEmitter<any>();\n  // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n  @Output('focus') focused = new EventEmitter<FocusEvent>();\n  // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n  @Output('blur') blurred = new EventEmitter<FocusEvent>();\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    private cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective\n  ) {}\n\n  ngOnInit() {\n    this.formControl =\n      this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-boolean-field>.\");\n\n    this.style = this.style || (this.compact ? 'checkbox' : 'radio');\n\n    if (this.style === 'button') {\n      this.buttonsColCount = toNumber(this.buttonsColCount, 2);\n    }\n\n    this._subscription.add(this.formControl.valueChanges.subscribe((value) => this.writeValue(value)));\n\n    this.updateFakeInput();\n    this.updateTabIndex();\n  }\n\n  ngOnDestroy() {\n    this.blurred.complete();\n  }\n\n  writeValue(value: any, event?: Event): void {\n    if (this._writing) return;\n\n    // DEBUG\n    //console.debug('[mat-boolean-field] Writing value', value);\n\n    this._writing = true;\n    if (value !== this._value || value !== this.formControl.value) {\n      this._value = value;\n\n      if (value !== this.formControl.value) {\n        this.formControl.patchValue(value, { emitEvent: false });\n        this._onChangeCallback(value);\n      }\n\n      if (this.yesRadioButton) {\n        this.yesRadioButton.checked = value === true;\n        this.noRadioButton.checked = value === false;\n      } else if (this.checkboxButton) {\n        if (isNil(value)) {\n          this.checkboxButton.indeterminate = true;\n        } else {\n          this.checkboxButton.checked = value;\n        }\n      }\n\n      setTimeout(() => {\n        this.updateFakeInput();\n        this.updateTabIndex();\n      });\n    }\n    this._writing = false;\n\n    if (this.style === 'button') {\n      if (event) this.keyupEnter.emit(event);\n    }\n\n    this.markForCheck();\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n\n  protected onFocusFakeInput(event: FocusEvent) {\n    if (!this.showRadio) {\n      event.preventDefault();\n\n      // Hide the fake input\n      this.fakeInput?.nativeElement.classList.add('cdk-visually-hidden');\n    }\n\n    // Focus on first button\n    this.focus();\n  }\n\n  protected onBlurInput(event: FocusEvent) {\n    const relatedTarget = event.relatedTarget || event.target;\n    const internalEvent = this.inputsElements.some((el) => el === relatedTarget);\n    if (!internalEvent && this._focused) {\n      this._focused = false;\n      this.updateFakeInput();\n      this.updateTabIndex();\n      this.blurred.emit(event);\n\n      this._checkIfTouched();\n    }\n  }\n\n  focus() {\n    if (this._focused) return; // Already focused\n\n    this._focused = true;\n    this.markForCheck();\n\n    setTimeout(() => {\n      this.updateFakeInput();\n      this.updateTabIndex();\n    });\n  }\n\n  protected onRadioValueChanged(event: MatRadioChange): void {\n    if (this._writing) return; // Skip if call by self\n    this._writing = true;\n    this.emitChange(event.value);\n    this._writing = false;\n  }\n\n  protected onCheckboxValueChanged(event: MatCheckboxChange): void {\n    if (this._writing) return; // Skip if call by self\n    this._writing = true;\n    this.emitChange(event.checked);\n    this._writing = false;\n\n    this.focus();\n  }\n\n  toggleValue(event?: Event): void {\n    event?.preventDefault();\n\n    if (this._writing) return; // Skip if call by self\n    this._writing = true;\n    this._value = !this._value;\n    if (this.yesRadioButton) {\n      this.yesRadioButton.checked = this._value;\n      this.noRadioButton.checked = !this._value;\n    } else if (this.checkboxButton) {\n      this.checkboxButton.checked = this._value;\n    }\n    this._checkIfTouched();\n    this._onChangeCallback(this._value);\n    this._writing = false;\n  }\n\n  /* -- private method -- */\n\n  private emitChange(value: boolean) {\n    if (this.formControl.value !== value) {\n      this._value = value;\n\n      this.formControl.setValue(value, { emitEvent: false });\n\n      // Changes comes from inside function: use the callback\n      this._onChangeCallback(value);\n\n      // Check if need to update controls\n      this._checkIfTouched();\n    }\n  }\n\n  private _checkIfTouched() {\n    if (this.formControl.touched) {\n      this.markForCheck();\n      this._onTouchedCallback();\n    }\n  }\n\n  /**\n   * Show/Hide the fake input\n   */\n  private updateFakeInput() {\n    if (this.showRadio || this.style === 'button') {\n      this.fakeInput?.nativeElement.classList.add('cdk-visually-hidden');\n    } else {\n      this.fakeInput?.nativeElement.classList.remove('cdk-visually-hidden');\n    }\n\n    this.markForCheck();\n  }\n\n  /**\n   * This is a special case, because, this component has a temporary component displayed before the first focus event\n   */\n  private updateTabIndex() {\n    if (isNil(this._tabindex)) return;\n\n    if (this.fakeInput) {\n      this.fakeInput.nativeElement.tabIndex = this._tabindex;\n    }\n\n    this.markForCheck();\n  }\n\n  private markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  clearValue(event?: Event) {\n    this.writeValue(null);\n    event?.stopPropagation();\n  }\n\n  protected get radioButtonElements(): HTMLElement[] {\n    return this.yesRadioButton ? [this.yesRadioButton, this.noRadioButton].map((b) => b._inputElement.nativeElement) : [];\n  }\n\n  protected get inputsElements(): HTMLElement[] {\n    return this.radioButtonElements\n      .concat(this.checkboxButton ? [this.checkboxButton._inputElement.nativeElement] : [])\n      .concat(this.fakeInput ? [this.fakeInput.nativeElement] : []);\n  }\n}\n","@if (readonly) {\n  <mat-form-field\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    class=\"mat-form-field-disabled {{ classList }}\"\n  >\n    @if (floatLabel !== 'never' && !!placeholder) {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    <div matPrefix>\n      <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n    </div>\n    <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n    <ion-text>\n      {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n    </ion-text>\n    <div matSuffix>\n      <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n    </div>\n  </mat-form-field>\n} @else {\n  @switch (style) {\n    <!-- Radio -->\n    @case ('radio') {\n      <mat-form-field\n        [floatLabel]=\"showRadio && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n        [appearance]=\"appearance\"\n        [subscriptSizing]=\"subscriptSizing\"\n        class=\"mat-boolean-field mat-boolean-field-radio {{ classList }}\"\n      >\n        @if (floatLabel !== 'never' && !!placeholder) {\n          <mat-label [title]=\"!showTooltip ? placeholder : ''\" [matTooltip]=\"showTooltip ? placeholder : ''\">\n            {{ placeholder }}\n            <span [class.cdk-visually-hidden]=\"showRadio\">({{ yesLabel | translate }}/{{ noLabel | translate }})</span>\n          </mat-label>\n        }\n        <div matPrefix>\n          <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n        </div>\n        <input\n          matInput\n          #fakeInput\n          type=\"text\"\n          readonly=\"true\"\n          [formControl]=\"formControl\"\n          (focus)=\"onFocusFakeInput($event)\"\n          (blur)=\"onBlurInput($event)\"\n          (keydown.space)=\"toggleValue($event)\"\n          (keyup.arrowLeft)=\"toggleValue($event)\"\n          (keyup.arrowRight)=\"toggleValue($event)\"\n          (keyup.arrowUp)=\"toggleValue($event)\"\n          (keyup.arrowDown)=\"toggleValue($event)\"\n          [required]=\"required\"\n          [appAutofocus]=\"autofocus\"\n          [class.cdk-visually-hidden]=\"showRadio\"\n          [tabindex]=\"tabindex\"\n        />\n\n        <!-- radio button -->\n        <mat-radio-group\n          [class.cdk-visually-hidden]=\"!showRadio\"\n          [formControl]=\"formControl\"\n          (change)=\"onRadioValueChanged($event)\"\n          (blur)=\"onBlurInput($event)\"\n        >\n          <mat-radio-button #yesRadioButton [value]=\"true\" tabIndex=\"-1\">\n            <span>{{ yesLabel | translate }}</span>\n          </mat-radio-button>\n          &nbsp;\n          <mat-radio-button #noRadioButton [value]=\"false\" tabIndex=\"-1\">\n            <span>{{ noLabel | translate }}</span>\n          </mat-radio-button>\n        </mat-radio-group>\n\n        @if (formControl.hasError('required')) {\n          <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n        }\n\n        @if (clearable) {\n          <button\n            matSuffix\n            mat-icon-button\n            tabindex=\"-1\"\n            type=\"button\"\n            (click)=\"clearValue($event)\"\n            [hidden]=\"_value | isNil\"\n          >\n            <mat-icon>close</mat-icon>\n          </button>\n        }\n\n        <div matSuffix>\n          <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n        </div>\n      </mat-form-field>\n    }\n\n    <!-- Checkbox -->\n    @case ('checkbox') {\n      <mat-form-field\n        [floatLabel]=\"!floatLabel || floatLabel === 'auto' ? 'always' : (floatLabel | asFloatLabelType)\"\n        [appearance]=\"appearance\"\n        class=\"mat-boolean-field mat-boolean-field-checkbox {{ classList }}\"\n      >\n        <div matPrefix>\n          <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n        </div>\n\n        <!-- Add a empty label, for layout alignment -->\n        @if (floatLabel !== 'never' && !!placeholder) {\n          <mat-label>&nbsp;</mat-label>\n        }\n\n        <input\n          matInput\n          #fakeInput\n          readonly=\"true\"\n          [formControl]=\"formControl\"\n          [required]=\"required\"\n          [class.cdk-visually-hidden]=\"showRadio\"\n          [tabindex]=\"tabindex\"\n          [appAutofocus]=\"autofocus\"\n          (focus)=\"onFocusFakeInput($event)\"\n          (keydown.space)=\"toggleValue($event)\"\n        />\n\n        <!-- checkbox, when compact -->\n        <mat-checkbox\n          #checkboxButton\n          [formControl]=\"formControl\"\n          [indeterminate]=\"value | isNil\"\n          [class.cdk-visually-hidden]=\"!showRadio\"\n          [labelPosition]=\"labelPosition\"\n          [title]=\"!showTooltip ? (placeholder ?? '') : ''\"\n          [matTooltip]=\"showTooltip ? (placeholder ?? '') : ''\"\n          [tabIndex]=\"-1\"\n          (change)=\"onCheckboxValueChanged($event)\"\n          (blur)=\"onBlurInput($event)\"\n        >\n          @if (floatLabel !== 'never' && !!placeholder) {\n            {{ placeholder || '' }}\n          }\n        </mat-checkbox>\n\n        @if (formControl.hasError('required')) {\n          <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n        }\n\n        @if (clearable) {\n          <button\n            matSuffix\n            mat-icon-button\n            tabindex=\"-1\"\n            type=\"button\"\n            (click)=\"clearValue($event)\"\n            [hidden]=\"_value | isNil\"\n          >\n            <mat-icon>close</mat-icon>\n          </button>\n        }\n\n        <div matSuffix>\n          <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n        </div>\n      </mat-form-field>\n    }\n\n    <!-- Buttons -->\n    @case ('button') {\n      <mat-form-field\n        [floatLabel]=\"!floatLabel || floatLabel === 'auto' ? 'always' : (floatLabel | asFloatLabelType)\"\n        [appearance]=\"appearance\"\n        [subscriptSizing]=\"subscriptSizing\"\n        class=\"mat-boolean-field mat-boolean-field-button {{ classList }}\"\n      >\n        <div matPrefix>\n          <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n        </div>\n\n        @if (floatLabel !== 'never' && !!placeholder) {\n          <mat-label [title]=\"placeholder\">{{ placeholder }}</mat-label>\n        }\n\n        <input\n          #fakeInput\n          matInput\n          type=\"text\"\n          class=\"cdk-visually-hidden\"\n          readonly=\"true\"\n          [formControl]=\"formControl\"\n          [appAutofocus]=\"autofocus\"\n          (focus)=\"onFocusFakeInput($event)\"\n          (keydown.space)=\"toggleValue($event)\"\n          (keyup.arrowLeft)=\"toggleValue($event)\"\n          (keyup.arrowRight)=\"toggleValue($event)\"\n          (keyup.arrowUp)=\"toggleValue($event)\"\n          (keyup.arrowDown)=\"toggleValue($event)\"\n          [required]=\"required\"\n          [tabindex]=\"_tabindex\"\n        />\n        @if (formControl.disabled) {\n          <ion-text>\n            {{ (value === null ? 'COMMON.EMPTY_OPTION' : value === true ? yesLabel : noLabel) | translate }}\n          </ion-text>\n        } @else {\n          <div class=\"mat-form-field-buttons\" [style.--buttons-col-count]=\"buttonsColCount\">\n            <!-- yes -->\n            <ion-button\n              #yesButton\n              class=\"mat-form-field-button\"\n              [tabIndex]=\"-1\"\n              (click)=\"writeValue(true, $event)\"\n              (keyup.enter)=\"writeValue(true, $event)\"\n              [color]=\"_value === null ? 'tertiary' : _value === true ? 'accent' : 'light'\"\n            >\n              @if (showButtonIcons && yesIcon; as icon) {\n                <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n              }\n              {{ yesLabel | translate }}\n            </ion-button>\n\n            <!-- No button -->\n            <ion-button\n              #noButton\n              class=\"mat-form-field-button\"\n              [tabIndex]=\"-1\"\n              (click)=\"writeValue(false, $event)\"\n              (keydown.space)=\"toggleValue($event)\"\n              (keyup.enter)=\"writeValue(false, $event)\"\n              [color]=\"_value === null ? 'tertiary' : _value === false ? 'accent' : 'light'\"\n            >\n              @if (showButtonIcons && noIcon; as icon) {\n                <ion-icon slot=\"start\" [name]=\"icon\"></ion-icon>\n              }\n              {{ noLabel | translate }}\n            </ion-button>\n          </div>\n        }\n\n        @if (formControl.hasError('required')) {\n          <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n        }\n\n        @if (clearable) {\n          <ion-button\n            matSuffix\n            fill=\"clear\"\n            size=\"small\"\n            color=\"medium\"\n            tabindex=\"-1\"\n            (click)=\"clearValue($event)\"\n            [class.cdk-visually-hidden]=\"_value | isNil\"\n          >\n            <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n          </ion-button>\n        }\n\n        <div matSuffix>\n          <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n        </div>\n      </mat-form-field>\n    }\n  }\n}\n\n<ng-template #matPrefixTemplate>\n  <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n<ng-template #matSuffixTemplate>\n  <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MatCommonModule } from '@angular/material/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { SharedPipesModule } from '../../pipes/pipes.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { SharedDirectivesModule } from '../../directives/directives.module';\nimport { MatBooleanField } from './material.boolean';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatTooltip } from '@angular/material/tooltip';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ReactiveFormsModule,\n    SharedPipesModule,\n    MatCommonModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatRadioModule,\n    MatCheckboxModule,\n    TranslateModule.forChild(),\n    SharedDirectivesModule,\n    MatIcon,\n    MatIconButton,\n    MatTooltip,\n  ],\n  exports: [MatBooleanField],\n  declarations: [MatBooleanField],\n})\nexport class SharedMatBooleanModule {}\n","import {\n  AfterViewInit,\n  ANIMATION_MODULE_TYPE,\n  Directive,\n  ElementRef,\n  HostBinding,\n  Inject,\n  Input,\n  NgZone,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Renderer2,\n  SimpleChanges,\n} from '@angular/core';\nimport { MatBadge, MatBadgePosition, MatBadgeSize } from '@angular/material/badge';\nimport { AppColors } from '../../types';\nimport { AriaDescriber } from '@angular/cdk/a11y';\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { isNotNilOrBlank } from '../../functions';\n\nexport type MatBadgeFill = 'clear' | 'solid';\nconst EMPTY_CHAR = 0x00a0;\nconst SIZE_TO_PX = {\n  large: 28,\n  medium: 22,\n  small: 16,\n};\n@Directive({\n  selector: '[appBadge], [appBadgeIcon], [appBadgeMatIcon]',\n})\nexport class BadgeDirective extends MatBadge implements AfterViewInit, OnChanges, OnDestroy, OnInit {\n  @HostBinding('class.mat-badge') true;\n  @HostBinding('class.mat-badge-overlap') get isOverlapHost() {\n    return this.overlap;\n  }\n  @HostBinding('class.mat-badge-above') get isAboveHost() {\n    return this.isAbove();\n  }\n  @HostBinding('class.mat-badge-below') get isBelowHost() {\n    return !this.isAbove();\n  }\n  @HostBinding('class.mat-badge-before') get isBeforeHost() {\n    return !this.isAfter();\n  }\n  @HostBinding('class.mat-badge-after') get isAfterHost() {\n    return this.isAfter();\n  }\n  @HostBinding('class.mat-badge-small') get isSmallHost() {\n    return this.size === 'small';\n  }\n  @HostBinding('class.mat-badge-medium') get isMediumHost() {\n    return this.size === 'medium';\n  }\n  @HostBinding('class.mat-badge-large') get isLargeHost() {\n    return this.size === 'large';\n  }\n  @HostBinding('class.mat-badge-hidden') get isHiddenHost() {\n    return this.hidden || !this.content;\n  }\n  @HostBinding('class.mat-badge-disabled') get isDisabledHost() {\n    return this.disabled;\n  }\n\n  @Input() set appBadge(value: string | number) {\n    this.content = isNotNilOrBlank(value) ? value : EMPTY_CHAR;\n  }\n  get appBadge(): string | number {\n    return this.content;\n  }\n\n  @Input() set appBadgeDisabled(value: boolean) {\n    this.disabled = value;\n  }\n  get appBadgeDisabled(): boolean {\n    return this.disabled;\n  }\n  @Input() set appBadgeSize(value: MatBadgeSize) {\n    this.size = value;\n  }\n  get appBadgeSize(): MatBadgeSize {\n    return this.size;\n  }\n\n  @Input() appBadgeColor: AppColors;\n  @Input() appBadgeFill: MatBadgeFill;\n  @Input() appBadgeMatIcon: string;\n  @Input() appBadgeIcon: string;\n  @Input() appBadgeHidden: BooleanInput;\n  @Input() appBadgeOverlap: BooleanInput;\n  @Input() appBadgePosition: MatBadgePosition;\n\n  private _html: string;\n\n  constructor(\n    _ngZone: NgZone,\n    protected el: ElementRef<HTMLElement>,\n    _ariaDescriber: AriaDescriber,\n    _renderer: Renderer2,\n    @Optional() @Inject(ANIMATION_MODULE_TYPE) _animationMode?: string | undefined\n  ) {\n    super(_ngZone, el, _ariaDescriber, _renderer, _animationMode);\n    this.content = EMPTY_CHAR; // Will be invisible\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n  }\n\n  ngAfterViewInit() {\n    this.updateView();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (\n      changes.appBadgeColor ||\n      changes.appBadgeFill ||\n      changes.appBadgeMatIcon ||\n      changes.appBadgeIcon ||\n      changes.appBadgeHidden ||\n      changes.appBadgeOverlap ||\n      changes.appBadgePosition ||\n      changes.appBadge ||\n      changes.appBadgeSize ||\n      changes.appBadgeDisabled\n    ) {\n      this.updateView();\n    }\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n  }\n\n  private updateView() {\n    const badge = this.getBadgeElement();\n    if (!badge) return;\n\n    // Fix color\n    if (!this.appBadgeColor) this.appBadgeColor = 'primary';\n    if (this.appBadgeColor === 'warn') this.appBadgeColor = 'warning';\n\n    const size = SIZE_TO_PX[this.size];\n    const fontSize = `var(--mat-badge-legacy-${this.size}-size-container-size,${size}px)`;\n    let hidden = this.appBadgeHidden;\n    if (!hidden) {\n      let html = '';\n      if (this.appBadgeMatIcon) {\n        html = `<i class=\"material-icons\" style=\"font-size: ${fontSize};\">${this.appBadgeMatIcon}</i>`;\n      } else if (this.appBadgeIcon) {\n        html = `<ion-icon style=\"font-size: ${fontSize}; pointer-events: none;\" name=\"${this.appBadgeIcon}\"></ion-icon>`;\n      } else if (isNotNilOrBlank(this.content) && this.content !== EMPTY_CHAR) {\n        html = '' + this.content;\n      } else {\n        hidden = true;\n      }\n      if (!hidden && this._html !== html) {\n        this._html = html;\n        badge.innerHTML = html;\n      }\n    }\n\n    // Update style\n    // fill: 'clear'\n    if (this.appBadgeFill === 'clear') {\n      badge.style.color = `var(--ion-color-${this.appBadgeColor})`;\n      badge.style.background = 'transparent';\n    }\n    // fill: 'solid' (default value)\n    else {\n      badge.style.background = `var(--ion-color-${this.appBadgeColor})`;\n      badge.style.color = `var(--ion-color-${this.appBadgeColor}-contrast)`;\n    }\n\n    if (hidden) {\n      badge.style.display = 'none';\n    } else {\n      if (badge.style.display !== 'inline-block') badge.style.display = 'inline-block';\n      if (badge.style.position !== 'absolute') badge.style.position = 'absolute';\n\n      /*\n      // WORKAROUND to force position of the badge, when inside a <mat-button> (e.g. on a <mat-label>)\n      const overlap = this.overlap;\n\n      // Right/left position\n      if (this.isAfter() ) {\n        const parentWidth = badge.parentElement.getBoundingClientRect().width;\n        if (parentWidth > 0) {\n          const left = `${parentWidth - (overlap ? size / 2 : 0)}px`;\n          if (badge.style.left !== left) badge.style.left = left;\n          if (badge.style.right !== '') badge.style.right = '';\n        }\n        else {\n          const right = `${-1 * (overlap ? size / 2 : size)}px`;\n          if (badge.style.right !== right) badge.style.right = right;\n          if (badge.style.left !== '') badge.style.left = '';\n        }\n      }\n\n      // Top/bottom position\n      if (this.isAbove()) {\n        const parentHeight = badge.parentElement.getBoundingClientRect().height;\n        if (parentHeight > 0) {\n          const bottom = `${parentHeight - (overlap ? (size / 2) : size)}px`;\n          if (badge.style.bottom !== bottom) badge.style.bottom = bottom;\n          if (badge.style.top !== '') badge.style.top = '';\n        }\n        else {\n          const top = `${-1 * (overlap ? (size / 2) : size)}px`;\n          if (badge.style.top !== top) badge.style.top = top;\n          if (badge.style.bottom !== '') badge.style.bottom = '';\n        }\n      }*/\n    }\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { BadgeDirective } from './badge.directive';\nimport { MatBadgeModule } from '@angular/material/badge';\n\n@NgModule({\n  imports: [CommonModule, IonicModule, MatBadgeModule],\n  exports: [BadgeDirective],\n  declarations: [BadgeDirective],\n})\nexport class SharedBadgeModule {}\n","import { EventEmitter } from '@angular/core';\nimport { fromEvent, merge, Observable, timer } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nexport interface PromiseEventPayload<R = any> {\n  success: (value?: R) => void;\n  error: (reason?: any) => void;\n}\n\nexport type PromiseEvent<R = any, D = void> = CustomEvent<PromiseEventPayload<R> & D>;\n\nexport function createPromiseEventEmitter<R = any, D = void>(): EventEmitter<PromiseEvent<R, D>> {\n  return new EventEmitter<PromiseEvent<R, D>>(true);\n}\n\nexport function createPromiseEvent<T = void, D = void>(\n  eventType: string,\n  promise: PromiseEventPayload<T>,\n  initArg?: CustomEventInit<D>\n): PromiseEvent<T, D> {\n  const detail = <PromiseEventPayload & D>{\n    ...(initArg?.detail || {}),\n    ...promise,\n  };\n  return new CustomEvent<PromiseEventPayload<T> & D>(eventType, { detail });\n}\n\nexport function emitPromiseEvent<R = any, D = void>(\n  emitter: EventEmitter<PromiseEvent<R, D>>,\n  eventType: string,\n  initArg?: CustomEventInit<D>\n): Promise<R> {\n  return new Promise<R>((resolve, reject) => {\n    const event = createPromiseEvent(\n      eventType,\n      {\n        success: resolve,\n        error: reject,\n      },\n      initArg\n    );\n    emitter.emit(event);\n  });\n}\n\nexport interface CompletableEvent extends Event {\n  target: EventTarget & { complete?: () => void };\n}\n\n/**\n * Listen end of scroll.\n * <p>\n *   The threshold distance from the bottom of the content to call the infinite output event when scrolled.\n *   The threshold value can be either a percent, or in pixels.\n *   For example, use the value of 10% for the infinite output event to get called when the user has scrolled\n *   10% from the bottom of the page. Use the value 100px when the scroll is within 100 pixels from the bottom of the page.\n * </p>\n *\n * @param element\n * @param threshold default to '15%'\n * @param dueTime\n */\nexport function fromScrollEndEvent(element: HTMLElement, threshold?: string, dueTime?: number): Observable<any> {\n  threshold = threshold || '15%';\n  let isEnd: () => boolean;\n\n  // Listen using percentage\n  if (threshold.endsWith('%')) {\n    const thresholdRatio = parseInt(threshold.slice(0, threshold.length - 1)) / 100;\n    isEnd = () => {\n      const endPosRatio = 1 - (element.scrollTop + element.offsetHeight) / element.scrollHeight;\n      return endPosRatio < thresholdRatio;\n    };\n  }\n\n  // Listen using pixels\n  else if (threshold.endsWith('px')) {\n    const thresholdPx = parseInt(threshold.slice(0, threshold.length - 2));\n    isEnd = () => {\n      const endPosPx = element.scrollHeight - (element.scrollTop + element.offsetHeight);\n      return endPosPx < thresholdPx;\n    };\n  } else {\n    throw new Error(\"Invalid argument 'threshold'. Expected value unit: 'px' or '%' \");\n  }\n\n  // Check bottom reach, even if NO scroll event (e.g. when already reach the bottom)\n  if (dueTime > 0) {\n    return merge(fromEvent(element, 'scroll'), timer(dueTime)).pipe(filter(() => isEnd()));\n  }\n\n  return fromEvent(element, 'scroll').pipe(filter(() => isEnd()));\n}\n","/* ---\n * Source: https://github.com/ionic-team/ionic-framework/blob/b0d53ca73619585671d8cf4dc24e47f826495a0a/core/src/utils/platform.ts\n * --- */\n\nconst _cache = {\n  userAgent: null,\n  mobile: null,\n  cordova: null,\n  capacitor: null,\n};\n\nexport function matchMedia(win: Window, query: string): boolean {\n  return win.matchMedia(query).matches;\n}\n\nexport function getUserAgent(win: Window): string {\n  if (!_cache.userAgent) {\n    _cache.userAgent = win.navigator.userAgent || win.navigator.vendor || (window as any).opera;\n  }\n  return _cache.userAgent;\n}\n\nexport function testUserAgent(win: Window, expr: RegExp) {\n  const userAgent: string = getUserAgent(win);\n  return expr.test(userAgent);\n}\n\nexport function isWindows(win?: Window) {\n  return testUserAgent(win, /windows/i);\n}\n\nexport function isFirefox(win?: Window) {\n  return testUserAgent(win, / firefox\\//i);\n}\n\nexport function isSafari(win?: Window) {\n  return !isChrome(win) /*Exclude chromium*/ && testUserAgent(win, / safari\\//i);\n}\n\nexport function isChrome(win?: Window) {\n  return testUserAgent(win, / chrome\\//i);\n}\n\nexport function isEdge(win?: Window) {\n  return testUserAgent(win, /edge/i);\n}\n\nexport function isTouchUi(win?: Window) {\n  return matchMedia(win, '(any-pointer:coarse)');\n}\n\nexport function isIpad(win: Window) {\n  // iOS 12 and below\n  if (testUserAgent(win, /iPad/i)) {\n    return true;\n  }\n\n  // iOS 13+\n  if (testUserAgent(win, /Macintosh/i) && isTouchUi(win)) {\n    return true;\n  }\n\n  return false;\n}\n\nexport function isMacOS(win: Window) {\n  // iOS (but not iPad)\n  return testUserAgent(win, /Macintosh/i) && !isTouchUi(win);\n}\n\nexport function isIOS(win: Window) {\n  return testUserAgent(win, /iPhone|iPod/i) || isIpad(win);\n}\n\nexport function isAndroid(win: Window) {\n  return testUserAgent(win, /android|sink/i);\n}\n\nexport function isCapacitor(win: any): boolean {\n  if (_cache.capacitor === null || _cache.capacitor === undefined) {\n    _cache.capacitor = !!(win['Capacitor'] || win['capacitor']);\n  }\n  return _cache.capacitor;\n}\n\nexport function isMobile(win: Window) {\n  if (_cache.mobile === null || _cache.mobile === undefined) {\n    _cache.mobile =\n      isAndroid(win) ||\n      (isIOS(window) && isTouchUi(win)) ||\n      // Workaround, for MS Windows touch screen (detected as mobile, but forced as desktop)\n      (isTouchUi(win) && !isWindows(win));\n  }\n  return _cache.mobile;\n}\n\nexport function isPrint(win?: Window) {\n  return matchMedia(win, 'print');\n}\n","import { EntityUtils, IEntity } from './entity.model';\nimport { isEmptyArray, isNil, isNotNil } from '../../../shared/functions';\nimport { EntityFilter } from './filter.model';\nimport { FilterFn } from '../../../shared/types';\n\nexport declare interface ITreeItemEntity<T extends IEntity<T, ID>, ID = number> {\n  parentId: ID;\n  parent: T;\n  children: T[];\n}\n\nexport class TreeItemEntityUtils {\n  static forward<T extends ITreeItemEntity<any>>(node: T, filterFn?: FilterFn<T>, loopCount?: number): T {\n    // Stop infinite loop\n    if (loopCount === 100) {\n      console.error('Infinite loop detected! Make sure there is valid node in this tree!');\n      return undefined;\n    }\n\n    let indexInParent = node.parent ? (node.parent.children || []).indexOf(node) : -1;\n    // Root node\n    if (indexInParent === -1) {\n      return this.first(node, filterFn);\n    }\n\n    // Dive into children\n    const firstChild = (node.children || []).map((c) => this.first(c, filterFn)).find(isNotNil);\n    if (firstChild) return firstChild;\n\n    // Lookup in brothers\n    let current = node;\n    while (current.parent && indexInParent !== -1) {\n      // Has brother ?\n      if (indexInParent + 1 < current.parent.children.length) {\n        const brother = (current.parent.children || [])\n          .slice(indexInParent + 1)\n          .map((c) => (!filterFn || filterFn(c) ? c : this.first(c, filterFn)))\n          .find(isNotNil);\n        // OK, found a brother\n        if (brother) return brother;\n      }\n      // Retry, with parent's brother\n      current = current.parent;\n      indexInParent = current.parent ? (current.parent.children || []).indexOf(current) : -1;\n    }\n\n    // Return parent\n    if (current !== node && (!filterFn || filterFn(current))) return current;\n\n    return this.first(current, filterFn);\n  }\n\n  static backward<T extends ITreeItemEntity<any>, ID = number>(node: T, filterFn?: FilterFn<T>, loopCount?: number): T {\n    // Stop infinite loop\n    if (loopCount === 100) {\n      console.error('Infinite loop detected! Make sure there is valid node in this tree!');\n      return undefined;\n    }\n\n    const indexInParent = node.parent ? (node.parent.children || []).indexOf(node) : -1;\n    // Root node\n    if (indexInParent === -1) {\n      return this.lastLeaf(node, filterFn);\n    }\n\n    // No previous brother (first in parent's list)\n    else if (indexInParent === 0) {\n      // Return the parent, if match\n      return !filterFn || filterFn(node.parent)\n        ? node.parent\n        : // Or recursively call backward() on the parent\n          this.backward(node.parent, filterFn, (loopCount || 0) + 1);\n    }\n\n    // Lookup in brother\n    else {\n      const previousBrother = (node.parent.children || [])\n        .slice(0, indexInParent)\n        .reverse()\n        .find((c) => !filterFn || filterFn(c));\n\n      // OK, there is a brother before the current index\n      if (previousBrother) return this.lastLeaf(previousBrother, filterFn);\n    }\n\n    // Not found in brother: recursively call backward() on the parent\n    return this.backward(node.parent, filterFn, (loopCount || 0) + 1);\n  }\n\n  static first<T extends ITreeItemEntity<any>>(node: T, filterFn?: FilterFn<T>): T {\n    // Node has children: dive into children\n    const child = (node.children || []).find((c) => this.first(c, filterFn));\n    if (child) return child;\n\n    // Node match: use it\n    return !filterFn || filterFn(node) ? node : undefined;\n  }\n\n  static lastLeaf<T extends ITreeItemEntity<any>>(node: T, filterFn?: FilterFn<T>): T {\n    // Node has children: dive into children\n    const childLeaf = (node.children || [])\n      // Reverse order (after clone)\n      .slice()\n      .reverse()\n      .map((c) => this.lastLeaf(c, filterFn))\n      .find(isNotNil);\n    if (childLeaf) return childLeaf; // OK, found in children\n\n    // Node is a leaf, or not match found in children: check current\n    return !filterFn || filterFn(node) ? node : undefined;\n  }\n\n  static findByFilter<T extends ITreeItemEntity<T> & IEntity<T>>(node: T, filter: EntityFilter<any, T>): T[] {\n    const filterFn = filter?.asFilterFn();\n    if (!filterFn) throw new Error('Missing or empty filter argument');\n\n    return this.filterRecursively(node, filterFn);\n  }\n\n  static findById<T extends ITreeItemEntity<T, ID> & IEntity<T, ID>, ID = number>(node: T, id: ID): T | undefined {\n    if (!node || isNil(id)) return undefined;\n    if (node.id === id) return node;\n    if (node.children?.length > 0) {\n      for (const child of node.children) {\n        const found = this.findById(child, id);\n        if (found) return found;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Delete matches batches\n   *\n   * @param node\n   * @param filter\n   */\n  static deleteByFilter<T extends ITreeItemEntity<T> & IEntity<T>>(node: T, filter: EntityFilter<any, T>): T[] {\n    const filterFn = filter?.asFilterFn();\n    if (!filterFn) throw new Error('Missing or empty filter argument');\n\n    return this.deleteRecursively(node, filterFn);\n  }\n\n  static filterRecursively<T extends ITreeItemEntity<any>>(node: T, filterFn: (n: T) => boolean): T[] {\n    return (node?.children || []).reduce(\n      (res, child) => res.concat(this.filterRecursively(child, filterFn)),\n      // Init result\n      filterFn(node) ? [node] : []\n    );\n  }\n\n  static deleteRecursively<T extends ITreeItemEntity<any>>(node: T, filterFn: (n: T) => boolean): T[] {\n    if (isEmptyArray(node.children)) return []; // Skip\n\n    // Delete children\n    const deletedChildren = node.children.filter(filterFn);\n    node.children = node.children.filter((c) => !deletedChildren.includes(c));\n\n    // TODO: add an options to clean the parent\n    //deletedChildren.forEach(child => child.parent = null);\n\n    // Recursive call, in still existing children\n    return node.children.reduce((res, c) => res.concat(...this.deleteRecursively(c, filterFn)), deletedChildren);\n  }\n\n  /**\n   * Visit each node, from root to leaf\n   *\n   * @param node\n   * @param action\n   */\n  static visit<T extends ITreeItemEntity<any>>(node: T, action: (item: T) => void) {\n    if (node == null) {\n      return;\n    }\n\n    // Appliquer l'action sur le nœud actuel\n    action(node);\n\n    // Parcourir les enfants\n    if (node.children) {\n      node.children.forEach((child) => this.visit(child, action));\n    }\n  }\n\n  /**\n   * Visit each node, from leaf to root\n   *\n   * @param node\n   * @param action\n   */\n  static visitInverse<T extends ITreeItemEntity<any>>(node: T, action: (T) => void) {\n    if (node == null) {\n      return;\n    }\n\n    // Parcourir les enfants\n    if (node.children) {\n      node.children.forEach((child) => this.visitInverse(child, action));\n    }\n\n    // Appliquer l'action sur le nœud actuel\n    action(node);\n  }\n\n  /**\n   * Transform a batch entity tree into a array list. This method keep links parent/children.\n   *\n   * Method used to find batch without id (e.g. before local storage)\n   *\n   * @param source\n   */\n  static treeToArray<T extends ITreeItemEntity<any>>(source: T): T[] {\n    if (!source) return null;\n    return (source.children || []).reduce(\n      (res, batch) => {\n        batch.parent = source;\n        return res.concat(this.treeToArray(batch)); // recursive call\n      },\n      [source]\n    );\n  }\n\n  static listOfTreeToArray<T extends ITreeItemEntity<any>>(sources: T[]): T[] {\n    if (!sources || !sources.length) return null;\n    return sources.reduce((res, source) => res.concat(this.treeToArray<T>(source)), []);\n  }\n\n  /**\n   * Fill parent attribute, of all children found in the tree\n   *\n   * @param source\n   */\n  static treeFillParent<T extends ITreeItemEntity<any>>(source: T) {\n    if (!source) return null;\n    (source.children || []).forEach((child) => {\n      child.parent = source;\n      this.treeFillParent(child); // Loop\n    });\n  }\n\n  /**\n   * Converts an array of objects into a tree hierarchy based on parent-child relationships.\n   *\n   * @param {T[]} sources - The array of source objects to be converted into tree structure.\n   * @param {new () => T} [dataType] - An optional class constructor used to shape the objects within the tree.\n   * @return {T[] | undefined} An array of root elements representing the tree structure, or undefined if the input is empty.\n   */\n  static fromObjectArrayAsTrees<T extends ITreeItemEntity<T> & IEntity<T>>(sources: T[], dataType?: new () => T): T[] {\n    if (!sources) return null;\n    const targets = dataType ? (sources || []).map((json) => EntityUtils.fromObject<T>(json, dataType)) : sources;\n    const rootTargets = targets.filter((b) => isNil(b.parentId) && isNil(b.parent)) || undefined;\n    if (isEmptyArray(rootTargets)) return undefined;\n\n    targets.forEach((s) => {\n      // Link to parent\n      const parentId = s.parentId ?? s.parent?.id;\n      s.parent = (isNotNil(parentId) && targets.find((p) => p.id === parentId)) || undefined;\n      s.parentId = undefined; // Avoid redundant info on parent\n    });\n\n    // Link to children\n    targets.forEach((s) => (s.children = targets.filter((p) => p.parent && p.parent === s) || []));\n\n    return rootTargets;\n  }\n}\n","import { Property, PropertyMap } from '../../../shared/types';\nimport { getPropertyByPath, isNil, isNilOrBlank, isNotNil, isNotNilOrBlank, isPromise, toBoolean, toNumber } from '../../../shared/functions';\nimport { FormFieldDefinition } from '../../../shared/form/field.model';\nimport { EntitiesServiceLoadOptions, SuggestFn } from '../../../shared/services/entity-service.class';\n\nexport class AppPropertiesUtils {\n  /**\n   * Converts an array of `Property` objects into a `PropertiesMap` object.\n   *\n   * @param {Property[]} [sources] - An optional array of properties to be converted.\n   * @param {FormFieldDefinition[]} [definitions] - An optional array of form field definitions to help with the conversion.\n   * @param {Object} [opts] - Optional configurations.\n   * @param {boolean} [opts.omitNilOrBlank] - If true, properties with nil or blank values will be omitted. Defaults to true.\n   * @return {PropertyMap} - The resulting `PropertiesMap` object.\n   */\n  static arrayAsObject<T = any>(sources?: Property<T>[], definitions?: FormFieldDefinition[], opts?: { omitNilOrBlank: boolean }): PropertyMap {\n    return (\n      (sources || [])\n        // Serialize each item\n        .map((source) => {\n          if (!source) return undefined;\n          const key = AppPropertyUtils.getPropertyKey(source);\n          if (!key) return undefined;\n          const def = definitions?.find((d) => d.key === key);\n          return AppPropertyUtils.asObject(source, def);\n        })\n        // Fill a JSON object\n        .reduce(\n          (res, item) => {\n            if (isNilOrBlank(item?.key)) return res;\n            // Skip if nil or blank value\n            if (opts?.omitNilOrBlank !== false && isNilOrBlank(item.value)) return res;\n            res[item.key] = item.value;\n            return res;\n          },\n          <PropertyMap>{}\n        )\n    );\n  }\n\n  /**\n   * Generates an array of properties from the given object, optionally applying definitions to the properties.\n   *\n   * @param {PropertyMap} [sources] - The source object from which properties are to be extracted.\n   * @param {FormFieldDefinition[]} [definitions] - An optional array of definitions to be applied to the extracted properties.\n   * @param opts\n   * @return {Property[] | Promise<Property[]>} An array of properties generated from the source object, or a promise resolving to that array.\n   */\n  static arrayFromObject<T>(\n    sources?: PropertyMap | Property<T>[],\n    definitions?: FormFieldDefinition[],\n    opts?: {\n      keepOrphan?: boolean; // true by default\n    }\n  ): Property<T>[] | Promise<Property<T>[]> {\n    // DEBUG\n    //console.debug(`[properties-utils] Convert property map into array of Property...`);\n\n    let targets = Array.isArray(sources)\n      ? sources.slice()\n      : Object.getOwnPropertyNames(sources || {}).map(\n          (key) =>\n            <Property<any>>{\n              key,\n              value: sources[key],\n            }\n        );\n    const jobs = [];\n\n    if (!!definitions) {\n      targets = targets\n        .map((target: Property<any>) => {\n          // Find definition\n          const def = definitions.find((def) => def.key === target.key);\n\n          // Exclude no definition (if expected by user options)\n          if (!def && opts?.keepOrphan === false) return null;\n\n          // Deserialize from string\n          let propertyOrPromise = AppPropertyUtils.fromObject(target, def);\n          if (isPromise(propertyOrPromise)) {\n            jobs.push(propertyOrPromise.then((property) => (target.value = property.value)));\n          } else {\n            // Update the target value\n            target.value = propertyOrPromise.value;\n          }\n\n          return target;\n        })\n        // Clean orphan\n        .filter(isNotNil);\n\n      // Return as promise, when need\n      if (jobs.length) return Promise.all(jobs).then(() => targets as Property<T>[]);\n    }\n\n    return targets as Property<T>[];\n  }\n\n  static sanitize(\n    source: PropertyMap | Property[],\n    opts?: {\n      definitions?: FormFieldDefinition[];\n      includedKeys?: string[];\n    }\n  ): PropertyMap | Property[] {\n    if (!source) return source; // Skip if empty\n    const includedKeys = opts?.includedKeys ?? opts?.definitions.map((def) => def.key);\n    if (Array.isArray(source)) {\n      return source.filter((property) => property && (!includedKeys || includedKeys.includes(property.key)) && isNotNil(property.value));\n    }\n    return (includedKeys || Object.keys(source)).reduce(\n      (res, key) => {\n        if (isNotNil(source[key])) res[key] = source[key];\n        return res;\n      },\n      <PropertyMap>{}\n    );\n  }\n}\n\nexport class AppPropertyUtils {\n  static key(key: any): string {\n    return key?.key ?? key;\n  }\n\n  static getPropertyKey(source: Property | any): string {\n    if (!source) return undefined;\n    return (source.key as any)?.key ?? source.key;\n  }\n\n  /**\n   * Converts the given source to an object that contains a key-value pair.\n   *\n   * @param {Property<any> | any} source - The source property or any value to be converted.\n   * @param {FormFieldDefinition} [def] - The form field definition used for serialization.\n   * @param {Object} [opts] - Additional options for serialization.\n   * @param {string} [opts.defaultSerializeAttribute='id'] - The attribute to be used for default serialization.\n   * @return {{ key: string, value: string } | undefined} An object containing the serialized key-value pair, or undefined if the source is not provided.\n   */\n  static asObject(\n    source: Property<any> | any,\n    def?: FormFieldDefinition,\n    opts?: {\n      defaultSerializeAttribute?: string;\n    }\n  ): { key: string; value: string } | undefined {\n    if (!source) return undefined;\n    // Serialize key (WARNING: can be an object, when using autocomplete field to edit a key - see AppPropertiesForm)\n    const key = AppPropertyUtils.getPropertyKey(source);\n\n    // Prepare a deserialize function\n    let serializeFn = def?.serialize;\n    if (!serializeFn) {\n      switch (def?.type || 'other') {\n        case 'enum':\n        case 'enums':\n          serializeFn = AppPropertyUtils.key;\n          break;\n        case 'entity':\n        case 'entities': {\n          const serializeAttribute = def?.serializeAttribute ?? opts?.defaultSerializeAttribute ?? 'id';\n          serializeFn = (value) => {\n            const serializeValue = getPropertyByPath(value, serializeAttribute, value /*default value*/);\n            if (isNil(serializeValue)) return serializeValue;\n            return serializeValue.toString();\n          };\n          break;\n        }\n        default:\n          serializeFn = AppPropertyUtils.toString;\n      }\n    }\n\n    let valueStr: string;\n\n    // Value is an array\n    if (Array.isArray(source.value)) {\n      valueStr = source.value.map(serializeFn).filter(isNotNilOrBlank).join(',');\n    }\n    // Any other case\n    else {\n      valueStr = serializeFn(source.value);\n    }\n    return { key, value: valueStr };\n  }\n\n  static fromObject<T = string>(\n    source: Property | Property<T>,\n    def: FormFieldDefinition,\n    opts?: {\n      defaultSuggestFn: SuggestFn<any, any>;\n      defaultSuggestOptions?: EntitiesServiceLoadOptions;\n      defaultSerializeAttribute?: string;\n    }\n  ): Property<T> | Promise<Property<T>> {\n    if (!source?.key || isNil(source.value) || !def) return source as Property<T>; // Skip if no key\n\n    // Clone the source\n    const target: Property<any> = { key: source.key, value: source.value };\n\n    const jobs: Promise<any>[] = [];\n    // Resolve value\n    switch (def.type) {\n      case 'boolean':\n        target.value = toBoolean(source.value as any, toBoolean(def.defaultValue));\n        break;\n      case 'integer':\n      case 'double':\n        target.value = toNumber(source.value as any, toNumber(def.defaultValue));\n        break;\n      case 'enum':\n        const valueKey = AppPropertyUtils.key(target.value);\n        if (isNotNilOrBlank(valueKey)) {\n          const enumValue = (def.values as (string | Property)[])?.find((defValue) => defValue && valueKey === (defValue['key'] || defValue)) ?? null;\n          target.value = enumValue?.['key'] ?? enumValue ?? null;\n        } else {\n          target.value = null;\n        }\n        break;\n      case 'enums':\n        const valueKeys = Array.isArray(source.value)\n          ? source.value.map(AppPropertyUtils.key) // Copy\n          : typeof source.value === 'string'\n            ? source.value.trim().split(/,+/)\n            : [AppPropertyUtils.key(source.value)];\n        target.value = valueKeys\n          .filter(isNotNil)\n          .map(\n            (key: string) =>\n              (def.values as (string | Property)[])?.find((defValue) => defValue && key === (defValue['key'] || defValue)) || { key, value: '?' }\n          );\n        break;\n      case 'entity':\n        // Deserialize entity (e.g. load entity from the id)\n        const valueOrPromise = AppPropertyUtils.resolveEntity(target.value, def, opts);\n        if (isPromise(valueOrPromise)) {\n          jobs.push(\n            valueOrPromise.then((value) => {\n              target.value = value;\n            })\n          );\n        } else {\n          target.value = valueOrPromise as any;\n        }\n        break;\n      case 'entities':\n        // Convert value to array\n        target.value = Array.isArray(source.value)\n          ? source.value.slice() // Copy\n          : typeof source.value === 'string'\n            ? source.value\n                .split(',')\n                .map((v) => v.trim())\n                .filter(isNotNilOrBlank)\n            : [];\n\n        // Deserialize each sub-value\n        let index = 0;\n        for (let subValue of target.value) {\n          // Deserialize sub-value\n          const subValueOrPromise = AppPropertyUtils.resolveEntity(subValue, def, opts);\n\n          // Add promise to jobs\n          if (isPromise(subValueOrPromise)) {\n            const finalIndex = index;\n            jobs.push(\n              subValueOrPromise.then((value) => {\n                // Update sub value\n                target.value[finalIndex] = value;\n              })\n            );\n          } else {\n            // Update sub value\n            target.value[index] = subValueOrPromise as any;\n          }\n          index++;\n        }\n    }\n\n    // /!\\ Return as promise only if need (let function sync when possible)\n    if (jobs.length) return Promise.all(jobs).then(() => target);\n\n    return target;\n  }\n\n  private static resolveEntity(\n    value: any,\n    def: FormFieldDefinition,\n    opts?: {\n      defaultSuggestFn: SuggestFn<any, any>;\n      defaultSuggestOptions?: EntitiesServiceLoadOptions;\n      defaultSerializeAttribute?: string;\n    }\n  ): any | Promise<any> {\n    // Use deserialize function, if any\n    if (def.deserialize) {\n      return def.deserialize(value);\n    }\n\n    // Or try using suggest function\n    return this.resolveEntityBySuggest(value, def, opts);\n  }\n\n  private static async resolveEntityBySuggest(\n    value: any,\n    def: FormFieldDefinition,\n    opts?: {\n      defaultSuggestFn: SuggestFn<any, any>;\n      defaultSuggestOptions?: EntitiesServiceLoadOptions;\n      defaultSerializeAttribute?: string;\n    }\n  ): Promise<any> {\n    const serializeAttribute = def.serializeAttribute ?? opts?.defaultSerializeAttribute ?? 'id';\n    if (typeof value === 'object' && isNotNil(value[serializeAttribute])) {\n      return value; // Already resolve\n    }\n\n    const suggestFn: SuggestFn<any, any> = def.autocomplete?.suggestFn || opts?.defaultSuggestFn;\n    if (!suggestFn) {\n      console.warn(\n        `Missing 'deserialize' or 'autocomplete.suggestFn' in the field definition '${def.key}'. Cannot deserialize value: ${JSON.stringify(value)}`\n      );\n      return value; // Skip\n    }\n    let searchValue = value;\n    const filter = { ...def.autocomplete?.filter }; // Cope filter\n    if (serializeAttribute === 'id' || serializeAttribute === 'label') {\n      filter[serializeAttribute] = serializeAttribute === 'id' ? +value : value;\n      searchValue = '*';\n      // DEBUG\n      //console.debug(`[properties-utils] Resolving entity where id=${value}...`);\n    } else {\n      filter.searchAttribute = serializeAttribute;\n      // DEBUG\n      //console.debug(`[properties-utils] Resolving entity where ${serializeAttribute}=${searchValue}...`);\n    }\n\n    try {\n      // Fetch entity, using the suggest function\n      const res = await suggestFn(searchValue, filter, serializeAttribute, 'asc', {\n        withTotal: false,\n        offset: 0,\n        size: 1,\n        ...opts?.defaultSuggestOptions,\n      });\n\n      // Get result array\n      const data = Array.isArray(res) ? res : res.data;\n\n      if (data?.length > 0) {\n        if (data?.length > 1) {\n          console.warn(\n            `[properties-utils] More than one entity found, for option ${def.key}=${value}! Please check option's definition and the 'autocomplete.suggestFn' function`,\n            data\n          );\n        }\n\n        // DEBUG\n        //console.debug(`[properties-utils] ${data.length} entities found: `, data);\n\n        // Ok, we find it => stop here\n        return data[0];\n      }\n\n      // Warn, but continue\n      console.warn(\n        `[properties-utils] Unable to resolve entity for option: ${def.key}=${value}. Please check option's definition and the 'autocomplete.suggestFn' function`\n      );\n    } catch (err) {\n      console.error(`[properties-utils] Cannot resolve entity for option: ${def.key}=${value}`, err);\n      // Continue\n    }\n\n    // Create the missing result\n    const unresolvedEntity = <any>{\n      [serializeAttribute]: value,\n    };\n\n    // Fill attributes with '??'\n    def.autocomplete?.attributes?.forEach((key) => {\n      unresolvedEntity[key] = unresolvedEntity[key] ?? '';\n    });\n\n    return unresolvedEntity;\n  }\n\n  private static toString(value?: any): string {\n    return value?.toString();\n  }\n}\n","import { isMoment, Moment } from 'moment';\nimport { getPropertyByPath, isEmptyArray, isNil, isNilOrBlank, isNotNil, joinPropertiesPath } from '../../../shared/functions';\nimport { FilterFn, KeyValueType, ObjectMap, ObjectMapEntry } from '../../../shared/types';\nimport { StoreObject } from '@apollo/client/core';\nimport { fromDateISOString, toDateISOString } from '../../../shared/dates';\nimport { TreeItemEntityUtils } from './tree-item-entity.model';\nimport { SortDirection } from '@angular/material/sort';\nimport { AppPropertiesUtils } from '../../form/properties/properties.utils';\n\nexport declare interface Cloneable<T> {\n  clone(): T;\n}\n\nexport function entityToString(obj: Entity<any> | any, properties?: string[]): string | undefined {\n  return (obj && isNotNil(obj.id) && joinPropertiesPath(obj, properties || ['name'])) || undefined;\n}\n\nexport interface EntityAsObjectOptions {\n  minify?: boolean;\n  keepTypename?: boolean; // true by default\n  keepLocalId?: boolean; // true by default\n}\n\nexport interface IEntity<T, ID = number, AO extends EntityAsObjectOptions = EntityAsObjectOptions, FO = any> extends Cloneable<T> {\n  id: ID;\n  updateDate: Moment;\n  __typename: string;\n  equals(other: T): boolean;\n  clone(opts?: AO & FO): T;\n  copy(target: T, opts?: AO & FO): void;\n  asObject(opts?: AO): any;\n  fromObject(source: any, opts?: FO): void;\n}\n\nexport type OmitFunctions<T> = {\n  [K in keyof T as T[K] extends Function ? never : K]: T[K];\n};\n\n//@dynamic\nexport abstract class Entity<T extends Entity<T, ID, AO, FO>, ID = number, AO extends EntityAsObjectOptions = EntityAsObjectOptions, FO = any>\n  implements IEntity<T, ID, AO, FO>\n{\n  // The GraphQL typename (injected by @EntityClass())\n  static TYPENAME: string;\n\n  id: ID = null;\n  updateDate: Moment = null;\n  __typename: string;\n\n  constructor(__typename?: string) {\n    this.__typename = __typename || null;\n  }\n\n  clone(opts?: AO & FO): T {\n    const target = new (this.constructor as any)() as T;\n    this.copy(target, opts);\n    return target;\n  }\n\n  copy(target: T, opts?: AO & FO) {\n    target.fromObject(this.asObject(opts), opts);\n  }\n\n  asObject(opts?: AO): StoreObject {\n    const target: any = Object.assign({}, this); //= {...this};\n    if (!opts || opts.keepTypename !== true) delete target.__typename;\n    target.updateDate = toDateISOString(this.updateDate);\n    if (target.id == null || (opts && opts.keepLocalId === false && target.id < 0)) {\n      delete target.id;\n      delete target.updateDate; // Make to sens to keep updateDate of a local entity to save\n    }\n    return target;\n  }\n\n  fromObject(source: any, opts?: FO) {\n    this.id = source.id || source.id === 0 ? source.id : undefined;\n    this.updateDate = fromDateISOString(source.updateDate);\n    this.__typename = source.__typename || this.__typename; // Keep original type (can be set in constructor)\n  }\n\n  equals(other: T): boolean {\n    return other && this.id === other.id;\n  }\n}\n\n/**\n * @deprecated use standard instanceof instead\n * @param obj\n * @param constructor\n */\nexport function isInstanceOf<T>(obj: any, constructor: new (...args: any[]) => T): obj is T {\n  if (!obj) return false;\n\n  return obj instanceof constructor;\n}\n\n// @dynamic\nexport abstract class EntityUtils {\n  // Check that the object is an entity\n  static isEntity<T extends IEntity<any>>(obj: T | any): obj is T {\n    return isNotNil(obj?.__typename) && typeof obj.fromObject === 'function' && typeof obj.asObject === 'function';\n  }\n\n  // Check that the object has a NOT nil attribute (ID by default)\n  static isNotEmpty<T extends IEntity<any> | any>(obj: T, checkedAttribute: keyof T = <keyof T>'id'): boolean {\n    return !!obj && obj[checkedAttribute] !== null && obj[checkedAttribute] !== undefined;\n  }\n\n  // Check that the object has a nil attribute (ID by default)\n  static isEmpty<T extends IEntity<any> | any>(obj: T, checkedAttribute: keyof T = <keyof T>'id'): boolean {\n    return !obj || obj[checkedAttribute] === null || obj[checkedAttribute] === undefined;\n  }\n\n  static equals<T extends IEntity<any> | any>(o1: T, o2: T, checkAttribute?: keyof T): boolean {\n    checkAttribute = checkAttribute || ('id' as keyof T);\n    return o1 === o2 || (isNil(o1) && isNil(o2)) || (o1 && o2 && o1[checkAttribute] === o2[checkAttribute]);\n  }\n\n  static getPropertyByPath = getPropertyByPath;\n\n  static getArrayAsMap<T = any>(source?: ObjectMapEntry<T>[]): ObjectMap<T> {\n    return (source || []).reduce((res, item) => {\n      res[item.key] = item.value;\n      return res;\n    }, {});\n  }\n\n  static getMapAsArray<T = any>(source?: ObjectMap<T>): ObjectMapEntry<T>[] {\n    if (Array.isArray(source)) return source;\n    return Object.getOwnPropertyNames(source || {}).map((key) => ({\n      key,\n      value: source[key],\n    }));\n  }\n\n  static getPropertyArrayAsObject = AppPropertiesUtils.arrayAsObject;\n\n  static copyIdAndUpdateDate<T extends Entity<any, any, any>>(source: T, target: T) {\n    if (!source) return;\n\n    // Update (id and updateDate)\n    target.id = isNotNil(source.id) ? source.id : target.id;\n    target.updateDate = fromDateISOString(source.updateDate) || target.updateDate;\n\n    // Update creation Date, if exists\n    if (source['creationDate']) {\n      target['creationDate'] = fromDateISOString(source['creationDate']);\n    }\n  }\n\n  static async fillLocalIds<T extends IEntity<T, any>>(items: T[], sequenceFactory: (firstEntity: T, incrementSize: number) => Promise<number>) {\n    const newItems = (items || []).filter((item) => isNil(item.id) || item.id === 0);\n    if (isEmptyArray(newItems)) return;\n    // Get the sequence\n    let currentId = (await sequenceFactory(newItems[0], newItems.length)) + 1;\n    // Take the min (sequence, id), in case the sequence is corrupted\n    currentId = items.filter((item) => isNotNil(item.id) && item.id < 0).reduce((res, item) => Math.min(res, item.id), currentId);\n    newItems.forEach((item) => (item.id = --currentId));\n  }\n\n  static cleanIdAndUpdateDate<T extends IEntity<T, any>>(source: T, defaultValue = null) {\n    if (!source) return; // Skip\n    source.id = defaultValue;\n    source.updateDate = defaultValue;\n  }\n\n  static cleanIdsAndUpdateDates<T extends IEntity<T, any>>(items: T[], defaultValue = null) {\n    (items || []).forEach((item) => EntityUtils.cleanIdAndUpdateDate(item, defaultValue));\n  }\n\n  static sort<T extends IEntity<T, any> | any>(data: T[], sortBy?: keyof T | string, sortDirection?: SortDirection): T[] {\n    if (!data || data.length <= 1 || !sortBy) return data;\n    return data.sort(this.sortComparator(sortBy, sortDirection));\n  }\n\n  static sortComparator<T extends IEntity<T, any> | any>(sortBy?: keyof T | string, sortDirection?: SortDirection): (a: T, b: T) => number {\n    const after = !sortDirection || sortDirection === 'asc' ? 1 : -1;\n    const property = (sortBy || 'id') as string;\n    return (a, b) => {\n      const valueA = EntityUtils.getPropertyByPath(a, property);\n      const valueB = EntityUtils.getPropertyByPath(b, property);\n      return EntityUtils.compare(valueA, valueB, after);\n    };\n  }\n\n  static compare<T extends IEntity<T, any>>(value1: T, value2: T, direction: 1 | -1, checkAttribute?: keyof T): number {\n    checkAttribute = checkAttribute || 'id';\n    if (EntityUtils.isNotEmpty(value1, checkAttribute) && EntityUtils.isNotEmpty(value2, checkAttribute)) {\n      return EntityUtils.equals(value1, value2, checkAttribute) ? 0 : value1[checkAttribute] > value2[checkAttribute] ? direction : -1 * direction;\n    }\n    return value1 === value2 ? 0 : value1 > value2 ? direction : -1 * direction;\n  }\n\n  static compareValue<T>(value1: T, value2: T, direction: 1 | -1): number {\n    return value1 === value2 ? 0 : value1 > value2 ? direction : -1 * direction;\n  }\n\n  static filter<T extends IEntity<T, any> | any>(data: T[], searchAttribute: string, searchText: string): T[] {\n    const filterFn = this.searchTextFilter(searchAttribute, searchText);\n    return data.filter(filterFn);\n  }\n\n  static searchTextFilter<T extends IEntity<T, any> | any>(searchAttribute: string | string[], searchText: string): FilterFn<T> {\n    if (isNilOrBlank(searchAttribute) || isNilOrBlank(searchText)) return undefined; // filter not need\n\n    const searchRegexp = searchText\n      // Escape special characters\n      // eslint-disable-next-line no-useless-escape\n      .replace(/[-\\/\\\\^$+.()|[\\]{}]/g, '\\\\$&')\n      // Interpret * as any text\n      .replace(/[*]+/g, '.*')\n      // Interpret ? as one character\n      .replace(/[?]/g, '.');\n    if (searchRegexp === '.*') return undefined; // filter not need\n\n    const flags = 'i'; // don't use global regex search\n    const asPrefixPattern = '^' + searchRegexp;\n    const anyMatchPattern = '^.*' + searchRegexp;\n\n    // Only one search attributes\n    if (typeof searchAttribute === 'string') {\n      const isSimplePath = !searchAttribute || searchAttribute.indexOf('.') === -1;\n      const searchAsPrefix = searchAttribute.toLowerCase().endsWith('label') || searchAttribute.toLowerCase().endsWith('code');\n      const regexp = new RegExp((searchAsPrefix && asPrefixPattern) || anyMatchPattern, flags);\n      if (isSimplePath) {\n        return (a) => regexp.test(a[searchAttribute]);\n      } else {\n        return (a) => regexp.test(EntityUtils.getPropertyByPath(a, searchAttribute));\n      }\n    }\n\n    // many search attributes\n    else {\n      const regexps = searchAttribute.map((path) => {\n        const searchAsPrefix = path.toLowerCase().endsWith('label') || path.toLowerCase().endsWith('code');\n        return new RegExp((searchAsPrefix && asPrefixPattern) || anyMatchPattern, flags);\n      });\n      return (a) => searchAttribute.findIndex((path, index) => regexps[index].test(EntityUtils.getPropertyByPath(a, path))) !== -1;\n    }\n  }\n\n  /**\n   * Transform a batch entity tree into a array list. This method keep links parent/children.\n   *\n   * Method used to find batch without id (e.g. before local storage)\n   *\n   * @param source\n   */\n  static treeToArray = TreeItemEntityUtils.treeToArray;\n\n  static listOfTreeToArray = TreeItemEntityUtils.listOfTreeToArray;\n\n  /**\n   * Fill parent attribute, of all children found in the tree\n   *\n   * @param source\n   */\n  static treeFillParent = TreeItemEntityUtils.treeFillParent;\n\n  static isLocal(entity: IEntity<any, any> | Entity<any, any>): boolean {\n    return entity && isNotNil(entity.id) && +entity.id < 0;\n  }\n\n  static isRemote(entity: IEntity<any, any> | Entity<any, any>): boolean {\n    return entity && !EntityUtils.isLocal(entity);\n  }\n\n  static isLocalId(id: number): boolean {\n    return isNotNil(id) && +id < 0;\n  }\n\n  static isRemoteId(id: number): boolean {\n    return isNotNil(id) && +id >= 0;\n  }\n\n  static getId<T extends IEntity<T, ID> = IEntity<any, any>, ID = any>(entity: T): ID {\n    return entity.id;\n  }\n\n  // Check that the object has an ID\n  static hasId<T extends IEntity<any, any> = IEntity<any, any>>(entity: T): boolean {\n    return isNotNil(entity?.id);\n  }\n\n  // Check that the object has an nil ID\n  static hasNilId<T extends IEntity<any, any> = IEntity<any, any>>(entity: T): boolean {\n    return isNil(entity?.id);\n  }\n\n  /**\n   * Splits an array of entities into a key-value map using an entity ID as the key.\n   *\n   * @param {Array<T>} entities - The array of entities to be split by their ID.\n   * @return {KeyValueType<T>} A key-value map with entity IDs as keys and entities as values.\n   */\n  static splitById<T extends IEntity<T, ID>, ID = any>(entities: T[]): KeyValueType<T> {\n    return (entities || []).reduce(\n      (res, item) => {\n        const key = item?.id;\n        if (typeof key === 'number' || typeof key === 'string') {\n          res[key] = item;\n        }\n        return res;\n      },\n      <KeyValueType<T>>{}\n    );\n  }\n\n  /**\n   * Collects the IDs from an array of entities and returns them as an array.\n   *\n   * @param {T[]} entities - An array of entities from which to collect IDs.\n   * @return {ID[]} An array of IDs collected from the entities.\n   */\n  static collectIds<T extends IEntity<T, ID>, ID = any>(entities: T[]): ID[] {\n    return (entities || []).map((e) => e.id);\n  }\n\n  /**\n   * @deprecated Use collectIds() instead - will be remove in next major release\n   */\n  static collectById<T extends IEntity<T, ID>, ID = any>(entities: T[]): ID[] {\n    return (entities || []).map((e) => e.id);\n  }\n\n  static arrayDistinctFilterFn<E extends IEntity<any, any>>(item: E, index: number, values: E[]): boolean {\n    return values.findIndex((e) => e.id === item.id) === index;\n  }\n\n  static findById<E extends IEntity<any, ID> = IEntity<any, any>, ID = number>(items: E[], id: ID): E | undefined {\n    return (items || []).find((g) => g.id === id);\n  }\n\n  static fromObject<E extends IEntity<any, any>>(source: any, dataType: new () => E): E {\n    if (!source) return source;\n    if (source instanceof dataType) return source as E;\n    const target = new dataType();\n    if (EntityUtils.isEntity(target)) {\n      target.fromObject(source);\n    } else {\n      Object.assign(target, source);\n    }\n    return target;\n  }\n\n  /**\n   * Recursively converts any object, entity, or array to a plain JavaScript object.\n   * This method handles entities by calling their asObject() method, processes arrays recursively,\n   * and provides protection against circular references.\n   *\n   * @param {any} source - The source object, entity, array, or primitive value to convert\n   * @param {any} [opts] - Optional configuration object passed to entity asObject() methods\n   * @param {WeakSet} [visited=new WeakSet()] - Internal parameter for circular reference detection\n   * @returns {any} A plain JavaScript object representation of the source\n   *\n   * @example\n   * // Convert a simple entity\n   * const plainObject = EntityUtils.asObject(myEntity);\n   *\n   * @example\n   * // Convert an array of entities\n   * const plainArray = EntityUtils.asObject([entity1, entity2]);\n   *\n   * @example\n   * // Convert with options\n   * const result = EntityUtils.asObject(myEntity, { minify: true });\n   */\n  static asObject(source: any, opts?: EntityAsObjectOptions, visited = new WeakSet()): any {\n    if (!source) return source;\n    if (Array.isArray(source)) return source.map((item) => EntityUtils.asObject(item, opts, visited));\n    if (EntityUtils.isEntity(source)) return source.asObject(opts);\n    if (typeof source === 'function') return undefined;\n    if (typeof source !== 'object') return source;\n    if (isMoment(source)) return toDateISOString(source);\n\n    // Handle special objects\n    if (isMoment(source) || typeof source.toISOString === 'function') return source.toISOString();\n    if (source instanceof RegExp) return source.toString();\n\n    // Protection against circular references\n    if (visited.has(source)) {\n      console.warn('[EntityUtils.asObject] Circular reference detected, skipping object');\n      return {}; // or return null based on your needs\n    }\n    visited.add(source);\n\n    // Create a copy\n    const target = { ...source };\n\n    // Serialize all properties recursively\n    Object.keys(target).forEach((key) => {\n      const value = target[key];\n\n      // Handle arrays\n      if (Array.isArray(value)) {\n        target[key] = value.map((item) => EntityUtils.asObject(item, opts, visited));\n      }\n      // Handle objects (including entities)\n      else if (value && typeof value === 'object') {\n        target[key] = EntityUtils.asObject(value, opts, visited);\n      }\n      // Spread operator already copies primitive values\n    });\n\n    // Remove typename if minify\n    if (opts?.minify || opts?.keepTypename === false) {\n      delete target['__typename'];\n    }\n    if (opts?.keepLocalId && EntityUtils.isLocal(target)) {\n      delete target.id;\n    }\n\n    // Remove the object from Set after processing\n    visited.delete(source);\n\n    return target;\n  }\n}\n","import { LoadResult } from './services/entity-service.class';\nimport {\n  getPropertyByPathAsString,\n  isNotEmptyArray,\n  isNotNil,\n  isNotNilObject,\n  isNotNilOrBlank,\n  propertiesPathComparator,\n  startsWithUpperCase,\n} from './functions';\nimport { SortDirection } from '@angular/material/sort';\nimport { EntityUtils } from '../core/services/model/entity.model';\nimport { RegExpUtils } from './regexps';\n\nexport function suggestFromArray<T = any>(\n  items: T[],\n  value: any,\n  filter?: {\n    id?: number;\n    offset?: number;\n    size?: number;\n    searchAttribute?: string;\n    searchAttributes?: string[];\n    includedIds?: number[];\n    excludedIds?: number[];\n    skipSort?: boolean;\n    anySearch?: boolean;\n  },\n  sortBy?: keyof T | string,\n  sortDirection?: SortDirection,\n  opts?: {\n    offset?: number;\n    size?: number;\n    [key: string]: any;\n  }\n): LoadResult<T> {\n  // Value is an array: use it\n  if (Array.isArray(value)) return { data: value as T[] };\n  // Value is an object: use it (wrapped in an array)\n  if (isNotNilObject(value)) return { data: [value as T] };\n\n  value = (typeof value === 'string' && value !== '*' && value.toUpperCase()) || undefined;\n\n  const keys = (filter && ((filter.searchAttribute && [filter.searchAttribute]) || filter.searchAttributes)) || ['label'];\n\n  if (!items) {\n    return { data: [], total: 0 };\n  }\n\n  // Filter items\n  let filteredItems = items;\n  if (isNotNilOrBlank(value)) {\n    let cleanSearchText = RegExpUtils.cleanSearchText(value as string);\n    if (cleanSearchText.length > 0) {\n      // If wildcard, search using a regexp\n      if (filter?.anySearch || RegExpUtils.hasWildcardCharacter(cleanSearchText)) {\n        const regexp = RegExpUtils.compileSearchRegexp(cleanSearchText, 'i');\n        filteredItems = filteredItems.filter((v) => keys.some((key) => RegExpUtils.match(getPropertyByPathAsString(v, key), regexp)));\n      }\n      // Else (no wildcard), search using startsWith\n      else {\n        cleanSearchText = cleanSearchText.toUpperCase();\n        filteredItems = filteredItems.filter((v) => keys.some((key) => startsWithUpperCase(getPropertyByPathAsString(v, key), cleanSearchText)));\n      }\n    }\n  }\n\n  // Included ids\n  const includedIds = filter?.includedIds || (isNotNil(filter?.id) ? [filter.id] : null);\n  if (isNotEmptyArray(includedIds)) {\n    filteredItems = filteredItems.filter((v) => includedIds.includes(+v['id']));\n  }\n\n  // Exclude ids\n  if (isNotEmptyArray(filter?.excludedIds)) {\n    const excludedIds = filter.excludedIds;\n    filteredItems = filteredItems.filter((v) => !excludedIds.includes(+v['id']));\n  }\n\n  // Sort\n  if (!filter || filter.skipSort !== true) {\n    // Make to copy input items, before sorting (if not yet already done)\n    // (to keep original items unchanged)\n    if (filteredItems === items) filteredItems = filteredItems.slice();\n\n    // Sort by given attributes\n    if (sortBy) {\n      EntityUtils.sort(filteredItems, sortBy, sortDirection);\n    }\n    // Sort by each keys\n    else {\n      filteredItems.sort(propertiesPathComparator(keys));\n    }\n  }\n\n  const total = filteredItems.length || 0;\n\n  // Pagination (truncate if need)\n  let pageData = filteredItems;\n  const offset = filter?.offset ?? opts?.offset ?? 0;\n  const size = filter?.size ?? opts?.size;\n  if ((offset || 0) > 0) {\n    pageData = pageData.slice(offset);\n  }\n  if (isNotNil(size) && pageData.length > filter.size) {\n    pageData = pageData.slice(0, size);\n  }\n\n  const result: LoadResult<T> = {\n    data: pageData,\n    total,\n  };\n\n  // Add fetch more capability, if total was fetched\n  const nextOffset = offset + pageData.length;\n  if (nextOffset < total) {\n    result.fetchMore = async (_) =>\n      suggestFromArray(\n        filteredItems,\n        undefined /*OPTIMISATION: already filtered*/,\n        {\n          ...filter,\n          offset: nextOffset,\n          skipSort: true, // OPTIMISATION: already sorted\n          excludedIds: undefined, // OPTIMISATION: already filtered\n        },\n        sortBy,\n        sortDirection,\n        opts\n      );\n  }\n\n  return result;\n}\n","import { isNotNil, joinPropertiesPath } from '../../functions';\nimport { DEFAULT_JOIN_ARRAY_VALUES_SEPARATOR } from '../../constants';\n\nimport { DisplayFn } from '../../types';\n\nexport class MatAutocompleteFieldUtils {\n  static createDisplayFn(displayAttributes: string[], multiple = false, propertySeparator?: string, itemSeparator?: string): DisplayFn {\n    // if multiple (manage array)\n    if (multiple) {\n      return (value) =>\n        Array.isArray(value)\n          ? (value || []).map((obj) => obj && joinPropertiesPath(obj, displayAttributes)).join(itemSeparator || DEFAULT_JOIN_ARRAY_VALUES_SEPARATOR)\n          : value && joinPropertiesPath(value, displayAttributes, propertySeparator);\n    }\n    // Join properties\n    return (obj) => obj && joinPropertiesPath(obj, displayAttributes);\n  }\n\n  static defaultEquals(o1: any, o2: any) {\n    return isNotNil(o1?.id) && o1.id === o2?.id;\n  }\n}\n","import {Directive} from '@angular/core';\n\n\n@Directive({\n  selector: 'ng-template[panelHeader]',\n  standalone: false\n})\nexport class MaterialAutocompleteHeaderDirective {}\n\n@Directive({\n  selector: 'ng-template[panelFooter]',\n  standalone: false\n})\nexport class MaterialAutocompleteFooterDirective {}\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Injector,\n  Input,\n  numberAttribute,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  Provider,\n  Renderer2,\n  RendererStyleFlags2,\n  TemplateRef,\n  ViewChild\n} from '@angular/core';\nimport {DOCUMENT} from '@angular/common';\nimport {ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormControl, Validators} from '@angular/forms';\nimport {BehaviorSubject, isObservable, merge, Observable, Subject, Subscription, timer} from 'rxjs';\nimport {debounceTime, distinctUntilChanged, filter, map, mergeMap, startWith, switchMap, takeUntil, tap, throttleTime} from 'rxjs/operators';\nimport {FetchMoreFn, LoadResult, SuggestFn} from '../../services/entity-service.class';\nimport {changeCaseToUnderscore, findParentWithClass, isNil, isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilObject, isNotNilOrBlank, isNotNilString, propertiesPathComparator,} from '../../functions';\nimport {focusInput, InputElement, selectInputContent, selectInputRange} from '../../inputs';\nimport {firstNotNilPromise, waitFor} from '../../observables';\nimport {MatFormFieldAppearance, SubscriptSizing} from '@angular/material/form-field';\nimport {MatSelect, MatSelectChange} from '@angular/material/select';\nimport {MatAutocomplete, MatAutocompleteSelectedEvent, MatAutocompleteTrigger} from '@angular/material/autocomplete';\nimport {fromScrollEndEvent} from '../../events';\nimport {IonSearchbar, ModalController} from '@ionic/angular';\nimport {isMobile} from '../../platforms';\nimport {suggestFromArray} from '../../services';\nimport {SearchbarChangeEventDetail} from '@ionic/core/dist/types/components/searchbar/searchbar-interface';\nimport {MatAutocompleteFieldUtils} from './material.autocomplete.utils';\nimport {MatAutocompleteFieldConfig} from './material.autocomplete.config';\n\n\nimport {APP_SHOW_TOOLTIP, DEFAULT_JOIN_PROPERTIES_SEPARATOR} from '../../constants';\nimport {RegExpUtils} from '../../regexps';\nimport {AppFloatLabelType, DisplayFn, EqualsFn} from '../../types';\nimport {MaterialAutocompleteFooterDirective, MaterialAutocompleteHeaderDirective} from './material.autocomplete.directive';\n\nconst noop = () => {};\nexport interface MatAutocompleteFieldSelectChange {\n  source: MatSelect | MatAutocomplete;\n  value: any;\n}\n\nexport interface MatAutocompleteFieldToggleFavorite {\n  source: MatSelect | MatAutocomplete;\n  value: any;\n}\n\nconst DEFAULT_VALUE_ACCESSOR: Provider = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => MatAutocompleteField),\n  multi: true,\n};\n\n@Component({\n    // eslint-disable-next-line @angular-eslint/component-selector\n    selector: 'mat-autocomplete-field',\n    styleUrls: ['./material.autocomplete.scss'],\n    templateUrl: './material.autocomplete.html',\n    providers: [DEFAULT_VALUE_ACCESSOR],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    standalone: false\n})\nexport class MatAutocompleteField implements OnInit, AfterViewInit, OnDestroy, InputElement, ControlValueAccessor {\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n\n  private _onFetchMoreCallback: FetchMoreFn<LoadResult<any>>;\n  private _implicitValue: any;\n  private _subscription = new Subscription();\n  private _itemsSubscription: Subscription;\n  private _openedSubscription: Subscription;\n  private _$filter = new BehaviorSubject<any>(undefined);\n  private _itemCount: number;\n  private _suggestExecutionId: number = 0; // Identifier of the suggest job\n  private _reload$ = new Subject<any>();\n  private _destroy$ = new Subject<void>();\n\n  protected _readonly = false;\n  protected _tabindex: number;\n  protected _$inputItems = new BehaviorSubject<any[]>(undefined);\n  protected _$filteredItems = new BehaviorSubject<any[]>(undefined);\n  protected _selectedItem: any;\n  protected _displayValue = '';\n  protected _moreItemsCount: number;\n  protected _fetchMore$ = new EventEmitter<Event>();\n  protected _defaultPanelWidth: string = null;\n  protected _focused = false;\n  protected _panelClosedAtTime: number;\n\n  protected get searchText(): string | undefined {\n    return this.matInputText?.nativeElement.value ?? this.ionSearchbar?.value;\n  }\n\n  @Input() equals: EqualsFn;\n  @Input() logPrefix = '[mat-autocomplete]';\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string = null;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() label: string = null;\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() subscriptSizing: SubscriptSizing;\n  @Input() placeholder: string;\n  @Input() suggestFn: SuggestFn<any, any>;\n  @Input({ transform: booleanAttribute }) required = false;\n  @Input({ transform: booleanAttribute }) hideRequiredMarker = false;\n  @Input({ transform: booleanAttribute }) mobile: boolean;\n  @Input({ transform: booleanAttribute }) showPanelHeader: boolean = true;\n  @Input({ transform: booleanAttribute }) showPanelFooter: boolean = true;\n  @Input({ transform: booleanAttribute }) clearable = false;\n  @Input({ transform: numberAttribute }) debounceTime: number = null;\n  @Input() displaySeparator: string | null;\n  @Input() displayWith: DisplayFn | null;\n  @Input() displayAttributes: string[];\n  @Input() displayColumnSizes: (number | 'auto' | undefined)[];\n  @Input() displayColumnNames: string[];\n  @Input({ transform: booleanAttribute }) highlightAccent: boolean;\n  @Input({ transform: booleanAttribute }) showAllOnFocus: boolean;\n  @Input({ transform: booleanAttribute }) showPanelOnFocus: boolean;\n  @Input({ transform: booleanAttribute }) reloadItemsOnFocus: boolean;\n  @Input({ transform: booleanAttribute }) clearInvalidValueOnBlur: boolean;\n  @Input({ transform: booleanAttribute }) autofocus = false;\n  @Input() config: MatAutocompleteFieldConfig;\n  @Input() i18nPrefix = 'REFERENTIAL.';\n  @Input() noResultMessage = 'COMMON.NO_RESULT';\n  @Input() panelClass: string;\n  @Input() panelWidth: string;\n  @Input({ transform: booleanAttribute }) disableRipple = false;\n  @Input() matAutocompletePosition: 'auto' | 'above' | 'below';\n  @Input({ transform: booleanAttribute }) multiple: boolean;\n  @Input() fetchMoreThreshold = '15%';\n  @Input({ transform: numberAttribute }) suggestLengthThreshold: number = null;\n  @Input({ transform: booleanAttribute }) showLoadingSpinner = true;\n  @Input({ transform: booleanAttribute }) debug = false;\n  @Input({ transform: booleanAttribute }) showSearchBar = true;\n  @Input({ transform: booleanAttribute }) stickySearchBar = false;\n  @Input() applyImplicitValue: boolean | ((value: any) => boolean);\n  @Input() dropButtonTitle: string;\n  @Input() clearButtonTitle: string;\n  @Input({ transform: booleanAttribute }) trimSearchText: boolean;\n  @Input({ transform: booleanAttribute }) splitSearchText: boolean;\n  @Input({ transform: booleanAttribute }) selectInputContentOnFocus: boolean;\n  @Input({ transform: numberAttribute }) selectInputContentOnFocusDelay: number;\n  @Input({ transform: booleanAttribute }) previewImplicitValue: boolean;\n  @Input() showFavorites = true;\n  @Input() toggleFavoriteTitle = 'COMMON.BTN_ADD_TO_FAVORITES';\n  @Input() favoriteItems: any[] = [];\n  @Input() colSizes: [number | 'auto', number | 'auto'] = [undefined, 'auto'];\n\n  /**\n   * @deprecated Use panelClass instead\n   */\n  @Input({ alias: 'class' }) set classList(value: string) {\n    this.panelClass = value;\n  }\n\n  get classList(): string {\n    return this.panelClass;\n  }\n\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('click') clicked = new EventEmitter<MouseEvent>();\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('blur') blurred = new EventEmitter<FocusEvent>();\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('focus') focused = new EventEmitter<FocusEvent>();\n  @Output() dropButtonClick = new EventEmitter<Event>(true);\n  @Output('keydown.escape') keydownEscape = new EventEmitter<Event>();\n  @Output('keydown.backspace') keydownBackspace = new EventEmitter<Event>();\n\n  /**\n   * @deprecated Prefer using the `@Output('enter')` instead\n   */\n  @Output('keyup.enter') keyupEnter = new EventEmitter<Event>();\n\n  @Output('arrowUp') arrowUp = new EventEmitter<Event | KeyboardEvent>();\n  @Output('arrowDown') arrowDown = new EventEmitter<Event | KeyboardEvent>();\n  @Output('enter') enter = new EventEmitter<Event | KeyboardEvent>();\n\n  @Output('selectionChange') selectionChange = new EventEmitter<MatAutocompleteFieldSelectChange>();\n  @Output('openedChange') openedChange = new EventEmitter<boolean>();\n  @Output('toggleFavorite') toggleFavorite = new EventEmitter<MatAutocompleteFieldToggleFavorite>();\n\n  @ViewChild('matSelect') matSelect: MatSelect;\n  @ViewChild('ionSearchbar') ionSearchbar: IonSearchbar;\n  @ViewChild('matInputText') matInputText: ElementRef<HTMLInputElement>;\n  @ViewChild(MatAutocomplete) autocomplete: MatAutocomplete;\n  @ViewChild(MatAutocompleteTrigger) autocompleteTrigger: MatAutocompleteTrigger;\n\n  @ContentChild(MaterialAutocompleteHeaderDirective, { read: TemplateRef })\n  panelHeaderTemplate?: TemplateRef<any>;\n\n  @ContentChild(MaterialAutocompleteFooterDirective, { read: TemplateRef })\n  panelFooterTemplate?: TemplateRef<any>;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected injector: Injector,\n    protected el: ElementRef<HTMLElement>,\n    protected cd: ChangeDetectorRef,\n    protected modalController: ModalController,\n    protected renderer: Renderer2,\n    @Optional() private formGroupDir: FormGroupDirective\n  ) {}\n\n  get itemCount(): number {\n    return this._itemCount;\n  }\n\n  get canFetchMore(): boolean {\n    return this._onFetchMoreCallback && this._moreItemsCount > 0;\n  }\n\n  @Input() set filter(value: any) {\n    if (value !== this._$filter.value) {\n      // DEBUG\n      //console.debug(this.logPrefix + \" Setting filter:\", value);\n      this._$filter.next(value);\n    }\n  }\n\n  get filter(): any {\n    return this._$filter.value;\n  }\n\n  @Input({ transform: booleanAttribute }) set readonly(value: boolean) {\n    this._readonly = value;\n    this.markForCheck();\n  }\n\n  get readonly(): boolean {\n    return this._readonly;\n  }\n\n  @Input() set tabindex(value: number) {\n    this._tabindex = value;\n    this.markForCheck();\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  @Input() set items(value: Observable<any[]> | any[]) {\n    // Remove previous subscription on items (if exists)\n    if (this._itemsSubscription) {\n      console.warn(this.logPrefix + ' Items received twice!');\n      this._subscription.remove(this._itemsSubscription);\n      this._itemsSubscription.unsubscribe();\n    }\n\n    if (isObservable(value)) {\n      this._itemsSubscription = value.subscribe((v) => this._$inputItems.next(v));\n      this._subscription.add(this._itemsSubscription);\n    } else {\n      if (value !== this._$inputItems.value) {\n        this._$inputItems.next(value as any[]);\n      }\n    }\n  }\n\n  get items(): Observable<any[]> | any[] {\n    return this._$inputItems;\n  }\n\n  get value(): any {\n    return this.formControl.value;\n  }\n\n  get disabled(): boolean {\n    return this._readonly || this.formControl.disabled;\n  }\n\n  get enabled(): boolean {\n    return !this._readonly && this.formControl.enabled;\n  }\n\n  get loading(): boolean {\n    return isNil(this._$filteredItems.value);\n  }\n\n  ngOnInit() {\n    this.formControl =\n      this.formControl ?? (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-autocomplete-field>.\");\n\n    // Configuration from config object\n    if (this.config) {\n      this.suggestFn = this.suggestFn ?? this.config.suggestFn;\n      if (!this.suggestFn && this.config.items) {\n        this.items = this.config.items;\n      }\n      this.filter = this.filter ?? this.config.filter;\n      this.displayAttributes = this.displayAttributes ?? this.config.attributes;\n      this.displayColumnSizes = this.displayColumnSizes ?? this.config.columnSizes;\n      this.displayColumnNames = this.displayColumnNames ?? this.config.columnNames;\n      this.displaySeparator = this.displaySeparator ?? this.config.displayWithSeparator;\n      this.displayWith = this.displayWith ?? this.config.displayWith;\n      this.splitSearchText = this.splitSearchText ?? this.config.splitSearchText;\n      this.trimSearchText = this.trimSearchText ?? this.config.trimSearchText;\n      this.equals = this.equals ?? this.config.equals;\n      this.multiple = this.multiple ?? this.config.multiple;\n      this.mobile = this.mobile ?? this.config.mobile;\n      this.suggestLengthThreshold = this.suggestLengthThreshold ?? this.config.suggestLengthThreshold;\n      this.showAllOnFocus = this.showAllOnFocus ?? this.config.showAllOnFocus;\n      this.showPanelOnFocus = this.showPanelOnFocus ?? this.config.showPanelOnFocus;\n      this.reloadItemsOnFocus = this.reloadItemsOnFocus ?? this.config.reloadItemsOnFocus;\n      this.panelClass = this.panelClass ?? this.config.panelClass ?? this.config.class;\n      this.panelWidth = this.panelWidth ?? this.config.panelWidth;\n      this.debounceTime = this.debounceTime ?? this.config.debounceTime;\n      this.highlightAccent = this.highlightAccent ?? this.config.highlightAccent;\n      this.applyImplicitValue = this.applyImplicitValue ?? this.config.applyImplicitValue;\n      this.selectInputContentOnFocus = this.selectInputContentOnFocus ?? this.config.selectInputContentOnFocus;\n      this.selectInputContentOnFocusDelay = this.selectInputContentOnFocusDelay ?? this.config.selectInputContentOnFocusDelay;\n      this.clearInvalidValueOnBlur = this.clearInvalidValueOnBlur ?? this.config.clearInvalidValueOnBlur;\n      this.previewImplicitValue = this.previewImplicitValue ?? this.config.previewImplicitValue;\n    }\n\n    // Default values\n    this.required = this.required ?? this.formControl.hasValidator(Validators.required);\n    this.multiple = this.multiple ?? false;\n    this.mobile = this.mobile ?? isMobile(window);\n    this.displayAttributes = this.displayAttributes ?? this.filter?.attributes ?? ['label', 'name'];\n    this.displaySeparator = this.displaySeparator ?? DEFAULT_JOIN_PROPERTIES_SEPARATOR;\n    this.displayWith = this.displayWith || MatAutocompleteFieldUtils.createDisplayFn(this.displayAttributes, this.multiple, this.displaySeparator);\n    this.splitSearchText = this.splitSearchText ?? true;\n    this.trimSearchText = this.trimSearchText ?? !this.mobile; // True by default on desktop, but false in mobile (not need in the searchbar)\n    this.equals = this.equals || MatAutocompleteFieldUtils.defaultEquals;\n    this.colSizes = this.colSizes ?? [undefined, 'auto'];\n\n    this.displayColumnSizes =\n      this.displayColumnSizes ||\n      // if only column: auto size\n      (this.displayAttributes.length === 1 && [undefined]) ||\n      // Computed column size:\n      // - if label then col size = 2\n      // - if rankOrder then col size = 1\n      // - ese => auto size\n      this.displayAttributes.map((attr) => attr && (attr.endsWith('label') ? 3 : attr.endsWith('rankOrder') ? 2 : undefined));\n    this.displayColumnNames = this.displayAttributes.map(\n      (attr, index) => (this.displayColumnNames && this.displayColumnNames[index]) || this.i18nPrefix + changeCaseToUnderscore(attr).toUpperCase()\n    );\n\n    // No more need, because setting the panelWidth will force a width, instead of a min-width\n    /*const panelClasses = this.panelClass?.split(/\\s+/);\n    this.panelWidth =\n      this.panelWidth ??\n      (panelClasses &&\n        ((panelClasses.includes('min-width-medium') && '300px') ||\n          (panelClasses.includes('min-width-large') && '400px') ||\n          (panelClasses.includes('min-width-xlarge') && '450px') ||\n          (panelClasses.includes('min-width-80vw') && '80vw') ||\n          ((panelClasses.includes('full-width') || panelClasses.includes('full-size')) && '100vw')));*/\n\n    this.suggestLengthThreshold = this.suggestLengthThreshold ?? 0;\n    this.showAllOnFocus = this.showAllOnFocus ?? (this.mobile && this.suggestLengthThreshold <= 0);\n    this.showPanelOnFocus = this.showPanelOnFocus ?? true;\n    this.reloadItemsOnFocus = this.reloadItemsOnFocus ?? false;\n    this.debounceTime = this.debounceTime ?? (this.mobile ? 650 : 250);\n    this.highlightAccent = this.highlightAccent ?? false;\n    this.matAutocompletePosition = this.matAutocompletePosition ?? 'auto';\n    this.applyImplicitValue = this.applyImplicitValue ?? !this.mobile;\n    this.selectInputContentOnFocus = this.selectInputContentOnFocus ?? false;\n    this.selectInputContentOnFocusDelay = this.selectInputContentOnFocusDelay ?? 0;\n    this.clearInvalidValueOnBlur = this.clearInvalidValueOnBlur ?? false;\n    this.previewImplicitValue = this.previewImplicitValue ?? false;\n\n    // No suggestFn: filter on the given items\n    if (!this.suggestFn) {\n      const suggestFromArrayFn: SuggestFn<any, any> = async (value, filter) =>\n        // DEBUG\n        //if (this.debug) console.debug(this.logPrefix + ' Calling suggestFromArray with value=', value);\n\n        suggestFromArray(this._$inputItems.value, value, {\n          searchAttributes: this.displayAttributes,\n          ...filter,\n        });\n\n      // Wait (once) that items are loaded, then call suggest from array fn\n      this.suggestFn = async (value, filter) => {\n        if (isNil(this._$inputItems.value)) {\n          // DEBUG\n          //if (this.debug) console.debug(this.logPrefix + \" Waiting items to be set...\");\n\n          await firstNotNilPromise(this._$inputItems, { stop: this._destroy$ });\n\n          // DEBUG\n          //if (this.debug) console.debug(this.logPrefix + \" Received items:\", this.inputItems$.value);\n        }\n        this.suggestFn = suggestFromArrayFn;\n\n        return this.suggestFn(value, filter); // Loop\n      };\n    }\n\n    // Send value to suggest when :\n    // - is nil and '*', and no min length threshold\n    // - is not nil and not a string type (e.g. object)\n    // - is not nil and is a string, and has enough character\n    const thresholdFilterFn = (value: any) =>\n      this.suggestLengthThreshold <= 0 ||\n      (isNotNil(value) && (!(typeof value === 'string') || (value !== '*' && value.trim().length >= this.suggestLengthThreshold)));\n\n    const filteredItemsChanges = merge(\n      // Reload event (no distinctUntilChanged() pipe, to force reload even if same value)\n      this._reload$.pipe(\n        filter(() => this.enabled),\n        filter(thresholdFilterFn),\n        tap(() => this.showLoadingSpinner && this.markAsLoading())\n      ),\n\n      // Search text (no distinctUntilChanged() because of the debounceTime() pipe)\n      this.formControl.valueChanges.pipe(\n        filter((value) => this.enabled && isNotNilString(value)),\n        // Mark as loading (to show loading spinner) - as soon as possible, and before debounceTime\n        tap(() => this.showLoadingSpinner && this.markAsLoading()),\n        // Filter if not enough character\n        filter((value) => {\n          if ((value?.length || 0) < this.suggestLengthThreshold) {\n            // Update display value, to enable the message \"not enough characters\"\n            this._displayValue = value;\n            return false;\n          }\n          return true;\n        }),\n        // Wait a debounce time\n        debounceTime(this.debounceTime)\n        // DEBUG\n        //,tap((value) => this.debug && console.debug(this.logPrefix + ' Search text changes:', value))\n      ),\n\n      // Object set: use it (no distinctUntilChanged() pipe need)\n      this.formControl.valueChanges.pipe(\n        startWith<any>(this.formControl.value),\n        filter((value) => isNotNilObject(value)),\n        tap((value) => {\n          // DEBUG\n          //if (this.debug) console.debug(this.logPrefix + ' Received control value changes:', value);\n\n          // Update the display value (if need)\n          const displayValue = this.displayWith(value) || '';\n          if (this._displayValue !== displayValue) {\n            this._displayValue = displayValue;\n\n            // Apply to the input[type=text] field\n            this.setInputTextValue(this._displayValue);\n            this.markForCheck();\n          }\n        }),\n\n        // If multiple: do not recompute items (only for the first time, when loading)\n        // when formControl value changes\n        filter(() => this.loading || (!this.multiple && !this.showAllOnFocus))\n      ),\n\n      // Merge some observables, with a common distinctUntilChanged() pipe\n      merge(\n        // On dropdown button click (no debounceTime)\n        this.dropButtonClick.pipe(filter((event) => !event || !event.defaultPrevented)),\n        // Focus or click => Load all (no debounceTime)\n        merge(this.focused, this.clicked)\n          // Avoid too many call, e.g. when focused and clicked\n          .pipe(throttleTime(100)),\n        // DEBUG\n        //.pipe(tap((_) => this.debug && console.debug(this.logPrefix + ' Received focused or clicked event'))),\n        // Input items or filter changes\n        merge(this._$inputItems, this._$filter).pipe(\n          filter(() => !this.loading)\n          // DEBUG\n          //tap((_) => this.debug && console.debug(this.logPrefix + ' Received $inputItems or filter event'))\n        )\n      ).pipe(\n        filter(() => this.enabled),\n        map(() => (this.multiple ? this.searchText : this.showAllOnFocus ? '*' : this.formControl.value)),\n        // Distinguish changes\n        distinctUntilChanged((v1, v2) =>\n          // If loading (not loaded yet), simulate that value changed to force load\n          this.loading ? false : v1 === v2 || this.equals(v1, v2)\n        ),\n        // Make sure there is enough characters\n        filter(thresholdFilterFn)\n        // DEBUG\n        //tap((value) => this.debug && console.debug(this.logPrefix + ' Received update event: ', value))\n      )\n    ).pipe(\n      // Suggest values\n      mergeMap((value) => this.suggest(value, this.filter)),\n\n      // Ignore undefined result (e.g. when a newer suggest call is running)\n      filter(isNotNil),\n\n      // DEBUG\n      //tap(items => this.debug && console.debug(this.logPrefix + ' Received from suggest: ', items)),\n\n      // Store implicit value (will use it onBlur if not other value selected)\n      tap((items) => !(this.mobile || this.multiple) && this.updateImplicitValue(items))\n    );\n\n    // Fetch more events\n    const fetchMoreItemsChanges = this._fetchMore$.pipe(\n      tap((event) => event?.preventDefault()), // Avoid to close the mat-select\n      filter(() => this.canFetchMore),\n      mergeMap(() => this.fetchMore()),\n\n      // DEBUG\n      //tap(moreItems => console.debug(this.logPrefix + ' Received from fetch More: ', moreItems)),\n\n      // Concat to existing items\n      map((moreItems) => (this._$filteredItems.value || []).concat(moreItems))\n    );\n\n    // Update filtered items\n    this._subscription.add(\n      merge(\n        this._$inputItems,\n\n        // Update items events\n        filteredItemsChanges,\n\n        // Fetch more events\n        fetchMoreItemsChanges\n      ).subscribe((items) => {\n        // Make sure control value is inside (mat-select)\n        // (otherwise current value will visually disappear)\n        if (items) {\n          const value = this.formControl.value;\n          this._selectedItem = null;\n\n          // If form value is missing: append to list\n          if (isNotNil(value)) {\n            if (this.multiple && Array.isArray(value)) {\n              items = items.concat(value.filter((v) => !items.some((item) => this.equals(item, v))));\n            } else {\n              if (typeof value === 'object') {\n                const index = items.findIndex((item) => this.equals(item, value));\n                if (index !== -1) {\n                  this._selectedItem = items[index];\n                } else {\n                  // Append current value to the list, if missing (mat-select only)\n                  if (this.mobile || this.multiple) {\n                    items = items.concat(value);\n                  }\n                }\n              }\n            }\n          }\n        }\n\n        // DEBUG\n        //if (this.debug) console.debug(this.logPrefix + ' Received new filtered items', items);\n\n        // Emit items\n        this._$filteredItems.next(items);\n      })\n    );\n\n    // Applying implicit value, on blur\n    this._subscription.add(\n      this.blurred\n        .pipe(\n          // Skip if multiple (no implicit value) or disable\n          filter(() => !this.multiple && !this.mobile && this.enabled),\n          // DEBUG\n          //,tap(_ => this.debug && console.debug(this.logPrefix + ' Received blurred event')),\n          map(() => this.formControl.value)\n        )\n        .subscribe((value) => {\n          let invalidateFilteredItems = false;\n          let moveCaretToBeginning = false;\n\n          // DEBUG\n          //if (this.debug) console.debug(this.logPrefix + ' Applying implicit value on blur', value);\n\n          // When leave component without object, use implicit value if :\n          // - an explicit value\n          // - field is not empty (user fill something)\n          // - OR field empty but is required\n          if (isNotNil(this._implicitValue) && ((this.required && isNilOrBlank(value)) || (isNotNilOrBlank(value) && typeof value !== 'object'))) {\n            this.writeValue(this._implicitValue);\n            this.formControl.markAsPending({ emitEvent: false, onlySelf: true });\n            this.formControl.updateValueAndValidity({ emitEvent: false, onlySelf: true });\n            invalidateFilteredItems = this.showAllOnFocus || this.reloadItemsOnFocus;\n            moveCaretToBeginning = true; // Move caret to the beginning (fix issue IMAGINE-469)\n          }\n          // No value and no implicit value\n          else if (isNilOrBlank(value)) {\n            this.writeValue(null);\n            this.formControl.markAsPending({ emitEvent: false, onlySelf: true });\n            this.formControl.updateValueAndValidity({ emitEvent: false, onlySelf: true });\n          }\n          // Has value, but no implicit value\n          else {\n            // Value is a valid object\n            if (isNotNilObject(value)) {\n              invalidateFilteredItems = this.showAllOnFocus || this.reloadItemsOnFocus;\n              moveCaretToBeginning = true; // Move caret to the beginning (fix issue IMAGINE-469)\n            }\n            // Invalid valid value: clear search text\n            else if (this.clearInvalidValueOnBlur && typeof value === 'string') {\n              this.writeValue(null);\n              this.formControl.markAsPending({ emitEvent: false, onlySelf: true });\n              this.formControl.updateValueAndValidity({ emitEvent: false, onlySelf: true });\n              invalidateFilteredItems = true;\n            }\n          }\n\n          this._implicitValue = null; // reset the implicit value\n          this.closePanel(); // Close panel\n\n          // Invalidate loaded items\n          if (invalidateFilteredItems) {\n            this.markAsLoading(); // Should force next focus to reload items\n          }\n\n          // Move caret to the beginning (fix issue IMAGINE-469)\n          if (moveCaretToBeginning) {\n            // DEBUG\n            //if (this.debug) console.debug(this.logPrefix + ' Moving caret to the beginning, on blur');\n            selectInputRange(this.matInputText.nativeElement, 0, 0);\n          }\n        })\n    );\n\n    // Listen form control status change\n    this._subscription.add(\n      this.formControl.statusChanges\n        .pipe(distinctUntilChanged())\n        // Update component state\n        .subscribe(() => this.checkIfTouched())\n    );\n\n    // Select input content, on focus or press enter\n    if (this.selectInputContentOnFocus && !this.mobile && !this.multiple) {\n      this._subscription.add(\n        merge(\n          this.focused.pipe(\n            filter((event) => !event.defaultPrevented)\n            //tap((event) => event.preventDefault())\n          ),\n          this.keyupEnter.pipe(filter(() => isNotNilObject(this.formControl.value)))\n        )\n          .pipe(debounceTime(this.selectInputContentOnFocusDelay))\n          .subscribe(() => {\n            //if (this.debug) console.debug(this.logPrefix + ' Selecting input content (focused)');\n            selectInputContent(this.matInputText.nativeElement);\n          })\n      );\n    }\n\n    if (this.reloadItemsOnFocus) {\n      this._subscription.add(\n        this.focused.pipe(filter((event) => !this.loading && !event.defaultPrevented)).subscribe(() => {\n          //if (this.debug) console.debug(this.logPrefix + ' Reloading items (focused)');\n          this.reloadItems();\n        })\n      );\n    }\n  }\n\n  ngAfterViewInit() {\n    this._fixMatSelectPositionAndSearchbar();\n  }\n\n  ngOnDestroy(): void {\n    this._destroy$.next();\n    this._destroy$.complete();\n    this._subscription.unsubscribe();\n    this._itemsSubscription?.unsubscribe();\n    this._openedSubscription?.unsubscribe();\n    this._$inputItems.complete();\n    this._$inputItems.unsubscribe();\n    this._$filteredItems.complete();\n    this._$filteredItems.unsubscribe();\n    this._reload$.complete();\n    this._$filter.complete();\n\n    this.dropButtonClick.complete();\n    this.clicked.complete();\n    this.blurred.complete();\n    this.focused.complete();\n    this.keydownEscape.complete();\n    this.keyupEnter.complete();\n    this._fetchMore$.complete();\n\n    this._implicitValue = undefined;\n    this.formControl = null;\n    this.displayWith = null;\n    this.equals = null;\n    this.suggestFn = null;\n    this._$filteredItems = null;\n    this.config = null;\n    this.panelClass = null;\n\n    this._onChangeCallback = null;\n    this._onTouchedCallback = null;\n    this._onFetchMoreCallback = null;\n\n    // Destroy the 'autocomplete' instance, to avoid memory leak\n    this.autocomplete?.ngOnDestroy();\n  }\n\n  /**\n   * Allow to reload content. Useful when filter has been changed but not detected\n   */\n  reloadItems(value?: any) {\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Asking to reloadItems()', value);\n    // Force a refresh\n    this._reload$.next(value || (this.showAllOnFocus && this.suggestLengthThreshold <= 0 ? '*' : this.formControl.value));\n\n    // Clear the search bar (only if hidden)\n    if (this.matSelect && !this.matSelect.panelOpen && this.ionSearchbar) {\n      this.ionSearchbar.value = null;\n    }\n  }\n\n  writeValue(value: any): void {\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Writing value: ', value);\n\n    if (value !== this.formControl.value) {\n      this.formControl.setValue(value, { emitEvent: false });\n      this._displayValue = this.displayWith(value);\n\n      this._onChangeCallback(value);\n\n      // Check if need to update controls\n      this.checkIfTouched();\n    }\n\n    // Clear value\n    else if (isNil(value)) {\n      // Update display value (e.g. should refresh the title)\n      if (isNotNilOrBlank(this._displayValue)) {\n        this._displayValue = '';\n        this.markForCheck();\n      }\n\n      // Reset implicit value\n      this._implicitValue = null;\n    }\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    if (isDisabled && this.autocomplete?.isOpen) {\n      this.closePanel();\n    }\n    this.cd.markForCheck();\n  }\n\n  focus() {\n    if (this.matSelect) {\n      this.matSelect.focus();\n    } else {\n      focusInput(this.matInputText);\n    }\n  }\n\n  filterInputTextFocusEvent(event: FocusEvent) {\n    if (!event || event.defaultPrevented) {\n      //if (this.debug) console.debug(this.logPrefix + ' calling filterInputTextFocusEvent - event.defaultPrevented');\n      return false;\n    }\n\n    // Ignore event from mat-option\n    if (event.relatedTarget instanceof HTMLElement && event.relatedTarget.tagName === 'MAT-OPTION') {\n      event.preventDefault();\n      if (event.stopPropagation) event.stopPropagation();\n      event.returnValue = false;\n\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + ' Cancelling focus event');\n\n      return false;\n    }\n\n    // Already focused - fix issue sumaris-app#837 (2 panels opened at the same time)\n    if (this._focused) return false;\n\n    this._focused = true;\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Select input content');\n    const hasContent = isNotNilOrBlank((event.target as any)?.value);\n\n    // If combo is empty, or if has content but should force to show panel on focus\n    if (!hasContent || this.showPanelOnFocus || this.showAllOnFocus) {\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + ' Emit focus event');\n\n      // Need a delay to prevent early focus event, just after a blur event (see issue sumaris-app#837 - 2 panels opened)\n      setTimeout(() => {\n        if (!this._focused) return; // Skip if blur event received\n\n        this.focused.emit(event);\n      }, 10);\n\n      return true;\n    }\n    return false;\n  }\n\n  protected filterInputTextBlurEvent(event: FocusEvent) {\n    if (!event || event.defaultPrevented) return;\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' filterInputTextBlurEvent', event);\n\n    // Ignore event from mat-option\n    if (\n      (event.relatedTarget instanceof HTMLElement && event.relatedTarget.tagName === 'MAT-OPTION') ||\n      // Or autocomplete panel is open because event.relatedTarget is null (cf. https://github.com/angular/components/issues/24182)\n      (event.relatedTarget === null && this.autocomplete?.isOpen)\n    ) {\n      event.preventDefault();\n      if (event.stopPropagation) event.stopPropagation();\n      event.returnValue = false;\n\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + \" Cancelling blur event\");\n\n      return;\n    }\n\n    // Already blurred: skip\n    if (!this._focused) return;\n\n    this._focused = false;\n\n    // Need a delay to prevent early blur event without triggering formChange event\n    setTimeout(() => {\n      if (this._focused) return; // Skip if focus again\n\n      this.blurred.emit(event);\n    }, 100);\n  }\n\n  protected emitEnter(event: Event | KeyboardEvent) {\n    this.keyupEnter.emit(event);\n\n    // Use isJustClosed to avoid false positive\n    if (this.enter.observed && !this.isJustClosed) {\n      this.enter.emit(event);\n    }\n  }\n\n  emitArrowUp(event: Event | KeyboardEvent) {\n    if (this.arrowUp.observed && !this.isOpen) {\n      this.arrowUp.emit(event);\n    }\n  }\n\n  emitArrowDown(event: Event | KeyboardEvent) {\n    if (this.arrowDown.observed && !this.isOpen) {\n      this.arrowDown.emit(event);\n    } else if (!this.isOpen) {\n      this.dropButtonClick.emit(event);\n    }\n  }\n\n  protected emitEscape(event: KeyboardEvent | Event) {\n    if (this.isOpen) {\n      // Avoid form or page to manage escape event\n      event?.stopPropagation();\n      event?.preventDefault();\n\n      // DEBUG\n      //console.debug(this.logPrefix + \" Closing the panel (keydown.escape)\");\n\n      this.closePanel();\n    } else {\n      this.keydownEscape.emit(event);\n    }\n  }\n\n  protected ionSearchBarChanged(event: Event) {\n    if (!event || event.defaultPrevented || !this.matSelect.panelOpen) return;\n    event.preventDefault();\n    event.stopPropagation();\n\n    // Get the value to search\n    const value = (event as CustomEvent<SearchbarChangeEventDetail>)?.detail.value;\n\n    // DEBUG\n    //console.debug(this.logPrefix + \" Received <ion-searchbar> changes\", value);\n\n    // Update the display value (in the visible form control)\n    if (!this.multiple) {\n      this._displayValue = value;\n    }\n\n    // Mark component as loading\n    this.markAsLoading();\n\n    // Reload items\n    this.reloadItems(value);\n\n    // TODO Find a way to avoid mat-select to give focus to an option, when typing\n    /*if (this.multiple) {\n      this.matSelect._elementRef;\n    }*/\n  }\n\n  filterMatSelectFocusEvent(event: FocusEvent) {\n    if (!event || event.defaultPrevented) return;\n    // DEBUG\n    //console.debug(this.logPrefix + ' Received <mat-select> focus event', event);\n\n    // Emit event\n    this.focused.emit(event);\n  }\n\n  filterMatSelectBlurEvent(event: FocusEvent) {\n    if (!event || event.defaultPrevented) return;\n\n    // DEBUG\n    // console.debug(this.logPrefix + \" Received <mat-select> blur event\", event);\n\n    if (\n      event.relatedTarget instanceof HTMLElement &&\n      // Ignore event from mat-option\n      (event.relatedTarget.tagName === 'MAT-OPTION' ||\n        (event.relatedTarget.tagName === 'DIV' && event.relatedTarget.classList.contains('mat-mdc-select-panel')) || // New MDC tag and class name (equivalent to event.relatedTarget.tagName === 'MAT-OPTION')\n        (event.relatedTarget.tagName === 'INPUT' && event.relatedTarget.classList.contains('searchbar-input')))\n    ) {\n      event.preventDefault();\n      if (event.stopPropagation) event.stopPropagation();\n      event.returnValue = false;\n      // DEBUG\n      // console.debug(this.logPrefix + \" Cancelling <mat-select> blur event\");\n      return false;\n    }\n\n    if (this._focused) {\n      this._focused = false;\n\n      this.blurred.emit(event);\n    }\n\n    return true;\n  }\n\n  clearValue(event?: Event) {\n    this.closePanel();\n    this.writeValue(null);\n    event?.stopPropagation();\n    if (this.ionSearchbar) {\n      this.ionSearchbar.value = null;\n    }\n    this.markAsLoading();\n  }\n\n  _initAutocompleteInfiniteScroll(threshold?: string) {\n    if (!this.autocomplete) return; // Skip\n\n    // DEBUG\n    //console.debug(this.logPrefix + ' Init autocomplete scroll listener');\n\n    if (this._openedSubscription) {\n      this._openedSubscription.unsubscribe();\n      this._subscription.remove(this._openedSubscription);\n    }\n\n    const opened$: Observable<any> = this.autocomplete._isOpen ? timer(0) : this.autocomplete.opened.pipe(debounceTime(200));\n    const scrollEnd$ = opened$.pipe(\n      map(() => this.getAutocompletePanel()),\n      filter(isNotNil),\n      switchMap((panel) => fromScrollEndEvent(panel, threshold)),\n      takeUntil(this.autocomplete.closed)\n    );\n\n    // Trigger fetch more, when end scroll reached\n    this._openedSubscription = scrollEnd$.subscribe(() => this._fetchMore$.emit());\n\n    // Register subscription\n    this._subscription.add(this._openedSubscription);\n  }\n\n  _initMatSelectInfiniteScroll(threshold?: string) {\n    if (!this.matSelect) return; // Skip\n\n    // DEBUG\n    console.debug(this.logPrefix + ' Init mat-select scroll listener');\n\n    if (this._openedSubscription) {\n      this._openedSubscription.unsubscribe();\n      this._subscription.remove(this._openedSubscription);\n    }\n\n    const opened$: Observable<any> = this.matSelect.panelOpen ? timer(0) : this.matSelect._openedStream.pipe(debounceTime(200));\n    const scrollEnd$ = opened$.pipe(\n      map(() => this.getMatSelectPanel()),\n      filter(isNotNil),\n      switchMap((panel) => fromScrollEndEvent(panel, threshold)),\n      takeUntil(this.matSelect._closedStream)\n    );\n\n    // Trigger fetch more, end end scroll reached\n    this._openedSubscription = scrollEnd$.pipe(filter(() => this._moreItemsCount > 0)).subscribe(() => this._fetchMore$.emit());\n\n    // Register subscription\n    this._subscription.add(this._openedSubscription);\n  }\n\n  get isOpen(): boolean {\n    return this.autocomplete?.isOpen || this.matSelect?.panelOpen || false;\n  }\n\n  get isJustClosed(): boolean {\n    if (this.isOpen || !this._panelClosedAtTime) return false;\n\n    const closeAge = Date.now() - this._panelClosedAtTime;\n\n    // Workaround to avoid false positive\n    // e.g. Panel item can be validated by the enter key, so we detect if panel just closed\n    return closeAge > 200;\n  }\n\n  closePanel() {\n    if (this.autocomplete?.isOpen) {\n      this.autocompleteTrigger?.closePanel();\n    } else if (this.matSelect?.panelOpen) {\n      this.matSelect?.close();\n    }\n  }\n\n  /* -- protected method -- */\n\n  protected markAsLoading() {\n    if (this._$filteredItems.value) {\n      //if (this.debug) console.debug(this.logPrefix + ' Marking as loading');\n\n      this._$filteredItems.next(undefined);\n      this._itemCount = undefined;\n      this._implicitValue = undefined;\n      this._onFetchMoreCallback = undefined;\n      this._moreItemsCount = 0;\n      this._selectedItem = null;\n      this.markForCheck();\n    }\n  }\n\n  protected onSelectionChange(event: MatSelectChange) {\n    this.selectionChange.emit({ source: event.source, value: event.value });\n  }\n\n  protected onOptionSelected(event: MatAutocompleteSelectedEvent) {\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Option selected', event);\n\n    this.selectionChange.emit({ source: event.source, value: event.option.value });\n  }\n\n  protected toggleShowPanel(event: Event) {\n    if (this.isOpen) {\n      event?.preventDefault();\n      event?.stopPropagation();\n      this.closePanel();\n    } else {\n      this.dropButtonClick.emit(event);\n    }\n  }\n\n  /* -- private method -- */\n\n  private async suggest(value: any, filter: any | undefined): Promise<any[] | undefined> {\n    // Compute a new execution id\n    const id = ++this._suggestExecutionId;\n\n    // Split string value, if allow (.e.g 'AAA - Item AAA' => 'AAA')\n    if (!(this.multiple || this.mobile) && typeof value === 'string') {\n      // Split search text (and keep only the first part)\n      if (this.splitSearchText && this.displaySeparator) {\n        const firstSeparatorIndex = value.indexOf(this.displaySeparator);\n        if (firstSeparatorIndex !== -1) {\n          value = value.substring(0, firstSeparatorIndex);\n        }\n      }\n\n      // Trim search text\n      if (this.trimSearchText) {\n        value = value.trim();\n      }\n    }\n\n    // Call suggestion function\n    let res = await this.suggestFn(value, filter);\n\n    // Ignore the current result, if a newer execution has been launched\n    if (id !== this._suggestExecutionId) return undefined;\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);\n\n    if (!res) {\n      this._itemCount = 0;\n      this._onFetchMoreCallback = undefined;\n      this._moreItemsCount = 0;\n      res = [];\n    } else if (Array.isArray(res)) {\n      res = res as any[];\n      this._itemCount = res.length;\n      this._onFetchMoreCallback = undefined;\n      this._moreItemsCount = 0;\n    } else {\n      const { data, total, fetchMore } = res as LoadResult<any>;\n      this._itemCount = total ?? data.length ?? 0;\n      this._onFetchMoreCallback = fetchMore;\n      this._moreItemsCount = (fetchMore && this._itemCount - data.length) || 0;\n      res = data;\n    }\n\n    // Add favorites\n    if (isNotEmptyArray(this.favoriteItems)) {\n      const showAllFavorites = !value || value === '*' || (isNotNilObject(value) && this.showAllOnFocus);\n      const sortAttributes = this.displayAttributes || (filter && ((filter.searchAttribute && [filter.searchAttribute]) || filter.searchAttributes));\n      const filteredFavoriteItems = showAllFavorites\n        ? this.favoriteItems.sort(propertiesPathComparator(sortAttributes))\n        : suggestFromArray(this.favoriteItems, value, this.filter)?.data;\n      if (isNotEmptyArray(filteredFavoriteItems)) {\n        filteredFavoriteItems.sort(propertiesPathComparator(this.displayAttributes));\n        res = filteredFavoriteItems.concat(res.filter((item) => !filteredFavoriteItems.some((favoriteItem) => this.equals(favoriteItem, item))));\n      }\n    }\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);\n\n    return res;\n  }\n\n  private async fetchMore(): Promise<any[]> {\n    if (!this._onFetchMoreCallback) return [];\n\n    // Save then remove fetch function (to avoid multi-call)\n    const fetchMoreFn = this._onFetchMoreCallback;\n    this._onFetchMoreCallback = undefined;\n\n    let { data: items, total, fetchMore } = await fetchMoreFn();\n\n    // Exclude favorites\n    if (isNotEmptyArray(this.favoriteItems)) {\n      items = items.filter((item) => !this.favoriteItems.some((favoriteItem) => this.equals(favoriteItem, item)));\n    }\n\n    this._itemCount = total || this._itemCount;\n    this._onFetchMoreCallback = fetchMore;\n    this._moreItemsCount = Math.max(0, this._moreItemsCount - items.length); // Borne min = 0\n    return items;\n  }\n\n  private updateImplicitValue(items: any[]) {\n    // Store implicit value (will use it onBlur if not other value selected)\n    if (!this.multiple && items?.length === 1) {\n      const implicitValue = items[0];\n      const applyImplicitValue = typeof this.applyImplicitValue === 'function' ? this.applyImplicitValue(implicitValue) : this.applyImplicitValue;\n      if (applyImplicitValue) {\n        this._implicitValue = implicitValue;\n\n        // Preview the implicit in the input text (and select the added part)\n        if (this.previewImplicitValue && this.matInputText?.nativeElement) {\n          const searchText = this.matInputText.nativeElement.value;\n\n          // Complete the search text, with the full implicit value applied\n          if (!RegExpUtils.hasWildcardCharacter(searchText)) {\n            const displayValue = this.displayWith(implicitValue);\n            if (displayValue.toUpperCase().startsWith(searchText.toUpperCase())) {\n              // Select the additional text to match the implicit value\n              this.setInputTextValue(displayValue, searchText.length, displayValue.length, 'backward');\n            }\n          }\n        }\n\n        return;\n      }\n      // Continue : reste implicit value\n    }\n\n    this._implicitValue = undefined;\n  }\n\n  private checkIfTouched() {\n    if (this.formControl.touched) {\n      this.cd.markForCheck();\n      this._onTouchedCallback();\n    }\n  }\n\n  private getAutocompletePanel(): HTMLElement {\n    const ele = this.autocomplete?.options.last?._getHostElement().parentElement;\n    if (!ele) {\n      // DEBUG\n      console.warn(this.logPrefix + ' Unable to find the autocomplete div...');\n    }\n    return ele;\n  }\n\n  private getMatSelectPanel(): HTMLElement {\n    const ele = this.matSelect.options.last?._getHostElement().parentElement;\n    if (!ele) {\n      // DEBUG\n      console.warn(this.logPrefix + ' Unable to find the mat-select container...');\n    }\n    return ele;\n  }\n\n  private markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  private _fixMatSelectPositionAndSearchbar() {\n    if (!this.matSelect) return;\n\n    // Hide the panel (will be show when ready)\n    this.matSelect.panelClass = 'hidden';\n\n    let searchBarSubscription: Subscription;\n    this._subscription.add(\n      this.matSelect.openedChange.subscribe(async (open) => {\n        if (open) {\n          // Wait panel to be created\n          await waitFor(() => !!this.matSelect.panel, {stop: this._destroy$});\n          const panelElement = this.matSelect.panel.nativeElement as HTMLElement;\n          const overlayPane = findParentWithClass(panelElement, 'cdk-overlay-pane');\n\n          // Fix panel position, when overlay has an transformX (added when keyboard is shown)\n          this._fixMatSelectPanelPosition(overlayPane);\n\n          // Fix overlay, for searchbar\n          if (this.showSearchBar) {\n            searchBarSubscription = await this._fixSearchbarOverlay(panelElement, overlayPane);\n            if (searchBarSubscription) this._subscription.add(searchBarSubscription);\n          }\n\n          // Show the panel\n          this.renderer.removeClass(panelElement, 'hidden');\n          this.matSelect.panelClass = this.panelClass;\n        }\n        // ON close\n        else {\n          // Unsubscribe search bar workaround\n          if (searchBarSubscription) {\n            searchBarSubscription.unsubscribe();\n            this._subscription.remove(searchBarSubscription);\n            searchBarSubscription = null;\n\n            // Hide panel again\n            this.matSelect.panelClass = 'hidden';\n          }\n        }\n      })\n    );\n  }\n\n  private _fixMatSelectPanelPosition(overlayPane: HTMLElement) {\n    if (!overlayPane) return;\n\n    // Remove the unwanted default translateX\n    this.renderer.setStyle(\n      overlayPane,\n      'transform',\n      overlayPane.style.transform\n        .split(' ')\n        .filter((prop) => !prop.match(/^translateX/))\n        .join(' ')\n    );\n\n    // Fix panel width to field width (it was not forced by @Input panelWidth)\n    if (!this.panelWidth) {\n      //if (this.debug) console.debug(`${this.logPrefix} Fixing select panel width to the field size`);\n      const width = `${this.el.nativeElement.offsetWidth - 1}px`;\n      if (this._defaultPanelWidth !== width) {\n        this._defaultPanelWidth = width;\n        this.renderer.setStyle(overlayPane, 'width', width);\n      }\n    }\n\n    // Fix panel's left, to avoid overflow on the right\n    const left = overlayPane.style.left;\n    if (isNotNilOrBlank(left) && !left.includes('calc(') && left.endsWith('px')) {\n      //if (this.debug) console.debug(`${this.logPrefix} Fixing select panel left, to avoid overflow on the right`);\n      const width = `${overlayPane.clientWidth}px`;\n      const fixLeft = `calc(-${width} + min(${left} + ${width}, -32px + 100vw))`;\n      this.renderer.setStyle(overlayPane, 'left', fixLeft, RendererStyleFlags2.Important);\n    }\n\n    // Fix panel's top, to avoid overflow on the bottom\n    const top = overlayPane.style.top;\n    if (isNotNilOrBlank(top) && !top.includes('calc(') && top.endsWith('px')) {\n      //if (this.debug) console.debug(`${this.logPrefix} Fixing select panel top, to avoid overflow on the bottom`);\n      const height = `${overlayPane.clientHeight || 275}px`;\n      const fixTop = `calc(-${height} + min(${top} + ${height}, -32px + 100vh))`;\n      this.renderer.setStyle(overlayPane, 'top', fixTop, RendererStyleFlags2.Important);\n    }\n  }\n\n  /**\n   * Hack : if we are in a IonModal, it's necessary to move the CdkOverlay container\n   *     in the IonModal to might keep focus in IonSearchbar.\n   *\n   * @param panelElement\n   * @param overlayPane\n   * @private\n   */\n  private async _fixSearchbarOverlay(panelElement: HTMLElement, overlayPane: HTMLElement): Promise<Subscription | undefined> {\n    if (!this.matSelect || !this.ionSearchbar) return;\n\n    const modalElement = await this.modalController.getTop();\n    if (!modalElement) return; // No modal: skip\n\n    // Get the CDK overlay container\n    const overlayContainer = findParentWithClass(panelElement, 'cdk-overlay-container');\n    if (!overlayContainer) return;\n    const originalParent = overlayContainer.parentElement;\n\n    // DEBUG\n    //if (this.debug)\n    console.debug(\n      `${this.logPrefix} Moving the \"cdk-overlay\" container from the \"${originalParent?.tagName || 'body'}\" to the \"ion-modal\" container`\n    );\n\n    this.renderer.appendChild(modalElement, overlayContainer);\n\n    const _document = this.injector.get(DOCUMENT);\n    const shiftLeft = (_document.defaultView.innerWidth - modalElement.firstElementChild.getBoundingClientRect().width) / 2;\n    const shiftTop = (_document.defaultView.innerHeight - modalElement.firstElementChild.getBoundingClientRect().height) / 2;\n\n    this.renderer.setStyle(overlayPane, 'margin-top', `-${shiftTop}px`);\n    this.renderer.setStyle(overlayPane, 'margin-left', `-${shiftLeft}px`);\n\n    // Return the reverse function, to replace the container in body\n    return new Subscription(() => {\n      // DEBUG\n      //if (this.debug)\n      console.debug(`${this.logPrefix} moving the \"cdk-overlay\" container from the \"ion-modal\" to the \"body\" container`);\n\n      this.renderer.appendChild(originalParent /*this.document.body*/, overlayContainer);\n    });\n  }\n\n  private setInputTextValue(value: string, selectionStartIndex?: number, selectionEndIndex?: number, direction?: 'backward' | 'forward') {\n    // Apply to the input[type=text] field\n    if (this.matInputText?.nativeElement) {\n      this.matInputText.nativeElement.value = value ?? '';\n      if (isNotNil(selectionStartIndex)) {\n        setTimeout(() => {\n          selectInputRange(this.matInputText.nativeElement, selectionStartIndex, selectionEndIndex, direction);\n        });\n      }\n    }\n  }\n\n  protected onBackspace(event: Event): void {\n    const input = event?.target as HTMLInputElement;\n\n    // If preview enabled, remove selection when press backspace (by default only the selection will be deleted)\n    if (this.previewImplicitValue && input) {\n      const selectionStart = input.selectionStart;\n      const selectionEnd = input.selectionEnd;\n      let value = input.value;\n\n      // Make sure to remove the last typed character (by default only the selection will be deleted)\n      if (this._implicitValue && selectionStart > 0 && selectionStart < selectionEnd && value.length === selectionEnd) {\n        // DEBUG\n        //if (this.debug) console.debug(`${this.logPrefix} Backspace pressed, additional text from the implicit value`);\n\n        event.preventDefault();\n\n        // Define the new value by removing the text in the adjusted range\n        const newCaretPosition = selectionStart - 1;\n        value = newCaretPosition > 0 ? value.slice(0, newCaretPosition) : '';\n\n        // clean implicit value\n        this._implicitValue = null;\n\n        // Apply the new value and update the selection\n        this.setInputTextValue(value, newCaretPosition, selectionEnd);\n\n        // Mark component as loading\n        this.markAsLoading();\n\n        // Reload items\n        this.reloadItems(value);\n      }\n    }\n\n    // Emit\n    this.keydownBackspace.emit(event);\n  }\n\n  protected toggleFavoriteClick(event: UIEvent, value: any) {\n    if (isNil(value) || event?.defaultPrevented || !this.toggleFavorite.observed) return; // Skip\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Favorite item clicked', value);\n\n    if (event) {\n      event.preventDefault();\n      event.stopPropagation();\n      event.stopImmediatePropagation();\n    }\n\n    const isFavorite = this.favoriteItems?.some((favoriteItem) => this.equals(favoriteItem, value));\n    if (isFavorite) {\n      this.favoriteItems = this.favoriteItems.filter((favoriteItem) => !this.equals(favoriteItem, value));\n    } else {\n      this.favoriteItems = this.favoriteItems.concat(value);\n    }\n\n    // Emit changes\n    this.toggleFavorite.emit({ source: this.matSelect || this.autocomplete, value: value });\n  }\n}\n","<ion-grid class=\"ion-no-padding field-container\">\n  <ion-row>\n    <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n      <!-- readonly -->\n      @if (_readonly) {\n        <mat-form-field\n          [floatLabel]=\"floatLabel | asFloatLabelType\"\n          [appearance]=\"appearance\"\n          [subscriptSizing]=\"subscriptSizing\"\n          [title]=\"!showTooltip ? _displayValue || '' : ''\"\n          [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n          class=\"mat-form-field-disabled\"\n        >\n          <div matPrefix>\n            <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n          </div>\n          @if (floatLabel !== 'never' && !!placeholder) {\n            <mat-label>{{ placeholder }}</mat-label>\n          }\n          <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n          <ion-text>{{ value | toString: displayWith }}</ion-text>\n          <div matSuffix>\n            <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n          </div>\n          <!-- hints -->\n          @if (!formControl.invalid) {\n            <mat-hint>\n              <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n            </mat-hint>\n          }\n        </mat-form-field>\n      } @else {\n        @let hasFavorites = toggleFavorite.observed || (favoriteItems | isNotEmptyArray);\n\n        <mat-form-field\n          [floatLabel]=\"floatLabel | asFloatLabelType\"\n          [appearance]=\"appearance\"\n          [subscriptSizing]=\"subscriptSizing\"\n          [title]=\"!showTooltip ? _displayValue || '' : ''\"\n          [matTooltip]=\"showTooltip ? _displayValue || '' : ''\"\n          [hideRequiredMarker]=\"hideRequiredMarker\"\n        >\n          <div matPrefix>\n            <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n          </div>\n          @if ((label || placeholder) && floatLabel !== 'never') {\n            <mat-label>{{ label || placeholder }}</mat-label>\n          }\n          <!-- Mobile or Multiple (use <mat-select>) -->\n          @if (mobile || multiple) {\n            <mat-select\n              #matSelect\n              hideSingleSelectionIndicator\n              disableOptionCentering\n              [disableRipple]=\"disableRipple\"\n              [formControl]=\"formControl\"\n              [tabindex]=\"_tabindex\"\n              [panelClass]=\"panelClass\"\n              [panelWidth]=\"panelWidth || _defaultPanelWidth\"\n              (focus)=\"filterMatSelectFocusEvent($event)\"\n              (blur)=\"filterMatSelectBlurEvent($event)\"\n              (keydown.escape)=\"emitEscape($event)\"\n              (keyup.enter)=\"emitEnter($event)\"\n              (selectionChange)=\"onSelectionChange($event)\"\n              (openedChange)=\"openedChange.emit($event)\"\n              [compareWith]=\"equals\"\n              [multiple]=\"multiple\"\n              [typeaheadDebounceInterval]=\"debounceTime * 10\"\n              [required]=\"required\"\n              [class.mat-mdc-select-arrow-hidden]=\"!mobile\"\n            >\n              <mat-select-trigger>{{ value | toString: displayWith }}</mat-select-trigger>\n              <!-- Search bar -->\n              @if (showSearchBar) {\n                <mat-optgroup class=\"mat-select-searchbar\" [class.mat-select-searchbar-sticky]=\"stickySearchBar\">\n                  <!-- FIXME on iOS devices, when animated=\"true\", then the search icon overlap the placeholder -->\n                  <ion-searchbar\n                    #ionSearchbar\n                    inputmode=\"search\"\n                    autocomplete=\"off\"\n                    animated=\"false\"\n                    showClearButton=\"true\"\n                    [debounce]=\"debounceTime\"\n                    (ionClear)=\"markAsLoading()\"\n                    (ionInput)=\"ionSearchBarChanged($event)\"\n                    [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n                  ></ion-searchbar>\n                </mat-optgroup>\n              }\n\n              <!-- Custom header -->\n              <ng-container\n                [ngTemplateOutlet]=\"panelHeaderTemplate\"\n                [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n              ></ng-container>\n\n              <!-- Headers -->\n              <ion-row\n                class=\"mat-select-header column sticky ion-no-padding\"\n                [class.multiple]=\"multiple\"\n                [class.mat-select-searchbar-sticky]=\"showSearchBar && stickySearchBar\"\n                [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n              >\n                <!-- favorite spacer -->\n                @if (hasFavorites) {\n                  <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n                }\n                <!-- attribute headers -->\n                @for (attr of displayAttributes; track attr; let i = $index) {\n                  <ion-col [size]=\"displayColumnSizes[i]\">\n                    <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n                  </ion-col>\n                }\n              </ion-row>\n\n              <!-- None option -->\n              @if (!required && !multiple && !clearable) {\n                <mat-option class=\"ion-no-padding\">\n                  <ion-row class=\"ion-no-padding\">\n                    <ion-col class=\"ion-no-padding\">\n                      <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n                    </ion-col>\n                  </ion-row>\n                </mat-option>\n              }\n              @if (_$filteredItems | push: 'userBlocking'; as items) {\n                <!-- No item option -->\n                @if (items | isEmptyArray) {\n                  <mat-option class=\"ion-padding text-italic\" disabled>\n                    <ion-label>\n                      <i>{{ noResultMessage | translate }}</i>\n                    </ion-label>\n                  </mat-option>\n                } @else {\n                  <!-- Options -->\n                  @for (item of items; track i; let i = $index) {\n                    @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n\n                    <mat-option [value]=\"item\" class=\"ion-no-padding\" [class.mdc-list-item--favorite]=\"isFavorite\">\n                      <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n                        <!-- favorite icon -->\n                        @if (hasFavorites) {\n                          <ion-col size=\"auto\" class=\"favorite-col\">\n                            @if (isFavorite) {\n                              <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n                            }\n                          </ion-col>\n                        }\n\n                        <!-- attribute columns -->\n                        @for (path of displayAttributes; track j; let j = $index) {\n                          <ion-col [size]=\"displayColumnSizes[j]\" class=\"ion-align-self-center ion-text-wrap\">\n                            <ion-label\n                              [innerHTML]=\"\n                                item\n                                  | propertyGet: path\n                                  | highlight: { search: ionSearchbar?.value, withAccent: highlightAccent }\n                              \"\n                            ></ion-label>\n                          </ion-col>\n                        }\n                      </ion-row>\n                    </mat-option>\n                  }\n                }\n                <!-- More item -->\n                @if (_moreItemsCount) {\n                  <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" (ngInit)=\"_initMatSelectInfiniteScroll()\" disabled>\n                    <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n                  </mat-option>\n                }\n              } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n                <!-- need more character -->\n                <mat-option class=\"ion-padding text-italic mat-pseudo-checkbox-hidden\" disabled>\n                  <ion-label>\n                    {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n                  </ion-label>\n                </mat-option>\n              } @else {\n                <!-- loading spinner -->\n                <mat-option class=\"ion-padding mat-pseudo-checkbox-hidden\" disabled>\n                  <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n                </mat-option>\n              }\n\n              <!-- footer -->\n              @if (showPanelFooter && itemCount; as count) {\n                <mat-option class=\"mat-option-footer mat-autocomplete-footer mat-pseudo-checkbox-hidden ion-no-padding\" disabled>\n                  <ion-text class=\"ion-float-end ion-padding-end\">\n                    <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n                  </ion-text>\n                </mat-option>\n              }\n\n              <!-- Custom footer -->\n              <ng-container\n                [ngTemplateOutlet]=\"panelFooterTemplate\"\n                [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n              ></ng-container>\n            </mat-select>\n          } @else {\n            <!-- desktop (use mat-autocomplete) -->\n            <input\n              matInput\n              #matInputText\n              type=\"text\"\n              [matAutocomplete]=\"autocomplete\"\n              [matAutocompletePosition]=\"matAutocompletePosition\"\n              [formControl]=\"formControl\"\n              [placeholder]=\"(label || floatLabel === 'never') && placeholder\"\n              [appAutofocus]=\"autofocus\"\n              [tabindex]=\"_tabindex\"\n              [required]=\"required\"\n              (click)=\"clicked.emit($event)\"\n              (focus)=\"filterInputTextFocusEvent($event)\"\n              (blur)=\"filterInputTextBlurEvent($event)\"\n              (keydown.escape)=\"emitEscape($event)\"\n              (keydown.backspace)=\"onBackspace($event)\"\n              (keyup.enter)=\"emitEnter($event)\"\n              (keyup.arrowUp)=\"emitArrowUp($event)\"\n              (keyup.arrowDown)=\"emitArrowDown($event)\"\n            />\n            <!-- autocomplete -->\n            <mat-autocomplete\n              #autocomplete=\"matAutocomplete\"\n              [autoActiveFirstOption]=\"true\"\n              [hideSingleSelectionIndicator]=\"true\"\n              [displayWith]=\"displayWith\"\n              [class]=\"panelClass\"\n              [panelWidth]=\"panelWidth\"\n              [disableRipple]=\"disableRipple\"\n              (optionSelected)=\"onOptionSelected($event)\"\n              (opened)=\"openedChange.emit(true)\"\n              (closed)=\"openedChange.emit(false)\"\n            >\n\n              <!-- Custom header -->\n              <ng-container\n                [ngTemplateOutlet]=\"panelHeaderTemplate\"\n                [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n              ></ng-container>\n\n              <!-- Headers -->\n              @if (showPanelHeader) {\n                <ion-row\n                  class=\"mat-autocomplete-header column sticky ion-no-padding\"\n                  [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\"\n                >\n                  <!-- favorite spacer -->\n                  @if (hasFavorites) {\n                    <ion-col size=\"auto\" class=\"favorite-col\"></ion-col>\n                  }\n                  @for (attr of displayAttributes; track attr; let i = $index) {\n                    <ion-col [size]=\"displayColumnSizes[i]\">\n                      <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n                    </ion-col>\n                  }\n                </ion-row>\n              }\n              @if (_$filteredItems | push: 'userBlocking'; as items) {\n                <!-- No item option -->\n                @if (items | isEmptyArray) {\n                  <mat-option class=\"ion-padding text-italic\" disabled>\n                    <ion-label>\n                      <i>{{ noResultMessage | translate }}</i>\n                    </ion-label>\n                  </mat-option>\n                } @else {\n                  <!-- Options -->\n                  @for (item of items; track i; let i = $index) {\n                    @let isFavorite = hasFavorites && (favoriteItems | arrayIncludes: item);\n                    <mat-option\n                      [value]=\"item\"\n                      class=\"ion-no-padding\"\n                      [class.mdc-list-item--selected]=\"item === _selectedItem\"\n                      [class.mdc-list-item--favorite]=\"isFavorite\"\n                    >\n                      <ion-row [classList]=\"item?.classList || ''\" [style.--ion-grid-columns]=\"hasFavorites ? 13 : 12\">\n                        <!-- favorite icon -->\n                        @if (hasFavorites) {\n                          <ion-col\n                            matPrefix\n                            size=\"auto\"\n                            class=\"favorite-col\"\n                            (click)=\"toggleFavoriteClick($event, item)\"\n                          >\n                            @if (isFavorite) {\n                              <ion-icon name=\"star\" color=\"tertiary\"></ion-icon>\n                            } @else if (toggleFavorite.observed) {\n                              <ion-icon name=\"star-outline\" color=\"medium\" class=\"visible-hover\"></ion-icon>\n                            }\n                          </ion-col>\n                        }\n                        @for (path of displayAttributes; track j; let j = $index) {\n                          <ion-col\n                            [size]=\"displayColumnSizes[j]\"\n                            [title]=\"!showTooltip ? text.innerText : ''\"\n                            [matTooltip]=\"showTooltip ? text.innerText : ''\"\n                            class=\"ion-align-self-center\"\n                          >\n                            <ion-label>\n                              <span\n                                #text\n                                [innerHTML]=\"\n                                  item\n                                    | propertyGet: path\n                                    | highlight\n                                      : {\n                                          search: matInputText.value,\n                                          withAccent: highlightAccent,\n                                        }\n                                \"\n                              ></span>\n                            </ion-label>\n                          </ion-col>\n                        }\n                      </ion-row>\n                    </mat-option>\n                  }\n                }\n                <!-- More item -->\n                @if (_moreItemsCount) {\n                  <mat-option class=\"ion-padding\" (ngInit)=\"_initAutocompleteInfiniteScroll()\" disabled>\n                    <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n                  </mat-option>\n                }\n              } @else if ((_displayValue | strLength) < suggestLengthThreshold) {\n                <!-- Need more characters -->\n                <mat-option class=\"ion-padding text-italic\" disabled>\n                  <ion-label>\n                    {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n                  </ion-label>\n                </mat-option>\n              } @else {\n                <!-- Loading spinner -->\n                <mat-option class=\"ion-padding\" disabled>\n                  <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n                </mat-option>\n              }\n\n              <!-- footer -->\n              @if (showPanelFooter && itemCount; as count) {\n                <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n                  <ion-col>\n                    <ion-text class=\"ion-float-end ion-padding-end\">\n                      <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n                    </ion-text>\n                  </ion-col>\n                </ion-row>\n              }\n\n              <!-- Custom footer -->\n              <ng-container\n                [ngTemplateOutlet]=\"panelFooterTemplate\"\n                [ngTemplateOutletContext]=\"{ itemCount: itemCount }\"\n              ></ng-container>\n\n            </mat-autocomplete>\n          }\n          <!--\n          NOTE :\n          - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n          -->\n          <div matSuffix>\n            <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n          </div>\n          @if (formControl?.hasError('required')) {\n            <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n          }\n          @if (formControl?.hasError('entity')) {\n            <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n          }\n          <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n          <!-- Hints -->\n          @if (!formControl?.invalid) {\n            <mat-hint>\n              <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n            </mat-hint>\n          }\n        </mat-form-field>\n      }\n    </ion-col>\n    <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n      <ng-content select=\"[matAfter]\"></ng-content>\n    </ion-col>\n  </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n  <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n  @if (!mobile) {\n    <button\n      matSuffix\n      mat-icon-button\n      tabindex=\"-1\"\n      type=\"button\"\n      (click)=\"toggleShowPanel($event)\"\n      [hidden]=\"disabled\"\n      [title]=\"!showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n      [matTooltip]=\"showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n    >\n      <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n    </button>\n  }\n  @if (clearable) {\n    <button\n      matSuffix\n      mat-icon-button\n      tabindex=\"-1\"\n      type=\"button\"\n      (click)=\"clearValue($event)\"\n      [hidden]=\"disabled || !formControl.value\"\n      [title]=\"!showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n      [matTooltip]=\"showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n    >\n      <mat-icon>close</mat-icon>\n    </button>\n  }\n\n  <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n  <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n  <div class=\"mat-mdc-form-field-hint-wrapper\">\n    <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n    <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n    <ng-content select=\"mat-hint[align='end']\"></ng-content>\n  </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { RxFor } from '@rx-angular/template/for';\nimport { RxIf } from '@rx-angular/template/if';\nimport { RxPush } from '@rx-angular/template/push';\nimport { RxLet } from '@rx-angular/template/let';\n\n@NgModule({\n  imports: [RxPush, RxFor, RxIf, RxLet],\n  exports: [RxPush, RxFor, RxIf, RxLet],\n})\nexport class RxStateModule {}\n","import { NgModule } from '@angular/core';\nimport { MatCommonModule, MatRippleModule } from '@angular/material/core';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatAutocompleteField } from './material.autocomplete';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { SharedPipesModule } from '../../pipes/pipes.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SharedDirectivesModule } from '../../directives/directives.module';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { RxStateModule } from '../../rx-state/rx-state.module';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport {MaterialAutocompleteHeaderDirective, MaterialAutocompleteFooterDirective} from './material.autocomplete.directive';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ScrollingModule,\n    ReactiveFormsModule,\n    SharedPipesModule,\n    SharedDirectivesModule,\n    RxStateModule,\n    MatCommonModule,\n    MatAutocompleteModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatIconModule,\n    MatButtonModule,\n    MatSelectModule,\n    MatRippleModule,\n    TranslateModule.forChild(),\n    MatTooltip,\n  ],\n  exports: [MatAutocompleteModule, MatAutocompleteField, MaterialAutocompleteHeaderDirective, MaterialAutocompleteFooterDirective],\n  declarations: [MatAutocompleteField, MaterialAutocompleteHeaderDirective, MaterialAutocompleteFooterDirective],\n})\nexport class SharedMatAutocompleteModule {}\n","import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';\n\nexport const MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING: SubscriptSizing = 'fixed';\n\nexport const MAT_FORM_FIELD_DEFAULT_APPEARANCE: MatFormFieldAppearance = 'fill';\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  forwardRef,\n  Inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Provider,\n  ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormBuilder, UntypedFormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isMoment, Moment } from 'moment';\nimport { SharedValidators } from '../../validator/validators';\nimport { isBlankString, isNil, isNotNil, isNotNilBoolean, nullIfNilOrBlank } from '../../functions';\nimport { filter, skip } from 'rxjs/operators';\nimport { InputElement, setTabIndex } from '../../inputs';\nimport { Subscription } from 'rxjs';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldAppearance, MatFormFieldDefaultOptions, SubscriptSizing } from '@angular/material/form-field';\nimport { DateFilterFn, MatDatepicker, MatDatepickerInputEvent } from '@angular/material/datepicker';\nimport { isFocusableElement } from '../../focusable';\nimport { DateUtils, fromDateISOString, toDateISOString } from '../../dates';\nimport { isMobile } from '../../platforms';\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\nimport { MaskitoOptions } from '@maskito/core';\nimport { MaskitoDateMode, maskitoDateOptionsGenerator, maskitoWithPlaceholder } from '@maskito/kit';\nimport { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';\nimport { AppFloatLabelType } from '../../types';\n\nconst DEFAULT_VALUE_ACCESSOR: Provider = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => MatDate),\n  multi: true,\n};\nconst I18N_KEYS = ['COMMON.DATE_PATTERN', 'COMMON.DATE_PLACEHOLDER'];\n\nconst noop = () => {};\n\n@Component({\n  selector: 'mat-date-field',\n  templateUrl: './material.date.html',\n  styleUrls: ['./material.date.scss'],\n  providers: [DEFAULT_VALUE_ACCESSOR],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatDate implements OnInit, AfterViewInit, OnDestroy, ControlValueAccessor, InputElement {\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n  private readonly _subscription = new Subscription();\n  private _writing = true;\n  private _disabling = false;\n  private _tabindex: number;\n  private _readonly = false;\n  private _appearance: MatFormFieldAppearance | null = null;\n  private _subscriptSizing: SubscriptSizing | null = null;\n  private readonly _defaultAppearance: MatFormFieldAppearance;\n  private readonly _defaultSubscriptSizing: SubscriptSizing;\n\n  protected textControl: UntypedFormControl;\n  protected datePattern: string;\n  protected locale: string;\n  protected maskitoOptions: MaskitoOptions;\n  protected datePlaceholder: string;\n\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() placeholder: string;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input({ transform: booleanAttribute }) mobile: boolean;\n  @Input({ transform: booleanAttribute }) compact = false;\n  @Input({ transform: booleanAttribute }) autofocus = false;\n  @Input({ transform: booleanAttribute }) clearable = false;\n  @Input({ transform: booleanAttribute }) required: boolean;\n  @Input() startDate: Moment | null = null;\n  @Input() timezone: string = null;\n  @Input() datePickerFilter: DateFilterFn<Moment>;\n\n  @Input()\n  set appearance(value: MatFormFieldAppearance) {\n    this._appearance = value;\n  }\n\n  get appearance(): MatFormFieldAppearance {\n    return this._appearance || this._defaultAppearance;\n  }\n\n  @Input()\n  set subscriptSizing(value: SubscriptSizing) {\n    this._subscriptSizing = value;\n  }\n\n  get subscriptSizing(): SubscriptSizing {\n    return this._subscriptSizing || this._defaultSubscriptSizing;\n  }\n\n  @Input() set readonly(value: boolean) {\n    this._readonly = value;\n    this.markForCheck();\n  }\n\n  get readonly(): boolean {\n    return this._readonly;\n  }\n\n  @Input() set tabindex(value: number) {\n    if (this._tabindex !== value) {\n      this._tabindex = value;\n      if (!this._writing) this.updateTabIndex();\n    }\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  get value(): any {\n    return this.formControl.value;\n  }\n\n  get disabled(): boolean {\n    return this.formControl.disabled;\n  }\n\n  @ViewChild('datePicker') datePicker: MatDatepicker<Moment>;\n  @ViewChild('matInput') _matInput: ElementRef;\n\n  constructor(\n    private dateAdapter: MomentDateAdapter,\n    private translate: TranslateService,\n    private formBuilder: UntypedFormBuilder,\n    private cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective,\n    @Inject(MAT_FORM_FIELD_DEFAULT_OPTIONS) defaultOptions?: MatFormFieldDefaultOptions\n  ) {\n    this.locale = (translate.currentLang || translate.defaultLang).substring(0, 2);\n    this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;\n    this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;\n  }\n\n  ngOnInit() {\n    this.formControl =\n      this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-date-field>.\");\n\n    this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);\n    this.required = isNotNilBoolean(this.required)\n      ? this.required\n      : this.formControl.hasValidator(Validators.required) || isBlankString(this.required);\n\n    // Add 'validDate' validator (when existing validator are null or required, to be sure to keep it)\n    if (!this.formControl.validator || this.formControl.validator === Validators.required) {\n      this.formControl.setValidators(\n        this.required ? [Validators.required, SharedValidators.validDateAllowNoTime] : SharedValidators.validDateAllowNoTime\n      );\n    } else {\n      this.formControl.setValidators(\n        this.required\n          ? [this.formControl.validator, Validators.required, SharedValidators.validDateAllowNoTime]\n          : [this.formControl.validator, SharedValidators.validDateAllowNoTime]\n      );\n    }\n\n    // Create the text control\n    this.textControl = this.formBuilder.control(\n      null,\n      // Important: should copy errors from the model formControl\n      () => this.formControl.errors\n    );\n\n    // Get patterns to display date\n    this.updateTranslations(this.translate.instant(I18N_KEYS));\n    this._subscription.add(\n      this.translate\n        .get(I18N_KEYS)\n        .pipe(skip(1))\n        .subscribe((translations) => this.updateTranslations(translations))\n    );\n\n    this._subscription.add(this.textControl.valueChanges.subscribe((value) => this.onFormChange(value)));\n\n    // Listen status changes (when done outside the component  - e.g. when setErrors() is calling on the formControl)\n    this._subscription.add(\n      this.formControl.statusChanges\n        .pipe(\n          filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip\n        )\n        .subscribe(() => {\n          this.textControl.updateValueAndValidity({ emitEvent: false });\n          if (this.formControl.touched && !this.textControl.touched) {\n            this.textControl.markAsTouched();\n          }\n          this.markForCheck();\n        })\n    );\n\n    this._writing = false;\n  }\n\n  ngAfterViewInit() {\n    this.updateTabIndex();\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n\n  writeValue(value: any): void {\n    if (this._writing) return; // Skip\n    this._writing = true;\n\n    // DEBUG\n    //console.debug(\"[mat-date] writeValue() with:\", value);\n\n    // Convert into date\n    // Important: clone, because startOf will update the existing date\n    const date = isMoment(value) ? value.clone() : fromDateISOString(value);\n\n    if (!date || !date.isValid()) {\n      this.textControl.patchValue(null, { emitEvent: false });\n      if (this.formControl.value) {\n        this.formControl.patchValue(null, { emitEvent: false });\n        this._onChangeCallback(null);\n      }\n    } else {\n      // Move to the expected TZ (keeping local hour - e.g. midnight)\n      const day = ((this.timezone && date.tz(this.timezone)) || date)\n        // Reset hour\n        .startOf('day');\n      const dayStr = this.dateAdapter.format(day, this.datePattern);\n\n      if (this.textControl.value !== dayStr) {\n        // Update text control\n        this.textControl.patchValue(dayStr, { emitEvent: false });\n      }\n    }\n\n    this._writing = false;\n    this.markForCheck();\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    if (this._disabling) return;\n\n    this._disabling = true;\n    if (isDisabled) {\n      this.textControl.disable({ emitEvent: false });\n    } else {\n      this.textControl.enable({ emitEvent: false });\n    }\n    this._disabling = false;\n\n    this.markForCheck();\n  }\n\n  openDatePicker(event?: Event) {\n    if (!this.datePicker) return;\n    this._preventEvent(event);\n    if (!this.datePicker.opened) {\n      // DEBUG\n      //console.debug('[mat-date] Opening date picker...');\n\n      this.datePicker.open();\n    }\n  }\n\n  focus() {\n    if (!this._matInput) return;\n\n    setTimeout(() => {\n      if (isFocusableElement(this._matInput.nativeElement)) {\n        this._matInput.nativeElement.focus();\n      }\n    });\n  }\n\n  clear(event: Event) {\n    this._preventEvent(event);\n\n    this.textControl.patchValue(null, { emitEvent: false });\n    this.formControl.setValue(null, { emitEvent: false });\n    this._onChangeCallback(null);\n    this.markAsTouched();\n    this.markAsDirty();\n  }\n\n  /* -- protected functions -- */\n\n  protected _onDatePickerChange(event: MatDatepickerInputEvent<Moment>): void {\n    // Make sure event is valid\n    if (!event || (event.value !== null && !isMoment(event.value))) {\n      console.warn('Invalid MatDatepicker event. Skipping', event);\n      return; // Skip\n    }\n\n    let value = event.value;\n\n    // No value, but mobile mode: use the current date\n    if (!value && this.mobile) {\n      value = DateUtils.resetTime(DateUtils.moment().locale(this.locale), this.timezone);\n      this.formControl.setValue(toDateISOString(value), {\n        emitEvent: false, // Will call writeValue()\n      });\n      return;\n    }\n\n    const date = value\n      ?.clone()\n      .locale(this.locale) // set as time as locale time\n      .startOf('day') // reset hour\n      .utc(true);\n    const dateStr = (date && this.dateAdapter.format(date, this.datePattern)) || null;\n\n    if (this.textControl.value !== dateStr) {\n      // DEBUG\n      //console.debug(\"[mat-date] onDatePickerChange() new value:\", dateStr);\n\n      this.textControl.setValue(dateStr, {\n        emitEvent: true, // Will call onFormChange\n      });\n    }\n  }\n\n  protected _openDatePickerIfMobile(event: Event) {\n    if (!this.mobile || event?.defaultPrevented || this.datePicker?.opened || this.disabled) return;\n\n    //console.debug('[mat-date] Preparing to open date picker... ');\n\n    this._preventEvent(event);\n\n    // Open the picker\n    this.openDatePicker(event);\n  }\n\n  protected _onBlur() {\n    if (this.textControl.touched) {\n      // Auto fill data in case of partial input\n      this.writeValue(this.formControl.value);\n    }\n\n    // Check if touched\n    this._checkIfTouched();\n  }\n\n  protected _checkIfTouched() {\n    if (this.textControl.touched) {\n      this._onTouchedCallback();\n\n      this.markForCheck();\n    }\n  }\n\n  protected _preventEvent(event?: Event) {\n    if (!event) return;\n    event.preventDefault();\n    if (event.stopPropagation) event.stopPropagation();\n    if (event.stopImmediatePropagation) event.stopImmediatePropagation();\n  }\n\n  /* -- private methods -- */\n\n  private updateTranslations(translations: { [key: string]: string }) {\n    const datePattern = translations['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? translations['COMMON.DATE_PATTERN'] : 'DD/MM/YYYY';\n    this.updatePattern(datePattern);\n\n    const datePlaceholder =\n      translations['COMMON.DATE_PLACEHOLDER'] !== 'COMMON.DATE_PLACEHOLDER'\n        ? translations['COMMON.DATE_PLACEHOLDER']\n        : this.datePattern?.toLowerCase();\n    this.updateMaskOptions(datePlaceholder);\n  }\n\n  private updatePattern(pattern: string) {\n    if (this.datePattern !== pattern) {\n      this.datePattern = pattern;\n      this.markForCheck();\n    }\n  }\n\n  private updateMaskOptions(datePlaceholder: string) {\n    if (this.datePlaceholder != datePlaceholder) {\n      this.datePlaceholder = datePlaceholder;\n\n      const dateOptions = maskitoDateOptionsGenerator({\n        mode: this.datePattern.toLowerCase() as MaskitoDateMode,\n        separator: '/',\n      });\n\n      const {\n        plugins, // plugins keeps caret inside actual value and remove placeholder on blur\n        ...placeholderOptions\n        // pass 'true' as second argument to add plugin to hide placeholder when input is not focused\n      } = maskitoWithPlaceholder(this.datePlaceholder, true);\n\n      this.maskitoOptions = {\n        ...dateOptions,\n        plugins: plugins.concat(dateOptions.plugins || []),\n        preprocessors: [\n          // Always put it BEFORE all other preprocessors\n          ...placeholderOptions.preprocessors,\n          ...dateOptions.preprocessors,\n        ],\n        postprocessors: [\n          ...dateOptions.postprocessors,\n          // Always put it AFTER all other postprocessors\n          ...placeholderOptions.postprocessors,\n        ],\n      } as Required<MaskitoOptions>;\n\n      this.markForCheck();\n    }\n  }\n\n  private onFormChange(dateStr: string): void {\n    if (this._writing) return; // Skip if call by self\n    this._writing = true;\n\n    if (dateStr === this.datePlaceholder) {\n      dateStr = null;\n    } else {\n      dateStr = nullIfNilOrBlank(dateStr);\n    }\n\n    //console.debug(`[mat-date] onFormChange() - controls values: `, dateStr);\n\n    // Force '0' for empty month (otherwise moment will use the current month)\n    dateStr = dateStr\n      ?.replace(/[^\\d/]/g, '') // Keep only  digits and slashes\n      .replace('//', '/0/')\n      // Force '0' for empty year (otherwise moment will use the current year)\n      .replace(/\\/$/, '/0');\n\n    // Parse date (strict = false)\n    let date: Moment = (dateStr && this.dateAdapter.parse(dateStr, this.datePattern)) || null;\n\n    // Move to the expected TZ, and keep the local hour (= midnight) to have midnight at local time\n    if (this.timezone) {\n      date = date?.tz(this.timezone, true);\n    }\n\n    date = date\n      ?.startOf('day') // Reset hour\n      // Convert to UTC (avoid TZ offset in final string);\n      .utc();\n\n    // Set model value\n    this.emitChange(date, dateStr);\n\n    // Force the day control to update its validity (same errors as formControl - see ngOnInit())\n    this.textControl.updateValueAndValidity();\n\n    this._writing = false;\n  }\n\n  private emitChange(date: Moment, defaultValue?: string) {\n    // Convert to model value (ISO date string)\n    // IMPORTANT: If date is invalid, then keep the invalid string value\n    // to allow SharedValidators.validDate() to raise an error\n    const controlValue = date?.isValid() ? toDateISOString(date) : defaultValue || null;\n\n    if (this.formControl.value !== controlValue) {\n      // DEBUG\n      //console.debug('[mat-date] Emit new value: ' + controlValue);\n\n      // Update formControl value (this is need to update datePicker also, in desktop mode)\n      if (!this.mobile && date?.isValid()) {\n        this.formControl.setValue(controlValue, { emitEvent: false });\n      }\n\n      // Changes comes from inside function: use the callback\n      this._onChangeCallback(controlValue);\n\n      // Check if need to update controls\n      this._checkIfTouched();\n    }\n  }\n\n  private updateTabIndex() {\n    if (isNil(this._tabindex) || this._tabindex === -1) return; // skip\n\n    // Focus to input\n    setTimeout(() => {\n      setTabIndex(this._matInput, this._tabindex);\n      this.markForCheck();\n    });\n  }\n\n  private markAsTouched(opts?: { onlySelf?: boolean }) {\n    this.textControl.markAsTouched(opts);\n    this._onTouchedCallback();\n    this.markForCheck();\n  }\n\n  private markAsDirty(opts?: any) {\n    this.formControl.markAsDirty(opts);\n  }\n\n  private markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<!-- readonly -->\n@if (readonly) {\n  <mat-form-field\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    class=\"mat-form-field-disabled\"\n  >\n    <div matPrefix>\n      <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n    </div>\n    @if (floatLabel !== 'never' && !!placeholder) {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n    <ion-text>{{ formControl.value | dateFormat: { pattern: datePattern } }}</ion-text>\n    <div matSuffix>\n      <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n    </div>\n\n    <!-- hints -->\n    <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n      <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n    </mat-hint>\n  </mat-form-field>\n} @else {\n  <mat-form-field\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    (focus)=\"_openDatePickerIfMobile($event)\"\n    (click)=\"_openDatePickerIfMobile($event)\"\n    [appearance]=\"appearance\"\n  >\n    <div matPrefix>\n      <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n    </div>\n\n    @if (floatLabel !== 'never' && !!placeholder) {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    <!-- Desktop -->\n    @if (!mobile) {\n      <input\n        matInput\n        #matInput\n        autocomplete=\"off\"\n        type=\"text\"\n        [maskito]=\"maskitoOptions\"\n        [formControl]=\"textControl\"\n        (blur)=\"_onBlur()\"\n        (keyup.arrowDown)=\"openDatePicker($event)\"\n        (keyup.escape)=\"_preventEvent($event)\"\n        [required]=\"required\"\n        [tabindex]=\"tabindex\"\n        [appAutofocus]=\"autofocus\"\n      />\n      <input\n        type=\"text\"\n        [formControl]=\"formControl\"\n        hidden\n        [matDatepicker]=\"datePicker\"\n        [matDatepickerFilter]=\"datePickerFilter\"\n        (dateChange)=\"_onDatePickerChange($event)\"\n        readonly\n      />\n    } @else {\n      <!-- Mobile -->\n      <input\n        #matInput\n        autocomplete=\"off\"\n        type=\"text\"\n        class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n        [formControl]=\"textControl\"\n        [required]=\"required\"\n        [tabindex]=\"tabindex\"\n        readonly\n      />\n      <input\n        matInput\n        type=\"text\"\n        [formControl]=\"formControl\"\n        hidden\n        [matDatepicker]=\"datePicker\"\n        [matDatepickerFilter]=\"datePickerFilter\"\n        (dateChange)=\"_onDatePickerChange($event)\"\n        readonly\n      />\n    }\n\n    <div matSuffix>\n      <button type=\"button\" mat-icon-button tabindex=\"-1\" (click)=\"openDatePicker($event)\" [disabled]=\"disabled\">\n        <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n      </button>\n\n      @if (clearable) {\n        <button\n          mat-icon-button\n          tabindex=\"-1\"\n          type=\"button\"\n          (click)=\"clear($event)\"\n          [hidden]=\"formControl.disabled || !formControl.value\"\n        >\n          <mat-icon>close</mat-icon>\n        </button>\n      }\n\n      <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n    </div>\n\n    <!-- errors -->\n    <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n      @switch (errorKey) {\n        @case ('required') {\n          <span translate>ERROR.FIELD_REQUIRED</span>\n        }\n        @case ('validDate') {\n          <span translate>ERROR.FIELD_NOT_VALID_DATE</span>\n        }\n        @case ('dateIsAfter') {\n          <span>\n            {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}\n          </span>\n        }\n        @case ('dateIsBefore') {\n          <span>\n            {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}\n          </span>\n        }\n        @case ('dateRange') {\n          <span translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n        }\n        @case ('dateMaxDuration') {\n          <span translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n        }\n        @case ('dateMinDuration') {\n          <span translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n        }\n        @case ('msg') {\n          <span>\n            {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n          </span>\n        }\n      }\n    </mat-error>\n    <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n    <!-- hints -->\n    @if (!formControl.invalid) {\n      <mat-hint>\n        <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n      </mat-hint>\n    }\n  </mat-form-field>\n\n  <mat-datepicker #datePicker [touchUi]=\"mobile\" [disabled]=\"disabled\" [startAt]=\"startDate\">\n    <!-- Date picker buttons -->\n    @if (mobile) {\n      <mat-datepicker-actions>\n        <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n        <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n          <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n        </ion-button>\n      </mat-datepicker-actions>\n    }\n  </mat-datepicker>\n}\n\n<ng-template #matPrefixTemplate>\n  <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n  <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n  <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n  <div class=\"mat-mdc-form-field-hint-wrapper\">\n    <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n    <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n    <ng-content select=\"mat-hint[align='end']\"></ng-content>\n  </div>\n</ng-template>\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  Inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  Provider,\n  QueryList,\n  Renderer2,\n  ViewChild,\n  ViewChildren,\n} from '@angular/core';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldAppearance, MatFormFieldDefaultOptions, SubscriptSizing } from '@angular/material/form-field';\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormBuilder, UntypedFormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isMoment, Moment } from 'moment';\nimport { SharedValidators } from '../../validator/validators';\nimport { filter, skip } from 'rxjs/operators';\nimport { InputElement, setTabIndex } from '../../inputs';\nimport { isFocusableElement } from '../../focusable';\nimport { merge, Subscription } from 'rxjs';\nimport { DateFilterFn, MatDatepicker, MatDatepickerInputEvent } from '@angular/material/datepicker';\nimport { isBlankString, isNil, isNotNil, isNotNilBoolean, isNotNilOrBlank, nullIfNilOrBlank } from '../../functions';\nimport { DateUtils, fromDateISOString, toDateISOString } from '../../dates';\nimport { isMobile } from '../../platforms';\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\nimport { MaskitoOptions } from '@maskito/core';\nimport { MaskitoDateMode, maskitoDateOptionsGenerator, MaskitoTimeMode, maskitoTimeOptionsGenerator, maskitoWithPlaceholder } from '@maskito/kit';\nimport { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';\nimport { AppFloatLabelType } from '../../types';\n\nconst DEFAULT_VALUE_ACCESSOR: Provider = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => MatDateTime),\n  multi: true,\n};\n\nconst I18N_KEYS = [\n  'COMMON.DATE_PATTERN',\n  'COMMON.TIME_PATTERN',\n  'COMMON.DATE_TIME_PATTERN',\n  'COMMON.DATE_PLACEHOLDER',\n  'COMMON.TIME_PLACEHOLDER',\n  'COMMON.HOUR_PATTERN',\n];\n\nconst noop = () => {};\n\ndeclare interface NgxTimePicker {\n  open();\n  close();\n}\n\n@Component({\n  // eslint-disable-next-line @angular-eslint/component-selector\n  selector: 'mat-date-time-field',\n  templateUrl: './material.datetime.html',\n  styleUrls: ['./material.datetime.scss'],\n  providers: [DEFAULT_VALUE_ACCESSOR],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatDateTime implements OnInit, AfterViewInit, OnDestroy, ControlValueAccessor, InputElement {\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n  private _subscription = new Subscription();\n  private _controlSubscription: Subscription;\n  private _writing = true;\n  private _disabling = false;\n  private _focused = false;\n  private _tabindex: number;\n  private _readonly = false;\n  private _controlName: string;\n  private _required: boolean;\n  private _appearance: MatFormFieldAppearance | null = null;\n  private _subscriptSizing: SubscriptSizing | null = null;\n  private readonly _defaultAppearance: MatFormFieldAppearance;\n  private readonly _defaultSubscriptSizing: SubscriptSizing;\n\n  protected _formControl: UntypedFormControl;\n  protected dateControl: UntypedFormControl;\n  protected timeControl: UntypedFormControl;\n  protected displayPattern: string;\n  protected datePattern: string;\n  protected timePattern: string;\n  protected locale: string;\n  protected maskitoDateOptions: MaskitoOptions;\n  protected maskitoTimeOptions: MaskitoOptions;\n  protected datePlaceholder: string;\n  protected timePlaceholder: string;\n\n  @Input() logPrefix = '[mat-date-time]';\n  @Input() placeholder: string;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input({ transform: booleanAttribute }) mobile: boolean;\n  @Input({ transform: booleanAttribute }) compact = false;\n  @Input({ transform: booleanAttribute }) autofocus = false;\n  @Input({ transform: booleanAttribute }) clearable = false;\n  @Input() startDate: Moment | null = null;\n  @Input() datePickerFilter: DateFilterFn<Moment>;\n  @Input({ transform: booleanAttribute }) allowNoTime = false;\n  @Input({ transform: booleanAttribute }) dottedMinutesInGap = true;\n  @Input({ transform: booleanAttribute }) timeHoursOnly = false;\n  @Input({ transform: booleanAttribute }) debug = false;\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  @Input('class') classList: string;\n  @Input() style: string;\n  @Input() hourMinWidth: string;\n  @Input() hourMaxWidth: string;\n\n  @Input()\n  set appearance(value: MatFormFieldAppearance) {\n    this._appearance = value;\n  }\n  get appearance(): MatFormFieldAppearance {\n    return this._appearance || this._defaultAppearance;\n  }\n\n  @Input()\n  set subscriptSizing(value: SubscriptSizing) {\n    this._subscriptSizing = value;\n  }\n  get subscriptSizing(): SubscriptSizing {\n    return this._subscriptSizing || this._defaultSubscriptSizing;\n  }\n\n  @Input() set formControl(value: UntypedFormControl) {\n    this._setFormControl(value);\n  }\n  get formControl(): UntypedFormControl {\n    return this._formControl;\n  }\n\n  @Input() set formControlName(value: string) {\n    this._setFormControlName(value);\n  }\n  get formControlName(): string {\n    return this._controlName;\n  }\n\n  @Input() set required(value: boolean | any) {\n    if (this._required === value) return; // SKip\n\n    this._required = value;\n    if (this._formControl) {\n      this._updateControlValidators(this._formControl, value);\n    }\n  }\n  get required(): boolean | any {\n    return this._required;\n  }\n\n  get requiredTime(): boolean | any {\n    return this._required && !this.allowNoTime;\n  }\n\n  @Input() set readonly(value: boolean) {\n    this._readonly = value;\n    this.markForCheck();\n  }\n\n  get readonly(): boolean {\n    return this._readonly;\n  }\n\n  @Input() set tabindex(value: number) {\n    if (this._tabindex !== value) {\n      this._tabindex = value;\n      if (!this._writing) this.updateTabIndex();\n    }\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  get value(): any {\n    return this.formControl.value;\n  }\n\n  get disabled(): boolean {\n    return this.formControl.disabled;\n  }\n\n  @ViewChild('datePicker') datePicker: MatDatepicker<Moment>;\n  @ViewChild('timePicker') timePicker: NgxTimePicker;\n  @ViewChildren('matInput') _matInputs: QueryList<ElementRef>;\n\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('focus') focused = new EventEmitter<FocusEvent>();\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('blur') blurred = new EventEmitter<FocusEvent>();\n  @Output('keydown.escape') keydownEscape = new EventEmitter<Event>();\n  @Output('keyup.enter') keyupEnter = new EventEmitter<Event>();\n\n  constructor(\n    private dateAdapter: MomentDateAdapter,\n    private translate: TranslateService,\n    private formBuilder: UntypedFormBuilder,\n    private renderer: Renderer2,\n    private cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective,\n    @Inject(MAT_FORM_FIELD_DEFAULT_OPTIONS) defaultOptions?: MatFormFieldDefaultOptions\n  ) {\n    this.locale = (translate.currentLang || translate.defaultLang).substring(0, 2);\n    this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;\n    this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;\n  }\n\n  ngOnInit() {\n    const control = this._formControl || (this._controlName && (this.formGroupDir?.form.get(this._controlName) as UntypedFormControl));\n    if (!control) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-date-time-field>.\");\n\n    // Default values\n    this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);\n    this._required = isNotNilBoolean(this._required) ? this._required : control.hasValidator(Validators.required) || isBlankString(this._required);\n\n    this._setFormControl(control);\n\n    // Create the date control\n    this.dateControl = this.formBuilder.control(null);\n\n    // Create the time control\n    this.timeControl = this.formBuilder.control(null);\n\n    // Get patterns to display date and date+time\n    this.updateTranslations(this.translate.instant(I18N_KEYS));\n    this._subscription.add(\n      this.translate\n        .get(I18N_KEYS)\n        .pipe(skip(1))\n        .subscribe((translations) => this.updateTranslations(translations))\n    );\n\n    this._subscription.add(\n      merge(this.dateControl.valueChanges, this.timeControl.valueChanges).subscribe(() =>\n        this.onFormChange(this.dateControl.value, this.timeControl.value)\n      )\n    );\n\n    this._writing = false;\n  }\n\n  ngAfterViewInit() {\n    this.updateTabIndex();\n    // Enable animations now. This ensures we don't animate on initial render.\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n    this._controlSubscription?.unsubscribe();\n    this.blurred.complete();\n  }\n\n  writeValue(value: any): void {\n    if (this._writing) return; // Skip\n    this._writing = true;\n\n    // Convert into date\n    const moment = isMoment(value) ? value : fromDateISOString(value);\n\n    // DEBUG\n    //console.debug(\"[mat-date-time] writeValue() with:\", value);\n\n    if (!moment || !moment.isValid()) {\n      this.dateControl.patchValue(null, { emitEvent: false });\n      this.timeControl.patchValue(null, { emitEvent: false });\n    } else {\n      const date = moment\n        // Important: clone, because startOf() will update the existing date\n        .clone()\n        // Reset time\n        .startOf('day');\n      const dateStr = this.dateAdapter.format(date, this.datePattern);\n\n      // Format time\n      let timeStr: string;\n      if (DateUtils.isNoTime(moment)) {\n        // Clear time\n        timeStr = null;\n      } else {\n        // - Format hh\n        let hour: number | string = moment.hour();\n        hour = +hour < 10 ? '0' + hour : hour;\n        // - Format mm\n        let minutes: number | string = moment.minutes();\n        minutes = +minutes < 10 ? '0' + minutes : minutes;\n        timeStr = `${hour}:${minutes}`;\n      }\n\n      // Update controls\n      this.dateControl.patchValue(dateStr, { emitEvent: false });\n      this.timeControl.patchValue(timeStr, { emitEvent: false });\n    }\n\n    this._writing = false;\n    this.markForCheck();\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    if (this._disabling) return; // Skip\n    this._disabling = true;\n\n    if (isDisabled) {\n      this.dateControl.disable({ emitEvent: false });\n      this.timeControl.disable({ emitEvent: false });\n    } else {\n      this.dateControl.enable({ emitEvent: false });\n      this.timeControl.enable({ emitEvent: false });\n    }\n\n    this._disabling = false;\n    this.markForCheck();\n  }\n\n  openDatePicker(event?: Event, datePicker?: MatDatepicker<any>) {\n    datePicker = datePicker || this.datePicker;\n    if (datePicker) {\n      this._preventEvent(event);\n\n      if (!datePicker.opened) {\n        datePicker.open();\n      }\n    }\n  }\n\n  openTimePicker(event?: Event, timePicker: NgxTimePicker = this.timePicker) {\n    if (!timePicker || this.disabled) return; // Skip\n\n    this._preventEvent(event);\n\n    timePicker.open();\n    setTimeout(() => {\n      this.fixTimePickerPosition();\n    });\n  }\n\n  private fixTimePickerPosition() {\n    const overlayPane = document.querySelector('.cdk-overlay-pane:has(ngx-mat-timepicker-provider)') as HTMLElement;\n    if (!overlayPane) return;\n\n    const rect = overlayPane.getBoundingClientRect();\n    const viewportWidth = window.innerWidth;\n    const viewportHeight = window.innerHeight;\n\n    let deltaX = 0;\n    let deltaY = 0;\n\n    // Corrections basées sur la position dans le viewport\n    if (rect.right > viewportWidth) {\n      deltaX = viewportWidth - rect.right;\n    } else if (rect.left < 0) {\n      deltaX = -rect.left;\n    }\n\n    if (rect.bottom > viewportHeight) {\n      deltaY = viewportHeight - rect.bottom;\n    } else if (rect.top < 0) {\n      deltaY = -rect.top;\n    }\n\n    if (deltaX !== 0 || deltaY !== 0) {\n      const pickerElement = overlayPane.firstElementChild as HTMLElement;\n      this.renderer.setStyle(pickerElement ?? overlayPane, 'transform', `translate(${deltaX}px, ${deltaY}px)`);\n    }\n  }\n\n  focus() {\n    const matInput = this._matInputs.first;\n    if (!matInput) return;\n\n    // Need a delay to prevent early focus event, just after a blur event\n    setTimeout(() => {\n      if (isFocusableElement(matInput.nativeElement)) {\n        matInput.nativeElement.focus();\n      }\n    });\n  }\n\n  clear(event?: Event) {\n    this._preventEvent(event);\n\n    this.dateControl.patchValue(null, { emitEvent: false });\n    this.timeControl.patchValue(null, { emitEvent: false });\n    this._formControl.setValue(null, { emitEvent: false });\n    this._onChangeCallback(null);\n    this.markAsTouched();\n    this.markAsDirty();\n  }\n\n  /* -- protected functions -- */\n\n  protected _setFormControlName(controlName: string) {\n    if (!controlName || this._controlName === controlName) return; // Skip\n\n    this._controlName = controlName;\n\n    const control = this.formGroupDir?.form?.get(controlName) as UntypedFormControl;\n    if (control) this._setFormControl(control);\n  }\n\n  protected _setFormControl(control: UntypedFormControl) {\n    if (!control) return; // Skip\n\n    if (this._formControl !== control) {\n      this._formControl = control;\n\n      // Listen status changes (when done outside the component  - e.g. when setErrors() is calling on the formControl)\n      this._controlSubscription?.unsubscribe();\n      this._controlSubscription = control.statusChanges\n        .pipe(\n          filter((_) => !this._readonly && !this._writing && !this._disabling) // Skip\n        )\n        .subscribe((_) => {\n          // DEBUG\n          //console.debug('[mat-date-time] updateValueAndValidity of sub controls');\n\n          this.dateControl.updateValueAndValidity({ emitEvent: false });\n          this.timeControl.updateValueAndValidity({ emitEvent: false });\n          if (this._formControl.touched) {\n            if (!this.dateControl.touched) this.dateControl.markAsTouched();\n            if (!this.timeControl.touched) this.timeControl.markAsTouched();\n          }\n\n          //console.debug('[mat-date-time] timeControl.error ?', this.timeControl.errors);\n          this.markForCheck();\n        });\n    }\n\n    // Update validators\n    this._updateControlValidators(control, this._required);\n  }\n\n  protected _updateControlValidators(control: UntypedFormControl, required: boolean) {\n    if (!control) return;\n\n    // Add 'validDate' validator\n    {\n      const validator = this.allowNoTime ? SharedValidators.validDateAllowNoTime : SharedValidators.validDate;\n      const inverseValidator = this.allowNoTime ? SharedValidators.validDate : SharedValidators.validDateAllowNoTime;\n      if (!control.hasValidator(validator)) {\n        control.addValidators(validator);\n      }\n      if (control.hasValidator(inverseValidator)) {\n        control.removeValidators(inverseValidator);\n      }\n    }\n\n    // Add required validator (if need)\n    if (required) {\n      if (!control.hasValidator(Validators.required)) {\n        control.addValidators(Validators.required);\n      }\n    } else {\n      if (control.hasValidator(Validators.required)) {\n        control.removeValidators(Validators.required);\n      }\n    }\n  }\n\n  protected _onDatePickerChange(event: MatDatepickerInputEvent<Moment>): void {\n    //console.debug(`[${this.constructor.name}._onDatePickerChange]`);\n\n    // Make sure event is valid\n    if (!event || (event.value !== null && !isMoment(event.value))) {\n      console.warn('Invalid MatDatepicker event. Skipping', event);\n      return; // Skip\n    }\n\n    let moment = event.value;\n\n    // No value, but mobile mode: use the current date\n    if (!moment && this.mobile) {\n      this._writing = true;\n      moment = DateUtils.resetTime(DateUtils.moment().locale(this.locale));\n      this._formControl.setValue(moment, { emitEvent: false });\n      this.markForCheck();\n      this._writing = false;\n    }\n\n    // Convert to usable date, then convert to date pattern (e.g DD/MM/YYYY)\n    const date = moment\n      ?.locale(this.locale) // set locale\n      .hour(0)\n      .minute(0)\n      .seconds(0)\n      .millisecond(0) // Reset hour\n      .utc(true);\n    const dateStr = (date && this.dateAdapter.format(date, this.datePattern)) || null;\n\n    // Update the date control\n    if (this.dateControl.value !== dateStr) {\n      // DEBUG\n      // console.debug(\"[mat-date-time] onDatePickerChange() new value:\", dateStr);\n\n      this.dateControl.setValue(dateStr, {\n        emitEvent: true, // Will call onFormChange\n      });\n    }\n\n    if (this.mobile) {\n      // Loop if invalid\n      if (!event.value && this.required) {\n        if (this.required) this._openDatePickerIfMobile();\n      } else {\n        this._openTimePickerIfMobile();\n      }\n    }\n    this._writing = false;\n  }\n\n  protected _onTimePickerChanged(timeStr: string) {\n    // Update the time control, if need\n    if (this.timeControl.value !== timeStr) {\n      // DEBUG\n      // console.debug(\"[mat-date-time] onTimePickerChange() new value:\", timeStr);\n\n      this.timeControl.setValue(timeStr, {\n        emitEvent: true, // Will call onFormChange\n      });\n    }\n  }\n\n  protected _openDatePickerIfMobile(event?: Event, datePicker?: MatDatepicker<any>) {\n    if (!this.mobile || event?.defaultPrevented || this.disabled) return;\n\n    this._preventEvent(event);\n\n    // Open the picker\n    this.openDatePicker(null, datePicker);\n  }\n\n  protected _openTimePickerIfMobile(event?: Event) {\n    if (!this.mobile || event?.defaultPrevented || this.disabled) return;\n\n    // Open the picker\n    this.openTimePicker(event);\n  }\n\n  filterInputTextFocusEvent(event: FocusEvent) {\n    if (!event || event.defaultPrevented) {\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + ' calling filterInputTextFocusEvent - event.defaultPrevented');\n\n      return false;\n    }\n    // Ignore event from internal inputs\n    if (event.relatedTarget instanceof HTMLElement && this._matInputs.some((item) => item.nativeElement === event.relatedTarget)) {\n      event.preventDefault();\n      if (event.stopPropagation) event.stopPropagation();\n      event.returnValue = false;\n\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + ' Cancelling focus event');\n\n      return false;\n    }\n\n    // Already focused\n    if (this._focused) return false;\n\n    this._focused = true;\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Emit focus event');\n\n    // Need a delay to prevent early focus event, just after a blur event\n    setTimeout(() => {\n      if (!this._focused) return; // Skip if blur event received\n\n      this.focused.emit(event);\n    }, 10);\n\n    return true;\n  }\n\n  protected filterInputTextBlurEvent(event: FocusEvent) {\n    if (!event || event.defaultPrevented) return;\n\n    // Ignore event from internal inputs\n    if (event.relatedTarget instanceof HTMLElement && this._matInputs.some((item) => item.nativeElement === event.relatedTarget)) {\n      event.preventDefault();\n      if (event.stopPropagation) event.stopPropagation();\n      event.returnValue = false;\n\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + ' Cancelling blur event');\n\n      return false;\n    }\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' filterInputTextBlurEvent', event);\n\n    // Already blurred: skip\n    if (!this._focused) return;\n\n    this._focused = false;\n\n    // Need a delay to prevent early blur event without triggering formChange event\n    setTimeout(() => {\n      if (this._focused) return; // Skip if focus again\n\n      this._onBlur(event);\n    }, 100);\n  }\n\n  protected _onBlur(event: FocusEvent) {\n    if (this.dateControl.touched || this.timeControl.touched) {\n      const dateStr = this.dateControl.value;\n\n      // Auto fill data time/in case of partial input\n      if (isNotNilOrBlank(dateStr)) {\n        const timeStr = this.timeControl.value;\n        const date: Moment = this.dateAdapter.parse(dateStr, this.datePattern);\n        let validDate = true;\n        if (isNotNilOrBlank(timeStr)) {\n          const hourParts = (timeStr || '').split(':');\n          const hour = parseInt(hourParts[0] || 0);\n          const minutes = parseInt(hourParts[1] || 0);\n          date.locale(this.locale).hour(hour).minute(minutes).seconds(0).millisecond(0);\n        }\n        // No time, and not required: mark\n        else {\n          DateUtils.markNoTime(date);\n          validDate = this.allowNoTime;\n        }\n\n        this.writeValue(date);\n\n        if (validDate) {\n          this._formControl.setValue(date, { emitEvent: false });\n          this.formControl.updateValueAndValidity();\n        } else {\n          // Mark control as invalid, because time is missing\n          this._formControl.markAsPending({ onlySelf: true });\n          this._formControl.setErrors({\n            validDate: true,\n            ...this._formControl.errors,\n          });\n        }\n      }\n    }\n\n    // Check if touched\n    this._checkIfTouched();\n\n    // Emit blur event\n    this.blurred.emit(event);\n  }\n\n  protected _checkIfTouched() {\n    if (this.dateControl.touched || this.timeControl.touched) {\n      this._onTouchedCallback();\n\n      this.markForCheck();\n    }\n  }\n\n  protected _preventEvent(event?: Event) {\n    if (!event) return;\n    event.preventDefault();\n    if (event.stopPropagation) event.stopPropagation();\n    if (event.stopImmediatePropagation) event.stopImmediatePropagation();\n  }\n\n  /* -- private method -- */\n\n  private updateTranslations(translations: { [key: string]: string }) {\n    this.datePattern = translations['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? translations['COMMON.DATE_PATTERN'] : 'DD/MM/YYYY';\n    this.timePattern = this.timeHoursOnly\n      ? translations['COMMON.HOUR_PATTERN'] !== 'COMMON.HOUR_PATTERN'\n        ? translations['COMMON.HOUR_PATTERN']\n        : 'HH:00'\n      : translations['COMMON.TIME_PATTERN'] !== 'COMMON.TIME_PATTERN'\n        ? translations['COMMON.TIME_PATTERN']\n        : 'HH:MM';\n\n    const displayPattern =\n      translations['COMMON.DATE_TIME_PATTERN'] !== 'COMMON.DATE_TIME_PATTERN' ? translations['COMMON.DATE_TIME_PATTERN'] : 'L LT';\n    this.updateDisplayPattern(displayPattern);\n\n    const datePlaceholder =\n      translations['COMMON.DATE_PLACEHOLDER'] !== 'COMMON.DATE_PLACEHOLDER'\n        ? translations['COMMON.DATE_PLACEHOLDER']\n        : this.datePattern?.toLowerCase();\n    this.updateDateMaskOptions(datePlaceholder);\n\n    const timePlaceholder =\n      translations['COMMON.TIME_PLACEHOLDER'] !== 'COMMON.TIME_PLACEHOLDER'\n        ? translations['COMMON.TIME_PLACEHOLDER']\n        : this.timePattern?.toLowerCase();\n    this.updateTimeMaskOptions(timePlaceholder);\n  }\n\n  private updateDisplayPattern(displayPattern: string) {\n    if (this.displayPattern !== displayPattern) {\n      this.displayPattern = displayPattern;\n      this.markForCheck();\n    }\n  }\n\n  private updateDateMaskOptions(datePlaceholder: string) {\n    if (this.datePlaceholder !== datePlaceholder) {\n      this.datePlaceholder = datePlaceholder;\n\n      const dateOptions = maskitoDateOptionsGenerator({\n        mode: this.datePattern.toLowerCase() as MaskitoDateMode,\n        separator: '/',\n      });\n\n      const {\n        plugins, // plugins keeps caret inside actual value and remove placeholder on blur\n        ...placeholderOptions\n        // pass 'true' as second argument to add plugin to hide placeholder when input is not focused\n      } = maskitoWithPlaceholder(this.datePlaceholder, true);\n\n      this.maskitoDateOptions = {\n        ...dateOptions,\n        plugins: plugins.concat(dateOptions.plugins || []),\n        preprocessors: [\n          // Always put it BEFORE all other preprocessors\n          ...placeholderOptions.preprocessors,\n          ...dateOptions.preprocessors,\n        ],\n        postprocessors: [\n          ...dateOptions.postprocessors,\n          // Always put it AFTER all other postprocessors\n          ...placeholderOptions.postprocessors,\n        ],\n      } as Required<MaskitoOptions>;\n\n      this.markForCheck();\n    }\n  }\n\n  private updateTimeMaskOptions(timePlaceholder: string) {\n    if (this.timePlaceholder !== timePlaceholder) {\n      this.timePlaceholder = timePlaceholder;\n\n      const timeOptions = maskitoTimeOptionsGenerator({\n        mode: this.timePattern.toUpperCase() as MaskitoTimeMode,\n        step: 1,\n      });\n\n      const {\n        plugins, // plugins keeps caret inside actual value and remove placeholder on blur\n        ...placeholderOptions\n        // pass 'true' as second argument to add plugin to hide placeholder when input is not focused\n      } = maskitoWithPlaceholder(this.timePlaceholder, true);\n\n      this.maskitoTimeOptions = {\n        ...timeOptions,\n        plugins: plugins.concat(timeOptions.plugins || []),\n        preprocessors: [\n          // Always put it BEFORE all other preprocessors\n          ...placeholderOptions.preprocessors,\n          ...timeOptions.preprocessors,\n        ],\n        postprocessors: [\n          ...timeOptions.postprocessors,\n          // Always put it AFTER all other postprocessors\n          ...placeholderOptions.postprocessors,\n        ],\n      } as Required<MaskitoOptions>;\n\n      this.markForCheck();\n    }\n  }\n\n  private onFormChange(dateStr: string, timeStr: string) {\n    if (this._writing) return; // Skip if call by self\n    this._writing = true;\n\n    // Clean up\n    if (dateStr === this.datePlaceholder) {\n      dateStr = null;\n    } else {\n      dateStr = nullIfNilOrBlank(dateStr);\n    }\n    if (timeStr === this.timePlaceholder) {\n      timeStr = null;\n    } else {\n      timeStr = nullIfNilOrBlank(timeStr);\n    }\n\n    // DEBUG\n    //console.debug(`[mat-date-time] onFormChange() - controls values: `, [dateStr, timeStr]);\n\n    const incompleteValue = !this.allowNoTime && isNil(timeStr) !== isNil(dateStr);\n    if (incompleteValue || this.dateControl.invalid || this.timeControl.invalid) {\n      //console.debug(`[mat-date-time] onFormChange() error -> incompleteValue: ${incompleteValue}`);\n\n      this._formControl.markAsPending({ onlySelf: true });\n      this._formControl.setErrors({\n        validDate: incompleteValue,\n        ...this._formControl.errors,\n        ...this.dateControl.errors,\n        ...this.timeControl.errors,\n      });\n      if (this.dateControl.dirty || this.timeControl.dirty) {\n        this._formControl.markAsDirty();\n      }\n\n      // Reset model value\n      this.emitChange(null);\n\n      this._writing = false;\n      return;\n    }\n\n    // Force '0' for empty month (otherwise moment will use the current month)\n    dateStr = dateStr\n      ?.replace(/[^\\d/]/g, '') // Keep only digits and slashes\n      .replace('//', '/0/')\n      // Force '0' for empty year (otherwise moment will use the current year)\n      .replace(/\\/$/, '/0');\n\n    // Parse date\n    const date: Moment = (dateStr && this.dateAdapter.parse(dateStr, this.datePattern)) || null;\n\n    // Parse time\n    const hourParts = (timeStr || '').split(':');\n    const hour = parseInt(hourParts[0] || '0');\n    const minutes = parseInt(hourParts[1] || '0');\n    const dateTime = date\n      ?.locale(this.locale) // set as time as locale time\n      .hour(hour)\n      .minute(minutes) // Set local hour\n      .seconds(0)\n      .millisecond(0) // Reset seconds/millisecond\n      .utc(); // Convert to UTC (avoid TZ offset in final string)\n\n    // Set model value\n    this.emitChange(dateTime, dateStr);\n\n    this._writing = false;\n    this.markForCheck();\n  }\n\n  private emitChange(date?: Moment, defaultValue?: string) {\n    // Convert to model value (ISO date string)\n    // IMPORTANT: If date is invalid, then keep the invalid string value\n    // to allow SharedValidators.validDate() to raise an error\n    const controlValue = date?.isValid() ? toDateISOString(date) : defaultValue || null;\n\n    if (this._formControl.value !== controlValue) {\n      // DEBUG\n      //console.debug('[mat-date-time] Emit new value: ' + controlValue);\n\n      // Update formControl value (this is need to update datePicker also, in desktop mode)\n      if (!this.mobile && date?.isValid()) {\n        this.formControl.setValue(controlValue, { emitEvent: false });\n      }\n\n      // Changes comes from inside function: use the callback\n      this._onChangeCallback(controlValue);\n\n      // Check if need to update controls\n      this._checkIfTouched();\n    }\n  }\n\n  private updateTabIndex() {\n    if (isNil(this._tabindex) || this._tabindex === -1) return; // skip\n\n    // Focus to first input\n    setTimeout(() => {\n      this._matInputs.forEach((elementRef, index) => {\n        setTabIndex(elementRef, this._tabindex + index);\n      });\n      this.markForCheck();\n    });\n  }\n\n  private markAsTouched(opts?: { onlySelf?: boolean }) {\n    this.dateControl.markAsTouched(opts);\n    this.timeControl.markAsTouched(opts);\n    this._onTouchedCallback();\n    this.markForCheck();\n  }\n\n  private markAsDirty(opts?: any) {\n    this._formControl.markAsDirty(opts);\n  }\n\n  private markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<!-- readonly -->\n@if (readonly) {\n  <mat-form-field\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    class=\"mat-form-field-disabled {{classList}}\"\n  >\n    <div matPrefix>\n      <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n    </div>\n\n    @if (floatLabel !== 'never' && !!placeholder) {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n\n    <input matInput hidden type=\"text\" readonly [formControl]=\"_formControl\" />\n    <ion-text>{{ _formControl.value | dateFormat: { pattern: displayPattern } }}</ion-text>\n\n    <div matSuffix>\n      <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n    </div>\n\n    <!-- hints -->\n    <mat-hint [class.cdk-visually-hidden]=\"_formControl.invalid\">\n      <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n    </mat-hint>\n  </mat-form-field>\n} @else {\n  <!-- writable + time -->\n  <ion-grid class=\"ion-no-padding {{ appearance }} {{classList}}\" [style]=\"style\">\n    <ion-row class=\"ion-no-padding no-wrap\">\n      <!-- Day -->\n      <ion-col class=\"day ion-no-padding\" [style.--button-count]=\"clearable ? 2 : 1\">\n        <mat-form-field\n          [floatLabel]=\"floatLabel | asFloatLabelType\"\n          [appearance]=\"appearance\"\n          [subscriptSizing]=\"'dynamic'\"\n          [class.mdc-text-field--invalid]=\"_formControl.touched && (dateControl.invalid || _formControl.invalid)\"\n          (click)=\"_openDatePickerIfMobile($event, datePicker)\"\n          (focus)=\"_openDatePickerIfMobile($event, datePicker)\"\n        >\n          <div matPrefix>\n            <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n          </div>\n\n          @if (floatLabel !== 'never' && !!placeholder) {\n            <mat-label>{{ placeholder }}</mat-label>\n          }\n\n          <!-- Day input (mobile) -->\n          @if (mobile) {\n            <input\n              #matInput\n              autocomplete=\"off\"\n              type=\"text\"\n              class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n              [formControl]=\"dateControl\"\n              [required]=\"required\"\n              [tabindex]=\"tabindex\"\n              readonly\n            />\n            <input\n              matInput\n              hidden\n              type=\"text\"\n              readonly\n              [formControl]=\"_formControl\"\n              [matDatepicker]=\"datePicker\"\n              [matDatepickerFilter]=\"datePickerFilter\"\n              (dateChange)=\"_onDatePickerChange($event)\"\n            />\n          } @else {\n            <!-- Day input (desktop) -->\n            <input\n              matInput\n              #matInput\n              autocomplete=\"off\"\n              type=\"text\"\n              class=\"mat-input-element\"\n              [maskito]=\"maskitoDateOptions\"\n              [formControl]=\"dateControl\"\n              [placeholder]=\"datePlaceholder | translate\"\n              (focus)=\"filterInputTextFocusEvent($event)\"\n              (blur)=\"filterInputTextBlurEvent($event)\"\n              (keyup.enter)=\"keyupEnter.emit($event)\"\n              (keyup.arrowDown)=\"openDatePicker($event, datePicker)\"\n              (keyup.escape)=\"_preventEvent($event)\"\n              [required]=\"required\"\n              [tabindex]=\"tabindex\"\n              [appAutofocus]=\"autofocus\"\n            />\n            <input\n              type=\"text\"\n              [formControl]=\"_formControl\"\n              hidden\n              [matDatepicker]=\"datePicker\"\n              [matDatepickerFilter]=\"datePickerFilter\"\n              (dateChange)=\"_onDatePickerChange($event)\"\n              readonly\n            />\n          }\n\n          <button\n            type=\"button\"\n            mat-icon-button\n            tabindex=\"-1\"\n            matSuffix\n            (click)=\"openDatePicker($event, datePicker)\"\n            [disabled]=\"_formControl.disabled\"\n          >\n            <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n          </button>\n          @if (clearable) {\n            <button\n              matSuffix\n              mat-icon-button\n              tabindex=\"-1\"\n              type=\"button\"\n              (click)=\"clear($event)\"\n              [hidden]=\"_formControl.disabled || !_formControl.value\"\n            >\n              <mat-icon>close</mat-icon>\n            </button>\n          }\n        </mat-form-field>\n\n        <!-- The date picker -->\n        <mat-datepicker #datePicker\n                        [touchUi]=\"mobile\" [disabled]=\"disabled\"\n                        [startAt]=\"startDate\"\n                        [xPosition]=\"!mobile ? 'end' : undefined\">\n          <!-- Date picker buttons -->\n          @if (mobile) {\n            <mat-datepicker-actions>\n              <!-- Cancel button -->\n              <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n                <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n              </ion-button>\n              <!-- Apply button -->\n              <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n                <ion-label>{{ timeControl.value || ('COMMON.TIME' | translate) }}</ion-label>\n                <ion-icon slot=\"end\" name=\"chevron-forward\"></ion-icon>\n              </ion-button>\n            </mat-datepicker-actions>\n          }\n        </mat-datepicker>\n      </ion-col>\n\n      <!-- Hour -->\n      <ion-col class=\"hour ion-no-padding\" [style.--button-count]=\"(compact ? 0 : 1)\"\n               [style.--hour-min-width]=\"hourMinWidth\"\n               [style.--hour-max-width]=\"hourMaxWidth\"\n      >\n        <mat-form-field\n          [floatLabel]=\"floatLabel | asFloatLabelType\"\n          [appearance]=\"appearance\"\n          [subscriptSizing]=\"'dynamic'\"\n          [class.mdc-text-field--invalid]=\"_formControl.touched && (timeControl.invalid || _formControl.invalid)\"\n        >\n          @if (floatLabel !== 'never' && !!placeholder) {\n            <mat-label translate>COMMON.TIME</mat-label>\n          }\n\n          <!-- Hour input (mobile) -->\n          @if (mobile) {\n            <input\n              #matInput\n              type=\"text\"\n              class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n              [formControl]=\"timeControl\"\n              [required]=\"requiredTime\"\n              (click)=\"openTimePicker($event)\"\n              readonly\n            />\n\n            <!-- Hide the final (hidden) input -->\n            <input\n              matInput\n              hidden\n              type=\"text\"\n              readonly\n              [formControl]=\"timeControl\"\n              [required]=\"required\"\n              [ngxMatTimepicker]=\"timePicker\"\n              [format]=\"24\"\n            />\n          } @else {\n            <!-- Hour input (desktop) -->\n            <input\n              matInput\n              #matInput\n              type=\"text\"\n              [formControl]=\"timeControl\"\n              [maskito]=\"maskitoTimeOptions\"\n              class=\"mat-input-element\"\n              autocomplete=\"off\"\n              [placeholder]=\"timePlaceholder | translate\"\n              [required]=\"requiredTime\"\n              (keyup.enter)=\"keyupEnter.emit($event)\"\n              (keyup.arrowDown)=\"openTimePicker($event)\"\n              (keyup.escape)=\"_preventEvent($event)\"\n              (focus)=\"filterInputTextFocusEvent($event)\"\n              (blur)=\"filterInputTextBlurEvent($event)\"\n              [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n            />\n            <!-- Hide the final (hidden) input -->\n            <input\n              hidden\n              type=\"text\"\n              readonly\n              [formControl]=\"timeControl\"\n              [required]=\"requiredTime\"\n              [ngxMatTimepicker]=\"timePicker\"\n              [format]=\"24\"\n            />\n          }\n\n          @if (!compact) {\n            <button\n              matSuffix\n              type=\"button\"\n              mat-icon-button\n              tabindex=\"-1\"\n              [disabled]=\"_formControl.disabled\"\n              (click)=\"openTimePicker($event)\"\n            >\n              <mat-icon>{{ !compact && mobile ? 'access_time' : 'keyboard_arrow_down' }}</mat-icon>\n            </button>\n          }\n\n          <div matSuffix>\n            <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n          </div>\n\n          <ngx-mat-timepicker\n            #timePicker\n            [isEsc]=\"!mobile\"\n            [defaultTime]=\"'00:00'\"\n            [cancelBtnTmpl]=\"timePickerCancelButton\"\n            [confirmBtnTmpl]=\"timePickerOkButton\"\n            [preventOverlayClick]=\"mobile\"\n            [enableKeyboardInput]=\"!mobile\"\n            [dottedMinutesInGap]=\"dottedMinutesInGap\"\n            [hoursOnly]=\"timeHoursOnly\"\n            [appendToInput]=\"!mobile\"\n            (timeSet)=\"_onTimePickerChanged($event)\"\n            color=\"accent\"\n          ></ngx-mat-timepicker>\n        </mat-form-field>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n\n  <!-- Do the same as MatFormField since angular 15 (see component source)-->\n  <div\n    class=\"mat-mdc-form-field-subscript-wrapper\"\n    [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n    [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n  >\n    @if (_formControl.touched && _formControl.errors; as errors) {\n      <!-- errors -->\n      <div class=\"mat-mdc-form-field-error-wrapper\">\n        @if (errors | mapKeys | arrayFirst; as errorKey) {\n          @switch (errorKey) {\n            @case ('required') {\n              <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n            }\n            @case ('validDate') {\n              <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n            }\n            @case ('dateIsAfter') {\n              <mat-error>\n                {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: _formControl.errors.dateIsAfter }}\n              </mat-error>\n            }\n            @case ('dateIsBefore') {\n              <mat-error>\n                {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: _formControl.errors.dateIsBefore }}\n              </mat-error>\n            }\n            @case ('dateRange') {\n              <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n            }\n            @case ('dateMaxDuration') {\n              <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n            }\n            @case ('dateMinDuration') {\n              <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n            }\n            @case ('msg') {\n              <mat-error>\n                {{\n                  _formControl.errors.msg?.key || _formControl.errors.msg | translate: _formControl.errors.msg?.params\n                }}\n              </mat-error>\n            }\n            @default {\n              <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n            }\n          }\n        } @else {\n          <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n        }\n      </div>\n    } @else {\n      <!-- hints -->\n      <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n    }\n  </div>\n}\n\n<!-- cancel button -->\n<ng-template #timePickerCancelButton>\n  <ion-button fill=\"clear\" color=\"dark\">\n    <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n  </ion-button>\n</ng-template>\n\n<!-- confirm button -->\n<ng-template #timePickerOkButton>\n  <ion-button fill=\"solid\" color=\"tertiary\">\n    <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n  </ion-button>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n  <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n  <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n  <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n  <div class=\"mat-mdc-form-field-hint-wrapper\">\n    <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n    <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n    <ng-content select=\"mat-hint[align='end']\"></ng-content>\n  </div>\n</ng-template>\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  forwardRef,\n  Inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Provider,\n  ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormBuilder, UntypedFormControl, Validators } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isMoment, Moment } from 'moment';\nimport { KEYBOARD_HIDE_DELAY_MS } from '../../constants';\nimport { SharedValidators } from '../../validator/validators';\nimport { isBlankString, isNil, isNotNil, isNotNilBoolean, sleep } from '../../functions';\nimport { InputElement, setTabIndex } from '../../inputs';\nimport { Subscription } from 'rxjs';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldAppearance, MatFormFieldDefaultOptions, SubscriptSizing } from '@angular/material/form-field';\nimport { DateFilterFn, MatDatepicker, MatDatepickerInputEvent } from '@angular/material/datepicker';\nimport { isFocusableElement } from '../../focusable';\nimport { isMobile } from '../../platforms';\nimport { Keyboard } from '@capacitor/keyboard';\nimport { filter, skip } from 'rxjs/operators';\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\nimport { DateUtils, fromDateISOString, toDateISOString } from '../../dates';\nimport { MaskitoOptions } from '@maskito/core';\nimport { MaskitoDateMode, maskitoDateOptionsGenerator, maskitoWithPlaceholder } from '@maskito/kit';\nimport { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';\nimport { AppFloatLabelType } from '../../types';\n\nconst DEFAULT_VALUE_ACCESSOR: Provider = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => MatDateShort),\n  multi: true,\n};\n\nconst noop = () => {};\n\nconst I18N_KEYS = ['COMMON.DATE_YEAR_PATTERN', 'COMMON.DATE_YEAR_PLACEHOLDER'];\n\n@Component({\n  selector: 'mat-date-short-field',\n  templateUrl: './material.dateshort.html',\n  styleUrls: ['./material.dateshort.scss'],\n  providers: [DEFAULT_VALUE_ACCESSOR],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatDateShort implements OnInit, ControlValueAccessor, InputElement, AfterViewInit, OnDestroy {\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n  private readonly _subscription = new Subscription();\n  private _writing = true;\n  private _disabling = false;\n  private _tabindex: number;\n  private _readonly = false;\n  private _appearance: MatFormFieldAppearance | null = null;\n  private _subscriptSizing: SubscriptSizing | null = null;\n  private readonly _defaultAppearance: MatFormFieldAppearance;\n  private readonly _defaultSubscriptSizing: SubscriptSizing;\n\n  protected textControl: UntypedFormControl;\n  protected yearPattern: string;\n  protected yearPlaceholder: string;\n  protected locale: string;\n  protected maskitoOptions: MaskitoOptions;\n\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() placeholder: string;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input({ transform: booleanAttribute }) mobile: boolean;\n  @Input({ transform: booleanAttribute }) compact = false;\n  @Input({ transform: booleanAttribute }) autofocus = false;\n  @Input({ transform: booleanAttribute }) clearable = false;\n  @Input({ transform: booleanAttribute }) required: boolean;\n  @Input() startDate: Moment | null = null;\n  @Input() datePickerFilter: DateFilterFn<Moment>;\n\n  @Input()\n  set appearance(value: MatFormFieldAppearance) {\n    this._appearance = value;\n  }\n  get appearance(): MatFormFieldAppearance {\n    return this._appearance || this._defaultAppearance;\n  }\n\n  @Input()\n  set subscriptSizing(value: SubscriptSizing) {\n    this._subscriptSizing = value;\n  }\n  get subscriptSizing(): SubscriptSizing {\n    return this._subscriptSizing || this._defaultSubscriptSizing;\n  }\n\n  @Input() set readonly(value: boolean) {\n    this._readonly = value;\n    this.markForCheck();\n  }\n\n  get readonly(): boolean {\n    return this._readonly;\n  }\n\n  @Input() set tabindex(value: number) {\n    if (this._tabindex !== value) {\n      this._tabindex = value;\n      if (!this._writing) this.updateTabIndex();\n    }\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  get value(): any {\n    return this.formControl.value;\n  }\n\n  get disabled(): boolean {\n    return this.formControl.disabled;\n  }\n\n  @ViewChild('datePicker') datePicker!: MatDatepicker<Moment>;\n  @ViewChild('matInput', { static: false }) _matInput: ElementRef;\n\n  constructor(\n    private dateAdapter: MomentDateAdapter,\n    private translate: TranslateService,\n    private formBuilder: UntypedFormBuilder,\n    private cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective,\n    @Inject(MAT_FORM_FIELD_DEFAULT_OPTIONS) defaultOptions?: MatFormFieldDefaultOptions\n  ) {\n    this.locale = (translate.currentLang || translate.defaultLang).substring(0, 2);\n    this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;\n    this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;\n  }\n\n  ngOnInit() {\n    this.formControl =\n      this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-date-short-field>.\");\n\n    this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);\n    this.required = isNotNilBoolean(this.required)\n      ? this.required\n      : this.formControl.hasValidator(Validators.required) || isBlankString(this.required);\n\n    // Add 'validDate' validator (when existing validator are null or required, to be sure to keep it)\n    if (!this.formControl.validator || this.formControl.validator === Validators.required) {\n      this.formControl.setValidators(\n        this.required ? [Validators.required, SharedValidators.validDateAllowNoTime] : SharedValidators.validDateAllowNoTime\n      );\n    } else {\n      this.formControl.setValidators(\n        this.required\n          ? [this.formControl.validator, Validators.required, SharedValidators.validDateAllowNoTime]\n          : [this.formControl.validator, SharedValidators.validDateAllowNoTime]\n      );\n    }\n\n    // Create the text control\n    this.textControl = this.formBuilder.control(\n      null,\n      // Important: should copy errors from the model formControl\n      () => this.formControl.errors\n    );\n\n    // Get patterns to display date\n    this.updateTranslations(this.translate.instant(I18N_KEYS));\n    this._subscription.add(\n      this.translate\n        .get(I18N_KEYS)\n        .pipe(skip(1))\n        .subscribe((translations) => this.updateTranslations(translations))\n    );\n\n    this._subscription.add(this.textControl.valueChanges.subscribe((value) => this.onFormChange(value)));\n\n    // Listen status changes (when done outside the component  - e.g. when setErrors() is calling on the formControl)\n    this._subscription.add(\n      this.formControl.statusChanges\n        .pipe(\n          filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip\n        )\n        .subscribe(() => {\n          this.textControl.updateValueAndValidity({ emitEvent: false });\n          if (this.formControl.touched && !this.textControl.touched) {\n            this.textControl.markAsTouched();\n          }\n          this.markForCheck();\n        })\n    );\n\n    this._writing = false;\n  }\n\n  ngAfterViewInit() {\n    this.updateTabIndex();\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n\n  writeValue(value: any): void {\n    if (this._writing) return; // Skip\n    this._writing = true;\n\n    // DEBUG\n    //console.debug(\"[mat-date] writeValue() with:\", value);\n\n    // Convert into date\n    // Important: clone, because startOf will update the existing date\n    const date = isMoment(value) ? value.clone() : fromDateISOString(value);\n\n    if (!date || !date.isValid()) {\n      this.textControl.patchValue(null, { emitEvent: false });\n      if (this.formControl.value) {\n        this.formControl.patchValue(null, { emitEvent: false });\n        this._onChangeCallback(null);\n      }\n    } else {\n      // Reset day\n      const year = date.startOf('year');\n      const yearStr = this.dateAdapter.format(year, this.yearPattern);\n\n      if (this.textControl.value !== yearStr) {\n        // Update text control\n        this.textControl.patchValue(yearStr, { emitEvent: false });\n      }\n    }\n\n    this._writing = false;\n    this.markForCheck();\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    if (this._disabling) return;\n\n    this._disabling = true;\n    if (isDisabled) {\n      this.textControl.disable({ emitEvent: false });\n    } else {\n      this.textControl.enable({ emitEvent: false });\n    }\n    this._disabling = false;\n\n    this.markForCheck();\n  }\n\n  openDatePicker() {\n    if (!this.datePicker) return;\n\n    if (!this.datePicker.opened) {\n      // DEBUG\n      //console.debug('[mat-date-short] Opening date picker...');\n\n      this.datePicker.open();\n    }\n  }\n\n  focus() {\n    if (!this._matInput) return;\n\n    setTimeout(() => {\n      if (isFocusableElement(this._matInput.nativeElement)) {\n        this._matInput.nativeElement.focus();\n      }\n    });\n  }\n\n  clear(event?: Event) {\n    this._preventEvent(event);\n\n    this.textControl.patchValue(null, { emitEvent: false });\n    this.formControl.setValue(null, { emitEvent: false });\n    this._onChangeCallback(null);\n    this.markAsTouched();\n    this.markAsDirty();\n  }\n\n  /* -- protected methods -- */\n\n  protected _onDatePickerChange(event: MatDatepickerInputEvent<Moment>): void {\n    // Make sure event is valid\n    if (!event || (event.value !== null && !isMoment(event.value))) {\n      console.warn('Invalid MatDatepicker event. Skipping', event);\n      return; // Skip\n    }\n\n    let value = event.value;\n\n    // No value, but mobile mode: use the current year\n    if (!value && this.mobile) {\n      value = DateUtils.moment().locale(this.locale).startOf('year').utc(true);\n      this.formControl.setValue(toDateISOString(value), {\n        emitEvent: false, // Will call writeValue()\n      });\n      return;\n    }\n\n    const date = value?.clone().locale(this.locale).startOf('year').utc(true);\n    const dateStr = (date && this.dateAdapter.format(date, this.yearPattern)) || null;\n\n    if (this.textControl.value !== dateStr) {\n      // DEBUG\n      //console.debug('[mat-date-time] Emit new value: ' + dateStr);\n\n      this.textControl.setValue(dateStr, {\n        emitEvent: true, // Will call onFormChange\n      });\n    }\n  }\n\n  protected _openDatePickerIfMobile(event: Event) {\n    if (!this.mobile || event?.defaultPrevented || this.datePicker?.opened || this.disabled) return;\n\n    //console.debug('[mat-date-short] Preparing to open date picker... ');\n\n    this._preventEvent(event);\n\n    // Open the picker\n    this.openDatePicker();\n  }\n\n  protected _checkIfTouched() {\n    if (this.textControl.touched) {\n      this._onTouchedCallback();\n\n      this.markForCheck();\n    }\n  }\n\n  // select only year\n  protected _closeDatePicker(value: Moment) {\n    this.datePicker?.close();\n\n    // Get the model value\n    const isoDate = toDateISOString(value);\n\n    if (this.formControl.value !== isoDate) {\n      this.formControl.setValue(isoDate);\n    }\n  }\n\n  protected _preventEvent(event: Event) {\n    if (!event) return;\n    event.preventDefault();\n    if (event.stopPropagation) event.stopPropagation();\n    if (event.stopImmediatePropagation) event.stopImmediatePropagation();\n  }\n\n  /* -- private methods -- */\n\n  private updateTranslations(translations: { [key: string]: string }) {\n    const datePattern = translations['COMMON.DATE_YEAR_PATTERN'] !== 'COMMON.DATE_YEAR_PATTERN' ? translations['COMMON.DATE_YEAR_PATTERN'] : 'YYYY';\n    this.updatePattern(datePattern);\n\n    const yearPlaceholder =\n      translations['COMMON.DATE_YEAR_PLACEHOLDER'] !== 'COMMON.DATE_YEAR_PLACEHOLDER'\n        ? translations['COMMON.DATE_YEAR_PLACEHOLDER']\n        : datePattern.toLowerCase();\n    this.updateMaskOptions(yearPlaceholder);\n  }\n\n  private updatePattern(pattern: string) {\n    if (this.yearPattern !== pattern) {\n      this.yearPattern = pattern;\n      this.markForCheck();\n    }\n  }\n\n  private updateMaskOptions(yearPlaceholder: string) {\n    if (this.yearPlaceholder !== yearPlaceholder) {\n      this.yearPlaceholder = yearPlaceholder;\n\n      const dateOptions = maskitoDateOptionsGenerator({\n        mode: this.yearPattern.toLowerCase() as MaskitoDateMode,\n      });\n\n      const {\n        plugins, // plugins keeps caret inside actual value and remove placeholder on blur\n        ...placeholderOptions\n        // pass 'true' as second argument to add plugin to hide placeholder when input is not focused\n      } = maskitoWithPlaceholder(this.yearPlaceholder, true);\n\n      this.maskitoOptions = {\n        ...dateOptions,\n        plugins: plugins.concat(dateOptions.plugins || []),\n        preprocessors: [\n          // Always put it BEFORE all other preprocessors\n          ...placeholderOptions.preprocessors,\n          ...dateOptions.preprocessors,\n        ],\n        postprocessors: [\n          ...dateOptions.postprocessors,\n          // Always put it AFTER all other postprocessors\n          ...placeholderOptions.postprocessors,\n        ],\n      } as Required<MaskitoOptions>;\n\n      this.markForCheck();\n    }\n  }\n\n  private onFormChange(value: string): void {\n    if (this._writing) return; // Skip if call by self\n    this._writing = true;\n\n    if (value === this.yearPlaceholder) {\n      value = undefined;\n    }\n\n    // Parse year string\n    let date = (value && this.dateAdapter.parse(value, this.yearPattern)) || null;\n\n    // Reset time\n    date = date && date.locale(this.locale).startOf('year');\n\n    // Get the model value\n    const dateStr = date && date.isValid() ? toDateISOString(date) : date;\n    // Set model value\n    if (this.formControl.value !== dateStr) {\n      // DEBUG\n      //console.debug('[mat-date-time] Emit new value: ' + dateStr);\n\n      if (date?.isValid()) {\n        // Update formControl value (will update datePicker also)\n        this.formControl.setValue(dateStr, { emitEvent: false });\n      }\n\n      // Changes comes from inside function: use the callback\n      this._onChangeCallback(dateStr);\n\n      // Check if need to update controls\n      this._checkIfTouched();\n\n      // Force textControl validity\n      this.textControl.updateValueAndValidity();\n    }\n\n    this._writing = false;\n    this.markForCheck();\n  }\n\n  private async waitKeyboardHide(waitKeyboardDelay: boolean) {\n    try {\n      // Force keyboard to be hide\n      await Keyboard.hide();\n\n      // Wait an additional delay, to be sure the keyboard has been totally hidden\n      await sleep(KEYBOARD_HIDE_DELAY_MS);\n    } catch (e) {\n      console.error(e);\n    }\n  }\n\n  private updateTabIndex() {\n    if (isNil(this._tabindex) || this._tabindex === -1) return; // skip\n\n    // Focus to input\n    setTimeout(() => {\n      setTabIndex(this._matInput, this._tabindex);\n      this.markForCheck();\n    });\n  }\n\n  private markAsTouched(opts?: { onlySelf?: boolean }) {\n    this.textControl.markAsTouched(opts);\n    this._onTouchedCallback();\n    this.markForCheck();\n  }\n\n  private markAsDirty(opts?: any) {\n    this.formControl.markAsDirty(opts);\n  }\n\n  private markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<!-- readonly -->\n@if (readonly) {\n  <mat-form-field\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    class=\"mat-form-field-disabled\"\n  >\n    <div matPrefix>\n      <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n    </div>\n    @if (floatLabel !== 'never' && !!placeholder) {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n    <ion-text>{{ formControl.value | dateFormat: { pattern: yearPattern } }}</ion-text>\n    <div matSuffix>\n      <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n    </div>\n\n    <!-- hints -->\n    <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n      <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n    </mat-hint>\n  </mat-form-field>\n} @else {\n  <!-- writable -->\n  <mat-form-field\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    (focus)=\"_openDatePickerIfMobile($event)\"\n    (click)=\"_openDatePickerIfMobile($event)\"\n  >\n    @if (floatLabel !== 'never' && !!placeholder) {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    <div matPrefix>\n      <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n    </div>\n    <!-- Desktop -->\n    @if (!mobile) {\n      <input\n        matInput\n        #matInput\n        autocomplete=\"off\"\n        type=\"text\"\n        [maskito]=\"maskitoOptions\"\n        [formControl]=\"textControl\"\n        (blur)=\"_checkIfTouched()\"\n        (keyup.arrowDown)=\"openDatePicker()\"\n        (keyup.escape)=\"_preventEvent($event)\"\n        [required]=\"required\"\n        [tabindex]=\"tabindex\"\n        [appAutofocus]=\"autofocus\"\n      />\n      <input\n        type=\"text\"\n        [formControl]=\"formControl\"\n        hidden\n        [matDatepicker]=\"datePicker\"\n        [matDatepickerFilter]=\"datePickerFilter\"\n        (dateChange)=\"_onDatePickerChange($event)\"\n        readonly\n      />\n    } @else {\n      <!-- Mobile -->\n      <input\n        #matInput\n        autocomplete=\"off\"\n        type=\"text\"\n        class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n        [formControl]=\"textControl\"\n        [required]=\"required\"\n        [tabindex]=\"tabindex\"\n        readonly\n      />\n      <input\n        matInput\n        type=\"text\"\n        [formControl]=\"formControl\"\n        hidden\n        [matDatepicker]=\"datePicker\"\n        [matDatepickerFilter]=\"datePickerFilter\"\n        (dateChange)=\"_onDatePickerChange($event)\"\n        readonly\n      />\n    }\n\n    <div matSuffix>\n      <button type=\"button\" mat-icon-button tabindex=\"-1\" (click)=\"openDatePicker()\" [disabled]=\"disabled\">\n        <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n      </button>\n      @if (clearable) {\n        <button\n          mat-icon-button\n          tabindex=\"-1\"\n          type=\"button\"\n          (click)=\"clear($event)\"\n          [hidden]=\"formControl.disabled || !formControl.value\"\n        >\n          <mat-icon>close</mat-icon>\n        </button>\n      }\n      <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n    </div>\n\n    <!-- errors -->\n    <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n      @switch (errorKey) {\n        @case ('required') {\n          <span translate>ERROR.FIELD_REQUIRED</span>\n        }\n        @case ('validDate') {\n          <span translate>ERROR.FIELD_NOT_VALID_DATE</span>\n        }\n        @case ('dateIsAfter') {\n          <span>\n            {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}\n          </span>\n        }\n        @case ('dateIsBefore') {\n          <span>\n            {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}\n          </span>\n        }\n        @case ('dateRange') {\n          <span translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n        }\n        @case ('dateMaxDuration') {\n          <span translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n        }\n        @case ('dateMinDuration') {\n          <span translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n        }\n        @case ('msg') {\n          <span>\n            {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n          </span>\n        }\n      }\n    </mat-error>\n    <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n\n    <!-- hints -->\n    @if (!formControl.invalid) {\n      <mat-hint>\n        <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n      </mat-hint>\n    }\n  </mat-form-field>\n\n  <mat-datepicker\n    #datePicker\n    startView=\"multi-year\"\n    [touchUi]=\"mobile\"\n    [disabled]=\"disabled\"\n    (yearSelected)=\"_closeDatePicker($event)\"\n    panelClass=\"mat-date-short-panel\"\n    [startAt]=\"startDate\"\n  >\n    <!-- Date picker buttons -->\n    @if (mobile) {\n      <mat-datepicker-actions>\n        <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n        <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n          <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n        </ion-button>\n      </mat-datepicker-actions>\n    }\n  </mat-datepicker>\n}\n\n<ng-template #matPrefixTemplate>\n  <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n  <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n  <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n  <div class=\"mat-mdc-form-field-hint-wrapper\">\n    <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n    <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n    <ng-content select=\"mat-hint[align='end']\"></ng-content>\n  </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MatCommonModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { SharedPipesModule } from '../../pipes/pipes.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatDate } from './material.date';\nimport { MatDateTime } from './material.datetime';\nimport { NgxMatTimepickerModule } from 'ngx-mat-timepicker';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDateShort } from './material.dateshort';\nimport { SharedDirectivesModule } from '../../directives/directives.module';\nimport { MatMomentDateModule } from '@angular/material-moment-adapter';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MatAutocompleteTrigger } from '@angular/material/autocomplete';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ReactiveFormsModule,\n    SharedPipesModule,\n    MatCommonModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatIconModule,\n    MatButtonModule,\n    MatDatepickerModule,\n    MatMomentDateModule,\n    MaskitoDirective,\n    TranslateModule.forChild(),\n    SharedDirectivesModule,\n    NgxMatTimepickerModule,\n    MatAutocompleteTrigger,\n  ],\n  exports: [MatIconModule, MatDate, MatDateTime, MatDateShort],\n  declarations: [MatDate, MatDateTime, MatDateShort],\n})\nexport class SharedMatDateTimeModule {}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  Provider,\n  ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormControl } from '@angular/forms';\nimport { BehaviorSubject, isObservable, noop, Observable, Subscription } from 'rxjs';\nimport { isNil, isNotNil, joinPropertiesPath } from '../../functions';\nimport { InputElement } from '../../inputs';\nimport { firstTruePromise } from '../../observables';\nimport { isMobile } from '../../platforms';\nimport { Swiper } from 'swiper/types';\nimport { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';\nimport { MatButton } from '@angular/material/button';\nimport { AppFloatLabelType, DisplayFn, EqualsFn } from '../../types';\n\nconst DEFAULT_VALUE_ACCESSOR: Provider = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => MatSwipeField),\n  multi: true,\n};\n\n@Component({\n  selector: 'mat-swipe-field',\n  styleUrls: ['./material.swipe.scss'],\n  templateUrl: './material.swipe.html',\n  providers: [DEFAULT_VALUE_ACCESSOR],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatSwipeField implements OnInit, InputElement, OnDestroy, ControlValueAccessor {\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n  private _value: any;\n  private _subscription = new Subscription();\n  private _itemsSubscription: Subscription;\n  private _writing = false;\n  private _tabindex: number;\n  private _swiper: Swiper;\n  protected previousDisabled: boolean;\n  protected nextDisabled: boolean;\n  protected showSlides = false;\n  protected $items = new BehaviorSubject<any[]>(undefined);\n  protected $loaded = new BehaviorSubject<boolean>(false);\n\n  @Input() logPrefix = '[mat-swipe-field]';\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() floatLabel: AppFloatLabelType;\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() subscriptSizing: SubscriptSizing;\n  @Input() placeholder: string;\n  @Input() debug = false;\n  @Input({ transform: booleanAttribute }) required: boolean;\n  @Input() mobile: boolean;\n  @Input() clearable = false;\n  @Input() equals: EqualsFn | null;\n  @Input() displayWith: DisplayFn | null;\n  @Input() displayAttributes: string[];\n  @Input() appAutofocus: boolean;\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  @Input('class') classList: string;\n\n  @Input() set tabindex(value: number) {\n    if (this._tabindex !== value) {\n      this._tabindex = value;\n      setTimeout(() => this.updateTabIndex());\n    }\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  @Input() set items(value: Observable<any[]> | any[]) {\n    // Remove previous subscription on items, (if exits)\n    if (this._itemsSubscription) {\n      console.warn(`${this.logPrefix} Items received twice !`);\n      this._subscription.remove(this._itemsSubscription);\n      this._itemsSubscription.unsubscribe();\n    }\n\n    if (isObservable(value)) {\n      this._itemsSubscription = value.subscribe((v) => this.loadItems(v));\n      this._subscription.add(this._itemsSubscription);\n    } else {\n      if (value !== this.$items.getValue()) {\n        this.loadItems(value as any[]);\n      }\n    }\n  }\n\n  get items(): Observable<any[]> | any[] {\n    return this.$items.getValue();\n  }\n\n  get itemCount(): number {\n    return (this.$items.getValue() || []).length;\n  }\n\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('click') onClick = new EventEmitter<MouseEvent>();\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('blur') blurred = new EventEmitter<FocusEvent>();\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('focus') focused = new EventEmitter<FocusEvent>();\n\n  @ViewChild('fakeInput') fakeInput: ElementRef;\n  @ViewChild('swiper', { static: true }) swiperRef: ElementRef | undefined;\n  @ViewChild('prevButton') prevButton: MatButton;\n  @ViewChild('nextButton') nextButton: MatButton;\n\n  get value(): any {\n    return this._value;\n  }\n\n  get disabled(): any {\n    return this.formControl.disabled;\n  }\n\n  get enabled(): any {\n    return this.formControl.enabled;\n  }\n\n  protected getSwiper(): Swiper {\n    this._swiper = this.swiperRef?.nativeElement?.swiper || this._swiper;\n    return this._swiper;\n  }\n\n  constructor(\n    protected cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective\n  ) {}\n\n  ngOnInit() {\n    this._swiper = this.swiperRef.nativeElement.swiper as Swiper;\n    this.formControl =\n      this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-swipe-field>.\");\n\n    // Default values\n    this.displayAttributes = this.displayAttributes || ['label', 'name'];\n    this.displayWith = this.displayWith || ((obj) => obj && joinPropertiesPath(obj, this.displayAttributes));\n    this.equals = this.equals || ((o1: any, o2: any) => o1 && o2 && o1.id === o2.id);\n    this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);\n  }\n\n  ngOnDestroy(): void {\n    this._subscription.unsubscribe();\n    this._value = undefined;\n    this.$items.complete();\n  }\n\n  _onFocusFakeInput(event: FocusEvent) {\n    event.preventDefault();\n\n    // Hide the fake input\n    if (this.fakeInput) {\n      this.fakeInput.nativeElement.classList.add('hidden');\n      this.fakeInput.nativeElement.tabIndex = -1;\n    }\n\n    // Focus on first button\n    this.focus();\n  }\n\n  focus() {\n    // show slides component\n    this.showSlides = true;\n\n    setTimeout(() => {\n      if (this.prevButton) {\n        this.prevButton.focus();\n      }\n      this.updateTabIndex();\n    });\n\n    if (isNil(this._value)) {\n      // Slide to first and affect value\n      this.slideTo(0);\n      this.slideChanged();\n    }\n\n    this.markForCheck();\n  }\n\n  /**\n   * This is a special case, because, this component has a temporary component displayed before the first focus event\n   */\n  private updateTabIndex() {\n    if (isNil(this._tabindex) || this._tabindex === -1) return;\n\n    if (this.fakeInput) {\n      if (this.showSlides) {\n        this.fakeInput.nativeElement.classList.add('hidden');\n        this.fakeInput.nativeElement.tabIndex = -1;\n      } else {\n        this.fakeInput.nativeElement.classList.remove('hidden');\n        this.fakeInput.nativeElement.tabIndex = this._tabindex;\n      }\n    }\n    if (this.prevButton && this.nextButton) {\n      this.prevButton._elementRef.nativeElement.tabIndex = this.showSlides ? this._tabindex : -1;\n      this.nextButton._elementRef.nativeElement.tabIndex = this.showSlides ? this._tabindex + 1 : -1;\n    }\n    this.markForCheck();\n  }\n\n  writeValue(value: any): void {\n    if (this._writing) return;\n\n    this._writing = true;\n    if (!this.equals(value, this._value)) {\n      this._value = value;\n      this.showSlides = isNotNil(this._value);\n      this.updateSlides();\n      setTimeout(() => this.updateTabIndex());\n    }\n    this._writing = false;\n\n    this.markForCheck();\n  }\n\n  clearValue(event: Event) {\n    event.stopPropagation();\n    this._writing = true;\n    if (this.debug) console.debug(`${this.logPrefix} clear value`);\n    this._value = undefined;\n    this.formControl.patchValue(null, { emitEvent: false });\n    this.showSlides = false;\n    setTimeout(() => {\n      this.updateTabIndex();\n      this.slideTo(0);\n      setTimeout(() => {\n        this._writing = false;\n      }, 100);\n    });\n    this._onChangeCallback(null);\n    this.markForCheck();\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.lockSwipes(isDisabled);\n    this.updateButtons();\n    this.cd.markForCheck();\n  }\n\n  previous() {\n    const swiper = this.getSwiper();\n    swiper.slidePrev();\n    this.updateButtons();\n  }\n\n  next() {\n    const swiper = this.getSwiper();\n    swiper.slideNext();\n    this.updateButtons();\n  }\n\n  reachStart(reached: boolean) {\n    this.previousDisabled = reached;\n  }\n\n  reachEnd(reached: boolean) {\n    this.nextDisabled = reached;\n  }\n\n  swiperLoaded() {\n    this._swiper = this.swiperRef.nativeElement.swiper;\n    this.$loaded.next(true);\n  }\n\n  slideChanged() {\n    const activeIndex = this._swiper.activeIndex;\n    if (this._writing || isNil(activeIndex)) return;\n\n    this._writing = true;\n    const value = (this.$items.getValue() || [])[activeIndex] || undefined;\n    if (this.debug) console.debug(`${this.logPrefix} slide changed ActiveIndex:${activeIndex}, new value:${value}`);\n    this.formControl.patchValue(value, { emitEvent: false });\n    this._writing = false;\n    this.checkIfTouched();\n    this._onChangeCallback(value);\n  }\n\n  /* -- protected method -- */\n\n  private lockSwipes(lock: boolean) {\n    const swiper = this.getSwiper();\n    swiper.allowSlideNext = !lock;\n    swiper.allowSlidePrev = !lock;\n    swiper.allowTouchMove = !lock;\n    swiper.update();\n  }\n\n  private loadItems(items: any[]) {\n    this.$loaded.next(false);\n    this.$items.next(items);\n    this.ready().then(() => this._swiper.update());\n  }\n\n  private checkIfTouched() {\n    if (this.formControl.touched) {\n      this.markForCheck();\n      this._onTouchedCallback();\n    }\n  }\n\n  private markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  private updateSlides() {\n    if (this.showSlides) {\n      const itemIndex = (this.$items.getValue() || []).findIndex((value) => this.equals(value, this._value));\n      if (itemIndex >= 0) {\n        this.slideTo(itemIndex);\n      } else {\n        console.warn(`${this.logPrefix} Item not found`, this._value);\n        this.slideTo(0);\n      }\n    }\n  }\n\n  private slideTo(index: number) {\n    const swiper = this.getSwiper();\n    swiper.slideTo(index, 0, false);\n    swiper.update();\n    this.updateButtons();\n  }\n\n  private updateButtons() {\n    const swiper = this.getSwiper();\n    const activeIndex = swiper.activeIndex;\n    if (this.debug) console.debug(`${this.logPrefix} update buttons ActiveIndex:${activeIndex}`);\n    this.previousDisabled = activeIndex === 0 || this.disabled;\n    this.nextDisabled = activeIndex === this.itemCount - 1 || this.disabled;\n    this.markForCheck();\n  }\n\n  async ready(): Promise<void> {\n    // Wait loaded\n    if (this.$loaded.getValue() === false) {\n      if (this.debug) console.debug(`${this.logPrefix} waiting slides to be ready...`);\n      await firstTruePromise(this.$loaded);\n    }\n  }\n}\n","<mat-form-field\n  [floatLabel]=\"showSlides && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n  [appearance]=\"appearance\"\n  [subscriptSizing]=\"subscriptSizing\"\n  [class]=\"classList\"\n  [class.mat-form-field-disabled]=\"disabled\"\n>\n  @if (floatLabel !== 'never' && !!placeholder) {\n    <mat-label>{{ placeholder }}</mat-label>\n  }\n  <input\n    matInput\n    #fakeInput\n    type=\"text\"\n    [formControl]=\"formControl\"\n    [readonly]=\"true\"\n    (focus)=\"_onFocusFakeInput($event)\"\n    [required]=\"required\"\n    [class.cdk-visually-hidden]=\"showSlides\"\n    [tabindex]=\"tabindex\"\n  />\n\n  <div class=\"slides-container\" [class.hidden]=\"!showSlides\">\n    <swiper-container\n      #swiper\n      [speed]=\"100\"\n      [slidesPerView]=\"1\"\n      (init)=\"swiperLoaded()\"\n      (reachbeginning)=\"reachStart(true)\"\n      (reachend)=\"reachEnd(true)\"\n      (slidenexttransitionend)=\"reachStart(false)\"\n      (slideprevtransitionend)=\"reachEnd(false)\"\n      (slidechange)=\"slideChanged()\"\n    >\n      @for (item of $items | async; track item) {\n        <swiper-slide>\n          <ion-label>{{ displayWith(item) }}</ion-label>\n        </swiper-slide>\n      }\n    </swiper-container>\n  </div>\n\n  <button\n    #prevButton\n    mat-icon-button\n    type=\"button\"\n    class=\"button-prev\"\n    [hidden]=\"!showSlides\"\n    [disabled]=\"previousDisabled\"\n    (click)=\"previous()\"\n  >\n    <mat-icon>chevron_left</mat-icon>\n  </button>\n  <button\n    #nextButton\n    mat-icon-button\n    type=\"button\"\n    class=\"button-next\"\n    [hidden]=\"!showSlides\"\n    [disabled]=\"nextDisabled\"\n    (click)=\"next()\"\n  >\n    <mat-icon>chevron_right</mat-icon>\n  </button>\n\n  @if (clearable) {\n    <button\n      matSuffix\n      mat-icon-button\n      tabindex=\"-1\"\n      type=\"button\"\n      (click)=\"clearValue($event)\"\n      [hidden]=\"disabled || !formControl.value\"\n    >\n      <mat-icon>close</mat-icon>\n    </button>\n  }\n\n  @if (formControl.hasError('required')) {\n    <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n  }\n  @if (formControl.hasError('entity')) {\n    <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n  }\n</mat-form-field>\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MatSwipeField } from './material.swipe';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { SharedPipesModule } from '../../pipes/pipes.module';\n\n@NgModule({\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  imports: [\n    CommonModule,\n    IonicModule,\n    MatButtonModule,\n    MatIconModule,\n    TranslateModule.forChild(),\n    MatFormFieldModule,\n    ReactiveFormsModule,\n    MatInputModule,\n    SharedPipesModule,\n  ],\n  exports: [MatSwipeField],\n  declarations: [MatSwipeField],\n})\nexport class SharedMatSwipeModule {}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  inject,\n  Inject,\n  Input,\n  numberAttribute,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormControl, Validators } from '@angular/forms';\nimport { BehaviorSubject, isObservable, merge, Observable, Subject, Subscription, timer } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, filter, map, mergeMap, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport { focusInput, InputElement, selectInputContentFromEvent, selectInputRange } from '../../inputs';\nimport { FetchMoreFn, LoadResult, SuggestFn } from '../../services/entity-service.class';\nimport {\n  changeCaseToUnderscore,\n  isEmptyArray,\n  isNil,\n  isNilOrBlank,\n  isNotNil,\n  isNotNilOrBlank,\n  isNotNilString,\n  toBoolean,\n  toNumber,\n} from '../../functions';\nimport { firstNotNilPromise } from '../../observables';\nimport { fromScrollEndEvent } from '../../events';\nimport { ErrorStateMatcher, ThemePalette } from '@angular/material/core';\nimport { suggestFromArray } from '../../services';\nimport { MatAutocompleteFieldConfig } from '../autocomplete/material.autocomplete.config';\nimport { MatAutocompleteFieldUtils } from '../autocomplete/material.autocomplete.utils';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldAppearance, MatFormFieldDefaultOptions, SubscriptSizing } from '@angular/material/form-field';\nimport { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';\nimport { isMobile } from '../../platforms';\nimport { DEFAULT_JOIN_PROPERTIES_SEPARATOR, APP_SHOW_TOOLTIP } from '../../constants';\nimport { ENTER } from '@angular/cdk/keycodes';\nimport { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';\nimport { AppFloatLabelType, DisplayFn, EqualsFn } from '../../types';\n\nconst noop = () => {};\n\n@Component({\n  // eslint-disable-next-line @angular-eslint/component-selector\n  selector: 'mat-chips-field',\n  styleUrls: ['./material.chips.scss'],\n  templateUrl: './material.chips.html',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => MatChipsField),\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatChipsField implements OnInit, OnDestroy, InputElement, ControlValueAccessor {\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n\n  private _onFetchMoreCallback: FetchMoreFn<LoadResult<any>>;\n  private _implicitValue: any;\n  private _subscription = new Subscription();\n  private _itemsSubscription: Subscription;\n  private _openedSubscription: Subscription;\n  private _$filter = new BehaviorSubject<any>(undefined);\n  private _itemCount: number;\n  private _suggestExecutionId: number = 0; // Identifier of the suggest job\n  private _reload$ = new Subject<any>();\n  private _appearance: MatFormFieldAppearance | null = null;\n  private _subscriptSizing: SubscriptSizing | null = null;\n  private readonly _defaultAppearance: MatFormFieldAppearance;\n  private readonly _defaultSubscriptSizing: SubscriptSizing;\n\n  protected _tabindex: number;\n  protected _$inputItems = new BehaviorSubject<any[]>(undefined);\n  protected _$filteredItems = new BehaviorSubject<any[]>(undefined);\n  protected _inputControl = new UntypedFormControl();\n  protected _moreItemsCount: number;\n  protected _fetchMore$ = new EventEmitter<Event>();\n  protected _errorStateMatcher: ErrorStateMatcher;\n\n  @Input() equals: EqualsFn;\n  @Input() logPrefix = '[mat-chips] ';\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string = null;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() placeholder: string;\n  @Input() suggestFn: SuggestFn<any, any>;\n  @Input({ transform: booleanAttribute }) required: boolean;\n  @Input({ transform: booleanAttribute }) mobile: boolean;\n  @Input({ transform: booleanAttribute }) readonly = false;\n  @Input({ transform: booleanAttribute }) clearable = false;\n  @Input({ transform: numberAttribute }) debounceTime: number = null;\n\n  @Input() displaySeparator: string | null;\n  @Input() displayWith: DisplayFn | null;\n  @Input() displayAttributes: string[];\n  @Input() displayColumnSizes: (number | 'auto' | undefined)[];\n  @Input() displayColumnNames: string[];\n  @Input({ transform: booleanAttribute }) highlightAccent: boolean;\n  @Input({ transform: booleanAttribute }) showAllOnFocus: boolean;\n  @Input({ transform: booleanAttribute }) showPanelOnFocus: boolean;\n  @Input({ transform: booleanAttribute }) autofocus = false;\n  @Input() config: MatAutocompleteFieldConfig;\n  @Input() i18nPrefix = 'REFERENTIAL.';\n  @Input() noResultMessage = 'COMMON.NO_RESULT';\n  @Input() panelClass: string;\n  @Input() panelWidth: string;\n  @Input({ transform: booleanAttribute }) disableRipple = false;\n  @Input() matAutocompletePosition: 'auto' | 'above' | 'below';\n  @Input() itemSize = '48px';\n  @Input() fetchMoreThreshold = '15%';\n  @Input({ transform: numberAttribute }) suggestLengthThreshold: number = null;\n  @Input({ transform: booleanAttribute }) showLoadingSpinner = true;\n  @Input() chipColor: ThemePalette;\n  @Input({ transform: booleanAttribute }) debug = false;\n  @Input() applyImplicitValue: boolean | ((value: any) => boolean) = false; // /!\\ false by default (not like autocomplete)\n  @Input() dropButtonTitle: string;\n  @Input() clearButtonTitle: string;\n  @Input({ transform: booleanAttribute }) trimSearchText: boolean;\n  @Input({ transform: booleanAttribute }) hideRequiredMarker = false;\n  @Input() colSizes: [number | 'auto', number | 'auto'] = [undefined, 'auto'];\n  @Input() separatorKeysCodes: number[] = [ENTER];\n  @Input({ transform: booleanAttribute }) showChips = true;\n\n  @Input()\n  set appearance(value: MatFormFieldAppearance) {\n    this._appearance = value;\n  }\n  get appearance(): MatFormFieldAppearance {\n    return this._appearance || this._defaultAppearance;\n  }\n\n  @Input()\n  set subscriptSizing(value: SubscriptSizing) {\n    this._subscriptSizing = value;\n  }\n  get subscriptSizing(): SubscriptSizing {\n    return this._subscriptSizing || this._defaultSubscriptSizing;\n  }\n\n  /**\n   * @deprecated Use panelClass instead\n   */\n  @Input({ alias: 'class' }) set classList(value: string) {\n    this.panelClass = value;\n  }\n  get classList(): string {\n    return this.panelClass;\n  }\n\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('click') clicked = new EventEmitter<MouseEvent>();\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('blur') blurred = new EventEmitter<FocusEvent>();\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  @Output('focus') focused = new EventEmitter<FocusEvent>();\n  @Output() dropButtonClick = new EventEmitter<Event>(true);\n  @Output('keydown.escape') keydownEscape = new EventEmitter<Event>();\n  @Output('keyup.enter') keyupEnter = new EventEmitter<Event>();\n\n  @ViewChild('matInputText') matInputText: ElementRef;\n  @ViewChild(MatAutocomplete) autocomplete: MatAutocomplete;\n  @ViewChild(MatAutocompleteTrigger) autocompleteTrigger: MatAutocompleteTrigger;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective,\n    @Inject(MAT_FORM_FIELD_DEFAULT_OPTIONS) defaultOptions?: MatFormFieldDefaultOptions\n  ) {\n    this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;\n    this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;\n  }\n\n  get itemCount(): number {\n    return this._itemCount;\n  }\n\n  get canFetchMore(): boolean {\n    return this._onFetchMoreCallback && this._moreItemsCount > 0;\n  }\n\n  @Input() set filter(value: any) {\n    if (value !== this._$filter.value) {\n      // DEBUG\n      //console.debug(this.logPrefix + \" Setting filter:\", value);\n      this._$filter.next(value);\n    }\n  }\n\n  get filter(): any {\n    return this._$filter.value;\n  }\n\n  @Input() set tabindex(value: number) {\n    this._tabindex = value;\n    this.markForCheck();\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  @Input() set items(value: Observable<any[]> | any[]) {\n    // Remove previous subscription on items (if exists)\n    if (this._itemsSubscription) {\n      console.warn(this.logPrefix + ' Items received twice !');\n      this._subscription.remove(this._itemsSubscription);\n      this._itemsSubscription.unsubscribe();\n    }\n\n    if (isObservable(value)) {\n      this._itemsSubscription = value.subscribe((v) => this._$inputItems.next(v));\n      this._subscription.add(this._itemsSubscription);\n    } else {\n      if (value !== this._$inputItems.value) {\n        this._$inputItems.next(value as any[]);\n      }\n    }\n  }\n\n  get items(): Observable<any[]> | any[] {\n    return this._$inputItems;\n  }\n\n  get value(): any[] {\n    return this.formControl.value || [];\n  }\n\n  get disabled(): boolean {\n    return this.readonly || this.formControl?.disabled || false;\n  }\n\n  get enabled(): boolean {\n    return (!this.readonly && this.formControl?.enabled) || false;\n  }\n\n  get loading(): boolean {\n    return isNil(this._$filteredItems.value);\n  }\n\n  ngOnInit() {\n    this.formControl =\n      this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-chips-field>.\");\n\n    // Configuration from config object\n    if (this.config) {\n      this.suggestFn = this.suggestFn || this.config.suggestFn;\n      if (!this.suggestFn && this.config.items) {\n        this.items = this.config.items;\n      }\n      this.filter = this.filter || this.config.filter;\n      this.displayAttributes = this.displayAttributes ?? this.config.attributes;\n      this.displayColumnSizes = this.displayColumnSizes ?? this.config.columnSizes;\n      this.displayColumnNames = this.displayColumnNames ?? this.config.columnNames;\n      this.displaySeparator = this.displaySeparator ?? this.config.displayWithSeparator;\n      this.displayWith = this.displayWith ?? this.config.displayWith;\n      this.trimSearchText = this.trimSearchText ?? this.config.trimSearchText;\n      this.equals = this.equals ?? this.config.equals;\n      this.mobile = this.mobile ?? this.config.mobile;\n      this.suggestLengthThreshold = this.suggestLengthThreshold ?? this.config.suggestLengthThreshold;\n      this.showAllOnFocus = this.showAllOnFocus ?? this.config.showAllOnFocus;\n      this.showPanelOnFocus = this.showPanelOnFocus ?? this.config.showPanelOnFocus;\n      this.panelClass = this.panelClass ?? this.config.panelClass ?? this.config.class;\n      this.panelWidth = this.panelWidth ?? this.config.panelWidth;\n      this.debounceTime = toNumber(this.debounceTime, this.config.debounceTime);\n      this.highlightAccent = toBoolean(this.highlightAccent, toBoolean(this.config.highlightAccent));\n    }\n\n    // Default values\n    this.required = this.required ?? this.formControl.hasValidator(Validators.required);\n    this.mobile = this.mobile ?? isMobile(window);\n    this.displayAttributes = this.displayAttributes ?? this.filter?.attributes ?? ['label', 'name'];\n    this.displaySeparator = this.displaySeparator ?? DEFAULT_JOIN_PROPERTIES_SEPARATOR;\n    this.displayWith = this.displayWith ?? MatAutocompleteFieldUtils.createDisplayFn(this.displayAttributes, false, this.displaySeparator);\n    this.trimSearchText = this.trimSearchText ?? true;\n    this.equals = this.equals ?? MatAutocompleteFieldUtils.defaultEquals;\n    this.colSizes = this.colSizes ?? [undefined, 'auto'];\n\n    if (this.required) this.formControl.addValidators(Validators.required);\n\n    this.displayColumnSizes =\n      this.displayColumnSizes ??\n      // if only column: auto size\n      ((this.displayAttributes.length === 1 && [undefined]) ||\n        // Computed column size:\n        // - if label then col size = 2\n        // - if rankOrder then col size = 1\n        // - ese => auto size\n        this.displayAttributes.map((attr) => attr && (attr.endsWith('label') ? 3 : attr.endsWith('rankOrder') ? 2 : undefined)));\n    this.displayColumnNames = this.displayAttributes.map(\n      (attr, index) => (this.displayColumnNames && this.displayColumnNames[index]) || this.i18nPrefix + changeCaseToUnderscore(attr).toUpperCase()\n    );\n    const panelClasses = this.panelClass?.split(/\\s/);\n    this.panelWidth =\n      this.panelWidth ??\n      (panelClasses &&\n        ((panelClasses.includes('min-width-medium') && '300px') ||\n          (panelClasses.includes('min-width-large') && '400px') ||\n          (panelClasses.includes('min-width-xlarge') && '450px') ||\n          (panelClasses.includes('min-width-80vw') && '80vw') ||\n          ((panelClasses.includes('full-width') || panelClasses.includes('full-size')) && '100vw')));\n    this.suggestLengthThreshold = this.suggestLengthThreshold ?? 0;\n    this.showAllOnFocus = this.showAllOnFocus ?? this.suggestLengthThreshold <= 0;\n    this.showPanelOnFocus = this.showPanelOnFocus ?? true;\n    this.debounceTime = this.debounceTime ?? (this.mobile ? 650 : 250);\n    this.highlightAccent = this.highlightAccent ?? false;\n    this.matAutocompletePosition = this.matAutocompletePosition ?? (this.mobile ? 'above' : 'auto'); // On mobile, set position to above (because of bottom keyboard)\n\n    // No suggestFn: filter on the given items\n    if (!this.suggestFn) {\n      const suggestFromArrayFn: SuggestFn<any, any> = async (value, filter) =>\n        // DEBUG\n        //if (this.debug) console.debug(this.logPrefix + ' Calling suggestFromArray with value=', value);\n\n        suggestFromArray(this._$inputItems.value, value, {\n          searchAttributes: this.displayAttributes,\n          ...filter,\n        });\n      // Wait (once) that items are loaded, then call suggest from array fn\n      this.suggestFn = async (value, filter) => {\n        if (isNil(this._$inputItems.value)) {\n          // DEBUG\n          //if (this.debug) console.debug('[mat-chips] Waiting items to be set...');\n\n          await firstNotNilPromise(this._$inputItems);\n\n          // DEBUG\n          //if (this.debug) console.debug('[mat-chips] Received items:', this.$inputItems.value);\n        }\n        this.suggestFn = suggestFromArrayFn;\n        return this.suggestFn(value, filter); // Loop\n      };\n    }\n\n    // Send value to suggest when :\n    // - is nil and '*', and no min length threshold\n    // - is not nil and not a string type (e.g. object)\n    // - is not nil and is a string, and has enough character\n    const thresholdFilterFn = (value: any) =>\n      this.suggestLengthThreshold <= 0 ||\n      (isNotNil(value) && (!(typeof value === 'string') || (value !== '*' && value.trim().length >= this.suggestLengthThreshold)));\n\n    const filteredItemsChanges = merge(\n      // Reload event (no distinctUntilChanged() pipe, to force reload even if same value)\n      this._reload$.pipe(\n        filter(() => this.enabled),\n        filter(thresholdFilterFn),\n        tap(() => this.showLoadingSpinner && this.markAsLoading())\n      ),\n\n      // Search text (no distinctUntilChanged() because of the debounceTime() pipe)\n      this._inputControl.valueChanges.pipe(\n        filter((value) => this.enabled && isNotNilString(value)),\n        // Mark as loading (to show loading spinner) - as soon as possible, and before debounceTime\n        tap((_) => this.showLoadingSpinner && this.markAsLoading()),\n        // Filter if not enough character\n        filter((value) => (value?.length || 0) >= this.suggestLengthThreshold),\n        // Wait a debounce time\n        debounceTime(this.debounceTime)\n        // DEBUG\n        //,tap((value) => this.debug && console.debug(this.logPrefix + ' Search text changes:', value))\n      ),\n\n      // Merge some observables, with a common distinctUntilChanged() pipe\n      merge(\n        // On dropdown button click (no debounceTime)\n        this.dropButtonClick.pipe(\n          filter((event) => !event || !event.defaultPrevented)\n          // DEBUG\n          //,tap(value => this.debug && console.debug(this.logPrefix + ' Received an control object value: ', value))\n        ),\n        // Focus or click => Load all (no debounceTime)\n        merge(this.focused, this.clicked),\n        // DEBUG\n        //.pipe(tap((_) => this.debug && console.debug(this.logPrefix + ' Received focused or clicked event'))),\n        // Input items or filter changes\n        merge(this._$inputItems, this._$filter).pipe(\n          filter(() => !this.loading)\n          // DEBUG\n          //,tap((_) => this.debug && console.debug(this.logPrefix + ' Received $inputItems or filter event'))\n        )\n      ).pipe(\n        filter((_) => this.enabled),\n        map((_) => (this.showAllOnFocus && isNilOrBlank(this._inputControl.value) ? '*' : this._inputControl.value)),\n        // Distinguish changes\n        distinctUntilChanged((v1, v2) =>\n          // If loading (not loaded yet), simulate that value changed to force load\n          this.loading ? false : v1 === v2 || this.equals(v1, v2)\n        ),\n        // Make sure there is enough characters\n        filter(thresholdFilterFn)\n        // DEBUG\n        //,tap((value) => this.debug && console.debug(this.logPrefix + ' Received update event: ', value))\n      )\n    ).pipe(\n      // Suggest values\n      mergeMap((value) => this.suggest(value, this.filter)),\n\n      // Ignore undefined result (e.g. when a newer suggest call is running)\n      filter(isNotNil),\n\n      // DEBUG\n      //tap(items => this.debug && console.debug(this.logPrefix + ' Received from suggest: ', items)),\n\n      // Store implicit value (will use it onBlur if not other value selected)\n      tap((items) => this.updateImplicitValue(items))\n    );\n\n    // Fetch more events\n    const fetchMoreItemsChanges = this._fetchMore$.pipe(\n      tap((event) => event?.preventDefault()), // Avoid to close the mat-select\n      filter(() => this.canFetchMore),\n      mergeMap(() => this.fetchMore()),\n\n      // DEBUG\n      //tap(moreItems => console.debug(this.logPrefix + ' Received from fetch More: ', moreItems)),\n\n      // Concat to existing items\n      map((moreItems) => (this._$filteredItems.value || []).concat(moreItems))\n    );\n\n    // Update filtered items\n    this._subscription.add(\n      merge(\n        this._$inputItems,\n\n        // Update items events\n        filteredItemsChanges,\n\n        // Fetch more events\n        fetchMoreItemsChanges\n      )\n        // Emit items\n        .subscribe((items) => this._$filteredItems.next(items))\n    );\n\n    // Applying implicit value, on blur\n    this._subscription.add(\n      this.blurred\n        .pipe(\n          debounceTime(150),\n          // Skip if multiple (no implicit value) or disable\n          filter((_) => this.enabled),\n\n          map((_) => this._inputControl.value)\n          // DEBUG\n          //,tap(value => this.debug && console.debug(this.logPrefix + ' Received blurred event: ', value)),\n        )\n        .subscribe((value) => {\n          // When leave component without object, use implicit value if :\n          // - an explicit value\n          // - field is not empty (user fill something)\n          // - OR field empty but is required\n          if (\n            this._implicitValue &&\n            ((this.required && isEmptyArray(this.formControl.value)) || (isNotNilOrBlank(value) && typeof value !== 'object'))\n          ) {\n            this.add(this._implicitValue);\n            this.checkIfTouched();\n          } else {\n            // Reset search text\n            this.matInputText.nativeElement.value = '';\n            this._inputControl.setValue('');\n            this.checkIfTouched();\n            this.markAsLoading();\n          }\n\n          this._implicitValue = null; // reset the implicit value\n          this.closePanel(); // Clone panel\n        })\n    );\n\n    // Listen form control status change\n    this._subscription.add(\n      this.formControl.statusChanges\n        .pipe(distinctUntilChanged())\n        // Update component state\n        .subscribe((status) => {\n          console.debug(this.logPrefix + ' Form control status changed: ', status);\n          this.checkIfTouched();\n        })\n    );\n\n    this._subscription.add(\n      this.keydownEscape.subscribe((event) => {\n        if (this.isOpen) {\n          // Avoid form or page to manage escape event\n          event?.stopPropagation();\n          event?.preventDefault();\n\n          // DEBUG\n          //console.debug(this.logPrefix + \" Closing the panel (keydown.escape)\");\n\n          this.closePanel();\n        }\n      })\n    );\n  }\n\n  ngOnDestroy(): void {\n    this._subscription.unsubscribe();\n    if (this._itemsSubscription) {\n      this._itemsSubscription.unsubscribe();\n    }\n    if (this._openedSubscription) {\n      this._openedSubscription.unsubscribe();\n    }\n    this._$inputItems.complete();\n    this._$inputItems.unsubscribe();\n    this._$filteredItems.complete();\n    this._$filteredItems.unsubscribe();\n    this._reload$.complete();\n    this._$filter.complete();\n\n    this.dropButtonClick.complete();\n    this.clicked.complete();\n    this.blurred.complete();\n    this.focused.complete();\n    this.keydownEscape.complete();\n    this.keyupEnter.complete();\n    this._fetchMore$.complete();\n\n    this._implicitValue = undefined;\n    this.formControl = null;\n    this.displayWith = null;\n    this.equals = null;\n    this.suggestFn = null;\n    this._$filteredItems = null;\n    this.config = null;\n    this.panelClass = null;\n\n    this._onChangeCallback = null;\n    this._onTouchedCallback = null;\n    this._onFetchMoreCallback = null;\n\n    // Destroy the 'autocomplete' instance, to avoid memory leak\n    this.autocomplete?.ngOnDestroy();\n  }\n\n  /**\n   * Add item to chips\n   *\n   * @param item\n   */\n  add(item: any) {\n    if (this.debug) console.debug(`${this.logPrefix}select`, item);\n    this.writeValue([...this.value, item]);\n    this.matInputText.nativeElement.value = '';\n    this._inputControl.setValue('');\n  }\n\n  /**\n   * Remove item from chips\n   *\n   * @param item\n   */\n  remove(item: any) {\n    this.closePanel();\n    const value = this.value;\n    const index = value ? value.indexOf(item) : -1;\n    if (index !== -1) {\n      const newValue = value.slice();\n      newValue.splice(index, 1);\n      this.writeValue(newValue);\n      this.markAsLoading();\n    }\n  }\n\n  /**\n   * Allow to reload content. Useful when filter has been changed but not detected\n   */\n  reloadItems(value?: any) {\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Asking to reloadItems()', value);\n    // Force a refresh\n    this._reload$.next(value || (this.showAllOnFocus && this.suggestLengthThreshold <= 0 ? '*' : this.formControl.value));\n  }\n\n  writeValue(value: any[]): void {\n    // DEBUG\n    // if (this.debug) console.debug(this.logPrefix + ' Writing value: ', value);\n\n    if (value && !Array.isArray(value)) {\n      value = [value];\n    }\n    if (value !== this.formControl.value) {\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + ' Writing value: ', value);\n\n      this.formControl.patchValue(value, { emitEvent: false });\n\n      this._onChangeCallback(value);\n    } else {\n      this.markForCheck();\n    }\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    if (isDisabled && this.autocomplete?.isOpen) {\n      this.closePanel();\n    }\n    this.cd.markForCheck();\n  }\n\n  focus() {\n    focusInput(this.matInputText);\n  }\n\n  filterInputTextFocusEvent(event: FocusEvent) {\n    if (!event || event.defaultPrevented) return false;\n\n    // Ignore event from mat-option\n    if (event.relatedTarget instanceof HTMLElement && event.relatedTarget.tagName === 'MAT-OPTION') {\n      event.preventDefault();\n      if (event.stopPropagation) event.stopPropagation();\n      event.returnValue = false;\n\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + ' Cancelling focus event');\n\n      return false;\n    }\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Select input content');\n    const hasContent = selectInputContentFromEvent(event);\n\n    if (hasContent) {\n      // Move caret to the beginning (fix issue IMAGINE-469)\n      selectInputRange(event.target as any, 0, 0);\n    } else if (this.showPanelOnFocus && this.showAllOnFocus) {\n      // If combo is empty, or if has content but should force to show panel on focus\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + ' Emit focus event');\n\n      this.focused.emit(event);\n      return true;\n    }\n    return false;\n  }\n\n  protected filterInputTextBlurEvent(event: FocusEvent) {\n    if (!event || event.defaultPrevented) return;\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' filterInputTextBlurEvent', event);\n\n    // Ignore event from mat-option\n    if (\n      (event.relatedTarget instanceof HTMLElement && event.relatedTarget.tagName === 'MAT-OPTION') ||\n      // Or autocomplete panel is open because event.relatedTarget is null (cf. https://github.com/angular/components/issues/24182)\n      (event.relatedTarget === null && this.autocomplete?.isOpen)\n    ) {\n      event.preventDefault();\n      if (event.stopPropagation) event.stopPropagation();\n      event.returnValue = false;\n\n      // DEBUG\n      //if (this.debug) console.debug(this.logPrefix + \" Cancelling blur event\");\n\n      return;\n    }\n\n    this.checkIfTouched();\n\n    // Emit blur event\n    this.blurred.emit(event);\n  }\n\n  filterChipsFocusEvent(event: FocusEvent) {\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Focus in chips list', event);\n\n    // Ignore event in button\n\n    this.matInputText.nativeElement.focus();\n  }\n\n  clearValue(event: Event) {\n    this.closePanel();\n    this.writeValue(null);\n    event.stopPropagation();\n    this.markAsLoading();\n  }\n\n  _initAutocompleteInfiniteScroll(threshold?: string) {\n    if (!this.autocomplete) return; // Skip\n\n    // DEBUG\n    //console.debug(this.logPrefix + ' Init autocomplete scroll listener');\n\n    if (this._openedSubscription) {\n      this._openedSubscription.unsubscribe();\n      this._subscription.remove(this._openedSubscription);\n    }\n\n    const opened$: Observable<any> = this.autocomplete._isOpen ? timer(0) : this.autocomplete.opened.pipe(debounceTime(200));\n    const scrollEnd$ = opened$.pipe(\n      map((_) => this.getAutocompletePanel()),\n      filter(isNotNil),\n      switchMap((panel) => fromScrollEndEvent(panel, threshold)),\n      takeUntil(this.autocomplete.closed)\n    );\n\n    // Trigger fetch more, end end scroll reached\n    this._openedSubscription = scrollEnd$.subscribe(() => this._fetchMore$.emit());\n\n    // Register subscription\n    this._subscription.add(this._openedSubscription);\n  }\n\n  get isOpen(): boolean {\n    return this.autocomplete?.isOpen || false;\n  }\n\n  closePanel() {\n    if (this.autocomplete?.isOpen) {\n      this.autocompleteTrigger?.closePanel();\n    }\n  }\n\n  protected toggleShowPanel(event: Event) {\n    if (this.isOpen) {\n      event?.preventDefault();\n      event?.stopPropagation();\n      this.closePanel();\n    } else {\n      this.dropButtonClick.emit(event);\n    }\n  }\n\n  /* -- private method -- */\n\n  private async suggest(value: any, filter: any | undefined): Promise<any[] | undefined> {\n    // Compute a new execution id\n    const id = ++this._suggestExecutionId;\n\n    // Trim string value before searching\n    if (this.trimSearchText && typeof value === 'string') {\n      value = value.trim();\n    }\n\n    // Call suggestion function\n    let res = await this.suggestFn(value, filter);\n\n    // Ignore the current result, if a newer execution has been launched\n    if (id !== this._suggestExecutionId) return undefined;\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, res);\n\n    if (!res) {\n      this._itemCount = 0;\n      this._onFetchMoreCallback = undefined;\n      this._moreItemsCount = 0;\n      res = [];\n    } else if (Array.isArray(res)) {\n      res = res as any[];\n      this._itemCount = res?.length || 0;\n      this._onFetchMoreCallback = undefined;\n      this._moreItemsCount = 0;\n    } else {\n      const { data, total, fetchMore } = res as LoadResult<any>;\n      this._itemCount = toNumber(total, (data && data.length) || 0);\n      this._onFetchMoreCallback = fetchMore;\n      this._moreItemsCount = (fetchMore && this._itemCount - data.length) || 0;\n      res = data;\n    }\n\n    // Filter out existing items\n    const existingItems = this.value;\n    const filteredData = (res || []).filter((item1) => !existingItems?.some((item2) => this.equals(item1, item2)));\n    const removedItemCount = (res?.length || 0) - filteredData.length;\n\n    // Decrease the item count, with delta\n    this._itemCount -= removedItemCount;\n\n    // DEBUG\n    //if (this.debug) console.debug(this.logPrefix + ' Filtered items by suggestFn:', value, filteredData);\n\n    return filteredData as any[];\n  }\n\n  private async fetchMore(): Promise<any[]> {\n    if (!this._onFetchMoreCallback) return [];\n\n    // Save then remove fetch function (to avoid multi-call)\n    const fetchMoreFn = this._onFetchMoreCallback;\n    this._onFetchMoreCallback = undefined;\n\n    const { data, total, fetchMore } = await fetchMoreFn();\n    this._itemCount = (total || this._itemCount) - (this.value?.length || 0);\n    this._onFetchMoreCallback = fetchMore;\n    this._moreItemsCount = Math.max(0, this._moreItemsCount - data.length); // Borne min = 0\n    return data;\n  }\n\n  private updateImplicitValue(items: any[]) {\n    // Store implicit value (will use it onBlur if not other value selected)\n    if (items?.length === 1) {\n      const applyImplicitValue = typeof this.applyImplicitValue === 'function' ? this.applyImplicitValue(items[0]) : this.applyImplicitValue;\n      this._implicitValue = applyImplicitValue ? items[0] : undefined;\n    } else {\n      this._implicitValue = undefined;\n    }\n  }\n\n  private checkIfTouched() {\n    if (this.formControl.touched || this._inputControl.touched) {\n      this._onTouchedCallback();\n      this.cd.markForCheck();\n    }\n  }\n\n  private getAutocompletePanel(): HTMLElement {\n    const ele = this.autocomplete?.options.last?._getHostElement().parentElement;\n    if (!ele) {\n      // DEBUG\n      console.warn(this.logPrefix + ' Unable to find the autocomplete div...');\n    }\n    return ele;\n  }\n\n  private markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  private markAsLoading() {\n    if (this._$filteredItems.value) {\n      this._$filteredItems.next(undefined);\n      this._itemCount = undefined;\n      this._implicitValue = undefined;\n      this._onFetchMoreCallback = undefined;\n      this._moreItemsCount = 0;\n      this.markForCheck();\n    }\n  }\n}\n","<ion-grid class=\"ion-no-padding\">\n  <ion-row>\n    <ion-col [size]=\"colSizes?.[0]\" class=\"ion-no-padding\">\n      <mat-form-field\n        [floatLabel]=\"floatLabel | asFloatLabelType\"\n        [appearance]=\"appearance\"\n        [subscriptSizing]=\"'dynamic'\"\n        [hideRequiredMarker]=\"hideRequiredMarker\"\n        [class.mat-form-field-disabled]=\"formControl.disabled\"\n        [class.mat-form-field-invalid]=\"formControl.touched && formControl.invalid\"\n        class=\"material-chips\"\n      >\n        <div matPrefix>\n          <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n        </div>\n        @if (floatLabel !== 'never' && !!placeholder) {\n          <mat-label>{{ placeholder }}</mat-label>\n        }\n\n        <mat-chip-grid\n          #chipList\n          (focus)=\"filterChipsFocusEvent($event)\"\n          [disabled]=\"!readonly && disabled\"\n          [required]=\"required\"\n          [errorStateMatcher]=\"_errorStateMatcher\"\n        >\n          @if (showChips) {\n            @for (item of value; track item) {\n              <mat-chip-row\n                class=\"ion-no-margin\"\n                [removable]=\"!disabled\"\n                (removed)=\"remove(item)\"\n                [color]=\"chipColor\"\n                [highlighted]=\"true\"\n              >\n                {{ item | toString: displayWith }}\n                @if (enabled) {\n                  <mat-icon matChipRemove>cancel</mat-icon>\n                }\n              </mat-chip-row>\n            }\n          }\n          <input\n            #matInputText\n            type=\"text\"\n            [matAutocomplete]=\"autocomplete\"\n            [matAutocompletePosition]=\"matAutocompletePosition\"\n            [formControl]=\"_inputControl\"\n            [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n            [appAutofocus]=\"autofocus\"\n            [tabindex]=\"_tabindex\"\n            [readonly]=\"readonly\"\n            [hidden]=\"disabled\"\n            (click)=\"clicked.emit($event)\"\n            (focus)=\"filterInputTextFocusEvent($event)\"\n            (blur)=\"filterInputTextBlurEvent($event)\"\n            (keydown.escape)=\"keydownEscape.emit($event)\"\n            (keyup.enter)=\"keyupEnter.emit($event)\"\n            (keyup.arrowDown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\"\n            [matChipInputFor]=\"chipList\"\n            [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n          />\n        </mat-chip-grid>\n\n        <!-- autocomplete -->\n        <mat-autocomplete\n          #autocomplete=\"matAutocomplete\"\n          [autoActiveFirstOption]=\"true\"\n          [hideSingleSelectionIndicator]=\"true\"\n          [displayWith]=\"displayWith\"\n          [class]=\"panelClass\"\n          [panelWidth]=\"panelWidth\"\n          [disableRipple]=\"disableRipple\"\n          (optionSelected)=\"add($event.option.value)\"\n        >\n          <!-- Headers -->\n          <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n            @for (attr of displayAttributes; track attr; let i = $index) {\n              <ion-col [size]=\"displayColumnSizes[i]\">\n                <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n              </ion-col>\n            }\n          </ion-row>\n\n          @if (_$filteredItems | push: 'userBlocking'; as items) {\n            <!-- No item option -->\n            @if (items | isEmptyArray) {\n              <mat-option class=\"ion-padding text-italic\" disabled>\n                <ion-label>\n                  <i>{{ noResultMessage | translate }}</i>\n                </ion-label>\n              </mat-option>\n            }\n\n            <!-- Options -->\n            @for (item of items; track $index) {\n              <mat-option [value]=\"item\" class=\"ion-no-padding\">\n                <ion-row [classList]=\"item?.classList || ''\">\n                  @for (path of displayAttributes; track path; let i = $index) {\n                    <ion-col\n                      [size]=\"displayColumnSizes[i]\"\n                      [title]=\"!showTooltip ? text.innerText : ''\"\n                      [matTooltip]=\"showTooltip ? text.innerText : ''\"\n                      class=\"ion-align-self-center\"\n                    >\n                      <ion-text>\n                        <span\n                          #text\n                          [innerHTML]=\"\n                            item\n                              | propertyGet: path\n                              | highlight: { search: matInputText.value, withAccent: highlightAccent }\n                          \"\n                        ></span>\n                      </ion-text>\n                    </ion-col>\n                  }\n                </ion-row>\n              </mat-option>\n            }\n            <!-- More item -->\n            @if (_moreItemsCount) {\n              <mat-option (ngInit)=\"_initAutocompleteInfiniteScroll()\" class=\"ion-padding\" disabled>\n                <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n              </mat-option>\n            }\n          } @else if ((matInputText.value | strLength) < suggestLengthThreshold) {\n            <!-- Need more characters -->\n            <mat-option class=\"ion-padding text-italic\" disabled>\n              <ion-label>\n                {{ 'INFO.PLEASE_TYPE_MORE_CHARACTERS' | translate: { minLength: suggestLengthThreshold } }}\n              </ion-label>\n            </mat-option>\n          } @else {\n            <!-- Loading spinner -->\n            <mat-option class=\"ion-padding\" disabled>\n              <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n            </mat-option>\n          }\n\n          <!-- footer -->\n          @if (itemCount; as count) {\n            <ion-row class=\"mat-autocomplete-footer ion-no-padding\">\n              <ion-col>\n                <ion-text class=\"ion-float-end ion-padding-end\">\n                  <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n                </ion-text>\n              </ion-col>\n            </ion-row>\n          }\n        </mat-autocomplete>\n\n        <div matSuffix class=\"mat-form-field-suffix-bottom\">\n          <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n        </div>\n\n        <!-- Hints -->\n        @if (!formControl?.invalid) {\n          <mat-hint>\n            <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n          </mat-hint>\n        }\n      </mat-form-field>\n\n      <!-- Do the same as MatFormField since angular 15 (see component source)-->\n      <div\n        class=\"mat-mdc-form-field-subscript-wrapper\"\n        [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n        [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n      >\n        @if (formControl.touched && formControl.errors; as errors) {\n          <!-- errors -->\n          <div class=\"mat-mdc-form-field-error-wrapper\">\n            @if (errors | mapKeys | arrayFirst; as errorKey) {\n              @switch (errorKey) {\n                @case ('required') {\n                  <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n                }\n                @case ('entity') {\n                  <mat-error translate>ERROR.FIELD_INVALID</mat-error>\n                }\n                @default {\n                  <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n                }\n              }\n            }\n          </div>\n        }\n      </div>\n    </ion-col>\n    <ion-col [size]=\"colSizes?.[1]\" class=\"ion-no-padding\">\n      <ng-content select=\"[matAfter]\"></ng-content>\n    </ion-col>\n  </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n  <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n  <button\n    matSuffix\n    mat-icon-button\n    tabindex=\"-1\"\n    type=\"button\"\n    (click)=\"toggleShowPanel($event)\"\n    [class.hidden]=\"disabled\"\n    [title]=\"!showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n    [matTooltip]=\"showTooltip ? (dropButtonTitle || '' | translate) : ''\"\n  >\n    <mat-icon>{{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}</mat-icon>\n  </button>\n  @if (clearable) {\n    <button\n      matSuffix\n      mat-icon-button\n      tabindex=\"-1\"\n      type=\"button\"\n      (click)=\"clearValue($event)\"\n      [class.hidden]=\"disabled || !formControl.value\"\n      [title]=\"!showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n      [matTooltip]=\"showTooltip ? (clearButtonTitle || '' | translate) : ''\"\n    >\n      <mat-icon>close</mat-icon>\n    </button>\n  }\n\n  <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n  <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n  <div class=\"mat-mdc-form-field-hint-wrapper\">\n    <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n    <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n    <ng-content select=\"mat-hint[align='end']\"></ng-content>\n  </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { MatChipsField } from './material.chips';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SharedPipesModule } from '../../pipes/pipes.module';\nimport { SharedDirectivesModule } from '../../directives/directives.module';\nimport { MatCommonModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { RxStateModule } from '../../rx-state/rx-state.module';\nimport { MatTooltip } from '@angular/material/tooltip';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ReactiveFormsModule,\n    SharedPipesModule,\n    SharedDirectivesModule,\n    MatCommonModule,\n    MatAutocompleteModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatIconModule,\n    MatButtonModule,\n    MatChipsModule,\n    TranslateModule.forChild(),\n    RxStateModule,\n    MatTooltip,\n  ],\n  declarations: [MatChipsField],\n  exports: [MatChipsField],\n})\nexport class SharedMatChipsModule {}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  Inject,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Self,\n  ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, NgControl, Validators } from '@angular/forms';\nimport { isNil, isNilOrBlank, isNotNil, isNotNilOrBlank } from '../../functions';\nimport {\n  computeDecimalDegrees,\n  computeDecimalPart,\n  ILatLongData,\n  LAT_LONG_PATTERN_MAX_DECIMALS,\n  LatLongPattern,\n  LatLongSign,\n  LatLongSignValue,\n  LatLongType,\n  splitDegreesToDDArray,\n  splitDegreesToDDMMArray,\n  splitDegreesToDDMMSSArray,\n} from './latlong.utils';\nimport { MaskitoOptions } from '@maskito/core';\nimport { MAT_FORM_FIELD, MatFormField, MatFormFieldControl } from '@angular/material/form-field';\nimport { Subject, Subscription } from 'rxjs';\nimport { maskitoNumberOptionsGenerator } from '@maskito/kit';\n\n@Component({\n  selector: 'mat-latlong-input',\n  templateUrl: './material.latlong-input.html',\n  styleUrl: './material.latlong-input.scss',\n  providers: [{ provide: MatFormFieldControl, useExisting: MatLatLongFieldInput }],\n  host: {\n    '[class.label-floating]': 'shouldLabelFloat',\n    '[id]': 'id',\n  },\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatLatLongFieldInput implements MatFormFieldControl<number>, ControlValueAccessor, OnInit, OnDestroy {\n  static nextId = 0;\n  @ViewChild('degrees', { read: ElementRef }) degreesInput: ElementRef;\n  @ViewChild('minutes', { read: ElementRef }) minutesInput: ElementRef;\n  @ViewChild('seconds', { read: ElementRef }) secondsInput: ElementRef;\n  @ViewChild('sign', { read: ElementRef }) signInput: ElementRef;\n\n  protected formGroup = inject(FormBuilder).group({\n    degrees: [''],\n    minutes: [''],\n    seconds: [''],\n    sign: [<LatLongSignValue>null],\n  });\n  stateChanges = new Subject<void>();\n  focused = false;\n  touched = false;\n  controlType = 'mat-latlong-input';\n  id = `mat-latlong-input-${MatLatLongFieldInput.nextId++}`;\n  onChange = (_: any) => {};\n  onTouched = () => {};\n\n  get empty() {\n    if (this.readonly) {\n      return isNil(this.ngControl.value);\n    } else {\n      const {\n        value: { degrees, minutes, seconds },\n      } = this.formGroup;\n      return !degrees && !minutes && !seconds;\n    }\n  }\n\n  get shouldLabelFloat() {\n    return this.focused || !this.empty;\n  }\n\n  @Input('aria-describedby') userAriaDescribedBy: string;\n  placeholder: string; // Not used\n\n  get required(): boolean {\n    return this._required;\n  }\n\n  @Input({ transform: booleanAttribute })\n  set required(value: boolean) {\n    this._required = value;\n    this.stateChanges.next();\n    this.updateValidators();\n  }\n\n  private _required = false;\n\n  get disabled(): boolean {\n    return this._disabled;\n  }\n\n  @Input({ transform: booleanAttribute })\n  set disabled(value: boolean) {\n    this._disabled = value;\n    if (this.formGroup.disabled !== value) {\n      if (this._disabled) {\n        this.formGroup.disable();\n      } else {\n        this.formGroup.enable();\n      }\n    }\n    this.stateChanges.next();\n  }\n\n  private _disabled = false;\n\n  get value(): number | null {\n    if (this.formGroup.valid) {\n      const parts = this.formGroup.value;\n      const degrees = this.safeParseFloat(parts.degrees);\n      const minutes = this.safeParseFloat(parts.minutes);\n      const seconds = this.safeParseFloat(parts.seconds);\n      const sign = parts.sign;\n      return this.formGroup.valid\n        ? isNil(degrees) || this.pattern === 'DD'\n          ? degrees\n          : computeDecimalDegrees(degrees, minutes, seconds, sign, this.maxDecimals)\n        : null;\n    }\n    return null;\n  }\n\n  @Input()\n  set value(value: number | null) {\n    this._value = value;\n    this.updateFormGroup(value);\n  }\n\n  get errorState(): boolean {\n    return this.formGroup.invalid && this.touched;\n  }\n\n  private _defaultSign: LatLongSign;\n\n  @Input() set defaultSign(value: LatLongSign) {\n    this._defaultSign = value;\n    const parts = this.formGroup.value;\n    if (isNilOrBlank(parts.degrees) && isNilOrBlank(parts.seconds) && isNilOrBlank(parts.minutes)) {\n      const formValue = isNil(value) ? null : value === '-' ? -1 : 1;\n      this.formGroup.get('sign').setValue(formValue);\n    }\n  }\n\n  get defaultSign() {\n    return this._defaultSign;\n  }\n\n  @Input() type: LatLongType;\n\n  @Input('latLongPattern')\n  set pattern(value: LatLongPattern) {\n    this.updatePattern(value);\n  }\n\n  get pattern() {\n    return this._pattern;\n  }\n\n  @Input() maxDecimals: number;\n  @Input() readonly = false;\n\n  private _value: number | null;\n  private _pattern: LatLongPattern;\n  protected degreesSymbolUnit = '°';\n  protected minutesSymbolUnit = \"'\";\n  protected secondsSymbolUnit = '\"';\n  protected showMinutes = false;\n  protected showSeconds = false;\n  protected showSign = false;\n  protected degreesMask: MaskitoOptions;\n  protected minutesMask: MaskitoOptions;\n  protected secondsMask: MaskitoOptions;\n  protected degreesPlaceholder: string;\n  protected minutesPlaceholder: string;\n  protected secondsPlaceholder: string;\n  protected lastInputMaxDecimals = LAT_LONG_PATTERN_MAX_DECIMALS;\n\n  private logPrefix = '[mat-latlong-input]';\n  private _subscription = new Subscription();\n  private cd = inject(ChangeDetectorRef);\n\n  constructor(\n    private _elementRef: ElementRef<HTMLElement>,\n    @Optional() @Inject(MAT_FORM_FIELD) public _formField: MatFormField,\n    @Optional() @Self() public ngControl: NgControl\n  ) {\n    if (this.ngControl != null) {\n      this.ngControl.valueAccessor = this;\n    }\n  }\n\n  ngOnInit() {\n    this.type = this.type || 'latitude';\n    this.updatePattern(this.pattern ?? 'DDMM');\n\n    // Update validators (add required to controls)\n    this.updateValidators();\n\n    if (this.readonly) {\n      this._subscription.add(this.ngControl.valueChanges.subscribe(() => this.cd.markForCheck()));\n    }\n  }\n\n  ngOnDestroy() {\n    this.stateChanges.complete();\n    this._subscription.unsubscribe();\n  }\n\n  onFocusIn(event: FocusEvent) {\n    if (!this.focused) {\n      this.focused = true;\n      this.stateChanges.next();\n    }\n  }\n\n  onFocusOut(event: FocusEvent) {\n    if (!this._elementRef.nativeElement.contains(event.relatedTarget as Element)) {\n      this.touched = true;\n      this.focused = false;\n      this.onTouched();\n      this.stateChanges.next();\n    }\n  }\n\n  updatePattern(pattern: LatLongPattern) {\n    const mustUpdateFormGroup = this._pattern !== pattern;\n    this._pattern = pattern;\n    this.showSign = this.pattern !== 'DD';\n\n    switch (this.pattern) {\n      case 'DD':\n        this.lastInputMaxDecimals = 7;\n        this.showMinutes = false;\n        this.showSeconds = false;\n        this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.DD_DDDDDDD_PLACEHOLDER' : 'COMMON.LAT_LONG.DDD_DDDDDDD_PLACEHOLDER';\n        this.degreesMask = maskitoNumberOptionsGenerator({\n          precision: this.lastInputMaxDecimals,\n          min: this.type === 'latitude' ? -90 : -180,\n          max: this.type === 'latitude' ? 90 : 180,\n          minusSign: '-',\n        });\n        break;\n      case 'DDMM':\n        this.lastInputMaxDecimals = 3;\n        this.showMinutes = true;\n        this.showSeconds = false;\n        this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.DD_PLACEHOLDER' : 'COMMON.LAT_LONG.DDD_PLACEHOLDER';\n        this.minutesPlaceholder = 'COMMON.LAT_LONG.MM_MMM_PLACEHOLDER';\n        this.degreesMask = maskitoNumberOptionsGenerator({\n          precision: 0,\n          min: 0,\n          max: this.type === 'latitude' ? 90 : 180,\n        });\n        this.minutesMask = maskitoNumberOptionsGenerator({\n          precision: this.lastInputMaxDecimals,\n          min: 0,\n          max: 60 - computeDecimalPart(1, this.lastInputMaxDecimals),\n        });\n        break;\n      default: // Default is DDMMSS\n        this.lastInputMaxDecimals = 2;\n        this.showMinutes = true;\n        this.showSeconds = true;\n        this.degreesPlaceholder = this.type === 'latitude' ? 'COMMON.LAT_LONG.DD_PLACEHOLDER' : 'COMMON.LAT_LONG.DDD_PLACEHOLDER';\n        this.minutesPlaceholder = 'COMMON.LAT_LONG.MM_PLACEHOLDER';\n        this.secondsPlaceholder = 'COMMON.LAT_LONG.SS_SS_PLACEHOLDER';\n        this.degreesMask = maskitoNumberOptionsGenerator({\n          precision: 0,\n          min: 0,\n          max: this.type === 'latitude' ? 90 : 180,\n        });\n        this.minutesMask = maskitoNumberOptionsGenerator({\n          precision: 0,\n          min: 0,\n          max: 59,\n        });\n        this.secondsMask = maskitoNumberOptionsGenerator({\n          precision: this.lastInputMaxDecimals,\n          min: 0,\n          max: 60 - computeDecimalPart(1, this.lastInputMaxDecimals),\n        });\n        break;\n    }\n    this.cd.detectChanges();\n\n    if (mustUpdateFormGroup) {\n      this.updateFormGroup(this._value);\n    }\n  }\n\n  protected updateFormGroup(value: number | null) {\n    const result = this.computeLatLongFormGroupValue(value);\n    // DEBUG\n    //console.debug(`${this.logPrefix} Setting value`, value, result);\n\n    this.formGroup.setValue({\n      degrees: result.degrees?.toString() || null,\n      minutes: result.minutes?.toString() || null,\n      seconds: result.seconds?.toString() || null,\n      sign: result.sign,\n    });\n    this.stateChanges.next();\n  }\n\n  handleInput(controlName: string, nextControlName?: string): void {\n    // Can autofocus next control ?\n    let focusNext = false;\n    switch (controlName) {\n      case 'degrees': {\n        const degrees = this.safeParseFloat(this.formGroup.value.degrees);\n        if (this.type === 'latitude' && (degrees === 0 || degrees > 9)) {\n          focusNext = true;\n        } else if (this.type === 'longitude' && (degrees === 0 || degrees > 18)) {\n          focusNext = true;\n        }\n        break;\n      }\n      case 'minutes': {\n        const minutes = this.safeParseFloat(this.formGroup.value.minutes);\n        if (minutes === 0 || minutes > 6) {\n          focusNext = true;\n        }\n        break;\n      }\n      case 'seconds': {\n        // focusNext = true;\n        break;\n      }\n    }\n\n    if (focusNext) {\n      this.autoFocusNext(controlName, nextControlName);\n    }\n    // Update value\n    this._value = this.value;\n    this.onChange(this._value);\n  }\n\n  autoFocusNext(controlName: string, nextControlName?: string): void {\n    if (!this.formGroup.controls[controlName].errors && nextControlName) {\n      this.getElementByName(nextControlName)?.focus();\n    }\n  }\n\n  autoFocusPrev(controlName: string, prevControlName: string): void {\n    if (isNilOrBlank(this.formGroup.controls[controlName].value)) {\n      this.getElementByName(prevControlName)?.focus();\n    }\n  }\n\n  getElementByName(name: string): HTMLElement | undefined {\n    switch (name) {\n      case 'degrees':\n        return this.degreesInput?.nativeElement;\n      case 'minutes':\n        return this.minutesInput?.nativeElement;\n      case 'seconds':\n        return this.secondsInput?.nativeElement;\n      case 'sign':\n        return this.signInput?.nativeElement;\n      default:\n        throw new Error(`${this.logPrefix} No HTMLElement with name '${name}'`);\n    }\n  }\n\n  setDescribedByIds(ids: string[]) {\n    const controlElement = this._elementRef.nativeElement.querySelector('.mat-latlong-input-container')!;\n    controlElement?.setAttribute('aria-describedby', ids.join(' '));\n  }\n\n  onContainerClick() {\n    // console.debug(`${this.logPrefix} DEBUG onContainerClick`);\n    if (this.readonly) return;\n    if (this.empty) {\n      this.degreesInput.nativeElement.focus();\n    } else if (isNilOrBlank(this.formGroup.value.minutes)) {\n      this.minutesInput.nativeElement.focus();\n    } else if (isNilOrBlank(this.formGroup.value.seconds)) {\n      this.secondsInput.nativeElement.focus();\n    } else if (isNil(this.formGroup.value.sign)) {\n      this.signInput.nativeElement.focus();\n    }\n  }\n\n  writeValue(value: number | null): void {\n    this.value = value;\n  }\n\n  registerOnChange(fn: any): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n\n  private computeLatLongFormGroupValue(rawValue: number | string): ILatLongData {\n    const isLongitude = this.type === 'longitude';\n    const value = typeof rawValue === 'string' ? this.safeParseFloat(rawValue.replace(/,/g, '.')) : rawValue;\n    const result: ILatLongData = {\n      degrees: null,\n      minutes: null,\n      seconds: null,\n      sign: isNotNil(value)\n        ? value < 0\n          ? -1\n          : 1\n        : // Use default sign, if any\n          this._defaultSign\n          ? this._defaultSign === '-'\n            ? -1\n            : 1\n          : null,\n    };\n\n    if (value === 0) {\n      result.degrees = 0;\n    } else if (isNotNil(value)) {\n      // Parse options\n      const parseOptions = {\n        longitude: isLongitude,\n        pattern: this.pattern,\n        maxDecimals: this.lastInputMaxDecimals,\n        fixLatLong: true,\n      };\n\n      if (this.pattern === 'DD') {\n        const splitValue = splitDegreesToDDArray(value, parseOptions).slice(1) as number[]; // remove sign;\n        result.seconds = 0;\n        result.minutes = 0;\n        result.degrees = (splitValue[0] + computeDecimalPart(splitValue[1] ?? 0, this.lastInputMaxDecimals)) * (result.sign || 1);\n      } else if (this.pattern === 'DDMM') {\n        const splitValue = splitDegreesToDDMMArray(value, parseOptions);\n        result.seconds = 0;\n        result.minutes = Math.abs((splitValue[1] ?? 0) + computeDecimalPart(splitValue[2] ?? 0, this.lastInputMaxDecimals));\n        result.degrees = Math.abs(!result.minutes && isNilOrBlank(splitValue[0]) ? 0 : (splitValue[0] ?? 0));\n      } else {\n        // Default // DDMMSS\n        const splitValue = splitDegreesToDDMMSSArray(value, parseOptions);\n        result.seconds = Math.abs((splitValue[2] ?? 0) + computeDecimalPart(splitValue[3] ?? 0, this.lastInputMaxDecimals));\n        result.minutes = !result.seconds && !splitValue[1] ? 0 : Math.abs(splitValue[1] ?? 0);\n        result.degrees = !result.seconds && !result.minutes && isNilOrBlank(splitValue[0]) ? 0 : Math.abs(splitValue[0] ?? 0);\n      }\n    }\n\n    return result;\n  }\n\n  private safeParseFloat(value: string): number {\n    return isNotNilOrBlank(value) ? parseFloat(value) : undefined;\n  }\n\n  private updateValidators() {\n    const { minutes, seconds, sign } = this.formGroup.controls;\n\n    // Update minutes\n    if (this.showMinutes && this._required) {\n      minutes.addValidators(Validators.required);\n    } else {\n      minutes.removeValidators(Validators.required);\n    }\n\n    // Update seconds\n    if (this.showSeconds && this._required) {\n      seconds.addValidators(Validators.required);\n    } else {\n      seconds.removeValidators(Validators.required);\n    }\n\n    // Update sign\n    if (this.showSign && this._required) {\n      sign.addValidators(Validators.required);\n    } else {\n      sign.removeValidators(Validators.required);\n    }\n  }\n}\n","@if (readonly) {\n  <ion-text>\n    {{\n      ngControl.value\n        | latLongFormat: { pattern: pattern, maxDecimals: lastInputMaxDecimals, type: type, placeholderChar: '' }\n    }}\n  </ion-text>\n} @else {\n  <div\n    role=\"group\"\n    class=\"mat-latlong-input-container\"\n    [formGroup]=\"formGroup\"\n    [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n    (focusin)=\"onFocusIn($event)\"\n    (focusout)=\"onFocusOut($event)\"\n  >\n    <input\n      matInput\n      #degrees\n      aria-label=\"Degrees\"\n      [class.degrees-only]=\"pattern === 'DD'\"\n      [class.degrees]=\"pattern !== 'DD'\"\n      [class.latitude]=\"type === 'latitude'\"\n      inputmode=\"decimal\"\n      autocomplete=\"off\"\n      [placeholder]=\"degreesPlaceholder | translate\"\n      formControlName=\"degrees\"\n      [maskito]=\"degreesMask\"\n      (input)=\"handleInput('degrees', 'minutes')\"\n    />\n    <span class=\"symbol-unit\">\n      {{ degreesSymbolUnit }}\n    </span>\n\n    @if (showMinutes) {\n      <input\n        matInput\n        #minutes\n        aria-label=\"Minutes\"\n        [class.minutes]=\"showSeconds\"\n        [class.minutes-seconds]=\"!showSeconds\"\n        inputmode=\"decimal\"\n        autocomplete=\"off\"\n        [placeholder]=\"minutesPlaceholder | translate\"\n        formControlName=\"minutes\"\n        [maskito]=\"minutesMask\"\n        (input)=\"handleInput('minutes', 'seconds')\"\n        (keyup.backspace)=\"autoFocusPrev('minutes', 'degrees')\"\n      />\n      <span class=\"symbol-unit\">\n        {{ minutesSymbolUnit }}\n      </span>\n    }\n\n    @if (showSeconds) {\n      <input\n        matInput\n        #seconds\n        aria-label=\"Seconds\"\n        class=\"seconds\"\n        inputmode=\"decimal\"\n        autocomplete=\"off\"\n        [placeholder]=\"secondsPlaceholder | translate\"\n        formControlName=\"seconds\"\n        [maskito]=\"secondsMask\"\n        (input)=\"handleInput('seconds', 'sign')\"\n        (keyup.backspace)=\"autoFocusPrev('seconds', 'minutes')\"\n      />\n      <span class=\"symbol-unit\">\n        {{ secondsSymbolUnit }}\n      </span>\n    }\n\n    <!-- sign -->\n    @if (showSign) {\n      <span class=\"sign-spacer\"></span>\n      <mat-select\n        #sign\n        hideSingleSelectionIndicator\n        disableOptionCentering\n        aria-label=\"Sign\"\n        class=\"sign\"\n        formControlName=\"sign\"\n        [placeholder]=\"\n          (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n            | translate\n        \"\n        (focusin)=\"sign.open()\"\n        (selectionChange)=\"handleInput('sign')\"\n      >\n        <mat-option [value]=\"1\" (click)=\"sign.close()\">\n          {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n        </mat-option>\n        <mat-option [value]=\"-1\" (click)=\"sign.close()\">\n          {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n        </mat-option>\n\n      </mat-select>\n\n    }\n\n  </div>\n}\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  forwardRef,\n  Inject,\n  Input,\n  numberAttribute,\n  OnDestroy,\n  OnInit,\n  Optional,\n  ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormControl } from '@angular/forms';\nimport { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldAppearance, MatFormFieldDefaultOptions, SubscriptSizing } from '@angular/material/form-field';\nimport { isMobile } from '../../platforms';\nimport { SharedValidators } from '../../validator/validators';\nimport { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';\nimport { LAT_LONG_VALUE_MAX_DECIMALS, LatLongPattern, LatLongSign, LatLongType } from './latlong.utils';\nimport { MatLatLongFieldInput } from './material.latlong-input';\nimport { isNotNil } from '../../functions';\nimport { Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { AppFloatLabelType } from '../../types';\n\n@Component({\n  selector: 'mat-latlong-field',\n  templateUrl: './material.latlong.html',\n  styleUrls: ['./material.latlong.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => MatLatLongField),\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatLatLongField implements ControlValueAccessor, OnInit, AfterViewInit, OnDestroy {\n  private _subscription = new Subscription();\n  private _appearance: MatFormFieldAppearance | null = null;\n  private _subscriptSizing: SubscriptSizing | null = null;\n  private _readonly = false;\n  private _tabindex: number;\n  private readonly _defaultAppearance: MatFormFieldAppearance;\n  private readonly _defaultSubscriptSizing: SubscriptSizing;\n\n  protected i18nErrorKeys = SharedValidators.I18N_ERROR_KEYS;\n\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() type: LatLongType;\n  @Input('latLongPattern') pattern: LatLongPattern;\n  @Input() maxDecimals: number = LAT_LONG_VALUE_MAX_DECIMALS;\n  @Input({ transform: booleanAttribute }) required = false;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() placeholder: string;\n  @Input() defaultSign: LatLongSign;\n  @Input({ transform: booleanAttribute }) autofocus = false;\n  @Input({ transform: booleanAttribute }) mobile: boolean;\n  @Input({ transform: booleanAttribute }) clearable = false;\n  @Input('class') classList: string;\n\n  @Input({ transform: numberAttribute }) set tabindex(value: number) {\n    if (this._tabindex !== value) {\n      this._tabindex = value;\n    }\n  }\n\n  get tabindex(): number {\n    return this._tabindex;\n  }\n\n  @Input()\n  set appearance(value: MatFormFieldAppearance) {\n    this._appearance = value;\n  }\n\n  get appearance(): MatFormFieldAppearance {\n    return this._appearance || this._defaultAppearance;\n  }\n\n  @Input() set readonly(value: boolean) {\n    this._readonly = value;\n    this.markForCheck();\n  }\n\n  get readonly(): boolean {\n    return this._readonly;\n  }\n\n  @Input()\n  set subscriptSizing(value: SubscriptSizing) {\n    this._subscriptSizing = value;\n  }\n\n  get subscriptSizing(): SubscriptSizing {\n    return this._subscriptSizing || this._defaultSubscriptSizing;\n  }\n\n  get disabled(): any {\n    return this.readonly || this.formControl.disabled;\n  }\n\n  @ViewChild('input') input: MatLatLongFieldInput;\n  pendingValue: any;\n  pendingValueSet = false;\n  pendingDisabledState: boolean;\n  pendingOnChange: (_: any) => unknown;\n  pendingOnTouched: () => unknown;\n\n  constructor(\n    private cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective,\n    @Inject(MAT_FORM_FIELD_DEFAULT_OPTIONS) defaultOptions?: MatFormFieldDefaultOptions\n  ) {\n    this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;\n    this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;\n  }\n\n  // Delegate control vale accessor\n  writeValue(value: any): void {\n    if (this.input) {\n      this.input.writeValue(value);\n      this.markForCheck();\n    } else {\n      this.pendingValue = value;\n      this.pendingValueSet = true;\n    }\n  }\n  registerOnChange(fn: any): void {\n    if (this.input) {\n      this.input.registerOnChange(fn);\n    } else {\n      this.pendingOnChange = fn;\n    }\n  }\n  registerOnTouched(fn: any): void {\n    if (this.input) {\n      this.input.registerOnTouched(fn);\n    } else {\n      this.pendingOnTouched = fn;\n    }\n  }\n  setDisabledState?(isDisabled: boolean): void {\n    if (this.input) {\n      this.input.setDisabledState(isDisabled);\n    } else {\n      this.pendingDisabledState = isDisabled;\n    }\n  }\n\n  ngOnInit() {\n    this.formControl =\n      this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-latlong-field>.\");\n\n    this.mobile = this.mobile ?? isMobile(window);\n\n    // Listen status changes (when done outside the component  - e.g. when setErrors() is calling on the formControl)\n    this._subscription.add(\n      this.formControl.statusChanges\n        .pipe(\n          filter(() => !this.readonly) // Skip\n        )\n        .subscribe(() => this.markForCheck())\n    );\n  }\n\n  ngAfterViewInit() {\n    if (!this.readonly) {\n      if (this.pendingOnChange) {\n        this.input.registerOnChange(this.pendingOnChange);\n      }\n      if (this.pendingOnTouched) {\n        this.input.registerOnTouched(this.pendingOnTouched);\n      }\n      if (isNotNil(this.pendingDisabledState)) {\n        this.input.setDisabledState(this.pendingDisabledState);\n      }\n      if (this.pendingValueSet) {\n        this.input.writeValue(this.pendingValue);\n      }\n    }\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n\n  clearValue(event?: Event) {\n    event?.stopPropagation();\n    this.formControl.setValue(null);\n  }\n\n  /* -- private method -- */\n\n  private markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<mat-form-field\n  #formField\n  [floatLabel]=\"floatLabel | asFloatLabelType\"\n  [appearance]=\"appearance\"\n  [subscriptSizing]=\"subscriptSizing\"\n  [class.mdc-text-field--invalid]=\"formControl.touched && formControl.invalid\"\n  class=\"mat-latlong-field mat-latlong-field-{{ type }} {{ classList }}\"\n>\n  <div matPrefix>\n    <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n  </div>\n\n  @if (floatLabel !== 'never' && placeholder | isNotNilOrBlank) {\n    <mat-label>{{ placeholder }}</mat-label>\n  }\n\n  <mat-latlong-input\n    #input\n    [formControl]=\"formControl\"\n    [required]=\"required\"\n    [disabled]=\"disabled\"\n    [type]=\"type\"\n    [latLongPattern]=\"pattern\"\n    [defaultSign]=\"defaultSign\"\n    [maxDecimals]=\"maxDecimals\"\n    [readonly]=\"readonly\"\n  ></mat-latlong-input>\n\n  <div matSuffix>\n    <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n  </div>\n</mat-form-field>\n\n<!-- Do the same as MatFromField since angular 15 (see component source)-->\n<div\n  class=\"mat-mdc-form-field-subscript-wrapper\"\n  [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n  [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n>\n  @if (formControl.touched && formControl.invalid) {\n    <!-- errors -->\n    <div class=\"mat-mdc-form-field-error-wrapper\">\n      @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n        <mat-error>\n          {{ i18nErrorKeys | mapGet: errorKey | translate: (formControl.errors | mapGet: errorKey) }}\n        </mat-error>\n      } @else {\n        <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n      }\n    </div>\n  } @else {\n    <!-- hints -->\n    <mat-hint>\n      <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n    </mat-hint>\n  }\n</div>\n\n<ng-template #matPrefixTemplate>\n  <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n  @if (clearable && !readonly) {\n    <button\n      matSuffix\n      mat-icon-button\n      tabindex=\"-1\"\n      type=\"button\"\n      (click)=\"clearValue($event)\"\n      [hidden]=\"formControl.value | isNil\"\n    >\n      <mat-icon>close</mat-icon>\n    </button>\n  }\n\n  <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n  <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n  <div class=\"mat-mdc-form-field-hint-wrapper\">\n    <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n    <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n    <ng-content select=\"mat-hint[align='end']\"></ng-content>\n  </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { IonicModule } from '@ionic/angular';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatCommonModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSelectModule } from '@angular/material/select';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { SharedDirectivesModule } from '../../directives/directives.module';\nimport { SharedPipesModule } from '../../pipes/pipes.module';\nimport { MatLatLongField } from './material.latlong';\nimport { MatLatLongFieldInput } from './material.latlong-input';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ReactiveFormsModule,\n    SharedDirectivesModule,\n    SharedPipesModule,\n    MatCommonModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatButtonModule,\n    MaskitoDirective,\n    MatIconModule,\n    MatSelectModule,\n    TranslateModule.forChild(),\n  ],\n  declarations: [MatLatLongField, MatLatLongFieldInput],\n  exports: [MatLatLongField, MatLatLongFieldInput],\n})\nexport class SharedMatLatLongModule {}\n","import { NgModule, Type } from '@angular/core';\nimport { CdkTableModule } from '@angular/cdk/table';\n\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { MatCommonModule, MatRippleModule } from '@angular/material/core';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatStepperModule } from '@angular/material/stepper';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { SharedMatDurationModule } from './duration/duration.module';\nimport { SharedMatBooleanModule } from './boolean/boolean.module';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { SharedBadgeModule } from './badge/badge.module';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatListModule } from '@angular/material/list';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SharedMatAutocompleteModule } from './autocomplete/material.autocomplete.module';\nimport { SharedMatDateTimeModule } from './datetime/datetime.module';\nimport { SharedMatSwipeModule } from './swipe/swipe.module';\nimport { SharedMatChipsModule } from './chips/chips.module';\nimport { SharedMatLatLongModule } from './latlong/material.latlong.module';\n//import {SharedMatNumpadModule} from './numpad/numpad.module';\n\nconst modules: Array<Type<any> | any[]> = [\n  // Angular material components\n  MatCommonModule,\n  MatTableModule,\n  MatSortModule,\n  MatPaginatorModule,\n  MatFormFieldModule,\n  MatInputModule,\n  CdkTableModule,\n  MatCheckboxModule,\n  MatExpansionModule,\n  MatToolbarModule,\n  MatDialogModule,\n  MatIconModule,\n  MatButtonModule,\n  MatMenuModule,\n  MatSelectModule,\n  MatCardModule,\n  MatTabsModule,\n  MatListModule,\n  MatStepperModule,\n  MatButtonToggleModule,\n  MatProgressSpinnerModule,\n  MatProgressBarModule,\n  MatRadioModule,\n  MatBadgeModule,\n  MatSlideToggleModule,\n  A11yModule, // Used for focus trap\n  OverlayModule,\n  ScrollingModule,\n  MatRippleModule,\n  MatDividerModule,\n  MatTooltipModule,\n  // Custom components\n  SharedMatAutocompleteModule,\n  SharedMatLatLongModule,\n  SharedMatDateTimeModule,\n  SharedMatDurationModule,\n  SharedMatBooleanModule,\n  //SharedMatNumpadModule,\n  SharedMatSwipeModule,\n  SharedMatChipsModule,\n  SharedBadgeModule,\n];\n\n@NgModule({\n  imports: modules,\n  exports: modules,\n})\nexport class SharedMaterialModule {}\n","import { TranslateService } from '@ngx-translate/core';\nimport { Injectable } from '@angular/core';\nimport { MatPaginatorIntl } from '@angular/material/paginator';\n\n@Injectable({ providedIn: 'root' })\nexport class MatPaginatorI18n extends MatPaginatorIntl {\n  ofLabel: string;\n\n  constructor(protected translate: TranslateService) {\n    super();\n\n    this.translate\n      .get([\n        'COMMON.PAGINATOR.ITEMS_PER_PAGE',\n        'COMMON.PAGINATOR.NEXT_PAGE',\n        'COMMON.PAGINATOR.PREVIOUS_PAGE',\n        'COMMON.PAGINATOR.OF',\n        'COMMON.PAGINATOR.FIRST_PAGE',\n        'COMMON.PAGINATOR.LAST_PAGE',\n      ])\n      .subscribe((translations: { [key: string]: string }) => {\n        console.info('[MatPaginatorI18n] Update pagination translations');\n        this.itemsPerPageLabel = this._getTranslationValue(translations, 'COMMON.PAGINATOR.ITEMS_PER_PAGE', '');\n        this.nextPageLabel = this._getTranslationValue(translations, 'COMMON.PAGINATOR.NEXT_PAGE', '>');\n        this.previousPageLabel = this._getTranslationValue(translations, 'COMMON.PAGINATOR.PREVIOUS_PAGE', '<');\n        this.ofLabel = this._getTranslationValue(translations, 'COMMON.PAGINATOR.OF', '/');\n        this.firstPageLabel = this._getTranslationValue(translations, 'COMMON.PAGINATOR.FIRST_PAGE', '|<');\n        this.lastPageLabel = this._getTranslationValue(translations, 'COMMON.PAGINATOR.LAST_PAGE', '>|');\n        this.changes.next();\n      });\n  }\n\n  getRangeLabel = (page: number, pageSize: number, length: number) => {\n    if (length === 0 || pageSize === 0) {\n      return '0 ' + this.ofLabel + ' ' + length;\n    }\n    length = Math.max(length, 0);\n    const startIndex = page * pageSize;\n    // If the start index exceeds the list length, do not try and fix the end index to the end.\n    const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;\n    return startIndex + 1 + ' - ' + endIndex + ' ' + this.ofLabel + ' ' + length;\n  };\n\n  protected _getTranslationValue(translations: any, key: string, defaultValue: string): string {\n    return translations[key] !== key ? translations[key] : defaultValue;\n  }\n}\n","import { AppColors, DisplayFn, ObjectMap, Property } from '../types';\nimport { isNotNil, joinPropertiesPath } from '../functions';\nimport { InjectionToken, Injector } from '@angular/core';\nimport { MatAutocompleteFieldConfig } from '../material/autocomplete/material.autocomplete.config';\nimport { UserProfileLabel } from '../../core/services/model/person.model';\n\nexport type FormFieldType =\n  | 'integer'\n  | 'double'\n  | 'boolean'\n  | 'string'\n  | 'enum'\n  | 'enums'\n  | 'color'\n  | 'peer'\n  | 'entity'\n  | 'entities'\n  | 'date'\n  | 'dateTime';\n\nexport declare interface FormFieldDefinition<K = string, T = FormFieldType, E = any, F = any> {\n  key: K;\n  type: T;\n  label: string;\n  minValue?: number;\n  maxValue?: number;\n  maximumNumberDecimals?: number;\n  defaultValue?: any;\n  isTransient?: boolean; // Useful only for remote configuration\n  values?: (string | Property)[] | InjectionToken<(string | Property)[]>;\n  autocomplete?: MatAutocompleteFieldConfig<E, F>;\n  chipColor?: AppColors;\n\n  disabled?: boolean;\n  required?: boolean;\n  extra?: {\n    [key: string]: {\n      description?: string;\n      required: boolean;\n      disabled?: boolean;\n    };\n  };\n  minProfile?: UserProfileLabel;\n\n  /**\n   * Use for automatic serialization/deserialization to/from string (eg. using the autocomplete suggestFn).\n   * Default value: 'id'\n   */\n  serializeAttribute?: string;\n\n  /**\n   * Use to serialize an entity into string (see AppPropertiesUtils.***asObject())\n   * @param value\n   */\n  serialize?: (value: E) => string;\n\n  /**\n   * Use to deserialize a string into an entity (see AppPropertiesUtils.***fromObject())\n   * @param value\n   */\n  deserialize?: (value: string) => E | Promise<E>;\n}\nexport type FormFieldDefinitionMap = ObjectMap<FormFieldDefinition>;\n\nexport class FormFieldDefinitionUtils {\n  /**\n   * Prepares an array of form field definitions by using the specified injector to process each definition.\n   *\n   * @param {Injector} injector - The injector used to process each form field definition.\n   * @param {FormFieldDefinition[]} defs - An array of form field definitions to be prepared.\n   * @return {FormFieldDefinition[]} An array of prepared form field definitions.\n   */\n  static prepareDefinitions(injector: Injector, defs: FormFieldDefinition[]): FormFieldDefinition[] {\n    return defs?.map((def) => FormFieldDefinitionUtils.prepareDefinition(injector, def));\n  }\n\n  /**\n   * Prepares the definition by processing its type and optionally setting the values property.\n   *\n   * @param {Injector} injector - The injector used to get the necessary services.\n   * @param {FormFieldDefinition} def - The form field definition to be prepared.\n   * @return {FormFieldDefinition} - The prepared form field definition with updated values if the type is 'enum' or 'enums'.\n   */\n  static prepareDefinition(injector: Injector, def: FormFieldDefinition): FormFieldDefinition {\n    if (def.type === 'enum' || def.type === 'enums') {\n      return {\n        ...def,\n        values: FormFieldDefinitionUtils.getEnumValues(injector, def.values),\n      };\n    }\n    return def;\n  }\n\n  /**\n   * Retrieves an array of Property objects from the provided enum values.\n   *\n   * @param {Injector} injector - The Angular injector to resolve the InjectionToken.\n   * @param {(string | Property)[] | InjectionToken<(string | Property)[]>} enumValues - The enum values, which can be an array of strings, array of Property objects, or an InjectionToken that resolves to such an array.\n   * @return {Property[]} An array of Property objects.\n   */\n  static getEnumValues(injector: Injector, enumValues: (string | Property)[] | InjectionToken<(string | Property)[]>): Property[] {\n    // Resolve token\n    if (enumValues instanceof InjectionToken) {\n      const values = injector.get(enumValues);\n      return Array.isArray(values) ? FormFieldDefinitionUtils.asPropertyArray(values) : [];\n    }\n\n    // Normalize string[] => Property[]\n    return FormFieldDefinitionUtils.asPropertyArray(enumValues as (string | Property)[]);\n  }\n\n  static getDisplayValueFn(definition: FormFieldDefinition): DisplayFn {\n    if (definition.autocomplete && definition.autocomplete.displayWith) {\n      return (obj: any) => definition.autocomplete.displayWith(obj);\n    }\n    const attributes = (definition.autocomplete && definition.autocomplete.attributes) || ['label', 'name'];\n    return (obj: any) => obj && joinPropertiesPath(obj, attributes);\n  }\n\n  /**\n   * Determines whether an additional field is enabled for a particular context (=the extra key).\n   *\n   * @param {FormFieldDefinition} field - The field definition object.\n   * @param {string} extraKey - The extra key, to check the field's status.\n   * @return {boolean} Returns `true` if the field is enabled for the given key, otherwise `false`.\n   */\n  static isFieldEnableFor(field: FormFieldDefinition, extraKey: string): boolean {\n    if (!field || !extraKey) return false;\n    return (field.extra?.[extraKey] && field.extra?.[extraKey]?.disabled !== true) || false;\n  }\n\n  static isFieldVisibleFor(field: FormFieldDefinition, extraKey: string): boolean {\n    if (!field || !extraKey) return false;\n    return isNotNil(field.extra?.[extraKey]);\n  }\n\n  /* -- internal functions -- */\n\n  private static asPropertyArray(values: (string | Property)[]): Property[] {\n    return (Array.isArray(values) ? values : [])\n      .map((v) => (typeof v === 'string' ? <Property>{ key: v, value: v } : typeof v === 'object' ? (v as Property) : null))\n      .filter(isNotNil);\n  }\n}\n\nexport abstract class FormFieldValuesHolder {\n  getAsBoolean(data: ObjectMap, definition: FormFieldDefinition): boolean {\n    const value = this.get(data, definition);\n    return isNotNil(value) ? value && value !== 'false' : undefined;\n  }\n\n  getAsInt(data: any, definition: FormFieldDefinition): number {\n    const value = this.get(data, definition);\n    return isNotNil(value) ? parseInt(value) : undefined;\n  }\n\n  getAsNumbers(data: any, definition: FormFieldDefinition): number[] {\n    const value = this.get(data, definition);\n    if (typeof value === 'string') return value.split(',').map(parseFloat) || undefined;\n    return isNotNil(value) ? [parseFloat(value)] : undefined;\n  }\n\n  getAsStrings(data: any, definition: FormFieldDefinition): string[] {\n    const value = this.get(data, definition);\n    return (value && value.split(',')) || undefined;\n  }\n\n  get<T = string>(data: any, definition: FormFieldDefinition): T {\n    return isNotNil(data[definition.key]) ? data[definition.key] : definition.defaultValue || undefined;\n  }\n}\n","export function rgbToHex(r: number, g: number, b: number): string {\n  return '#' + componentToHex(r) + componentToHex(g) + componentToHex(b);\n}\n\nexport function rgbArrayToHex(rgb: number[]): string {\n  return '#' + componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);\n}\n\nexport function hexToRgbArray(hex: string): number[] {\n  const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n  return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : null;\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n  const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n  return result\n    ? {\n        r: parseInt(result[1], 16),\n        g: parseInt(result[2], 16),\n        b: parseInt(result[3], 16),\n      }\n    : null;\n}\n\nfunction componentToHex(c: number): string {\n  const hex = c.toString(16);\n  return hex.length === 1 ? '0' + hex : hex;\n}\n\n// See mix in file ionic.functions.color.scss\nexport function mixHex(color1: string, color2: string, weight?: number) {\n  weight = weight ? weight / 100 : 0.5;\n\n  const rgb1 = hexToRgbArray(color1);\n  if (!rgb1) throw Error('Invalid hex color:' + color1);\n\n  const rgb2 = hexToRgbArray(color2);\n  if (!rgb2) throw Error('Invalid hex color:' + color2);\n\n  const rgbAverage = rgb1.map((v, index) => Math.round(v * weight + rgb2[index] * (1 - weight)));\n  return rgbArrayToHex(rgbAverage);\n}\n\n// 12% darker version of the base color (mix with black)\nexport function getColorShade(color: string) {\n  return mixHex('#000000', color, 12);\n}\n\n// 10% lighter version of the base color (mix with white)\nexport function getColorTint(color: string) {\n  return mixHex('#ffffff', color, 10);\n}\n\n/**\n *\n * @param color\n * @param bw if true, will use black or white color, instead of the exact inverse\n */\nexport function getColorContrast(color: string, bw?: boolean) {\n\n  if (bw === true) {\n    return isLightColor(color) ? '#000000' : '#FFFFFF';\n  }\n\n  const rgb = hexToRgbArray(color);\n  if (!rgb) throw Error('Invalid hex color:' + color);\n\n  // Inverse each color part\n  return rgbArrayToHex(rgb.map((v) => 255 - v));\n}\n\n\n/**\n * Determine the luminance of a color\n * Uses coefficients from http://stackoverflow.com/a/3943023/112731\n *\n * Note: Color must be in hex format (e.g. \"#RRGGBB\").\n * @param color Hex color string\n * @returns th color luminance\n */\nexport function getColorLuminance(color: string): number {\n  const rgb = hexToRgbArray(color);\n  if (!rgb) throw Error('Invalid hex color:' + color);\n\n  // Use coefficients from http://stackoverflow.com/a/3943023/112731\n  return rgb[0] * 0.299 + rgb[1] * 0.587 + rgb[2] * 0.114;\n}\n\n/**\n * Determine if a color is considered light based on perceived luminance.\n *\n * Note: Color must be in hex format (e.g. \"#RRGGBB\").\n * @param color Hex color string\n * @returns true if the color is light, false otherwise\n */\nexport function isLightColor(color: string): boolean {\n  return getColorLuminance(color) > 186;\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  Injector,\n  Input,\n  numberAttribute,\n  OnInit,\n  Optional,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormControl, Validators } from '@angular/forms';\nimport { isBlankString, isNilOrBlank, isNotNil, isNotNilBoolean, isNotNilOrBlank, toBoolean } from '../functions';\nimport { FormFieldDefinition, FormFieldDefinitionUtils, FormFieldType } from './field.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { getColorContrast } from '../graph/colors.utils';\nimport { asInputElement, filterNumberInput, selectInputContentFromEvent } from '../inputs';\nimport { toDateISOString } from '../dates';\nimport { AppColors, AppFloatLabelType, Property } from '../types';\nimport { MatAutocompleteField } from '../material/autocomplete/material.autocomplete';\nimport { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';\n\nconst noop = () => {};\n\n@Component({\n  selector: 'app-form-field',\n  styleUrls: ['./field.component.scss'],\n  templateUrl: './field.component.html',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => AppFormField),\n      multi: true,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppFormField implements OnInit, ControlValueAccessor {\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n  private _definition: FormFieldDefinition<any, any>;\n\n  protected _values: Property[];\n\n  protected type: FormFieldType;\n  protected numberInputStep: string;\n\n  @Input()\n  set definition(value: FormFieldDefinition<any, any>) {\n    if (!value || this._definition === value) return; // Skip is same or nil\n    this._definition = value;\n    this._onDefinitionChanged(value);\n  }\n\n  get definition(): FormFieldDefinition<any, any> {\n    return this._definition;\n  }\n\n  @Input({ transform: booleanAttribute }) readonly = false;\n  @Input({ transform: booleanAttribute }) disabled: boolean;\n\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() placeholder: string;\n  @Input({ transform: booleanAttribute }) compact = false;\n  @Input({ transform: booleanAttribute }) required: boolean;\n  @Input({ transform: booleanAttribute }) hideRequiredMarker = false;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() label: string = null;\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() subscriptSizing: SubscriptSizing;\n  @Input({ transform: numberAttribute }) tabindex: number;\n  @Input({ transform: booleanAttribute }) autofocus: boolean;\n\n  @Input({ transform: booleanAttribute }) clearable: boolean;\n  @Input() chipColor: AppColors = null;\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  @Input('class') classList: string;\n  @Input({ transform: booleanAttribute }) debug = false;\n  @Input() panelClass: string;\n  @Input() panelWidth: string;\n\n  @Output('keyup.enter') onKeyupEnter = new EventEmitter<any>();\n\n  get value(): any {\n    return this.formControl.value;\n  }\n\n  @ViewChild('matInput') matInput: ElementRef;\n  @ViewChild('autocompleteField') autocompleteField: MatAutocompleteField;\n\n  constructor(\n    protected translate: TranslateService,\n    protected cd: ChangeDetectorRef,\n    protected injector: Injector,\n    @Optional() private formGroupDir: FormGroupDirective\n  ) {}\n\n  ngOnInit() {\n    this.checkAndResolveFormControl();\n\n    if (!this._definition) throw new Error(\"Missing mandatory attribute 'definition' in <app-form-field>.\");\n    if (typeof this._definition !== 'object') throw new Error(\"Invalid attribute 'definition' in <app-form-field>. Should be an object.\");\n    this._onDefinitionChanged(this._definition, { emitEvent: false });\n  }\n\n  writeValue(obj: any): void {\n    if ((this.type === 'integer' || this.type === 'double') && Number.isNaN(obj)) {\n      // DEBUG\n      //if (this.debug) console.debug(\"WARN: trying to set NaN value, in an <app-form-field>! Reset to null\");\n\n      obj = null;\n    } else if (this.type === 'boolean' && typeof obj === 'string') {\n      obj = obj !== 'false';\n    } else if (this.type === 'date') {\n      obj = toDateISOString(obj);\n    } else if (this.type === 'enums' && isNotNil(obj)) {\n      let changes = false;\n      if (!Array.isArray(obj)) {\n        // Convert string to array\n        if (typeof obj === 'string') {\n          obj = obj.trim().split(/[|,]+/);\n          changes = true;\n        }\n        // Convert object to array\n        else if (typeof obj === 'object') {\n          obj = [obj];\n          changes = true;\n        }\n      }\n      const updatedArray = (obj || [])\n        .map((item) => {\n          if (typeof item === 'string') {\n            changes = true;\n            return this._values.find((v) => v.key === item.trim());\n          }\n          return item;\n        })\n        .filter(isNotNil);\n      if (changes) {\n        obj = updatedArray;\n      }\n    } else if (this.type === 'entity' && isNilOrBlank(obj)) {\n      obj = null;\n    } else if (this.type === 'entities' && isNotNil(obj)) {\n      let changes = false;\n\n      if (!Array.isArray(obj)) {\n        // Convert string to array\n        if (typeof obj === 'string') {\n          obj = obj.trim();\n          if (obj.startsWith('[') && obj.endsWith(']')) {\n            obj = JSON.parse(obj);\n          } else {\n            obj = obj.split(/[|,]+/);\n          }\n          changes = true;\n        }\n        // Convert object to array\n        else if (typeof obj === 'object') {\n          obj = [obj];\n          changes = true;\n        }\n      }\n      const updatedArray = (obj || [])\n        .map((item) => {\n          if (typeof item === 'string' && item.startsWith('{') && item.endsWith('}')) {\n            item = JSON.parse(item);\n            changes = true;\n            return item;\n          }\n          return item;\n        })\n        .filter(isNotNilOrBlank);\n      if (changes) {\n        obj = updatedArray;\n      }\n    }\n    if (obj !== this.formControl.value) {\n      // DEBUG\n      //if (this.debug) console.debug(\"Set <app-form-field> value: \", obj);\n\n      this.formControl.patchValue(obj, { emitEvent: false });\n      this._onChangeCallback(obj);\n    }\n\n    this.cd.markForCheck();\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(disabled: boolean): void {\n    if (this.disabled === disabled) return; // Skip if same\n    this.disabled = disabled;\n    this.cd.markForCheck();\n  }\n\n  markAsTouched() {\n    if (this.formControl.touched) {\n      this.cd.markForCheck();\n      this._onTouchedCallback();\n    }\n  }\n\n  filterAlphanumericalInput(event: KeyboardEvent) {\n    if (event.code === 'Enter' && this.onKeyupEnter.observed) {\n      this.onKeyupEnter.emit(event);\n      return;\n    }\n    // Add features (e.g. check against a pattern)\n  }\n\n  focus() {\n    if (this.matInput) this.matInput.nativeElement.focus();\n    else if (this.autocompleteField) this.autocompleteField.focus();\n  }\n\n  filterNumberInput = filterNumberInput;\n  selectInputContentFromEvent = selectInputContentFromEvent;\n  getDisplayValueFn = FormFieldDefinitionUtils.getDisplayValueFn;\n\n  getColorContrast(color: string): string | undefined {\n    return isNotNilOrBlank(color) ? getColorContrast(color, true) : undefined;\n  }\n\n  /**\n   * Allow to reload values, if not detected\n   *\n   * @param value\n   */\n  reloadItems(value?: any) {\n    if (!this._definition) return;\n\n    this._onDefinitionChanged(this._definition);\n\n    if (this.autocompleteField) {\n      setTimeout(() => this.autocompleteField?.reloadItems(value));\n    }\n  }\n\n  /* -- protected method -- */\n\n  protected computeNumberInputStep(definition: FormFieldDefinition): string {\n    if (definition.maximumNumberDecimals > 0) {\n      let step = '0.';\n      if (definition.maximumNumberDecimals > 1) {\n        for (let i = 0; i < definition.maximumNumberDecimals - 1; i++) {\n          step += '0';\n        }\n      }\n      step += '1';\n      return step;\n    } else {\n      return '1';\n    }\n  }\n\n  protected checkAndResolveFormControl() {\n    if (this.formControl) return; // OK, there is a control\n\n    if (this.formGroupDir) {\n      // Try to find using definition.key, as formControlName\n      if (!this.formControlName && this._definition.key) {\n        this.formControlName = this._definition.key;\n      }\n      const formControlName = (this.formGroupDir.directives || []).find((d) => this.formControlName && d.name === this.formControlName);\n      this.formControl = formControlName && formControlName.control;\n      if (!this.formControl) {\n        this.formControl = this.formGroupDir.form.get(this.formControlName) as UntypedFormControl;\n      }\n    }\n\n    if (!this.formControl) {\n      throw new Error(\"Missing attribute 'formControl' or 'formControlName' in <app-form-field> component.\");\n    }\n  }\n\n  protected _onDefinitionChanged(definition: FormFieldDefinition, opts?: { emitEvent?: boolean }) {\n    this.type = definition.type;\n    if (!this.type) throw new Error(\"Invalid attribute 'definition' in <app-form-field>. Missing type !\");\n\n    this.placeholder = this.placeholder || (this._definition.label && this.translate.instant(this._definition.label));\n    this.required = isNotNilBoolean(this.required)\n      ? this.required\n      : this._definition.required || this.formControl?.validator === Validators.required || isBlankString(this.required);\n    this.disabled = toBoolean(this.disabled, toBoolean(this._definition.disabled, false));\n    this.chipColor = this.chipColor ?? definition.chipColor;\n\n    // double\n    if (this.type === 'double') {\n      this.numberInputStep = this.computeNumberInputStep(definition);\n    } else {\n      this.numberInputStep = null;\n    }\n\n    // enum (or enums)\n    if (this.type === 'enum' || this.type === 'enums') {\n      // Resolve enum values\n      this._values = FormFieldDefinitionUtils.getEnumValues(this.injector, definition.values);\n    } else {\n      this._values = [];\n    }\n\n    // Repaint\n    if (!opts || opts.emitEvent !== false) {\n      this.cd.markForCheck();\n    }\n\n    // Recompute tab index, because if type changed, then matInput can have changed\n    this.updateTabIndex(100);\n  }\n\n  protected updateTabIndex(timeout?: number) {\n    if (this.tabindex && this.tabindex !== -1) {\n      setTimeout(() => {\n        const element = asInputElement(this.matInput);\n        if (element) {\n          element.tabIndex = this.tabindex;\n          this.cd.markForCheck();\n        } else if (this.autocompleteField) {\n          this.autocompleteField.tabindex = this.tabindex;\n        }\n      }, timeout || 0);\n    }\n  }\n}\n","<ng-container [ngSwitch]=\"type\">\n  <!-- integer -->\n  <mat-form-field\n    *ngSwitchCase=\"'integer'\"\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [class]=\"classList\"\n  >\n    @if (placeholder && floatLabel !== 'never') {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n\n    <input\n      matInput\n      #matInput\n      type=\"number\"\n      autocomplete=\"off\"\n      [min]=\"definition.minValue\"\n      [max]=\"definition.maxValue\"\n      pattern=\"-?[0-9]*\"\n      step=\"1\"\n      [appAutofocus]=\"autofocus\"\n      [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n      (keyup.enter)=\"onKeyupEnter.emit($event)\"\n      (keypress)=\"filterNumberInput($event, false)\"\n      [formControl]=\"formControl\"\n      [required]=\"required\"\n      [readonly]=\"readonly\"\n      [tabIndex]=\"tabindex\"\n      (click)=\"selectInputContentFromEvent($event)\"\n    />\n    <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n    <mat-error *ngIf=\"formControl.hasError('min')\">\n      {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate: formControl.errors['min'] }}\n    </mat-error>\n    <mat-error *ngIf=\"formControl.hasError('max')\">\n      {{ (compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate: formControl.errors['max'] }}\n    </mat-error>\n    <mat-error *ngIf=\"formControl.hasError('pattern')\">\n      {{ 'ERROR.FIELD_NOT_VALID_INTEGER' | translate }}\n    </mat-error>\n    <mat-error *ngIf=\"formControl.hasError('integer')\">\n      {{ 'ERROR.FIELD_NOT_VALID_INTEGER' | translate }}\n    </mat-error>\n\n    <button\n      matSuffix\n      *ngIf=\"clearable\"\n      mat-icon-button\n      tabindex=\"-1\"\n      type=\"button\"\n      (click)=\"formControl.reset()\"\n      [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n    >\n      <mat-icon>close</mat-icon>\n    </button>\n\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-form-field>\n\n  <!-- double -->\n  <mat-form-field\n    *ngSwitchCase=\"'double'\"\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [class]=\"classList\"\n  >\n    @if (placeholder && floatLabel !== 'never') {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n\n    <input\n      matInput\n      #matInput\n      type=\"number\"\n      decimal=\"true\"\n      autocomplete=\"off\"\n      [min]=\"definition.minValue\"\n      [max]=\"definition.maxValue\"\n      [appAutofocus]=\"autofocus\"\n      [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n      [step]=\"numberInputStep\"\n      (keyup.enter)=\"onKeyupEnter.emit($event)\"\n      (keypress)=\"filterNumberInput($event, true)\"\n      [formControl]=\"formControl\"\n      [required]=\"required\"\n      [readonly]=\"readonly\"\n      [tabIndex]=\"tabindex\"\n      (click)=\"selectInputContentFromEvent($event)\"\n    />\n    <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n    <mat-error *ngIf=\"formControl.hasError('decimal')\" translate>ERROR.FIELD_NOT_VALID_DECIMAL</mat-error>\n    <mat-error *ngIf=\"formControl.hasError('min')\">\n      {{ (compact ? 'ERROR.FIELD_MIN_COMPACT' : 'ERROR.FIELD_MIN') | translate: formControl.errors['min'] }}\n    </mat-error>\n    <mat-error *ngIf=\"formControl.hasError('max')\">\n      {{ (compact ? 'ERROR.FIELD_MAX_COMPACT' : 'ERROR.FIELD_MAX') | translate: formControl.errors['max'] }}\n    </mat-error>\n    <mat-error *ngIf=\"formControl.hasError('maxDecimals')\">\n      {{\n        (compact ? 'ERROR.FIELD_MAXIMUM_DECIMALS_COMPACT' : 'ERROR.FIELD_MAXIMUM_DECIMALS')\n          | translate: { maxDecimals: definition.maximumNumberDecimals }\n      }}\n    </mat-error>\n\n    <button\n      matSuffix\n      *ngIf=\"clearable\"\n      mat-icon-button\n      tabindex=\"-1\"\n      type=\"button\"\n      (click)=\"formControl.reset()\"\n      [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n    >\n      <mat-icon>close</mat-icon>\n    </button>\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-form-field>\n\n  <!-- boolean -->\n  <mat-boolean-field\n    *ngSwitchCase=\"'boolean'\"\n    #matInput\n    [class]=\"classList\"\n    [formControl]=\"formControl\"\n    [placeholder]=\"placeholder\"\n    [floatLabel]=\"floatLabel\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [compact]=\"compact\"\n    [required]=\"required\"\n    [readonly]=\"readonly\"\n    [tabindex]=\"tabindex\"\n  >\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-boolean-field>\n\n  <!-- date -->\n  <mat-date-field\n    *ngSwitchCase=\"'date'\"\n    #matInput\n    [class]=\"classList\"\n    [formControl]=\"formControl\"\n    [placeholder]=\"compact ? ('COMMON.DATE_PLACEHOLDER' | translate) : placeholder\"\n    [floatLabel]=\"floatLabel\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [required]=\"required\"\n    [clearable]=\"clearable\"\n    [readonly]=\"readonly\"\n    [compact]=\"compact\"\n    [tabindex]=\"tabindex\"\n    [autofocus]=\"autofocus\"\n  >\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-date-field>\n\n  <!-- date time -->\n  <mat-date-time-field\n    *ngSwitchCase=\"'dateTime'\"\n    #matInput\n    [class]=\"classList\"\n    [formControl]=\"formControl\"\n    [placeholder]=\"compact ? ('COMMON.DATE_TIME_PLACEHOLDER' | translate) : placeholder\"\n    [floatLabel]=\"floatLabel\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [required]=\"required\"\n    [clearable]=\"clearable\"\n    [readonly]=\"readonly\"\n    [compact]=\"compact\"\n    [tabindex]=\"tabindex\"\n    [autofocus]=\"autofocus\"\n  >\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-date-time-field>\n\n  <!-- enum -->\n  <mat-form-field\n    *ngSwitchCase=\"'enum'\"\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [class]=\"classList\"\n    [class.mat-form-field-disabled]=\"readonly\"\n  >\n    <ng-content select=\"[matPrefix]\"></ng-content>\n\n    @if (placeholder && floatLabel !== 'never') {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    @if (readonly) {\n      <input matInput hidden type=\"text\" readonly=\"true\" [formControl]=\"formControl\" />\n      <ion-text>{{ formControl.value }}</ion-text>\n    } @else {\n      <mat-select\n        [formControl]=\"formControl\"\n        [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n        [required]=\"required\"\n        [tabindex]=\"tabindex\"\n        (keyup.enter)=\"onKeyupEnter.emit($event)\"\n      >\n        <mat-option *ngFor=\"let item of _values\" [value]=\"item.key\">{{ item.value | translate }}</mat-option>\n      </mat-select>\n    }\n\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n\n    <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-form-field>\n\n  <!-- multi enum -->\n  <mat-chips-field\n    *ngSwitchCase=\"'enums'\"\n    [class]=\"classList\"\n    [placeholder]=\"placeholder\"\n    [floatLabel]=\"floatLabel\"\n    [appearance]=\"appearance\"\n    [formControl]=\"formControl\"\n    [clearable]=\"clearable\"\n    [items]=\"_values\"\n    [displayAttributes]=\"definition.autocomplete?.attributes || ['key', 'value']\"\n    [config]=\"definition.autocomplete\"\n    [showAllOnFocus]=\"true\"\n    [required]=\"required\"\n    [readonly]=\"readonly\"\n    [chipColor]=\"chipColor | matColor\"\n  >\n    <ng-content select=\"[matPrefix]\"></ng-content>\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-chips-field>\n\n  <!-- color -->\n  <mat-form-field\n    *ngSwitchCase=\"'color'\"\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [class]=\"classList\"\n  >\n    <ion-icon margin-right name=\"color-fill\" matPrefix></ion-icon>\n\n    <input\n      matInput\n      autocomplete=\"off\"\n      [appAutofocus]=\"autofocus\"\n      [formControl]=\"formControl\"\n      [style.color]=\"getColorContrast(formControl.value)\"\n      [style.background]=\"formControl.value\"\n      [colorPicker]=\"formControl.value\"\n      (colorPickerChange)=\"writeValue($event)\"\n      [cpSaveClickOutside]=\"true\"\n      cpPosition=\"top\"\n      cpOutputFormat=\"hex\"\n      [cpOKButton]=\"false\"\n      [required]=\"required\"\n      [readonly]=\"readonly\"\n      [tabIndex]=\"tabindex\"\n    />\n    <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-form-field>\n\n  <!-- string -->\n  <mat-form-field\n    *ngSwitchCase=\"'string'\"\n    [floatLabel]=\"floatLabel | asFloatLabelType\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [class]=\"classList\"\n  >\n    @if (placeholder && floatLabel !== 'never') {\n      <mat-label>{{ placeholder }}</mat-label>\n    }\n    <input\n      matInput\n      #matInput\n      autocomplete=\"off\"\n      [appAutofocus]=\"autofocus\"\n      [formControl]=\"formControl\"\n      [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n      [required]=\"required\"\n      [readonly]=\"readonly\"\n      [tabIndex]=\"tabindex\"\n      (click)=\"selectInputContentFromEvent($event)\"\n      (keyup.enter)=\"onKeyupEnter.emit($event)\"\n      (keypress)=\"filterAlphanumericalInput($event)\"\n    />\n    <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n\n    <button\n      matSuffix\n      *ngIf=\"clearable\"\n      mat-icon-button\n      tabindex=\"-1\"\n      type=\"button\"\n      (click)=\"formControl.reset()\"\n      [hidden]=\"formControl.disabled || (formControl | formGetValue | isNilOrBlank)\"\n    >\n      <mat-icon>close</mat-icon>\n    </button>\n\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-form-field>\n\n  <!-- auto-complete -->\n  <mat-autocomplete-field\n    *ngSwitchCase=\"'entity'\"\n    #autocompleteField\n    [class]=\"classList\"\n    [autofocus]=\"autofocus\"\n    [placeholder]=\"placeholder\"\n    [floatLabel]=\"floatLabel\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [formControl]=\"formControl\"\n    [config]=\"definition.autocomplete\"\n    [hideRequiredMarker]=\"hideRequiredMarker\"\n    [clearable]=\"clearable\"\n    [required]=\"required\"\n    [readonly]=\"readonly\"\n    [tabindex]=\"tabindex\"\n    (keyup.enter)=\"onKeyupEnter.emit($event)\"\n    [displayWith]=\"getDisplayValueFn(definition)\"\n    [panelClass]=\"panelClass\"\n    [panelWidth]=\"panelWidth\"\n  >\n    <ng-content select=\"[matPrefix]\"></ng-content>\n    <ng-content select=\"[matSuffix]\"></ng-content>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-autocomplete-field>\n\n  <!-- multi auto-complete -->\n  <mat-chips-field\n    *ngSwitchCase=\"'entities'\"\n    [class]=\"classList\"\n    [placeholder]=\"placeholder\"\n    [floatLabel]=\"floatLabel\"\n    [appearance]=\"appearance\"\n    [subscriptSizing]=\"subscriptSizing\"\n    [formControl]=\"formControl\"\n    [config]=\"definition.autocomplete\"\n    [chipColor]=\"chipColor | matColor\"\n    [clearable]=\"clearable\"\n    [displayWith]=\"getDisplayValueFn(definition)\"\n    [required]=\"required\"\n    [readonly]=\"readonly\"\n    [tabindex]=\"tabindex\"\n    [panelClass]=\"panelClass\"\n    [panelWidth]=\"panelWidth\"\n  >\n    <ng-content select=\"[matPrefix]\"></ng-content>\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </mat-chips-field>\n\n  <!-- other -->\n  <div *ngSwitchDefault>\n    <mat-error *ngIf=\"type\">\n      Unknown type {{ type }} for option {{ definition.key }}. Please report this error.\n    </mat-error>\n    <mat-error *ngIf=\"!type\">Error on option field. Please check console log for details.</mat-error>\n    <div matSuffix>\n      <ng-content select=\"[matSuffix]\"></ng-content>\n    </div>\n    <ng-content select=\"mat-error\"></ng-content>\n  </div>\n</ng-container>\n","import { Directive, Optional } from '@angular/core';\nimport { firstValueFrom, Subject, Subscription } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { FirstOptions, firstPromise } from '../observables';\n\nexport interface IStartableService<T = any> {\n  started: boolean;\n  start(): Promise<T>;\n  stop(): Promise<void>;\n  ready(): Promise<T>;\n}\n\nexport function isStartableService(data: any): data is IStartableService {\n  return typeof data?.['start'] === 'function' && typeof data?.['stop'] === 'function' && typeof data?.['ready'] === 'function';\n}\n\n@Directive()\nexport abstract class StartableService<T = any, O = any> implements IStartableService<T> {\n  readonly startSubject = new Subject<T>();\n  readonly stopSubject = new Subject<void>();\n\n  protected _debug = false;\n  protected _startByReadyFunction = true; // should start when calling ready() ?\n  protected _data: T = null;\n\n  private _started = false;\n  private _startPromise: Promise<T> = null;\n  private _startPrerequisite: () => Promise<any> = null;\n  private _subscription: Subscription = null;\n\n  protected constructor(@Optional() prerequisiteService?: { ready: () => Promise<any> }) {\n    this._startPrerequisite = prerequisiteService ? () => prerequisiteService.ready() : () => Promise.resolve();\n  }\n\n  start(opts?: O): Promise<T> {\n    if (this._startPromise) return this._startPromise;\n    if (this._started) return Promise.resolve(this._data);\n\n    this._startPromise = this._startPrerequisite()\n      .then(() => this.ngOnStart(opts))\n      .then((data) => {\n        this._data = data;\n\n        this._started = true;\n        this._startPromise = undefined;\n\n        this.startSubject.next(data);\n\n        return data;\n      })\n      .catch((err) => {\n        if (!this.stopped) {\n          console.error('Failed to start a service: ' + ((err && err.message) || err), err);\n          this._startPromise = null;\n          this._started = false;\n        }\n        return null;\n      });\n    return this._startPromise;\n  }\n\n  ready(opts?: FirstOptions): Promise<T> {\n    // Already started\n    if (this._started) return Promise.resolve(this._data);\n\n    // Starting in progress\n    if (this._startPromise) {\n      if (!opts) return this._startPromise;\n      // Continue (wait for the end using options)\n    }\n\n    // Not started, but should launch the start\n    else if (this._startByReadyFunction) {\n      const startPromise = this.start();\n      if (!opts) return startPromise;\n      // Continue (wait for the end using options)\n    }\n\n    // Wait for the  end of the start (without fire start())\n    return firstPromise(this.startSubject, {stop: this.stopSubject, ...opts});\n  }\n\n  async stop() {\n    try {\n      this.unsubscribe();\n      await this.ngOnStop();\n    } catch (err) {\n      console.error('Failed to stop a service: ' + ((err && err.message) || err), err);\n    } finally {\n      this._data = null;\n      this._started = false;\n      this._startPromise = undefined;\n      this.stopSubject.next();\n    }\n  }\n\n  async restart(opts?: O): Promise<T> {\n    if (this._startPromise) await this._startPromise; // Wait end of previous start, if running\n    if (this._started) await this.stop(); // Then stop if started\n    return this.start(opts); // Then start again\n  }\n\n  get started(): boolean {\n    return this._started;\n  }\n\n  get starting(): boolean {\n    return !!this._startPromise;\n  }\n\n  get stopped(): boolean {\n    return !this._started && !this._startPromise;\n  }\n\n  protected registerSubscription(sub: Subscription) {\n    this._subscription = this._subscription || new Subscription();\n    this._subscription.add(sub);\n  }\n\n  protected unregisterSubscription(sub: Subscription): void {\n    this._subscription?.remove(sub);\n  }\n\n  protected unsubscribe() {\n    this._subscription?.unsubscribe();\n    this._subscription = null;\n  }\n\n  protected ngOnStop(): Promise<void> | void {\n    // Can be overwritten by subclasses\n  }\n\n  protected abstract ngOnStart(opts?: O): Promise<T>;\n}\n","import { Injectable, Optional } from '@angular/core';\nimport { Platform } from '@ionic/angular';\nimport { AudioManagement, AudioMode, AudioModeReturn } from '@awesome-cordova-plugins/audio-management/ngx';\nimport { isNil, sleep, toBoolean } from '../functions';\nimport { StartableService } from '../services/startable-service.class';\nimport { Haptics } from '@capacitor/haptics';\nimport { NativeAudio } from '@capacitor-community/native-audio';\nimport { Capacitor } from '@capacitor/core';\n\nexport type AudioType = 'html5' | 'native';\nexport interface Sound {\n  assetId: string; // unique identifier of the file\n  assetPath: string; //  relative path of the file or absolute url (file://)\n  volume?: number; // Sound volume\n  isUrl?: boolean; // pass true if assetPath is a `file://` url\n  time?: number; // sound seek time\n  audioChannelNum?: number; // number of audio channels\n  vibration?: number | number[]; // Should vibrate ? set duration\n}\n\nconst SYSTEM_SOUNDS: Sound[] = [\n  { assetId: 'startup', assetPath: 'assets/audio/unfa-ping.mp3', vibration: [300, 250, 750] },\n  { assetId: 'beep-confirm', assetPath: 'assets/audio/beep-confirm.mp3', vibration: 250 },\n  { assetId: 'beep-error', assetPath: 'assets/audio/beep-error.mp3', vibration: 1000 },\n  { assetId: 'beep-notification', assetPath: 'assets/audio/beep-notification.mp3', vibration: [450, 150, 450] },\n];\n\nconst DEFAULT_AUDIO_MODE_RETURN: AudioModeReturn = {\n  audioMode: AudioMode.NORMAL,\n  label: 'Normal',\n};\n\nfunction audioModeToString(mode: AudioMode) {\n  switch (mode) {\n    case AudioMode.SILENT:\n      return 'Silent';\n    case AudioMode.NORMAL:\n      return 'Normal';\n    case AudioMode.VIBRATE:\n      return 'Vibrate';\n  }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AudioProvider extends StartableService<void> {\n  private _audioType: AudioType;\n  private _audioMode: AudioMode = AudioMode.NORMAL;\n  private _enableAudioManagment = false;\n  private _assetPathPrefix = '';\n\n  private _preloadedSounds: { [id: string]: Sound } = {};\n  private _htmlAudioCache: { [id: string]: HTMLAudioElement } = {};\n\n  constructor(\n    protected platform: Platform,\n    @Optional() private audioManagement: AudioManagement\n  ) {\n    super(platform);\n    console.info(`[audio] Create audio provider`);\n  }\n\n  protected async ngOnStart(): Promise<void> {\n    const cordova = this.platform.is('cordova');\n    this._assetPathPrefix = cordova ? 'public/' : '';\n    this._audioType = cordova && Capacitor.isPluginAvailable('NativeAudio') ? 'native' : 'html5';\n    this._enableAudioManagment = cordova && this.audioManagement && this.platform.is('android');\n    console.info(`[audio] Starting audio provider {type: ${this._audioType}, management: ${this._enableAudioManagment}}...`);\n\n    // Listen audio mode changed\n    if (this._enableAudioManagment) {\n      await this.readAudioMode();\n    }\n\n    // Pre-loading system sounds\n    console.debug('[audio] Preloading audio sounds...');\n    let errorCount = 0;\n    await Promise.all(\n      SYSTEM_SOUNDS.map((s) => {\n        // Disable vibration in HTML 5 mode\n        if (this._audioType === 'html5') s.vibration = undefined;\n        return this.preload(s).catch((_) => errorCount++);\n      })\n    );\n\n    if (errorCount > 0) {\n      console.warn('[audio] Preloading audio sounds [OK] with ${errorCount} errors during preload.');\n    } else {\n      console.debug('[audio] Preloading audio sounds [OK]');\n    }\n  }\n\n  playBeepConfirm(): Promise<any> {\n    return this.play('beep-confirm', {\n      // Vibrate only if in vibration mode\n      vibrate: this._audioMode === AudioMode.VIBRATE,\n    });\n  }\n\n  playBeepError(): Promise<any> {\n    return this.play('beep-error', {\n      // Always vibrate (will skip vibration if silent mode)\n      vibrate: true,\n    });\n  }\n\n  async playBeepNotification(): Promise<any> {\n    await this.play('beep-notification', {\n      vibrate: this._audioMode === AudioMode.VIBRATE,\n    });\n  }\n\n  async playStartupSound(): Promise<any> {\n    return this.play('startup');\n  }\n\n  async preload(sound: Sound) {\n    if (!sound?.assetId) return; // Skip\n    if (this._preloadedSounds[sound.assetId]) return; // Already preloaded\n    if (isNil(this._audioType)) await this.ready();\n\n    const assetPath = (this._assetPathPrefix || '') + sound.assetPath;\n    console.info(`[audio] Preloading sound '${sound.assetId}', from file '${assetPath}'...`);\n\n    try {\n      if (this._audioType === 'native') {\n        this._preloadedSounds[sound.assetId] = sound;\n        await NativeAudio.preload({\n          audioChannelNum: 1,\n          isUrl: false,\n          ...sound,\n          assetPath,\n        });\n      } else {\n        this._htmlAudioCache[sound.assetId] = new Audio(assetPath);\n        this._preloadedSounds[sound.assetId] = sound;\n      }\n\n      // Add to map\n      console.info(`[audio] Preloading sound '${sound.assetId}' [OK]`);\n    } catch (err) {\n      const errorMsg = err?.message || err;\n      if (errorMsg === 'Audio Asset already exists') {\n        console.info(`[audio] Preloading sound '${sound.assetId}': Skipped (${errorMsg})`);\n      } else {\n        this._preloadedSounds[sound.assetId] = null;\n        console.error(`[audio] Unable to preload sound '${sound.assetId}', from file '${assetPath}': ${errorMsg}\\n${err?.originalStack || ''}`);\n        throw err;\n      }\n    }\n  }\n\n  async play(assetId: string, opts?: { vibrate?: boolean; vibration?: number | number[] }) {\n    // Make sure provider is ready\n    if (!this.started) await this.ready();\n\n    const sound = this._preloadedSounds[assetId];\n    if (!sound) {\n      throw Error(`Unable to find sound '${assetId}'. Please call preload() before playing a sound.`);\n    }\n\n    // If silent: skip\n    if (this._audioMode === AudioMode.SILENT) return;\n\n    const promises: Promise<any>[] = [];\n\n    // Normal mode = can play the sound\n    if (this._audioMode === AudioMode.NORMAL) {\n      // Use native audio\n      if (this._audioType === 'native') {\n        promises.push(\n          NativeAudio.play({\n            assetId: sound.assetId,\n            time: sound.time || 0,\n          })\n        );\n      }\n      // Or HTML 5 audio\n      else {\n        const audio = this._htmlAudioCache[assetId] || new Audio(sound.assetPath);\n        promises.push(audio.play());\n      }\n    }\n\n    // Vibrate mode: by default make vibration is enable\n    else if (isNil(sound.vibration) && isNil(opts && opts.vibrate)) {\n      opts = opts || {};\n      opts.vibrate = true;\n    }\n\n    // Do vibration (if sound as default vibration, or if user ask for it)\n    if (toBoolean(opts?.vibrate, !!sound.vibration)) {\n      promises.push(this.vibrate((opts && opts.vibration) || sound.vibration));\n    }\n\n    return (promises.length === 1 ? promises[0] : Promise.all(promises)).catch((err) => {\n      console.error(`[audio] Error while playing audio sound '${assetId}': ${(err && err.message) || err}`, err);\n    });\n  }\n\n  async unload(assetId: string) {\n    if (isNil(this._audioType)) await this.ready();\n\n    // Remove from map\n    this._preloadedSounds[assetId] = undefined;\n\n    // Native unload\n    if (this._audioType === 'native') {\n      try {\n        await NativeAudio.unload({ assetId });\n      } catch (err) {\n        console.error(`[audio] Unable to unload audio '${assetId}': ${(err && err.message) || err}`, err);\n      }\n    }\n    // HTML5 audio unload\n    else {\n      this._htmlAudioCache[assetId].remove();\n      this._htmlAudioCache[assetId] = undefined;\n    }\n  }\n\n  /**\n   *\n   * @param duration Duration of the vibration in milliseconds.\n   */\n  async vibrate(duration?: number | number[]) {\n    if (!this.started) await this.ready();\n    if (Array.isArray(duration)) {\n      if (this._debug) console.debug('[audio] Vibrate: ' + JSON.stringify(duration));\n      for (let i = 0; i < duration.length; i++) {\n        const time = duration[i];\n        const silent = i % 2 !== 0;\n        if (silent) {\n          if (this._debug) console.debug('[audio] silent during ' + time);\n          await sleep(time);\n        } else {\n          if (this._debug) console.debug('[audio] vibrate during ' + time);\n          await Promise.all([Haptics.vibrate({ duration: time }), sleep(time)]);\n        }\n      }\n    } else {\n      if (this._debug) console.debug('[audio] vibrate during ' + duration);\n      await Haptics.vibrate({ duration });\n    }\n  }\n\n  async setAudioMode(mode: AudioMode): Promise<void> {\n    if (!this._enableAudioManagment) {\n      console.debug(`[audio] Cannot change audio mode to {${audioModeToString(mode)}} - skipping`);\n      return;\n    }\n\n    try {\n      console.info(`[audio] Changing audio mode to {${audioModeToString(mode)}}`);\n      await this.audioManagement.setAudioMode(mode);\n      this._audioMode = mode;\n    } catch (err) {\n      console.error(`[audio] Error while changing audio mode to {${audioModeToString(mode)}}: ${err?.message || err}`, err);\n      // Continue\n    }\n  }\n\n  /* -- protected methods  -- */\n\n  protected async readAudioMode() {\n    let value = await this.audioManagement.getAudioMode();\n    value = {\n      ...DEFAULT_AUDIO_MODE_RETURN,\n      ...value,\n    };\n    console.debug(`[audio] Detected audio mode {label: '${value.label}', audioMode: ${value.audioMode}}`);\n    this._audioMode = value.audioMode;\n  }\n}\n","import { Component, Inject } from '@angular/core';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\n\n@Component({\n  templateUrl: './hotkeys-dialog.component.html',\n  styleUrls: ['./hotkeys-dialog.component.scss'],\n})\nexport class HotkeysDialogComponent {\n  hotkeys: any[];\n\n  constructor(@Inject(MAT_DIALOG_DATA) protected data: any) {\n    this.hotkeys = Array.from(this.data);\n  }\n}\n","<table class=\"ion-padding\">\n  <tbody>\n    <tr *ngFor=\"let keys of hotkeys\">\n      <td>{{ keys[1] | translate }}</td>\n\n      <td class=\"text-right\">\n        <kbd>{{ keys[0] }}</kbd>\n      </td>\n    </tr>\n  </tbody>\n</table>\n","import { Inject, inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { EventManager } from '@angular/platform-browser';\nimport { delay, Observable } from 'rxjs';\nimport { DOCUMENT } from '@angular/common';\nimport { HotkeysDialogComponent } from './dialog/hotkeys-dialog.component';\nimport { isNotNilOrBlank } from '../functions';\nimport { ModalController, Platform, PopoverController } from '@ionic/angular';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { first } from 'rxjs/operators';\nimport { isMacOS } from '../platforms';\n\ninterface Options {\n  element: any;\n  elementName: string;\n  description: string | undefined;\n  keys: string;\n  preventDefault: boolean;\n}\n\nexport interface HotKeysConfig {\n  /**\n   * Shortcut to open the hotkeys help modal\n   */\n  openHelpModalShortcut: string;\n\n  /**\n   * Enable the hotkeys help modal\n   */\n  enableHelpModal: boolean;\n}\n\nexport const APP_HOTKEYS_CONFIG = new InjectionToken<Partial<HotKeysConfig>>('HotKeysConfig');\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class Hotkeys {\n  private _debug = false;\n  private _id: number = 0;\n  private _hotkeys = new Map<number, Options>();\n  private _document = inject(DOCUMENT);\n  private _defaults: Partial<Options> = {\n    element: this._document,\n    preventDefault: true,\n  };\n  private _dialogRef: MatDialogRef<any>;\n  private _config: Partial<HotKeysConfig>;\n\n  readonly defaultControlKey: string;\n  readonly defaultControlKeyName: string;\n\n  get isHelpModalOpened() {\n    return !!this._dialogRef;\n  }\n\n  constructor(\n    platform: Platform,\n    private eventManager: EventManager,\n    private dialog: MatDialog,\n    private modalController: ModalController,\n    private popoverController: PopoverController,\n    @Optional() @Inject(APP_HOTKEYS_CONFIG) config?: Partial<HotKeysConfig>\n  ) {\n    this._config = {\n      enableHelpModal: true,\n      openHelpModalShortcut: 'F1',\n      ...config,\n    };\n\n    // Add shortcut to open help modal\n    if (this._config.enableHelpModal) {\n      if (this._debug) console.debug(`[hotkeys] Starting hotkeys service... Press ${this._config.openHelpModalShortcut} to get help modal.`);\n\n      this.addShortcut({ keys: this._config.openHelpModalShortcut }).subscribe(() => this.toggleHelpModal());\n    }\n\n    const isMac = isMacOS(window);\n    this.defaultControlKey = isMac ? 'meta' : 'control';\n    this.defaultControlKeyName = isMac ? '⌘' : 'Ctrl';\n\n    // For DEV only\n    //this._debug = !environment.production;\n  }\n\n  addShortcut(options: Partial<Options>): Observable<KeyboardEvent> {\n    const merged = <Options>{ ...this._defaults, ...options };\n    if (!merged.keys) throw new Error(\"Missing 'keys' or 'description' attribute\");\n    const event = `keydown.${merged.keys}`;\n    const id = this._id++;\n\n    this._hotkeys.set(id, merged);\n\n    if (isNotNilOrBlank(merged.description)) {\n      if (this._debug) console.debug(`[hotkeys] Add shortcut {${options.keys}}: ${merged.description}`);\n    } else {\n      if (this._debug) console.debug(`[hotkeys] Add shortcut {${options.keys}}`);\n    }\n\n    return new Observable((observer) => {\n      const handler = async (e: KeyboardEvent) => {\n        // Get top component from ModalController\n        const top = (await this.modalController.getTop()) || (await this.popoverController.getTop());\n        // If modal present, check its component name against hotkey element name (fix #181)\n        if (top && top.component['name'] !== merged.elementName) {\n          if (merged.preventDefault) e.preventDefault();\n          return;\n        }\n        if (e instanceof KeyboardEvent && e.repeat) return; // skip when repeated\n        if (merged.preventDefault) e.preventDefault();\n        if (this._debug) console.debug(`[hotkeys] Shortcut {${options.keys}} detected...`);\n        observer.next(e);\n      };\n\n      const dispose = this.eventManager.addEventListener(merged.element, event, handler);\n\n      return () => {\n        dispose();\n        this._hotkeys.delete(id);\n      };\n    });\n  }\n\n  toggleHelpModal() {\n    if (this.isHelpModalOpened) {\n      this.closeHelpModal();\n    } else {\n      this.openHelpModal();\n    }\n  }\n\n  openHelpModal() {\n    if (this.isHelpModalOpened) return; // Skip if already opened\n\n    // Get keys with a not blank description\n    const hotkeys = Array.from(this._hotkeys.values()).reduce((map, item: Options) => {\n      if (isNotNilOrBlank(item?.description)) {\n        map.set(item.keys, item.description);\n      }\n      return map;\n    }, new Map());\n\n    if (hotkeys.size === 0) return; // Nothing to display\n\n    this._dialogRef = this.dialog.open(HotkeysDialogComponent, {\n      width: '500px',\n      data: hotkeys,\n    });\n    this._dialogRef\n      .afterClosed()\n      .pipe(\n        first(),\n        // Avoid too many call (e.g. in Safari)\n        delay(250)\n      )\n      .subscribe(() => {\n        // Forget the dialog ref\n        this._dialogRef = null;\n        console.debug('[hotkeys] Closing help modal');\n      });\n  }\n\n  closeHelpModal() {\n    this._dialogRef?.close(true);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { Hotkeys } from './hotkeys.service';\nimport { HotkeysDialogComponent } from './dialog/hotkeys-dialog.component';\nimport { MatCommonModule } from '@angular/material/core';\nimport { MatDialogModule } from '@angular/material/dialog';\n\n@NgModule({\n  imports: [CommonModule, MatCommonModule, MatDialogModule, TranslateModule.forChild()],\n  exports: [HotkeysDialogComponent],\n  declarations: [HotkeysDialogComponent],\n  providers: [Hotkeys],\n})\nexport class SharedHotkeysModule {}\n","import { Observable } from 'rxjs';\nimport { HttpEvent, HttpEventType, HttpProgressEvent, HttpResponse } from '@angular/common/http';\nimport { isNotNil } from '../functions';\n\nexport class UploadFile<T> extends File {\n  progress?: number;\n  deleting?: boolean;\n  error?: string;\n\n  response?: FileResponse<T> | HttpResponse<T>;\n}\n\nexport type FileUploadFn<T> = (file: File) => Observable<FileEvent<T> | HttpEvent<T>>;\nexport type FileDeleteFn<T> = (file: UploadFile<T>) => Promise<boolean>;\nexport interface FileProgressEvent {\n  type: HttpEventType.DownloadProgress | HttpEventType.UploadProgress;\n  loaded: number;\n  total?: number;\n  statusText?: string;\n}\nexport class FileResponse<T> {\n  readonly body: T | null;\n  readonly type = HttpEventType.Response;\n  readonly status: number;\n  readonly statusText: string;\n  constructor(init?: { body?: T | null; statusText?: string; status?: number }) {\n    this.body = isNotNil(init?.body) ? init.body : null;\n    this.status = init?.status || 0;\n    this.statusText = init?.statusText || 'OK';\n  }\n}\n\nexport type FileEvent<T> = HttpProgressEvent | HttpResponse<T> | FileProgressEvent | FileResponse<T>;\n\nexport function isProgressEvent(event: HttpEvent<any> | FileEvent<any>): event is HttpProgressEvent | FileProgressEvent {\n  return event && (event.type === HttpEventType.UploadProgress || event.type === HttpEventType.DownloadProgress);\n}\nexport function isResponseEvent<T>(event: HttpEvent<T> | FileEvent<T>): event is HttpResponse<T> | FileResponse<T> {\n  return event && event.type === HttpEventType.Response;\n}\n","import { isNilOrBlank } from '../functions';\nimport { Observable, Subject } from 'rxjs';\nimport { FileEvent, FileResponse } from '../upload-file/upload-file.model';\nimport { HttpEventType } from '@angular/common/http';\nimport { mergeMap } from 'rxjs/operators';\nimport {stringToU8a} from '@polkadot/util';\nimport {CryptoService} from '../../core/services/crypto.service';\nimport {base64Decode} from '@polkadot/util-crypto';\n\nexport const IMAGE_DEFAULTS = {\n  MAX_HEIGHT: 480,\n  MAX_WIDTH: 640,\n  THUMB_MAX_HEIGHT: 200,\n  THUMB_MAX_WIDTH: 200,\n};\n\nexport declare interface ImageResizeOptions {\n  maxWidth?: number;\n  maxHeight?: number;\n  thumbnail?: boolean;\n}\n\n// @dynamic\nexport class ImagesUtils {\n  /**\n   * Parse a string like `<path>|<credit>` into an object `{image, credit}`\n   * @param file\n   **/\n  static getImageAndCredit(file: string): { image: string; credits: string } {\n    const parts = file?.split('|');\n    return parts\n      ? {\n          image: parts[0],\n          credits: parts[1],\n        }\n      : null;\n  }\n\n  /**\n   * @param files\n   * @deprecated Use getRandomImageWithCredit() instead\n   **/\n  static getRandomImage(files: string[]): string | undefined {\n    const imgIndex = Math.floor(Math.random() * files.length);\n    return files[imgIndex];\n  }\n\n  static getRandomImageWithCredit(files: string[]): { image: string; credits: string } {\n    const imgIndex = Math.floor(Math.random() * files.length);\n    return ImagesUtils.getImageAndCredit(files[imgIndex]);\n  }\n\n  static readAsDataURL(file: File, opts?: ImageResizeOptions): Observable<FileEvent<string>> {\n    const $progress = new Subject<FileEvent<string>>();\n    const reader = new FileReader();\n\n    // Listen progress\n    reader.onprogress = (e: ProgressEvent) => {\n      const total = e.total || 1;\n      const loaded = e.total || 0;\n      if (loaded < total) $progress.next({ type: HttpEventType.UploadProgress, loaded, total });\n    };\n\n    // Listen end\n    reader.onloadend = (_: ProgressEvent) => {\n      const body = reader.result;\n      if (typeof body === 'string') {\n        $progress.next(new FileResponse({ body }));\n        $progress.complete();\n      } else {\n        console.error(`[image-utils] Cannot read file '${file.name}' as text`);\n        $progress.error(`Cannot read file as text`);\n      }\n    };\n\n    // Listen error\n    reader.onerror = (event: ProgressEvent) => {\n      console.error('[image-utils] Error while reading file:', event);\n      $progress.error(event);\n    };\n\n    // Start reading the file\n    reader.readAsDataURL(file);\n\n    // Resize image, if need\n    if (opts) {\n      return $progress.pipe(\n        mergeMap(async (event) => {\n          if (event instanceof FileResponse) {\n            const body = await ImagesUtils.resizeBase64(event.body, opts);\n            return new FileResponse({ body });\n          }\n          return event;\n        })\n      );\n    }\n\n    return $progress.asObservable();\n  }\n\n  static async readAndResizeFromUrl(fileUrl: string, opts?: ImageResizeOptions): Promise<string> {\n    if (isNilOrBlank(fileUrl)) throw new Error('Illegal argument: missing fileUrl');\n\n    // Create the temporary image element\n    const img = document.createElement('img');\n\n    // Need to avoid CORS error\n    // (see https://stackoverflow.com/questions/22710627/tainted-canvases-may-not-be-exported)\n    img.crossOrigin = 'anonymous';\n\n    try {\n      return await new Promise<string>((resolve, reject) => {\n        img.addEventListener('load', ImagesUtils.createImageOnLoadResizeFn(resolve, reject, opts), false);\n        img.addEventListener('error', reject);\n        img.src = fileUrl;\n      });\n    } catch (err) {\n      throw new Error(`Failed to load and resize image {${fileUrl}}`);\n    } finally {\n      img.remove();\n    }\n  }\n\n  static async resizeBase64(dataUrl: string, opts?: ImageResizeOptions): Promise<string> {\n    // Create the temporary image element\n    const img = document.createElement('img');\n\n    // Need to avoid CORS error\n    // (see https://stackoverflow.com/questions/22710627/tainted-canvases-may-not-be-exported)\n    img.crossOrigin = 'anonymous';\n\n    try {\n      return await new Promise<string>((resolve, reject) => {\n        img.addEventListener('load', ImagesUtils.createImageOnLoadResizeFn(resolve, reject, opts), false);\n        img.addEventListener('error', reject);\n        img.src = dataUrl;\n      });\n    } finally {\n      img.remove();\n    }\n  }\n\n  protected static createImageOnLoadResizeFn(resolve, reject, opts?: ImageResizeOptions) {\n    return function (event) {\n      const maxWidth = opts && opts.thumbnail ? IMAGE_DEFAULTS.THUMB_MAX_WIDTH : (opts && opts.maxWidth) || IMAGE_DEFAULTS.MAX_WIDTH;\n      const maxHeight = opts && opts.thumbnail ? IMAGE_DEFAULTS.THUMB_MAX_HEIGHT : (opts && opts.maxHeight) || IMAGE_DEFAULTS.MAX_HEIGHT;\n      let width = event.target.width;\n      let height = event.target.height;\n\n      const canvas = document.createElement('canvas');\n      let ctx;\n\n      try {\n        // Thumbnail: resize and crop (to the expected size)\n        if (opts && opts.thumbnail) {\n          // landscape\n          if (width > height) {\n            width *= maxHeight / height;\n            height = maxHeight;\n          }\n\n          // portrait\n          else {\n            height *= maxWidth / width;\n            width = maxWidth;\n          }\n          canvas.width = maxWidth;\n          canvas.height = maxHeight;\n          ctx = canvas.getContext('2d');\n          const xoffset = Math.trunc((maxWidth - width) / 2 + 0.5);\n          const yoffset = Math.trunc((maxHeight - height) / 2 + 0.5);\n          ctx.drawImage(\n            event.target,\n            xoffset, // x1\n            yoffset, // y1\n            maxWidth + -2 * xoffset, // x2\n            maxHeight + -2 * yoffset // y2\n          );\n        }\n\n        // Resize, but keep the full image\n        else {\n          // landscape\n          if (width > height) {\n            if (width > maxWidth) {\n              height *= maxWidth / width;\n              width = maxWidth;\n            }\n          }\n\n          // portrait\n          else {\n            if (height > maxHeight) {\n              width *= maxHeight / height;\n              height = maxHeight;\n            }\n          }\n\n          canvas.width = width;\n          canvas.height = height;\n          ctx = canvas.getContext('2d');\n\n          // Resize the whole image\n          ctx.drawImage(event.target, 0, 0, canvas.width, canvas.height);\n        }\n\n        // Get image content as data URL\n        const base64 = canvas.toDataURL();\n        resolve(base64);\n      } catch (err) {\n        reject(err);\n      } finally {\n        canvas.remove();\n      }\n    };\n  }\n\n  static getBase64MimeType(\n      base64: string\n  ): string | undefined {\n    if (!base64 || typeof base64 !== 'string') return undefined;\n\n    const mimeTypeMatch = base64.match(/^data:(image\\/\\w+);base64,/);\n    return mimeTypeMatch ? mimeTypeMatch[1] : undefined;\n  }\n\n  static getMimeTypeFileExtension(\n    mimeType: string\n  ): string | undefined {\n    if (!mimeType || typeof mimeType !== 'string') return undefined;\n\n    const extensionMatch = mimeType.match(/image\\/(\\w+)/);\n    return extensionMatch ? extensionMatch[1] : undefined;\n  }\n\n  static writeBase64ToFile(\n    base64: string,\n    opts?: {\n      type?: string;\n      filename?: string;\n    }) {\n    if (!base64 || typeof base64 !== 'string') return; // Skip if empty\n\n    const type = this.getBase64MimeType(base64);\n    const filename = opts?.filename ?? 'export.' + this.getMimeTypeFileExtension(type);\n    opts = {\n      type,\n      filename,\n      ...opts,\n    };\n\n    // Extract base64 data (remove the data:image/...;base64, prefix)\n    const base64Data = base64.split(',', 2)[1] || base64;\n\n    // Decode base64 to Uint8Array directly\n    const arrayUt8 = base64Decode(base64Data);\n\n    const blob = new Blob([arrayUt8], {type: opts.type});\n    blob['lastModifiedDate'] = new Date().toISOString();\n    blob['name'] = opts.filename;\n\n    return <File>blob;\n  }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { Platform } from '@ionic/angular';\nimport { ImagesUtils, ImageResizeOptions } from './images.utils';\nimport { chainPromises, firstNotNilPromise } from '../observables';\nimport { HttpClient } from '@angular/common/http';\nimport { ENVIRONMENT } from '../../../environments/environment.class';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Injectable({\n  providedIn: 'root',\n  deps: [Platform, HttpClient, ENVIRONMENT],\n})\nexport class FileService {\n  private readonly _debug: boolean;\n  private _started = false;\n\n  private _imageDirectory: string;\n\n  get canUseFileSystem(): boolean {\n    return false;\n    // FIXME: seems not working well\n    //return !!this.file.dataDirectory;\n  }\n\n  constructor(\n    private platform: Platform,\n    //private transfer: FileTransfer,\n    //@Optional() private file: File,\n    private http: HttpClient,\n    @Inject(ENVIRONMENT) protected environment\n  ) {\n    this._debug = !environment.production;\n\n    platform.ready().then(() => this.start());\n  }\n\n  getImages(\n    sources: string[],\n    opts?: ImageResizeOptions & {\n      outputType?: 'fileUrl' | 'dataUrl';\n    }\n  ): Promise<string[]> {\n    if (!this._started) throw new Error('Platform must be started first!');\n\n    //const fileTransfer = this.canUseFileSystem ? this.transfer.create() : undefined;\n    //const jobsFactories = (sources || []).map(source => () => this.getImage(source, {...opts, fileTransfer}));\n\n    const jobsFactories = (sources || []).map((source) => () => this.getImage(source, { ...opts }));\n    return chainPromises<string>(jobsFactories);\n  }\n\n  async getImage(\n    fileUrl: string,\n    opts?: ImageResizeOptions & {\n      outputType?: 'fileUrl' | 'dataUrl';\n    }\n  ): Promise<string> {\n    let outputType = (opts && opts.outputType) || (this.canUseFileSystem ? 'fileUrl' : 'dataUrl');\n\n    const debug = this._debug; /*&& (!opts || !opts.fileTransfer)*/\n    const now = debug && Date.now();\n    if (debug) console.debug(`[file] Fetching image {${fileUrl}} into ${outputType}...`);\n\n    // Read the filename\n    const lastSlashIndex = fileUrl.lastIndexOf('/');\n    if (lastSlashIndex === -1) throw new Error('Invalid URL: ' + fileUrl);\n    const fileName = (lastSlashIndex < fileUrl.length - 1 && fileUrl.substring(lastSlashIndex + 1)) || uuidv4();\n\n    // Download into the file system\n    if (outputType === 'fileUrl' && this.canUseFileSystem) {\n      console.warn(`WARN: [file] Downloading image {${fileUrl}} in local filesystem...`);\n      const targetFilePath = this._imageDirectory + fileName;\n      try {\n        const blob: Blob = await firstNotNilPromise(\n          this.http.get(fileUrl, {\n            observe: 'body',\n            responseType: 'blob',\n            reportProgress: false,\n          })\n        );\n        console.debug('[file] Getting blob :' + blob.type);\n\n        //await this.file.writeFile(this._imageDirectory, fileName, blob, {replace: true});\n\n        //const fileTransfer = (opts && opts.fileTransfer) || this.transfer.create();\n        //await fileTransfer.download(source, targetFilePath);\n        if (debug) console.debug(`[file] Fetching image {${fileUrl}} into ${outputType} [OK] in ${Date.now() - now}ms`);\n        return targetFilePath;\n      } catch (err) {\n        console.error(`[file] Error while download ${fileUrl}: ${(err && err.message) || err}`);\n\n        // Continue (fallback to data Url)\n        outputType = 'dataUrl';\n      }\n    }\n\n    if (outputType === 'dataUrl') {\n      // Get as data url (e.g. 'data:image/png:...')\n      const dataUrl = await ImagesUtils.readAndResizeFromUrl(fileUrl, opts);\n      if (debug) console.debug(`[file] Fetching image {${fileUrl}} into ${outputType} [OK] in ${Date.now() - now}ms`);\n      return dataUrl;\n    }\n\n    // Keep original URL\n    return fileUrl;\n  }\n\n  /* -- protected methods -- */\n\n  protected start() {\n    // File system exists\n    if (this.canUseFileSystem) {\n      //console.info(\"[file] Application directory: \", this.file.applicationDirectory);\n      //console.info(\"[file] Application storage directory: \", this.file.applicationStorageDirectory);\n      //console.info(\"[file] Data directory: \", this.file.dataDirectory);\n      // this.file.createDir(this.file.dataDirectory, 'images', false)\n      //   .then((dir) => {\n      //     this._imageDirectory = this.file.dataDirectory + 'images/';\n      //     console.info(\"[file] Images directory: \", dir.fullPath);\n      //   })\n      //   .catch(err => {\n      //     console.error(\"[file] Cannot create the images directory: \" + (this.file.dataDirectory + 'images/ : ' + (err && err.message || err)));\n      //     this._imageDirectory = this.file.dataDirectory;\n      //   });\n    }\n\n    this._started = true;\n  }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n  selector: 'app-loading-spinner',\n  template: `\n    <ion-spinner *ngIf=\"loading; else content\" [color]=\"color\" [name]=\"name\"></ion-spinner>\n    <ng-template #content>\n      <ng-content></ng-content>\n    </ng-template>\n  `,\n})\nexport class AppLoadingSpinner {\n  @Input() loading = false;\n  @Input() color: string | undefined = 'secondary';\n  @Input() name: 'bubbles' | 'circles' | 'circular' | 'crescent' | 'dots' | 'lines' | 'lines-small' | undefined;\n}\n","import { MatStepperIntl } from '@angular/material/stepper';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MatStepperI18n extends MatStepperIntl {\n  constructor(private translate: TranslateService) {\n    super();\n    translate.onLangChange.subscribe(() => this.translateLabels());\n\n    this.translateLabels();\n  }\n\n  private translateLabels() {\n    this.optionalLabel = this.translate.instant('COMMON.OPTIONAL');\n  }\n}\n","import { ChangeDetectorRef, Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { catchError, debounceTime, filter, finalize, first, map, switchMap, tap } from 'rxjs/operators';\nimport { BehaviorSubject, forkJoin, Observable, of, Subject } from 'rxjs';\nimport { TranslateService } from '@ngx-translate/core';\nimport { FileDeleteFn, FileUploadFn, isProgressEvent, isResponseEvent, UploadFile } from './upload-file.model';\nimport { isNil, isNotNil } from '../functions';\nimport { waitFor, WaitForOptions } from '../observables';\n\n@Component({\n  selector: 'app-upload-file',\n  templateUrl: './upload-file.component.html',\n  styleUrls: ['./upload-file.component.scss'],\n})\nexport class UploadFileComponent {\n  @ViewChild('fileDropRef', { static: false }) fileDropEl: ElementRef;\n\n  @Input() fileExtension: string;\n  @Input() uniqueFile = false;\n  @Input() instantUpload = false;\n  @Input() uploadFn: FileUploadFn<any>;\n  @Input() deleteFn: FileDeleteFn<any>;\n  @Input() maxParallelUpload: number;\n  @Input() autoHideDropArea = false;\n\n  files: UploadFile<any>[] = [];\n  uploading = false;\n\n  get processingFiles(): UploadFile<any>[] {\n    return this.files.filter((f) => !f.deleting && isNotNil(f.progress) && f.progress < 1);\n  }\n\n  get processedFiles(): UploadFile<any>[] {\n    return this.files.filter((f) => !f.deleting && f.progress === 1);\n  }\n\n  get processingFilesCount(): number {\n    return this.processingFiles.length;\n  }\n\n  constructor(\n    protected cd: ChangeDetectorRef,\n    protected translate: TranslateService\n  ) {}\n\n  /**\n   * on file drop handler\n   */\n  onFileDropped(event) {\n    this.prepareFilesList(event);\n  }\n\n  /**\n   * handle file from browsing\n   */\n  fileBrowseHandler(files) {\n    this.prepareFilesList(files);\n  }\n\n  /**\n   * Delete file from files list\n   *\n   * @param index (File index)\n   */\n  async deleteFile(index: number) {\n    const file = this.files[index];\n\n    if (file.progress === 1 && this.deleteFn) {\n      if (file.deleting) {\n        console.warn(`[upload-file] This file already deleting`);\n        return;\n      }\n      try {\n        file.deleting = true;\n        const deleted = await this.deleteFn(file);\n        if (!deleted) return;\n      } catch (err) {\n        console.error((err && err.message) || err);\n        return;\n      } finally {\n        file.deleting = false;\n      }\n\n      // Make sure index not changed\n      index = this.files.indexOf(file);\n      if (index === -1) return; // Not found (already removed ?)\n    } else if (file.progress > 0) {\n      console.warn(`[upload-file] Cannot remove this file while uploading`);\n      return;\n    }\n\n    this.files.splice(index, 1);\n    this.cd.markForCheck();\n  }\n\n  /**\n   * Convert Files list to normal array list\n   *\n   * @param files (Files List)\n   */\n  prepareFilesList(files: FileList | File[]) {\n    let items: File[];\n    if (files instanceof FileList) {\n      items = [];\n      for (let i = 0; i < files.length; i++) {\n        const item = files.item(i);\n        items.push(item);\n      }\n    } else {\n      items = files;\n    }\n    this.files.push(...items);\n\n    this.fileDropEl.nativeElement.value = '';\n    this.cd.markForCheck();\n\n    // Start upload\n    if (this.instantUpload) {\n      this.uploadFiles(items);\n    }\n  }\n\n  /**\n   * Execute upload\n   */\n  async uploadFiles(files?: File[]): Promise<UploadFile<any>[]> {\n    this.uploading = true;\n    if (!files) {\n      console.info('[upload-file] Uploading all files...');\n      files = this.files;\n    }\n\n    const $processingFileCountChange = new BehaviorSubject(this.processingFilesCount);\n    const $changes = new Subject<void>();\n    $changes.subscribe((_) => {\n      this.cd.markForCheck();\n      $processingFileCountChange.next(this.processingFilesCount);\n    });\n\n    const jobs: Observable<UploadFile<any>>[] = files\n      .map((f) => f as UploadFile<any>)\n      .filter((file) => file && isNil(file.progress) && !file.error) // Skip if already started or in error\n      .map((file, i) => {\n        // Wait if need\n        if (isNotNil(this.maxParallelUpload)) {\n          return $processingFileCountChange.pipe(\n            debounceTime(i), // call of filter() must be different for waiting job\n            filter((count) => count < this.maxParallelUpload),\n            map((_) => {\n              // Start uploading\n              if (isNil(file.progress)) file.progress = 0;\n              $changes.next();\n              return file;\n            }),\n            first()\n          );\n        }\n        // Start uploading\n        if (isNil(file.progress)) file.progress = 0;\n        return of(file);\n      })\n\n      .map((file$) =>\n        file$.pipe(\n          filter(isNotNil),\n          // Log\n          tap((file) => console.debug(`[upload-file] ${file.name}: uploading...`)),\n\n          // Start uploading\n          switchMap((file) =>\n            this.uploadFn(file).pipe(\n              filter(isNotNil),\n              map((event) => {\n                // Progress event\n                if (isProgressEvent(event)) {\n                  if (isNotNil(event.loaded) && event.loaded >= 0) {\n                    file.progress = Math.min(1, event.loaded / (event.total || 1));\n                  } else {\n                    file.progress = -1; // Indeterminate progression\n                  }\n                }\n\n                // Response event\n                else if (isResponseEvent(event)) {\n                  file.progress = 1;\n                  file.response = event;\n                  console.debug(`[upload-file] ${file.name}: ${event.statusText || 'OK'}`, file.response);\n                }\n\n                // Other events: ignore\n                else {\n                  // DEBUG\n                  console.debug('[upload-file] Ignoring a file event: ', event);\n                }\n                return file;\n              }),\n              catchError((err) => {\n                console.error(err);\n                file.error = (err && (err.message || err.error?.message)) || 'FILE.UPLOAD.ERROR';\n                return of(file);\n              }),\n              tap(() => {\n                $changes.next();\n                this.cd.markForCheck();\n              })\n            )\n          )\n        )\n      );\n\n    // Wait jobs to finish\n    return forkJoin(jobs)\n      .pipe(\n        tap((_) => $changes.complete()),\n        finalize(() => (this.uploading = false))\n      )\n      .toPromise();\n  }\n\n  waitIdle(opts?: WaitForOptions): Promise<void> {\n    return waitFor(() => this.processingFilesCount === 0, opts);\n  }\n}\n","@if ((!uniqueFile && !autoHideDropArea) || files.length === 0) {\n  <div class=\"container\" appDragAndDrop (fileDropped)=\"onFileDropped($event)\">\n    <input\n      type=\"file\"\n      #fileDropRef\n      id=\"fileDropRef\"\n      [multiple]=\"!uniqueFile\"\n      [accept]=\"fileExtension\"\n      (change)=\"fileBrowseHandler($any($event.target).files)\"\n    />\n    <mat-icon style=\"font-size: xx-large\" color=\"accent\" class=\"text-size\">upload</mat-icon>\n    <ion-label\n      [innerHTML]=\"\n        'FILE.UPLOAD.DRAG_AND_DROP' | translate: { extension: !fileExtension ? '' : ' (' + fileExtension + ')' }\n      \"\n    ></ion-label>\n    <ion-button>{{ 'FILE.UPLOAD.BROWSE' | translate }}</ion-button>\n  </div>\n}\n<div class=\"files-list\">\n  <ion-list>\n    @for (file of files; track file; let i = $index) {\n      <ion-item>\n        <mat-icon slot=\"start\">description</mat-icon>\n        <div class=\"single-file\">\n          <ion-label>\n            <h4 class=\"name\" [class.deleting]=\"file.deleting\">\n              {{ file.name }}\n            </h4>\n            <p>\n              {{ file.size | fileSize }}\n            </p>\n          </ion-label>\n          <ion-progress-bar\n            *ngIf=\"uploading && !file.error\"\n            [value]=\"file.progress || 0\"\n            [type]=\"file.deleting || file.progress === -1 ? 'indeterminate' : 'determinate'\"\n          ></ion-progress-bar>\n          <ion-label *ngIf=\"file.error\" color=\"danger\" [innerHTML]=\"file.error | translate\"></ion-label>\n        </div>\n        <!-- remote from list (before importation) -->\n        <button *ngIf=\"!file.progress || file.error\" mat-icon-button slot=\"end\" (click)=\"deleteFile(i)\">\n          <mat-icon>clear</mat-icon>\n        </button>\n        <!-- delete file (remotely - after importation) -->\n        <button\n          *ngIf=\"file.progress === 1 && !!deleteFn && !file.deleting\"\n          mat-icon-button\n          slot=\"end\"\n          (click)=\"deleteFile(i)\"\n        >\n          <mat-icon>clear</mat-icon>\n        </button>\n      </ion-item>\n    }\n  </ion-list>\n</div>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { PopoverController } from '@ionic/angular';\nimport { UploadFileComponent } from './upload-file.component';\nimport { FileDeleteFn, FileUploadFn, UploadFile } from './upload-file.model';\nimport { isEmptyArray, isNotEmptyArray, isNotNilOrBlank } from '../functions';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport interface UploadFilePopoverOptions<T> {\n  title?: string;\n\n  uploadFn: FileUploadFn<T>;\n  deleteFn?: FileDeleteFn<any>;\n\n  instantUpload?: boolean;\n  uniqueFile?: boolean;\n  fileExtension?: string;\n  maxParallelUpload?: number;\n  autoHideDropArea?: boolean;\n\n  okButtonText?: string;\n  cancelButtonText?: string;\n\n  // Properties of ion-popover\n  backdropDismiss?: boolean; // false by default\n  keyboardClose?: boolean; // false by default\n  translucent?: boolean; // true by default\n  cssClass?: string | string[];\n}\n\n@Component({\n  selector: 'app-upload-file-popover',\n  templateUrl: './upload-file-popover.component.html',\n  styleUrls: ['./upload-file-popover.component.scss'],\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UploadFilePopover implements UploadFilePopoverOptions<any> {\n  @ViewChild('uploader', { static: true }) uploader: UploadFileComponent;\n\n  @Input() fileExtension: string;\n  @Input() title: string;\n  @Input() uniqueFile = false;\n  @Input() instantUpload = false;\n  @Input() uploadFn: FileUploadFn<any>;\n  @Input() deleteFn: FileDeleteFn<any>;\n  @Input() maxParallelUpload: number;\n  @Input() autoHideDropArea = false;\n  @Input() okButtonText = 'COMMON.BTN_IMPORT';\n  @Input() cancelButtonText = 'COMMON.BTN_CANCEL';\n\n  importing = false;\n  error: string;\n\n  get files(): UploadFile<any>[] {\n    return this.uploader.files;\n  }\n\n  get disabled() {\n    return this.importing || isEmptyArray(this.files);\n  }\n\n  get valid() {\n    return isNotEmptyArray(this.files);\n  }\n\n  constructor(\n    protected popoverController: PopoverController,\n    protected translate: TranslateService,\n    protected cd: ChangeDetectorRef\n  ) {}\n\n  async onValidate(event: any): Promise<any> {\n    event?.stopPropagation();\n\n    // Avoid multiple call\n    if (this.importing) return;\n\n    console.debug('[upload-file-popover] Validate form: will upload all files...');\n\n    try {\n      this.importing = true;\n      this.resetError();\n\n      try {\n        // Wait processing files finished\n        await this.uploader.waitIdle();\n\n        // upload all files\n        await this.uploader.uploadFiles();\n\n        const files: UploadFile<any>[] = (this.uploader.processedFiles || []).filter((file) => !file.deleting); // Remove deleting file (deletion in progress)\n\n        // Nothing to upload: close popover\n        if (isEmptyArray(files)) return this.cancel();\n\n        // check errors\n        const errors = files.map((file) => file.error).filter(isNotNilOrBlank);\n\n        // If error: stop\n        if (errors.length) {\n          errors.forEach((error) => console.error(error));\n          throw { message: 'FILE.UPLOAD.ERROR' };\n        }\n\n        // return files\n        await this.popoverController.dismiss(files);\n      } catch (err) {\n        this.error = (err && err.message) || err;\n      }\n    } finally {\n      this.importing = false;\n      this.cd.markForCheck();\n    }\n  }\n\n  cancel() {\n    return this.popoverController.dismiss();\n  }\n\n  protected resetError() {\n    if (this.error) {\n      this.error = null;\n      this.cd.markForCheck();\n    }\n  }\n}\n","<ion-content class=\"ion-no-padding\" scrollY=\"false\">\n  <app-upload-file\n    #uploader\n    [uploadFn]=\"uploadFn\"\n    [deleteFn]=\"deleteFn\"\n    [fileExtension]=\"fileExtension\"\n    [instantUpload]=\"instantUpload\"\n    [uniqueFile]=\"uniqueFile\"\n    [maxParallelUpload]=\"maxParallelUpload\"\n    [autoHideDropArea]=\"autoHideDropArea\"\n  ></app-upload-file>\n</ion-content>\n\n<ion-footer>\n  <ion-toolbar>\n    <ion-row class=\"ion-no-padding ion-nowrap\" >\n      <ion-col>\n        @if (importing) {\n          <div class=\"importing-info\">\n            <ion-text color=\"medium\"><small translate>FILE.UPLOAD.IMPORTING</small></ion-text>\n            &nbsp;\n            <ion-spinner name=\"dots\" color=\"accent\"></ion-spinner>\n          </div>\n        }\n        @if (error) {\n          <ion-item lines=\"none\" color=\"transparent\">\n            <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n            <ion-label color=\"danger\" class=\"ion-text-wrap\">\n              <small [innerHTML]=\"error | translate\"></small>\n            </ion-label>\n          </ion-item>\n        }\n      </ion-col>\n      <ion-col size=\"auto\">\n        <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n          <ion-label [innerHTML]=\"cancelButtonText | translate\"></ion-label>\n        </ion-button>\n        <ion-button\n          [fill]=\"disabled ? 'clear' : 'solid'\"\n          (click)=\"onValidate($event)\"\n          (keyup.enter)=\"onValidate($event)\"\n          color=\"tertiary\"\n          [disabled]=\"disabled\"\n        >\n          <ion-label [innerHTML]=\"okButtonText | translate\"></ion-label>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { Component, Inject, InjectionToken, Optional } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport declare interface TestingPage {\n  label: string;\n  page?: string;\n  divider?: boolean;\n}\n\nexport const APP_TESTING_PAGES = new InjectionToken<TestingPage[]>('testingPages');\n\n@Component({\n  selector: 'app-tests-page',\n  templateUrl: './tests.page.html',\n})\nexport class SharedTestsPage {\n  constructor(\n    protected route: ActivatedRoute,\n    protected router: Router,\n    protected translate: TranslateService,\n    @Optional() @Inject(APP_TESTING_PAGES) public pages: TestingPage[]\n  ) {\n    console.info('[testing] Loaded tests pages:', pages);\n  }\n\n  async openPage(page): Promise<boolean> {\n    return this.router.navigate([page], {\n      relativeTo: this.route,\n    });\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-menu-button></ion-menu-button>\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Tests</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <ion-list *ngIf=\"pages?.length\">\n    <ng-container *ngFor=\"let item of pages\">\n      <ion-item-divider *ngIf=\"item.divider; else link\">{{ item.label }}</ion-item-divider>\n\n      <ng-template #link>\n        <ion-item tappable class=\"text-1x\" (click)=\"openPage(item.page)\">{{ item.label }}</ion-item>\n      </ng-template>\n    </ng-container>\n  </ion-list>\n</ion-content>\n","import { InjectionToken } from '@angular/core';\nimport { Drivers } from '@ionic/storage';\nimport * as LocalForage from 'localforage';\nimport * as CordovaSQLiteDriver from 'localforage-cordovasqlitedriver';\n\nexport interface IStorage<T = any> {\n  readonly driver: string;\n  ready(): Promise<T>;\n  set(key: string, value: any): Promise<void>;\n  get(key: string): Promise<any>;\n  remove(key: string): Promise<void>;\n  keys(): Promise<string[]>;\n  clear(): Promise<void>;\n  forEach(iteratorCallback: (value: any, key: string, iterationNumber: number) => any): Promise<void>;\n}\n\nexport const StorageDrivers = {\n  SQLLite: CordovaSQLiteDriver._driver,\n  SecureStorage: Drivers.SecureStorage,\n  WebSQL: LocalForage.WEBSQL,\n  IndexedDB: Drivers.IndexedDB,\n  LocalStorage: Drivers.LocalStorage,\n};\n\nexport const APP_STORAGE = new InjectionToken<IStorage>('Storage');\n","import {Inject, Injectable} from '@angular/core';\nimport {Storage} from '@ionic/storage-angular';\nimport {IStorage, StorageDrivers} from './storage.utils';\nimport {StartableService} from '../services/startable-service.class';\nimport {Platform} from '@ionic/angular';\nimport {ENVIRONMENT, Environment} from '../../../environments/environment.class';\nimport * as cordovaSQLiteDriver from 'localforage-cordovasqlitedriver';\n\n@Injectable({\n  providedIn: 'root',\n  deps: [ENVIRONMENT],\n})\nexport class StorageService extends StartableService<Storage> implements IStorage<Storage> {\n  get driver(): string | undefined {\n    return this._data?.driver;\n  }\n\n  constructor(\n    platform: Platform,\n    private storage: Storage,\n    @Inject(ENVIRONMENT) private environment: Environment\n  ) {\n    super(platform);\n    this._debug = !environment.production;\n    this.start();\n  }\n\n  protected async ngOnStart(): Promise<Storage> {\n    try {\n      console.debug(`[storage] Starting... {driverOrder: ${this.environment.storage?.driverOrder}}`);\n\n      // Define Cordova SQLLite driver\n      await this.storage.defineDriver(cordovaSQLiteDriver);\n\n      // Create the storage instance\n      const storage = await this.storage.create();\n\n      // Migrate from old storage\n      await this.migrate(storage);\n\n      console.info(`[storage] Started using driver: ${storage?.driver}`);\n      return storage;\n    } catch (err) {\n      console.error('[storage] Cannot create storage: ' + (err?.message || err), err);\n    }\n  }\n\n  protected async migrate(storage: Storage) {\n    const canMigrate = storage?.driver === StorageDrivers.SQLLite;\n\n    if (!canMigrate) return; // Skip\n\n    //\n    // const oldForage = storage.createInstance({\n    //   name: storage.config().name,\n    //   storeName: storage.config().storeName,\n    //   driver: [storage.INDEXEDDB, storage.WEBSQL]\n    // });\n    //\n    // const keys = await oldForage.keys();\n    //\n    // // No data in the odl storage: skip migration\n    // if (isEmptyArray(keys)) {\n    //   // Drop the old instance (not need anymore)\n    //   console.debug(`[platform] Old storage is empty: dropping unused instance {name: '${storage.config().name}', driver: '${oldForage.driver()}'}`);\n    //   await oldForage.dropInstance();\n    // }\n    // // IF some data stored in the OLD storage: start migration\n    // else {\n    //\n    //   const now = Date.now();\n    //   console.info(`[platform] Starting storage migration...`);\n    //\n    //   const toast = await this.showToast({message: 'INFO.DATA_MIGRATION_STARTED', type: 'info', duration: 30000});\n    //   try {\n    //     await StorageUtils.copy(oldForage, storage, {keys, deleteAfterCopy: false});\n    //\n    //     const duration = Date.now() - now;\n    //     setTimeout(() => toast.dismiss(),  Math.max(2000 - duration, 0));\n    //     await this.showToast({message: 'INFO.DATA_MIGRATION_SUCCEED',\n    //       type: 'info',\n    //       showCloseButton: true\n    //     });\n    //     console.info('[platform] Starting storage migration [OK]');\n    //\n    //     // Drop the old instance\n    //     console.info(`[platform] Drop old storage {name: '${storage.config().name}', driver: '${oldForage.driver()}'}`);\n    //     await oldForage.dropInstance();\n    //   }\n    //   catch (err) {\n    //     console.error(err && err.message || err, err);\n    //     await toast.dismiss();\n    //     await this.showToast({message: 'ERROR.DATA_MIGRATION_FAILED',\n    //       type: 'error',\n    //       showCloseButton: true\n    //     });\n    //   }\n    //}\n  }\n\n  async set(key: string, value: any) {\n    if (!this.started) await this.ready();\n    return this._data.set(key, value);\n  }\n\n  async get(key: string): Promise<any> {\n    if (!this.started) await this.ready();\n    return this._data.get(key);\n  }\n\n  async remove(key: string) {\n    if (!this.started) await this.ready();\n    return this._data.remove(key);\n  }\n\n  async keys(): Promise<string[]> {\n    if (!this.started) await this.ready();\n    return this._data.keys();\n  }\n\n  async clear() {\n    if (!this.started) await this.ready();\n    await this._data.clear();\n  }\n\n  async forEach(iteratorCallback: (value: any, key: string, iterationNumber: number) => any): Promise<void> {\n    if (!this.started) await this.ready();\n    return this._data.forEach(iteratorCallback);\n  }\n}\n","import { EventEmitter, Injectable, InjectionToken } from '@angular/core';\nimport { ProgressBarMode } from '@angular/material/progress-bar';\n\nexport const APP_PROGRESS_BAR_SERVICE = new InjectionToken<IProgressBarService>('ProgressBarService');\n\nexport type ProgressMode = ProgressBarMode;\n\nexport interface IProgressBarService {\n  onProgressChanged: EventEmitter<ProgressBarMode>;\n  list(): number;\n  increase();\n  decrease();\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ProgressBarService implements IProgressBarService {\n  private _requestsRunning = 0;\n\n  onProgressChanged = new EventEmitter<ProgressBarMode>();\n\n  list(): number {\n    return this._requestsRunning;\n  }\n\n  increase(): void {\n    this._requestsRunning++;\n    if (this._requestsRunning === 1) {\n      this.onProgressChanged.emit('query');\n    }\n  }\n\n  decrease(): void {\n    if (this._requestsRunning > 0) {\n      this._requestsRunning--;\n    }\n    if (this._requestsRunning === 0) {\n      this.onProgressChanged.emit(null);\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { HammerGestureConfig } from '@angular/platform-browser';\n\nexport const HAMMER_TAP_TIME = 250;\nexport const HAMMER_PRESS_TIME = 400; // Increase need for double tap (default: 251 ms)\n/**\n * @hidden\n * This class overrides the default Angular gesture config.\n *\n */\n@Injectable({ providedIn: 'root' })\nexport class AppGestureConfig extends HammerGestureConfig {\n  // Override HammerJS default settings\n  overrides = <any>{\n    press: {\n      time: HAMMER_PRESS_TIME,\n    },\n    pinch: {\n      enable: false,\n    },\n    rotate: {\n      enable: false,\n    },\n    // see https://hammerjs.github.io/recognizer-swipe/\n    swipe: {\n      threshold: 30, // Minimal distance required before recognizing.\n      velocity: 0.4, //Minimal velocity required before recognizing, unit is in px per ms.\n    },\n  };\n\n  buildHammer(element: HTMLElement) {\n    // DEBUG\n    console.debug('[gesture] Applying HammerJS config to ', element.tagName);\n\n    const mc = new (<any>window).Hammer(element);\n\n    for (const eventName in this.overrides) {\n      if (eventName) mc.get(eventName).set(this.overrides[eventName]);\n    }\n\n    return mc;\n  }\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  Inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport { APP_PROGRESS_BAR_SERVICE, IProgressBarService } from '../services/progress-bar.service';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IonMenuToggle, IonRouterOutlet, IonSearchbar, NavController } from '@ionic/angular';\nimport { isNotNil, isNotNilOrBlank, toBoolean } from '../functions';\nimport { debounceTime, distinctUntilChanged, startWith } from 'rxjs/operators';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { HammerTapEvent } from '../gesture/hammer.utils';\nimport { HAMMER_PRESS_TIME } from '../gesture/gesture-config';\nimport { AppColors } from '../types';\nimport { SearchbarChangeEventDetail as ISearchbarSearchbarChangeEventDetail } from '@ionic/core/dist/types/components/searchbar/searchbar-interface';\nimport { ProgressBarMode } from '@angular/material/progress-bar';\n\nexport abstract class ToolbarToken {\n  abstract onBackClick: Observable<Event>;\n\n  abstract doBackClick(event: Event);\n\n  abstract goBack(): Promise<boolean>;\n\n  abstract canGoBack: boolean;\n}\n\nexport const TOOLBAR_HEADER_ID = 'app-toolbar-header';\n\n@Component({\n  selector: 'app-toolbar',\n  templateUrl: 'toolbar.html',\n  styleUrls: ['./toolbar.scss'],\n  providers: [{ provide: ToolbarToken, useExisting: ToolbarComponent }],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolbarComponent implements ToolbarToken, OnInit, OnDestroy {\n  private _closeTapCount = 0;\n  private _validateTapCount = 0;\n  private _defaultBackHref: string;\n  private _backHref: string;\n\n  protected readonly progressBarMode$ = new BehaviorSubject<ProgressBarMode>(null);\n  protected showSearchBar = false;\n\n  @Input() set progressBarMode(value: ProgressBarMode) {\n    if (this.progressBarService) return; // Skip if managed by the progress service\n    this.progressBarMode$.next(value);\n  }\n\n  get progressBarMode(): ProgressBarMode {\n    return this.progressBarMode$.value;\n  }\n\n  @Input() title = '';\n  @Input() color: AppColors = 'primary';\n  @Input() class = '';\n  @Input() id = TOOLBAR_HEADER_ID; // Used by\n\n  @Input() set backHref(value: string) {\n    if (value !== this._backHref) {\n      this._backHref = value;\n      this.canGoBack = this.canGoBack || isNotNil(value);\n      this.markForCheck();\n    }\n  }\n\n  get backHref(): string {\n    return this._backHref;\n  }\n\n  @Input() set defaultBackHref(value: string) {\n    if (value !== this._defaultBackHref) {\n      this._defaultBackHref = value;\n      this.canGoBack = this.canGoBack || isNotNil(value);\n      this.markForCheck();\n    }\n  }\n\n  get defaultBackHref(): string {\n    return this._defaultBackHref;\n  }\n\n  @Input({ transform: booleanAttribute }) hasValidate = false;\n  @Input({ transform: booleanAttribute }) hasClose = false;\n  @Input({ transform: booleanAttribute }) hasSearch: boolean;\n  @Input({ transform: booleanAttribute }) canGoBack: boolean;\n  @Input({ transform: booleanAttribute }) canShowMenu = true;\n\n  @Output() onValidate = new EventEmitter<Event>();\n  @Output() onClose = new EventEmitter<Event>();\n  @Output() onValidateAndClose = new EventEmitter<Event>();\n  @Output() onBackClick = new EventEmitter<Event>();\n  @Output() onSearchInput = new EventEmitter<CustomEvent<ISearchbarSearchbarChangeEventDetail>>();\n  @Output() onSearch = new EventEmitter<CustomEvent<ISearchbarSearchbarChangeEventDetail>>();\n\n  @ViewChild('searchbar', { static: true }) searchbar: IonSearchbar;\n  @ViewChild('menuToggle', { static: true }) menuToggle: IonMenuToggle;\n\n  constructor(\n    private route: ActivatedRoute,\n    private router: Router,\n    private navController: NavController,\n    private cd: ChangeDetectorRef,\n    @Optional() private routerOutlet: IonRouterOutlet,\n    @Optional() @Inject(APP_PROGRESS_BAR_SERVICE) protected progressBarService: IProgressBarService\n  ) {\n    // Listen progress bar service mode\n    if (progressBarService) {\n      progressBarService.onProgressChanged\n        .pipe(\n          startWith(<ProgressBarMode>null), // none, by default\n          debounceTime(100), // wait 100ms, to group changes\n          // DEBUG\n          //tap((mode) => console.debug('[toolbar] Updating progressBarMode: ' + mode))\n\n          distinctUntilChanged()\n        )\n        .subscribe((value) => this.progressBarMode$.next(value));\n    }\n  }\n\n  ngOnInit() {\n    this.hasValidate = toBoolean(this.hasValidate, this.onValidate.observed);\n    this.canGoBack = this.canGoBack ?? (this.routerOutlet?.canGoBack() || isNotNilOrBlank(this._backHref) || isNotNilOrBlank(this._defaultBackHref));\n    this.hasSearch = this.hasSearch ?? (this.onSearch.observed || this.onSearchInput.observed);\n  }\n\n  ngOnDestroy() {\n    this.onBackClick.complete();\n    this.onBackClick.unsubscribe();\n    this.onValidate.complete();\n    this.onValidate.unsubscribe();\n    this.onClose.complete();\n    this.onClose.unsubscribe();\n    this.onValidateAndClose.complete();\n    this.onValidateAndClose.unsubscribe();\n    this.onSearch.complete();\n    this.onSearch.unsubscribe();\n  }\n\n  async toggleSearchBar() {\n    this.showSearchBar = !this.showSearchBar;\n    if (this.showSearchBar && this.searchbar) {\n      setTimeout(() => {\n        this.searchbar.setFocus();\n        this.markForCheck();\n      }, 300);\n    }\n  }\n\n  doBackClick(event: Event) {\n    this.onBackClick.emit(event);\n\n    // Stop propagation, if need (can be cancelled by onBackClick observers)\n    if (event.defaultPrevented) return;\n\n    // Execute the back action\n    this.goBack();\n  }\n\n  async goBack(): Promise<boolean> {\n    // No router outlet (e.g. use inside a modal)\n    if (!this.routerOutlet) return Promise.resolve(false);\n\n    console.debug('[toolbar] calling goBack()');\n    if (this._backHref) {\n      const replaceUrl = !this.routerOutlet.canGoBack();\n      // Relative href\n      if (this._backHref.startsWith('.')) {\n        this.navController.setDirection('back');\n        return this.router.navigate([this._backHref], { relativeTo: this.route, replaceUrl });\n      } else {\n        return this.navController.navigateBack(this._backHref);\n      }\n    } else if (this.routerOutlet.canGoBack()) {\n      return this.navController.pop();\n    } else if (this._defaultBackHref) {\n      // Relative href\n      if (this._defaultBackHref.startsWith('.')) {\n        this.navController.setDirection('back');\n        return this.router.navigate([this._defaultBackHref], { relativeTo: this.route, replaceUrl: true });\n      } else {\n        return this.navController.navigateBack(this._defaultBackHref);\n      }\n    } else {\n      console.error(\"[toolbar] Cannot go back. Missing attribute 'defaultBackHref' or 'backHref'\");\n      return false;\n    }\n  }\n\n  tapClose(event: HammerTapEvent) {\n    // DEV only\n    // console.debug(\"[toolbar] tapClose\", event.tapCount);\n    if (this._validateTapCount > 0) return;\n\n    // Distinguish simple and double tap\n    this._closeTapCount = event.tapCount;\n    setTimeout(() => {\n      // Event is obsolete (a new tap event occur)\n      if (event.tapCount < this._closeTapCount) {\n        // Ignore event\n      }\n\n      // If event still the last tap event: process it\n      else {\n        this.onClose.emit(event.srcEvent || event);\n\n        // Reset tab count\n        this._closeTapCount = 0;\n      }\n    }, 500);\n  }\n\n  tapValidate(event: HammerTapEvent) {\n    // DEV only\n    //console.debug(\"[toolbar] tapValidate\", event.tapCount);\n\n    if (this.onValidateAndClose.observed) {\n      this.onValidate.emit(event.srcEvent || event);\n    }\n\n    // Distinguish simple and double tap\n    else {\n      this._validateTapCount = event.tapCount;\n      setTimeout(() => {\n        // Event is obsolete (a new tap event occur)\n        if (event.tapCount < this._validateTapCount) {\n          // Ignore event\n        }\n\n        // If event still the last tap event: process it\n        else {\n          if (this._validateTapCount === 1) {\n            this.onValidate.emit(event.srcEvent || event);\n          } else if (this._validateTapCount >= 2) {\n            this.onValidateAndClose.emit(event.srcEvent || event);\n          }\n\n          // Reset tab count\n          this._validateTapCount = 0;\n        }\n      }, HAMMER_PRESS_TIME + 10);\n    }\n  }\n\n  protected ionSearchBarInput(event: Event) {\n    this.onSearchInput.emit(event as CustomEvent<ISearchbarSearchbarChangeEventDetail>);\n  }\n\n  protected ionSearchBarChanged(event: Event) {\n    this.onSearch.emit(event as CustomEvent<ISearchbarSearchbarChangeEventDetail>);\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<ion-header [class]=\"class\" [id]=\"id\">\n  <ion-toolbar [color]=\"color\">\n    <ion-buttons slot=\"start\">\n      <!-- back button -->\n      @if (canGoBack) {\n        <ion-button class=\"back-button\" (click)=\"doBackClick($event)\" routerDirection=\"back\">\n          <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n        </ion-button>\n      }\n\n      <!-- show menu button -->\n      <ion-menu-toggle #menuToggle [menu]=\"'left'\" [class.cdk-visually-hidden]=\"canGoBack || !canShowMenu\">\n        <ion-button>\n          <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n        </ion-button>\n      </ion-menu-toggle>\n\n      <ng-content select=\"[slot=start]\"></ng-content>\n    </ion-buttons>\n\n    @if (title) {\n      <ion-title [innerHTML]=\"title\"></ion-title>\n    }\n\n    <ng-content select=\"[slot=title], ion-title, ion-segment\"></ng-content>\n\n    <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n    <ion-buttons slot=\"end\" collapse=\"true\">\n      <ng-content select=\"[slot=end]\"></ng-content>\n\n      <!-- search bar -->\n      @if (hasSearch) {\n        <ion-searchbar\n          #searchbar\n          type=\"search\"\n          [animated]=\"true\"\n          show-cancel-button=\"always\"\n          [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n          [class.cdk-visually-hidden]=\"!showSearchBar\"\n          (ionInput)=\"ionSearchBarInput($event)\"\n          (ionChange)=\"ionSearchBarChanged($event)\"\n          (ionCancel)=\"toggleSearchBar()\"\n        ></ion-searchbar>\n\n        <!-- search button -->\n        @if (!showSearchBar) {\n          <ion-button (click)=\"toggleSearchBar()\">\n            <ion-icon slot=\"icon-only\" name=\"search\"></ion-icon>\n          </ion-button>\n        }\n      }\n\n      <!-- close button -->\n      @if (hasClose) {\n        <ion-button (tap)=\"tapClose($event)\" class=\"visible-xs visible-sm visible-mobile\">\n          <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n        </ion-button>\n      }\n\n      <!-- validate button -->\n      @if (hasValidate) {\n        <ion-button (tap)=\"tapValidate($event)\" class=\"visible-xs visible-sm visible-mobile\">\n          <ion-icon slot=\"icon-only\" name=\"save\"></ion-icon>\n        </ion-button>\n      }\n    </ion-buttons>\n  </ion-toolbar>\n\n  <!-- progress bar -->\n  <mat-progress-bar [color]=\"color | matColor\" [mode]=\"progressBarMode$ | push\"></mat-progress-bar>\n</ion-header>\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { toBoolean } from '../functions';\nimport { Subscription } from 'rxjs';\nimport { Hotkeys } from '../hotkeys/hotkeys.service';\nimport { IconRef } from '../types';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n  selector: 'app-modal-toolbar',\n  templateUrl: 'modal-toolbar.html',\n  styleUrls: ['./modal-toolbar.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ModalToolbarComponent implements OnInit, OnDestroy {\n  private _subscription = new Subscription();\n\n  @Input()\n  modalName = 'modal-toolbar';\n\n  @Input()\n  title = '';\n\n  @Input()\n  color = 'primary';\n\n  @Input()\n  showSpinner = false;\n\n  @Input()\n  canValidate: boolean;\n\n  @Input() validateIcon: IconRef = { icon: 'checkmark' };\n\n  @Output()\n  cancel = new EventEmitter<Event>();\n\n  @Output()\n  validate = new EventEmitter<Event>();\n\n  constructor(private hotkeys: Hotkeys) {}\n\n  ngOnInit() {\n    this.canValidate = toBoolean(this.canValidate, this.validate.observed);\n\n    // Ctrl+S\n    this._subscription.add(\n      this.hotkeys\n        .addShortcut({ keys: `${this.hotkeys.defaultControlKey}.s`, description: 'COMMON.BTN_VALIDATE', elementName: this.modalName })\n        .pipe(filter(() => this.canValidate))\n        .subscribe((event) => this.validate.emit(event))\n    );\n\n    // Escape\n    this._subscription.add(\n      this.hotkeys\n        .addShortcut({ keys: 'escape', description: 'COMMON.BTN_CLOSE', elementName: this.modalName })\n        .subscribe((event) => this.cancel.emit(event))\n    );\n  }\n\n  ngOnDestroy(): void {\n    this._subscription.unsubscribe();\n  }\n}\n","<ion-header>\n  <ion-toolbar [color]=\"color\">\n    <ion-buttons slot=\"start\">\n      @if (cancel.observed) {\n        <ion-button visible-xs visible-sm visible-mobile (click)=\"cancel.emit()\">\n          <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n        </ion-button>\n      }\n\n      <ng-content select=\"[slot=start]\"></ng-content>\n    </ion-buttons>\n\n    @if (title) {\n      <ion-title [innerHTML]=\"title\"></ion-title>\n    }\n\n    <ng-content select=\"[slot=title], ion-title\"></ng-content>\n\n    <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n    <ion-buttons slot=\"end\">\n      <ng-content select=\"ion-button[slot=end]\"></ng-content>\n\n      <ion-spinner *ngIf=\"showSpinner\"></ion-spinner>\n\n      <ion-button visible-xs visible-sm visible-mobile *ngIf=\"canValidate\" (click)=\"validate.emit($event)\">\n        <ion-icon slot=\"icon-only\" *ngIf=\"validateIcon?.icon\" [name]=\"validateIcon.icon\"></ion-icon>\n        <mat-icon slot=\"icon-only\" *ngIf=\"validateIcon?.matIcon\">{{ validateIcon.matIcon }}</mat-icon>\n      </ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IonicModule } from '@ionic/angular';\nimport { ToolbarComponent } from './toolbar';\nimport { ModalToolbarComponent } from './modal-toolbar';\nimport { HammerModule } from '@angular/platform-browser';\nimport { SharedPipesModule } from '../pipes/pipes.module';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { RxStateModule } from '../rx-state/rx-state.module';\n\n@NgModule({\n  imports: [CommonModule, IonicModule, TranslateModule, HammerModule, SharedPipesModule, RxStateModule, MatProgressBarModule, MatIconModule],\n  declarations: [ToolbarComponent, ModalToolbarComponent],\n  exports: [ToolbarComponent, ModalToolbarComponent],\n})\nexport class SharedToolbarModule {}\n","import { Property, PropertyMap } from '../../../shared/types';\nimport { InjectionToken } from '@angular/core';\nimport { HistoryPageReference } from './history.model';\n\nexport type UsageMode = 'DESK' | 'FIELD';\n\nexport function isOnFieldMode(value: UsageMode): value is 'FIELD' {\n  return value === 'FIELD';\n}\n\nexport declare interface LocaleConfig extends Property {\n  country?: string;\n}\n\nexport const APP_LOCALES = new InjectionToken<LocaleConfig[]>('locales');\n\nexport declare interface OfflineFeature<F = any> {\n  name: string;\n  lastSyncDate?: string;\n  filter?: F;\n}\n\nexport declare interface LocalSettings {\n  pages?: any;\n  peerUrl?: string;\n  latLongFormat: 'DDMMSS' | 'DDMM' | 'DD';\n  accountInheritance?: boolean;\n  locale: string;\n  usageMode?: UsageMode;\n  mobile?: boolean;\n  properties?: PropertyMap | Property[];\n  pageHistory?: HistoryPageReference[];\n  offlineFeatures?: (string | OfflineFeature)[];\n  pageHistoryMaxSize: number;\n  darkMode?: boolean;\n  autoDarkMode?: boolean;\n}\n","// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\nimport { StorageDrivers } from '../app/shared/storage/storage.utils';\n\nimport { Environment } from './environment.class';\n/*\n * In development mode, to ignore zone related error stack frames such as\n * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can\n * import the following file, but please comment it out in production mode\n * because it will have performance impact when throw error\n */\n//import 'zone.js/plugins/zone-error';\n\nexport const environment: Environment = Object.freeze(<Environment>{\n  name: '@sumaris-net/ngx-components', // overridden by ENVIRONMENT token\n  version: '1.0', // overridden by ENVIRONMENT token\n\n  // Do NOT set to false - because this value will be used by releases\n  //production: false,\n  production: true,\n\n  // Do NOT set - because this value will be used by releases\n  //externalEnvironmentUrl: null,\n\n  baseUrl: '/',\n  defaultLocale: 'fr',\n  defaultLatLongFormat: 'DDMM',\n  apolloFetchPolicy: 'cache-first',\n  useHash: false,\n  allowDarkMode: true,\n\n  //defaultRoute: '/home',\n  //enableMenu: true,\n\n  // FIXME: enable cache\n  persistCache: false,\n\n  // TODO: make this works\n  //offline: true,\n\n  peerMinVersion: '1.8.0',\n  peerDefaultPrefix: 'http://',\n  enableSelectPeerByFeature: true,\n\n  sendAppVersionHeaders: true,\n\n  defaultPeer: {\n    host: 'localhost',\n    port: 8081,\n  },\n\n  defaultPeers: [\n    {\n      host: 'localhost',\n      port: 8080,\n    },\n    {\n      host: 'localhost',\n      port: 8081,\n    },\n    {\n      host: '192.168.0.45',\n      port: 8080,\n    },\n    {\n      host: '192.168.0.24',\n      port: 8080,\n    },\n    {\n      host: '192.168.0.29',\n      port: 8080,\n    },\n    {\n      host: '192.168.0.107',\n      port: 8080,\n    },\n    {\n      host: 'sih.sfa.sc',\n      port: 443,\n    },\n    {\n      host: 'test.sumaris.net',\n      port: 443,\n    },\n    {\n      host: 'open.sumaris.net',\n      port: 443,\n    },\n    {\n      host: 'server.e-is.pro',\n      port: 443,\n    },\n  ],\n  defaultAppName: 'SUMARiS',\n  defaultAndroidInstallUrl: 'https://play.google.com/store/apps/details?id=net.sumaris.app',\n  defaultIOSInstallUrl: 'https://apps.apple.com/us/app/sumaris/id6736747523',\n  defaultDesktopInstallUrl: 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/releases',\n\n  // Storage\n  storage: {\n    driverOrder: [StorageDrivers.SQLLite, StorageDrivers.IndexedDB, StorageDrivers.WebSQL, StorageDrivers.LocalStorage],\n  },\n\n  // About\n  sourceUrl: 'https://gitlab.ifremer.fr/sih-public/sumaris/ngx-sumaris-components',\n  reportIssueUrl: 'https://gitlab.ifremer.fr/sih-public/sumaris/ngx-sumaris-components/-/issues',\n  forumUrl: null, //'https://forum.sumaris.net',\n  helpUrl: 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/blob/master/user-manual/index_fr.md',\n  privacyPolicyUrl: 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/raw/master/doc/privacy_policy_fr.md',\n  termsOfUseUrl: 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/raw/master/doc/terms_of_use_fr.md?ref_type=heads',\n\n  // Development\n  defaultAuthValues: {\n    // Token auth (using Person.pubkey)\n    username: 'admin@sumaris.net',\n    password: 'admin',\n  },\n\n  startupOrder: ['url', 'window', 'environment'],\n\n  account: {\n    enableListenChanges: true,\n    listenIntervalInSeconds: 60,\n    enableAvatarEdit: true,\n  },\n\n  entityEditor: {\n    enableListenChanges: true,\n    listenIntervalInSeconds: 60,\n  },\n\n  feed: {\n    jsonFeed: {\n      fr: [\n        '/api/feed.json',\n        'https://gitlab.ifremer.fr/sih-public/sumaris/ngx-sumaris-components/-/raw/master/doc/feed/feed-fr.json',\n        // Example with JsonFeed version 1 (and not 1.1)\n        //'https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-fr.json',\n        // Example with discourse API :\n        //'https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/1.1/feed-fr-FR.json',\n      ],\n\n      en: [\n        '/api/feed.json',\n        'https://gitlab.ifremer.fr/sih-public/sumaris/ngx-sumaris-components/-/raw/master/doc/feed/feed-en.json'\n      ],\n    },\n    maxContentLength: 1000,\n    maxAgeInMonths: -1,\n    maxCount: 3,\n  },\n\n  buildDate: new Date().toISOString(),\n});\n","import { environment } from '../../../../environments/environment';\nimport { Entity } from './entity.model';\nimport { removeEnd } from '../../../shared/functions';\nimport { Constructor } from '../../../shared/types';\n\nexport class EntityClasses {\n  static CLASSES_BY_NAME = new Map<string, Constructor<any>>();\n\n  static register<T>(typename: string, entityClass: Constructor<T>) {\n    // Convert to extract entityName\n    const entityName = removeEnd(typename, 'VO');\n    // DEBUG\n    //console.debug('[entity-classes] Detected entity class ' + entityName);\n\n    // Add to map\n    EntityClasses.CLASSES_BY_NAME.set(entityName, entityClass);\n  }\n\n  static get<T extends Entity<T>>(entityName: string): Constructor<T> {\n    const entityClass = EntityClasses.CLASSES_BY_NAME.get(entityName);\n    if (!entityClass) {\n      throw new Error(\"Cannot found entity class '\" + entityName + \"'. Make sure it exists and has the @EntityClass decorator.\");\n    }\n    return entityClass as Constructor<T>;\n  }\n\n  static fromObject<T extends Entity<T>>(\n    value: any,\n    opts?: {\n      [key: string]: any;\n      typename?: string;\n      entityName?: string;\n    }\n  ): T {\n    if (!value) return value;\n    const entityName = (opts && opts.entityName) || removeEnd(value.__typename || opts?.typename, 'VO');\n    if (!entityName) throw new Error(\"Missing one of 'value.__typename', 'opts.entityName', or 'opts.typename'.\");\n    const entityClass = EntityClasses.get(entityName) as any;\n    if (typeof entityClass.fromObject !== 'function') {\n      throw new Error(\n        \"Cannot found the static function '\" +\n          entityName +\n          \".fromObject()'. Make sure this function has been declared and the entity class has the @EntityClass decorator\"\n      );\n    }\n    return entityClass.fromObject(value, opts) as T;\n  }\n}\n\nexport type ClassDecorator<T> = <T extends Constructor<any>>(target: T) => void;\n\nexport function EntityClass(opts: { typename: string; fromObjectReuseStrategy?: 'default' | 'clone' }): ClassDecorator<any> {\n  return function <T extends Constructor<any>>(constructor: T) {\n    // Make sure the class extends Entity\n    if (!environment.production) {\n      const obj: any = new constructor();\n      if (!(obj instanceof Entity)) {\n        throw new Error(`Class ${constructor.name} must extends <<Entity>> to be able to use @FromObject!`);\n      }\n    }\n\n    const clazz = constructor as any;\n    const typename = opts.typename || `${constructor.name}VO`;\n\n    // Define static field TYPENAME\n    clazz.TYPENAME = typename;\n\n    // Define static fromObject()\n    if (opts.fromObjectReuseStrategy === 'clone') {\n      clazz.fromObject = function (source: any, opts?: any): T {\n        if (!source) return undefined;\n        if (source instanceof constructor) return (source as any).clone(opts) as T;\n        const target: any = new constructor();\n        target.fromObject(source, opts);\n        return target as T;\n      };\n      clazz.asObject = function (source: any, opts?: any): any {\n        if (!source) return undefined;\n        if (source instanceof constructor) return source.asObject(opts);\n        return Object.assign({}, source);\n      };\n    } else {\n      clazz.fromObject = function (source: any, opts?: any): T {\n        if (!source) return undefined;\n        if (source instanceof constructor) {\n          // DEBUG\n          //console.debug('@EntityClass() fromObject() => will recycle existing object: ', source);\n          return source as T;\n        }\n        const target: any = new constructor();\n        target.fromObject(source, opts);\n        return target as T;\n      };\n\n      clazz.asObject = function (source: any, opts?: any): any {\n        if (!source) return undefined;\n        if (source instanceof constructor) {\n          return source.asObject(opts);\n        }\n        // DEBUG\n        //console.debug('@EntityClass() asObject() => will recycle existing object: ', source);\n        return source;\n      };\n    }\n\n    // Register the entity class\n    EntityClasses.register(typename, constructor);\n\n    return constructor;\n  };\n}\n","import { Moment } from 'moment/moment';\nimport { EntityClass } from './entity.decorators';\nimport { Cloneable, Entity, EntityAsObjectOptions } from './entity.model';\n\n@EntityClass({ typename: 'NodeFeatureVO' })\nexport class NodeFeature extends Entity<NodeFeature> implements Cloneable<NodeFeature> {\n  static fromObject: (source: any, opts?: any) => NodeFeature;\n\n  label: string;\n  name: string;\n  description: string;\n  logo: string;\n  creationDate: Moment;\n  statusId: number;\n  validityStatusId: number;\n\n  asObject(options?: EntityAsObjectOptions): any {\n    return super.asObject(options);\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.label = source.label;\n    this.name = source.name;\n    this.description = source.description;\n    this.logo = source.logo;\n    this.creationDate = source.creationDate;\n    this.statusId = source.statusId;\n    this.validityStatusId = source.validityStatusId;\n  }\n}\n","/* -- Network -- */\n\nimport { isNilOrBlank, isNotNil, isNotNilOrBlank, noTrailingSlash } from '../../../shared/functions';\nimport { Cloneable, Entity, EntityAsObjectOptions } from './entity.model';\nimport { EntityClass } from './entity.decorators';\nimport { NodeFeature } from './node-feature.model';\nimport { UriUtils } from '../../../shared/file/uri.utils';\nimport { UrlUtils } from '../../../shared/file/url.utils';\n\n// @dynamic\n@EntityClass({ typename: 'PeerVO' })\nexport class Peer extends Entity<Peer> implements Cloneable<Peer> {\n  static fromObject: (source: any, opts?: any) => Peer;\n\n  static parseUrl(peerUrl: string | URL): Peer {\n    const url = (typeof peerUrl === 'string') ? new URL(peerUrl) : peerUrl;\n    return Peer.fromObject({\n      dns: url.hostname,\n      port: isNilOrBlank(url.port) ? undefined : url.port,\n      useSsl: url.protocol && (url.protocol.startsWith('https') || url.protocol.startsWith('wss')),\n      path: UrlUtils.noTrailingSlash(UrlUtils.cleanPath(url.pathname)),\n    });\n  }\n\n  static path(peer: Peer, ...paths: string[]): string {\n    if (!peer) throw new Error(\"Missing required argument 'peer'!\");\n    // Remove starting slashes\n    paths = (paths || [])\n      .map((path) => {\n        if (path.startsWith('./')) return path.substring(2);\n        if (path.startsWith('/')) return path.substring(1);\n        return path;\n      })\n      .filter(isNotNilOrBlank);\n    return [noTrailingSlash(Peer.fromObject(peer).url)].concat(...paths).join('/');\n  }\n\n  static equals(p1: Peer, p2: Peer) {\n    return p1 && p2 && Peer.fromObject(p1).equals(p2);\n  }\n\n  static countAllFeatures(peers: Peer[]): number {\n    return (peers || []).reduce((res, peer) => {\n      return res + (peer?.features?.length || 0);\n    }, 0);\n  }\n\n  dns: string;\n  ipv4: string;\n  ipv6: string;\n  port: number;\n  useSsl: boolean;\n  pubkey: string;\n  path?: string;\n\n  favicon: string;\n  status: 'UP' | 'DOWN';\n  softwareName: string;\n  softwareVersion: string;\n  label: string;\n  name: string;\n  registrationUri?: string;\n  registrationManager?: string;\n  features?: NodeFeature[];\n\n  constructor() {\n    super(Peer.TYPENAME);\n  }\n\n  asObject(options?: EntityAsObjectOptions): any {\n    const target = super.asObject(options);\n    target.features = this.features?.map((feature) => feature.asObject(options));\n    return target;\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.dns = source.dns || source.host;\n    this.ipv4 = source.ipv4;\n    this.ipv6 = source.ipv6;\n    this.port = isNotNil(source.port) ? +source.port : undefined;\n    this.useSsl = source.useSsl || this.port === 443;\n    this.pubkey = source.pubkey;\n    this.path = source.path || '';\n\n    this.favicon = source.favicon;\n    this.status = source.status;\n    this.softwareName = source.softwareName;\n    this.softwareVersion = source.softwareVersion;\n    this.label = source.label || '';\n    this.name = source.name || '';\n    this.registrationUri = source.registrationUri || '';\n    this.registrationManager = source.registrationManager;\n\n    this.features = source.features?.map(NodeFeature.fromObject);\n  }\n\n  equals(other: Peer): boolean {\n    return (\n      // Same entity (by id)\n      (isNotNil(this.id) && isNotNil(other.id) && this.id === other.id) ||\n      // Same pubkey (if defined)\n      ((!this.pubkey || !other.pubkey || this.pubkey === other.pubkey) &&\n        // Same url\n        this.url === other.url)\n    );\n  }\n\n  /**\n   * Return the peer URL (without trailing slash)\n   */\n  get url(): string {\n    return (this.useSsl ? 'https://' : 'http://') + this.hostAndPort + (this.path || '');\n  }\n\n  get hostAndPort(): string {\n    return (this.dns || this.ipv4 || this.ipv6) + (this.port && this.port !== 80 && this.port !== 443 ? ':' + this.port : '');\n  }\n\n  get reachable(): boolean {\n    return this.status && this.status === 'UP';\n  }\n}\n","import { EventEmitter, Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { APP_LOCALES, isOnFieldMode, LocalSettings, OfflineFeature, UsageMode } from './model/settings.model';\nimport { Peer } from './model/peer.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Storage } from '@ionic/storage-angular';\n\nimport {\n  equals,\n  getPropertyByPath,\n  isEmptyArray,\n  isNil,\n  isNotEmptyArray,\n  isNotNil,\n  isNotNilOrBlank,\n  undefinedIfNull\n} from '../../shared/functions';\nimport { merge, Subject } from 'rxjs';\nimport { Platform } from '@ionic/angular';\nimport { FormFieldDefinition, FormFieldDefinitionMap } from '../../shared/form/field.model';\nimport { Moment } from 'moment';\nimport { debounceTime, distinctUntilChanged, filter, map, startWith } from 'rxjs/operators';\nimport { LatLongPattern } from '../../shared/material/latlong/latlong.utils';\nimport { ENVIRONMENT, Environment } from '../../../environments/environment.class';\nimport { environment } from '../../../environments/environment';\nimport { DateUtils, fromDateISOString } from '../../shared/dates';\nimport { HistoryPageReference } from './model/history.model';\nimport { StartableService } from '../../shared/services/startable-service.class';\nimport { isCapacitor, isMobile } from '../../shared/platforms';\nimport { AppPropertiesUtils } from '../form/properties/properties.utils';\nimport { UrlUtils } from '../../shared/file/url.utils';\n\nexport const SETTINGS_STORAGE_KEY = 'settings';\nexport const SETTINGS_TRANSIENT_PROPERTIES = ['mobile', 'touchUi' /*deprecated*/];\n\n// fixme: this constant points to static environment\nconst DEFAULT_SETTINGS: LocalSettings = {\n  accountInheritance: true,\n  locale: environment.defaultLocale,\n  latLongFormat: environment.defaultLatLongFormat || 'DDMM',\n  pageHistoryMaxSize: 3,\n};\n\nexport interface LocalSettingsOptions {\n  serializeAsString?: boolean; // false by default\n  options: FormFieldDefinitionMap;\n  skipEmitPagesChanges?: boolean;\n}\nexport declare interface AddToPageHistoryOptions {\n  /**\n   * Represents a configuration option that determines whether query parameters\n   * should be removed from the path in a given URL or resource.\n   *\n   * When set to `true` (default), any query parameters appended to the path\n   * will be stripped or ignored during processing.\n   * When set to `false` or undefined, query parameters in the path\n   * will remain intact and be considered.\n   *\n   * Commonly used in scenarios where URL normalization or simplification is required.\n   */\n  removePathQueryParams?: boolean;\n\n  /**\n   * A boolean flag indicating whether to remove the <small> HTML tag\n   * from the title. When set to true, any <small> tags within the title\n   * will be stripped or ignored. Defaults to undefined if not provided.\n   */\n  removeTitleSmallTag?: boolean;\n\n  /**\n   * Specifies whether an event should be emitted or not.\n   *\n   * When set to `true`, the relevant event will be triggered.\n   * When set to `false` or omitted, no event will be emitted.\n   *\n   * Typically used to control the propagation of changes or actions\n   * to event listeners within a system or application.\n   */\n  emitEvent?: boolean;\n}\n\nexport const APP_LOCAL_SETTINGS = new InjectionToken<Partial<LocalSettings>>('DefaultLocalSettings');\nexport const APP_LOCAL_SETTINGS_OPTIONS = new InjectionToken<LocalSettingsOptions>('LocalSettingsOptions');\n\n@Injectable({\n  providedIn: 'root',\n  deps: [APP_LOCALES],\n})\nexport class LocalSettingsService extends StartableService<LocalSettings> {\n  private readonly _optionDefs: FormFieldDefinition[];\n  private readonly _serializeAsString: boolean;\n  private readonly _skipEmitPagesChanges: boolean;\n  private _$storeLocallyEventEmitter = new EventEmitter<any>();\n\n  readonly onChange = new Subject<LocalSettings>();\n  readonly onStoredLocally = new EventEmitter<LocalSettings>();\n  darkMode$ = merge(this.onChange, this.startSubject).pipe(\n    distinctUntilChanged(),\n    map((data) => data?.darkMode || false)\n  );\n  locale$ = merge(this.onChange, this.startSubject).pipe(\n    startWith(this.settings),\n    distinctUntilChanged(),\n    map((data) => data?.locale || this.environment?.defaultLocale)\n  );\n\n  get settings(): LocalSettings {\n    return this._data || this.defaultSettings;\n  }\n\n  get locale(): string {\n    return (this._data && this._data.locale) || this.translate.currentLang || this.translate.defaultLang;\n  }\n\n  get latLongFormat(): LatLongPattern {\n    return (this._data && this._data.latLongFormat) || 'DDMM';\n  }\n\n  get usageMode(): UsageMode {\n    return isNotNil(this._data.usageMode) ? this._data.usageMode : isCapacitor(window) && isMobile(window) ? 'FIELD' : 'DESK';\n  }\n\n  set usageMode(value: UsageMode) {\n    this.applyProperty('usageMode', value);\n  }\n\n  get mobile(): boolean {\n    return isNotNil(this._data.mobile) ? this._data.mobile : isMobile(window);\n  }\n\n  set mobile(value: boolean) {\n    this._data.mobile = value;\n  }\n\n  get pageHistory(): HistoryPageReference[] {\n    return (this._data && this._data.pageHistory) || [];\n  }\n\n  get allowDarkMode(): boolean {\n    return this.environment?.allowDarkMode === true;\n  }\n\n  get isDarkMode(): boolean {\n    return this.allowDarkMode && this._data?.darkMode === true;\n  }\n\n  constructor(\n    platform: Platform,\n    private translate: TranslateService,\n    private storage: Storage,\n    @Inject(ENVIRONMENT) protected readonly environment: Environment,\n    @Optional() @Inject(APP_LOCAL_SETTINGS) private readonly defaultSettings: LocalSettings,\n    @Optional() @Inject(APP_LOCAL_SETTINGS_OPTIONS) options: LocalSettingsOptions\n  ) {\n    super(platform);\n    this.defaultSettings = { ...DEFAULT_SETTINGS, ...this.defaultSettings };\n\n    this._optionDefs = Object.values(options?.options || {});\n    this._serializeAsString = options?.serializeAsString || false;\n    this._skipEmitPagesChanges = options?.skipEmitPagesChanges ?? false;\n\n    this.resetData();\n\n    this._debug = !environment.production;\n    if (this._debug) console.debug('[settings] Creating service');\n  }\n\n  ngOnStart(): Promise<LocalSettings> {\n    console.debug('[settings] Starting service...');\n\n    // Default value\n    this._data.mobile = this.mobile;\n    this._data.usageMode = this.usageMode;\n    this._data.locale = this.locale;\n\n    // Listen persist event\n    this.registerSubscription(\n      this._$storeLocallyEventEmitter\n        .pipe(\n          debounceTime(2000), // add a delay of 2 seconds\n          filter(() => this.started)\n        )\n        .subscribe(() => this.storeLocally(true))\n    );\n\n    // Restoring local settings\n    return this.restoreLocally();\n  }\n\n  isUsageMode(mode: UsageMode): boolean {\n    return this.usageMode === mode;\n  }\n\n  isOnFieldMode(value?: UsageMode): boolean {\n    return isOnFieldMode(value || this.usageMode);\n  }\n\n  async restoreLocally(): Promise<LocalSettings | undefined> {\n    let data = this._data || <LocalSettings>{};\n\n    // Restore from storage\n    const settings = await this.storage.get(SETTINGS_STORAGE_KEY);\n\n    // Restore local settings (or keep old settings)\n    if (isNotNil(settings)) {\n      console.debug('[settings] Restoring previous settings...');\n\n      const restoredData = typeof settings === 'string' ? JSON.parse(settings) : settings;\n\n      // Avoid to override transient properties\n      SETTINGS_TRANSIENT_PROPERTIES.forEach((transientKey) => {\n        delete restoredData[transientKey];\n      });\n\n      // Merge into existing data\n      data = Object.assign(data, restoredData);\n\n      // Fix known attribute\n      if (data.pageHistory && !Array.isArray(data.pageHistory)) data.pageHistory = [];\n    }\n\n    // Initialize darkMode, if not set\n    if (this.environment?.allowDarkMode !== true) {\n      delete data.darkMode;\n      delete data.autoDarkMode;\n    } else if (isNil(data.darkMode) || data.autoDarkMode !== false) {\n      console.debug('[settings] Auto-detect system dark mode...');\n      data.darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;\n      data.autoDarkMode = true;\n    }\n\n    // Emit event\n    this.onChange.next(data);\n\n    return data;\n  }\n\n  setProperty<T = string>(keyOrDef: string | FormFieldDefinition, value: T, opts?: { emitEvent?: boolean; immediate?: boolean }) {\n    if (!this._data || !keyOrDef) return;\n    if (typeof keyOrDef === 'object') {\n      this.setProperty(keyOrDef.key, value);\n      return;\n    }\n    if (this._debug) console.debug(`[settings] Setting property ${keyOrDef} to:`, value);\n\n    this._data.properties = this._data.properties || {};\n    this._data.properties[keyOrDef] = isNil(value) ? undefined : value.toString();\n\n    // Update local settings\n    if (!opts || opts.emitEvent !== false) {\n      this.storeLocally(opts?.immediate);\n    }\n  }\n\n  getProperty(keyOrDef: string | FormFieldDefinition, defaultValue?: any): any {\n    if (typeof keyOrDef === 'object') {\n      return this.getProperty(keyOrDef.key, isNotNil(defaultValue) ? defaultValue : keyOrDef.defaultValue);\n    }\n    const value = this._data && this._data.properties && this._data.properties[keyOrDef];\n    return isNotNil(value) ? value : undefinedIfNull(defaultValue);\n  }\n\n  getPropertyAsBoolean(definition: FormFieldDefinition, defaultValue?: boolean): boolean {\n    const value = this.getProperty(definition, defaultValue);\n    return isNotNil(value) ? value && value !== 'false' : undefined;\n  }\n\n  getPropertyAsInt(definition: FormFieldDefinition, defaultValue?: number): number {\n    const value = this.getProperty(definition, defaultValue);\n    return isNotNil(value) ? parseInt(value) : undefined;\n  }\n\n  getPropertyAsNumbers(definition: FormFieldDefinition, defaultValue?: number[]): number[] {\n    const value = this.getProperty(definition, defaultValue);\n    if (typeof value === 'string') return value.split(',').map(parseFloat) || undefined;\n    return isNotNil(value) ? [parseFloat(value)] : undefined;\n  }\n\n  getPropertyAsStrings(definition: FormFieldDefinition, defaultValue?: string[]): string[] {\n    const value = this.getProperty(definition, defaultValue);\n    return (value && value.split(',')) || undefined;\n  }\n\n  getPropertyAsObjects(definition: FormFieldDefinition, defaultValue?: any[]): any[] {\n    let value = this.getProperty(definition, defaultValue);\n    // Parse array\n    if (value && typeof value === 'string') {\n      value = JSON.parse(value);\n    }\n    if (value && !Array.isArray(value)) {\n      return [value];\n    }\n    return value;\n  }\n\n  async apply(settings: Partial<LocalSettings>, opts?: { emitEvent?: boolean; persistImmediate?: boolean; sanitize?: boolean }) {\n    if (!this.started) await this.ready();\n\n    // Sanitize (keep properties that can be set by user\n    if (opts?.sanitize) {\n      settings.properties = AppPropertiesUtils.sanitize(settings.properties, { definitions: this.optionDefs });\n    }\n\n    const data = {\n      ...this._data,\n      ...settings,\n    };\n\n    if (equals(data, this._data)) return; // Skip if no changes\n\n    // DEBUG\n    //console.debug('[platform] Applying local settings...', settings);\n\n    this._data = data;\n\n    // Save locally\n    if (opts && opts.persistImmediate) {\n      await this.storeLocally(true);\n    } else {\n      this.storeLocally(); // No AWAIT\n    }\n\n    // Emit event\n    if (!opts || opts.emitEvent !== false) {\n      this.onChange.next(this._data);\n    }\n  }\n\n  async applyProperty(key: keyof LocalSettings, value: any, opts?: { emitEvent?: boolean; persistImmediate?: boolean }) {\n    const changes = {};\n    changes[key] = value;\n    await this.apply(changes, opts);\n  }\n\n  getPageSettings<T = any>(pageId: string, propertyName?: string): T {\n    if (!this._data || !this._data.pages) return undefined;\n    const key = pageId.replace(/[/]/g, '__');\n    if (isNotNilOrBlank(propertyName)) {\n      return getPropertyByPath(this._data.pages, key + '.' + propertyName);\n    }\n    return this._data.pages[key];\n  }\n\n  async savePageSetting(pageId: string, value: any, propertyName?: string, opts?: { emitEvent?: boolean }) {\n    this._data = this._data || this.defaultSettings;\n    this._data.pages = this._data.pages || {};\n\n    const key = pageId.replace(/[/]/g, '__');\n    if (propertyName) {\n      this._data.pages[key] = this._data.pages[key] || {};\n      this._data.pages[key][propertyName] = value;\n    } else {\n      this._data.pages[key] = value;\n    }\n\n    // Emit event (if not skipped)\n    const emitEvent = opts?.emitEvent !== false && !this._skipEmitPagesChanges;\n    if (emitEvent) {\n      this.onChange.next(this._data);\n    }\n\n    // Update local settings - NO AWAIT\n    this.storeLocally();\n  }\n\n  getOfflineFeature<F = any>(featureName: string): OfflineFeature<F> {\n    if (!this._data || !this._data.offlineFeatures || isEmptyArray(this._data.offlineFeatures)) return undefined;\n    if (!featureName) throw Error(\"Missing 'featureName' argument\");\n\n    featureName = featureName.toLowerCase();\n    const featurePrefix = featureName + '#';\n    const feature = this._data.offlineFeatures.find((f) => {\n      if (typeof f === 'string') return f.toLowerCase().startsWith(featurePrefix);\n      if (f && typeof f === 'object' && f.name) return f.name === featureName;\n      return false;\n    });\n    if (!feature) return; // Not found\n    if (typeof feature === 'string') {\n      const lastSyncDate = feature.substring(featurePrefix.length);\n      console.info(`[${featureName}] Last synchronization date: ${lastSyncDate}`);\n      return {\n        name: featureName,\n        lastSyncDate,\n      };\n    }\n    return feature;\n  }\n\n  getOfflineFeatureLastSyncDate(featureName: string): Moment {\n    const feature = this.getOfflineFeature(featureName);\n    return feature && fromDateISOString(feature.lastSyncDate);\n  }\n\n  hasOfflineFeature(featureName?: string): boolean {\n    if (featureName) return isNotNil(this.getOfflineFeature(featureName));\n    return this._data && isNotEmptyArray(this._data.offlineFeatures);\n  }\n\n  saveOfflineFeature(feature: OfflineFeature) {\n    this._data = this._data || this.defaultSettings;\n    this._data.offlineFeatures = this._data.offlineFeatures || [];\n\n    feature.name = feature.name.toLowerCase();\n\n    const featurePrefix = feature.name + '#';\n    const existingIndex = this._data.offlineFeatures.findIndex((f) => {\n      if (typeof f === 'string') return f.toLowerCase().startsWith(featurePrefix);\n      if (f && typeof f === 'object' && f.name) return f.name === feature.name;\n      return false;\n    });\n    if (existingIndex !== -1) {\n      this._data.offlineFeatures[existingIndex] = feature;\n    } else {\n      this._data.offlineFeatures.push(feature);\n    }\n\n    // Update local settings - NO AWAIT\n    this.storeLocally();\n  }\n\n  markOfflineFeatureAsSync(featureName: string) {\n    let feature = this.getOfflineFeature(featureName);\n\n    if (!feature) {\n      feature = <OfflineFeature>{\n        name: featureName.toLowerCase(),\n        lastSyncDate: DateUtils.moment().toISOString(),\n      };\n    } else {\n      feature.lastSyncDate = DateUtils.moment().toISOString();\n    }\n\n    this.saveOfflineFeature(feature);\n  }\n\n  removeOfflineFeatures() {\n    if (this._data && this._data.offlineFeatures) {\n      this._data.offlineFeatures = [];\n\n      // Update local settings - NO AWAIT\n      this.storeLocally();\n    }\n  }\n\n  getFieldDisplayAttributes(fieldName: string, defaultAttributes?: string[]): string[] {\n    const value = this._data && this._data.properties && this._data.properties[`sumaris.field.${fieldName}.attributes`];\n    // Nothing found in settings: return defaults\n    if (!value) return defaultAttributes || ['label', 'name'];\n\n    return value.split(',');\n  }\n\n  getPageFieldDefaultValue(pageId: string, fieldName: string): any {\n    return this.getPageSettings(pageId, `field.${fieldName}.defaultValue`);\n  }\n\n  get optionDefs(): FormFieldDefinition[] {\n    return this._optionDefs;\n  }\n\n  registerOption(def: FormFieldDefinition, opts?: { replaceIfExists?: boolean }) {\n    const index = this._optionDefs.findIndex((f) => f.key === def.key);\n    if (index !== -1) {\n      if (opts?.replaceIfExists !== true) {\n        throw new Error(`Additional property {${def.key}} already define.`);\n      }\n      // Replace existing\n      if (this._debug) console.debug(`[settings] Updating additional property {${def.key}}`, def);\n      this._optionDefs[index] = def;\n    } else {\n      if (this._debug) console.debug(`[settings] Adding additional property {${def.key}}`, def);\n      this._optionDefs.push(def);\n    }\n  }\n\n  registerOptions(defs: FormFieldDefinition[]) {\n    (defs || []).forEach((def) => this.registerOption(def));\n  }\n\n  async addToPageHistory(\n    page: HistoryPageReference,\n    opts?: AddToPageHistoryOptions,\n    pageHistory?: HistoryPageReference[] // used for recursive call to children\n  ) {\n    // If not inside recursive call: fill page history defaults\n    if (!pageHistory) this.fillPageHistoryDefaults(page, opts);\n\n    // Workaround to fix error in console, because pageHistory is not an array (seems to occur after a peer changed)\n    if (!pageHistory && !Array.isArray(this._data.pageHistory)) {\n      this._data.pageHistory = [];\n    }\n\n    pageHistory = Array.isArray(pageHistory) ? pageHistory : this._data.pageHistory;\n\n    const index = pageHistory.findIndex(\n      (p) =>\n        // same path\n        p.path === page.path ||\n        // or sub-path\n        page.path.startsWith(p.path + '/')\n    );\n\n    // New page: insert it\n    if (index === -1) {\n      // DEBUG\n      //if (this._debug) console.debug('[settings] Adding page to history: ', page);\n\n      // Prepend to list\n      pageHistory.splice(0, 0, page);\n    } else {\n      const existingPage = pageHistory[index];\n\n      // Same path: replace existing page\n      if (pageHistory[index].path === page.path) {\n        // DEBUG\n        //if (this._debug) console.debug('[settings] Updating existing page in history: ', page);\n\n        pageHistory.splice(index, 1);\n\n        // Copy exiting children\n        page.children = existingPage.children || [];\n\n        // Prepend to list\n        pageHistory.splice(0, 0, page);\n      }\n\n      // Not same path (should be a parent page)\n      else {\n        // Create parent's children array, if not exists\n        existingPage.children = existingPage.children || [];\n\n        // Update the parent time\n        existingPage.time = page.time;\n\n        // Add page as parent's children (recursive call)\n        await this.addToPageHistory(page, opts, existingPage.children);\n      }\n    }\n\n    // Save locally (only if not a recursive execution)\n    if (pageHistory === this._data.pageHistory) {\n      // If max has been reached, remove old pages\n      if (pageHistory.length > this._data.pageHistoryMaxSize) {\n        const removedPages = pageHistory.splice(this._data.pageHistoryMaxSize, pageHistory.length - this._data.pageHistoryMaxSize);\n        //if (this._debug) console.debug('[settings] Pages removed from history: ', removedPages);\n      }\n\n      // Apply new value\n      await this.applyProperty('pageHistory', pageHistory);\n    }\n  }\n\n  async removePageHistory(\n    path: string,\n    opts?: { emitEvent?: boolean; persistImmediate?: boolean },\n    pageHistory: HistoryPageReference[] = undefined, // used for recursive call to children)\n    depth = 0\n  ) {\n    const root = depth === 0;\n    pageHistory = pageHistory || this._data.pageHistory?.slice() /*clone, to force apply to save */ || [];\n\n    const index = pageHistory.findIndex((p) => p.path === path);\n    let found = index !== -1;\n    if (found) {\n      // DEBUG\n      if (this._debug) console.debug('[settings] Remove page history: ', path);\n\n      // Remove value\n      pageHistory.splice(index, 1);\n    } else {\n      // Search path on children (stop when found)\n      found =\n        pageHistory\n          .map((p) => p.children)\n          .filter(isNotEmptyArray)\n          .findIndex((children) => this.removePageHistory(path, opts, children, (depth || 0) + 1)) !== -1;\n    }\n\n    // Save locally (only if root level)\n    if (found && root) {\n      // Apply changes\n      await this.applyProperty('pageHistory', pageHistory);\n    }\n\n    return found;\n  }\n\n  async clearPageHistory() {\n    // Reset all page history\n    await this.applyProperty('pageHistory', [], { persistImmediate: true });\n  }\n\n  /* -- Protected methods -- */\n\n  protected async ngOnStop(): Promise<void> {\n    this.resetData();\n  }\n\n  private resetData() {\n    this._data = { ...this._data, ...this.defaultSettings };\n\n    this._data.locale = this.translate.currentLang || this.translate.defaultLang || this._data.locale;\n    this._data.mobile = undefined;\n    this._data.usageMode = undefined;\n    this._data.pageHistory = [];\n    this._data.properties = {};\n\n    const defaultPeer = this.environment.defaultPeer && Peer.fromObject(this.environment.defaultPeer);\n    this._data.peerUrl = (defaultPeer && defaultPeer.url) || undefined;\n\n    if (this.started) this.onChange.next(this._data);\n  }\n\n  private async storeLocally(immediate?: boolean): Promise<any> {\n    // Execute immediate\n    if (immediate) {\n      if (!this._data) {\n        // INFO\n        console.info('[settings] Removing local settings from storage');\n\n        return this.storage.remove(SETTINGS_STORAGE_KEY);\n      } else {\n        try {\n          // INFO\n          console.info('[settings] Store local settings', this._data);\n          if (this._serializeAsString) {\n            // Fix serialization error, in Sumaris-App\n            return await this.storage.set(SETTINGS_STORAGE_KEY, JSON.stringify(this._data));\n          }\n          return await this.storage.set(SETTINGS_STORAGE_KEY, this._data);\n        } finally {\n          this.onStoredLocally.emit(this._data);\n        }\n      }\n    }\n\n    // Execute with delay\n    else {\n      this._$storeLocallyEventEmitter.emit();\n    }\n  }\n\n  private fillPageHistoryDefaults(\n    page: HistoryPageReference,\n    opts?: {\n      removePathQueryParams?: boolean;\n      removeTitleSmallTag?: boolean;\n    }\n  ): HistoryPageReference {\n    if (!page || !page.title || !page.path) throw Error(\"Missing required argument 'page', 'page.path' or 'page.title'\");\n\n    // Set time\n    page.time = page.time || DateUtils.moment();\n\n    // Clean title\n    if (!opts || opts.removeTitleSmallTag !== false) {\n      // Remove <small> HTML tags\n      const smallTagIndex = page.title.indexOf('</small>');\n      if (smallTagIndex !== -1) {\n        page.title = page.title.substring(smallTagIndex + '</small>'.length);\n      }\n      page.title = page.title\n        // Remove class=\"...\" HTML attribute\n        .replace(/\\s*class=['\"][^'\"]+['\"]'/g, '')\n        // trim\n        .trim();\n    }\n\n    // Remove query params\n    if (!opts || opts.removePathQueryParams !== false) {\n      page.path = UrlUtils.stripQuery(page.path);\n    }\n\n    return page;\n  }\n}\n","import { LoadResult, SuggestFn, SuggestService } from '../../services/entity-service.class';\nimport { MatAutocompleteFieldUtils } from './material.autocomplete.utils';\nimport { Observable } from 'rxjs';\nimport { DisplayFn, EqualsFn } from '../../types';\n\nexport declare interface MatAutocompleteFieldConfig<T = any, F = any> {\n  attributes?: string[];\n  suggestFn?: SuggestFn<T, F>;\n  filter?: Partial<F>;\n  items?: Observable<T[]> | T[];\n  columnSizes?: (number | 'auto' | undefined)[];\n  columnNames?: (string | undefined)[];\n  multiple?: boolean;\n  displayWith?: DisplayFn;\n  displayWithSeparator?: string; // Use to split searchText before searching\n  splitSearchText?: boolean; // Split searchText before searching? (will use the first value)\n  trimSearchText?: boolean; // Trim searchText before searching?\n  clearInvalidSearchTextOnBlur?: boolean; // Clear invalid text, on blur (false by default)\n  equals?: EqualsFn; // Used by <mat-chips-field>\n  showAllOnFocus?: boolean;\n  showPanelOnFocus?: boolean;\n  reloadItemsOnFocus?: boolean;\n  mobile?: boolean;\n  debounceTime?: number;\n  suggestLengthThreshold?: number;\n  highlightAccent?: boolean;\n  applyImplicitValue?: boolean;\n\n  /**\n   * Should select input content (desktop only)\n   */\n  selectInputContentOnFocus?: boolean;\n\n  /**\n   * Add a delay (ms) before trying to select input content (desktop only)\n   */\n  selectInputContentOnFocusDelay?: number;\n\n  /**\n   * If true, any invalid value entered in the input field will be cleared when the input loses focus.\n   * This helps in preventing invalid data to be displayed on the field\n   */\n  clearInvalidValueOnBlur?: boolean;\n\n  /**\n   * Determines whether the implicit value is preview in the input text field or not (desktop only).\n   *\n   * If not specified, the default behavior is to not preview implicit values (`false`).\n   *\n   * @type {boolean}\n   */\n  previewImplicitValue?: boolean;\n\n  /**\n   * Class to apply to the `div.mat-mdc-select-panel`\n   */\n  panelClass?: string;\n\n  /**\n   * Allow to fix panel width (e.g. '500px' or '100vw')\n   */\n  panelWidth?: string;\n\n  /**\n   * @deprecated use `panelClass` instead\n   */\n  class?: string;\n}\n\nexport declare interface MatAutocompleteFieldAddOptions<T = any, F = any> extends Partial<MatAutocompleteFieldConfig<T, F>> {\n  service?: SuggestService<T, F>;\n}\n\nexport class MatAutocompleteConfigHolder {\n  fields: {\n    [key: string]: MatAutocompleteFieldConfig;\n  } = {};\n\n  getUserAttributes: (fieldName: string, defaultAttributes?: string[]) => string[];\n\n  constructor(\n    private options?: {\n      getUserAttributes: (fieldName: string, defaultAttributes?: string[]) => string[];\n    }\n  ) {\n    // Store the function from options (e.g. get from user settings)\n    // or create a default function\n    this.getUserAttributes = options?.getUserAttributes || ((fieldName, defaultAttributes) => defaultAttributes || ['label', 'name']);\n  }\n\n  add<T = any, F = any>(fieldName: string, options?: MatAutocompleteFieldAddOptions<T, F>): MatAutocompleteFieldConfig<T, F> {\n    if (!fieldName) {\n      throw new Error('Unable to add config, with name: ' + (fieldName || 'undefined'));\n    }\n    options = options || <MatAutocompleteFieldAddOptions>{};\n    const suggestFn: SuggestFn<T, F> = options.suggestFn || (options.service && ((v, f) => options.service.suggest(v, f))) || undefined;\n    const attributes = this.getUserAttributes(fieldName, options.attributes) || ['label', 'name'];\n    // Keep original the function from options, when exists\n    const attributesOrFn = attributes.map((a, index) => (typeof a === 'function' && options.attributes[index]) || a);\n    const filter: Partial<F> = {\n      searchAttribute: attributes.length === 1 ? attributes[0] : undefined,\n      searchAttributes: attributes.length > 1 ? attributes : undefined,\n      ...options.filter,\n    };\n    const displayWith = options.displayWith || MatAutocompleteFieldUtils.createDisplayFn(attributes, options.multiple);\n    const equals = options.equals || MatAutocompleteFieldUtils.defaultEquals;\n\n    const config: MatAutocompleteFieldConfig = {\n      ...options,\n      attributes: attributesOrFn,\n      suggestFn,\n      filter,\n      displayWith,\n      equals,\n    };\n\n    this.fields[fieldName] = config;\n    return config;\n  }\n\n  get<T = any>(fieldName: string): MatAutocompleteFieldConfig<T> {\n    if (!fieldName) {\n      throw new Error('Unable to add config, with name: ' + (fieldName || 'undefined'));\n    }\n    return this.fields[fieldName] || (this.add(fieldName) as MatAutocompleteFieldConfig<T>);\n  }\n}\n","import {booleanAttribute, Directive, EventEmitter, inject, Injector, Input, numberAttribute, OnDestroy, OnInit, Output} from '@angular/core';\nimport {FormGroup, UntypedFormGroup} from '@angular/forms';\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\nimport { AppFormUtils, IAppForm, OnReady } from './form.utils';\nimport { LocalSettingsService } from '../services/local-settings.service';\nimport { waitForFalse, WaitForOptions, waitForTrue } from '../../shared/observables';\nimport { FormErrorTranslateOptions, FormErrorTranslator, IFormPathTranslator } from '../../shared/validator/form-error-adapter.class';\nimport { changeCaseToUnderscore } from '../../shared/functions';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n  MatAutocompleteConfigHolder,\n  MatAutocompleteFieldAddOptions,\n  MatAutocompleteFieldConfig,\n} from '../../shared/material/autocomplete/material.autocomplete.config';\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class AppForm<T> implements IAppForm<T>, OnInit, OnDestroy, IFormPathTranslator {\n  private _subscription = new Subscription();\n  protected _form: UntypedFormGroup;\n  protected _enabled = false;\n  protected errorTranslator: FormErrorTranslator = inject(FormErrorTranslator);\n  protected i18nFieldPrefix: string = null;\n  protected readonly translate: TranslateService = inject(TranslateService);\n  protected readonly settings: LocalSettingsService = inject(LocalSettingsService);\n  protected readonly destroySubject = new Subject<void>();\n\n  // TODO use RxState instead ?\n  readonly readySubject = new BehaviorSubject<boolean>(false);\n  readonly loadingSubject = new BehaviorSubject<boolean>(true);\n  readonly errorSubject = new BehaviorSubject<string>(undefined);\n\n  readonly autocompleteHelper: MatAutocompleteConfigHolder;\n  readonly autocompleteFields: { [key: string]: MatAutocompleteFieldConfig };\n\n  get error(): string {\n    return this.errorSubject.value;\n  }\n\n  set error(error: string) {\n    this.setError(error);\n  }\n\n  get loading(): boolean {\n    return this.loadingSubject.value;\n  }\n\n  get loaded(): boolean {\n    return !this.loadingSubject.value;\n  }\n\n  get value(): any {\n    return this.form.value;\n  }\n\n  set value(data: any) {\n    this.setValue(data);\n  }\n\n  get dirty(): boolean {\n    return this.form?.dirty || false;\n  }\n\n  get invalid(): boolean {\n    return !this.form || this.form.invalid;\n  }\n\n  get pending(): boolean {\n    return !this.form || (this.form.dirty && this.form.pending);\n  }\n\n  get valid(): boolean {\n    return this.form?.valid || false;\n  }\n\n  get empty(): boolean {\n    return !this.form || (!this.form.dirty && !this.form.touched);\n  }\n\n  get touched(): boolean {\n    return this.form?.touched || false;\n  }\n\n  get untouched(): boolean {\n    return !this.form || this.form.untouched;\n  }\n\n  get enabled(): boolean {\n    return this._enabled;\n  }\n\n  get disabled(): boolean {\n    return !this._enabled;\n  }\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void {\n    this.form?.disable(opts);\n    if (this._enabled) {\n      this._enabled = false;\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }): void {\n    this.form?.enable(opts);\n    if (!this._enabled) {\n      this._enabled = true;\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  get destroyed(): boolean {\n    return this.destroySubject?.closed !== false;\n  }\n\n  @Input({ transform: booleanAttribute }) debug = false;\n  @Input({ transform: numberAttribute }) tabindex: number;\n  @Input() errorTranslateOptions: FormErrorTranslateOptions;\n\n  @Input()\n  set form(value: UntypedFormGroup) {\n    this.setForm(value);\n  }\n\n  get form(): UntypedFormGroup {\n    return this._form;\n  }\n\n  @Output() onCancel = new EventEmitter<any>();\n  @Output() onSubmit = new EventEmitter<any>();\n\n  constructor(formOrInjector?: Injector | UntypedFormGroup, form?: UntypedFormGroup) {\n    const injector = formOrInjector instanceof Injector ? formOrInjector : undefined;\n    form = formOrInjector instanceof FormGroup ? formOrInjector : form;\n    if (form) this.setForm(form);\n    this.autocompleteHelper = new MatAutocompleteConfigHolder(\n      this.settings && {\n        getUserAttributes: (a, b) => this.settings.getFieldDisplayAttributes(a, b),\n      }\n    );\n    this.autocompleteFields = this.autocompleteHelper.fields;\n  }\n\n  ngOnInit() {\n    // Set defaults\n    this.errorTranslateOptions = this.errorTranslateOptions || { separator: ', ', pathTranslator: this }; // Can be override in subclasses constructors\n\n    // Enable/disable delegate form\n    if (this._enabled) this.enable();\n    else this.disable();\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n\n    this.readySubject.unsubscribe();\n    this.loadingSubject.unsubscribe();\n    this.errorSubject.unsubscribe();\n    this.onCancel.unsubscribe();\n    this.onSubmit.unsubscribe();\n\n    this.destroySubject.next();\n    this.destroySubject.unsubscribe();\n  }\n\n  async cancel() {\n    this.onCancel.emit();\n  }\n\n  /**\n   *\n   * @param event\n   * @param opts allow to skip validation check, using {checkValid: false}\n   */\n  async doSubmit(event: any, opts?: { checkValid?: boolean }) {\n    if (!this._form) {\n      this.markAllAsTouched({ emitEvent: true });\n      return;\n    }\n\n    // Check if valid (if not disabled)\n    if ((!opts || opts.checkValid !== false) && !this._form.valid) {\n      // Wait validation end\n      await AppFormUtils.waitWhilePending(this._form);\n\n      // Form is invalid: exit (+ log if debug)\n      if (this._form.invalid) {\n        this.markAllAsTouched({ emitEvent: true });\n        if (this.debug) AppFormUtils.logFormErrors(this._form);\n        return;\n      }\n    }\n\n    // Emit event\n    this.onSubmit.emit(event);\n  }\n\n  setForm(form: UntypedFormGroup) {\n    if (this._form !== form) {\n      this._form = form;\n      this._subscription.add(this._form.statusChanges.subscribe((_) => this.markForCheck()));\n    }\n  }\n\n  getValue(): Promise<T> | T {\n    return this.form.value as T;\n  }\n\n  setValue(data: T, opts?: { emitEvent?: boolean; onlySelf?: boolean }): Promise<void> | void {\n    if (!data) {\n      console.warn('[form] Trying to set an empty value to form. Skipping');\n      return;\n    }\n\n    // DEBUG\n    //if (this.debug) console.debug('[form] Updating form (using entity)', data);\n\n    // Convert object to json, then apply it to form (e.g. convert 'undefined' into 'null')\n    AppFormUtils.copyEntity2Form(data, this.form, { emitEvent: false, onlySelf: true, ...opts });\n\n    if (!opts || opts.emitEvent !== true) {\n      this.markForCheck();\n    }\n  }\n\n  reset(data?: T, opts?: { emitEvent?: boolean; onlySelf?: boolean }) {\n    if (data) {\n      if (this.debug) console.debug('[form] Resetting form (using entity)', data);\n\n      // Convert object to json, then apply it to form (e.g. convert 'undefined' into 'null')\n      const json = AppFormUtils.getFormValueFromEntity(data, this.form);\n      this.form.reset(json, { emitEvent: false, onlySelf: true });\n    } else {\n      this.form.reset(undefined, { emitEvent: false, onlySelf: true });\n    }\n\n    if (!opts || opts.emitEvent !== true) this.markForCheck();\n  }\n\n  markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this.form.markAsPristine(opts);\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this.form.markAsUntouched(opts);\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  /**\n   * @deprecated prefer to use markAllAsTouched()\n   * @param opts\n   */\n  markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    // this.form.markAllAsTouched() // This is not working well (e.g. in TripForm)\n    if (this.debug) console.warn('TODO: Replace this call by markAllAsTouched() - because of changes in ngx-components >= 0.16.0');\n    AppFormUtils.markAsTouched(this.form, opts);\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  markAllAsTouched(opts?: { emitEvent?: boolean }) {\n    // this.form.markAllAsTouched() // This is not working well (e.g. in TripForm)\n    AppFormUtils.markAllAsTouched(this.form, opts);\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  markAsDirty(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this.form.markAsDirty(opts);\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  markAsLoading(opts?: { emitEvent?: boolean }) {\n    this.setLoading(true, opts);\n  }\n\n  markAsLoaded(opts?: { emitEvent?: boolean }) {\n    this.setLoading(false, opts);\n  }\n\n  markAsReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (!this.readySubject.closed && this.readySubject.value !== true) {\n      this.readySubject.next(true);\n\n      // If subclasses implements OnReady\n      if (typeof this['ngOnReady'] === 'function') {\n        (this as any as OnReady).ngOnReady();\n      }\n    }\n  }\n\n  markAsNotReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (!this.readySubject.closed && this.readySubject.value !== false) {\n      this.readySubject.next(false);\n    }\n  }\n\n  /**\n   * Wait form is ready\n   *\n   * @param opts\n   */\n  ready(opts?: WaitForOptions): Promise<void> {\n    if (this.readySubject.value) return Promise.resolve();\n    return waitForTrue(this.readySubject, { stop: this.destroySubject, ...opts });\n  }\n\n  /**\n   * Wait form is not busy (=loaded)\n   *\n   * @param opts\n   */\n  waitIdle(opts?: WaitForOptions): Promise<void> {\n    if (!this.loadingSubject.value) return Promise.resolve();\n    return waitForFalse(this.loadingSubject, { stop: this.destroySubject, ...opts });\n  }\n\n  updateValueAndValidity(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    AppFormUtils.updateValueAndValidity(this.form, opts);\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  translateFormPath(path: string) {\n    const i18nFieldName = this.getI18nFieldName(path);\n    return this.translate?.instant(i18nFieldName) || i18nFieldName;\n  }\n\n  /* -- protected methods -- */\n\n  protected getFormError(form?: UntypedFormGroup, opts?: FormErrorTranslateOptions): string {\n    form = form ?? this.form;\n    if (!form || !this.errorTranslator) return undefined;\n    return this.errorTranslator.translateFormErrors(form, {\n      pathTranslator: this,\n      ...opts,\n    });\n  }\n\n  protected getI18nFieldName(path: string) {\n    return (this.i18nFieldPrefix || '') + changeCaseToUnderscore(path).toUpperCase();\n  }\n\n  protected registerSubscription(sub: Subscription) {\n    this._subscription.add(sub);\n  }\n\n  protected unregisterSubscription(sub: Subscription): void {\n    this._subscription.remove(sub);\n  }\n\n  protected registerAutocompleteField<E = any, EF = any>(\n    fieldName: string,\n    opts?: MatAutocompleteFieldAddOptions<E, EF>\n  ): MatAutocompleteFieldConfig<E, EF> {\n    return this.autocompleteHelper.add(fieldName, opts);\n  }\n\n  protected setError(value: string, opts?: { emitEvent?: boolean }) {\n    if (this.errorSubject.value !== value) {\n      this.errorSubject.next(value);\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  protected markForCheck() {\n    // Should be overwritten by subclasses\n    console.warn('markForCheck() has been called, but is not overwritten by component ' + this.constructor.name);\n  }\n\n  /* -- private function -- */\n\n  private setLoading(value: boolean, opts?: { emitEvent?: boolean }) {\n    if (!this.loadingSubject.closed && this.loadingSubject.value !== value) {\n      this.loadingSubject.next(value);\n\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n}\n","import { FileEvent, FileResponse, UploadFile } from '../upload-file/upload-file.model';\nimport { UploadFilePopover, UploadFilePopoverOptions } from '../upload-file/upload-file-popover.component';\n\nimport { PopoverController } from '@ionic/angular';\nimport { Observable, Subject } from 'rxjs';\nimport { HttpEventType } from '@angular/common/http';\nimport { OverlayEventDetail } from '@ionic/core';\nimport { isNilOrBlank } from '../functions';\n\nexport const MimeTypes = Object.freeze({\n  ANDROID_APK: 'application/vnd.android.package-archive',\n});\n\nexport class FilesUtils {\n  static UTF8_BOM_CHAR = new Uint8Array([0xef, 0xbb, 0xbf]); // UTF-8 BOM\n\n  static async showUploadPopover<T>(\n    popoverController: PopoverController,\n    event: Event,\n    opts: UploadFilePopoverOptions<T>\n  ): Promise<OverlayEventDetail<UploadFile<T>[]>> {\n    const modal = await popoverController.create({\n      component: UploadFilePopover,\n      componentProps: opts,\n      backdropDismiss: opts?.backdropDismiss ?? false,\n      keyboardClose: opts?.keyboardClose ?? false,\n      event,\n      translucent: opts?.translucent ?? true,\n      cssClass: opts?.cssClass ?? 'popover-large',\n    });\n\n    await modal.present();\n    const { data, role } = await modal.onDidDismiss();\n    return {\n      role,\n      data: data ? (data as UploadFile<T>[]) : undefined,\n    };\n  }\n\n  static readAsText(file: File, encoding?: string): Observable<FileEvent<string>> {\n    const $progress = new Subject<FileEvent<string>>();\n    const reader = new FileReader();\n    encoding = (encoding || 'UTF-8').toLowerCase();\n\n    // Listen progress\n    reader.onprogress = (e: ProgressEvent) => {\n      const total = e.total || 1;\n      const loaded = e.total || 0;\n      if (loaded < total) $progress.next({ type: HttpEventType.UploadProgress, loaded, total });\n    };\n\n    // Listen end\n    reader.onloadend = (_) => {\n      const body = reader.result;\n      if (typeof body === 'string') {\n        $progress.next(new FileResponse({ body }));\n        $progress.complete();\n      } else {\n        console.error(`Cannot read file '${file.name}' as text`);\n        $progress.error(`Cannot read file as text`);\n      }\n    };\n\n    // Listen error\n    reader.onerror = (event: ProgressEvent) => {\n      console.error('[files] Error while reading file:', event);\n      $progress.error(event);\n    };\n\n    // Start reading the file\n    reader.readAsText(file, encoding);\n\n    return $progress.asObservable();\n  }\n\n  static writeTextToFile(\n    content: string,\n    opts?: {\n      filename?: string;\n      encoding?: string;\n      type?: string;\n    }\n  ) {\n    if (isNilOrBlank(content)) return; // Skip if empty\n\n    const filename = opts?.filename || 'export.txt';\n    const charset = (opts?.encoding || 'utf-8').toLowerCase();\n    const type = opts?.type || 'text/plain';\n    const blob = new Blob(\n      charset === 'utf-8'\n        ? // Add UTF-8 BOM character\n          [FilesUtils.UTF8_BOM_CHAR, content]\n        : // Non UTF-8 charset\n          [content],\n      { type: `${type};charset=${charset};` }\n    );\n    blob['lastModifiedDate'] = new Date().toISOString();\n    blob['name'] = filename;\n\n    if ((navigator as any).msSaveBlob) {\n      // IE 10+\n      (navigator as any).msSaveBlob(blob, filename);\n    } else {\n      const link = document.createElement('a');\n      if (link.download !== undefined) {\n        // Browsers that support HTML5 download attribute\n        const url = URL.createObjectURL(blob);\n        link.setAttribute('href', url);\n        link.setAttribute('download', filename);\n        link.style.visibility = 'hidden';\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link);\n      }\n    }\n  }\n\n  static downloadUri(uri: string, filename?: string) {\n    if ((navigator as any).msLaunchUri) {\n      // IE 10+\n      (navigator as any).msLaunchUri(uri);\n    } else {\n      filename = filename || this.getFilenameFromUri(uri);\n      const link = document.createElement('a');\n      if (link.download !== undefined) {\n        // Browsers that support HTML5 download attribute\n        link.setAttribute('href', uri);\n        link.setAttribute('download', filename);\n        link.style.visibility = 'hidden';\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link);\n      }\n    }\n  }\n\n  static getFilenameFromUri(uri: string): string {\n    const lastSlashIndex = uri?.lastIndexOf('/');\n    if (lastSlashIndex === -1 || lastSlashIndex === uri.length - 1) throw new Error('Invalid URI format. No slash found');\n    return uri.substring(lastSlashIndex + 1);\n  }\n}\n","import { IonicSafeString, ToastController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { OverlayEventDetail, ToastOptions } from '@ionic/core';\nimport { ToastButton } from '@ionic/core/dist/types/components/toast/toast-interface';\nimport { isEmptyArray, isNotNil } from '../functions';\nimport { Injector } from '@angular/core';\nimport { TOOLBAR_HEADER_ID } from '../toolbar/toolbar';\n\nconst TOAST_MAX_HEIGHT_PX = 75;\nconst TOAST_MAX_STACK_SIZE = 4;\n\nexport declare interface ShowToastOptions extends ToastOptions {\n  type?: 'error' | 'warning' | 'info';\n  messageParams?: any;\n  showCloseButton?: boolean;\n  onWillPresent?: (toast: HTMLIonToastElement) => void;\n}\n\nexport class Toasts {\n  static counter = 0;\n  static stackSize = 0;\n\n  static async showSimple<T = any>(injector: Injector, opts: ShowToastOptions): Promise<OverlayEventDetail<T>> {\n    return this.show(injector.get(ToastController), injector.get(TranslateService), {\n      // FIXME: 'ios' mode use bottom position, but this is not working\n      //mode: injector.get(Platform)?.is('ios') ? 'ios' : 'md',\n      ...opts,\n    });\n  }\n\n  static async show<T = any>(toastController: ToastController, translate: TranslateService, opts: ShowToastOptions): Promise<OverlayEventDetail<T>> {\n    // DEBUG\n    //console.debug('[Toasts.show]', opts);\n\n    if (!toastController || !translate) {\n      console.error(\"Missing required argument 'toastController' or 'translate'\");\n      if (opts.message instanceof IonicSafeString)\n        console.info('[toasts] message: ' + ((translate && translate.instant(opts.message.value)) || opts.message.value));\n      else if (typeof opts.message === 'string')\n        console.info('[toasts] message: ' + ((translate && translate.instant(opts.message, opts.messageParams)) || opts.message));\n      return Promise.resolve({});\n    }\n\n    this.counter++; // Increment toast counter\n    let currentOffset = this.stackSize;\n    if (this.stackSize < TOAST_MAX_STACK_SIZE) {\n      this.stackSize++; // Increment stack offset\n    } else {\n      this.stackSize = 1; // Reset the stack\n      currentOffset = 0;\n    }\n    const updateCounters = () => {\n      // Decrease counter\n      this.counter--;\n      // If all toast closed: reset the stack offset\n      if (this.counter === 0) {\n        this.stackSize = 0;\n      }\n      // If current toast is the last one, decrease the offset\n      else if (this.stackSize === currentOffset + 1) {\n        this.stackSize--;\n      }\n    };\n\n    const message = opts.message && opts.message instanceof IonicSafeString ? opts.message.value : (opts.message as string);\n    const i18nKeys = [message];\n    if (opts.header) i18nKeys.push(opts.header);\n\n    let closeButton: ToastButton;\n    if (opts.showCloseButton) {\n      opts.buttons = opts.buttons || [];\n      const buttonIndex = opts.buttons\n        .map((b) => (typeof b === 'object' && (b as ToastButton)) || undefined)\n        .filter(isNotNil)\n        .findIndex((b) => b.role === 'close');\n      if (buttonIndex !== -1) {\n        closeButton = opts.buttons[buttonIndex] as ToastButton;\n      } else {\n        closeButton = { role: 'close' };\n        opts.buttons.push(closeButton);\n      }\n      closeButton.text = closeButton.text || 'COMMON.BTN_OK';\n      i18nKeys.push(closeButton.text);\n    }\n\n    // Read CSS\n    const cssArray = (opts.cssClass && typeof opts.cssClass === 'string' && opts.cssClass.split(',')) || (opts.cssClass as Array<string>) || [];\n\n    // Add 'error' class, if need\n    let icon: string;\n    if (opts.type) {\n      switch (opts.type) {\n        case 'info':\n          cssArray.push('secondary');\n          break;\n        case 'warning':\n          cssArray.push('accent');\n          icon = 'warning';\n          break;\n        case 'error':\n          cssArray.push('danger');\n          icon = 'alert-circle';\n          break;\n      }\n    }\n\n    const translations = translate.instant(i18nKeys);\n    if (opts.messageParams) {\n      translations[message] = translate.instant(message, opts.messageParams);\n    }\n\n    if (closeButton) {\n      closeButton.text = translations[closeButton.text];\n    }\n\n    // Retrieve the toast position\n    const position = opts.position || (opts.mode === 'ios' ? 'bottom' : 'top');\n\n    if (\n      !opts.enterAnimation &&\n      position !== 'middle' &&\n      // FIXME: ignore bottom position (stacked not working)\n      position !== 'bottom'\n    ) {\n      // As workaround, we add an offset using a CSS class\n      cssArray.push('toast-stacked-' + position);\n      cssArray.push('toast-stack-offset-' + currentOffset);\n    }\n\n    opts.cssClass = cssArray;\n\n    const toast = await toastController.create({\n      // Default values\n      icon,\n      position,\n      duration: opts.showCloseButton ? 10000 : 4000,\n      positionAnchor: position === 'top' ? TOOLBAR_HEADER_ID : undefined, // If display on top, avoid to override the app-toolbar (if any)\n      swipeGesture: isEmptyArray(opts.buttons) ? 'vertical' : undefined, // Allow to swipe to dismiss, if no button\n      ...opts,\n      message: translations[message],\n      header: (opts.header && translations[opts.header]) || undefined,\n    });\n\n    if (opts.onWillPresent) opts.onWillPresent(toast);\n\n    await toast.present();\n\n    if (isEmptyArray(opts.buttons)) {\n      // Not need to wait dismiss (no 'await')\n      toast.onDidDismiss().then(updateCounters);\n      return null; // no result\n    } else {\n      // Wait for button result\n      const result = await toast.onDidDismiss();\n\n      updateCounters();\n\n      return result;\n    }\n  }\n}\n","// TODO: rename to STATUS_ID_MAP\n// then declare a type like this :\n// > export type StatusIds = keyof typeof STATUS_ID_MAP;\nexport const StatusIds = {\n  DISABLE: 0,\n  ENABLE: 1,\n  TEMPORARY: 2,\n  DELETED: 3,\n  ALL: 99,\n};\n","import { Moment } from 'moment';\nimport { isNil, isNotNil, joinPropertiesPath, splitById } from '../../../shared/functions';\nimport { Entity, EntityAsObjectOptions, EntityUtils, IEntity } from './entity.model';\nimport { StatusIds } from './model.enum';\nimport { fromDateISOString, toDateISOString } from '../../../shared/dates';\nimport { EntityClass } from './entity.decorators';\nimport { IconRef } from '../../../shared/types';\n\nexport function referentialToString(obj: Referential | any, properties?: string[], separator?: string): string | undefined {\n  return (obj && isNotNil(obj.id) && joinPropertiesPath(obj, properties || ['label', 'name'], separator)) || undefined;\n}\nexport function referentialsToString(values: Referential[], properties?: string[], valueSeparator?: string, propertySeparator?: string): string {\n  return (values || []).map((v) => referentialToString(v, properties, propertySeparator)).join(valueSeparator || ', ');\n}\n\nexport declare interface IStatus {\n  id: number;\n  icon?: string;\n  label: string;\n}\n\nexport const StatusList: Readonly<IStatus[]> = Object.freeze([\n  {\n    id: StatusIds.ENABLE,\n    icon: 'checkmark',\n    label: 'REFERENTIAL.STATUS_ENUM.ENABLE',\n  },\n  {\n    id: StatusIds.DISABLE,\n    icon: 'close',\n    label: 'REFERENTIAL.STATUS_ENUM.DISABLE',\n  },\n  {\n    id: StatusIds.TEMPORARY,\n    icon: 'help',\n    label: 'REFERENTIAL.STATUS_ENUM.TEMPORARY',\n  },\n]);\n\nexport const StatusById = Object.freeze(splitById(StatusList));\n\nexport declare interface IReferentialRef<T extends IEntity<T, ID> = IEntity<any, any>, ID = number> extends IEntity<T, ID> {\n  label: string;\n  name: string;\n  description?: string;\n  levelId?: number;\n  statusId: number;\n  entityName: string;\n  icon?: IconRef;\n}\n\n//@dynamic\nexport abstract class BaseReferential<\n    T extends BaseReferential<T, ID, AO>,\n    ID = number,\n    AO extends ReferentialAsObjectOptions = ReferentialAsObjectOptions,\n    FO = any,\n  >\n  extends Entity<T, ID, AO, FO>\n  implements IReferentialRef<T, ID>\n{\n  label: string;\n  name: string;\n  description: string;\n  comments: string;\n  creationDate: Date | Moment;\n  statusId: number;\n  validityStatusId: number;\n  levelId: number;\n  parentId: number;\n  entityName: string;\n  icon?: IconRef;\n\n  protected constructor(__typename?: string) {\n    super(__typename);\n  }\n\n  asObject(opts?: AO): any {\n    if (opts?.minify) {\n      return {\n        id: this.id,\n        entityName: (opts.keepEntityName && this.entityName) || undefined, // Don't keep by default\n        __typename: (opts.keepTypename && this.__typename) || undefined,\n      };\n    }\n    const target: any = super.asObject(opts);\n    target.creationDate = toDateISOString(this.creationDate);\n    if (opts?.keepEntityName === false) delete target.entityName;\n    if (opts?.keepIcon === false) delete target.icon;\n    if (opts?.keepProperties === false) delete target.properties;\n    if (isNil(target.validityStatusId)) delete target.validityStatusId;\n    return target;\n  }\n\n  fromObject(source: any, opts?: FO) {\n    super.fromObject(source, opts);\n    this.label = source.label;\n    this.name = source.name;\n    this.description = source.description;\n    this.comments = source.comments;\n    this.statusId = source.statusId;\n    this.validityStatusId = source.validityStatusId;\n    this.levelId = source.levelId && source.levelId !== 0 ? source.levelId : undefined; // Do not set as null (need for account.department, when register)\n    this.parentId = source.parentId;\n    this.creationDate = fromDateISOString(source.creationDate);\n    this.entityName = source.entityName;\n    this.icon = source.icon;\n  }\n\n  equals(other: T): boolean {\n    return super.equals(other) && this.entityName === other.entityName;\n  }\n}\n\n// @dynamic\n@EntityClass({ typename: 'ReferentialVO' })\nexport class Referential<T extends Referential<T, any> = Referential<any>, ID = number> extends BaseReferential<T, ID> {\n  static fromObject: (source: any, opts?: any) => Referential;\n\n  properties?: { [key: string]: any };\n\n  constructor() {\n    super();\n  }\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source, opts);\n    this.properties = (source.properties && { ...source.properties }) || undefined;\n  }\n\n  asObject(opts?: ReferentialAsObjectOptions): any {\n    const target = super.asObject(opts);\n    if (opts?.minify || opts?.keepProperties === false) delete target.properties;\n    return target;\n  }\n}\n\nexport class ReferentialUtils {\n  // FIXME: remove this\n  static fromObject(source: any, opts?: any): Referential {\n    if (!source || source instanceof Referential) return source;\n    const res = new Referential();\n    res.fromObject(source, opts);\n    return res as Referential;\n  }\n\n  static isNotEmpty<T extends IReferentialRef<T>>(obj: T | any): boolean {\n    // A referential entity should always have a 'id' filled (can be negative is local and temporary)\n    return EntityUtils.isNotEmpty(obj, 'id');\n  }\n\n  static isEmpty<T extends IReferentialRef<T>>(obj: T | any): boolean {\n    return EntityUtils.isEmpty(obj, 'id');\n  }\n\n  static equals<T extends IReferentialRef<T>>(o1: T | any, o2: T | any): boolean {\n    return EntityUtils.equals(o1, o2, 'id');\n  }\n\n  static isNotDisabled<T extends IReferentialRef<T>>(obj: T | any): boolean {\n    return obj && obj.statusId !== StatusIds.DISABLE;\n  }\n\n  static isDisabled<T extends IReferentialRef<T>>(obj: T | any): boolean {\n    return obj && obj.statusId === StatusIds.DISABLE;\n  }\n}\n\nexport interface ReferentialAsObjectOptions extends EntityAsObjectOptions {\n  keepEntityName?: boolean;\n  keepIcon?: boolean;\n  keepProperties?: boolean;\n}\n\n/**\n * Used to store an entity locally\n */\nexport const MINIFY_ENTITY_FOR_LOCAL_STORAGE: ReferentialAsObjectOptions = Object.freeze({\n  minify: true,\n  keepTypename: true,\n  keepEntityName: true,\n  keepLocalId: true,\n  keepIcon: true,\n  keepProperties: true,\n});\n\n/**\n * Used to send an entity to a pod\n */\nexport const MINIFY_ENTITY_FOR_POD: ReferentialAsObjectOptions = Object.freeze({\n  minify: true,\n  keepTypename: false,\n  keepEntityName: false,\n  keepLocalId: false,\n  keepIcon: false,\n  keepProperties: false,\n});\n\n// @dynamic\n@EntityClass({ typename: 'ReferentialVO' })\nexport class ReferentialRef<\n    T extends ReferentialRef<any, ID> = ReferentialRef<any, any>,\n    ID = number,\n    O extends ReferentialAsObjectOptions = ReferentialAsObjectOptions,\n    FO = any,\n  >\n  extends Entity<T, ID, O, FO>\n  implements IReferentialRef<T, ID>\n{\n  static fromObject: (source: any, opts?: any) => ReferentialRef;\n  static clone(source: any): ReferentialRef {\n    return ReferentialRef.fromObject(source)?.clone();\n  }\n\n  label: string;\n  name: string;\n  description: string;\n  statusId: number;\n  levelId: number;\n  entityName: string;\n  icon?: IconRef;\n  properties?: { [key: string]: any };\n\n  constructor() {\n    super(ReferentialRef.TYPENAME);\n  }\n\n  asObject(opts?: O): any {\n    if (opts?.minify) {\n      return {\n        id: this.id,\n        entityName: (opts.keepEntityName && this.entityName) || undefined, // Don't keep by default\n        __typename: (opts.keepTypename && this.__typename) || undefined,\n      };\n    }\n    const target: any = super.asObject(opts);\n    if (opts?.keepEntityName === false) delete target.entityName;\n    if (opts?.keepIcon === false) delete target.icon;\n    if (opts?.keepProperties === false) delete target.properties;\n\n    return target;\n  }\n\n  fromObject(source: any, opts?: FO) {\n    super.fromObject(source);\n    this.entityName = source.entityName || this.entityName;\n    this.label = source.label;\n    this.name = source.name;\n    this.description = source.description;\n    this.statusId = source.statusId;\n    this.levelId = source.levelId;\n    this.icon = source.icon;\n    this.properties = (source.properties && { ...source.properties }) || undefined;\n  }\n}\n","import { isEmptyArray, isNotEmptyArray, isNotNil } from '../../../shared/functions';\nimport { MINIFY_ENTITY_FOR_POD, ReferentialUtils } from './referential.model';\nimport { Entity, EntityAsObjectOptions, IEntity, isInstanceOf } from './entity.model';\n\nimport { FilterFn } from '../../../shared/types';\n\nexport interface IEntityFilter<\n  F extends IEntityFilter<F, T, ID, AO, FO>,\n  T extends IEntity<T, any>,\n  ID = number,\n  AO extends EntityAsObjectOptions = EntityAsObjectOptions,\n  FO = any,\n> extends IEntity<F, ID, AO, FO> {\n  asPodObject(): any;\n\n  asFilterFn(): FilterFn<T>;\n\n  isEmpty(): boolean;\n\n  countNotEmptyCriteria(): number;\n\n  // Logical combinators (fluent, return same filter type F)\n  not?: F;\n  and?: F[];\n  or?: F[];\n}\n\nexport abstract class EntityFilter<\n    F extends IEntityFilter<F, T, ID, AO, FO>,\n    T extends IEntity<T, any>,\n    ID = number,\n    AO extends EntityAsObjectOptions = EntityAsObjectOptions,\n    FO = any,\n  >\n  extends Entity<F, ID, AO, FO>\n  implements IEntityFilter<F, T, ID, AO, FO>\n{\n  // Internal composition state (fluent API)\n  not?: F;\n  and?: F[];\n  or?: F[];\n\n  static composeAnd<F extends IEntityFilter<F, T, ID>, T extends IEntity<T, any>, ID = number>(...filters: F[]): FilterFn<T> {\n    return EntityFilter.composeAndFns(...(filters || []).map((f) => f?.asFilterFn()));\n  }\n\n  static composeOr<F extends IEntityFilter<F, T, ID>, T extends IEntity<T, any>, ID = number>(...filters: F[]): FilterFn<T> {\n    return EntityFilter.composeOrFns(...(filters || []).map((f) => f?.asFilterFn()));\n  }\n\n  static composeAndFns<T extends IEntity<T, any>>(...filterFns: FilterFn<T>[]): FilterFn<T> {\n    filterFns = filterFns?.filter(isNotNil);\n    if (isEmptyArray(filterFns)) return undefined;\n    return (entity) => filterFns.every((fn) => fn(entity));\n  }\n\n  static composeOrFns<T extends IEntity<T, any>>(...filterFns: FilterFn<T>[]): FilterFn<T> {\n    filterFns = filterFns?.filter(isNotNil);\n    if (isEmptyArray(filterFns)) return undefined;\n    return (entity) => filterFns.some((fn) => fn(entity));\n  }\n\n  constructor(__typename?: string) {\n    super(__typename);\n  }\n\n  create() {\n    const Ctor: new () => F = this.constructor as any;\n    return new Ctor();\n  }\n\n  /**\n   * Clean a filter, before sending to the pod (e.g convert dates, remove internal properties, etc.)\n   */\n  asPodObject(): any {\n    return this.asObject(MINIFY_ENTITY_FOR_POD as AO);\n  }\n\n  isEmpty(): boolean {\n    return this.countNotEmptyCriteria() === 0;\n  }\n\n  countNotEmptyCriteria(): number {\n    const json = this.asPodObject();\n    return Object.keys(json).filter((key) => this.isCriteriaNotEmpty(key, json[key])).length;\n  }\n\n  asFilterFn(): FilterFn<T> {\n    // Base (this) filter functions\n    let filterFns = this.buildFilter() || [];\n\n    // NOT\n    if (this.not) {\n      const notFn = this.not.asFilterFn();\n      filterFns.push((item) => !notFn(item));\n    }\n\n    // AND\n    if (isNotEmptyArray(this.and)) {\n      filterFns.push(EntityFilter.composeAnd<F, T, ID>(...this.and));\n    }\n\n    // OR\n    if (isNotEmptyArray(this.or)) {\n      filterFns.push(EntityFilter.composeOr<F, T, ID>(...this.or));\n    }\n\n    // As filter function\n    return EntityFilter.composeAndFns<T>(...filterFns);\n  }\n\n  asObject(opts?: AO): any {\n    const target: any = super.asObject(opts);\n\n    // Serialize composition\n    if (this.not) {\n      target.not = this.not.asObject(opts);\n    } else {\n      delete target.not;\n    }\n    if (isNotEmptyArray(this.and)) {\n      target.and = this.and.map((f) => f.asObject(opts));\n    } else {\n      delete target.and;\n    }\n    if (isNotEmptyArray(this.or)) {\n      target.or = this.or.map((f) => f.asObject(opts));\n    } else {\n      delete target.or;\n    }\n\n    return target;\n  }\n\n  fromObject(source: any, opts?: FO) {\n    super.fromObject(source, opts as any);\n    // Deserialize composition using the same concrete filter type\n\n    // AND\n    if (Array.isArray(source?.and)) {\n      this.and = source.and\n        .map((s) => {\n          if (!s) return undefined;\n          const f = this.create();\n          (f as any).fromObject(s, opts);\n          return f;\n        })\n        .filter(isNotNil);\n    } else {\n      this.and = undefined;\n    }\n\n    // OR\n    if (Array.isArray(source?.or)) {\n      this.or = source.or\n        .map((s) => {\n          if (!s) return undefined;\n          const f = this.create();\n          (f as any).fromObject(s, opts);\n          return f;\n        })\n        .filter(isNotNil);\n    } else {\n      this.or = undefined;\n    }\n\n    // NOT\n    if (source?.not) {\n      const f = this.create();\n      f.fromObject(source.not, opts);\n      this.not = f;\n    }\n  }\n\n  /* -- protected functions -- */\n\n  protected buildFilter(): FilterFn<T>[] {\n    // Can be completed by subclasses\n    return [];\n  }\n\n  protected isCriteriaNotEmpty(key: string, value: any): boolean {\n    // Can be overridden by subclasses\n    return (\n      value !== undefined &&\n      value !== null &&\n      // not empty string\n      ((typeof value === 'string' && value.trim() !== '') ||\n        // valid number\n        (typeof value === 'number' && !isNaN(value)) ||\n        // valid boolean\n        typeof value === 'boolean' ||\n        // not empty array\n        (Array.isArray(value) && value.length > 0) ||\n        // entity with an id\n        ReferentialUtils.isNotEmpty(value))\n    );\n  }\n}\n\nexport abstract class EntityFilterUtils {\n  static isEntityFilter<F extends EntityFilter<F, any>>(obj: Partial<F>): obj is F {\n    return (obj && obj.asPodObject && obj.asFilterFn && true) || false;\n  }\n\n  static fromObject<F>(source: any, filterType: new () => F): F {\n    if (!source) return source;\n    if (isInstanceOf(source, filterType)) return source as F;\n    const target = new filterType();\n    if (EntityFilterUtils.isEntityFilter(target)) {\n      target.fromObject(source);\n    } else {\n      Object.assign(target, source);\n    }\n    return target;\n  }\n}\n","import { Entity, IEntity } from '../../core/services/model/entity.model';\nimport { EntityFilter, IEntityFilter } from '../../core/services/model/filter.model';\nimport { EntityClass } from '../../core/services/model/entity.decorators';\n\nexport interface INamedFilter<T extends INamedFilter<T>> extends IEntity<T> {\n  name: string;\n  entityName: string;\n  content: any;\n  recorderPersonId: number;\n  recorderDepartmentId: number;\n}\n\n@EntityClass({ typename: 'NamedFilterVO' })\nexport class NamedFilter<T extends NamedFilter<any> = NamedFilter<any>> extends Entity<T> implements INamedFilter<T> {\n  static fromObject: (source: any, opts?: any) => NamedFilter;\n\n  name: string;\n  entityName: string;\n  content: any;\n  recorderPersonId: number;\n  recorderDepartmentId: number;\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source, opts);\n    this.name = source.name;\n    this.entityName = source.entityName;\n    this.recorderPersonId = source.recorderPersonId;\n    this.recorderDepartmentId = source.recorderDepartmentId;\n    try {\n      this.content = typeof source?.content === 'string' ? JSON.parse(source?.content) : source?.content || undefined;\n    } catch (e) {\n      console.error(`[named-filter] can't parse content json`, source);\n      throw e;\n    }\n  }\n}\n\nexport interface INamedFilterFilter<F extends INamedFilterFilter<any, T>, T extends INamedFilter<T>> extends IEntityFilter<F, T> {\n  searchText: string;\n  entityName: string;\n  recorderPersonId: number;\n  recorderDepartmentId: number;\n}\n\n@EntityClass({ typename: 'NamedFilterFilterVO' })\nexport class NamedFilterFilter<F extends NamedFilterFilter<any, T> = NamedFilterFilter<any, any>, T extends NamedFilter<any> = NamedFilter<any>>\n  extends EntityFilter<F, T>\n  implements INamedFilterFilter<F, T>\n{\n  static fromObject: (source: any, opts?: any) => NamedFilterFilter;\n\n  searchText: string = null;\n  entityName: string = null;\n  recorderPersonId: number = null;\n  recorderDepartmentId: number = null;\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source, opts);\n    this.searchText = source.searchText;\n    this.entityName = source.entityName;\n    this.recorderPersonId = source.recorderPersonId;\n    this.recorderDepartmentId = source.recorderDepartmentId;\n  }\n}\n","import { FormErrors } from '../../shared/forms';\n\nexport interface AppError {\n  code?: number;\n  message?: string;\n}\n\nexport interface AppErrorWithDetails extends AppError {\n  details: AppError & { errors?: FormErrors };\n}\n\nexport declare interface ServiceError {\n  code: number;\n  message: string;\n  reject?: (err) => void;\n}\n\nexport const ErrorCodes = {\n  UNKNOWN_ERROR: 0,\n\n  LOAD_ACCOUNT_ERROR: 1,\n  BAD_PASSWORD: 2,\n  UNKNOWN_ACCOUNT_EMAIL: 3,\n  EMAIL_ALREADY_REGISTERED: 4,\n  UNREACHABLE_NETWORK_ERROR: 4,\n  UNKNOWN_NETWORK_ERROR: 5,\n  SENT_CONFIRMATION_EMAIL_FAILED: 6,\n  CONFIRM_EMAIL_FAILED: 7,\n  SAVE_ACCOUNT_ERROR: 8,\n  ACCOUNT_NOT_EXISTS: 9,\n  SAVE_SETTINGS_ERROR: 8,\n  SUBSCRIBE_ACCOUNT_ERROR: 10,\n  ENTITY_STORAGE_MIGRATION_FAILED: 11,\n\n  LOAD_DATA_ERROR: 12,\n  SAVE_DATA_ERROR: 13,\n  DELETE_DATA_ERROR: 14,\n  SUBSCRIBE_DATA_ERROR: 15,\n\n  // DATA errors (load error)\n  LOAD_PERSONS_ERROR: 100,\n  DATA_NOT_FOUND_ERROR: 104,\n\n  TABLE_INVALID_ROW_ERROR: 350,\n  TABLE_READ_ONLY: 351,\n\n  UNAUTHORIZED: 401,\n  INTERNAL_SERVER_ERROR: 500,\n  AUTH_CHALLENGE_ERROR: 601,\n  AUTH_SERVER_ERROR: 602,\n  AUTH_SEND_RESET_PASSWORD_EMAIL_ERROR: 603,\n  AUTH_RESET_PUBKEY_ERROR: 604,\n  AUTH_UPDATE_PUBKEY_ERROR: 605,\n\n  LOAD_CONFIG_ERROR: 700,\n  SAVE_CONFIG_ERROR: 701,\n\n  LOAD_TRASH_ENTITY_ERROR: 800,\n  DELETE_TRASH_ENTITY_ERROR: 801,\n};\n\nexport const ServerErrorCodes = {\n  BAD_REQUEST: 400,\n  UNAUTHORIZED: 401, // not authenticated\n  FORBIDDEN: 403, // authenticated but no access right\n  NOT_FOUND: 404,\n\n  // sumaris-core-shared errors\n  INTERNAL_SERVER_ERROR: 500,\n  DATA_LOCKED: 520,\n  BAD_UPDATE_DATE: 521,\n  DENY_DELETION: 522,\n  DATA_NOT_UNIQUE: 523,\n\n  // sumaris-server errors\n  INVALID_EMAIL_CONFIRMATION: 550,\n  INVALID_QUERY_VARIABLES: 551,\n  ACCOUNT_ALREADY_EXISTS: 552,\n  BAD_APP_VERSION: 553,\n};\n","import { Injectable } from '@angular/core';\n\nimport { scryptEncode } from '@polkadot/util-crypto/scrypt/encode';\nimport { ScryptParams } from '@polkadot/util-crypto/scrypt/types';\nimport {\n  base58Decode,\n  base64Decode,\n  base64Encode,\n  cryptoWaitReady,\n  ed25519PairFromSeed,\n  ed25519Sign,\n  ed25519Verify,\n  sha256AsU8a,\n  sha512AsU8a,\n} from '@polkadot/util-crypto';\n\nimport { bytesToHex as toHex } from '@noble/hashes/utils';\nimport { Keypair } from '@polkadot/util-crypto/types';\nimport { stringToU8a } from '@polkadot/util';\n\nexport const ED25519_SEED_LENGTH = 32; // Length of a ED25519 seed\n\nexport const SCRYPT_PARAMS = {\n  SIMPLE: <ScryptParams>{\n    N: 2048,\n    r: 8,\n    p: 1,\n  },\n  DEFAULT: <ScryptParams>{\n    N: 4096,\n    r: 16,\n    p: 1,\n  },\n  SECURE: <ScryptParams>{\n    N: 16384,\n    r: 32,\n    p: 2,\n  },\n  HARDEST: <ScryptParams>{\n    N: 65536,\n    r: 32,\n    p: 4,\n  },\n  EXTREME: <ScryptParams>{\n    N: 262144,\n    r: 64,\n    p: 8,\n  },\n};\n\nexport { Keypair };\n\n@Injectable({ providedIn: 'root' })\nexport class CryptoService {\n  private static _ready = false;\n\n  private static get started() {\n    return this._ready;\n  }\n\n  private static async ready(): Promise<void> {\n    if (this._ready) return; // OK\n\n    await cryptoWaitReady();\n    this._ready = true;\n  }\n\n  /**\n   * Generate a sign keypair, using scrypt, from a salt and a password\n   *\n   * @param salt\n   * @param password\n   * @param scryptParams\n   */\n  static async scryptKeypair(salt: string, password: string, scryptParams?: ScryptParams): Promise<Keypair> {\n    if (!this.started) await this.ready();\n    const saltU8a = stringToU8a(salt);\n    const result = scryptEncode(password, saltU8a, scryptParams || SCRYPT_PARAMS.DEFAULT);\n    const seed = result.password.slice(0, ED25519_SEED_LENGTH);\n    return ed25519PairFromSeed(seed);\n  }\n\n  /**\n   * Sign a message, from a key pair\n   */\n  static async sign(message: string, keypair: Keypair): Promise<string> {\n    if (!this.started) await this.ready();\n\n    const m = stringToU8a(message);\n    const sig = ed25519Sign(m, keypair);\n    return base64Encode(sig);\n  }\n\n  /**\n   * Sign a message, from a key pair\n   */\n  static async verify(message: string, signature: string, publicKey: string): Promise<boolean> {\n    if (!this.started) await this.ready();\n\n    const m = stringToU8a(message);\n    const sig = base64Decode(signature);\n    const pub = base58Decode(publicKey);\n    return ed25519Verify(m, sig, pub);\n  }\n\n  /**\n   * Hash (using SHA256) a message, as Hex\n   */\n  static sha256(message: string): string {\n    const bytes = sha256AsU8a(message);\n    return toHex(bytes);\n  }\n\n  /**\n   * Hash (using SHA512) a message, as Hex\n   */\n  static sha512(message: string): string {\n    const bytes = sha512AsU8a(message);\n    return toHex(bytes);\n  }\n\n  static encodeBase64(message: string): string {\n    const m = stringToU8a(message);\n    return base64Encode(m);\n  }\n\n  static decodeBase64(message: string): Uint8Array {\n    return base64Decode(message);\n  }\n}\n","import { ApolloClient, ApolloLink, NextLink, Operation } from '@apollo/client/core';\nimport { EventEmitter } from '@angular/core';\nimport { debounceTime, filter, switchMap } from 'rxjs/operators';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { getMainDefinition } from '@apollo/client/utilities';\nimport { PersistentStorage } from 'apollo3-cache-persist';\nimport { ConnectionType } from '../services/network.types';\nimport { v4 as uuidv4 } from 'uuid';\nimport { StorageService } from '../../shared/storage/storage.service';\n\ndeclare let window: any;\nconst _global = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : {};\nexport const NativeWebSocket = _global.WebSocket || _global.MozWebSocket;\n\nexport interface EmptyObject {\n  [key: string]: any;\n}\n\n/**\n * AppWebSocket class.\n * With a hack on default Websocket, to avoid the use of protocol\n */\nexport const AppWebSocket = function (url: string, protocols?: string | string[]) {\n  return new NativeWebSocket(url /*no protocols*/);\n} as any;\nAppWebSocket.CLOSED = NativeWebSocket.CLOSED;\nAppWebSocket.CLOSING = NativeWebSocket.CLOSING;\nAppWebSocket.CONNECTING = NativeWebSocket.CONNECTING;\nAppWebSocket.OPEN = NativeWebSocket.OPEN;\n\nexport function isMutationOperation(operation: Operation) {\n  const def = getMainDefinition(operation.query);\n  return def.kind === 'OperationDefinition' && def.operation === 'mutation';\n}\n\nexport function isSubscriptionOperation(operation: Operation) {\n  const def = getMainDefinition(operation.query);\n  return def.kind === 'OperationDefinition' && def.operation === 'subscription';\n}\n\nexport interface TrackedQuery {\n  id: string;\n  name: string;\n  queryJSON: string;\n  variablesJSON: string;\n  contextJSON: string;\n}\n\nexport interface TrackableMutationContext extends Record<string, any> {\n  serializationKey?: string;\n  tracked?: boolean;\n  timeout?: number;\n}\n\nexport const TRACKED_QUERIES_STORAGE_KEY = 'apollo-tracker-persist';\n\nexport function createTrackerLink(opts: {\n  storage?: PersistentStorage<string>;\n  onNetworkStatusChange: Observable<ConnectionType>;\n  debounce?: number;\n  debug?: boolean;\n}): ApolloLink {\n  const trackedQueriesUpdated = new EventEmitter();\n  const trackedQueriesById: { [id: string]: TrackedQuery } = {};\n\n  const networkStatusSubject = new BehaviorSubject<ConnectionType>('none');\n  opts.onNetworkStatusChange.subscribe((type) => networkStatusSubject.next(type));\n\n  // Save pending and tracked queries in storage\n  trackedQueriesUpdated\n    .pipe(\n      debounceTime(opts.debounce || 1000),\n      switchMap(() => networkStatusSubject),\n      // Continue if offline\n      filter((connectionType) => connectionType === 'none' && !!opts.storage)\n    )\n    .subscribe(() => {\n      const trackedQueries = Object.getOwnPropertyNames(trackedQueriesById)\n        .map((key) => trackedQueriesById[key])\n        .filter((value) => value !== undefined);\n      if (opts.debug) console.debug('[apollo-tracker-link] Saving tracked queries to storage', trackedQueries);\n      return opts.storage.setItem(TRACKED_QUERIES_STORAGE_KEY, JSON.stringify(trackedQueries));\n    });\n\n  return new ApolloLink((operation: Operation, forward: NextLink) => {\n    const context = operation.getContext() as TrackableMutationContext;\n\n    // Skip if not tracked\n    if (!context || !context.tracked) return forward(operation);\n\n    const id = context.serializationKey || uuidv4();\n    console.debug(`[apollo-tracker-link] Watching tracked query {${operation.operationName}#${id}}`);\n\n    // Clean context, before calling JSON.stringify (remove unused attributes)\n    const cleanContext = { ...context, ...{ optimisticResponse: null, cache: null } };\n\n    const trackedQuery: TrackedQuery = {\n      id,\n      name: operation.operationName,\n      queryJSON: JSON.stringify(operation.query),\n      variablesJSON: JSON.stringify(operation.variables),\n      contextJSON: JSON.stringify(cleanContext),\n    };\n\n    // Add to map\n    trackedQueriesById[id] = trackedQuery;\n    trackedQueriesUpdated.emit();\n\n    const nextOperation = forward(operation).map((data) => {\n      console.debug(`[apollo-tracker-link] Query {${operation.operationName}#${id}} succeed!`, data);\n      delete trackedQueriesById[id];\n      trackedQueriesUpdated.emit(trackedQueriesById); // update\n\n      return data;\n    });\n\n    // If offline, return the optimistic response\n    if (networkStatusSubject.getValue() === 'none') {\n      if (context.optimisticResponse) {\n        console.debug(`[apollo-tracker-link] Query {${operation.operationName}#${id}} has optimistic response: `, context.optimisticResponse);\n      } else {\n        console.warn(\n          `[apollo-tracker-link] Query {${operation.operationName}#${id}} missing 'context.optimisticResponse': waiting network UP before to continue...`\n        );\n      }\n    }\n\n    return nextOperation;\n  });\n}\n\nexport async function restoreTrackedQueries(opts: { apolloClient: ApolloClient<any>; storage: PersistentStorage<any>; debug?: boolean }) {\n  const list = JSON.parse(await opts.storage.getItem(TRACKED_QUERIES_STORAGE_KEY)) as TrackedQuery[];\n\n  if (!list) return;\n  if (opts.debug) console.debug('[apollo-tracker-link] Restoring tracked queries', list);\n\n  const promises = (list || []).map((trackedQuery) => {\n    const context = JSON.parse(trackedQuery.contextJSON);\n    const query = JSON.parse(trackedQuery.queryJSON);\n    const variables = JSON.parse(trackedQuery.variablesJSON);\n    return opts.apolloClient.mutate({\n      context,\n      mutation: query,\n      optimisticResponse: context.optimisticResponse,\n      //update: updateHandlerByName[trackedQuery.name],\n      variables,\n    });\n  });\n\n  return Promise.all(promises);\n}\n\nexport class StorageServiceWrapper implements PersistentStorage<string> {\n  constructor(private storage: StorageService) {}\n\n  getItem(key) {\n    return this.storage.get(key);\n  }\n  removeItem(key) {\n    return this.storage.remove(key);\n  }\n  setItem(key, value) {\n    return this.storage.set(key, value);\n  }\n}\n","// import the required animation functions from the angular animations module\nimport { animate, state, style, transition, trigger } from '@angular/animations';\n\nexport const fadeInAnimation =\n  // trigger name for attaching this animation to an element using the [@triggerName] syntax\n  trigger('fadeInAnimation', [\n    // route 'enter' transition\n    transition(':enter', [\n      // css styles at start of transition\n      style({ opacity: 0 }),\n\n      // animation and styles at end of transition\n      animate('.3s', style({ opacity: 1 })),\n    ]),\n  ]);\n\nexport const fadeInSlowAnimation = trigger('fadeInSlowAnimation', [\n  // route 'enter' transition\n  transition(':enter', [\n    // css styles at start of transition\n    style({ opacity: 0 }),\n\n    // animation and styles at end of transition\n    animate('.5s', style({ opacity: 1 })),\n  ]),\n]);\n\nexport const fadeInOutAnimation =\n  // trigger name for attaching this animation to an element using the [@triggerName] syntax\n  trigger('fadeInOutAnimation', [\n    // route 'enter' transition\n    transition(':enter', [\n      // css styles at start of transition\n      style({ opacity: 0 }),\n\n      // animation and styles at end of transition\n      animate('.3s', style({ opacity: 1 })),\n    ]),\n\n    // route 'leave' transition\n    transition(':leave', [\n      // animation and styles at end of transition\n      animate(\n        '.5s ease-in-out',\n        style({\n          opacity: 0,\n        })\n      ),\n    ]),\n  ]);\n\nexport const slideInAnimation = trigger('slideInAnimation', [\n  // end state styles for route container (host)\n  state(\n    '*',\n    style({\n      // the view covers the whole screen with a semi tranparent background\n      position: 'relative',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      opacity: 1,\n    })\n  ),\n\n  // route 'enter' transition\n  transition(':enter', [\n    // styles at start of transition\n    style({\n      // start with the content positioned off the right of the screen,\n      // -400% is required instead of -100% because the negative position adds to the width of the element\n      left: '400%',\n\n      // start with background opacity set to 0 (invisible)\n      opacity: 0,\n    }),\n\n    // animation and styles at end of transition\n    animate(\n      '.3s ease-in-out',\n      style({\n        // transition the right position to 0 which slides the content into view\n        left: 0,\n\n        // transition the background opacity to 0.8 to fade it in\n        opacity: 0.8,\n      })\n    ),\n  ]),\n]);\n\nexport const slideInOutAnimation =\n  // trigger name for attaching this animation to an element using the [@triggerName] syntax\n  trigger('slideInOutAnimation', [\n    // end state styles for route container (host)\n    state(\n      '*',\n      style({\n        // the view covers the whole screen with a semi tranparent background\n        position: 'relative',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        opacity: 1,\n      })\n    ),\n\n    // route 'enter' transition\n    transition(':enter', [\n      // styles at start of transition\n      style({\n        // start with the content positioned off the right of the screen,\n        // -400% is required instead of -100% because the negative position adds to the width of the element\n        left: '400%',\n\n        // start with background opacity set to 0 (invisible)\n        opacity: 0,\n      }),\n\n      // animation and styles at end of transition\n      animate(\n        '.3s ease-in-out',\n        style({\n          // transition the right position to 0 which slides the content into view\n          left: 0,\n\n          // transition the background opacity to 0.8 to fade it in\n          opacity: 0.8,\n        })\n      ),\n    ]),\n\n    // route 'leave' transition\n    transition(':leave', [\n      // animation and styles at end of transition\n      animate(\n        '.5s ease-in-out',\n        style({\n          // transition the right position to -400% which slides the content out of view\n          left: '400%',\n\n          // transition the background opacity to 0 to fade it out\n          opacity: 0,\n        })\n      ),\n    ]),\n  ]);\n\nexport const slideUpDownAnimation =\n  // trigger name for attaching this animation to an element using the [@triggerName] syntax\n  trigger('slideUpDownAnimation', [\n    // end state styles for route container (host)\n    state(\n      '*',\n      style({\n        transform: 'translateY(0)',\n        opacity: 1,\n      })\n    ),\n\n    // route 'enter' transition\n    transition(':enter', [\n      // styles at start of transition\n      style({\n        transform: 'translateY(-400%)',\n        opacity: 0,\n      }),\n\n      // animation and styles at end of transition\n      animate(\n        '.3s ease-in-out',\n        style({\n          transform: 'translateY(0)',\n          opacity: 1,\n        })\n      ),\n    ]),\n\n    // route 'leave' transition\n    transition(':leave', [\n      // animation and styles at end of transition\n      animate(\n        '.5s ease-in-out',\n        style({\n          transform: 'translateY(-400%)',\n          opacity: 0,\n        })\n      ),\n    ]),\n  ]);\n\nexport const slideDownAnimation =\n  // trigger name for attaching this animation to an element using the [@triggerName] syntax\n  trigger('slideDownAnimation', [\n    // end state styles for route container (host)\n    state(\n      '*',\n      style({\n        transform: 'translateY(0)',\n        opacity: 1,\n      })\n    ),\n\n    // route 'enter' transition\n    transition(':enter', [\n      // styles at start of transition\n      style({\n        transform: 'translateY(-400%)',\n        opacity: 0,\n      }),\n\n      // animation and styles at end of transition\n      animate(\n        '.3s ease-in-out',\n        style({\n          transform: 'translateY(0)',\n          opacity: 1,\n        })\n      ),\n    ]),\n\n    // route 'leave' transition\n    transition(':leave', [\n      // animation and styles at end of transition\n      style({\n        transform: 'translateY(-400%)',\n        opacity: 0,\n      }),\n    ]),\n  ]);\n\nexport const expansionAnimation = trigger('expansionAnimation', [\n  // État masqué (quand showSamplingStrata est false)\n  state(\n    'false',\n    style({\n      height: '0px',\n      minHeight: '0px',\n      opacity: 0,\n    })\n  ),\n\n  // État visible (quand showSamplingStrata est true)\n  state(\n    'true',\n    style({\n      height: '*',\n      opacity: 1,\n    })\n  ),\n\n  // Transition entre les états\n  transition('false <=> true', [\n    style({ overflow: 'hidden' }),\n    animate('300ms ease-in-out')\n  ]),\n\n  // Transition initiale (depuis void)\n  transition('void => *', [\n    style({\n      height: '0px',\n      minHeight: '0px',\n      opacity: 0,\n      overflow: 'hidden',\n    }),\n    animate('300ms ease-in-out'),\n  ]),\n]);\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { firstValueFrom, Observable, timeout } from 'rxjs';\n\nexport class HttpUtils {\n  static async getText(\n    http: HttpClient,\n    uri: string,\n    opts?: {\n      nocache?: boolean;\n      headers?:\n        | HttpHeaders\n        | {\n            [header: string]: string | string[];\n          };\n      params?:\n        | HttpParams\n        | {\n            [param: string]: string | string[];\n          };\n      reportProgress?: boolean;\n      responseType?: 'text';\n      withCredentials?: boolean;\n    }\n  ): Promise<string> {\n    // Add headers\n    opts = opts || { responseType: 'text' };\n\n    // Force no cache\n    if (opts.nocache === true) {\n      opts.headers = opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers);\n      opts.headers.append('Cache-Control', 'no-cache').append('Pragma', 'no-cache');\n    }\n\n    // Use web http client\n    try {\n      return await firstValueFrom(http.get(uri, { ...opts, responseType: 'text' }));\n    } catch (err) {\n      if (err && err.message) {\n        console.error(`[network] Error on get request ${uri}: ${err.message}`, err);\n      } else {\n        console.error(`[network] Error on get request ${uri}: ${err && err.statusText}`, err);\n      }\n      throw { code: err.status, message: 'ERROR.UNKNOWN_NETWORK_ERROR' };\n    }\n  }\n\n  static async getJson<T>(\n    http: HttpClient,\n    uri: string,\n    opts?: {\n      nocache?: boolean;\n      timeout?: number;\n      headers?:\n        | HttpHeaders\n        | {\n            [header: string]: string | string[];\n          };\n      params?:\n        | HttpParams\n        | {\n            [param: string]: string | string[];\n          };\n      reportProgress?: boolean;\n      responseType?: 'json';\n      withCredentials?: boolean;\n    }\n  ): Promise<T> {\n    // Add headers\n    opts = opts || {};\n\n    // Force no cache\n    if (opts.nocache === true) {\n      opts.headers = opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers);\n      opts.headers.append('Cache-Control', 'no-cache').append('Pragma', 'no-cache');\n    }\n\n    // Use web http client\n    try {\n      let result: Observable<T>;\n      if (opts.timeout) {\n        result = http.get<T>(uri, { ...opts, responseType: 'json' }).pipe(timeout(opts?.timeout));\n      } else {\n        result = http.get<T>(uri, { ...opts, responseType: 'json' });\n      }\n      return await firstValueFrom(result);\n    } catch (err) {\n      if (err && err.message) {\n        console.error(`[network] Error on get request ${uri}: ${err.message}`, err);\n      } else {\n        console.error(`[network] Error on get request ${uri}: ${err && err.statusText}`, err);\n      }\n      throw err;\n    }\n  }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { HttpUtils } from '../../shared/http/http.utils';\nimport { Peer } from './model/peer.model';\nimport { NodeFeature } from './model/node-feature.model';\nimport { ConnectionStatus, ConnectionType, Network } from '@capacitor/network';\nimport { Observable } from 'rxjs';\nimport { Capacitor } from '@capacitor/core';\n\nexport interface NodeInfo {\n  softwareName: string;\n  softwareVersion: string;\n  nodeLabel?: string;\n  nodeName?: string;\n  buildDate?: string;\n  features?: NodeFeature[];\n}\n\nexport interface AppManifest {\n  // mandatory\n  manifest_version: number;\n  name: string;\n  version: string;\n\n  // App start (required by platform service)\n  start_url: string;\n\n  // optional\n  short_name?: string;\n  description?: string;\n  version_name?: string;\n  author?: string;\n  default_locale?: string;\n\n  // optional UI\n  icons?: any | any[];\n  background_color?: string;\n  theme_color?: string;\n  display?: string;\n}\n\nexport class NetworkUtils {\n  static async getNodeInfo(\n    http: HttpClient,\n    peer: string | Peer,\n    opts?: {\n      headers?:\n        | HttpHeaders\n        | {\n            [header: string]: string | string[];\n          };\n      responseType?: 'json';\n    }\n  ): Promise<NodeInfo> {\n    if (!peer) throw Error(\"Missing argument 'peer'.\");\n\n    let peerUrl = peer instanceof Peer ? peer.url : (peer as string);\n    // Remove trailing slash\n    if (peerUrl.endsWith('/')) {\n      peerUrl = peerUrl.substr(0, peerUrl.length - 1);\n    }\n\n    return HttpUtils.getJson(http, peerUrl + '/api/node/info', opts);\n  }\n\n  static isPluginAvailable(): boolean {\n    return Capacitor.isPluginAvailable('Network');\n  }\n\n  static statusChanges(): Observable<ConnectionStatus> {\n    return new Observable<ConnectionStatus>((subscriber) => {\n      const handler = Network.addListener('networkStatusChange', (status: ConnectionStatus) => subscriber.next(status));\n      return () => {\n        handler.then((listener) => listener.remove());\n      };\n    });\n  }\n\n  static async getConnectionType(): Promise<ConnectionType> {\n    if (NetworkUtils.isPluginAvailable()) {\n      return (await Network.getStatus())?.connectionType || 'unknown';\n    }\n    return 'unknown';\n  }\n}\n","// Parse version string on standard \"Semantic Versioning 2.0.0\"\nconst SEMVER_2_REGEXP =\n  /^(?<major>0|[1-9]\\d*)\\.(?<minor>0|[1-9]\\d*)\\.(?<patch>0|[1-9]\\d*)(?:-(?<prerelease>(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+(?<build>[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nexport class VersionUtils {\n  static compare = compareVersionNumbers;\n  static isCompatible = isVersionCompatible;\n  static isSame = isSameVersion;\n}\n\n/**\n * Compares two Semantic Versioning 2.0.0 strings\n * @param {string} v1 - First version string\n * @param {string} v2 - Second version string\n * @returns {number} -1 if v1 < v2, 0 if equal, 1 if v1 > v2\n */\nexport function compareVersionNumbers(v1: string, v2: string, comparePrerelease = false): number {\n  const m1 = v1.match(SEMVER_2_REGEXP);\n  const m2 = v2.match(SEMVER_2_REGEXP);\n\n  if (!m1 || !m2) {\n    return NaN;\n  }\n\n  const [p1, p2] = [m1.groups, m2.groups];\n\n  // 1. Compare major.minor.patch numerically\n  for (const key of ['major', 'minor', 'patch']) {\n    const n1 = Number(p1[key]);\n    const n2 = Number(p2[key]);\n    if (n1 !== n2) return n1 > n2 ? 1 : -1;\n  }\n\n  // If do not compare pre-release part return equals version on same major.minor.patch\n  if (!comparePrerelease) return 0;\n\n  // 2. Extract prerelease identifiers (build metadata is ignored)\n  const pre1 = p1.prerelease ? p1.prerelease.split('.') : [];\n  const pre2 = p2.prerelease ? p2.prerelease.split('.') : [];\n\n  // If both have no prerelease, they are equal\n  if (pre1.length === 0 && pre2.length === 0) return 0;\n\n  // A version without prerelease has higher precedence than one with prerelease\n  if (pre1.length === 0) return 1; // v1 stable, v2 pre-release → v1 > v2\n  if (pre2.length === 0) return -1; // v1 pre-release, v2 stable → v1 < v2\n\n  // 3. Compare identifier by identifier\n  const maxLen = Math.max(pre1.length, pre2.length);\n  for (let i = 0; i < maxLen; i++) {\n    const id1 = pre1[i];\n    const id2 = pre2[i];\n\n    // If one has more fields, it has higher precedence if previous fields were equal\n    if (id1 === undefined) return -1;\n    if (id2 === undefined) return 1;\n\n    const isNum1 = /^\\d+$/.test(id1);\n    const isNum2 = /^\\d+$/.test(id2);\n\n    if (isNum1 && isNum2) {\n      // Numeric comparison\n      const n1 = Number(id1),\n        n2 = Number(id2);\n      if (n1 !== n2) return n1 > n2 ? 1 : -1;\n    } else if (!isNum1 && !isNum2) {\n      // Lexicographic comparison (ASCII order)\n      if (id1 !== id2) return id1 > id2 ? 1 : -1;\n    } else {\n      // Numeric identifiers always have lower precedence than alphanumeric\n      return isNum1 ? -1 : 1;\n    }\n  }\n\n  return 0; // Same version\n}\n\nexport function isVersionCompatible(minVersion, actualVersion): boolean {\n  // DEV ONLY\n  //console.debug(`[http] Checking actual version {${actualVersion}} is compatible with min expected version {${minVersion}}`);\n  return compareVersionNumbers(minVersion, actualVersion) <= 0;\n}\n\nexport function isSameVersion(v1, v2): boolean {\n  return compareVersionNumbers(v1, v2) === 0;\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  Injector,\n  Input,\n  numberAttribute,\n  OnInit,\n  Optional,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport {\n  ControlValueAccessor,\n  FormGroupDirective,\n  NG_VALUE_ACCESSOR,\n  UntypedFormBuilder,\n  UntypedFormControl,\n  ValidatorFn,\n  Validators,\n} from '@angular/forms';\nimport { CdkTextareaAutosize } from '@angular/cdk/text-field';\nimport { AppForm } from '../form.class';\nimport { isNotNil } from '../../../shared/functions';\nimport { focusInput } from '../../../shared/inputs';\nimport { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';\nimport { AppFloatLabelType } from '../../../shared/types';\n\nconst noop = () => {};\n\n@Component({\n  selector: 'app-text-form',\n  templateUrl: './text-form.component.html',\n  styleUrls: ['./text-form.component.scss'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => TextForm),\n      multi: true,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TextForm extends AppForm<{ text: string }> implements OnInit, ControlValueAccessor {\n  @Input({ transform: booleanAttribute }) showError = true;\n  @Input() placeholder: string;\n  @Input({ transform: booleanAttribute }) multiline = true;\n\n  @Input({ transform: booleanAttribute }) autoSize = false;\n  @Input({ transform: numberAttribute }) autoSizeMinRows: number;\n  @Input({ transform: numberAttribute }) autoSizeMaxRows: number;\n  @Input({ transform: numberAttribute }) maxLength = 2000;\n  @Input({ transform: booleanAttribute }) autofocus = false;\n  @Input() validator: ValidatorFn = null;\n  @Input({ transform: booleanAttribute }) standalone = false;\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() subscriptSizing: SubscriptSizing;\n\n  /**\n   * @deprecated Use autoSize instead\n   */\n  @Input({ transform: booleanAttribute }) set autoHeight(value: boolean) {\n    this.autoSize = value;\n  }\n  get autoHeight(): boolean {\n    return this.autoSize;\n  }\n\n  @Output() textAreaChanges = new EventEmitter<string>();\n\n  @ViewChild('textArea') textArea: ElementRef;\n  @ViewChild('textInput') textInput: ElementRef;\n  @ViewChild(CdkTextareaAutosize) autosizeDirective: CdkTextareaAutosize;\n\n  textControl: UntypedFormControl;\n\n  private _onChangeCallback: (_: any) => void = noop;\n  private _onTouchedCallback: () => void = noop;\n\n  constructor(\n    protected injector: Injector,\n    protected cd: ChangeDetectorRef,\n    protected formBuilder: UntypedFormBuilder,\n    @Optional() private formGroupDir: FormGroupDirective\n  ) {\n    super(injector);\n  }\n\n  ngOnInit() {\n    if (!this.standalone) {\n      this.formControl =\n        this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n      if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <mat-date-field>.\");\n    }\n\n    // Compute validators\n    const validators = isNotNil(this.maxLength) && this.maxLength > 0 ? [Validators.maxLength(this.maxLength)] : [];\n    if (this.validator) validators.push(this.validator);\n\n    // Create the form\n    const form = this.formBuilder.group({\n      text: [null, validators.length ? Validators.compose(validators) : null],\n    });\n    this.setForm(form);\n\n    this.textControl = form.get('text') as UntypedFormControl;\n    this.registerSubscription(\n      this.textControl.valueChanges.subscribe((value) => {\n        if (this.standalone) {\n          this.textAreaChanges.emit(value);\n        } else {\n          this.textFormValueChanged(value);\n        }\n      })\n    );\n\n    super.ngOnInit();\n  }\n\n  containerResize() {\n    this.autosizeDirective?.resizeToFitContent(true);\n  }\n\n  focusInput() {\n    if (this.textArea) focusInput(this.textArea);\n    if (this.textInput) focusInput(this.textInput);\n  }\n\n  registerOnChange(fn: any): void {\n    this._onChangeCallback = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this._onTouchedCallback = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    if (isDisabled) {\n      this.textControl.disable({ emitEvent: false });\n    } else {\n      this.textControl.enable({ emitEvent: false });\n    }\n    this.markForCheck();\n  }\n\n  writeValue(value: any): void {\n    this.textControl.patchValue(value);\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected checkIfTouched(opts?: { emitEvent?: boolean }) {\n    if (this.textControl.touched) {\n      this._onTouchedCallback();\n\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  private textFormValueChanged(value: string): void {\n    if (this.formControl.value !== value) {\n      this._onChangeCallback(value);\n      this.checkIfTouched();\n    }\n  }\n}\n","<form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"onSubmit.emit($event)\">\n  @if (multiline) {\n    <mat-form-field\n      [floatLabel]=\"floatLabel | asFloatLabelType\"\n      [appearance]=\"appearance\"\n      [subscriptSizing]=\"subscriptSizing\"\n    >\n      @if (floatLabel !== 'never' && !!placeholder) {\n        <mat-label>{{ placeholder }}</mat-label>\n      }\n      <textarea\n        #textArea\n        matInput\n        [formControl]=\"textControl\"\n        [readonly]=\"textControl.disabled\"\n        [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n        [class.fixed-height]=\"!autoSize\"\n        [cdkTextareaAutosize]=\"autoSize\"\n        [cdkAutosizeMinRows]=\"autoSizeMinRows\"\n        [cdkAutosizeMaxRows]=\"autoSizeMaxRows\"\n        (keydown.control.enter)=\"onSubmit.emit($event)\"\n      ></textarea>\n      <mat-error *ngIf=\"textControl.hasError('maxlength')\">\n        {{ 'ERROR.FIELD_MAX_LENGTH' | translate: textControl.errors['maxlength'] }}\n      </mat-error>\n      <mat-hint *ngIf=\"maxLength\" align=\"end\">\n        {{ 'INFO.TEXT_PROGRESS' | translate: { current: textArea.value?.length || 0, max: maxLength } }}\n      </mat-hint>\n    </mat-form-field>\n  } @else {\n    <mat-form-field\n      [floatLabel]=\"floatLabel | asFloatLabelType\"\n      [appearance]=\"appearance\"\n      [subscriptSizing]=\"subscriptSizing\"\n    >\n      @if (floatLabel !== 'never' && !!placeholder) {\n        <mat-label>{{ placeholder }}</mat-label>\n      }\n      <input\n        #textInput\n        matInput\n        [formControl]=\"textControl\"\n        [readonly]=\"textControl.disabled\"\n        [placeholder]=\"floatLabel === 'never' ? placeholder : null\"\n        [appAutofocus]=\"autofocus\"\n        (keydown.control.enter)=\"onSubmit.emit($event)\"\n      />\n      <mat-error *ngIf=\"textControl.hasError('maxlength')\">\n        {{ 'ERROR.FIELD_MAX_LENGTH' | translate: textControl.errors['maxlength'] }}\n      </mat-error>\n      <mat-error *ngIf=\"textControl.hasError('pattern')\">\n        {{ 'ERROR.FIELD_INVALID' | translate }}\n      </mat-error>\n      <mat-error *ngIf=\"errorSpan.innerHTML.trim() as error\" [innerHTML]=\"error\"></mat-error>\n      <span #errorSpan class=\"cdk-visually-hidden\">\n        <ng-content select=\"[matError]\"></ng-content>\n      </span>\n      <mat-hint *ngIf=\"maxLength\" align=\"end\">\n        {{ 'INFO.TEXT_PROGRESS' | translate: { current: textInput.value?.length || 0, max: maxLength } }}\n      </mat-hint>\n    </mat-form-field>\n  }\n</form>\n","import { AfterViewInit, Component, inject, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { PopoverController, PopoverOptions } from '@ionic/angular';\nimport { Subscription } from 'rxjs';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TextForm } from '../text/text-form.component';\nimport { logFormErrors, waitWhilePending } from '../../../shared/forms';\nimport { ValidatorFn } from '@angular/forms';\nimport { Color, OverlayEventDetail } from '@ionic/core';\nimport { isNotEmptyArray, isNotNilOrBlank, toBoolean } from '../../../shared/functions';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\nexport interface TextPopoverOptions {\n  title?: string;\n  text?: string;\n  placeholder?: string;\n  editing?: boolean;\n  multiline?: boolean;\n  autoHeight?: boolean;\n  maxLength?: number;\n  autofocus?: boolean;\n  validator?: ValidatorFn;\n  // Header stuff\n  showHeader?: boolean;\n  headerColor?: Color;\n  headerButtons?: TextPopoverButton[];\n  // Footer stuff\n  showFooter?: boolean;\n}\n\nexport interface TextPopoverButton {\n  text?: string;\n  icon?: string;\n  color?: Color;\n  fill?: 'outline' | 'clear' | 'solid';\n  side?: 'start' | 'end';\n  role?: 'cancel' | string;\n  cssClass?: string | string[];\n  handler?: (value: string) => boolean | void | Promise<boolean | void>;\n}\n\n@Component({\n  selector: 'app-text-popover',\n  templateUrl: './text-popover.component.html',\n  styleUrls: ['./text-popover.component.scss'],\n})\nexport class TextPopover implements OnInit, AfterViewInit, OnDestroy, TextPopoverOptions {\n  /**\n   * Displays a popover using the provided controller, event, and options.\n   *\n   * @param {PopoverController} ctrl - The popover controller used to create and manage the popover.\n   * @param {Event} event - The event that triggers the display of the popover.\n   * @param {TextPopoverOptions} opts - The options specific to the text popover component.\n   * @param {Partial<PopoverOptions>} [popoverOpts] - Optional additional options for the popover.\n   * @return {Promise<OverlayEventDetail>} A promise that resolves with the details of the overlay event once the popover is dismissed.\n   */\n  static async show(\n    ctrl: PopoverController,\n    event: Event,\n    opts: TextPopoverOptions,\n    popoverOpts?: Partial<PopoverOptions>\n  ): Promise<OverlayEventDetail> {\n    const modal = await ctrl.create({\n      event,\n      component: TextPopover,\n      componentProps: opts,\n      ...popoverOpts,\n    });\n\n    await modal.present();\n    return await modal.onDidDismiss();\n  }\n\n  @ViewChild('form', { static: true }) form: TextForm;\n\n  @Input() showHeader: boolean;\n  @Input() headerColor: Color = null;\n  @Input() showFooter: boolean;\n  @Input() title: string = null;\n  @Input() text: string;\n  @Input() placeholder = '';\n  @Input() editing = true;\n  @Input() multiline = true;\n  @Input() autoHeight = false;\n  @Input() maxLength = 2000;\n  @Input() autofocus = false;\n  @Input() validator: ValidatorFn = null;\n  @Input() headerButtons: TextPopoverButton[] = null;\n  @Input() mobile = false;\n\n  subscription = new Subscription();\n\n  get disabled() {\n    return this.form.disabled;\n  }\n\n  get enabled() {\n    return this.form.enabled;\n  }\n\n  get valid() {\n    return this.form?.valid || false;\n  }\n\n  get value() {\n    return this.form?.value.text;\n  }\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected popoverController: PopoverController,\n    protected translate: TranslateService\n  ) {}\n\n  ngOnInit(): void {\n    this.showHeader = toBoolean(this.showHeader, isNotNilOrBlank(this.title) || isNotEmptyArray(this.headerButtons));\n    this.showFooter = toBoolean(this.showFooter, !this.mobile);\n    this.enable();\n  }\n\n  ngAfterViewInit() {\n    setTimeout(() => this.form.setValue({ text: this.text }), 0);\n  }\n\n  async onValidate(event: any): Promise<any> {\n    await waitWhilePending(this.form);\n\n    if (!this.valid) {\n      logFormErrors(this.form.textControl);\n      return;\n    }\n\n    try {\n      const value = this.value;\n      this.disable();\n      this.form.error = null;\n      await this.popoverController.dismiss(value);\n    } catch (err) {\n      this.form.error = (err && err.message) || err;\n      this.enable();\n    }\n  }\n\n  disable() {\n    this.form.disable();\n  }\n\n  enable() {\n    if (this.editing) this.form.enable();\n  }\n\n  cancel() {\n    this.popoverController.dismiss();\n  }\n\n  ngOnDestroy(): void {\n    this.subscription.unsubscribe();\n  }\n\n  protected async clickButton(button: TextPopoverButton) {\n    if (typeof button.handler === 'function') {\n      const result = await button.handler(this.value);\n      // TODO comment interpreter le true ?? => fermer ou annuler l'action ?\n      if (result === true) {\n        return this.popoverController.dismiss(this.value, button.role);\n      }\n    } else {\n      return this.popoverController.dismiss(this.value, button.role);\n    }\n  }\n\n  protected isStartSide(button: TextPopoverButton) {\n    return button?.side === 'start';\n  }\n\n  protected isEndSide(button: TextPopoverButton) {\n    return button?.side !== 'start';\n  }\n}\n","<ion-header *ngIf=\"showHeader\">\n  <ion-toolbar [color]=\"headerColor\">\n    <ion-buttons slot=\"start\">\n      <ion-button\n        *ngIf=\"mobile && editing\"\n        (click)=\"cancel()\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_CANCEL' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_CANCEL' | translate) : ''\"\n      >\n        <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n      </ion-button>\n      <ion-button\n        *ngFor=\"let button of headerButtons | arrayFilter: isStartSide\"\n        [fill]=\"button.fill\"\n        [color]=\"button.color\"\n        (click)=\"clickButton(button)\"\n      >\n        <ion-icon *ngIf=\"button.icon\" [slot]=\"button.text ? 'start' : 'icon-only'\" [name]=\"button.icon\"></ion-icon>\n        <ion-text *ngIf=\"button.text\">{{ button.text | translate }}</ion-text>\n      </ion-button>\n    </ion-buttons>\n\n    <ion-title *ngIf=\"title\">{{ title | translate }}</ion-title>\n\n    <ion-buttons slot=\"end\">\n      <ion-button\n        *ngFor=\"let button of headerButtons | arrayFilter: isEndSide\"\n        [fill]=\"button.fill\"\n        [color]=\"button.color\"\n        (click)=\"clickButton(button)\"\n      >\n        <ion-icon *ngIf=\"button.icon\" [slot]=\"button.text ? 'start' : 'icon-only'\" [name]=\"button.icon\"></ion-icon>\n        <ion-text *ngIf=\"button.text\">{{ button.text | translate }}</ion-text>\n      </ion-button>\n\n      <ng-container *ngIf=\"mobile\">\n        <ion-button\n          *ngIf=\"editing\"\n          (click)=\"onValidate($event)\"\n          [disabled]=\"disabled\"\n          [title]=\"!showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n        >\n          <ion-icon slot=\"icon-only\" name=\"checkmark\"></ion-icon>\n        </ion-button>\n        <ion-button\n          *ngIf=\"!editing\"\n          (click)=\"cancel()\"\n          [title]=\"!showTooltip ? ('COMMON.BTN_CLOSE' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('COMMON.BTN_CLOSE' | translate) : ''\"\n        >\n          <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n        </ion-button>\n      </ng-container>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\" [class.has-header]=\"showHeader\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n  <ion-item *ngIf=\"form.error\" visible-xs visible-sm visible-mobile lines=\"none\">\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"form.error | translate\"></ion-label>\n  </ion-item>\n\n  <app-text-form\n    #form\n    [standalone]=\"true\"\n    [placeholder]=\"placeholder\"\n    [multiline]=\"multiline\"\n    [maxLength]=\"maxLength\"\n    [autoHeight]=\"autoHeight\"\n    [autofocus]=\"editing && autofocus\"\n    [validator]=\"validator\"\n    (onSubmit)=\"onValidate($event)\"\n  ></app-text-form>\n</ion-content>\n\n<ion-footer *ngIf=\"showFooter\">\n  <ion-toolbar>\n    <ion-row class=\"ion-no-padding\" nowrap>\n      <ion-col></ion-col>\n\n      <ion-col size=\"auto\">\n        <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n        <ion-button\n          [fill]=\"disabled ? 'clear' : 'solid'\"\n          (click)=\"onValidate($event)\"\n          (keyup.enter)=\"onValidate($event)\"\n          color=\"tertiary\"\n          [disabled]=\"disabled\"\n          [title]=\"!showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n        >\n          <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","/**\n * Logging levels.\n * Based on https://github.com/Ritzlgrmft/ionic-logging-service/blob/main/projects/ionic-logging-service/src/lib/log-level.model.ts\n */\nexport enum LogLevel {\n  /**\n   * All events should be logged.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  ALL,\n\n  /**\n   * A fine-grained debug message, typically capturing the flow through the application.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  TRACE,\n\n  /**\n   * A general debugging event.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  DEBUG,\n\n  /**\n   * An event for informational purposes.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  INFO,\n\n  /**\n   * An event that might possible lead to an error.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  WARN,\n\n  /**\n   * An error in the application, possibly recoverable.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  ERROR,\n\n  /**\n   * A severe error that will prevent the application from continuing.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  FATAL,\n\n  /**\n   * No events will be logged.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  OFF,\n}\n","import { LogLevel } from './log-level.model';\nimport { Moment } from 'moment';\nimport { LoggingServiceConfig } from './logging-service.config';\nimport { fromDateISOString, toDateISOString } from '../dates';\nimport { AppColors } from '../types';\n\nexport interface ILoggingService {\n  configure(configuration: LoggingServiceConfig): Promise<void>;\n\n  getLogger(loggerName: string): ILogger;\n}\n\nexport interface ILoggingAppender {\n  append(loggerName: string, level: LogLevel, message: string);\n}\n\nexport interface ILogger {\n  /**\n   * Logs a message at level TRACE.\n   *\n   * @param methodName name of the method\n   * @param params optional parameters to be logged; objects will be formatted as JSON\n   */\n  trace(methodName: string, ...params: any[]): void;\n  /**\n   * Logs a message at level DEBUG.\n   *\n   * @param methodName name of the method\n   * @param params optional parameters to be logged; objects will be formatted as JSON\n   */\n  debug(methodName: string, ...params: any[]): void;\n  /**\n   * Logs a message at level INFO.\n   *\n   * @param methodName name of the method\n   * @param params optional parameters to be logged; objects will be formatted as JSON\n   */\n  info(methodName: string, ...params: any[]): void;\n  /**\n   * Logs a message at level WARN.\n   *\n   * @param methodName name of the method\n   * @param params optional parameters to be logged; objects will be formatted as JSON\n   */\n  warn(methodName: string, ...params: any[]): void;\n  /**\n   * Logs a message at level ERROR.\n   *\n   * @param methodName name of the method\n   * @param params optional parameters to be logged; objects will be formatted as JSON\n   */\n  error(methodName: string, ...params: any[]);\n\n  /**\n   * Logs a message at level FATAL.\n   *\n   * @param methodName name of the method\n   * @param params optional parameters to be logged; objects will be formatted as JSON\n   */\n  fatal(methodName: string, ...params: any[]);\n}\n\nexport interface Log {\n  loggerName: string;\n  level: LogLevel;\n  message: string;\n  date: Moment;\n}\n\nexport class LogUtils {\n  static fromObject(source: any): Log {\n    const date = fromDateISOString(source.date);\n    return <Log>{\n      loggerName: source.loggerName,\n      date,\n      level: (source.level as LogLevel) || LogLevel.INFO,\n      message: source.message,\n    };\n  }\n\n  static asObject(source: Log): any {\n    const date = toDateISOString(source.date);\n    return {\n      loggerName: source.loggerName,\n      date,\n      level: +source.level,\n      message: source.message,\n    };\n  }\n\n  static fromObjects(sources: any[]): Log[] {\n    return (sources || []).map(this.fromObject);\n  }\n\n  static levelToString(level: LogLevel): string {\n    return LogLevel[level].toUpperCase();\n  }\n\n  static levelToColor(level: LogLevel): AppColors {\n    switch (level) {\n      case LogLevel.TRACE:\n        return 'primary';\n      case LogLevel.DEBUG:\n        return 'secondary';\n      case LogLevel.INFO:\n        return 'tertiary';\n      case LogLevel.WARN:\n        return 'warning';\n      case LogLevel.ERROR:\n        return 'accent';\n      case LogLevel.FATAL:\n        return 'danger';\n      default:\n        return 'medium';\n    }\n  }\n}\n","import { ILogger, ILoggingAppender, ILoggingService, Log, LogUtils } from './logger.model';\nimport { Inject, Injectable, InjectionToken } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { DateUtils } from '../dates';\nimport { APP_STORAGE, IStorage } from '../storage/storage.utils';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { debounceTime } from 'rxjs/operators';\nimport { isEmptyArray, isNotEmptyArray } from '../functions';\nimport { LoggingServiceConfig } from './logging-service.config';\nimport { LogLevel } from './log-level.model';\nimport { StartableService } from '../services/startable-service.class';\n\nexport class Logger implements ILogger {\n  constructor(\n    private _name: string,\n    private _appender: ILoggingAppender\n  ) {}\n\n  trace(methodName: string, ...params: any[]): void {\n    this._appender.append(this._name, LogLevel.TRACE, this.toString(methodName, ...params));\n  }\n\n  debug(methodName: string, ...params: any[]): void {\n    this._appender.append(this._name, LogLevel.DEBUG, this.toString(methodName, ...params));\n  }\n\n  info(methodName: string, ...params: any[]): void {\n    this._appender.append(this._name, LogLevel.INFO, this.toString(methodName, ...params));\n  }\n\n  warn(methodName: string, ...params: any[]): void {\n    this._appender.append(this._name, LogLevel.WARN, this.toString(methodName, ...params));\n  }\n\n  error(methodName: string, ...params: any[]) {\n    this._appender.append(this._name, LogLevel.ERROR, this.toString(methodName, ...params));\n  }\n\n  fatal(methodName: string, ...params: any[]) {\n    this._appender.append(this._name, LogLevel.FATAL, this.toString(methodName, ...params));\n  }\n\n  private toString(methodName, ...params: any[]) {\n    return (\n      `[${methodName}] ` +\n      (params || [])\n        .map((p) => {\n          if (typeof p === 'string') return p;\n          if (typeof p === 'number') return '' + p;\n          return JSON.stringify(p);\n        })\n        .join(' ')\n    );\n  }\n}\n\nexport const APP_LOGGING_SERVICE = new InjectionToken<ILoggingService>('LoggingService');\n\n@Injectable()\nexport class LoggingService extends StartableService<void> implements ILoggingService, ILoggingAppender {\n  _dataSubject = new BehaviorSubject<Log[]>([]);\n  _debounceTimeMs: number;\n  _storageKey: string;\n  _maxMessages: number;\n  _saving = false;\n\n  constructor(\n    @Inject(APP_STORAGE) private storage: IStorage,\n    @Inject(ENVIRONMENT) protected environment: Environment\n  ) {\n    super(storage);\n    this.configure(environment.logging);\n  }\n\n  async configure(config: LoggingServiceConfig) {\n    await this.restart(config);\n  }\n\n  protected async ngOnStart(opts?: LoggingServiceConfig): Promise<void> {\n    this._debounceTimeMs = opts?.localStorageAppender?.debounceTimeMs || 1000 /* = 1s */;\n    this._maxMessages = opts?.localStorageAppender?.maxMessages || 250;\n    this._storageKey = opts?.localStorageAppender?.localStorageKey || 'log';\n\n    console.info(\n      `[logging] Configuring logging... {localStorageKey: '${this._storageKey}', maxMessages: ${this._maxMessages}, savePeriodMs: ${this._debounceTimeMs}}`\n    );\n\n    // Save timer\n    this.registerSubscription(\n      this._dataSubject\n        // Avoid to many call\n        .pipe(debounceTime(this._debounceTimeMs))\n        .subscribe(() => this.storeLocally())\n    );\n  }\n\n  getLogger(loggerName: string): ILogger {\n    return new Logger(loggerName, this);\n  }\n\n  append(loggerName: string, level: LogLevel, message: string) {\n    this._dataSubject.next([...this._dataSubject.value, <Log>{ loggerName, level, message, date: DateUtils.moment() }]);\n  }\n\n  protected async storeLocally() {\n    if (this._saving) return;\n    this._saving = true;\n    try {\n      const newMessages: any[] = (this._dataSubject.value || []).map(LogUtils.asObject);\n\n      if (isEmptyArray(newMessages)) return; // Skip if no data\n      this._dataSubject.next([]); // Reset log\n\n      const oldValue = await this.storage.get(this._storageKey);\n      const oldMessages: any[] = typeof oldValue === 'string' ? JSON.parse(oldValue) : oldValue || [];\n      let lastMessages = [...(oldMessages || []), ...newMessages];\n      if (lastMessages.length > this._maxMessages) {\n        lastMessages = lastMessages.slice(lastMessages.length - this._maxMessages);\n      }\n\n      if (isNotEmptyArray(lastMessages)) {\n        console.info(`[logging] Saving ${newMessages.length} messages to storage...`);\n        await this.storage.set(this._storageKey, lastMessages);\n      }\n    } catch (err) {\n      console.error(err);\n    } finally {\n      this._saving = false;\n    }\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { IReferentialRef, referentialsToString, referentialToString } from '../model/referential.model';\n\n@Pipe({\n  name: 'referentialToString',\n})\nexport class ReferentialToStringPipe implements PipeTransform {\n  constructor() {}\n\n  transform(\n    value: IReferentialRef | IReferentialRef[] | any,\n    opts?: string[] | { properties?: string[]; separator?: string; propertySeparator?: string }\n  ): string {\n    const properties = Array.isArray(opts) ? opts : opts?.properties;\n    if (Array.isArray(value)) return referentialsToString(value, properties, opts?.['separator'], opts?.['propertySeparator']);\n    return referentialToString(value, properties, opts?.['propertySeparator']);\n  }\n}\n\n\n@Pipe({\n  name: 'referentialsToString',\n})\nexport class ReferentialsToStringPipe implements PipeTransform {\n  constructor() {}\n\n  transform(\n    value: IReferentialRef[] | any,\n    opts?: string[] | { properties?: string[]; separator?: string; propertySeparator?: string }\n  ): string {\n    const properties = Array.isArray(opts) ? opts : opts?.properties;\n    return referentialsToString(value, properties, opts?.['separator'], opts?.['propertySeparator']);\n  }\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  Inject,\n  Input,\n  numberAttribute,\n  OnDestroy,\n  Optional,\n  ViewChild,\n} from '@angular/core';\nimport { IonSearchbar, ModalController, PopoverController } from '@ionic/angular';\nimport { Peer } from '../services/model/peer.model';\nimport { Subscription } from 'rxjs';\nimport { fadeInAnimation } from '../../shared/material/material.animations';\nimport { HttpClient } from '@angular/common/http';\nimport { NetworkUtils, NodeInfo } from '../services/network.utils';\nimport { VersionUtils } from '../../shared/version/versions';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { TextPopover, TextPopoverOptions } from '../form/text-popover/text-popover.component';\nimport { TranslateService } from '@ngx-translate/core';\nimport { isMobile } from '../../shared/platforms';\nimport { Validators } from '@angular/forms';\nimport { PEER_URL_REGEXP } from '../services/network.service';\nimport { APP_LOGGING_SERVICE } from '../../shared/logging/logging-service.class';\nimport { ILogger, ILoggingService } from '../../shared/logging/logger.model';\nimport { map } from 'rxjs/operators';\nimport { EntityUtils } from '../services/model/entity.model';\nimport { RxState } from '@rx-angular/state';\nimport { suggestFromArray } from '../../shared/services';\nimport { isNilOrBlank, isNotEmptyArray, isNotNil } from '../../shared/functions';\nimport { NodeFeature } from '../services/model/node-feature.model';\nimport { FilterFn } from '../../shared/types';\n\nexport interface ISelectPeerModalOptions {\n  canCancel: boolean;\n  allowSelectDownPeer: boolean;\n  onRefresh: EventEmitter<Event>;\n  showSetManuallyButton: boolean;\n  selectedPeer?: string;\n  title?: string;\n  defaultPeers: Peer[];\n  /**\n   * Allow to filter some peers (e.g. to exclude the current peer)\n   */\n  peerFilter?: FilterFn<Peer>;\n  showSearchBar?: boolean;\n  cssClass?: string | string[];\n}\n\nexport interface ISelectPeerModalState {\n  defaultPeers: Peer[];\n  peers: Peer[];\n  filteredPeers: Peer[];\n  filteredPeersByFeatures: Peer[];\n  filteredPeerCount: number;\n  filteredFeaturesCount: number;\n  searchText: string;\n  selectedTabIndex: number;\n}\n\n@Component({\n  selector: 'select-peer-modal',\n  templateUrl: 'select-peer.modal.html',\n  styleUrls: ['./select-peer.modal.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  animations: [fadeInAnimation],\n})\nexport class SelectPeerModal extends RxState<ISelectPeerModalState> implements OnDestroy, ISelectPeerModalOptions {\n  private _subscription = new Subscription();\n  private readonly _logger: ILogger;\n\n  protected defaultPeers$ = this.select('defaultPeers');\n  protected peers$ = this.select('peers');\n  protected filteredPeers$ = this.select('filteredPeers');\n  protected filteredPeersByFeatures$ = this.select('filteredPeersByFeatures');\n  protected filteredPeerCount$ = this.select('filteredPeerCount');\n  protected filteredFeaturesCount$ = this.select('filteredFeaturesCount');\n\n  protected loading = true;\n  protected mobile: boolean;\n  protected peerMinVersion: string;\n  protected peerDefaultPrefix: string;\n  protected enableSelectPeerByFeature: boolean;\n  protected collapsedPeers: { [key: string]: boolean } = {};\n\n  set peers(value: Peer[]) {\n    this.set('peers', () => value);\n  }\n\n  get peers(): Peer[] {\n    return this.get('peers');\n  }\n\n  set searchText(value: string) {\n    this.set('searchText', () => value);\n  }\n\n  get searchText(): string {\n    return this.get('searchText');\n  }\n\n  set filteredPeers(value: Peer[]) {\n    this.set('filteredPeers', () => value);\n  }\n\n  get filteredPeers(): Peer[] {\n    return this.get('filteredPeers');\n  }\n\n  @Input({ transform: numberAttribute }) set selectedTabIndex(value: number) {\n    this.set('selectedTabIndex', () => value);\n  }\n\n  get selectedTabIndex(): number {\n    return this.get('selectedTabIndex');\n  }\n\n  @Input() selectedPeer: string;\n  @Input() peerFilter: FilterFn<Peer>;\n  @Input() title = 'NETWORK.PEER.SELECT_MODAL.TITLE';\n  @Input({ transform: booleanAttribute }) canCancel = true;\n  @Input({ transform: booleanAttribute }) allowSelectDownPeer = true;\n  @Input({ transform: booleanAttribute }) showSetManuallyButton = true;\n  @Input({ transform: booleanAttribute }) showSearchBar: boolean;\n  @Input() tabGroupAnimationDuration: '200ms';\n\n  @Input() onRefresh = new EventEmitter<Event>();\n\n  @Input() set defaultPeers(value: Peer[]) {\n    this.set('defaultPeers', () => value);\n  }\n\n  @ViewChild('searchbar', { static: true }) searchbar: IonSearchbar;\n\n  constructor(\n    private modalCtrl: ModalController,\n    private popoverController: PopoverController,\n    private translate: TranslateService,\n    private http: HttpClient,\n    private cd: ChangeDetectorRef,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_LOGGING_SERVICE) protected loggingService?: ILoggingService\n  ) {\n    super();\n    this.set({ searchText: null, selectedTabIndex: 0 });\n    this.mobile = isMobile(window);\n    this._logger = loggingService?.getLogger('network-modal');\n    this.peerMinVersion = environment.peerMinVersion;\n    this.peerDefaultPrefix = environment.peerDefaultPrefix || 'https://';\n    this.enableSelectPeerByFeature = environment.enableSelectPeerByFeature || false;\n    this.showSearchBar = this.enableSelectPeerByFeature; // Show search bar by default, if two tabs\n\n    // Refreshing peers\n    this.hold(this.defaultPeers$, (res) => this.refreshPeers(res));\n\n    // Search on host\n    this.connect(\n      'filteredPeers',\n      this.select(['peers', 'searchText'], (res) => res).pipe(\n        map(({ peers, searchText }) => {\n          if (isNilOrBlank(searchText)) return peers; // All\n\n          console.debug('[select-peer-modal] Searching on hosts: ' + searchText);\n          const { data } = suggestFromArray(peers, searchText, {\n            anySearch: true,\n            searchAttributes: ['label', 'hostAndPort'],\n          });\n          return data;\n        })\n      )\n    );\n    this.connect('filteredPeerCount', this.filteredPeers$.pipe(map((peers) => peers?.length ?? 0)));\n\n    // Search on features\n    if (this.enableSelectPeerByFeature) {\n      this.connect(\n        'filteredPeersByFeatures',\n        this.select(['peers', 'searchText'], (res) => res).pipe(\n          map(({ peers, searchText }) => {\n            if (isNilOrBlank(searchText)) {\n              return (peers || []).filter((p) => isNotEmptyArray(p?.features));\n            }\n\n            console.debug('[select-peer-modal] Searching on features: ' + searchText);\n            return peers\n              .map((peer) => {\n                const { data: features } = suggestFromArray(peer.features || [], searchText, {\n                  anySearch: true,\n                  searchAttributes: ['label', 'name', 'description'],\n                });\n                if (isNotEmptyArray(features)) {\n                  const filteredPeer = peer.clone();\n                  filteredPeer.features = features;\n                  return filteredPeer;\n                }\n                return null;\n              })\n              .filter(isNotNil);\n          })\n        )\n      );\n      this.connect('filteredFeaturesCount', this.filteredPeersByFeatures$.pipe(map(Peer.countAllFeatures)));\n    }\n  }\n\n  cancel() {\n    this.modalCtrl.dismiss();\n  }\n\n  ngOnDestroy(): void {\n    super.ngOnDestroy();\n    this._subscription.unsubscribe();\n  }\n\n  selectPeer(peer: Peer) {\n    if (this.allowSelectDownPeer || (peer.reachable && this.isCompatible(peer))) {\n      console.debug(`[select-peer-modal] Selected peer: {url: '${peer.url}'}`);\n      this.selectedPeer = peer.url;\n      this.modalCtrl.dismiss(peer);\n    }\n  }\n\n  async toggleSearchBar() {\n    this.showSearchBar = !this.showSearchBar;\n    if (this.showSearchBar && this.searchbar) {\n      setTimeout(() => {\n        this.searchbar.setFocus();\n        this.markForCheck();\n      }, 300);\n    }\n  }\n\n  togglePeerFeatures(peerUrl: string) {\n    if (!peerUrl) return;\n    this.collapsedPeers[peerUrl] = isNotNil(this.collapsedPeers[peerUrl]) ? !this.collapsedPeers[peerUrl] : true;\n    this.markForCheck();\n  }\n\n  /**\n   *  Check the min pod version, defined by the app\n   *\n   * @param peer\n   */\n  isCompatible(peer: Peer): boolean {\n    return !this.peerMinVersion || (peer && peer.softwareVersion && VersionUtils.isCompatible(this.peerMinVersion, peer.softwareVersion));\n  }\n\n  refresh(event: Event) {\n    this.loading = true;\n    this.onRefresh.emit(event);\n  }\n\n  async clickSetManually(event?: Event) {\n    const peerUrl = await this.openPeerUrlPopover(event);\n    if (peerUrl) {\n      const peer = Peer.parseUrl(peerUrl);\n      await this.refreshPeer(peer);\n      this.selectPeer(peer);\n    }\n  }\n\n  /* -- protected methods -- */\n  protected clearLogo(peer: Peer | NodeFeature) {\n    if (peer instanceof Peer) {\n      peer.favicon = 'skip';\n    } else {\n      peer.logo = 'skip';\n    }\n  }\n\n  async refreshPeers(peers: Peer[]) {\n    peers = peers || [];\n\n    const data: Peer[] = [];\n    const jobs = Promise.all(\n      peers\n        .filter((peer) => !(typeof this.peerFilter === 'function') || this.peerFilter(peer))\n        .map(async (peer) => {\n          await this.refreshPeer(peer);\n\n          if (this._subscription.closed) return; // component destroyed\n\n          data.push(peer);\n\n          // Sort (by reachable, then host)\n          data.sort((a, b) => {\n            if (a.reachable && !b.reachable) return -1;\n            if (!a.reachable && b.reachable) return 1;\n            if (a.hostAndPort < b.hostAndPort) return -1;\n            if (a.hostAndPort > b.hostAndPort) return 1;\n            return 0;\n          });\n\n          this.peers = data.slice(); // Copy to force update\n\n          return peer;\n        })\n    );\n\n    try {\n      await jobs;\n    } catch (err) {\n      if (!this._subscription.closed) console.error(err);\n    }\n    this.loading = false;\n    this.cd.markForCheck();\n  }\n\n  protected async refreshPeer(peer: Peer): Promise<Peer> {\n    try {\n      // DEBUG\n      //await sleep(Math.random() * 100);\n\n      const summary: NodeInfo = await NetworkUtils.getNodeInfo(this.http, peer.url);\n      peer.status = 'UP';\n      peer.softwareName = summary.softwareName;\n      peer.softwareVersion = summary.softwareVersion;\n      peer.label = summary.nodeLabel;\n      peer.name = summary.nodeName;\n      peer.features = summary.features?.map(NodeFeature.fromObject) || [];\n    } catch (err) {\n      // If modal was not closed (e.g. response arrived too late => ignore)\n      if (!this._subscription.closed) {\n        console.error(`[select-peer] Error while calling '${peer.url}/api/node/info': ${err?.message || err}`, err);\n        this._logger?.error('refreshPeer', `Error while calling '${peer.url}/api/node/info': ${err?.message || JSON.stringify(err)}`);\n      }\n      peer.status = 'DOWN';\n    }\n    return peer;\n  }\n\n  protected async openPeerUrlPopover(event: Event, opts?: Partial<TextPopoverOptions>) {\n    const modal = await this.popoverController.create({\n      component: TextPopover,\n      componentProps: <TextPopoverOptions>{\n        placeholder: this.translate.instant('SETTINGS.PEER_URL'),\n        multiline: false,\n        autofocus: !this.mobile,\n        autocomplete: false,\n        validator: Validators.pattern(PEER_URL_REGEXP),\n        maxLength: null,\n        text: this.selectedPeer || this.peerDefaultPrefix,\n        ...opts,\n      },\n      backdropDismiss: false,\n      keyboardClose: false,\n      event: null, // IMPORTANT: null event will center the popover, and this will fix keyboard overlap on mobile\n      translucent: true,\n      cssClass: 'popover-large',\n    });\n\n    await modal.present();\n    const { data, role } = await modal.onDidDismiss();\n\n    if (data) {\n      console.info('Popover result: ', data);\n      return data;\n    }\n  }\n\n  protected updateFilteredPeer(event: any) {\n    if (event) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n    const value = event.target.value;\n\n    const test = this.filteredPeers$.pipe(\n      map((peers) => peers.filter(EntityUtils.searchTextFilter(['features.label', 'features.name', 'features.description'], value)))\n    );\n\n    console.log(test);\n    // (event.target.value);\n    this.markForCheck();\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"light\" style=\"z-index: 900\">\n    <ion-buttons slot=\"start\">\n      @if (canCancel) {\n        <ion-button (click)=\"cancel()\" visible-mobile visible-sm visible-xs>\n          <ion-icon name=\"arrow-back\" slot=\"icon-only\"></ion-icon>\n        </ion-button>\n      }\n    </ion-buttons>\n\n    <ion-title>\n      {{ title | translate }}\n    </ion-title>\n\n    <ion-buttons slot=\"end\">\n      <!-- loader -->\n      @if (loading) {\n        <ion-spinner></ion-spinner>\n      } @else {\n        <!-- refresh button -->\n        <ion-button\n          (click)=\"refresh($event)\"\n          *ngIf=\"onRefresh.observed\"\n          [matTooltip]=\"'COMMON.BTN_REFRESH' | translate\"\n        >\n          <mat-icon slot=\"icon-only\">refresh</mat-icon>\n        </ion-button>\n      }\n      <!-- search button -->\n      @if (!showSearchBar) {\n        <ion-button (click)=\"toggleSearchBar()\">\n          <ion-icon slot=\"icon-only\" name=\"search\"></ion-icon>\n        </ion-button>\n      }\n    </ion-buttons>\n  </ion-toolbar>\n\n  <!-- search bar -->\n  <ion-toolbar *ngIf=\"showSearchBar\">\n    <ion-searchbar\n      #searchbar\n      animated\n      type=\"search\"\n      [class.cdk-visually-hidden]=\"!showSearchBar\"\n      show-clear-button=\"always\"\n      [placeholder]=\"'COMMON.BTN_SEARCH' | translate\"\n      [cancelButtonText]=\"'COMMON.BTN_CANCEL' | translate\"\n      [(ngModel)]=\"searchText\"\n      (ionCancel)=\"toggleSearchBar()\"\n    ></ion-searchbar>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <mat-tab-group\n    #tabGroup\n    [(selectedIndex)]=\"selectedTabIndex\"\n    class=\"mat-mdc-tab-disabled-hidden\"\n    [class.mat-mdc-tab-group-header-hidden]=\"!enableSelectPeerByFeature\"\n    [dynamicHeight]=\"false\"\n    [mat-stretch-tabs]=\"mobile\"\n    [animationDuration]=\"mobile ? tabGroupAnimationDuration : '0s'\"\n  >\n    <mat-tab>\n      <ng-template mat-tab-label>\n        <ion-label\n          [matBadge]=\"filteredPeerCount$ | async | badgeNumber\"\n          [matBadgeHidden]=\"filteredPeerCount$ | async | isNil\"\n          [matBadgeColor]=\"(filteredPeerCount$ | async) ? 'primary' : 'accent'\"\n          matBadgeOverlap=\"false\"\n          matBadgeColor=\"primary\"\n          matBadgeSize=\"small\"\n          matBadgePosition=\"above after\"\n        >\n          {{ 'NETWORK.PEER.SELECT_MODAL.TAB_NETWORK' | translate }}\n        </ion-label>\n      </ng-template>\n      <ion-list>\n        <ion-list-header>\n          <ion-label class=\"ion-text-wrap ion-padding-end\">\n            <p [innerHTML]=\"'NETWORK.PEER.SELECT_MODAL.NETWORK_HELP' | translate\"></p>\n          </ion-label>\n        </ion-list-header>\n\n        @for (peer of filteredPeers$ | async; track $index) {\n          <ion-item\n            (click)=\"selectPeer(peer)\"\n            @fadeInAnimation\n            [class.selected]=\"selectedPeer && selectedPeer === peer.url\"\n            detail\n            matRipple\n            tappable\n          >\n            <!-- Peer is UP -->\n            @if (peer.reachable) {\n              <!-- icon -->\n              @if (peer.favicon != 'skip') {\n                <ion-avatar slot=\"start\">\n                  <ion-img [src]=\"peer.favicon || peer.url + '/api/favicon'\" (ionError)=\"clearLogo(peer)\"></ion-img>\n                  <ion-icon name=\"server\" class=\"icon-secondary\" style=\"top: 12px; left: 44px\" color=\"dark\"></ion-icon>\n                </ion-avatar>\n              } @else {\n                <ion-icon slot=\"start\" name=\"server\" class=\"ion-icon-avatar\" color=\"dark\"></ion-icon>\n              }\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <ion-label class=\"ion-text-wrap\">\n                      <ion-text>\n                        @let url = peer.hostAndPort + peer.path;\n                        <h3 [innerHTML]=\"url | highlight: searchText\"></h3>\n                      </ion-text>\n                      <ion-text color=\"primary\">\n                        <h4 [innerHTML]=\"peer.label | highlight: searchText\"></h4>\n                      </ion-text>\n                    </ion-label>\n                  </ion-col>\n                  <ion-col size=\"12\" size-sm=\"4\">\n                    <ion-label class=\"ion-text-wrap ion-text-sm-center\" color=\"medium\">\n                      <h4>\n                        <small>{{ peer.softwareName }}&nbsp;</small>\n                        <br class=\"hidden-xxs hidden-xs\" />\n                        <!-- Compatible -->\n                        @if (!peerMinVersion || isCompatible(peer)) {\n                          <small>v{{ peer.softwareVersion }}</small>\n                        } @else {\n                          <!-- Incompatible -->\n                          <ion-text\n                            color=\"danger\"\n                            [matTooltip]=\"\n                              'NETWORK.PEER.SELECT_MODAL.NOT_COMPATIBLE_HELP' | translate: { version: peerMinVersion }\n                            \"\n                          >\n                            <small class=\"ion-color-danger\">\n                              <mat-icon>warning</mat-icon>\n                              v{{ peer.softwareVersion }}\n                            </small>\n                          </ion-text>\n                        }\n                      </h4>\n                    </ion-label>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            } @else {\n              <!-- Peer is DOWN -->\n              <ion-icon slot=\"start\" name=\"server\" class=\"disabled ion-icon-avatar\"></ion-icon>\n\n              <ion-label class=\"ion-text-wrap\">\n                <ion-text color=\"medium\">\n                  <h3>{{ peer.hostAndPort }}{{ peer.path }}</h3>\n                </ion-text>\n                <ion-text color=\"danger\">\n                  <h4>\n                    <small>\n                      <ion-icon size=\"small\" name=\"close-circle\"></ion-icon>\n                    </small>\n                    <span translate>NETWORK.PEER.OFFLINE</span>\n                  </h4>\n                </ion-text>\n              </ion-label>\n            }\n          </ion-item>\n        }\n\n        <!-- no result -->\n        @if ((filteredPeerCount$ | async) === 0) {\n          <ion-item>\n            <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n          </ion-item>\n        }\n      </ion-list>\n    </mat-tab>\n\n    <!-- Select by features -->\n    <mat-tab [disabled]=\"!enableSelectPeerByFeature\">\n      <ng-template mat-tab-label>\n        <ion-label\n          [matBadge]=\"filteredFeaturesCount$ | async | badgeNumber\"\n          [matBadgeHidden]=\"filteredFeaturesCount$ | async | isNil\"\n          [matBadgeColor]=\"(filteredFeaturesCount$ | async) ? 'primary' : 'accent'\"\n          matBadgeOverlap=\"false\"\n          matBadgeSize=\"small\"\n          matBadgePosition=\"above after\"\n        >\n          {{ 'NETWORK.PEER.SELECT_MODAL.TAB_FEATURES' | translate }}\n        </ion-label>\n      </ng-template>\n      <ion-list>\n        <ion-list-header>\n          <ion-label class=\"ion-text-wrap ion-padding-end\">\n            <p [innerHTML]=\"'NETWORK.PEER.SELECT_MODAL.FEATURES_HELP' | translate\"></p>\n          </ion-label>\n        </ion-list-header>\n\n        @for (peer of filteredPeersByFeatures$ | async; track $index) {\n          @let peerUrl = peer.hostAndPort + peer.path;\n          <!-- Peer is UP -->\n          @if (peer.reachable && peer.features | isNotEmptyArray) {\n            @let collapsed = collapsedPeers[peerUrl];\n\n            <ion-item-divider (click)=\"togglePeerFeatures(peerUrl)\" tappable @fadeInAnimation>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <ion-label>\n                      <h4>\n                        <ion-icon name=\"server\" color=\"medium\"></ion-icon>\n                        {{ peer.hostAndPort }}{{ peer.path }}\n                      </h4>\n                      @if (peerMinVersion && !isCompatible(peer)) {\n                        <ion-text\n                          color=\"danger\"\n                          [matTooltip]=\"\n                            'NETWORK.PEER.SELECT_MODAL.NOT_COMPATIBLE_HELP' | translate: { version: peerMinVersion }\n                          \"\n                        >\n                          <h4 class=\"ion-color-danger\">\n                            <small>\n                              <mat-icon>warning</mat-icon>\n                              v{{ peer.softwareVersion }}\n                            </small>\n                          </h4>\n                        </ion-text>\n                      }\n                    </ion-label>\n                  </ion-col>\n                  <ion-col size=\"4\" class=\"ion-text-end\">\n                    <ion-label class=\"text-italic\">\n                      <h4>({{ 'COMMON.RESULT_COUNT' | translate: { count: peer.features.length } }})</h4>\n                    </ion-label>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n\n              <mat-icon slot=\"end\">\n                @if (collapsed) {\n                  {{ mobile ? 'arrow_drop_down' : 'keyboard_arrow_down' }}\n                } @else {\n                  {{ mobile ? 'arrow_drop_up' : 'keyboard_arrow_up' }}\n                }\n              </mat-icon>\n            </ion-item-divider>\n\n            @if (!collapsed) {\n              @for (feature of peer.features; track feature.label) {\n                <ion-item (click)=\"selectPeer(peer)\" tappable matRipple detail @fadeInAnimation>\n                  <!-- icon -->\n                  @if (feature.logo && feature.logo != 'skip') {\n                    <ion-avatar slot=\"start\">\n                      <ion-img [src]=\"feature.logo\" (ionError)=\"clearLogo(feature)\"></ion-img>\n                    </ion-avatar>\n                  } @else if (peer.favicon != 'skip') {\n                    <ion-avatar slot=\"start\">\n                      <ion-img [src]=\"peer.favicon || peer.url + '/api/favicon'\" (ionError)=\"clearLogo(peer)\"></ion-img>\n                      <ion-icon\n                        name=\"contract\"\n                        class=\"icon-secondary\"\n                        style=\"top: 12px; left: 44px\"\n                        color=\"dark\"\n                      ></ion-icon>\n                    </ion-avatar>\n                  } @else {\n                    <ion-icon slot=\"start\" name=\"contract\" class=\"ion-icon-avatar\" color=\"dark\"></ion-icon>\n                  }\n\n                  <ion-label class=\"ion-text-wrap\">\n                    <ion-text color=\"primary\">\n                      <h3 [innerHTML]=\"feature | referentialToString | highlight: searchText\"></h3>\n                    </ion-text>\n                    <ion-text>\n                      <p [innerHTML]=\"feature.description | highlight: searchText\"></p>\n                    </ion-text>\n                  </ion-label>\n                </ion-item>\n              }\n            }\n          }\n        }\n\n        <!-- no result -->\n        @if ((filteredFeaturesCount$ | async) === 0) {\n          <ion-item>\n            <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n          </ion-item>\n        }\n      </ion-list>\n    </mat-tab>\n  </mat-tab-group>\n</ion-content>\n\n@if ((canCancel && !mobile) || showSetManuallyButton) {\n  <ion-footer>\n    <ion-toolbar>\n      <ion-row class=\"ion-no-padding ion-text-nowrap\">\n        <ion-col></ion-col>\n\n        <!-- buttons -->\n        @if (showSetManuallyButton) {\n          <ion-col size=\"auto\">\n            <ion-button fill=\"clear\" (click)=\"clickSetManually($event)\">\n              <ion-label translate>NETWORK.PEER.SELECT_MODAL.BTN_SET_MANUALLY</ion-label>\n            </ion-button>\n          </ion-col>\n        }\n\n        @if (canCancel) {\n          <ion-col size=\"auto\" hidden-xs hidden-sm hidden-mobile>\n            <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n              <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n            </ion-button>\n          </ion-col>\n        }\n      </ion-row>\n    </ion-toolbar>\n  </ion-footer>\n}\n","import { Directive, Optional } from '@angular/core';\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { IStartableService } from './startable-service.class';\nimport { FirstOptions, firstPromise } from '../observables';\n\n/**\n * Same as StartableService, but with a dataSubject instead of a simple 'data' property\n */\n@Directive()\nexport abstract class StartableObservableService<T = any, O = any> implements IStartableService<T> {\n  readonly dataSubject = new BehaviorSubject<T>(null);\n  readonly startSubject = new Subject<T>();\n  readonly stopSubject = new Subject<void>();\n\n  protected _debug = false;\n  protected _startByReadyFunction = true; // should start when calling ready() ?\n\n  private _started = false;\n  private _startPromise: Promise<T> = null;\n  private _startPrerequisite: () => Promise<any> = null;\n  private _subscription: Subscription = null;\n\n  protected constructor(@Optional() prerequisiteService?: { ready: () => Promise<any> }) {\n    this._startPrerequisite = prerequisiteService ? () => prerequisiteService.ready() : () => Promise.resolve();\n  }\n\n  /**\n   * Initiates the startup process for the service. If the service is already started,\n   * it returns the existing data or ensures that the start process executes correctly.\n   *\n   * @param {O} [opts] - Optional configuration or parameters for the startup process.\n   * @return {Promise<T>} A promise that resolves with the service's initialized data, or null if an error occurs during the startup.\n   */\n  start(opts?: O): Promise<T> {\n    if (this._startPromise) return this._startPromise;\n    if (this._started) return Promise.resolve(this.dataSubject.value);\n\n    this._startPromise = this._startPrerequisite()\n      .then(() => this.ngOnStart(opts))\n      .then((data) => {\n        this._started = true;\n        this._startPromise = undefined;\n\n        // Should be done AFTER 'this._started = true', because of the 'filter' operator, inside ready() function\n        this.dataSubject.next(data);\n        this.startSubject.next(data);\n\n        return data;\n      })\n      .catch((err) => {\n        if (!this.stopped) {\n          console.error('Failed to start a service: ' + ((err && err.message) || err), err);\n          this._started = false;\n          this._startPromise = null;\n        }\n        return null;\n      });\n    return this._startPromise;\n  }\n\n  /**\n   * Prepares the service to be ready, ensuring any required setup or initialization is complete.\n   * This method will wait until the service is started, either directly or via a promise, before resolving.\n   *\n   * @param {FirstOptions} [opts] - Optional configuration options that may affect the readiness of the service.\n   * @return {Promise<T>} A promise that resolves with the service's data once it is ready.\n   */\n  ready(opts?: FirstOptions): Promise<T> {\n    // Already started\n    if (this._started) return Promise.resolve(this.dataSubject.value);\n\n    // Starting in progress\n    if (this._startPromise) {\n      if (!opts) return this._startPromise;\n      // Continue (wait end using options)\n    }\n\n    // Not started, but should fire start()\n    else if (this._startByReadyFunction) {\n      const startPromise = this.start();\n      if (!opts) return startPromise;\n      // Continue (wait end using options)\n    }\n\n    // Wait the end of the start (without fire start())\n    return firstPromise(\n      this.dataSubject.pipe(\n        // Wait start() to be called, to exclude the initial 'null' value\n        filter((_) => this._started)\n      ),\n      {stop: this.stopSubject, ...opts}\n    );\n  }\n\n  async stop() {\n    try {\n      this.unsubscribe();\n      await this.ngOnStop();\n    } catch (err) {\n      console.error('Failed to stop a service: ' + ((err && err.message) || err), err);\n    } finally {\n      this._started = false;\n      this._startPromise = undefined;\n      this.stopSubject.next(); // Stop all running observables\n      this.dataSubject.next(null); // Reset data\n    }\n  }\n\n  async restart(opts?: O): Promise<T> {\n    if (this._startPromise) await this._startPromise; // Wait end of previous loading\n    if (this._started) await this.stop(); // Then stop if started\n    return this.start(opts); // Then start again\n  }\n\n  get started(): boolean {\n    return this._started;\n  }\n\n  get starting(): boolean {\n    return !!this._startPromise;\n  }\n\n  get stopped(): boolean {\n    return !this._started && !this._startPromise;\n  }\n\n  protected get data(): T {\n    return this.dataSubject.value;\n  }\n\n  protected set data(value: T) {\n    if (this.dataSubject.value !== value) {\n      this.dataSubject.next(value);\n    }\n  }\n\n  protected registerSubscription(sub: Subscription) {\n    this._subscription = this._subscription || new Subscription();\n    this._subscription.add(sub);\n  }\n\n  protected unregisterSubscription(sub: Subscription): void {\n    this._subscription?.remove(sub);\n  }\n\n  protected unsubscribe() {\n    this._subscription?.unsubscribe();\n    this._subscription = null;\n  }\n\n  protected ngOnStop(): Promise<void> | void {\n    // Can be overwritten by subclasses\n  }\n\n  protected abstract ngOnStart(opts?: O): Promise<T>;\n}\n","import { EventEmitter, Inject, Injectable, Optional } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Storage } from '@ionic/storage-angular';\nimport { Peer } from './model/peer.model';\nimport { LocalSettings } from './model/settings.model';\nimport { ModalController, Platform, ToastController } from '@ionic/angular';\nimport { ISelectPeerModalOptions, SelectPeerModal } from '../peer/select-peer.modal';\nimport { BehaviorSubject, firstValueFrom, Observable, Subscription, timer } from 'rxjs';\nimport { ConnectionType } from '@capacitor/network';\nimport { LocalSettingsService, SETTINGS_STORAGE_KEY } from './local-settings.service';\nimport { SplashScreen } from '@capacitor/splash-screen';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { equals, isNotEmptyArray, isNotNil, isNotNilOrBlank, sleep, toBoolean } from '../../shared/functions';\nimport { DOCUMENT } from '@angular/common';\nimport { CacheService } from 'ionic-cache';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { distinctUntilChanged, distinctUntilKeyChanged, filter, first, map, mergeMap, takeUntil, tap } from 'rxjs/operators';\nimport { OverlayEventDetail } from '@ionic/core';\nimport { AppManifest, NetworkUtils, NodeInfo } from './network.utils';\nimport { HttpUtils } from '../../shared/http/http.utils';\nimport { VersionUtils } from '../../shared/version/versions';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { StartableObservableService } from '../../shared/services/startable-observable-service.class';\nimport { NetworkEventType } from './network.types';\nimport { APP_LOGGING_SERVICE } from '../../shared/logging/logging-service.class';\nimport { ILogger, ILoggingService } from '../../shared/logging/logger.model';\nimport { Capacitor } from '@capacitor/core';\n\nexport interface ConnectionParams extends Record<string, string> {\n  authToken?: string;\n  authBasic?: string;\n}\n\nexport const PEER_URL_REGEXP = /^(http|https):\\/\\/[^ \"?#@]+$/;\n\nexport const NETWORK_DEFAULT_CONNECTION_TIMEOUT = 10000; // 10s - /!\\ should be high (e.g. for poor connection)\n\nconst NetworkRefreshTimerPeriod = {\n  MOBILE: 1000 * 60 * 10 /* every 10 min */,\n  DESKTOP: 1000 * 60 * 5 /* every 5 min */,\n};\n\n/* -- DEV only (to debug refresh timer)\nNetworkRefreshTimerPeriod.MOBILE =  1000;\nNetworkRefreshTimerPeriod.DESKTOP =  1000; */\n\n@Injectable({ providedIn: 'root' })\nexport class NetworkService extends StartableObservableService<Peer, Peer> {\n  onPeerChanges = this.startSubject.pipe(\n    map((peer) => peer?.url as string),\n    filter(isNotNilOrBlank),\n    distinctUntilChanged<string>()\n  );\n  onNetworkStatusChanges = new BehaviorSubject<ConnectionType>(null);\n  onResetNetworkCache = new EventEmitter(true);\n\n  private readonly _mobile: boolean;\n  private readonly _logger: ILogger;\n  private _timerSubscription: Subscription;\n  private readonly _timerRefreshPeriod: number;\n  private readonly _timerRefreshCondition: () => boolean;\n  private _deviceConnectionType: ConnectionType;\n  private _forceOffline: boolean;\n  private readonly _connectionTimeout: number;\n  private readonly _connectionParams: ConnectionParams = {};\n\n  private _listeners: {\n    [key: string]: ((data?: any) => Promise<void>)[];\n  } = {};\n\n  get online(): boolean {\n    return this.connectionType !== 'none';\n  }\n\n  get offline(): boolean {\n    return this.connectionType === 'none';\n  }\n\n  get forceOffline(): boolean {\n    return this._forceOffline;\n  }\n\n  get connectionType(): ConnectionType {\n    // If force offline: return 'none'\n    return this._forceOffline\n      ? 'none'\n      : // Else, return device connection type (or unknown)\n        (this.started && this._deviceConnectionType) || 'unknown';\n  }\n\n  get peer(): Peer {\n    return this.dataSubject.value?.clone();\n  }\n\n  set peer(peer: Peer) {\n    if (!Peer.equals(this.dataSubject.value, peer)) {\n      this.restart(peer);\n    }\n  }\n\n  get connectionTimeout(): number {\n    return this._connectionTimeout;\n  }\n\n  get connectionParams(): ConnectionParams {\n    return this._connectionParams;\n  }\n\n  get peer$(): Observable<Peer> {\n    return this.dataSubject.pipe(\n      // Wait start() to be called, to exclude the initial 'null' value\n      filter((_) => this.started),\n      distinctUntilKeyChanged<Peer>('url')\n    );\n  }\n\n  constructor(\n    @Inject(DOCUMENT) private _document: any,\n    platform: Platform,\n    private modalCtrl: ModalController,\n    private storage: Storage,\n    private settings: LocalSettingsService,\n    private cache: CacheService,\n    private http: HttpClient,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_LOGGING_SERVICE) private loggingService: ILoggingService,\n    @Optional() private translate: TranslateService,\n    @Optional() private toastController: ToastController\n  ) {\n    super(platform);\n    this._mobile = this.settings.mobile;\n    this._connectionTimeout = environment.connectionTimeout || NETWORK_DEFAULT_CONNECTION_TIMEOUT;\n    this._logger = this.loggingService?.getLogger('network');\n\n    if (this._mobile) {\n      this._timerRefreshPeriod = NetworkRefreshTimerPeriod.MOBILE;\n      this._timerRefreshCondition = () => this.online; // Check only when online, and stop when offline\n    } else {\n      this._timerRefreshPeriod = NetworkRefreshTimerPeriod.DESKTOP;\n      this._timerRefreshCondition = () => true; // Always check\n    }\n\n    this.startSubject.subscribe((peer) => this.ngOnAfterStart(peer));\n\n    // For DEV only\n    this._debug = !environment.production;\n  }\n\n  /**\n   * Register to network event\n   *\n   * @param eventType\n   * @param callback\n   */\n  on<T = any>(eventType: NetworkEventType, callback: (data?: T) => Promise<any>): Subscription {\n    switch (eventType) {\n      case 'start':\n        return this.startSubject.subscribe(() => callback());\n\n      case 'peerChanged':\n        return this.onPeerChanges.subscribe(() => callback());\n\n      case 'statusChanged':\n        return this.onNetworkStatusChanges.subscribe((type) => callback(type as unknown as T));\n\n      case 'resetCache':\n        return this.onResetNetworkCache.subscribe(() => callback());\n\n      default:\n        return this.addListener(eventType, callback);\n    }\n  }\n\n  async tryOnline(opts?: {\n    showOfflineToast?: boolean;\n    showOnlineToast?: boolean;\n    showLoadingToast?: boolean;\n    afterRetryDelay?: number;\n    afterRetryPromise?: () => Promise<any>;\n  }): Promise<boolean> {\n    // If offline mode not forced, or if device says there is no connection: skip\n    if (!this._forceOffline || (await NetworkUtils.getConnectionType()) === 'none') return false;\n\n    // SHow loading toast\n    const now = Date.now();\n    const showLoadingToast = !opts || opts.showLoadingToast !== false;\n    let loadingToast: HTMLIonToastElement;\n    if (showLoadingToast) {\n      await this.showToast({ message: 'NETWORK.INFO.RETRY_TO_CONNECT', duration: 10000, onWillPresent: (t) => (loadingToast = t) });\n    }\n\n    try {\n      console.info('[network] Checking connection to pod...');\n      const settings: LocalSettings = await this.settings.ready();\n\n      if (!settings.peerUrl) return false; // No peer define. Skip\n\n      const peer = Peer.parseUrl(settings.peerUrl);\n      const peerInfo = await this.checkPeerAlive(peer);\n      const peerAliveAndCompatible = peerInfo && (await this.checkPeerCompatible(peerInfo));\n      if (peerAliveAndCompatible) {\n        // Set software and version\n        peer.softwareVersion = peerInfo.softwareVersion;\n        peer.softwareName = peerInfo.softwareName;\n\n        // Disable the offline mode\n        this.setForceOffline(false);\n\n        // Restart\n        await this.restart(peer);\n\n        // Wait a promise, before recheck\n        await this.emit('beforeTryOnlineFinish', this.online);\n      }\n    } catch (err) {\n      console.error((err && err.message) || err);\n      // Continue\n    }\n\n    // Close loading toast (with a minimal display duration of 2s)\n    if (showLoadingToast) {\n      await sleep(2000 - (Date.now() - now));\n      if (loadingToast) await loadingToast.dismiss();\n    }\n\n    // Recheck network status\n    const online = this.online;\n\n    // Display a toast to user\n    if (online) {\n      if (!opts || opts.showOnlineToast !== false) {\n        // Display toast (without await, because not need to wait toast close event)\n        this.showToast({ message: 'NETWORK.INFO.ONLINE', type: 'info' });\n      }\n    } else if (opts && opts.showOfflineToast === true) {\n      // Display toast (without await, because not need to wait toast close event)\n      return this.showOfflineToast({ showRetryButton: false });\n    }\n\n    return this.started && online;\n  }\n\n  async showOfflineToast(opts?: {\n    message?: string;\n    showCloseButton?: boolean;\n    showRetryButton?: boolean;\n    showRetrySuccessToast?: boolean;\n    showRetryLoadingToast?: boolean;\n    onRetrySuccess?: () => void;\n  }): Promise<boolean> {\n    if (this.online) return; // Skip if online\n\n    // Toast with a retry button\n    if (!opts || opts.showRetryButton !== false) {\n      const toastResult = await this.showToast({\n        message: (opts && opts.message) || 'ERROR.NETWORK_REQUIRED',\n        type: 'warning',\n        showCloseButton: true,\n        duration: 100000,\n        buttons: [\n          // reconnect button\n          {\n            role: 'refresh',\n            text: this.translate.instant('NETWORK.BTN_CHECK_ALIVE'),\n          },\n        ],\n      });\n\n      // User don't click reconnect: return\n      if (!toastResult || toastResult.role !== 'refresh') return false;\n\n      // if network state changed to online: exit here\n      if (this.online) return true;\n\n      // Try to reconnect\n      const online = await this.tryOnline({\n        showOfflineToast: false,\n        showOnlineToast: toBoolean(opts && opts.showRetrySuccessToast, true),\n        showLoadingToast: toBoolean(opts && opts.showRetryLoadingToast, true),\n      });\n      if (online) {\n        // Call success callback (async)\n        if (opts && opts.onRetrySuccess) {\n          setTimeout(opts.onRetrySuccess);\n        }\n        return true;\n      }\n\n      opts = {\n        ...opts,\n        showRetryButton: false,\n        showCloseButton: true,\n      };\n    }\n\n    // Simple toast, without 'await', because not need to wait toast's dismiss\n    this.showToast({\n      message: 'ERROR.NETWORK_REQUIRED',\n      type: 'error',\n      ...opts,\n    });\n\n    return false;\n  }\n\n  /**\n   * Check if the peer is alive\n   *\n   * @param peer\n   */\n  async checkPeerAlive(peer?: string | Peer): Promise<NodeInfo> {\n    peer = peer || this.peer;\n    if (!peer) {\n      const settings: LocalSettings = await this.settings.ready();\n      if (!settings.peerUrl) return undefined; // No peer define. Skip\n      peer = Peer.parseUrl(settings.peerUrl);\n    }\n\n    return this.getNodeInfo(peer, { nocache: true, timeout: this._connectionTimeout });\n  }\n\n  /**\n   * Checks whether a peer is compatible based on its software version and the required minimum version.\n   * Optionally displays a toast notification if the peer is not compatible.\n   *\n   * @param {NodeInfo} peerInfo - Information about the peer, including its software version.\n   * @param {Object} [opts] - Additional options for the compatibility check.\n   * @param {boolean} [opts.showToast] - Whether to show a toast notification if the peer is not compatible. Defaults to true.\n   * @return {Promise<boolean>} - A promise that resolves to `true` if the peer is compatible, otherwise `false`.\n   */\n  async checkPeerCompatible(peerInfo: NodeInfo, opts?: { showToast?: boolean }): Promise<boolean> {\n    if (!peerInfo) return false; // Peer cannot be reached\n    if (!this.environment.peerMinVersion) return true; // Skip compatibility check\n\n    // Check the min pod version, defined by the app\n    const isCompatible = peerInfo.softwareVersion && VersionUtils.isCompatible(this.environment.peerMinVersion, peerInfo.softwareVersion);\n\n    // Display toast, if not compatible\n    if (!isCompatible && (!opts || opts.showToast !== false)) {\n      await this.showToast({\n        type: 'error',\n        message: 'NETWORK.ERROR.NOT_COMPATIBLE_PEER',\n        messageParams: {\n          version: this.environment.peerMinVersion,\n        },\n        showCloseButton: true,\n      });\n    }\n    return isCompatible;\n  }\n\n  async getNodeInfo(peer?: string | Peer, opts?: { nocache?: boolean; timeout?: number }): Promise<NodeInfo> {\n    const path = this.computePeerPath(peer, '/api/node/info');\n    this._logger?.debug('getNodeInfo', `Getting '${path}' ...`);\n\n    try {\n      const data: NodeInfo = await this.get(path, opts);\n      this._logger?.debug('getNodeInfo', `Response of '${path}':\\n${JSON.stringify(data)}`);\n      return data;\n    } catch (err) {\n      console.debug(`[network] Error while getting '${path}': ${(err && err.message) || err}`, err);\n      this._logger?.error('getNodeInfo', `Error while getting '${path}': ${err?.message || ''}`);\n      return undefined;\n    }\n  }\n\n  async getAppManifest(peer?: string | Peer, opts?: { nocache?: boolean }): Promise<AppManifest | undefined> {\n    try {\n      let path = this.computePeerPath(peer, 'manifest.json');\n      if (opts?.nocache) {\n        path += '?t=' + Date.now();\n      }\n      return await this.get(path, opts);\n    } catch (err) {\n      if (this.environment.production)\n        console.error(\"[network] Cannot load file 'manifest.json'. Please make sure webserver config allow CORS access\", err);\n      else console.error(\"[network] Cannot load file 'manifest.json'.\", err);\n      // Continue\n    }\n  }\n\n  async getAppVersion(peer?: string | Peer, opts = { nocache: true }): Promise<string | undefined> {\n    try {\n      let path = this.computePeerPath(peer, 'version.appup');\n      if (opts.nocache) {\n        path += '?t=' + Date.now();\n      }\n      const appVersion: string = await this.getText(path, opts);\n      if (isNotNilOrBlank(appVersion)) return appVersion;\n    } catch (err) {\n      if (this.environment.production)\n        console.error(\"[network] Cannot load file 'version.appup'. Please make sure webserver config allow CORS access\");\n      else console.error(\"[network] Cannot load file 'version.appup'.\", err);\n      // Continue\n    }\n\n    // Try loading manifest.json\n    const manifest = await this.getAppManifest(peer, opts);\n    return manifest?.version;\n  }\n\n  computePeerPath(peer: string | Peer | undefined, path: string): string | undefined {\n    peer = peer || this.peer;\n    if (!peer) return undefined;\n\n    let peerUrl = peer instanceof Peer ? peer.url : (peer as string);\n\n    // Remove trailing slash\n    if (peerUrl.endsWith('/')) {\n      peerUrl = peerUrl.substring(0, peerUrl.length - 1);\n    }\n\n    // Add first path\n    if (!path.startsWith('/')) {\n      path = '/' + path;\n    }\n\n    // Concat peer URL and path\n    return peerUrl + path;\n  }\n\n  /**\n   * Allow to force offline mode\n   */\n  setForceOffline(\n    value?: boolean,\n    opts?: {\n      showToast?: boolean; // Display a toast, when offline ?\n    }\n  ) {\n    value = toBoolean(value, true);\n    if (this._forceOffline !== value) {\n      const previousConnectionType = this.connectionType;\n      this._forceOffline = value;\n      const currentConnectionType = this.connectionType;\n\n      if (previousConnectionType !== currentConnectionType) {\n        console.info(`[network] Connection changed to {${currentConnectionType}}`);\n        this.onNetworkStatusChanges.next(currentConnectionType);\n\n        // Offline mode: alert the user\n        if (currentConnectionType === 'none' && (!opts || opts.showToast !== false)) {\n          this.showToast({ message: 'NETWORK.INFO.OFFLINE_HELP', type: 'warning' });\n        }\n      }\n    }\n  }\n\n  async showSelectPeerModal(opts?: Partial<ISelectPeerModalOptions>): Promise<Peer | undefined> {\n    opts = opts || {};\n\n    const hasTopModal = !!(await this.modalCtrl.getTop());\n    const peers = await this.getDefaultPeers();\n    const modal = await this.modalCtrl.create({\n      component: SelectPeerModal,\n      componentProps: <ISelectPeerModalOptions>{\n        defaultPeers: peers,\n        ...opts,\n      },\n      keyboardClose: true,\n      showBackdrop: true,\n      cssClass: hasTopModal ? ['stack-modal', ...(opts?.cssClass || [])] : opts?.cssClass,\n    });\n    await modal.present();\n\n    const { data } = await modal.onWillDismiss();\n\n    return (data && (data as Peer)) || undefined;\n  }\n\n  async clearCache(opts?: { emitEvent?: boolean }): Promise<void> {\n    const now = this._debug && Date.now();\n\n    console.info('[network] Clearing all caches...');\n    return this.cache\n      .clearAll()\n      .then(() => {\n        // Emit event\n        if ((!opts || opts.emitEvent !== false) && this.onResetNetworkCache.observed) {\n          this.onResetNetworkCache.emit();\n\n          // Wait observers clean their caches, if needed\n          return sleep(500);\n        }\n      })\n      .then(() => {\n        if (this._debug) console.debug(`[network] All cache cleared, in ${Date.now() - now}ms`);\n      });\n  }\n\n  /**\n   * Sends a GET request to the specified path and returns a promise of the response.\n   *\n   * @param {string} path The endpoint path to send the GET request to.\n   * @param {Object} [opts] Optional parameters for the GET request.\n   * @param {HttpHeaders | Object} [opts.headers] Headers to include in the request. Can be an instance of HttpHeaders or an object with header key-value pairs.\n   * @param {'json'} [opts.responseType] The type of response expected. Defaults to 'json'.\n   * @param {boolean} [opts.nocache] If true, indicates that the response should not be cached.\n   * @param {number} [opts.timeout] The timeout for the request in milliseconds.\n   * @return {Promise<T>} A promise that resolves with the response of type T.\n   */\n  get<T>(\n    path: string,\n    opts?: {\n      headers?:\n        | HttpHeaders\n        | {\n            [header: string]: string | string[];\n          };\n      responseType?: 'json';\n      nocache?: boolean;\n      timeout?: number;\n    }\n  ): Promise<T> {\n    const url = this.getUri(path);\n    // Add App headers only if on same peer\n    if (this.peer && url?.startsWith(this.peer.url)) {\n      opts = this.addAppHeaders(opts);\n    }\n    return HttpUtils.getJson<T>(this.http, url, opts);\n  }\n\n  async setAuthToken(token: string) {\n    if (token) {\n      console.debug('[network] Apply token authentication to headers');\n      this._connectionParams.authToken = token;\n    }\n    // Clean auth token\n    else if (this._connectionParams.authToken) {\n      console.debug('[network] Remove token authentication from headers');\n      delete this._connectionParams.authToken;\n\n      await this.clearCache();\n    }\n  }\n\n  async setAuthBasic(basic: string) {\n    if (basic) {\n      console.debug('[graphql] Apply basic authentication to headers');\n      this._connectionParams.authBasic = basic;\n    }\n    // Clean auth basic\n    else if (this._connectionParams.authBasic) {\n      console.debug('[graphql] Remove basic authentication from headers');\n      delete this._connectionParams.authBasic;\n\n      await this.clearCache();\n    }\n  }\n\n  /* -- protected functions -- */\n\n  protected async ngOnStart(peer?: Peer): Promise<Peer> {\n    console.debug('[network] Starting network...');\n\n    // Check if we can use Network plugin\n    console.debug(`[network] Capacitor Network plugin is ${Capacitor.isPluginAvailable('Network') ? 'available' : 'not available'}`);\n\n    // Restoring local settings\n    peer = peer || (await this.restoreLocally());\n\n    if (!peer) {\n      // Make sure to hide the splashscreen, before open the modal\n      await SplashScreen.hide();\n\n      // No peer in settings: ask user to choose\n      while (!peer) {\n        console.debug('[network] No peer defined. Asking user to choose a peer.');\n        peer = await this.showSelectPeerModal({ allowSelectDownPeer: false, title: 'NETWORK.PEER.SELECT_MODAL.STARTUP_TITLE', canCancel: false });\n      }\n    } else if (this.online) {\n      // Check if alive. If not, force offline mode\n      const alive = await this.checkPeerAlive(peer);\n      if (!alive) {\n        // Peer not alive, but should be at the same URL, retrying each 1s\n        if (this.environment.sameUrlPeer) {\n          const retryMs = this._connectionTimeout > 0 ? this._connectionTimeout : 1000;\n          await firstValueFrom(\n            timer(retryMs, retryMs).pipe(\n              takeUntil(this.stopSubject),\n              tap(() => console.warn(`[network-service] Waiting peer be be alive, at {${peer.url}} ...`)),\n              mergeMap(() => this.checkPeerAlive(peer)),\n              filter((alive) => !!alive),\n              first()\n            )\n          );\n        } else {\n          // Continue, in offline mode\n          this.setForceOffline(true);\n        }\n      }\n    }\n\n    console.debug(`[network] Starting service [OK] {peer: '${peer.url}', online: ${this.online}}`);\n\n    return peer;\n  }\n\n  protected async ngOnAfterStart(peer: Peer) {\n    // Wait settings starts, then save peer in settings\n    await this.settings.apply({ peerUrl: peer.url });\n\n    // Listen for device network changes\n    if (NetworkUtils.isPluginAvailable()) {\n      const connectionType = await NetworkUtils.getConnectionType();\n      this.onDeviceConnectionChanged(connectionType);\n\n      this.registerSubscription(\n        NetworkUtils.statusChanges().subscribe((status) => this.onDeviceConnectionChanged(status?.connectionType || 'unknown'))\n      );\n    } else {\n      this.onDeviceConnectionChanged('unknown');\n    }\n\n    // Start the refresh timer\n    this.startRefreshTimer();\n  }\n\n  protected ngOnStop() {\n    // Stop timer, if we cannot refresh anymore\n    if (this._timerRefreshCondition() === false) {\n      this.stopRefreshTimer();\n    }\n  }\n\n  /**\n   * Try to restore peer from the local storage\n   */\n  protected async restoreLocally(): Promise<Peer | undefined> {\n    // Force use predefined peer if provided\n    if (this.environment.peer) {\n      return Peer.fromObject(this.environment.peer);\n    }\n\n    // Restore from storage\n    let settings = await this.storage.get(SETTINGS_STORAGE_KEY);\n    settings = typeof settings === 'string' ? JSON.parse(settings) : settings;\n    if (settings && settings.peerUrl) {\n      console.debug(`[network] Use peer {${settings.peerUrl}} (found in the local storage)`);\n      return Peer.parseUrl(settings.peerUrl);\n    }\n\n    // Else, use default peer in env, if exists\n    if (this.environment.defaultPeer) {\n      return Peer.fromObject(this.environment.defaultPeer);\n    }\n\n    // Else, if App is hosted, try the website as a peer\n    const location = this._document?.location;\n    if (location?.protocol?.startsWith('http')) {\n      const hostname = this._document.location.host;\n      const detectedPeer = Peer.parseUrl(`${this._document.location.protocol}${hostname}${this.environment.baseUrl}`);\n\n      if (this.environment.sameUrlPeer || (await this.checkPeerAlive(detectedPeer))) {\n        return detectedPeer;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Stop to network state\n   *\n   * @protected\n   */\n  protected stopRefreshTimer() {\n    if (this._timerSubscription) {\n      this._timerSubscription.unsubscribe();\n      this._timerSubscription = undefined;\n    }\n  }\n\n  /**\n   * Refresh the network state\n   *\n   * @protected\n   */\n  protected startRefreshTimer() {\n    if (this._timerSubscription) return; // Already running: skip\n\n    console.debug(`[network] Starting refresh timer, every ${this._timerRefreshPeriod}ms...`);\n\n    let lastInfo: NodeInfo;\n    this._timerSubscription = timer(this._timerRefreshPeriod, this._timerRefreshPeriod)\n      .pipe(\n        // Skip some timer event (see constructor)\n        filter(this._timerRefreshCondition),\n\n        // Checkin if peer alive\n        tap(() => console.debug('[network] Checking connection to pod...')),\n        mergeMap(() => this.checkPeerAlive(this.peer)),\n\n        // Filter to keep only changes\n        filter((info) => !equals(info, lastInfo)),\n        tap((info) => (lastInfo = info)),\n\n        // Check compatibility\n        mergeMap((info) => this.checkPeerCompatible(info, { showToast: true }))\n      )\n      .subscribe((alive) => {\n        if (alive && this.offline) {\n          this.setForceOffline(false);\n\n          // Restart the service (to force re auth)\n          this.restart();\n        } else if (!alive && this.online) {\n          this.setForceOffline(true);\n\n          // Stop the service\n          this.stop();\n        }\n      });\n\n    this._timerSubscription.add(() => console.debug('[network] Refresh timer stopped'));\n  }\n\n  protected async getText(\n    path: string,\n    opts?: {\n      headers?:\n        | HttpHeaders\n        | {\n            [header: string]: string | string[];\n          };\n      responseType?: 'text';\n      nocache?: boolean;\n    }\n  ): Promise<string> {\n    return HttpUtils.getText(this.http, this.getUri(path), this.addAppHeaders(opts));\n  }\n\n  /* -- Protected methods -- */\n\n  protected addAppHeaders<T extends { headers?: HttpHeaders | { [header: string]: string | string[] } }>(opts?: T): T {\n    const updatedOpts = { ...opts } as T;\n\n    if (!updatedOpts.headers) {\n      updatedOpts.headers = {};\n    }\n\n    // Handle HttpHeaders instance\n    if (updatedOpts.headers instanceof HttpHeaders) {\n      let headers = updatedOpts.headers;\n\n      // Add Authorization header\n      const authorization = [];\n      if (this._connectionParams.authToken) {\n        authorization.push(`token ${this._connectionParams.authToken}`);\n      }\n      if (this._connectionParams.authBasic) {\n        authorization.push(`Basic ${this._connectionParams.authBasic}`);\n      }\n      if (authorization.length > 0) {\n        headers = headers.append('Authorization', authorization);\n      }\n\n      // Add Accept-Language header using settings.locale\n      const locale = this.settings.locale;\n      if (locale) {\n        headers = headers.append('Accept-Language', locale);\n      }\n\n      // Only add version headers if enabled in environment\n      if (this.environment.sendAppVersionHeaders) {\n        // Add application version header\n        if (this.environment.version) {\n          headers = headers.append('X-App-Version', this.environment.version);\n        }\n        // Add application name header\n        if (this.environment.defaultAppName) {\n          headers = headers.append('X-App-Name', this.environment.defaultAppName);\n        }\n      }\n\n      updatedOpts.headers = headers;\n    } else {\n      // Handle plain object headers\n      // Add Authorization header\n      const authorization = [];\n      if (this._connectionParams.authToken) {\n        authorization.push(`token ${this._connectionParams.authToken}`);\n      }\n      if (this._connectionParams.authBasic) {\n        authorization.push(`Basic ${this._connectionParams.authBasic}`);\n      }\n      if (authorization.length > 0) {\n        (updatedOpts.headers as { [header: string]: string | string[] })['Authorization'] = authorization;\n      }\n\n      // Add Accept-Language header using settings.locale\n      const locale = this.settings.locale;\n      if (locale) {\n        (updatedOpts.headers as { [header: string]: string | string[] })['Accept-Language'] = locale;\n      }\n\n      // Only add version headers if enabled in environment\n      if (this.environment.sendAppVersionHeaders) {\n        // Add application version header\n        if (this.environment.version) {\n          (updatedOpts.headers as { [header: string]: string | string[] })['X-App-Version'] = this.environment.version;\n        }\n        // Add application name header\n        if (this.environment.defaultAppName) {\n          (updatedOpts.headers as { [header: string]: string | string[] })['X-App-Name'] = this.environment.defaultAppName;\n        }\n      }\n    }\n\n    return updatedOpts;\n  }\n\n  protected getUri(path: string): string {\n    let uri = path;\n\n    // If path is not an URI: prepend with peer URL\n    if (!uri.startsWith('http://') && !uri.startsWith('https://')) {\n      let peerUrl = this.peer?.url;\n\n      // Remove trailing slash\n      if (peerUrl?.endsWith('/')) {\n        peerUrl = peerUrl.substring(0, peerUrl.length - 1);\n      }\n\n      // Add first path\n      if (!path.startsWith('/')) {\n        path = '/' + path;\n      }\n\n      // Create the URI: concat peer URL and path\n      uri = (peerUrl ?? '') + path;\n    }\n    return uri;\n  }\n  protected onDeviceConnectionChanged(connectionType?: ConnectionType) {\n    if (connectionType !== this._deviceConnectionType) {\n      this._deviceConnectionType = connectionType;\n\n      // If NOT already forced as offline, emit event\n      if (!this._forceOffline) {\n        console.info(`[network] Connection changed to {${this._deviceConnectionType}}`);\n        this.onNetworkStatusChanges.next(this._deviceConnectionType);\n\n        // Change to offline\n        if (this._deviceConnectionType === 'none') {\n          if (this._mobile) {\n            // Force offline mode\n            this._forceOffline = true;\n\n            // Alert the user\n            this.showToast({ message: 'NETWORK.INFO.OFFLINE_HELP', type: 'warning' });\n          } else {\n            // Alert the user\n            this.showToast({ message: 'NETWORK.INFO.OFFLINE', type: 'warning' });\n          }\n\n          // Stop the network service\n          this.stop();\n        }\n      }\n    }\n  }\n\n  /**\n   * Get default peers, from environment\n   */\n  protected async getDefaultPeers(): Promise<Peer[]> {\n    const peers = (this.environment.defaultPeers || []).map(Peer.fromObject);\n    return Promise.resolve(peers);\n  }\n\n  protected showToast<T = any>(opts: ShowToastOptions): Promise<OverlayEventDetail<T>> {\n    return Toasts.show(this.toastController, this.translate, opts);\n  }\n\n  protected addListener<T = any>(name: NetworkEventType, callback: (data?: T) => Promise<void>): Subscription {\n    this._listeners[name] = this._listeners[name] || [];\n    this._listeners[name].push(callback);\n\n    // When unsubscribe, remove from the listener\n    return new Subscription(() => {\n      const index = this._listeners[name].indexOf(callback);\n      if (index !== -1) {\n        this._listeners[name].splice(index, 1);\n      }\n    });\n  }\n\n  protected async emit<T = any>(name: NetworkEventType, data?: T) {\n    const hooks = this._listeners[name];\n    if (isNotEmptyArray(hooks)) {\n      console.info(`[network-service] Trigger ${name} hook: Executing ${hooks.length} callbacks...`);\n\n      return Promise.all(\n        hooks.map((callback) => {\n          const promise = callback(data);\n          if (!promise) return;\n          return promise.catch((err) => console.error('Error while executing hook ' + name, err));\n        })\n      );\n    }\n  }\n}\n","import { firstValueFrom, Observable, Subject } from 'rxjs';\nimport { Apollo, ExtraSubscriptionOptions, QueryRef } from 'apollo-angular';\nimport {\n  ApolloCache,\n  ApolloClient,\n  ApolloLink,\n  ApolloQueryResult,\n  FetchPolicy,\n  InMemoryCache,\n  MutationUpdaterFunction,\n  NetworkStatus,\n  OperationVariables,\n  TypePolicies,\n  Unmasked,\n  WatchQueryFetchPolicy,\n} from '@apollo/client/core';\nimport { ErrorCodes, ServerErrorCodes, ServiceError } from '../services/errors';\nimport { catchError, distinctUntilChanged, filter, first, map, mergeMap, takeUntil, throttleTime } from 'rxjs/operators';\n\nimport { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { ConnectionParams, NetworkService } from '../services/network.service';\nimport { ConnectionType } from '../services/network.types';\nimport {\n  AppWebSocket,\n  createTrackerLink,\n  EmptyObject,\n  isMutationOperation,\n  isSubscriptionOperation,\n  restoreTrackedQueries,\n  StorageServiceWrapper,\n  TrackableMutationContext,\n} from './graphql.utils';\nimport { RetryLink } from '@apollo/client/link/retry';\nimport queueLinkImported from 'apollo-link-queue';\nimport serializingLinkImported from 'apollo-link-serialize';\nimport loggerLinkImported from 'apollo-link-logger';\nimport { Platform } from '@ionic/angular';\nimport { EntityUtils, IEntity } from '../services/model/entity.model';\nimport { isNil, isNotEmptyArray, isNotNil, toNumber } from '../../shared/functions';\nimport { Resolvers } from '@apollo/client/core/types';\nimport { HttpHeaders } from '@angular/common/http';\nimport { HttpLink, Options } from 'apollo-angular/http';\nimport { persistCache, PersistentStorage } from 'apollo3-cache-persist';\nimport { ErrorPolicy, MutationBaseOptions } from '@apollo/client/core/watchQueryOptions';\nimport { Cache } from '@apollo/client/cache/core/types/Cache';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { PropertyMap } from '../../shared/types';\nimport { StartableService } from '../../shared/services/startable-service.class';\nimport { isMobile } from '../../shared/platforms';\nimport { StorageService } from '../../shared/storage/storage.service';\nimport { GraphQLWsLink } from '@apollo/client/link/subscriptions';\nimport { ClientOptions, createClient } from 'graphql-ws';\nimport { unwrapESModule } from '../../shared/modules';\nimport { createFragmentRegistry } from '@apollo/client/cache/inmemory/fragmentRegistry';\nimport { DocumentNode } from 'graphql';\nimport { LocalSettingsService } from '../services/local-settings.service';\n\n// Workaround for issue https://github.com/ng-packagr/ng-packagr/issues/2215\nconst QueueLink = unwrapESModule(queueLinkImported);\nconst SerializingLink = unwrapESModule(serializingLinkImported);\nconst loggerLink = unwrapESModule(loggerLinkImported);\n\nexport interface WatchQueryOptions<V> {\n  query: any;\n  variables?: V;\n  error?: ServiceError;\n  fetchPolicy?: WatchQueryFetchPolicy;\n}\n\nexport interface MutateQueryOptions<\n  TData,\n  TVariables = OperationVariables,\n  TContext = TrackableMutationContext,\n  TCache extends ApolloCache<any> = ApolloCache<any>,\n> extends MutationBaseOptions<TData, TVariables, TContext, TCache> {\n  mutation: any;\n  variables?: TVariables;\n  error?: ServiceError;\n  context?: TContext;\n  optimisticResponse?: Unmasked<NoInfer<TData>>;\n  offlineResponse?: TData | ((context: TContext) => Promise<TData>);\n  update?: MutationUpdaterFunction<TData, TVariables, TContext, TCache>;\n  forceOffline?: boolean;\n}\n\nexport const APP_GRAPHQL_TYPE_POLICIES = new InjectionToken<TypePolicies>('graphqlTypePolicies');\n\nexport const APP_GRAPHQL_FRAGMENTS = new InjectionToken<DocumentNode[]>('graphqlFragments');\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class GraphqlService extends StartableService<ApolloClient<any>> {\n  private readonly _networkStatusChanged$: Observable<ConnectionType>;\n\n  private httpParams: Options;\n  private wsParams: ClientOptions<ConnectionParams>;\n  private readonly _defaultFetchPolicy: WatchQueryFetchPolicy;\n  private onNetworkError = new Subject<any>();\n  private customErrors: PropertyMap = {};\n  private onResetAuth = new Subject<void>();\n\n  get client(): ApolloClient<any> {\n    return this._data;\n  }\n\n  get cache(): ApolloCache<any> {\n    return this.apollo.client.cache;\n  }\n\n  get defaultFetchPolicy(): WatchQueryFetchPolicy {\n    return this._defaultFetchPolicy;\n  }\n\n  private get connectionParams(): ConnectionParams {\n    return this.network.connectionParams;\n  }\n\n  constructor(\n    private platform: Platform,\n    private apollo: Apollo,\n    private httpLink: HttpLink,\n    private network: NetworkService,\n    private storage: StorageService,\n    private settings: LocalSettingsService,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_GRAPHQL_TYPE_POLICIES) private typePolicies: TypePolicies,\n    @Optional() @Inject(APP_GRAPHQL_FRAGMENTS) private fragments: DocumentNode[]\n  ) {\n    super(platform); // Wait platform\n\n    this._debug = !environment.production;\n    this._defaultFetchPolicy = environment.apolloFetchPolicy;\n\n    // Listen network status\n    this._networkStatusChanged$ = network.onNetworkStatusChanges.pipe(filter(isNotNil), distinctUntilChanged());\n\n    // When getting network error: try to ping peer, and toggle to offline\n    this.onNetworkError\n      .pipe(\n        throttleTime(300),\n        filter(() => this.network.online),\n        mergeMap(() => this.network.checkPeerAlive()),\n        filter((alive) => !alive)\n      )\n      .subscribe(() => this.network.setForceOffline(true, { showToast: true }));\n  }\n\n  /**\n   * Allow to add a field resolver\n   *  (see doc: https://www.apollographql.com/docs/react/data/local-state/#handling-client-fields-with-resolvers)\n   *\n   * @param resolvers\n   */\n  async addResolver(resolvers: Resolvers | Resolvers[]) {\n    if (!this.started) await this.ready();\n    this.apollo.client.addResolvers(resolvers);\n  }\n\n  async query<T, V = EmptyObject>(opts: { query: any; variables?: V; error?: ServiceError; fetchPolicy?: FetchPolicy }): Promise<T> {\n    if (!this.started) await this.ready();\n    let res: ApolloQueryResult<T>;\n    try {\n      res = (await this.client.query<T, V>({\n        query: opts.query,\n        variables: opts.variables,\n        fetchPolicy: opts.fetchPolicy || (this._defaultFetchPolicy as FetchPolicy) || undefined,\n      })) as ApolloQueryResult<T>;\n    } catch (err) {\n      res = this.toApolloError<T>(err, opts.error);\n    }\n    if (res.errors) {\n      throw res.errors[0];\n    }\n    return res.data;\n  }\n\n  watchQueryRef<T, V = EmptyObject>(opts: WatchQueryOptions<V>): QueryRef<T, V> {\n    return this.apollo.watchQuery<T, V>({\n      query: opts.query,\n      variables: opts.variables,\n      fetchPolicy: opts.fetchPolicy || (this._defaultFetchPolicy as FetchPolicy) || undefined,\n      notifyOnNetworkStatusChange: true,\n    });\n  }\n\n  queryRefValuesChanges<T, V = EmptyObject>(queryRef: QueryRef<T, V>, opts: WatchQueryOptions<V>): Observable<T> {\n    return queryRef.valueChanges.pipe(\n      catchError(async (error) => this.toApolloError<T>(error, opts.error)),\n      filter((value) => value.networkStatus === NetworkStatus.ready || value.networkStatus === NetworkStatus.error),\n      map(({ data, errors }) => {\n        if (errors) {\n          throw errors[0];\n        }\n        return data as T;\n      })\n    );\n  }\n\n  watchQuery<T, V = EmptyObject>(opts: WatchQueryOptions<V>): Observable<T> {\n    const queryRef: QueryRef<T, V> = this.watchQueryRef(opts);\n    return this.queryRefValuesChanges(queryRef, opts);\n  }\n\n  async mutate<T, V = EmptyObject>(opts: MutateQueryOptions<T, V>): Promise<T> {\n    // If offline, compute an optimistic response for tracked queries\n    if ((opts.forceOffline || this.network.offline) && opts.offlineResponse) {\n      if (typeof opts.offlineResponse === 'function') {\n        opts.context = opts.context || {};\n        const optimisticResponseFn = opts.offlineResponse as (context: any) => Promise<T>;\n        opts.optimisticResponse = (await optimisticResponseFn(opts.context)) as Unmasked<NoInfer<T>>;\n        if (this._debug) console.debug('[graphql] [offline] Using an optimistic response: ', opts.optimisticResponse);\n      } else {\n        opts.optimisticResponse = opts.offlineResponse as Unmasked<NoInfer<T>>;\n      }\n      if (opts.forceOffline) {\n        const res = { data: opts.optimisticResponse as Unmasked<NoInfer<T>> };\n        if (opts.update) {\n          // @ts-ignore\n          opts.update(this.apollo.client.cache, res, {});\n        }\n        return res.data as T;\n      }\n    }\n\n    const res = await firstValueFrom(\n      this.apollo\n        .mutate<ApolloQueryResult<T>, V>({\n          refetchQueries: opts?.refetchQueries as any,\n          awaitRefetchQueries: opts?.awaitRefetchQueries,\n          mutation: opts.mutation,\n          variables: opts.variables,\n          context: opts.context,\n          optimisticResponse: opts.optimisticResponse as any,\n          update: opts.update as any,\n        })\n        .pipe(\n          catchError(async (error) => this.toApolloError<T>(error, opts.error)),\n          first()\n          // To debug, if need:\n          //tap((res) => (!res) && console.error('[graphql] Unknown error during mutation. Check errors in console (maybe an invalid generated cache id ?)'))\n        )\n    );\n    if (Array.isArray(res.errors)) {\n      throw res.errors[0];\n    }\n    return res.data as T;\n  }\n\n  subscribe<T, V = EmptyObject>(\n    opts: {\n      query: any;\n      variables: V;\n      fetchPolicy?: FetchPolicy;\n      errorPolicy?: ErrorPolicy;\n      error?: ServiceError;\n    },\n    extra?: ExtraSubscriptionOptions\n  ): Observable<T> {\n    return this.apollo\n      .subscribe<T>(\n        {\n          query: opts.query,\n          fetchPolicy: (opts && opts.fetchPolicy) || 'network-only',\n          errorPolicy: (opts && opts.errorPolicy) || undefined,\n          variables: opts.variables,\n        },\n        {\n          useZone: true,\n          ...extra,\n        }\n      )\n      .pipe(\n        catchError(async (error) => this.toApolloError<T>(error, opts.error)),\n        map(({ data, errors }) => {\n          if (errors) {\n            throw errors[0];\n          }\n          return data;\n        })\n      );\n  }\n\n  insertIntoQueryCache<T, V = EmptyObject>(\n    cache: ApolloCache<any>,\n    opts: Cache.ReadQueryOptions<V, any> & {\n      arrayFieldName: string;\n      totalFieldName?: string;\n      data: T;\n      sortFn?: (d1: T, d2: T) => number;\n      size?: number;\n    }\n  ) {\n    cache = cache || this.apollo.client.cache;\n    opts.arrayFieldName = opts.arrayFieldName || 'data';\n\n    try {\n      let data = cache.readQuery<any, V>({ query: opts.query, variables: opts.variables });\n\n      if (!data) return; // Skip: nothing in cache\n\n      if (Array.isArray(data[opts.arrayFieldName])) {\n        // Copy because immutable\n        data = { ...data };\n\n        // Append the new item into the array\n        data[opts.arrayFieldName] = [...data[opts.arrayFieldName], { ...opts.data }];\n\n        // Resort if needed\n        if (opts.sortFn) {\n          data[opts.arrayFieldName].sort(opts.sortFn);\n        }\n\n        // Exclude if exceed max size\n        const size = toNumber(opts.variables?.['size'], -1);\n        if (size > 0 && data[opts.arrayFieldName].length > size) {\n          data[opts.arrayFieldName].splice(size, data[opts.arrayFieldName].length - size);\n        }\n\n        // Increment total\n        if (isNotNil(opts.totalFieldName)) {\n          if (isNotNil(data[opts.totalFieldName])) {\n            data[opts.totalFieldName] += 1;\n          } else {\n            console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);\n          }\n        }\n\n        cache.writeQuery({\n          query: opts.query,\n          variables: opts.variables,\n          data,\n        });\n      } else {\n        console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);\n      }\n    } catch (err) {\n      // continue\n      // read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940\n      if (this._debug) console.error('[graphql] Error while updating cache: ', err);\n    }\n  }\n\n  addManyToQueryCache<T = any, V = EmptyObject>(\n    cache: ApolloCache<any>,\n    opts: Cache.ReadQueryOptions<V, any> & {\n      arrayFieldName: string;\n      totalFieldName?: string;\n      data: T[];\n      equalsFn?: (d1: T, d2: T) => boolean;\n      sortFn?: (d1: T, d2: T) => number;\n    }\n  ) {\n    if (!Array.isArray(opts.data) || !opts.data.length) return; // nothing to process\n\n    cache = cache || this.apollo.client.cache;\n    opts.arrayFieldName = opts.arrayFieldName || 'data';\n\n    try {\n      let data = cache.readQuery<any, V>({ query: opts.query, variables: opts.variables });\n      if (!data) return 0; // skip\n\n      if (Array.isArray(data[opts.arrayFieldName])) {\n        // Copy because immutable\n        data = { ...data };\n\n        // Keep only not existing res\n        const equalsFn = opts.equalsFn || ((d1, d2) => d1['id'] === d2['id'] && d1['entityName'] === d2['entityName']);\n        const newItems = opts.data.filter(\n          (inputValue) => data[opts.arrayFieldName].findIndex((existingValue) => equalsFn(inputValue, existingValue)) === -1\n        );\n\n        if (!newItems.length) return; // No new value\n\n        // Append new items into the array\n        data[opts.arrayFieldName] = [...data[opts.arrayFieldName], ...newItems];\n\n        // Resort, if need\n        if (opts.sortFn) {\n          data[opts.arrayFieldName].sort(opts.sortFn);\n        }\n\n        // Exclude if exceed max size\n        const size = toNumber(opts.variables?.['size'], -1);\n        if (size > 0 && data[opts.arrayFieldName].length > size) {\n          data[opts.arrayFieldName].splice(size, data[opts.arrayFieldName].length - size);\n        }\n\n        // Increment the total\n        if (isNotNil(opts.totalFieldName)) {\n          if (isNotNil(data[opts.totalFieldName])) {\n            data[opts.totalFieldName] += newItems.length;\n          } else {\n            console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);\n          }\n        }\n\n        // Write to cache\n        cache.writeQuery({\n          query: opts.query,\n          variables: opts.variables,\n          data,\n        });\n      } else {\n        console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);\n      }\n    } catch (err) {\n      // continue\n      // read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940\n      if (this._debug) console.warn('[graphql] Error while updating cache: ', err);\n    }\n  }\n\n  /**\n   * Remove from cache, and return if removed or not\n   *\n   * @param cache\n   * @param opts\n   */\n  removeFromCachedQueryById<V = EmptyObject, ID = number>(\n    cache: ApolloCache<any>,\n    opts: Cache.ReadQueryOptions<V, any> & {\n      arrayFieldName: string;\n      totalFieldName?: string;\n      ids: ID; // Do NOT use 'id', as already used by the Apollo API\n    }\n  ): boolean {\n    cache = cache || this.apollo.client.cache;\n    opts.arrayFieldName = opts.arrayFieldName || 'data';\n\n    try {\n      let data = cache.readQuery<any, V>({ query: opts.query, variables: opts.variables });\n\n      if (Array.isArray(data[opts.arrayFieldName])) {\n        // Copy because immutable\n        data = { ...data };\n\n        const index = data[opts.arrayFieldName].findIndex((item) => item['id'] === opts.ids);\n        if (index === -1) return false; // Skip (nothing removed)\n\n        // Copy, then remove deleted item\n        data[opts.arrayFieldName] = data[opts.arrayFieldName].slice();\n        const deletedItem = data[opts.arrayFieldName].splice(index, 1)[0];\n        cache.evict({ id: cache.identify(deletedItem) });\n\n        // Decrement the total\n        if (isNotNil(opts.totalFieldName)) {\n          if (isNotNil(data[opts.totalFieldName])) {\n            data[opts.totalFieldName] -= 1;\n          } else {\n            console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);\n          }\n        }\n\n        // Write to cache\n        cache.writeQuery({\n          query: opts.query,\n          variables: opts.variables,\n          data,\n        });\n        return true;\n      } else {\n        console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);\n        return false;\n      }\n    } catch (err) {\n      // continue\n      // read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940\n      if (this._debug) console.warn('[graphql] Error while removing from cache: ', err);\n      return false;\n    }\n  }\n\n  /**\n   * Remove ids from cache, and return the number of items removed\n   *\n   * @param cache\n   * @param opts\n   */\n  removeFromCachedQueryByIds<V = EmptyObject, ID = number>(\n    cache: ApolloCache<any>,\n    opts: Cache.ReadQueryOptions<V, any> & {\n      arrayFieldName: string;\n      totalFieldName?: string;\n      ids: ID[];\n    }\n  ): number {\n    cache = cache || this.apollo.client.cache;\n    opts.arrayFieldName = opts.arrayFieldName || 'data';\n\n    try {\n      let data = cache.readQuery(opts);\n\n      if (data && data[opts.arrayFieldName]) {\n        // Copy because immutable\n        data = { ...data };\n\n        const deletedIndexes = data[opts.arrayFieldName].reduce((res, item, index) => (opts.ids.includes(item['id']) ? res.concat(index) : res), []);\n\n        if (deletedIndexes.length <= 0) return 0; // Skip (nothing removed)\n\n        // Query has NO total\n        if (isNil(opts.totalFieldName)) {\n          // Evict each object\n          deletedIndexes\n            .map((index) => data[opts.arrayFieldName][index])\n            .map((item) => cache.identify(item))\n            .forEach((id) => cache.evict({ id }));\n        }\n        // Query has a total\n        else {\n          // Copy the array\n          data[opts.arrayFieldName] = data[opts.arrayFieldName].slice();\n\n          // remove from array, then evict\n          deletedIndexes\n            // Reverse: to keep valid index\n            .reverse()\n            // Remove from the array\n            .map((index) => data[opts.arrayFieldName].splice(index, 1)[0])\n            // Evict from cache\n            .map((item) => cache.identify(item))\n            .forEach((id) => cache.evict({ id }));\n\n          if (isNotNil(data[opts.totalFieldName])) {\n            data[opts.totalFieldName] -= deletedIndexes.length; // Remove deletion count\n          } else {\n            console.warn('[graphql] Unable to update the total in cached query. Unknown result part: ' + opts.totalFieldName);\n          }\n\n          cache.writeQuery({\n            query: opts.query,\n            variables: opts.variables,\n            data,\n          });\n\n          return deletedIndexes.length;\n        }\n      } else {\n        console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.arrayFieldName);\n        return 0;\n      }\n    } catch (err) {\n      // continue\n      // read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940\n      if (this._debug) console.warn('[graphql] Error while removing from cache: ', err);\n      return 0;\n    }\n  }\n\n  updateToQueryCache<T extends IEntity<any>, V = EmptyObject>(\n    cache: ApolloCache<any>,\n    opts: Cache.ReadQueryOptions<V, any> & {\n      arrayFieldName: string;\n      totalFieldName?: string;\n      data: T;\n      equalsFn?: (d1: T, d2: T) => boolean;\n    }\n  ) {\n    cache = cache || this.apollo.client.cache;\n    opts.arrayFieldName = opts.arrayFieldName || 'data';\n\n    try {\n      let data: any = cache.readQuery(opts);\n\n      if (data && data[opts.arrayFieldName]) {\n        // Copy because immutable\n        data = { ...data };\n\n        const equalsFn = opts.equalsFn || ((d1, d2) => EntityUtils.equals(d1, d2, 'id'));\n\n        // Update if exists, or insert\n        const index = data[opts.arrayFieldName].findIndex((v) => equalsFn(opts.data, v));\n        if (index !== -1) {\n          data[opts.arrayFieldName] = data[opts.arrayFieldName].slice().splice(index, 1, opts.data);\n        } else {\n          data[opts.arrayFieldName] = [...data[opts.arrayFieldName], opts.data];\n        }\n\n        // Increment total (if changed)\n        if (isNotNil(opts.totalFieldName) && index === -1) {\n          if (isNotNil(data[opts.totalFieldName])) {\n            data[opts.totalFieldName] += 1;\n          } else {\n            console.warn('[graphql] Unable to update cached query. Unknown result part: ' + opts.totalFieldName);\n          }\n        }\n\n        cache.writeQuery({\n          query: opts.query,\n          variables: opts.variables,\n          data,\n        });\n        return; // OK: stop here\n      }\n    } catch (err) {\n      // continue\n      // read in cache is not guaranteed to return a result. see https://github.com/apollographql/react-apollo/issues/1776#issuecomment-372237940\n      if (this._debug) console.warn('[graphql] Error while updating cache: ', err);\n    }\n  }\n\n  async clearCache(client?: ApolloClient<any>): Promise<void> {\n    client = (client || this.client) as ApolloClient<any>;\n    if (client) {\n      console.info('[graphql] Cleaning cache... ');\n      const now = this._debug && Date.now();\n\n      // Clearing the cache\n      await client.cache.reset();\n\n      if (this._debug) console.debug(`[graphql] Cleaning cache [OK] in ${Date.now() - now}ms`);\n    }\n  }\n\n  registerCustomError(error: PropertyMap) {\n    this.customErrors = { ...this.customErrors, ...error };\n  }\n\n  /* -- protected methods -- */\n\n  protected async ngOnStart(): Promise<ApolloClient<any>> {\n    // Wait network and storage\n    await Promise.all([this.storage.ready(), this.network.ready()]);\n\n    console.info('[graphql] Starting graphql...');\n    const mobile = isMobile(window);\n    const enableTrackMutationQueries = !mobile;\n\n    const peer = this.network.peer;\n    if (!peer) throw Error('[graphql] Missing peer. Unable to start graphql service');\n\n    const uri = peer.url + '/graphql';\n    const wsUrl = uri.replace(/^http(s)?:/, 'ws$1:') + '/websocket';\n    console.info('[graphql] Base uri: ' + uri);\n    console.info('[graphql] Subscription uri: ' + wsUrl);\n\n    this.httpParams = this.httpParams || {};\n    this.httpParams.uri = uri;\n\n    this.wsParams = {\n      ...this.wsParams,\n      lazy: true,\n      connectionParams: this.connectionParams,\n      webSocketImpl: AppWebSocket,\n      url: wsUrl,\n      shouldRetry: (errOrCloseEvent) => {\n        // If WS URL changed, then do not retry\n        if (wsUrl !== this.wsParams.url) {\n          return false;\n        }\n        console.warn('[graphql-service] [WS] Trying to reconnect...', errOrCloseEvent);\n        return true;\n      },\n      retryAttempts: 10,\n    };\n\n    // Create a storage configuration\n    const storage: PersistentStorage<string> = new StorageServiceWrapper(this.storage);\n\n    let client: ApolloClient<any>;\n    try {\n      client = this.apollo.client;\n    } catch (err) {\n      // Since apollo-angular 7, missing client throw an exception\n      // Continue (client not exists)\n    }\n\n    if (!client) {\n      console.debug('[graphql] Creating Apollo GraphQL client...');\n\n      // Websocket link\n      const wsLink = new GraphQLWsLink(createClient(this.wsParams));\n      this.onResetAuth.pipe(takeUntil(this.stopSubject)).subscribe(() => {\n        console.info('[graphql] Closing websocket client, to force unauth');\n        wsLink.client.dispose();\n      });\n\n      // Retry when failed link\n      const retryLink = new RetryLink();\n      const authLink = new ApolloLink((operation, forward) => {\n        const authorization = [];\n        if (this.connectionParams.authToken) {\n          authorization.push(`token ${this.connectionParams.authToken}`);\n        }\n        if (this.connectionParams.authBasic) {\n          authorization.push(`Basic ${this.connectionParams.authBasic}`);\n        }\n\n        let headers = new HttpHeaders();\n        if (authorization.length > 0) {\n          headers = headers.append('Authorization', authorization);\n        }\n\n        // Add Accept-Language header using settings.locale\n        const locale = this.settings.locale;\n        if (locale) {\n          headers = headers.append('Accept-Language', locale);\n        }\n\n        // Add application version headers (if enabled)\n        if (this.environment.sendAppVersionHeaders) {\n          if (this.environment.version) {\n            headers = headers.append('X-App-Version', this.environment.version);\n          }\n          if (this.environment.defaultAppName) {\n            headers = headers.append('X-App-Name', this.environment.defaultAppName);\n          }\n        }\n\n        // Use the setContext method to set the HTTP headers.\n        operation.setContext({\n          ...operation.getContext(),\n          ...{ headers },\n        });\n\n        // Call the next link in the middleware chain.\n        return forward(operation);\n      });\n\n      // Http link\n      const httpLink = this.httpLink.create(this.httpParams);\n\n      // Cache\n      const cache = new InMemoryCache({\n        typePolicies: this.typePolicies,\n        fragments: isNotEmptyArray(this.fragments) ? createFragmentRegistry(...this.fragments) : undefined,\n      });\n\n      // Add cache persistence\n      if (this.environment.persistCache) {\n        console.debug('[graphql] Starting persistence cache...');\n        await persistCache({\n          cache,\n          storage,\n          trigger: this.platform.is('android') ? 'background' : 'write',\n          debounce: 1000,\n          debug: true,\n        });\n      }\n\n      let mutationLinks: Array<ApolloLink>;\n\n      // Add queue to store tracked queries, when offline\n      if (enableTrackMutationQueries) {\n        const serializingLink = new SerializingLink();\n        const trackerLink = createTrackerLink({\n          storage,\n          onNetworkStatusChange: this._networkStatusChanged$,\n          debounce: 1000,\n          debug: true,\n        });\n        // Creating a mutation queue\n        const queueLink = new QueueLink();\n        this.registerSubscription(\n          this._networkStatusChanged$.subscribe((connectionType) => {\n            // Network is offline: start buffering into queue\n            if (connectionType === 'none') {\n              console.info('[graphql] offline mode: enable mutations buffer');\n              queueLink.close();\n            }\n            // Network is online\n            else {\n              console.info('[graphql] online mode: disable mutations buffer');\n              queueLink.open();\n            }\n          })\n        );\n        mutationLinks = [loggerLink, trackerLink, queueLink, serializingLink, retryLink, authLink, httpLink];\n      } else {\n        mutationLinks = [retryLink, authLink, httpLink];\n      }\n\n      // create Apollo\n      client = new ApolloClient({\n        cache,\n        link: ApolloLink.split(\n          // Handle mutations\n          isMutationOperation,\n          ApolloLink.from(mutationLinks),\n\n          ApolloLink.split(\n            // Handle subscriptions\n            isSubscriptionOperation,\n            wsLink,\n\n            // Handle queries\n            ApolloLink.from([retryLink, authLink, httpLink])\n          )\n        ),\n        // For @apollo/client < 3.11\n        connectToDevTools: !this.environment.production,\n        // For @apollo/client 3.11+\n        devtools: {\n          enabled: !this.environment.production,\n          name: 'GraphqlService Client',\n        },\n      });\n\n      this.apollo.client = client;\n    }\n\n    // Enable tracked queries persistence\n    if (enableTrackMutationQueries && this.environment.persistCache) {\n      try {\n        await restoreTrackedQueries({\n          apolloClient: client,\n          storage,\n          debug: true,\n        });\n      } catch (err) {\n        console.error('[graphql] Failed to restore tracked queries from storage: ' + ((err && err.message) || err), err);\n      }\n    }\n\n    // Listen for network restart\n    this.registerSubscription(this.network.on('start', () => this.restart()));\n\n    // Listen for clear cache request, from network\n    this.registerSubscription(this.network.on('resetCache', () => this.clearCache()));\n\n    console.info('[graphql] Starting graphql [OK]');\n    return client;\n  }\n\n  protected async ngOnStop() {\n    console.info('[graphql] Stopping graphql service...');\n    await this.resetClient();\n  }\n\n  protected async resetClient(client?: ApolloClient<any>) {\n    try {\n      client = (client || this.apollo.client) as ApolloClient<any>;\n    } catch (err) {\n      // Since apollo-angular 7, missing client throw an exception\n      // Continue (client not exists)\n    }\n    if (!client) return;\n\n    console.info('[graphql] Resetting Apollo client...');\n    client.stop();\n\n    this.onResetAuth.next();\n\n    await Promise.all([client.clearStore(), this.clearCache(client)]);\n  }\n\n  private toApolloError<T>(err: any, defaultError?: any): ApolloQueryResult<T> {\n    let error =\n      // If network error: try to convert to App (read as JSON), or create an UNKNOWN_NETWORK_ERROR\n      (err.networkError &&\n        ((err.networkError.error && this.toAppError(err.networkError.error)) ||\n          this.toAppError(err.networkError) ||\n          (err.networkError.error && this.createAppErrorByCode(err.networkError.error.status)) ||\n          this.createAppErrorByCode(ErrorCodes.UNKNOWN_NETWORK_ERROR))) ||\n      // If graphQL: try to convert the first error found\n      (err.graphQLErrors && err.graphQLErrors.length && this.toAppError(err.graphQLErrors[0])) ||\n      this.toAppError(err) ||\n      this.toAppError(err.originalError) ||\n      (err.graphQLErrors && err.graphQLErrors[0]) ||\n      err;\n    console.error('[graphql] ' + ((error && error.message) || error), error.stack || '');\n    if (error?.code === ErrorCodes.UNKNOWN_NETWORK_ERROR && err.networkError?.message) {\n      console.error('[graphql] original error: ' + err.networkError.message);\n      this.onNetworkError.next(error);\n    }\n\n    // Apply default error, and store original error into error's details\n    if ((!error || !error.code || error.code === ErrorCodes.INTERNAL_SERVER_ERROR) && defaultError) {\n      error = { ...defaultError, details: error, stack: err.stack };\n      if (defaultError.message) {\n        error.message = defaultError.message;\n      }\n    }\n\n    return {\n      data: null,\n      errors: [error],\n      loading: false,\n      networkStatus: NetworkStatus.error,\n    };\n  }\n\n  private createAppErrorByCode(errorCode: number): any | undefined {\n    const message = this.getI18nErrorMessageByCode(errorCode);\n    if (message) {\n      return {\n        code: errorCode,\n        message,\n      };\n    }\n    return undefined;\n  }\n\n  private getI18nErrorMessageByCode(errorCode: number): string | undefined {\n    // look in registered error codes\n    const customErrorMessage = this.customErrors[errorCode];\n    if (customErrorMessage) {\n      return customErrorMessage;\n    }\n\n    // Default, switch on error code\n    switch (errorCode) {\n      case ServerErrorCodes.UNAUTHORIZED:\n        return 'ERROR.UNAUTHORIZED';\n      case ServerErrorCodes.FORBIDDEN:\n        return 'ERROR.FORBIDDEN';\n      case ErrorCodes.UNKNOWN_NETWORK_ERROR:\n        return 'ERROR.UNKNOWN_NETWORK_ERROR';\n      case ServerErrorCodes.BAD_UPDATE_DATE:\n        return 'ERROR.BAD_UPDATE_DATE';\n      case ServerErrorCodes.DATA_LOCKED:\n        return 'ERROR.DATA_LOCKED';\n      case ServerErrorCodes.BAD_APP_VERSION:\n        return 'ERROR.BAD_APP_VERSION';\n      case ServerErrorCodes.DATA_NOT_UNIQUE:\n        return 'ERROR.DATA_NOT_UNIQUE';\n    }\n\n    return undefined;\n  }\n\n  private toAppError(err: any): any | undefined {\n    let error = err;\n    let message = (err && err.message) || err;\n    // parse message if JSON\n    if (typeof message === 'string' && message.trim().indexOf('{\"code\":') === 0) {\n      try {\n        error = JSON.parse(\n          message\n            // Remove special characters before parsing (e.g. SQL errors from an Oracle database)\n            .replace(/\\n\\r?/g, ' ')\n            .replace(/\\r/g, '')\n        );\n        message = error.message || message;\n      } catch (parseError) {\n        console.error('Unable to parse error as JSON: ', parseError);\n      }\n    }\n    if (error && error.code) {\n      const appError = {\n        code: error.code,\n        message: typeof message === 'string' ? message : error.message,\n        ...this.createAppErrorByCode(error.code),\n      };\n      if (appError.code !== error.code || appError.message !== error.message) {\n        // Store original error in details\n        appError.details = error;\n        return appError;\n      }\n      // Keep error (with details, if any)\n      return error;\n    }\n    return undefined;\n  }\n}\n","import { GraphqlService, MutateQueryOptions, WatchQueryOptions } from '../graphql/graphql.service';\nimport { Page } from '../../shared/services/entity-service.class';\nimport { Observable } from 'rxjs';\nimport { FetchResult } from '@apollo/client/link/core';\nimport { EntityUtils } from './model/entity.model';\nimport { ApolloCache, InternalRefetchQueriesInclude } from '@apollo/client/core';\nimport { isEmptyArray, isNotEmptyArray, isNotNil, toBoolean } from '../../shared/functions';\nimport { environment } from '../../../environments/environment';\nimport { Directive, Optional } from '@angular/core';\nimport { QueryRef } from 'apollo-angular';\nimport { PureQueryOptions } from '@apollo/client/core/types';\nimport { DocumentNode } from 'graphql';\nimport { StartableService } from '../../shared/services/startable-service.class';\nimport { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { CryptoService } from './crypto.service';\nimport { EmptyObject } from '../graphql/graphql.utils';\nimport { filter } from 'rxjs/operators';\n\nexport interface QueryVariables<F = any> extends Partial<Page> {\n  filter?: F;\n  [key: string]: any;\n}\n\nexport interface MutateQueryWithCacheUpdateOptions<T = any, V = EmptyObject> extends MutateQueryOptions<T, V> {\n  cacheInsert?: {\n    query: any;\n    fetchData: (variables: V, mutationResult: FetchResult<T>) => any;\n  }[];\n\n  cacheRemove?: {\n    query: any;\n    fetchIds: (variables: V) => number | number[];\n  }[];\n}\n\nexport interface MutableWatchQueryOptions<D, T = any, V = EmptyObject> extends WatchQueryOptions<V> {\n  queryName: string;\n  arrayFieldName: keyof D;\n  totalFieldName?: keyof D;\n  insertFilterFn?: (data: T) => boolean;\n  sortFn?: (a: T, b: T) => number;\n}\n\nexport interface MutableWatchQueryDescription<TData, TEntityClass = any, TVariables = EmptyObject> extends PureQueryOptions<TVariables, TData> {\n  id?: string;\n  query: DocumentNode | TypedDocumentNode<TData, TVariables>;\n  queryRef: QueryRef<TData, TVariables>;\n  variables: TVariables;\n  arrayFieldName: keyof TData;\n  totalFieldName?: keyof TData;\n  insertFilterFn?: (data: TEntityClass) => boolean;\n  sortFn?: (a: TEntityClass, b: TEntityClass) => number;\n  counter: number;\n}\n\nexport interface FindMutableWatchQueriesOptions {\n  query?: DocumentNode;\n  queries?: DocumentNode[];\n  queryName?: string;\n  queryNames?: string[];\n}\n\nexport class BaseGraphqlServiceOptions {\n  production?: boolean;\n}\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport abstract class BaseGraphqlService<T = any, F = any, ID = any, S = void> extends StartableService<S> {\n  protected _logPrefix: string;\n  protected _mutableWatchQueries: MutableWatchQueryDescription<any>[] = [];\n\n  // Max updated queries, for this entity.\n  // - Can be override by subclasses (in constructor)\n  // - Use value -1 for no max size\n  // - Default value to 3, because it usually enough (e.g. OperationService and LandingService need at least 2)\n  protected _mutableWatchQueriesMaxCount = 3;\n\n  protected constructor(\n    protected graphql: GraphqlService,\n    @Optional() options?: BaseGraphqlServiceOptions\n  ) {\n    super(graphql);\n\n    // for DEV only\n    this._debug = toBoolean(options && !options.production, !environment.production);\n    this._logPrefix = `[base-graphql-service] `;\n  }\n\n  mutableWatchQuery<D, V = EmptyObject>(opts: MutableWatchQueryOptions<D, T, V>): Observable<D> {\n    opts.fetchPolicy = opts.fetchPolicy || this.graphql.defaultFetchPolicy;\n\n    // Standard query (no cache)\n    if (opts.fetchPolicy === 'no-cache') {\n      return this.graphql.watchQuery(opts);\n    }\n\n    // No arrayFieldName\n    if (!opts.arrayFieldName) {\n      if (this._debug) console.warn(this._logPrefix + \"̀Missing 'opts.arrayFieldName' : unable to create a mutable watch query\");\n      return this.graphql.watchQuery(opts);\n    }\n\n    // Create the query id\n    const queryId = this.computeMutableWatchQueryId(opts);\n    const exactMatchQueries = this._mutableWatchQueries.filter((q) => q.id === queryId);\n\n    let mutableQuery: MutableWatchQueryDescription<D, T, V>;\n    let queryRef: QueryRef<D, V>;\n\n    if (exactMatchQueries.length === 1) {\n      mutableQuery = exactMatchQueries[0] as MutableWatchQueryDescription<D, T, V>;\n      mutableQuery.counter += 1;\n      queryRef = mutableQuery.queryRef;\n      if (this._debug) console.debug(this._logPrefix + `Find same mutable watch query (same variables) {${queryId}}. Skip register`);\n\n      // Refetch if need data from network\n      if (opts.fetchPolicy === 'network-only' || opts.fetchPolicy === 'cache-and-network') {\n        console.warn(this._logPrefix + ' Mutable query already exists, and fetchPolicy=' + opts.fetchPolicy + '. Force refetch query...');\n        queryRef.refetch(mutableQuery.variables);\n      }\n      //if (mutableQuery.counter > 3) {\n      //  console.warn(this._debugPrefix + 'TODO: clean previous queries with name: ' + queryName);\n      //}\n    } else {\n      queryRef = this.graphql.watchQueryRef<D, V>(opts);\n      this.registerNewMutableWatchQuery({\n        id: queryId,\n        query: opts.query,\n        queryRef,\n        variables: opts.variables,\n        arrayFieldName: opts.arrayFieldName,\n        totalFieldName: opts.totalFieldName,\n        insertFilterFn: opts.insertFilterFn,\n        sortFn: opts.sortFn,\n        counter: 1,\n      });\n    }\n\n    return this.graphql.queryRefValuesChanges(queryRef, opts).pipe(\n      // FIXME: find why sometimes data is an object, and not and array\n      filter((res) => Array.isArray(res[opts.arrayFieldName]))\n    );\n  }\n\n  insertIntoMutableCachedQueries(\n    cache: ApolloCache<any>,\n    opts: FindMutableWatchQueriesOptions & {\n      data: T[] | T;\n    }\n  ) {\n    const queries = this.findMutableWatchQueries(opts);\n    if (isEmptyArray(queries)) return; // No query found\n\n    queries.forEach((query) => {\n      if (Array.isArray(opts.data)) {\n        // Filter values, if a filter function exists\n        const data = query.insertFilterFn ? opts.data.filter((d) => query.insertFilterFn(d)) : opts.data;\n        if (isNotEmptyArray(data)) {\n          if (this._debug) console.debug(`[base-data-service] Inserting data into watching query: `, query.id);\n          this.graphql.addManyToQueryCache(cache, {\n            query: query.query,\n            variables: query.variables,\n            arrayFieldName: query.arrayFieldName as string,\n            totalFieldName: query.totalFieldName as string,\n            sortFn: query.sortFn,\n            data,\n          });\n        }\n      }\n      // Filter value, if a filter function exists\n      else if (!query.insertFilterFn || query.insertFilterFn(opts.data)) {\n        if (this._debug) console.debug(`[base-data-service] Inserting data into watching query: `, query.id);\n        this.graphql.insertIntoQueryCache(cache, {\n          query: query.query,\n          variables: query.variables,\n          arrayFieldName: query.arrayFieldName as string,\n          totalFieldName: query.totalFieldName as string,\n          sortFn: query.sortFn,\n          data: opts.data,\n        });\n      }\n    });\n  }\n\n  removeFromMutableCachedQueriesByIds(\n    cache: ApolloCache<any>,\n    opts: FindMutableWatchQueriesOptions & {\n      ids: ID | ID[];\n    }\n  ): number {\n    const queries = this.findMutableWatchQueries(opts);\n    if (!queries.length) return;\n\n    console.debug(`[base-data-service] Removing data from watching queries: `, queries);\n    return (\n      queries\n        .map((query) => {\n          if (Array.isArray(opts.ids)) {\n            return this.graphql.removeFromCachedQueryByIds(cache, {\n              query: query.query,\n              variables: query.variables,\n              arrayFieldName: query.arrayFieldName as string,\n              totalFieldName: query.totalFieldName as string,\n              ids: opts.ids,\n            });\n          } else {\n            return this.graphql.removeFromCachedQueryById(cache, {\n              query: query.query,\n              variables: query.variables,\n              arrayFieldName: query.arrayFieldName as string,\n              totalFieldName: query.totalFieldName as string,\n              ids: opts.ids,\n            })\n              ? 1\n              : 0;\n          }\n        })\n        // Sum\n        .reduce((res, count) => res + count, 0)\n    );\n  }\n\n  async refetchMutableWatchQueries(opts: FindMutableWatchQueriesOptions & { variables?: any }): Promise<void> {\n    // Retrieve queries to refetch\n    const queries = this.findMutableWatchQueries(opts);\n\n    // Skip if nothing to refetch\n    if (!queries.length) return;\n\n    try {\n      await Promise.all(\n        queries.map((query) => {\n          if (this._debug) console.debug(this._logPrefix + `Refetching mutable watch query {${query.id}}`);\n          return query.queryRef.refetch({ ...query.variables, ...opts.variables });\n        })\n      );\n    } catch (err) {\n      console.error(this._logPrefix + 'Error while refetching mutable watch queries', err);\n    }\n  }\n\n  /* -- protected methods -- */\n\n  protected computeMutableWatchQueryId<D, T, V = EmptyObject>(opts: MutableWatchQueryOptions<D, T, V>) {\n    const queryName = opts.queryName || CryptoService.sha256(JSON.stringify(opts.query)).substring(0, 8);\n    const variablesKey = (opts.variables && CryptoService.sha256(JSON.stringify(opts.variables)).substring(0, 8)) || '';\n    return [queryName, opts.arrayFieldName, variablesKey].join('|');\n  }\n\n  protected findMutableWatchQueries(opts: FindMutableWatchQueriesOptions): MutableWatchQueryDescription<any>[] {\n    // Search by query names\n    const queryNames = opts.queryName ? [opts.queryName] : opts.queryNames;\n    if (queryNames) {\n      return queryNames\n          .map((queryName) => this._mutableWatchQueries.filter((q) => q.id.startsWith(queryName + '|')))\n          .flat();\n    }\n\n    // Search by query objects\n    const queries = opts.query ? [opts.query] : opts.queries;\n    if (queries) {\n      return queries\n          .filter(isNotNil)\n          .map((query) => this._mutableWatchQueries.filter((q) => q.query === query))\n          .flat();\n    }\n    throw Error('Invalid options: only one property must be set');\n  }\n\n  protected registerNewMutableWatchQuery(mutableQuery: MutableWatchQueryDescription<any>) {\n    if (this._debug) console.debug(this._logPrefix + `Register new mutable watch query {${mutableQuery.id}}`);\n\n    // If exceed the max size of mutable queries: remove some\n    if (this._mutableWatchQueriesMaxCount > 0 && this._mutableWatchQueries.length >= this._mutableWatchQueriesMaxCount) {\n      const removedWatchQueries = this._mutableWatchQueries.splice(0, 1 + this._mutableWatchQueries.length - this._mutableWatchQueriesMaxCount);\n\n      // Warn, as it shouldn't be happen often, when max is correctly set\n      console.warn(\n        this._logPrefix + `Removing older mutable watching queries (stack exceed max of ${this._mutableWatchQueriesMaxCount}): `,\n        removedWatchQueries.map((q) => q.id)\n      );\n    }\n\n    // Define the sort function (to be used in insertIntoMutableCachedQuery())\n    if (!mutableQuery.sortFn && mutableQuery.variables && mutableQuery.variables.sortBy) {\n      mutableQuery.sortFn =\n        mutableQuery.variables &&\n        mutableQuery.variables.sortBy &&\n        EntityUtils.sortComparator(mutableQuery.variables.sortBy, mutableQuery.variables.sortDirection || 'asc');\n    }\n\n    // Add the new mutable query to array\n    this._mutableWatchQueries.push(mutableQuery);\n  }\n\n  protected findRefetchQueries(opts: FindMutableWatchQueriesOptions): InternalRefetchQueriesInclude {\n    return (\n      this.findMutableWatchQueries(opts)\n        // Workaround, to make refetch queries works: transform into a simple {query, variables}\n        .map(({ query, variables }) => ({ query, variables }))\n    );\n  }\n\n  protected ngOnStart(): Promise<S> {\n    return Promise.resolve(null as S);\n  }\n}\n","// TODO: rename to CONFIG_OPTIONS_MAP\n// then declare a type like this :\n// > export type ConfigOptions = key of CONFIG_OPTIONS_MAP\nimport { FormFieldDefinition } from '../../../shared/form/field.model';\nimport { APP_LOCALES } from '../model/settings.model';\nimport { AuthTokenType } from '../network.types';\n\nexport const CORE_CONFIG_OPTIONS = Object.freeze({\n  LOGO: <FormFieldDefinition>{\n    key: 'sumaris.logo',\n    label: 'CONFIGURATION.OPTIONS.LOGO',\n    type: 'string',\n  },\n  FAVICON: <FormFieldDefinition>{\n    key: 'sumaris.favicon',\n    label: 'CONFIGURATION.OPTIONS.FAVICON',\n    type: 'string',\n  },\n  DEFAULT_LOCALE: <FormFieldDefinition>{\n    key: 'sumaris.defaultLocale',\n    label: 'CONFIGURATION.OPTIONS.DEFAULT_LOCALE',\n    type: 'enum',\n    values: APP_LOCALES,\n  },\n  DEFAULT_LAT_LONG_FORMAT: <FormFieldDefinition>{\n    key: 'sumaris.defaultLatLongFormat',\n    label: 'CONFIGURATION.OPTIONS.DEFAULT_LATLONG_FORMAT',\n    type: 'enum',\n    values: [\n      {\n        key: 'DDMMSS',\n        value: 'COMMON.LAT_LONG.ENUM.DDMMSS',\n      },\n      {\n        key: 'DDMM',\n        value: 'COMMON.LAT_LONG.ENUM.DDMM',\n      },\n      {\n        key: 'DD',\n        value: 'COMMON.LAT_LONG.ENUM.DD',\n      },\n    ],\n  },\n  /**\n   * @deprecated Use `ACCOUNT_LAT_LONG_FORMAT_ENABLE` instead\n   */\n  //@deprecated\n  DEFAULT_LAT_LONG_FORMAT_ENABLED: <FormFieldDefinition>{\n    key: 'sumaris.defaultLatLongFormat.enabled',\n    label: 'CONFIGURATION.OPTIONS.ENABLE_DEFAULT_LATLONG_FORMAT',\n    type: 'boolean',\n    defaultValue: true, // Important, for compatibility reason after deprecation\n  },\n  REGISTRATION_ENABLE: <FormFieldDefinition>{\n    key: 'sumaris.registration.enable',\n    label: 'CONFIGURATION.OPTIONS.HOME.ENABLE_REGISTRATION',\n    type: 'boolean',\n    defaultValue: true,\n  },\n  AUTH_TOKEN_TYPE: <FormFieldDefinition>{\n    key: 'sumaris.auth.token.type',\n    label: 'CONFIGURATION.OPTIONS.AUTH_TOKEN_TYPE_PLACEHOLDER',\n    type: 'enum',\n    values: [\n      {\n        key: <AuthTokenType>'token',\n        value: 'CONFIGURATION.OPTIONS.AUTH_TOKEN_TYPE.TOKEN',\n      },\n      {\n        key: <AuthTokenType>'basic',\n        value: 'CONFIGURATION.OPTIONS.AUTH_TOKEN_TYPE.BASIC',\n      },\n      {\n        key: <AuthTokenType>'basic-and-token',\n        value: 'CONFIGURATION.OPTIONS.AUTH_TOKEN_TYPE.BASIC_AND_TOKEN',\n      },\n    ],\n    defaultValue: <AuthTokenType>'token',\n  },\n  AUTH_RESET_PASSWORD_ENABLE: <FormFieldDefinition>{\n    key: 'sumaris.auth.reset.enable',\n    label: 'CONFIGURATION.OPTIONS.HOME.CHANGE_PASSWORD',\n    type: 'boolean',\n    defaultValue: true,\n  },\n  AUTH_API_TOKEN_ENABLED: <FormFieldDefinition>{\n    key: 'sumaris.auth.api.token.enabled',\n    label: 'CONFIGURATION.OPTIONS.ENABLE_AUTH_API_TOKENS',\n    type: 'boolean',\n    defaultValue: false,\n    isTransient: true,\n  },\n  AUTH_API_TOKEN_SCOPE_ENABLED: <FormFieldDefinition>{\n    key: 'sumaris.auth.api.token.scope.enabled',\n    label: 'CONFIGURATION.OPTIONS.ENABLE_AUTH_API_TOKENS_SCOPE',\n    type: 'boolean',\n    defaultValue: false,\n    isTransient: true,\n  },\n  DEFAULT_AUTH_API_TOKEN_SCOPE: <FormFieldDefinition>{\n    key: 'sumaris.auth.api.token.scope.default',\n    label: 'CONFIGURATION.OPTIONS.DEFAULT_AUTH_API_TOKEN_SCOPE',\n    type: 'string',\n    defaultValue: 'read_api',\n    isTransient: true,\n  },\n  GRAVATAR_ENABLE: <FormFieldDefinition>{\n    key: 'sumaris.gravatar.enable',\n    label: 'CONFIGURATION.OPTIONS.ENABLE_GRAVATAR',\n    type: 'boolean',\n    defaultValue: false,\n  },\n  GRAVATAR_URL: <FormFieldDefinition>{\n    key: 'sumaris.gravatar.url',\n    label: 'CONFIGURATION.OPTIONS.GRAVATAR_URL',\n    type: 'string',\n    defaultValue: 'https://www.gravatar.com/avatar/{md5}',\n  },\n  TESTING: <FormFieldDefinition>{\n    key: 'sumaris.testing.enable',\n    label: 'CONFIGURATION.OPTIONS.TESTING',\n    type: 'boolean',\n  },\n  APP_MIN_VERSION: <FormFieldDefinition>{\n    key: 'sumaris.app.version.min',\n    label: 'CONFIGURATION.OPTIONS.APP_MIN_VERSION',\n    type: 'string',\n  },\n  HELP_URL: <FormFieldDefinition>{\n    key: 'sumaris.help.url',\n    label: 'CONFIGURATION.OPTIONS.HELP_URL',\n    type: 'string',\n  },\n  FORUM_URL: <FormFieldDefinition>{\n    key: 'sumaris.forum.url',\n    label: 'CONFIGURATION.OPTIONS.FORUM_URL',\n    type: 'string',\n  },\n  REPORT_ISSUE_URL: <FormFieldDefinition>{\n    key: 'sumaris.reportIssue.url',\n    label: 'CONFIGURATION.OPTIONS.REPORT_ISSUE_URL',\n    type: 'string',\n  },\n  PRIVACY_POLICY_URL: <FormFieldDefinition>{\n    key: 'sumaris.policy.url',\n    label: 'CONFIGURATION.OPTIONS.PRIVACY_POLICY_URL',\n    type: 'string',\n  },\n  TERMS_OF_USE_URL: <FormFieldDefinition>{\n    key: 'sumaris.termsOfUse.url',\n    label: 'CONFIGURATION.OPTIONS.TERMS_OF_USE_URL',\n    type: 'string',\n  },\n  LOGO_LARGE: <FormFieldDefinition>{\n    key: 'sumaris.logo.large',\n    label: 'CONFIGURATION.OPTIONS.HOME.LOGO_LARGE',\n    type: 'string',\n  },\n  MENU_ITEMS: <FormFieldDefinition>{\n    key: 'sumaris.menu.items',\n    label: 'CONFIGURATION.OPTIONS.MENU.ITEMS',\n    type: 'string',\n    // -- FOR DEV\n    /*,defaultValue: JSON.stringify([\n        {title: \"Item #1\", path: \"/settings\", icon: \"people\", after: \"MENU.HOME\"},\n        {title: \"Item #2\", path: \"/settings\", icon: \"people\", before: \"MENU.LOGOUT\"}\n    ])*/\n  },\n  HOME_PARTNERS_DEPARTMENTS: <FormFieldDefinition>{\n    key: 'sumaris.partner.departments',\n    label: 'CONFIGURATION.OPTIONS.HOME.PARTNER_DEPARTMENTS',\n    type: 'string',\n  },\n  HOME_BACKGROUND_IMAGE: <FormFieldDefinition>{\n    key: 'sumaris.background.images',\n    label: 'CONFIGURATION.OPTIONS.HOME.BACKGROUND_IMAGES',\n    type: 'string',\n  },\n  HOME_FEED_ENABLE: <FormFieldDefinition>{\n    key: 'sumaris.home.feed.enable',\n    label: 'CONFIGURATION.OPTIONS.HOME.FEED_ENABLE',\n    type: 'boolean',\n    defaultValue: false,\n  },\n  HOME_FEED_URLS: <FormFieldDefinition>{\n    key: 'sumaris.home.feed.urls',\n    label: 'CONFIGURATION.OPTIONS.HOME.FEED_URLS',\n    type: 'string',\n  },\n  HOME_FEED_MAX_AGE_IN_MONTHS: <FormFieldDefinition>{\n    key: 'sumaris.home.feed.maxAgeInMonths',\n    label: 'CONFIGURATION.OPTIONS.HOME.FEED_MAX_AGE_IN_MONTHS',\n    type: 'integer',\n    defaultValue: -1,\n  },\n  HOME_FEED_MAX_CONTENT_LENGTH: <FormFieldDefinition>{\n    key: 'sumaris.home.feed.maxContentLength',\n    label: 'CONFIGURATION.OPTIONS.HOME.FEED_MAX_CONTENT_LENGTH',\n    type: 'integer',\n    defaultValue: -1,\n  },\n  COLOR_PRIMARY: <FormFieldDefinition>{\n    key: 'sumaris.color.primary',\n    label: 'CONFIGURATION.OPTIONS.COLORS.PRIMARY',\n    type: 'color',\n  },\n  COLOR_SECONDARY: <FormFieldDefinition>{\n    key: 'sumaris.color.secondary',\n    label: 'CONFIGURATION.OPTIONS.COLORS.SECONDARY',\n    type: 'color',\n  },\n  COLOR_TERTIARY: <FormFieldDefinition>{\n    key: 'sumaris.color.tertiary',\n    label: 'CONFIGURATION.OPTIONS.COLORS.TERTIARY',\n    type: 'color',\n  },\n  COLOR_SUCCESS: <FormFieldDefinition>{\n    key: 'sumaris.color.success',\n    label: 'CONFIGURATION.OPTIONS.COLORS.SUCCESS',\n    type: 'color',\n  },\n  COLOR_WARNING: <FormFieldDefinition>{\n    key: 'sumaris.color.warning',\n    label: 'CONFIGURATION.OPTIONS.COLORS.WARNING',\n    type: 'color',\n  },\n  COLOR_ACCENT: <FormFieldDefinition>{\n    key: 'sumaris.color.accent',\n    label: 'CONFIGURATION.OPTIONS.COLORS.ACCENT',\n    type: 'color',\n  },\n  COLOR_DANGER: <FormFieldDefinition>{\n    key: 'sumaris.color.danger',\n    label: 'CONFIGURATION.OPTIONS.COLORS.DANGER',\n    type: 'color',\n  },\n  FORM_FIELD_BACKGROUND_COLOR: <FormFieldDefinition>{\n    key: 'sumaris.theme.fieldBackgroundColor',\n    label: 'CONFIGURATION.OPTIONS.FORM_FIELD_BACKGROUND_COLOR',\n    type: 'color',\n  },\n  FORM_FIELD_FOCUS_BACKGROUND_COLOR: <FormFieldDefinition>{\n    key: 'sumaris.theme.fieldFocusBackgroundColor',\n    label: 'CONFIGURATION.OPTIONS.FORM_FIELD_FOCUS_BACKGROUND_COLOR',\n    type: 'color',\n  },\n  FORM_FIELD_DISABLED_BACKGROUND_COLOR: <FormFieldDefinition>{\n    key: 'sumaris.theme.fieldDisabledBackgroundColor',\n    label: 'CONFIGURATION.OPTIONS.FORM_FIELD_DISABLED_BACKGROUND_COLOR',\n    type: 'color',\n  },\n  ANDROID_INSTALL_URL: <FormFieldDefinition>{\n    key: 'sumaris.android.install.url',\n    label: 'CONFIGURATION.OPTIONS.ANDROID_INSTALL_URL',\n    type: 'string',\n  },\n  IOS_INSTALL_URL: <FormFieldDefinition>{\n    key: 'sumaris.ios.install.url',\n    label: 'CONFIGURATION.OPTIONS.IOS_INSTALL_URL',\n    type: 'string',\n  },\n  DESKTOP_INSTALL_URL: <FormFieldDefinition>{\n    key: 'sumaris.desktop.install.url',\n    label: 'CONFIGURATION.OPTIONS.DESKTOP_INSTALL_URL',\n    type: 'string',\n  },\n  DB_TIMEZONE: <FormFieldDefinition>{\n    key: 'sumaris.persistence.db.timezone',\n    label: 'CONFIGURATION.OPTIONS.DB_TIMEZONE',\n    type: 'string',\n    isTransient: true, // Only on server, cannot be set\n  },\n  ACCOUNT_LAT_LONG_FORMAT_ENABLE: <FormFieldDefinition>{\n    key: 'sumaris.account.latLongFormat.enable',\n    label: 'CONFIGURATION.OPTIONS.ACCOUNT.ENABLE_LATLONG_FORMAT',\n    type: 'boolean',\n    defaultValue: true,\n  },\n  ACCOUNT_READONLY: <FormFieldDefinition>{\n    key: 'sumaris.account.readOnly',\n    label: 'CONFIGURATION.OPTIONS.ACCOUNT.READONLY',\n    type: 'boolean',\n    defaultValue: false,\n    isTransient: true,\n  },\n  ACCOUNT_AVATAR_ENABLE: <FormFieldDefinition>{\n    key: 'sumaris.account.avatar.enable',\n    label: 'CONFIGURATION.OPTIONS.ACCOUNT.AVATAR_ENABLE',\n    type: 'boolean',\n    defaultValue: false\n  },\n  ACCOUNT_AVATAR_MAX_SIZE: <FormFieldDefinition>{\n    key: 'sumaris.account.avatar.maxSize',\n    label: 'CONFIGURATION.OPTIONS.ACCOUNT.AVATAR_MAX_SIZE',\n    type: 'integer',\n    defaultValue: 200\n  },\n});\n","import { noTrailingSlash } from '../functions';\n\nexport class UriUtils {\n  /**\n   * Extract the filename, from an uri (using the last slash)\n   *\n   * @param uri\n   */\n  static getFilename(uri: string): string {\n    if (!uri) return uri;\n    let filename = uri.trim();\n\n    // Get last part (or all string, if no '/')\n    const lastSlashIndex = filename.lastIndexOf('/');\n    if (lastSlashIndex !== -1 && lastSlashIndex !== uri.length - 1) {\n      filename = filename.substring(lastSlashIndex + 1);\n    }\n\n    // Remove query params\n    const queryParamIndex = filename.indexOf('?');\n    if (queryParamIndex !== -1) {\n      filename = filename.substring(0, queryParamIndex);\n    }\n\n    // Remove fragment\n    const fragmentParamIndex = filename.indexOf('#');\n    if (fragmentParamIndex !== -1) {\n      filename = filename.substring(0, fragmentParamIndex);\n    }\n\n    return filename;\n  }\n\n}\n","import { BehaviorSubject, Observable } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\nimport { Entity, EntityUtils, IEntity } from '../model/entity.model';\nimport { isEmptyArray, isNil, isNotEmptyArray, isNotNil } from '../../../shared/functions';\nimport { LoadResult } from '../../../shared/services/entity-service.class';\nimport { chainPromises } from '../../../shared/observables';\nimport { ErrorCodes } from '../errors';\nimport { IStorage } from '../../../shared/storage/storage.utils';\nimport { SortDirection } from '@angular/material/sort';\n\nexport const ENTITIES_STORAGE_KEY_PREFIX = 'entities';\n\nexport type EntityStoreTypePolicyMode = 'default' | 'by-id';\n\nexport declare interface EntityStoreTypePolicy<T extends Entity<T, any> = Entity<any, any>, K = keyof T> {\n  mode?: EntityStoreTypePolicyMode; // 'default' by default\n  skipNonLocalEntities?: boolean; // False by default\n  lightFieldsExcludes?: K[]; // none by default\n}\n\nexport declare interface EntityStorageLoadOptions {\n  fullLoad?: boolean;\n}\n\ndeclare interface EntityStatus {\n  index: number;\n  dirty?: boolean;\n}\n\nexport class EntityStore<T extends IEntity<T, ID>, ID = number, O extends EntityStorageLoadOptions = EntityStorageLoadOptions> {\n  private readonly _storageKey: string;\n  private readonly _onChange = new BehaviorSubject(true);\n  private readonly _mapToLightEntity: (T) => T;\n  private _cache: T[];\n  private _statusById: Map<ID, EntityStatus>;\n  private _sequence: number;\n  private _dirty = false;\n  private _loaded: boolean;\n\n  readonly policy: EntityStoreTypePolicy<T>;\n\n  get length(): number {\n    return this._cache?.length || 0;\n  }\n\n  get cache(): T[] {\n    return this._cache;\n  }\n\n  get dirty(): boolean {\n    return this._dirty;\n  }\n\n  protected get isByIdMode(): boolean {\n    return this.policy.mode === 'by-id';\n  }\n\n  protected get storageKeyById(): string {\n    return this._storageKey + '#ids';\n  }\n\n  constructor(\n    protected readonly name: string,\n    protected readonly storage: IStorage,\n    policy?: EntityStoreTypePolicy<T>\n  ) {\n    this.policy = policy || {};\n    this.reset({ emitEvent: false });\n    this._dirty = false;\n    this._loaded = false;\n    this._storageKey = ENTITIES_STORAGE_KEY_PREFIX + '#' + name;\n    this._mapToLightEntity = this.createLightEntityMapFn(this.policy);\n  }\n\n  nextValue(): ID {\n    this._sequence = this._sequence - 1;\n    this._dirty = true;\n    return this._sequence as unknown as ID;\n  }\n\n  currentValue(): number {\n    return this._sequence;\n  }\n\n  async load(id: ID, opts?: EntityStorageLoadOptions): Promise<T> {\n    if (this._mapToLightEntity && (!opts || opts.fullLoad !== false)) {\n      return await this.loadFullEntity(id, opts);\n    }\n    return this.loadCachedEntity(id, opts);\n  }\n\n  /**\n   * Watch a set of entities\n   *\n   * @param variables\n   * @param opts\n   */\n  watchAll(\n    variables: {\n      offset?: number;\n      size?: number;\n      sortBy?: keyof T | string;\n      sortDirection?: string;\n      filter?: (data: T) => boolean;\n    },\n    opts?: O\n  ): Observable<LoadResult<T>> {\n    // If need full entities, but use light entities in the entities array\n    if (this._mapToLightEntity && opts && opts.fullLoad === true) {\n      console.warn(\n        '[entity-store] WARN: Watching full entities, splited by id in entity store. This can be long! Please make sure you need full entities here.'\n      );\n      return this._onChange.pipe(\n        // Apply filter on cache\n        map((_) => this.reduceAndSort(this._cache, variables)),\n\n        // Then convert into full entities (using parallel jobs - /!\\ can use lot of memory)\n        mergeMap((res) =>\n          Promise.all((res.data || []).map((e) => this.loadFullEntity(e.id, opts))).then((data) => ({\n            data,\n            total: res.total,\n          }))\n        )\n      );\n    }\n\n    // Load using entities array\n    return this._onChange.pipe(map((_) => this.reduceAndSort(this._cache, variables)));\n  }\n\n  /**\n   * WIll apply a filter, then a sort, then a page slice\n   *\n   * @param variables\n   * @param opts\n   */\n  async loadAll(\n    variables: {\n      offset?: number;\n      size?: number;\n      sortBy?: keyof T | string;\n      sortDirection?: string;\n      filter?: (data: T) => boolean;\n    },\n    opts?: O\n  ): Promise<LoadResult<T>> {\n    const res = this.reduceAndSort(this._cache, variables);\n\n    // If store by ID: make sure to full the full entities\n    if (this._mapToLightEntity && isNotEmptyArray(res.data) && opts && opts.fullLoad === true) {\n      // Load full entities, one by one\n      res.data = await chainPromises((res.data || []).map((e) => () => this.load(e.id)));\n    }\n\n    return res;\n  }\n\n  save(entity: T, opts?: { emitEvent?: boolean }): T {\n    const status = (isNotNil(entity.id) && this._statusById.get(entity.id)) || { index: undefined };\n    const isNew = isNil(status.index);\n    if (isNew) {\n      if (isNil(entity.id)) {\n        entity.id = this.nextValue();\n      } else if (+entity.id < 0 && +entity.id > this._sequence) {\n        console.warn('Trying to save a local entity with an id > sequence. Will replace id by sequence next value');\n        entity.id = this.nextValue();\n      } else {\n        // OK: use a valid id :\n        // - id >= 0 (should be a remote id)\n        // - OR < sequence, and not exists in the index map\n      }\n\n      this._statusById.set(entity.id, status);\n      status.index = this._cache.push(entity) - 1;\n    } else {\n      this._cache[status.index] = entity;\n    }\n\n    // Mark entity as dirty\n    status.dirty = true;\n\n    // Mark storage as dirty\n    this._dirty = true;\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n\n    return entity;\n  }\n\n  saveAll(entities: T[], opts?: { emitEvent?: boolean; reset?: boolean }): T[] {\n    if (isEmptyArray(entities) && (!opts || opts.reset !== true)) return entities; // Skip (Nothing to save)\n\n    let result: T[];\n\n    console.info(`[entity-storage] Saving ${entities.length} ${this.name}(s)`);\n\n    // First save, or reset using given entities\n    if (isEmptyArray(this._cache) || (opts && opts.reset)) {\n      this.setEntities(entities, { emitEvent: false, dirty: this.isByIdMode });\n    } else {\n      result = entities.map((entity) => this.save(entity, { emitEvent: false }));\n    }\n\n    // Mark as dirty\n    this._dirty = true;\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n\n    return result || this._cache.slice();\n  }\n\n  delete(id: ID, opts?: { emitEvent?: boolean }): T | undefined {\n    const status = isNotNil(id) ? this._statusById.get(id) : undefined;\n    const index = status ? status.index : undefined;\n    if (isNil(index)) return undefined;\n\n    const entity = this._cache[index];\n    if (!entity) return undefined;\n\n    // Remove from cache\n    this._cache[index] = undefined;\n    this._statusById.delete(entity.id);\n\n    // Remove full entity, by id\n    if (this.isByIdMode) {\n      this.storage.remove(this._storageKey + '#' + id);\n    }\n\n    // Mark as dirty\n    this._dirty = true;\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n\n    return entity as T;\n  }\n\n  deleteMany(ids: ID[], opts?: { emitEvent?: boolean }): T[] {\n    // Delete by id, but NOT emit event on each deletion\n    const deletedEntities = (ids || []).map((id) => this.delete(id, { emitEvent: false })).filter(isNotNil);\n\n    // No changes: exit\n    if (!deletedEntities.length) return [];\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n\n    return deletedEntities;\n  }\n\n  reset(opts?: { emitEvent?: boolean }) {\n    this._cache = [];\n    this._sequence = 0;\n    this._statusById = new Map<ID, any>();\n\n    this._dirty = true;\n    this._loaded = true;\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n  }\n\n  /**\n   *\n   * @param opts\n   *  opts.skipIfPristine = false persist all entities, even if not dirty\n   */\n  async persist(opts = { skipIfPristine: true }): Promise<number> {\n    // Skip is not dirty\n    if (opts.skipIfPristine && !this._dirty) {\n      console.debug(`[entity-storage] Persisting ${this.name} not need. Skip`);\n      return this._cache.length;\n    }\n\n    // Copy some data, BEFORE to call markAsPristine() to allow parallel changes\n    const dirtyIndexes =\n      this.isByIdMode &&\n      Array.from(this._statusById.values())\n        .filter((s) => !opts.skipIfPristine || (s && s.dirty))\n        .map((s) => s.index);\n    const entities = this._cache.slice(); // Copy cached entities\n\n    // Mark all (entities and status) as pristine\n    this.markAsPristine({ emitEvent: false });\n\n    // Convert dirty entities into light entities (/!\\ AFTER the previous copy)\n    // and update the cache (but NOT the 'entities' variable)\n    if (dirtyIndexes && this._mapToLightEntity) {\n      dirtyIndexes.forEach((index) => (this._cache[index] = this._mapToLightEntity(entities[index])));\n    }\n\n    // If no entity found\n    if (isEmptyArray(entities)) {\n      // Clean the local storage\n      await this.storage.remove(this._storageKey);\n    } else {\n      // Save each entity into a unique key (advanced mode)\n      if (this.isByIdMode) {\n        // Save ids\n        await this.storage.set(\n          this.storageKeyById,\n          entities.filter(isNotNil).map((e) => e.id)\n        );\n\n        // Saved dirty entities\n        await Promise.all(\n          dirtyIndexes.map((index) => {\n            const entity = entities[index];\n            console.debug(`[entity-storage] Persisting ${this.name}#${entity.id}...`);\n            return this.storage.set(this._storageKey + '#' + entity.id, entity);\n          })\n        );\n\n        console.info(`[entity-storage] Persisting ${dirtyIndexes.length}/${entities.length} ${this.name}(s)...`);\n      }\n\n      // Save all entities in a single key (default)\n      else {\n        console.info(`[entity-storage] Persisting ${entities.length} ${this.name}(s)...`);\n        await this.storage.set(this._storageKey, entities);\n      }\n    }\n\n    return entities.length;\n  }\n\n  async restore(opts?: { emitEvent?: boolean }): Promise<number> {\n    let entities: T[];\n\n    const res = await Promise.all([this.storage.get(this._storageKey), this.storage.get(this.storageKeyById)]);\n    const values = res[0] && Array.isArray(res[0]) ? res[0] : null;\n    const ids = res[1] && Array.isArray(res[1]) ? res[1] : null;\n    let migration = false;\n    let oldKeysToClean: string[];\n\n    // \"Split by id\" mode\n    if (this.isByIdMode) {\n      if (isNotNil(ids)) {\n        // Load entity by id (one by one)\n        const storageKeys = ids.map((id) => this._storageKey + '#' + id);\n        entities = await chainPromises<T>(storageKeys.map((key) => () => this.storage.get(key)));\n      }\n      // Migrate from the standard mode\n      else if (isNotNil(values)) {\n        entities = values.filter((e) => e && isNotNil(e.id));\n        migration = true;\n        oldKeysToClean = [this._storageKey];\n      }\n    }\n\n    // Else (default mode)\n    else {\n      if (isNotNil(values)) {\n        entities = values.filter((e) => e && isNotNil(e.id));\n      } else if (isNotNil(ids)) {\n        const storageKeys = ids.map((id) => this._storageKey + '#' + id);\n        // Load entity by id (one by one)\n        entities = await chainPromises<T>(storageKeys.map((key) => () => this.storage.get(key)));\n        migration = true;\n        oldKeysToClean = [...storageKeys, this.storageKeyById];\n      }\n    }\n\n    // OK, there is something in storage...\n    if (isNotEmptyArray(entities)) {\n      if (entities.length >= 1000) {\n        console.warn(`[entity-storage] - Restoring ${entities.length} ${this.name}. Check if not too many elements?!`);\n      }\n\n      // Map entities into light element (if if not need to persist, because of migration\n      if (this._mapToLightEntity && !migration) {\n        entities = entities.map(this._mapToLightEntity);\n      }\n    }\n\n    this.setEntities(entities || [], { ...opts, emitEvent: false, dirty: false });\n    this._dirty = false;\n\n    // Finish the migration\n    if (migration) {\n      try {\n        console.warn(`[entity-storage] - Migrate ${this.name} into {mode: '${this.policy.mode}'}...`);\n\n        // Force to persist, using the new mode\n        await this.persist({ skipIfPristine: false /* force persist using the new mode */ });\n\n        // Clean old storage keys (one by one)\n        if (isNotEmptyArray(oldKeysToClean)) await chainPromises(oldKeysToClean.map((key) => () => this.storage.remove(key)));\n      } catch (err) {\n        console.error(err);\n        throw { code: ErrorCodes.ENTITY_STORAGE_MIGRATION_FAILED, message: 'ERROR.ENTITY_STORAGE_MIGRATION_FAILED', details: err };\n      }\n    }\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n\n    return this._cache.length;\n  }\n\n  markAsDirty(opts?: { emitEvent?: boolean }) {\n    this._dirty = true;\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n  }\n\n  markAsPristine(opts?: { emitEvent?: boolean }) {\n    for (const s of this._statusById.values()) {\n      if (isNotNil(s)) {\n        s.dirty = false;\n      }\n    }\n    this._dirty = false;\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n  }\n\n  /* -- protected methods -- */\n\n  private loadCachedEntity(id: ID, opts?: EntityStorageLoadOptions): T {\n    const status = this._statusById.get(id);\n    const index = status && status.index;\n    if (isNil(index)) return undefined; // not exists\n    return Object.freeze(this._cache[index]);\n  }\n\n  private async loadFullEntity(id: ID, opts?: EntityStorageLoadOptions): Promise<T> {\n    const status = this._statusById.get(id);\n    const index = status && status.index;\n    if (isNil(index)) return undefined; // not exists\n\n    // Reload from storage, if need (e.g. some attributes has been excluded in light elements)\n    if (status.dirty === false) {\n      console.debug(`[entity-storage] Full reloading ${this.name}#${id}...`);\n      const fullData = await this.storage.get(this._storageKey + '#' + id);\n      if (fullData) return Object.freeze(fullData);\n      // Not found by id, continue from cache (version prior to 1.5.3)\n    }\n\n    // Load from the cache, if dirty OR if storage is not splitted by id\n    return Object.freeze(this._cache[index]);\n  }\n\n  private setEntities(entities: T[], opts?: { emitEvent?: boolean; dirty?: boolean }) {\n    // Filter non nil (and if need non local) entities\n    entities = (entities || []).filter((item) => isNotNil(item) && (!this.policy.skipNonLocalEntities || +item.id < 0));\n\n    this._cache = entities;\n\n    // Update the sequence with min(id) of all temporary ids\n    this._sequence = this._cache.reduce((res, item) => (+item.id < 0 ? Math.min(res, +item.id) : res), 0);\n\n    this._statusById.clear();\n\n    const dirty = opts?.dirty ?? false;\n    this._cache.forEach((item, index) => {\n      this._statusById.set(item.id, <EntityStatus>{\n        index,\n        dirty,\n      });\n    });\n\n    this._loaded = true;\n\n    // Emit update event\n    if (!opts || opts.emitEvent !== false) {\n      this.emitEvent();\n    }\n  }\n\n  /**\n   * WIll apply a filter, then a sort, then a page slice\n   *\n   * @param data\n   * @param variables\n   */\n  private reduceAndSort(\n    data: T[],\n    variables: {\n      offset?: number;\n      size?: number;\n      sortBy?: keyof T | string;\n      sortDirection?: string;\n      filter?: (data: T) => boolean;\n    }\n  ): LoadResult<T> {\n    if (isEmptyArray(data)) {\n      return { data: [], total: 0 };\n    }\n\n    // Remove nil values\n    data = data.filter(isNotNil);\n\n    if (!variables) {\n      // Return all (but array has been filtered, and copied)\n      return { data, total: data.length };\n    }\n\n    // Apply the filter, if any\n    if (variables.filter) {\n      data = data.filter(variables.filter);\n    }\n\n    // Compute the total length\n    const total = data.length;\n\n    // If page size=0 (e.g. only need total)\n    if (variables.size === 0) return { data: [], total };\n\n    // Sort by\n    if (variables.sortBy) {\n      EntityUtils.sort(data, variables.sortBy, (variables.sortDirection?.toLowerCase() as SortDirection) || 'asc');\n    }\n\n    // Slice in a page (using offset and size)\n    if (variables.offset > 0) {\n      // Offset after the end: no result\n      if (variables.offset >= data.length || variables.size === 0) {\n        data = [];\n      } else {\n        data =\n          variables.size > 0 && variables.offset + variables.size < data.length\n            ? // Slice using limit to size\n              data.slice(variables.offset, variables.offset + variables.size)\n            : // Slice without limit\n              data.slice(variables.offset);\n      }\n    }\n\n    // Apply a limit\n    else if (variables.size > 0) {\n      data = data.slice(0, variables.size);\n    }\n    // No limit:\n    else if (variables.size === -1) {\n      // Keep all data\n    }\n\n    return { data, total };\n  }\n\n  private createLightEntityMapFn(policy: EntityStoreTypePolicy<T>): (T) => T {\n    if (policy.mode !== 'by-id') return undefined; // Only need for the 'by-id' mode\n    if (isEmptyArray(policy.lightFieldsExcludes)) return undefined; // skip\n\n    // Create a immutable mask object, use to clean some properties\n    const excludeAttributesMask = Object.freeze(\n      this.policy.lightFieldsExcludes.reduce(\n        (res, attr) => {\n          res[attr] = undefined;\n          return res;\n        },\n        <T>{}\n      )\n    );\n\n    return (entity) => (entity ? Object.assign(<T>{}, entity, excludeAttributesMask) : undefined);\n  }\n\n  /**\n   * Update the entitiesSubject.\n   *\n   * Before wending items, a filter is apply, to remove null value.\n   * This filter will create a array copy.\n   */\n  private emitEvent() {\n    this._onChange.next(true);\n  }\n}\n","import { defer, merge, Observable, timer } from 'rxjs';\nimport { EventEmitter, Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { Platform } from '@ionic/angular';\nimport { first, switchMap, throttleTime } from 'rxjs/operators';\nimport { Entity, IEntity } from '../model/entity.model';\nimport { isEmptyArray, isNilOrBlank } from '../../../shared/functions';\nimport { LoadResult } from '../../../shared/services/entity-service.class';\nimport { ENTITIES_STORAGE_KEY_PREFIX, EntityStorageLoadOptions, EntityStore, EntityStoreTypePolicy } from './entity-store.class';\nimport { APP_PROGRESS_BAR_SERVICE, IProgressBarService } from '../../../shared/services/progress-bar.service';\nimport { Environment, ENVIRONMENT } from '../../../../environments/environment.class';\nimport { StartableService } from '../../../shared/services/startable-service.class';\nimport { chainPromises } from '../../../shared/observables';\nimport { APP_STORAGE, IStorage } from '../../../shared/storage/storage.utils';\n\nexport interface EntitiesStorageTypePolicies {\n  [__typename: string]: EntityStoreTypePolicy;\n}\n\nexport const APP_LOCAL_STORAGE_TYPE_POLICIES = new InjectionToken<EntitiesStorageTypePolicies>('localStorageTypePolicies');\n\ndeclare interface EntityStorageMap {\n  [key: string]: EntityStore<any, any>;\n}\n\n@Injectable({ providedIn: 'root', deps: [APP_STORAGE, ENVIRONMENT] })\nexport class EntitiesStorage extends StartableService<EntityStorageMap> {\n  static readonly TRASH_PREFIX = 'Trash#';\n  static readonly REMOTE_PREFIX = 'Remote#';\n\n  private readonly _typePolicies: EntitiesStorageTypePolicies;\n  private readonly _saveTimerPeriod: number;\n\n  private _$save = new EventEmitter(true);\n  private _dirty = false;\n  private _saving = false;\n\n  get dirty(): boolean {\n    return this._dirty || Object.values(this._data).some((store) => store.dirty);\n  }\n\n  public constructor(\n    private platform: Platform,\n    @Inject(APP_STORAGE) private storage: IStorage,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_PROGRESS_BAR_SERVICE) private progressBarService?: IProgressBarService,\n    @Optional() @Inject(APP_LOCAL_STORAGE_TYPE_POLICIES) typePolicies?: EntitiesStorageTypePolicies\n  ) {\n    super(storage);\n    this._typePolicies = typePolicies || {};\n    this._saveTimerPeriod = environment.storageSavePeriodMs || 10000 /* = 10s */;\n    this._data = {};\n\n    // For DEV only\n    this._debug = !environment.production;\n    if (this._debug) console.debug('[entities-storage] Creating service');\n  }\n\n  async ngOnStart(): Promise<EntityStorageMap> {\n    const now = Date.now();\n    console.debug(`[entities-storage] Starting entity storage...`);\n\n    // Restore stores\n    await this.restoreLocally();\n\n    // Start a save timer\n    this.registerSubscription(\n      merge(this._$save, timer(this._saveTimerPeriod, this._saveTimerPeriod))\n        .pipe(\n          // Avoid to many call (e.g. when $save AND timer are triggered\n          throttleTime(this._saveTimerPeriod)\n        )\n        .subscribe(() => this.storeLocally({ skipIfPristine: true }))\n    );\n\n    // Save, when platform is in pause\n    this.registerSubscription(\n      this.platform.pause.subscribe(async () => {\n        const now = Date.now();\n        console.info(`[entities-storage] Platform will pause: saving...`);\n        await this.storeLocally({ skipIfPristine: true });\n        console.info(`[entities-storage] Platform will pause: saving [OK] in ${Date.now() - now}ms`);\n      })\n    );\n\n    console.info(`[entities-storage] Starting [OK] in ${Date.now() - now}ms`);\n\n    return this._data;\n  }\n\n  protected async ngOnStop() {\n    await this.storeLocally({ skipIfPristine: true });\n  }\n\n  watchAll<T extends Entity<T>>(\n    entityName: string,\n    variables: {\n      offset?: number;\n      size?: number;\n      sortBy?: keyof T | string;\n      sortDirection?: string;\n      trash?: boolean;\n      filter?: (data: T) => boolean;\n    },\n    opts?: EntityStorageLoadOptions\n  ): Observable<LoadResult<T>> {\n    // Make sure store is ready\n    if (!this.started) {\n      return defer(() => this.ready()).pipe(switchMap(() => this.watchAll<T>(entityName, variables, opts))); // Loop\n    }\n\n    this.progressBarService?.increase();\n    const storeName = variables && variables.trash ? EntitiesStorage.TRASH_PREFIX + entityName : entityName;\n    const result = this.getEntityStore<T>(storeName, { create: true }).watchAll(variables, opts);\n\n    result.pipe(first()).subscribe(() => this.progressBarService?.decrease());\n\n    return result;\n  }\n\n  async loadAll<T extends Entity<T>>(\n    entityName: string,\n    variables?: {\n      offset?: number;\n      size?: number;\n      sortBy?: keyof T | string;\n      sortDirection?: string;\n      filter?: (data: T) => boolean;\n    },\n    opts?: EntityStorageLoadOptions\n  ): Promise<LoadResult<T>> {\n    // Make sure store is ready\n    if (!this.started) await this.ready();\n\n    try {\n      this.progressBarService?.increase();\n      if (this._debug) console.debug(`[entities-storage] Loading ${entityName}...`);\n\n      const entityStore = this.getEntityStore<T>(entityName, { create: false });\n      if (!entityStore) return { data: [], total: 0 }; // No store for this entity name\n\n      return entityStore.loadAll(variables, opts);\n    } finally {\n      this.progressBarService?.decrease();\n    }\n  }\n\n  async load<T extends Entity<T>>(id: number, entityName: string, opts?: EntityStorageLoadOptions): Promise<T> {\n    await this.ready();\n\n    try {\n      this.progressBarService?.increase();\n\n      const entityStore = this.getEntityStore<T>(entityName, { create: false });\n      if (!entityStore) return undefined;\n      return await entityStore.load(id, opts);\n    } finally {\n      this.progressBarService?.decrease();\n    }\n  }\n\n  async nextValue(entityOrName: string | any): Promise<number> {\n    await this.ready();\n    this._dirty = true;\n    return this.getEntityStore(this.detectEntityName(entityOrName)).nextValue();\n  }\n\n  async nextValues(entityOrName: string | any, entityCount: number): Promise<number> {\n    await this.ready();\n    this._dirty = true;\n    const entityName = this.detectEntityName(entityOrName);\n    const store = this.getEntityStore(entityName);\n    const firstValue = store.nextValue();\n    for (let i = 0; i < entityCount - 1; i++) {\n      store.nextValue();\n    }\n    if (this._debug) console.debug(`[entities-storage] Reserving range [${firstValue},${store.currentValue()}] for ${entityName}'s sequence`);\n    return firstValue;\n  }\n\n  async currentValue(entityOrName: string | any): Promise<number> {\n    await this.ready();\n    return this.getEntityStore(this.detectEntityName(entityOrName)).currentValue();\n  }\n\n  async save<T extends Entity<T>>(\n    entity: T,\n    opts?: {\n      entityName?: string;\n      emitEvent?: boolean;\n    }\n  ): Promise<T> {\n    if (!entity) return; // skip\n\n    if (!this.started) await this.ready();\n\n    try {\n      this.progressBarService?.increase();\n\n      this._dirty = true;\n      const storeName = (opts && opts.entityName) || this.detectEntityName(entity);\n      this.getEntityStore<T>(storeName).save(entity, opts);\n\n      // Ask to save\n      this._$save.emit();\n\n      return entity;\n    } finally {\n      this.progressBarService?.decrease();\n    }\n  }\n\n  async saveAll<T extends Entity<T>>(\n    entities: T[],\n    opts?: {\n      entityName?: string;\n      reset?: boolean;\n      emitEvent?: boolean;\n    }\n  ): Promise<T[]> {\n    if (isEmptyArray(entities) && (!opts || opts.reset !== true)) return entities; // Skip (nothing to save)\n\n    if (!this.started) await this.ready();\n\n    try {\n      this.progressBarService?.increase();\n\n      this._dirty = true;\n      const entityName = (opts && opts.entityName) || this.detectEntityName(entities[0]);\n      return this.getEntityStore<T>(entityName).saveAll(entities, opts);\n    } finally {\n      this.progressBarService?.decrease();\n    }\n  }\n\n  async delete<T extends Entity<T, ID>, ID = number>(\n    entity: T,\n    opts?: {\n      entityName?: string;\n    }\n  ): Promise<T> {\n    if (!entity) return undefined; // skip\n\n    if (!this.started) await this.ready();\n\n    return this.deleteById(entity.id, {\n      ...opts,\n      entityName: (opts && opts.entityName) || this.detectEntityName(entity),\n    });\n  }\n\n  async deleteById<T extends IEntity<T, ID>, ID = number>(\n    id: ID,\n    opts: {\n      entityName: string;\n      emitEvent?: boolean;\n    }\n  ): Promise<T> {\n    if (!this.started) await this.ready();\n\n    if (!opts || isNilOrBlank(opts.entityName)) throw new Error(\"Missing argument 'opts' or 'entityName'\");\n    //if (id >= 0) throw new Error('Invalid id a local entity (not a negative number): ' + id);\n\n    try {\n      this.progressBarService?.increase();\n      const entityStore = this.getEntityStore<T, ID>(opts.entityName, { create: false });\n      if (!entityStore) return undefined;\n\n      const deletedEntity = entityStore.delete(id, opts);\n\n      // If something deleted\n      if (deletedEntity) {\n        // Mark as dirty\n        this._dirty = true;\n\n        // Ask to save\n        this._$save.emit();\n      }\n\n      return deletedEntity;\n    } finally {\n      this.progressBarService?.decrease();\n    }\n  }\n\n  async deleteMany<T extends Entity<T>>(\n    ids: number[],\n    opts: {\n      entityName: string;\n      emitEvent?: boolean;\n    }\n  ): Promise<T[]> {\n    if (!this.started) await this.ready();\n\n    if (!opts || isNilOrBlank(opts.entityName)) throw new Error(\"Missing argument 'opts' or 'opts.entityName'\");\n\n    try {\n      this.progressBarService?.increase();\n      const entityStore = this.getEntityStore<T>(opts.entityName, { create: false });\n      if (!entityStore) return undefined;\n\n      // Do deletion\n      const deletedEntities = entityStore.deleteMany(ids, opts);\n\n      // If something deleted\n      if (deletedEntities.length > 0) {\n        // Mark as dirty\n        this._dirty = true;\n\n        // Mark as saved need\n        this._$save.emit();\n      }\n\n      return deletedEntities;\n    } finally {\n      this.progressBarService?.decrease();\n    }\n  }\n\n  async deleteFromTrash<T extends Entity<T>>(\n    entity: T,\n    opts?: {\n      entityName?: string;\n    }\n  ): Promise<T> {\n    if (!entity) return undefined; // skip\n\n    if (!this.started) await this.ready();\n\n    return this.deleteFromTrashById(entity.id, {\n      ...opts,\n      entityName: (opts && opts.entityName) || this.detectEntityName(entity),\n    });\n  }\n\n  async deleteFromTrashById<T extends Entity<T>>(\n    id: number,\n    opts: {\n      entityName: string;\n      emitEvent?: boolean;\n    }\n  ): Promise<T> {\n    await this.ready();\n\n    if (!opts || isNilOrBlank(opts.entityName)) throw new Error(\"Missing argument 'opts' or 'entityName'\");\n\n    return this.deleteById(id, {\n      ...opts,\n      entityName: EntitiesStorage.TRASH_PREFIX + opts.entityName,\n    });\n  }\n\n  async moveToTrash<T extends Entity<T>>(\n    entity: T,\n    opts?: {\n      entityName?: string;\n      emitEvent?: boolean;\n    }\n  ): Promise<T> {\n    if (!entity) return undefined; // skip\n\n    if (!this.started) await this.ready();\n\n    const entityName = (opts && opts.entityName) || this.detectEntityName(entity);\n\n    // Delete entity by id, if exists\n    const entityStore = this.getEntityStore<T>(entityName);\n    if (entityStore) entityStore.delete(entity.id, opts);\n\n    // Clean id (a new id will be set by the trash store)\n    entity.id = undefined;\n\n    // Add to trash\n    const trashName = EntitiesStorage.TRASH_PREFIX + entityName;\n    this.getEntityStore<T>(trashName).save(entity, opts);\n\n    this._$save.emit();\n\n    return entity;\n  }\n\n  async moveManyToTrash<T extends Entity<T>>(\n    ids: number[],\n    opts: {\n      entityName: string;\n      emitEvent?: boolean;\n    }\n  ): Promise<T[]> {\n    if (!this.started) await this.ready();\n\n    if (!opts || isNilOrBlank(opts.entityName)) throw new Error(\"Missing argument 'opts.entityName'\");\n\n    const entityStore = this.getEntityStore<T>(opts.entityName, { create: false });\n    if (!entityStore) return undefined;\n\n    // Do deletion\n    const deletedEntities = entityStore.deleteMany(ids, opts);\n\n    // If something deleted\n    if (deletedEntities.length > 0) {\n      // Clean ids (new ids will be set by the trash store)\n      deletedEntities.forEach((e) => (e.id = undefined));\n\n      const trashName = EntitiesStorage.TRASH_PREFIX + opts.entityName;\n      this.getEntityStore<T>(trashName, { create: true }).saveAll(deletedEntities, opts);\n\n      // Mark as dirty\n      this._dirty = true;\n\n      // Mark as save need\n      this._$save.emit();\n    }\n\n    return deletedEntities;\n  }\n\n  async saveToTrash<T extends Entity<T>>(\n    entity: T,\n    opts?: {\n      entityName?: string;\n      emitEvent?: boolean;\n    }\n  ): Promise<T> {\n    if (!entity) return undefined; // skip\n\n    if (!this.started) await this.ready();\n\n    const entityName = (opts && opts.entityName) || this.detectEntityName(entity);\n    const trashName = EntitiesStorage.TRASH_PREFIX + entityName;\n    this.getEntityStore<T>(trashName).save(entity, opts);\n\n    this._$save.emit();\n\n    return entity;\n  }\n\n  async clearTrash(entityName: string) {\n    if (!this.started) await this.ready();\n\n    const trashName = EntitiesStorage.TRASH_PREFIX + entityName;\n    const entityStore = this.getEntityStore(trashName, { create: false });\n    if (!entityStore) return; // Skip\n\n    entityStore.reset();\n    this._dirty = true;\n\n    this._$save.emit();\n  }\n\n  persist(opts = { skipIfPristine: true }): Promise<void> {\n    return this.storeLocally(opts);\n  }\n\n  /* -- protected methods -- */\n\n  protected getEntityStore<T extends IEntity<T, ID>, ID = number>(\n    name: string,\n    opts?: {\n      create?: boolean;\n    }\n  ): EntityStore<T, ID> {\n    let store = this._data[name];\n    if (!store && (!opts || opts.create !== false)) {\n      if (this._debug) console.debug(`[entities-storage] Creating store ${name}`);\n      const typePolicy = this._typePolicies[name];\n      store = new EntityStore<T, ID>(name, this.storage, typePolicy);\n      this._data[name] = store;\n    }\n    return store;\n  }\n\n  protected detectEntityName(entityOrName: string | Entity<any, any>): string {\n    if (!entityOrName) throw Error('Unable to detect entityName of object: ' + entityOrName);\n    if (typeof entityOrName === 'string') return entityOrName;\n    if (entityOrName.__typename) {\n      return entityOrName.__typename;\n    }\n    return entityOrName.constructor.name + 'VO';\n  }\n\n  protected async restoreLocally() {\n    const entityNames = await this.storage.get(ENTITIES_STORAGE_KEY_PREFIX);\n    if (!entityNames) return;\n\n    const now = this._debug && Date.now();\n    if (this._debug) console.info('[entities-storage] Restoring entities...');\n    const entitiesCount = (\n      await Promise.all<number>(entityNames.map((name) => this.getEntityStore<any>(name)).map((store: EntityStore<any>) => store.restore()))\n    ).reduce((res, count) => res + count, 0);\n\n    if (this._debug) console.debug(`[entities-storage] Restoring entities [OK] ${entitiesCount} entities found in ${Date.now() - now}ms`);\n  }\n\n  protected async storeLocally(opts = { skipIfPristine: true }): Promise<void> {\n    if (opts.skipIfPristine && !this.dirty) return; // skip\n\n    // Saving progress: report this save later\n    if (this._saving) {\n      if (this._debug) console.debug('[entities-storage] Previous persist not finished. Waiting...');\n      this._$save.emit();\n      return;\n    }\n\n    this._saving = true;\n    this._dirty = false;\n    this.progressBarService?.increase();\n    const entityNames = (this._data && Object.keys(this._data)) || [];\n\n    const now = Date.now();\n    if (this._debug) console.debug('[entities-storage] Persisting...');\n\n    let currentEntityName;\n    return chainPromises(\n      entityNames.map((entityName) => () => {\n        currentEntityName = entityName;\n        const entityStore = this.getEntityStore(entityName, { create: false });\n\n        if (!entityStore) {\n          console.warn(`[entities-storage] Persisting ${entityName}: store not found!`);\n          return;\n        }\n\n        // SKip store if pristine\n        if (opts.skipIfPristine && !entityStore.dirty) return Promise.resolve();\n\n        // Persist store\n        return entityStore.persist(opts).then((count) => {\n          // If no entity found, remove from the entity names array\n          if (!count) {\n            const entityNameIndex = entityNames.findIndex((e) => e === entityName);\n            if (entityNameIndex !== -1) entityNames.splice(entityNameIndex, 1);\n          }\n        });\n      })\n    )\n      .then(() => {\n        currentEntityName = undefined;\n        return isEmptyArray(entityNames)\n          ? this.storage.remove(ENTITIES_STORAGE_KEY_PREFIX)\n          : this.storage.set(ENTITIES_STORAGE_KEY_PREFIX, entityNames);\n      })\n      .then(() => {\n        if (this._debug) console.debug(`[entities-storage] Persisting [OK] ${entityNames.length} stores saved in ${Date.now() - now}ms...`);\n        this._saving = false;\n        this.progressBarService?.decrease();\n      })\n      .catch((err) => {\n        this._saving = false;\n        this.progressBarService?.decrease();\n        if (currentEntityName) {\n          console.error(`[entities-storage] Error while persisting ${currentEntityName}`, err);\n        } else {\n          console.error(`[entities-storage] Error while persisting: ${(err && err.message) || err}`, err);\n        }\n        throw err;\n      });\n  }\n}\n","import { BaseReferential } from './referential.model';\nimport { EntityClass } from './entity.decorators';\nimport { isNotNil } from '../../../shared/functions';\n\n// @dynamic\n@EntityClass({ typename: 'DepartmentVO' })\nexport class Department extends BaseReferential<Department> {\n  static ENTITY_NAME = 'Department';\n  static fromObject: (source: any, opts?: any) => Department;\n\n  logo: string;\n  siteUrl: string;\n\n  constructor() {\n    super(Department.TYPENAME);\n    this.entityName = Department.ENTITY_NAME;\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.entityName = source.entityName || Department.ENTITY_NAME;\n    this.logo = source.logo;\n    this.siteUrl = source.siteUrl;\n    delete this.entityName; // not need\n  }\n}\n\nexport function departmentToString(obj: Department): string {\n  return (isNotNil(obj?.id) && obj.name) || undefined;\n}\n\nexport function departmentsToString(data: Department[], separator?: string): string {\n  return (data || []).map(departmentToString).join(separator || ', ');\n}\n","import { Moment } from 'moment';\nimport { ReferentialAsObjectOptions } from './referential.model';\nimport { Entity } from './entity.model';\nimport { Department } from './department.model';\nimport { fromDateISOString, toDateISOString } from '../../../shared/dates';\nimport { EntityClass } from './entity.decorators';\nimport { isEmptyArray, isNil, isNotNil } from '../../../shared/functions';\n\nexport type UserProfileLabel = 'ADMIN' | 'USER' | 'SUPERVISOR' | 'GUEST';\nexport const PRIORITIZED_AUTHORITIES: Readonly<UserProfileLabel[]> = Object.freeze(['ADMIN', 'SUPERVISOR', 'USER', 'GUEST']);\n\n// @dynamic\n@EntityClass({ typename: 'PersonVO' })\nexport class Person<T extends Person<any> = Person<any>> extends Entity<T, number, ReferentialAsObjectOptions> {\n  static fromObject: (source: any, opts?: any) => Person;\n\n  firstName: string;\n  lastName: string;\n  email: string;\n  pubkey: string;\n  avatar: string;\n  creationDate: Date | Moment;\n  statusId: number;\n  department: Department = null;\n  username: string;\n  usernameExtranet: string;\n  profiles: string[];\n  mainProfile: string;\n  programs: any;\n\n  constructor(__typename?: string) {\n    super(__typename || Person.TYPENAME);\n  }\n\n  asObject(opts?: ReferentialAsObjectOptions): any {\n    if (opts && opts.minify) {\n      return {\n        id: this.id,\n        __typename: (opts.keepTypename && this.__typename) || undefined,\n        firstName: this.firstName,\n        lastName: this.lastName,\n      };\n    }\n    const target: any = super.asObject(opts);\n    target.department = (this.department && this.department.asObject(opts)) || undefined;\n    target.profiles = (this.profiles && this.profiles.slice(0)) || [];\n    // Set profile list from the main profile\n    target.profiles = (this.mainProfile && [this.mainProfile]) || target.profiles;\n    target.creationDate = toDateISOString(this.creationDate);\n\n    if (!opts || opts.minify !== true) target.mainProfile = PersonUtils.getMainProfile(target.profiles);\n    return target;\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.firstName = source.firstName;\n    this.lastName = source.lastName;\n    this.email = source.email;\n    this.creationDate = fromDateISOString(source.creationDate);\n    this.pubkey = source.pubkey;\n    this.username = source.username;\n    this.usernameExtranet = source.usernameExtranet;\n    this.avatar = source.avatar;\n    this.statusId = source.statusId;\n    this.department = (source.department && Department.fromObject(source.department)) || undefined;\n    this.profiles = (source.profiles && source.profiles.slice(0)) || [];\n    // Add main profile to the list, if need\n    if (source.mainProfile && !this.profiles.find((p) => p === source.mainProfile)) {\n      this.profiles = this.profiles.concat(source.mainProfile);\n    }\n    this.mainProfile = PersonUtils.getMainProfile(this.profiles);\n    this.programs = source.programs;\n  }\n\n  equals(other: T): boolean {\n    return (\n      other &&\n      ((isNotNil(this.id) && this.id === other.id) ||\n        // Functional test\n        // Pubkey should be unique\n        (this.pubkey &&\n          this.pubkey === other.pubkey &&\n          // Email should be unique\n          this.email &&\n          this.email === other.email))\n    );\n  }\n}\n\nexport class PersonUtils {\n\n  static DEFAULT_AVATAR_IMAGE = 'assets/img/person.png';\n\n  static getMainProfile(profiles?: string[]): UserProfileLabel {\n    if (isEmptyArray(profiles)) return 'GUEST';\n    return PRIORITIZED_AUTHORITIES.find((label) => profiles.includes(label)) || 'GUEST';\n  }\n\n  static getMainProfileIndex(profiles?: string[]): number {\n    if (isEmptyArray(profiles)) return PRIORITIZED_AUTHORITIES.length - 1; // return last (lower) profile\n    const index = PRIORITIZED_AUTHORITIES.findIndex((label) => profiles.includes(label));\n    return index !== -1 ? index : PRIORITIZED_AUTHORITIES.length - 1;\n  }\n\n  static hasUpperOrEqualsProfile(actualProfiles: string[], expectedProfile: UserProfileLabel): boolean {\n    const expectedProfileIndex = PRIORITIZED_AUTHORITIES.indexOf(expectedProfile);\n    return expectedProfileIndex !== -1 && PersonUtils.getMainProfileIndex(actualProfiles) <= expectedProfileIndex;\n  }\n\n  static personToString(obj: Person, opts?: { withDepartment?: boolean }): string {\n    if (!obj || isNil(obj.id)) return undefined;\n    const departmentSuffix = opts?.withDepartment && obj.department?.label ? ' (' + obj.department.label + ')' : '';\n    if (isNotNil(obj.lastName) && isNotNil(obj.firstName)) {\n      return obj.lastName + ' ' + obj.firstName + departmentSuffix;\n    }\n    return (obj.lastName ?? obj.firstName) + departmentSuffix;\n  }\n\n  static personsToString(data: Person[], separator?: string, opts?: { withDepartment?: boolean }): string {\n    return (data || []).map((p) => PersonUtils.personToString(p, opts)).join(separator || ', ');\n  }\n\n  static roleToProfile(role: string, defaultProfile?: UserProfileLabel): UserProfileLabel {\n    const label = role?.replace(/^ROLE_/, '') as UserProfileLabel;\n    return label || defaultProfile;\n  }\n}\n","import { EntityClass } from './entity.decorators';\nimport { Entity, EntityAsObjectOptions } from './entity.model';\nimport { Moment } from 'moment/moment';\nimport { DateUtils, fromDateISOString, toDateISOString } from '../../../shared/dates';\nimport { isNotNil, toNumber } from '../../../shared/functions';\n\nexport class TokenScope {\n  id: string;\n  flag: number;\n  name: string;\n}\n\n// @dynamic\n@EntityClass({ typename: 'UserTokenVO' })\nexport class UserToken extends Entity<UserToken> {\n  static fromObject: (source: any, opts?: any) => UserToken;\n\n  static equals(t1: UserToken, t2: UserToken): boolean {\n    return (\n      (isNotNil(t1.id) && t1.id === t2?.id) ||\n      (t1 && t1.pubkey && t1.pubkey === t2?.pubkey && t1.name === t2?.name && DateUtils.equals(t1.expirationDate, t2?.expirationDate))\n    );\n  }\n\n  pubkey: string = null;\n  token: string = null;\n  name: string = null;\n  flags: number = null;\n  scopes: TokenScope[] = null;\n  expirationDate: Moment = null;\n  lastUsedDate: Moment = null;\n  creationDate: Moment = null;\n\n  constructor() {\n    super(UserToken.TYPENAME);\n  }\n\n  asObject(opts?: EntityAsObjectOptions): any {\n    const target = super.asObject(opts);\n    target.expirationDate = toDateISOString(this.expirationDate);\n    target.lastUsedDate = toDateISOString(this.lastUsedDate);\n    target.creationDate = toDateISOString(this.creationDate);\n    if (opts?.minify) {\n      delete target.scopes;\n    }\n    return target;\n  }\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source);\n    this.pubkey = source.pubkey;\n    this.token = source.token;\n    this.name = source.name;\n    this.flags = toNumber(source.flags);\n    this.scopes = source.scopes;\n    this.expirationDate = fromDateISOString(source.expirationDate);\n    this.lastUsedDate = fromDateISOString(source.lastUsedDate);\n    this.creationDate = fromDateISOString(source.creationDate);\n  }\n}\n","import { LocalSettings } from './settings.model';\nimport { Person, PersonUtils, UserProfileLabel } from './person.model';\nimport { Entity, EntityAsObjectOptions } from './entity.model';\nimport { EntityClass } from './entity.decorators';\nimport { StatusIds } from './model.enum';\nimport { LatLongPattern } from '../../../shared/material/latlong/latlong.utils';\nimport { equals, isNil, isNotEmptyArray } from '../../../shared/functions';\nimport { UserToken } from './token.model';\nimport { FormFieldDefinition, FormFieldDefinitionUtils } from '../../../shared/form/field.model';\nimport { AppPropertiesUtils } from '../../form/properties/properties.utils';\n\n/**\n * A user account\n */\n// @dynamic\n@EntityClass({ typename: 'AccountVO' })\nexport class Account<T extends Account<any> = Account<any>> extends Person<T> {\n  static fromObject: (source: any, opts?: any) => Account;\n\n  settings: UserSettings = null;\n  tokens: UserToken[] = [];\n\n  constructor() {\n    super(Account.TYPENAME);\n  }\n\n  asObject(opts?: EntityAsObjectOptions): any {\n    const target: any = super.asObject({ ...opts, minify: false /*disable Person minify (too restrictive) */ });\n    target.settings = this.settings?.asObject(opts);\n    target.tokens = this.tokens?.map((value) => value.asObject(opts));\n    if (opts?.minify) {\n      delete target.mainProfile; // Not known on server\n    }\n    return target;\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.settings = source.settings && UserSettings.fromObject(source.settings);\n    this.tokens = source.tokens?.map((value) => UserToken.fromObject(value)) || [];\n  }\n\n  /**\n   * Convert into a Person. This will fill __typename with a right value, for data cache\n   */\n  asPerson(): Person {\n    const person = Person.fromObject(\n      this.asObject({\n        keepTypename: true, // This is need for the department object\n      })\n    );\n    person.__typename = Person.TYPENAME; // Do not keep AccountVO as typename\n    return person;\n  }\n\n  get displayName(): string {\n    return accountToString(this);\n  }\n}\n\nexport type AccountViewName = 'registration' | 'account' | 'users' | 'usersFilter'; // | string;\n\nexport abstract class AccountUtils {\n  static accountToString = accountToString;\n\n  static hasMinProfile(account: Account | null, userProfile: UserProfileLabel): boolean {\n    // should be login, and status ENABLE or TEMPORARY\n    if (!account || !account.pubkey || (account.statusId !== StatusIds.ENABLE && account.statusId !== StatusIds.TEMPORARY)) {\n      return false;\n    }\n    return PersonUtils.hasUpperOrEqualsProfile(account.profiles, userProfile);\n  }\n\n  static hasExactProfile(account: Account | null, label: UserProfileLabel): boolean {\n    // should be login, and status ENABLE or TEMPORARY\n    if (!account || !account.pubkey || (account.statusId !== StatusIds.ENABLE && account.statusId !== StatusIds.TEMPORARY)) return false;\n    return account.profiles.some((profile) => profile === label);\n  }\n\n  static hasProfileAndIsEnable(account: Account | null, userProfile: UserProfileLabel): boolean {\n    // should be login, and status ENABLE\n    if (!account || !account.pubkey || account.statusId !== StatusIds.ENABLE) return false;\n    return PersonUtils.hasUpperOrEqualsProfile(account.profiles, userProfile);\n  }\n\n  /**\n   * Determines whether an additional field is enabled for a particular account UI part (=the meta key).\n   *\n   * @param {FormFieldDefinition} field - The field definition object.\n   * @param {AccountViewName} viewName - The account view, to check the field's status.\n   * @return {boolean} Returns `true` if the field is enabled for the given account view, otherwise `false`.\n   */\n  static isFieldEnableFor(field: FormFieldDefinition, viewName: AccountViewName): boolean {\n    return FormFieldDefinitionUtils.isFieldEnableFor(field, viewName);\n  }\n\n  static isFieldVisibleFor(field: FormFieldDefinition, viewName: AccountViewName): boolean {\n    return FormFieldDefinitionUtils.isFieldVisibleFor(field, viewName);\n  }\n}\n\n// @dynamic\n@EntityClass({ typename: 'UserSettingsVO' })\nexport class UserSettings extends Entity<UserSettings> {\n  static SETTINGS_PROPERTIES = [<keyof UserSettings>'locale', <keyof UserSettings>'latLongFormat'] as string[];\n  static fromObject: (source: any, opts?: any) => UserSettings;\n\n  locale: string;\n  latLongFormat: LatLongPattern;\n  content: any;\n  nonce: string;\n\n  constructor() {\n    super(UserSettings.TYPENAME);\n  }\n\n  asObject(opts?: EntityAsObjectOptions): any {\n    const target = super.asObject(opts);\n    if (opts?.minify) {\n      // Stringify content\n      target.content = this.content ? JSON.stringify(this.content) : undefined;\n    }\n    return target;\n  }\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source);\n    this.locale = source.locale;\n    this.latLongFormat = source.latLongFormat as LatLongPattern;\n    if (isNil(source.content) || typeof source.content === 'object') {\n      this.content = source.content || {};\n    } else {\n      this.content = (source.content && JSON.parse(source.content)) || {};\n    }\n    this.nonce = source.nonce;\n  }\n\n  /**\n   * Merges the given source object into the current instance.\n   *\n   * @param {S} source - The source object containing properties to merge.\n   * @param {Array<keyof S | string | number>} [includedProperties] - Optional array of property keys to be merged into the content map.\n   * @param {boolean} [resetContent] - Optional flag to reset existing content. False by default\n   * @return {boolean} - Returns true if any changes were made; otherwise, false.\n   */\n  merge<S = LocalSettings>(source: S, includedProperties: (keyof S | string | number)[], resetContent?: boolean): boolean {\n    if (!source) return; // Skip\n\n    // Reset or init content\n    this.content = resetContent ? {} : this.content || {};\n    let hasChanges = false;\n\n    // For each property of source object\n    Object.keys(source).forEach((key) => {\n      // If property exists in UserSettings class: store it directly\n      if (UserSettings.SETTINGS_PROPERTIES.includes(key)) {\n        if (!equals(this[key], source[key])) {\n          this[key] = source[key];\n          hasChanges = true;\n        }\n      }\n      // Else, store property into the 'content' map\n      else if (includedProperties && includedProperties.includes(key as keyof S)) {\n        const sourceValue = source[key];\n        if (!equals(this.content[key], sourceValue)) {\n          if (typeof sourceValue === 'object' && sourceValue !== null) {\n            this.content[key] = { ...this.content[key], ...sourceValue }; // Merge object\n          } else {\n            this.content[key] = sourceValue;\n          }\n          hasChanges = true;\n        }\n      }\n    });\n    return hasChanges;\n  }\n\n  /**\n   * Transform user settings into local settings\n   * @param opts\n   */\n  asLocalSettings(opts?: { definitions?: FormFieldDefinition[] }): Partial<LocalSettings> {\n    const target = <LocalSettings>{};\n    UserSettings.SETTINGS_PROPERTIES.forEach((key) => {\n      target[key] = this[key];\n    });\n    Object.keys(this.content).forEach((key) => {\n      target[key] = this.content[key];\n    });\n    // Sanitize properties\n    const includedKeys = opts?.definitions?.map((def) => def.key) || [];\n    if (isNotEmptyArray(includedKeys)) {\n      target.properties = AppPropertiesUtils.sanitize(target.properties, { includedKeys });\n    }\n    // Clear properties if empty, to avoid to reset the existing properties - See issue sumaris-app#897\n    if (Object.keys(target.properties || {}).length === 0) {\n      delete target.properties;\n    }\n    return target;\n  }\n}\n\nexport function accountToString(data: Account): string {\n  return (data && ((data.firstName && data.firstName + ' ') || '') + (data.lastName || '')) || '';\n}\n","// Base58 encoding/decoding\n// Originally written by Mike Hearn for BitcoinJ\n// Copyright (c) 2011 Google Inc\n// Ported to JavaScript by Stefan Thomas\n// Merged Buffer refactorings from base58-native by Stephen Pair\n// Copyright (c) 2013 BitPay Inc\n// Rewritten in TypeScript by Ludovic Pecquot\n\n// @dynamic\nexport class Base58 {\n  private static alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n  private static alphabetMap;\n\n  private static getAlphabetMap() {\n    if (!Base58.alphabetMap) {\n      this.alphabetMap = {};\n      for (let i = 0; i < Base58.alphabet.length; i++) {\n        Base58.alphabetMap[Base58.alphabet.charAt(i)] = i;\n      }\n    }\n    return Base58.alphabetMap;\n  }\n\n  public static encode(buffer: Uint8Array): string {\n    if (buffer.length === 0) return '';\n\n    let i;\n    let j;\n    const digits = [0];\n    for (i = 0; i < buffer.length; i++) {\n      for (j = 0; j < digits.length; j++) digits[j] <<= 8;\n      digits[digits.length - 1] += buffer[i];\n\n      let carry = 0;\n      for (j = digits.length - 1; j >= 0; j--) {\n        digits[j] += carry;\n        carry = (digits[j] / 58) | 0;\n        digits[j] %= 58;\n      }\n\n      while (carry) {\n        digits.unshift(carry);\n        carry = (digits[0] / 58) | 0;\n        digits[0] %= 58;\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < buffer.length - 1 && buffer[i] === 0; i++) digits.unshift(0);\n\n    return digits\n      .map(function (digit) {\n        return Base58.alphabet[digit];\n      })\n      .join('');\n  }\n\n  public static decode(string: string): Uint8Array {\n    if (string.length === 0) return new Uint8Array(0);\n\n    const input = string.split('').map(function (c) {\n      return Base58.getAlphabetMap()[c];\n    });\n\n    let i;\n    let j;\n    const bytes = [0];\n    for (i = 0; i < input.length; i++) {\n      for (j = 0; j < bytes.length; j++) bytes[j] *= 58;\n      bytes[bytes.length - 1] += input[i];\n\n      let carry = 0;\n      for (j = bytes.length - 1; j >= 0; j--) {\n        bytes[j] += carry;\n        carry = bytes[j] >> 8;\n        bytes[j] &= 0xff;\n      }\n\n      while (carry) {\n        bytes.unshift(carry);\n        carry = bytes[0] >> 8;\n        bytes[0] &= 0xff;\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < input.length - 1 && input[i] === 0; i++) bytes.unshift(0);\n    return new Uint8Array(bytes);\n  }\n}\n","// Standalone startup constants, with NO Angular DI dependency.\n// Kept separate from startup.service.ts so it can be safely imported by e2e tests\n// (Playwright's transpiler does not support Angular parameter decorators).\n\n// Key used to bridge auto-peer/login data across a version-check reload.\n// platform.service may reload the page via location.href = ..., which destroys both\n// URL params (hash/search) and the window object. sessionStorage survives same-tab\n// reloads, is tab-scoped, non-persistent (cleared on tab close), and not accessible\n// cross-origin — making it safe for transient credential bridging.\nexport const STARTUP_DATA_STORAGE_KEY = '__appStartupData';\n","import { inject, Injectable } from '@angular/core';\nimport { AuthData } from './account.service';\nimport { StorageService } from '../../shared/storage/storage.service';\nimport { Peer } from './model/peer.model';\nimport { isEmptyArray, isNotNil, isNotNilOrBlank } from '../../shared/functions';\nimport { ENVIRONMENT } from '../../../environments/environment.class';\nimport { STARTUP_DATA_STORAGE_KEY } from './startup.constants';\n\n// Re-exported for backward compatibility (the constant now lives in a DI-free file,\n// so e2e tests can import it without pulling in Angular services).\nexport { STARTUP_DATA_STORAGE_KEY };\n\nexport interface StartupData extends AuthData {\n  peerUrl?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class StartupService {\n  private _data: StartupData = { password: null, username: null, offline: null, peerUrl: null };\n  protected storage = inject(StorageService);\n  protected environment = inject(ENVIRONMENT, { optional: true });\n\n  get data(): StartupData {\n    return this._data;\n  }\n\n  set data(data: StartupData) {\n    if (isNotNilOrBlank(data.username)) this._data.username = data.username;\n    if (isNotNilOrBlank(data.password)) this._data.password = data.password;\n    if (isNotNil(data.offline)) this._data.offline = data.offline;\n    if (isNotNilOrBlank(data.peerUrl)) this._data.peerUrl = data.peerUrl;\n  }\n\n  hasPeer(): boolean {\n    return isNotNilOrBlank(this._data?.peerUrl);\n  }\n\n  consumePeer(): string | null {\n    if (!this._data) return null;\n    const autoPeer = this._data?.peerUrl;\n    this._data.peerUrl = null;\n    return autoPeer;\n  }\n\n  hasAuth(): boolean {\n    return isNotNilOrBlank(this._data?.username) && isNotNilOrBlank(this._data?.password);\n  }\n\n  consumeAuth(): AuthData | null {\n    if (!this._data) return null;\n    const { username, password, offline } = this._data;\n    this._data.username = null;\n    this._data.password = null;\n    this._data.offline = null;\n    return { username, password, offline };\n  }\n\n  async start() {\n    const authMethods = this.environment?.startupOrder;\n    if (isEmptyArray(authMethods)) return; // Skip if no auth methods configured\n\n    await this.storage.ready();\n\n    console.debug(`[startup] Initializing methods: ${authMethods.join(' -> ')}`);\n\n    const urlHashParams = new URLSearchParams(window.location.hash?.slice(1) || '');\n    const urlSearchParams = new URLSearchParams(window.location.search);\n    const windowStartupData = (window as any)[STARTUP_DATA_STORAGE_KEY] as StartupData | undefined;\n\n    const rawData = sessionStorage.getItem(STARTUP_DATA_STORAGE_KEY);\n    const data: StartupData = rawData ? JSON.parse(rawData) : null;\n    const settingsRaw = await this.storage.get('settings');\n    const settings = typeof settingsRaw === 'string' ? JSON.parse(settingsRaw) : (settingsRaw ?? {});\n\n    // Resolve auto auth data from each configured source\n    if (data) {\n      // Restore from sessionStorage in case of a previous version-check reload\n      this.data = data;\n    } else {\n      // Resolve each configured source by priority (first method has highest priority)\n      let username: string | null = null;\n      let password: string | null = null;\n      let offline: boolean | null = null;\n      let peerUrl: string | null = null;\n      for (const authMethod of authMethods.reverse()) {\n        switch (authMethod) {\n          case 'url':\n            username = urlHashParams.get('username') || urlSearchParams.get('username');\n            password = urlHashParams.get('password') || urlSearchParams.get('password');\n            offline = urlHashParams.get('offline') === 'true' || urlSearchParams.get('offline') === 'true';\n            peerUrl = urlHashParams.get('peerUrl') || urlSearchParams.get('peerUrl');\n            break;\n          case 'window':\n            username = windowStartupData?.username ?? null;\n            password = windowStartupData?.password ?? null;\n            offline = windowStartupData?.offline ?? null;\n            peerUrl = windowStartupData?.peerUrl ?? null;\n            break;\n          case 'environment':\n            username = this.environment?.defaultAuthValues?.username;\n            password = this.environment?.defaultAuthValues?.password;\n            offline = this.environment?.offline;\n            peerUrl = Peer.fromObject(this.environment?.peer)?.url ||\n              settings?.peerUrl || Peer.fromObject(this.environment.defaultPeer)?.url;\n            break;\n          default:\n            console.warn('[startup] Unknown method:', authMethod);\n        }\n        this.data = { username, password, offline, peerUrl };\n      }\n    }\n\n    const sensitiveParams: (keyof StartupData)[] = ['username', 'password', 'offline', 'peerUrl'];\n    const hasHashSensitiveParam = sensitiveParams.some((p) => urlHashParams.has(p));\n    const hasSearchSensitiveParam = sensitiveParams.some((p) => urlSearchParams.has(p));\n    const hasWindowData = !!windowStartupData;\n    const hasExternalSource = hasHashSensitiveParam || hasSearchSensitiveParam || hasWindowData;\n\n    // Persist to sessionStorage so data survives a potential version-check reload\n    if (hasExternalSource && (this.hasPeer() || this.hasAuth())) {\n      sessionStorage.setItem(\n        STARTUP_DATA_STORAGE_KEY,\n        JSON.stringify(this._data)\n      );\n    }\n\n    // Apply auto peer by saving peerUrl to localStorage so the app connects to the right peer\n    if (this.hasPeer()) {\n      settings.peerUrl = this.consumePeer();\n      console.debug(`[startup] Set peer URL to ${settings.peerUrl}`);\n      await this.storage.set('settings', JSON.stringify(settings));\n    }\n\n    // Remove sensitive parameters from the URL\n    if (hasHashSensitiveParam || hasSearchSensitiveParam) {\n      sensitiveParams.forEach((p) => urlSearchParams.delete(p));\n      const search = urlSearchParams.toString() ? `?${urlSearchParams}` : '';\n      window.history.replaceState(null, '', window.location.pathname + search);\n    }\n\n    // Clear sessionStorage bridge after consumption (post-reload path only)\n    if (data) {\n      sessionStorage.removeItem(STARTUP_DATA_STORAGE_KEY);\n    }\n\n    // Remove the window bridge object\n    delete (window as any)[STARTUP_DATA_STORAGE_KEY];\n  }\n}\n\n/**\n * Factory function for the app startup initializer.\n * In Angular 18, this is used with APP_INITIALIZER:\n *   { provide: APP_INITIALIZER, useFactory: createAppStartupInitializer, multi: true }\n *\n * inject() is called during factory execution (in injection context), then the\n * returned function calls the already-injected service.\n */\nexport function createAppStartupInitializer(): () => Promise<void> {\n  const service = inject(StartupService);\n  return () => service.start();\n}\n","import { Inject, Injectable, InjectionToken, Optional, Provider } from '@angular/core';\nimport { CryptoService, Keypair } from './crypto.service';\nimport { Department } from './model/department.model';\nimport { Account, AccountUtils, UserSettings } from './model/account.model';\nimport { Person, PersonUtils, UserProfileLabel } from './model/person.model';\nimport { LocalSettings, UsageMode } from './model/settings.model';\nimport { BehaviorSubject, from, Observable, Subject, Subscription } from 'rxjs';\nimport { FetchPolicy, gql } from '@apollo/client/core';\nimport { Storage } from '@ionic/storage-angular';\n\nimport { isEmptyArray, isNil, removeDuplicatesFromArray, sleep, toNumber } from '../../shared/functions';\nimport { BaseGraphqlService } from './base-graphql-service.class';\nimport { ErrorCodes, ServerErrorCodes } from './errors';\nimport { GraphqlService } from '../graphql/graphql.service';\nimport { LocalSettingsService } from './local-settings.service';\nimport { FormFieldDefinition, FormFieldDefinitionMap } from '../../shared/form/field.model';\nimport { NetworkService } from './network.service';\nimport { AuthTokenType } from './network.types';\nimport { FileService } from '../../shared/file/file.service';\nimport { MINIFY_ENTITY_FOR_POD, Referential, ReferentialUtils } from './model/referential.model';\nimport { StatusIds } from './model/model.enum';\nimport { Base58 } from './base58';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { fromDateISOString } from '../../shared/dates';\nimport { firstNotNilPromise } from '../../shared/observables';\nimport { debounceTime, filter, map, startWith, switchMap } from 'rxjs/operators';\nimport { BaseEntityGraphqlMutations, BaseEntityGraphqlQueries, BaseEntityGraphqlSubscriptions } from './base-entity-service.class';\nimport { Moment } from 'moment';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { OverlayEventDetail } from '@ionic/core';\nimport { ToastController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { TokenScope, UserToken } from './model/token.model';\nimport { AppPropertiesUtils } from '../form/properties/properties.utils';\nimport { StartupService } from './startup.service';\n\nexport declare interface AccountDetails {\n  loaded: boolean;\n  keypair: Keypair;\n  authToken: string;\n  authBasic?: string;\n  pubkey: string;\n  person: Person;\n  department: Department;\n  mainProfile: string;\n}\n\nexport interface AuthData {\n  username: string;\n  password: string;\n  offline?: boolean;\n}\n\nexport interface RegisterData extends AuthData {\n  account: Account;\n}\n\nexport interface ChangePasswordData {\n  password: string;\n  confirmPassword: string;\n  email: string;\n}\n\nconst TOKEN_STORAGE_KEY = 'token';\nconst PUBKEY_STORAGE_KEY = 'pubkey';\nconst SECKEY_STORAGE_KEY = 'seckey';\nconst ACCOUNT_STORAGE_KEY = 'account';\n\nconst DEFAULT_AVATAR_IMAGE = PersonUtils.DEFAULT_AVATAR_IMAGE;\n\nexport interface UserSettingsOptions {\n  options: FormFieldDefinitionMap;\n  remoteLocalSettingsKeys?: (keyof LocalSettings | string)[];\n}\n\nexport const APP_USER_SETTINGS_OPTIONS = new InjectionToken<UserSettingsOptions>('UserSettingsOptions');\nexport const APP_USER_TOKEN_SCOPES = new InjectionToken<TokenScope[]>('UserTokenScopes');\n// Allow apps to inject/override the account service implementation\nexport const APP_ACCOUNT_SERVICE = new InjectionToken<AccountService>('AccountService');\n\nexport interface AccountServiceGraphqlQueries extends BaseEntityGraphqlQueries {\n  loadWithTokens?: any;\n}\nexport interface AccountServiceGraphqlMutations extends BaseEntityGraphqlMutations {\n  saveWithTokens?: any;\n  saveSettings?: any;\n  create?: any;\n}\nexport interface AccountServiceGraphqlSubscriptions extends BaseEntityGraphqlSubscriptions {}\n\nexport interface AccountServiceOptions {\n  queries?: Partial<AccountServiceGraphqlQueries>;\n  mutations?: Partial<AccountServiceGraphqlMutations>;\n  subscriptions?: Partial<AccountServiceGraphqlSubscriptions>;\n}\nexport const APP_ACCOUNT_SERVICE_OPTIONS = new InjectionToken<AccountServiceOptions>('AccountServiceOptions');\n\n/* ------------------------------------\n * GraphQL queries\n * ------------------------------------*/\nconst Fragments = {\n  account: gql`\n    fragment AccountFragment on AccountVO {\n      id\n      firstName\n      lastName\n      email\n      pubkey\n      avatar\n      statusId\n      updateDate\n      creationDate\n      profiles\n      settings {\n        ...UserSettingsFragment\n      }\n      department {\n        id\n        label\n        name\n        __typename\n      }\n      __typename\n    }\n  `,\n\n  settings: gql`\n    fragment UserSettingsFragment on UserSettingsVO {\n      id\n      locale\n      latLongFormat\n      content\n      nonce\n      updateDate\n      __typename\n    }\n  `,\n\n  token: gql`\n    fragment UserTokenFragment on UserTokenVO {\n      id\n      pubkey\n      name\n      flags\n      expirationDate\n      lastUsedDate\n      creationDate\n      updateDate\n      __typename\n    }\n  `,\n};\n\n// Account queries\nconst Queries: Partial<BaseEntityGraphqlQueries> & { loadWithTokens: any } = {\n  load: gql`\n    query Account {\n      data: account {\n        ...AccountFragment\n      }\n    }\n    ${Fragments.account}\n    ${Fragments.settings}\n  `,\n\n  loadWithTokens: gql`\n    query AccountWithToken {\n      data: account {\n        ...AccountFragment\n        tokens {\n          ...UserTokenFragment\n        }\n      }\n    }\n    ${Fragments.account}\n    ${Fragments.settings}\n    ${Fragments.token}\n  `,\n};\n\n// Check email query\nconst IsEmailExistsQuery: any = gql`\n  query IsEmailExists($email: String, $hash: String) {\n    isEmailExists(email: $email, hash: $hash)\n  }\n`;\n\nexport declare interface IsEmailExistsVariables {\n  email: string;\n  hash: string;\n}\n\n// Account mutations\nconst Mutations: Partial<BaseEntityGraphqlMutations> & { saveWithTokens: any; saveSettings: any; create: any } = {\n  save: gql`\n    mutation SaveAccount($data: AccountVOInput) {\n      data: saveAccount(account: $data) {\n        ...AccountFragment\n      }\n    }\n    ${Fragments.account}\n    ${Fragments.settings}\n  `,\n\n  saveWithTokens: gql`\n    mutation SaveAccountWithTokens($data: AccountVOInput) {\n      data: saveAccount(account: $data) {\n        ...AccountFragment\n        tokens {\n          ...UserTokenFragment\n        }\n      }\n    }\n    ${Fragments.account}\n    ${Fragments.settings}\n    ${Fragments.token}\n  `,\n\n  create: gql`\n    mutation CreateAccount($data: AccountVOInput) {\n      data: createAccount(account: $data) {\n        ...AccountFragment\n      }\n    }\n    ${Fragments.account}\n    ${Fragments.settings}\n  `,\n\n  saveSettings: gql`\n    mutation SaveSettings($data: UserSettingsVOInput) {\n      data: saveSettings(settings: $data) {\n        ...UserSettingsFragment\n      }\n    }\n    ${Fragments.settings}\n  `,\n};\n\n// Sent confirmation email\nconst SendConfirmEmailQuery: any = gql`\n  query sendAccountConfirmationEmail($email: String, $locale: String) {\n    data: sendAccountConfirmationEmail(email: $email, locale: $locale)\n  }\n`;\n\n// Confirm account email\nconst ConfirmEmailQuery: any = gql`\n  query confirmAccountEmail($email: String, $code: String) {\n    data: confirmAccountEmail(email: $email, code: $code)\n  }\n`;\n\n// Send email to reset password\nconst SendResetPasswordEmailQuery: any = gql`\n  query SendResetPasswordEmail($username: String!, $locale: String!) {\n    sendResetPasswordEmail(username: $username, locale: $locale)\n  }\n`;\n\nconst ResetAccountPubkeyQuery: any = gql`\n  query ResetPubkey($username: String!, $token: String!) {\n    data: resetAccountPubkey(username: $username, token: $token)\n  }\n`;\n\nconst UpdatePubKeyQuery: any = gql`\n  query UpdateAccountPubkey($pubkey: String!) {\n    data: updateAccountPubkey(pubkey: $pubkey)\n  }\n`;\n\n// Authentication  query\nconst AuthQuery: any = gql`\n  query Auth($token: String) {\n    authenticate(token: $token)\n  }\n`;\n\n// New auth challenge query\nconst AuthChallengeQuery: any = gql`\n  query AuthChallenge {\n    authChallenge {\n      challenge\n      pubkey\n      signature\n    }\n  }\n`;\n\ninterface IAuthChallenge {\n  pubkey: string;\n  challenge: string;\n  signature: string;\n}\n\nconst AccountSubscriptions: BaseEntityGraphqlSubscriptions = {\n  listenChanges: gql`\n    subscription updateAccount($interval: Int) {\n      data: updateAccount(interval: $interval) {\n        id\n        updateDate\n      }\n    }\n  `,\n};\n\nexport interface AccountWatchOptions {\n  intervalInSeconds?: number;\n}\n\n@Injectable({ providedIn: 'root', deps: [ENVIRONMENT] })\nexport class AccountService extends BaseGraphqlService<Account, any, number, Account> {\n  // GraphQL operations (can be overridden using APP_ACCOUNT_SERVICE_OPTIONS)\n  protected readonly queries: AccountServiceGraphqlQueries;\n  protected readonly mutations: AccountServiceGraphqlMutations;\n  protected readonly subscriptions: AccountServiceGraphqlSubscriptions;\n  onLogin = new Subject<Account>();\n  onWillLogout = new Subject<Account>();\n  onLogout = new Subject<void>();\n  onChange = new Subject<Account>();\n  onAuthTokenChange = new BehaviorSubject<string | undefined>(undefined);\n  onAuthBasicChange = new BehaviorSubject<string | undefined>(undefined);\n\n  private _listenChangesSubscription: Subscription = null;\n  private readonly _enableListenChanges: boolean;\n  private readonly _listenIntervalInSeconds: number;\n  private _cache: AccountDetails = {\n    loaded: false,\n    keypair: null,\n    authToken: null,\n    authBasic: null,\n    pubkey: null,\n    mainProfile: null,\n    person: null,\n    department: null,\n  };\n  private readonly _optionDefs: FormFieldDefinition[];\n  private readonly _remoteLocalSettingsKeys: (keyof LocalSettings | string)[];\n  private _$additionalFields = new BehaviorSubject<FormFieldDefinition[]>([]);\n  private _tokenType$ = new BehaviorSubject<AuthTokenType>(undefined);\n  private _apiTokenEnabled = true;\n\n  get account(): Account {\n    return this._cache.loaded ? this._data : undefined;\n  }\n\n  get account$(): Observable<Account> {\n    return this.onChange.asObservable().pipe(startWith(this.account));\n  }\n\n  get person(): Person {\n    if (this._cache.loaded && !this._cache.person) {\n      this._cache.person = this._cache.loaded ? this._data.asPerson() : undefined;\n    }\n    return this._cache.person;\n  }\n\n  get person$(): Observable<Person> {\n    return this.onChange.asObservable().pipe(\n      map(() => this.person),\n      startWith(this.person)\n    );\n  }\n\n  get department(): Department {\n    if (this._cache.loaded && !this._cache.department) {\n      this._cache.department = this._cache.loaded ? this._data.asPerson().department : undefined;\n    }\n    return this._cache.department;\n  }\n\n  get tokenType(): AuthTokenType {\n    return this._tokenType$.value;\n  }\n\n  set tokenType(value: AuthTokenType) {\n    if (this._tokenType$.value !== value) {\n      console.info('[account] Using authentication token type: ' + value);\n      this._tokenType$.next(value);\n      // Reset values\n      this._cache.authToken = undefined;\n      this.onAuthTokenChange.next(undefined);\n      this._cache.authBasic = undefined;\n      this.onAuthBasicChange.next(undefined);\n    }\n  }\n\n  get apiTokenEnabled(): boolean {\n    return this._apiTokenEnabled;\n  }\n\n  set apiTokenEnabled(value: boolean) {\n    this._apiTokenEnabled = value;\n  }\n\n  get remoteLocalSettingsKeys() {\n    return this._remoteLocalSettingsKeys;\n  }\n\n  constructor(\n    protected network: NetworkService,\n    protected graphql: GraphqlService,\n    protected settings: LocalSettingsService,\n    protected storage: Storage,\n    protected file: FileService,\n    @Optional() protected startupService: StartupService,\n    @Optional() private translate: TranslateService,\n    @Optional() private toastController: ToastController,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_USER_SETTINGS_OPTIONS) options: UserSettingsOptions,\n    @Optional() @Inject(APP_ACCOUNT_SERVICE_OPTIONS) accountOptions?: AccountServiceOptions\n  ) {\n    super(graphql, environment);\n    // Initialize GraphQL operations (allow overrides)\n    this.queries = { ...(Queries as AccountServiceGraphqlQueries), ...(accountOptions?.queries || {}) } as AccountServiceGraphqlQueries;\n    this.mutations = { ...(Mutations as AccountServiceGraphqlMutations), ...(accountOptions?.mutations || {}) } as AccountServiceGraphqlMutations;\n    this.subscriptions = { ...(AccountSubscriptions as AccountServiceGraphqlSubscriptions), ...(accountOptions?.subscriptions || {}) } as AccountServiceGraphqlSubscriptions;\n    this._enableListenChanges = !environment.account || environment.account.enableListenChanges !== false; // True by default\n    this._listenIntervalInSeconds = toNumber(environment.account && environment.account.listenIntervalInSeconds, 0); // no timer by default\n\n    this._debug = !environment.production;\n    if (this._debug) console.debug('[account-service] Creating service');\n    this._optionDefs = Object.values(options?.options || {});\n    this._remoteLocalSettingsKeys = options?.remoteLocalSettingsKeys || [];\n\n    this.resetData();\n\n    // Send auth token to the graphql layer, when changed\n    this.onAuthTokenChange.subscribe((token) => this.network.setAuthToken(token));\n    this.onAuthBasicChange.subscribe((basic) => this.network.setAuthBasic(basic));\n\n    // Force network to wait account service, after getting connection to the peer\n    this.network.on('beforeTryOnlineFinish', async (online) => {\n      // If online, wait a full restart, because it can force offline mode\n      if (online && (!this.started || this.isLogin())) {\n        console.debug('[account] Force networkService.tryOnline() to wait, that graphql and account service is restarted...');\n        await sleep(500); // wait graphql service to be restarted\n        if (!this.started) await this.ready();\n      }\n    });\n  }\n\n  async ngOnStart(): Promise<Account> {\n    await Promise.all([\n      this.settings.ready(),\n      // Wait token type to be set\n      firstNotNilPromise(this._tokenType$, { stop: this.stopSubject }),\n    ]);\n\n    // Listen graphql start (or restart)\n    this.registerSubscription(\n      this.graphql.stopSubject.subscribe(() => {\n        if (this.started && this.isLogin()) {\n          console.debug('[account] Restarting, to retry to authenticate...');\n          this.restart();\n        }\n      })\n    );\n\n    // Try to auto login, or restore locally\n    const autoLogin = await this.autoLogin();\n    if (!autoLogin) {\n      await this.restoreLocally();\n    }\n\n    await this.listenSettings();\n\n    return this._data;\n  }\n\n  protected async ngOnStop(): Promise<void> {\n    const hadAuthToken = this._cache.authToken && true;\n    const hadAuthBasic = this._cache.authBasic && true;\n    const hadAuth = hadAuthToken || hadAuthBasic;\n    this.resetData();\n    if (hadAuth) {\n      this.onLogout.next();\n      this.onChange.next(undefined);\n      if (hadAuthToken) this.onAuthTokenChange.next(undefined);\n      if (hadAuthBasic) this.onAuthBasicChange.next(undefined);\n    }\n  }\n\n  isLogin(): boolean {\n    return !!(this._cache.pubkey && this._cache.loaded);\n  }\n\n  isAuth(): boolean {\n    return !!(this._cache.pubkey && this._cache.keypair && this._cache.keypair.secretKey);\n  }\n\n  hasMinProfile(userProfile: UserProfileLabel): boolean {\n    // should be login, and status ENABLE or TEMPORARY\n    if (!this._data || !this._data.pubkey || (this._data.statusId !== StatusIds.ENABLE && this._data.statusId !== StatusIds.TEMPORARY)) {\n      return false;\n    }\n    return PersonUtils.hasUpperOrEqualsProfile(this._data.profiles, userProfile);\n  }\n\n  hasExactProfile(label: UserProfileLabel): boolean {\n    return AccountUtils.hasExactProfile(this._data, label);\n  }\n\n  hasProfileAndIsEnable(userProfile: UserProfileLabel): boolean {\n    return AccountUtils.hasProfileAndIsEnable(this._data, userProfile);\n  }\n\n  isAdmin(): boolean {\n    return this.hasProfileAndIsEnable('ADMIN');\n  }\n\n  isSupervisor(): boolean {\n    return this.hasProfileAndIsEnable('SUPERVISOR');\n  }\n\n  isUser(): boolean {\n    return this.hasProfileAndIsEnable('USER');\n  }\n\n  /**\n   * @deprecated\n   * @param mode\n   */\n  isUsageMode(mode: UsageMode): boolean {\n    return this.settings.isUsageMode(mode);\n  }\n\n  isOnlyGuest(): boolean {\n    // Should be login, and status ENABLE or TEMPORARY\n    if (!this._data || !this._data.pubkey || (this._data.statusId !== StatusIds.ENABLE && this._data.statusId !== StatusIds.TEMPORARY)) return false;\n    // Profile less then user\n    return !PersonUtils.hasUpperOrEqualsProfile(this._data.profiles, 'USER');\n  }\n\n  /**\n   *\n   * @param recorderDepartment\n   * @deprecated use ProgramRefService.canUserWriteEntity() instead\n   */\n  canUserWriteDataForDepartment(recorderDepartment: Referential | any): boolean {\n    if (ReferentialUtils.isEmpty(recorderDepartment)) {\n      return this.isAdmin();\n    }\n\n    // Should be login, and status ENABLE\n    if (!this._data || !this._data.pubkey || this._data.statusId !== StatusIds.ENABLE) return false;\n\n    if (!this._data.department || !this._data.department.id) {\n      console.warn('User account has no department ! Unable to check write right against recorderDepartment');\n      return false;\n    }\n\n    // Same recorder department: OK, user can write\n    if (this._data.department.id === recorderDepartment.id) return true;\n\n    // Cannot write\n    return false;\n  }\n\n  async register(data: RegisterData): Promise<Account> {\n    if (this.isLogin()) {\n      throw new Error('User already login. Please logout before register.');\n    }\n    if (!data.username || !data.password) throw new Error('Missing required username or password');\n\n    if (this._debug) console.debug('[account] Register new user account...', data.account);\n    this._cache.loaded = false;\n    const now = Date.now();\n\n    try {\n      const keypair = await CryptoService.scryptKeypair(data.username, data.password);\n      data.account.pubkey = Base58.encode(keypair.publicKey);\n\n      // Default values\n      data.account.settings = data.account.settings || new UserSettings();\n      data.account.settings.merge(this.settings.settings, this._remoteLocalSettingsKeys, true);\n      data.account.department.id = data.account.department.id || this.environment.defaultDepartmentId;\n\n      this._cache.keypair = keypair;\n      const account = await this.saveRemotely(data.account, keypair);\n\n      // Default values\n      account.avatar = account.avatar || this.environment.baseUrl + PersonUtils.DEFAULT_AVATAR_IMAGE;\n      this._cache.mainProfile = PersonUtils.getMainProfile(account.profiles);\n\n      this._data = account;\n      this._cache.pubkey = account.pubkey;\n\n      // Try to auth on pod\n      await this.authenticate(data);\n\n      this._cache.loaded = true;\n\n      await this.saveLocally();\n\n      console.debug(`[account] Account successfully registered in ${Date.now() - now}ms`);\n\n      // Emit events\n      this.onLogin.next(this._data);\n      this.onChange.next(this._data);\n\n      // Listen remote changes\n      if (this._enableListenChanges) this.startListenRemoteChanges();\n\n      return this._data;\n    } catch (error) {\n      console.error((error && error.message) || error);\n      this.resetData();\n      throw error;\n    }\n  }\n\n  async authenticate(data?: AuthData) {\n    // Wait the auth token, then continue\n    const tokenType = await firstNotNilPromise(this._tokenType$);\n\n    // Basic auth\n    if (tokenType === 'basic' || tokenType === 'basic-and-token') {\n      // Generate the authBasic, if used\n      if (!this._cache.authBasic) {\n        // Skip if token already provided\n        if (!(this._cache.authToken && tokenType === 'basic-and-token')) {\n          if (!data || !data.username || !data.password) throw new Error('Missing username and password');\n          this._cache.authBasic = CryptoService.encodeBase64(`${data.username}:${data.password}`);\n        }\n      }\n      this.onAuthBasicChange.next(this._cache.authBasic);\n    }\n\n    // Generate the authToken, if used\n    if (tokenType === 'token' || tokenType === 'basic-and-token') {\n      try {\n        this._cache.authToken = await this.authenticateAndGetToken(this._cache.authToken);\n      } catch (error) {\n        // Never authenticate, or not ready for offline mode => exit\n        console.error(error);\n        this.resetData();\n        throw error;\n      }\n    }\n\n    // Forget authBasic, to switch to authToken\n    if (tokenType === 'basic-and-token') {\n      this._cache.authBasic = undefined;\n      this.onAuthBasicChange.next(undefined);\n    }\n  }\n\n  async login(data: AuthData): Promise<Account> {\n    if (!data || !data.username || !data.password) throw new Error('Missing required username or password');\n\n    console.debug('[account] Login...');\n\n    let keypair;\n    try {\n      keypair = await CryptoService.scryptKeypair(data.username, data.password);\n    } catch (error) {\n      console.error(error);\n      this.resetData();\n      throw { code: ErrorCodes.UNKNOWN_ERROR, message: 'ERROR.SCRYPT_ERROR' };\n    }\n\n    // Store pubkey+keypair\n    this._cache.pubkey = Base58.encode(keypair.publicKey);\n    this._cache.keypair = keypair;\n\n    // Try to load previous token\n    let previousToken: string = await this.storage.get(TOKEN_STORAGE_KEY);\n    previousToken = (previousToken && previousToken.startsWith(this._cache.pubkey) && previousToken) || null;\n\n    // Offline mode\n    const offline = this.settings.hasOfflineFeature() && (this.network.offline || data.offline === true);\n    if (offline) {\n      this._cache.authToken = previousToken;\n\n      // Make sure network if set as offline\n      this.network.setForceOffline(true, { showToast: false });\n      console.info(`[account] Login [OK] {pubkey: ${this._cache.pubkey.substr(0, 8)}}, {offline: true}`);\n    }\n\n    // Online mode: try to auth on pod\n    else {\n      try {\n        await this.authenticate(data);\n      } catch (error) {\n        // Never authenticate, or not ready for offline mode => exit\n        console.error(error);\n        this.resetData();\n        throw error;\n      }\n    }\n\n    // Load account data\n    try {\n      await this.loadData({ offline, fetchPolicy: 'network-only' });\n    } catch (err) {\n      // If account not found, check if email is valid\n      if (err && +err.code === ErrorCodes.LOAD_ACCOUNT_ERROR) {\n        // Check email exists\n        if (data.username.indexOf('@') !== -1) {\n          let isEmailExists;\n          try {\n            isEmailExists = await this.isEmailExists(data.username);\n          } catch (otherError) {\n            throw err; // resend the first error\n          }\n\n          // Email not exists (no account)\n          if (!isEmailExists) {\n            throw { code: ErrorCodes.UNKNOWN_ACCOUNT_EMAIL, message: 'ERROR.UNKNOWN_ACCOUNT_EMAIL' };\n          }\n        }\n\n        // Email exists, so error = 'bad password'\n        throw { code: ErrorCodes.BAD_PASSWORD, message: 'ERROR.BAD_PASSWORD' };\n      }\n\n      throw err; // resend the first error\n    }\n\n    try {\n      // Store to local storage\n      await this.saveLocally();\n    } catch (error) {\n      console.error(error);\n      this.resetData();\n      throw error;\n    }\n\n    // Emit event to observers\n    this.onLogin.next(this._data);\n    this.onChange.next(this._data);\n\n    if (this._enableListenChanges) this.startListenRemoteChanges();\n\n    return this._data;\n  }\n\n  async reload(opts?: { showToast?: boolean }): Promise<Account> {\n    if (!this._cache.pubkey) throw new Error('User not logged');\n    if (this.network.offline) throw new Error('Cannot check account in offline mode');\n\n    const now = Date.now();\n    console.debug(`[account] Reloading account...`);\n    const wasLogin = this.isLogin();\n\n    try {\n      await this.loadData();\n      await this.saveLocally();\n\n      console.debug(`[account] Reloading account [OK] in ${Date.now() - now}ms`);\n\n      // Emit login event to subscribers\n      this.onLogin.next(this._data);\n      this.onChange.next(this._data);\n\n      // Display toast (without await, because not need to wait toast close event)\n      if (!opts || opts.showToast !== false) {\n        this.showToast({ message: 'ACCOUNT.INFO.RELOADED', type: 'info' });\n      }\n\n      return this._data;\n    } catch (error) {\n      // Cannot reload but was login: force to logout\n      if (wasLogin && !this.isLogin()) {\n        console.error(`[account] Reloading account failed. Will force logout...`, error);\n        await this.logout();\n      } else {\n        throw error;\n      }\n    }\n  }\n\n  /**\n   * Create or update an user account, to the remote storage\n   *\n   * @param account\n   */\n  async save(account: Account): Promise<Account> {\n    if (!this._cache.pubkey) return Promise.reject('User not logged');\n    if (this._cache.pubkey !== account.pubkey) return Promise.reject('Not user account');\n\n    account = await this.saveRemotely(account, this._cache.keypair);\n\n    // Set defaults\n    account.avatar = account.avatar || this.environment.baseUrl + DEFAULT_AVATAR_IMAGE;\n    this._cache.mainProfile = PersonUtils.getMainProfile(account.profiles);\n\n    this._data = account;\n\n    // Update cache\n    this._cache.person = account.asPerson();\n    this._cache.department = this._cache.person.department;\n\n    this._cache.loaded = true;\n\n    // Save locally (in storage)\n    await this.saveLocally();\n\n    // Send event\n    this.onLogin.next(this._data);\n    this.onChange.next(this._data);\n\n    return this._data;\n  }\n\n  async logout(): Promise<void> {\n    const hadAuthToken = this._cache.authToken && true;\n    const hadAuthBasic = this._cache.authBasic && true;\n    const pubkey = this._cache && this._cache.pubkey;\n\n    // Notify observers\n    this.onWillLogout.next(this.account);\n\n    this.resetData();\n\n    if (!this.settings.hasOfflineFeature()) {\n      // Remove all data from the local storage\n      await Promise.all([\n        this.storage.remove(PUBKEY_STORAGE_KEY),\n        this.storage.remove(TOKEN_STORAGE_KEY),\n        this.storage.remove(ACCOUNT_STORAGE_KEY),\n        (pubkey && this.storage.remove(ACCOUNT_STORAGE_KEY + '#' + pubkey)) || Promise.resolve(),\n        this.storage.remove(SECKEY_STORAGE_KEY),\n      ]);\n    }\n\n    // Offline features enable: need to keep some data\n    else {\n      // Always remove only secret key\n      // But keep:\n      // - account by pubkey\n      // - auth token\n      await Promise.all([this.storage.remove(PUBKEY_STORAGE_KEY), this.storage.remove(ACCOUNT_STORAGE_KEY), this.storage.remove(SECKEY_STORAGE_KEY)]);\n    }\n\n    // Clean page history, in local settings\n    await this.settings.clearPageHistory();\n\n    // Notify observers\n    this.onLogout.next();\n    if (hadAuthToken) this.onAuthTokenChange.next(undefined);\n    if (hadAuthBasic) this.onAuthBasicChange.next(undefined);\n    this.onChange.next(undefined);\n  }\n\n  /**\n   * Load a account\n   *\n   * @param opts\n   */\n  async load(opts?: { offline?: boolean; fetchPolicy?: FetchPolicy; query?: any }): Promise<Account | undefined> {\n    const now = this._debug && Date.now();\n    if (this._debug) console.debug(`[account] Loading account...`);\n    let json: any;\n\n    // Load locally\n    const offline =\n      (this.network.offline && (!opts || (opts.fetchPolicy !== 'network-only' && opts.fetchPolicy !== 'no-cache'))) ||\n      (opts && opts.offline === true);\n    if (offline) {\n      json = await this.storage.get(ACCOUNT_STORAGE_KEY);\n      json = (json && typeof json === 'string' && JSON.parse(json)) || json;\n      json = (json && this._cache.pubkey && json.pubkey === this._cache.pubkey && json) || null;\n      if (!json && this._cache.pubkey) {\n        json = await this.storage.get(ACCOUNT_STORAGE_KEY + '#' + this._cache.pubkey);\n        json = (json && typeof json === 'string' && JSON.parse(json)) || json;\n      }\n    }\n\n    // Load remotely\n    else {\n      const query = opts?.query || (this.apiTokenEnabled ? this.queries.loadWithTokens : this.queries.load);\n      const { data } = await this.graphql.query<{ data: any }>({\n        query,\n        error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },\n        fetchPolicy: (opts && opts.fetchPolicy) || 'no-cache' || undefined,\n      });\n      json = data;\n    }\n\n    if (json) {\n      const account = Account.fromObject(json);\n\n      // Clean remote\n      if (account.settings && this._remoteLocalSettingsKeys) {\n        account.settings.merge(account.settings.asLocalSettings(), this._remoteLocalSettingsKeys);\n      }\n\n      if (this._debug) console.debug(`[account] Account loaded in ${Date.now() - now}ms`, account);\n      return account;\n    } else {\n      console.warn(`[account] Account not found !`);\n      return undefined;\n    }\n  }\n\n  async generateToken(flags: number): Promise<string | undefined> {\n    const now = this._debug && Date.now();\n    if (this._debug) console.debug(`[account] Generate token...`);\n\n    const authChallenge = await this.getAuthChallenge();\n    // Add Flags to challenge\n    const challenge = `${authChallenge.challenge}:${flags}`;\n    const signature = await CryptoService.sign(challenge, this._cache.keypair);\n    const newToken = `${this._cache.pubkey}:${challenge}|${signature}`;\n\n    if (newToken) {\n      if (this._debug) console.debug(`[account] Token generated in ${Date.now() - now}ms`);\n    } else {\n      console.warn(`[account] Token generation failed !`);\n    }\n\n    return newToken;\n  }\n\n  /**\n   * Check if email is available for new account registration.\n   * Throw an error if not available\n   *\n   * @param email\n   */\n  async checkEmailAvailable(email: string): Promise<void> {\n    const isEmailExists = await this.isEmailExists(email);\n    if (isEmailExists) {\n      throw { code: ErrorCodes.EMAIL_ALREADY_REGISTERED, message: 'ERROR.EMAIL_ALREADY_REGISTERED' };\n    }\n  }\n\n  /**\n   * Check if email is exists in server.\n   *\n   * @param email\n   */\n  async isEmailExists(email: string): Promise<boolean> {\n    if (this._debug) console.debug('[account] Checking if {' + email + '} exists...');\n\n    const data = await this.graphql.query<{ isEmailExists: boolean }, IsEmailExistsVariables>({\n      query: IsEmailExistsQuery,\n      variables: {\n        email,\n        hash: undefined,\n      },\n    });\n\n    if (this._debug) console.debug('[account] Email exist: ' + (data && data.isEmailExists));\n\n    return data && data.isEmailExists;\n  }\n\n  async sendConfirmationEmail(email: string, locale?: string): Promise<boolean> {\n    locale = locale || this.settings.locale;\n    console.debug('[account] Sending confirmation email to {' + email + '} with locale {' + locale + '}...');\n\n    const { data } = await this.graphql.query<{ data: boolean }>({\n      query: SendConfirmEmailQuery,\n      variables: {\n        email,\n        locale,\n      },\n      error: {\n        code: ErrorCodes.SENT_CONFIRMATION_EMAIL_FAILED,\n        message: 'ERROR.SENT_ACCOUNT_CONFIRMATION_EMAIL_FAILED',\n      },\n    });\n\n    return data;\n  }\n\n  async confirmEmail(email: string, code: string): Promise<boolean> {\n    console.debug('[account] Sending confirm request for email {' + email + '} with code {' + code + '}...');\n\n    const { data } = await this.graphql.query<{ data: boolean }>({\n      query: ConfirmEmailQuery,\n      variables: {\n        email,\n        code,\n      },\n      error: {\n        code: ErrorCodes.CONFIRM_EMAIL_FAILED,\n        message: 'ERROR.CONFIRM_ACCOUNT_EMAIL_FAILED',\n      },\n    });\n    return data;\n  }\n\n  async sendResetPasswordEmail(username: string, locale?: string): Promise<boolean> {\n    locale = locale || this.settings.locale;\n\n    console.debug(`[account] Sending change password email to {${username}} with locale {${locale}}...`);\n\n    const { data: isOk } = await this.graphql.query<{ data: boolean }>({\n      query: SendResetPasswordEmailQuery,\n      variables: {\n        username,\n        locale,\n      },\n      error: {\n        code: ErrorCodes.AUTH_SEND_RESET_PASSWORD_EMAIL_ERROR,\n        message: 'ACCOUNT.ERROR.SEND_RESET_PASSWORD_EMAIL_ERROR',\n      },\n      fetchPolicy: 'no-cache',\n    });\n    return isOk;\n  }\n\n  async updatePubkey(data: AuthData): Promise<boolean> {\n    if (!data.username || !data.password) throw new Error('Missing required username or password');\n    if (!this.isLogin()) throw new Error('Should be login');\n\n    const keypair = await CryptoService.scryptKeypair(data.username, data.password);\n    const pubkey = Base58.encode(keypair.publicKey);\n\n    console.debug(`[account] Updating account pubkey to ${pubkey} ...`);\n\n    const { data: res } = await this.graphql.query<{ data: boolean }>({\n      query: UpdatePubKeyQuery,\n      variables: { pubkey },\n      error: {\n        code: ErrorCodes.AUTH_UPDATE_PUBKEY_ERROR,\n        message: 'ACCOUNT.ERROR.UPDATE_PUBKEY_ERROR',\n      },\n      fetchPolicy: 'no-cache',\n    });\n\n    console.debug(`[account] Updating account pubkey response`, res);\n\n    if (res) {\n      await this.logout();\n      await this.login(data);\n    }\n\n    return res;\n  }\n\n  async resetPubkey(data: AuthData, token: string): Promise<boolean> {\n    if (this.isLogin()) {\n      await this.logout();\n    }\n\n    // Parse challenge\n    const challenge = token.split('|', 2)[0].split(':', 2)[1];\n    const keypair = await CryptoService.scryptKeypair(data.username, data.password);\n    const pubkey = Base58.encode(keypair.publicKey);\n    const signature = await CryptoService.sign(challenge, keypair);\n    const newToken = `${pubkey}:${challenge}|${signature}`;\n\n    console.debug(`[account] Resetting account pubkey, using token: `, newToken);\n\n    const { data: res } = await this.graphql.query<{ data: boolean }>({\n      query: ResetAccountPubkeyQuery,\n      variables: { token: newToken, username: data.username },\n      error: {\n        code: ErrorCodes.AUTH_RESET_PUBKEY_ERROR,\n        message: 'ACCOUNT.ERROR.RESET_PUBKEY_ERROR',\n      },\n      fetchPolicy: 'no-cache',\n    });\n\n    // Login\n    if (res) {\n      await this.login(data);\n    }\n\n    return res;\n  }\n\n  listenChanges(opts?: AccountWatchOptions): Subscription {\n    if (this._enableListenChanges) return new Subscription(); // Already started: skip\n\n    return this.startListenRemoteChanges(opts);\n  }\n\n  get additionalFields(): FormFieldDefinition[] {\n    return this._$additionalFields.getValue();\n  }\n\n  /**\n   * @deprecated Use additionalFields$ instead\n   */\n  get $additionalFields(): Observable<FormFieldDefinition[]> {\n    return this._$additionalFields.asObservable();\n  }\n\n  get additionalFields$(): Observable<FormFieldDefinition[]> {\n    return this._$additionalFields.asObservable();\n  }\n\n  getAdditionalField(key: string): FormFieldDefinition | undefined {\n    return this._$additionalFields.getValue().find((f) => f.key === key);\n  }\n\n  registerAdditionalField(...fields: FormFieldDefinition[]) {\n    const oldFields = this._$additionalFields.getValue() || [];\n    const newFields = fields?.reduce((res, field) => {\n      if (res.some((f) => f.key === field.key)) {\n        throw new Error(`Additional account field {key: ${field.key}} already define.`);\n      }\n      //if (this._debug)\n      console.debug(`[account] Register additional account's field {key: ${field.key}}`);\n      return res.concat(field);\n    }, oldFields);\n\n    this._$additionalFields.next(newFields);\n  }\n\n  get optionDefs(): FormFieldDefinition[] {\n    return this._optionDefs;\n  }\n\n  registerOption(def: FormFieldDefinition) {\n    if (this._optionDefs.findIndex((f) => f.key === def.key) !== -1) {\n      throw new Error(`Additional option {${def.key}} already define.`);\n    }\n    if (this._debug) console.debug(`[account] Adding additional option {${def.key}}`, def);\n    this._optionDefs.push(def);\n  }\n\n  registerOptions(defs: FormFieldDefinition[]) {\n    (defs || []).forEach((def) => this.registerOption(def));\n  }\n\n  /* -- protected method -- */\n\n  protected resetData() {\n    this.stopListenRemoteChanges();\n    this._cache.loaded = false;\n    this._cache.keypair = null;\n    this._cache.authToken = null;\n    this._cache.authBasic = null;\n    this._cache.pubkey = null;\n    this._cache.mainProfile = null;\n    this._cache.person = null;\n    this._cache.department = null;\n    this._data = new Account();\n  }\n\n  protected async loadData(opts?: { offline?: boolean; fetchPolicy?: FetchPolicy }): Promise<Account> {\n    if (!this._cache.pubkey) throw new Error('User not logged');\n\n    this._cache.loaded = false;\n\n    console.debug('[account-service] Loading account data...');\n    try {\n      const account = (await this.load(opts)) || new Account();\n\n      // Set defaults\n      account.avatar = account.avatar || this.environment.baseUrl + PersonUtils.DEFAULT_AVATAR_IMAGE;\n      account.settings = account.settings || new UserSettings();\n      account.settings.locale = account.settings.locale || this.settings.locale;\n      account.settings.latLongFormat = account.settings.latLongFormat || this.settings.latLongFormat || 'DDMM';\n      account.settings.content = account.settings.content || {};\n\n      // Read main profile\n      this._cache.mainProfile = PersonUtils.getMainProfile(account.profiles);\n\n      // Update, instead of replace it\n      if (this._data) {\n        this._data.fromObject(account);\n      } else {\n        this._data = account;\n      }\n      this._cache.loaded = true;\n\n      // Apply settings, found in remote account\n      if (account.settings && this.settings.settings.accountInheritance) {\n        console.debug('[account-service] Copying account settings into local settings...');\n        const localSettings = this.settings.settings;\n        const accountSettings = account.settings.asLocalSettings();\n        const definitions = removeDuplicatesFromArray([...this.optionDefs, ...this.settings.optionDefs], 'key');\n        const mergedProperties = AppPropertiesUtils.sanitize(\n          {\n            ...localSettings.properties,\n            ...accountSettings.properties,\n          },\n          { definitions }\n        );\n\n        // Merge local/account settings\n        const settings = {\n          ...localSettings,\n          ...accountSettings,\n          properties: mergedProperties,\n        };\n\n        await this.settings.apply(settings);\n      }\n\n      return this._data;\n    } catch (error) {\n      this.resetData();\n      if (error.code && error.message) throw error;\n\n      console.error(error);\n      throw {\n        code: ErrorCodes.LOAD_ACCOUNT_ERROR,\n        message: 'ERROR.LOAD_ACCOUNT_ERROR',\n      };\n    }\n  }\n\n  protected async listenSettings(): Promise<void> {\n    // When settings changed: save it remotely\n    this.registerSubscription(\n      this.settings.onChange\n        .pipe(\n          debounceTime(2000),\n          filter(() => this.isLogin() && this.network.online)\n        )\n        .subscribe((settings) => this.saveLocalSettingsRemotely(settings))\n    );\n  }\n\n  protected async autoLogin(): Promise<boolean> {\n    if (!this.startupService?.hasAuth()) return false; // Skip if no auth data\n\n    try {\n      const authData: AuthData = this.startupService.consumeAuth();\n      console.debug('[account] Attempting auto login as:', authData.username);\n      await this.login(authData);\n      return true;\n    } catch (error) {\n      console.warn('[account] Auto auth failed:', error);\n      return false;\n    }\n  }\n\n  protected async restoreLocally(): Promise<Account | undefined> {\n    // Restore from storage\n    const values = await Promise.all([\n      this.storage.get(PUBKEY_STORAGE_KEY),\n      this.storage.get(TOKEN_STORAGE_KEY),\n      this.storage.get(SECKEY_STORAGE_KEY),\n    ]);\n    let pubkey = values[0];\n    let token = values[1];\n    const seckey = values[2];\n\n    // DEV only - auth by token\n    if (!this.environment.production && this.environment.defaultAuthValues?.token) {\n      token = token || this.environment.defaultAuthValues.token;\n      pubkey = pubkey || token?.split(':', 2)[0];\n    }\n\n    // Quit if no pubkey (not logged)\n    if (!pubkey) return;\n\n    // Quit if could not auth on pod\n    const canRemoteAuth = token || seckey || false;\n    if (!canRemoteAuth) return;\n\n    if (this._debug) console.debug(`[account] Account restoration...`);\n\n    this._cache.authToken = token;\n    this._cache.pubkey = pubkey;\n    this._cache.keypair =\n      (seckey && {\n        publicKey: Base58.decode(pubkey),\n        secretKey: Base58.decode(seckey),\n      }) ||\n      null;\n\n    // Online mode: try to connect to pod\n    if (this.network.online) {\n      try {\n        await this.authenticate();\n        if (!this._cache.authToken && !this._cache.authBasic) throw new Error('Authentication failed');\n      } catch (error) {\n        // Offline feature are enable: continue in offline mode\n        if (this.settings.hasOfflineFeature()) {\n          console.warn('[account] Unable to authenticate on pod: forcing offline mode');\n          this.network.setForceOffline(true, { showToast: false });\n          // Continue\n        }\n        // No offline features enable (=offline mode not allowed)\n        else {\n          console.error(error);\n          this.logout();\n          return;\n        }\n      }\n    }\n\n    // Get the account, from pubkey\n    let jsonAccount = await this.storage.get(`${ACCOUNT_STORAGE_KEY}#${pubkey}`);\n    if (!jsonAccount) {\n      // Try using the old storage key\n      const accountStr = await this.storage.get(ACCOUNT_STORAGE_KEY);\n      jsonAccount = accountStr && ((typeof accountStr === 'string' && JSON.parse(jsonAccount)) || accountStr);\n    }\n\n    // Invalid account: do not use it\n    if (!jsonAccount || jsonAccount.pubkey !== pubkey) {\n      // DEV only: create a fake account with given username\n      if (!this.environment.production && this.environment.defaultAuthValues.username) {\n        const username = this.environment.defaultAuthValues.username;\n        jsonAccount = { pubkey, username, firstName: username, lastName: username };\n      } else {\n        return;\n      }\n    }\n\n    // Transform to entity\n    const account = Account.fromObject(jsonAccount);\n\n    // Update data\n    this._data = account;\n    this._cache.mainProfile = PersonUtils.getMainProfile(account.profiles);\n    this._cache.loaded = true;\n\n    // Emit event\n    this.onLogin.next(this._data);\n    this.onChange.next(this._data);\n\n    if (this._enableListenChanges) this.startListenRemoteChanges();\n\n    if (this._debug) console.debug(`[account] Account restoration [OK] {pubkey: ${pubkey.substr(0, 8)}}, {profile: ${this._cache.mainProfile}}`);\n\n    return account;\n  }\n\n  /**\n   * Save account into the local storage\n   */\n  protected async saveLocally(): Promise<void> {\n    if (!this._cache.pubkey) throw new Error('User not logged');\n\n    if (this._debug) console.debug(`[account] Saving account {${this._cache.pubkey.substring(0, 6)}} in local storage...`);\n\n    // Convert account to json\n    const json = this._data.asObject({ keepTypename: true });\n    const seckey = (this._cache.keypair && this._cache.keypair.secretKey && Base58.encode(this._cache.keypair.secretKey)) || null;\n\n    // Convert avatar URL to dataUrl (e.g. 'data:image/png:<base64 content>')\n    const hasAvatarUrl =\n      json.avatar &&\n      !json.avatar.endsWith(PersonUtils.DEFAULT_AVATAR_IMAGE) &&\n      (json.avatar.startsWith('http://') || json.avatar.startsWith('https://'));\n    if (hasAvatarUrl && this.network.online) {\n      await this.file\n        .getImage(json.avatar, {\n          thumbnail: true,\n          outputType: 'dataUrl',\n        })\n        .then((dataUrl) => {\n          if (dataUrl && this._debug) console.debug('[account] Image fetched: ', dataUrl.substring(0, 50));\n\n          // TODO: make sure to display Base64 image in the menu top header\n          //jsonAccount.avatar = dataUrl;\n        })\n        .catch((err) => {\n          console.error(`[account] Error while fetching image: ${json.avatar}: ${err}`);\n        });\n    }\n\n    try {\n      await Promise.all([\n        this.storage.set(PUBKEY_STORAGE_KEY, this._cache.pubkey),\n        this.storage.set(TOKEN_STORAGE_KEY, this._cache.authToken),\n        this.storage.set(`${ACCOUNT_STORAGE_KEY}#${this._cache.pubkey}`, json),\n        // Secret key (optional)\n        (seckey && this.storage.set(SECKEY_STORAGE_KEY, seckey)) || this.storage.remove(SECKEY_STORAGE_KEY),\n        // Remove old storage key\n        this.storage.remove(ACCOUNT_STORAGE_KEY),\n      ]);\n\n      if (this._debug) console.debug('[account] Account saved in local storage');\n    } catch (err) {\n      console.error('[account] Error while saving account locally: ' + ((err && err.message) || err), err);\n    }\n  }\n\n  async saveLocalSettingsRemotely(source: LocalSettings) {\n    if (!source || !this.isLogin() || source.accountInheritance === false) return; // Skip\n    const account = this.account;\n\n    // Merge local settings into account's settings\n    const settings = UserSettings.fromObject(account.settings) || new UserSettings();\n    const changed = settings.merge(source, this._remoteLocalSettingsKeys);\n\n    if (!changed) return; // Skip if unchanged\n\n    // Save remotely\n    this.account.settings = settings;\n    await this.saveSettingsRemotely(settings);\n  }\n\n  /**\n   * Create or update an user account\n   *\n   * @param account\n   * @param keyPair\n   */\n  protected async saveRemotely(account: Account, keyPair?: Keypair): Promise<Account> {\n    account.pubkey = account.pubkey || (keyPair && Base58.encode(keyPair.publicKey));\n    if (!account.pubkey) throw new Error('Missing account pubkey');\n\n    const now = this._debug && Date.now();\n    if (this._debug) console.debug(`[account] Saving account remotely...`);\n\n    const isNew = isNil(account.id);\n\n    // If this is an update: get existing account's updateDate, to avoid 'version error' when saving\n    if (!isNew) {\n      const existingAccount = await this.load({ fetchPolicy: 'network-only' });\n      if (!existingAccount || !existingAccount.updateDate) {\n        throw { code: ErrorCodes.ACCOUNT_NOT_EXISTS, message: 'ERROR.ACCOUNT_NOT_EXISTS' };\n      }\n      this.copyIdAndUpdateDate(existingAccount, account);\n    }\n\n    // Merging settings - FIXME - Ludo - A revoir avec la MR sur le user settings\n    //account.settings.content['pages'] = this.settings.settings.pages;\n    //account.settings.content['pageHistory'] = this.settings.settings.pageHistory;\n\n    // Convert to json\n    const json = account.asObject(MINIFY_ENTITY_FOR_POD);\n\n    // User not allow to change his profiles\n    delete json.profiles;\n\n    const mutation = isNew ? this.mutations.create : this._apiTokenEnabled ? this.mutations.saveWithTokens : this.mutations.save;\n\n    // Execute mutation\n    const { data } = await this.graphql.mutate<{ data: Account }>({\n      mutation,\n      variables: { data: json },\n      error: {\n        code: ErrorCodes.SAVE_ACCOUNT_ERROR,\n        message: 'ERROR.SAVE_ACCOUNT_ERROR',\n      },\n    });\n\n    // Copy update properties\n    this.copyIdAndUpdateDate(data, account);\n\n    if (this._debug) console.debug(`[account] Account remotely saved in ${Date.now() - now}ms`);\n\n    return account;\n  }\n\n  /**\n   * Create or update user settings\n   *\n   * @param settings\n   */\n  protected async saveSettingsRemotely(settings: UserSettings) {\n    const now = this._debug && Date.now();\n    if (this._debug) console.debug(`[account] Saving settings remotely...`);\n\n    const json = settings.asObject(MINIFY_ENTITY_FOR_POD);\n\n    // Execute mutation\n    const { data } = await this.graphql.mutate<{ data: UserSettings }>({\n      mutation: this.mutations.saveSettings,\n      variables: { data: json },\n      error: {\n        code: ErrorCodes.SAVE_SETTINGS_ERROR,\n        message: 'ERROR.SAVE_SETTINGS_ERROR',\n      },\n    });\n\n    // Copy update properties\n    this.copyIdAndUpdateDateSettings(data, settings);\n\n    if (this._debug) console.debug(`[account] Settings remotely saved in ${Date.now() - now}ms`);\n\n    // Save into account\n    if (this.account) this.account.settings = settings;\n  }\n\n  protected async authenticateAndGetToken(token?: string, counter?: number): Promise<string> {\n    if (!this._cache.pubkey) throw new Error('User not logged');\n\n    if (!counter) console.info('[account] Authentication on pod...');\n\n    if (counter > 4) {\n      if (this._debug) console.debug(`[account] Failed to authentication on pod (after ${counter} attempts)`);\n      throw { code: ErrorCodes.AUTH_SERVER_ERROR, message: 'ERROR.AUTH_SERVER_ERROR' };\n    }\n\n    // Check if valid\n    if (token) {\n      const data = await this.graphql.query<{ authenticate: boolean }, { token: string }>({\n        query: AuthQuery,\n        variables: {\n          token,\n        },\n        error: {\n          code: ErrorCodes.UNAUTHORIZED,\n          message: 'ERROR.UNAUTHORIZED',\n        },\n        fetchPolicy: 'no-cache',\n      });\n\n      // Token is accepted by the server\n      if (data && data.authenticate) {\n        // Store the token\n        this.onAuthTokenChange.next(token);\n\n        console.info(`[account] Authentication on pod [OK] {pubkey: '${this._cache.pubkey.substr(0, 8)}'}`);\n        return token; // return the token\n      }\n\n      // Continue (will retry with another challenge)\n    }\n\n    // Generate a new token\n    const authChallenge = await this.getAuthChallenge();\n    // TODO: check server pubkey as a valid certificate\n\n    // Do the challenge\n    const signature = await CryptoService.sign(authChallenge.challenge, this._cache.keypair);\n    const newToken = `${this._cache.pubkey}:${authChallenge.challenge}|${signature}`;\n\n    // iterate with the new token\n    return await this.authenticateAndGetToken(newToken, (counter || 1) + 1 /* increment */);\n  }\n\n  protected async getAuthChallenge(): Promise<IAuthChallenge> {\n    const challengeError = {\n      code: ErrorCodes.AUTH_CHALLENGE_ERROR,\n      message: 'ERROR.AUTH_CHALLENGE_ERROR',\n    };\n    const { authChallenge } = await this.graphql.query<{\n      authChallenge: IAuthChallenge;\n    }>({\n      query: AuthChallengeQuery,\n      variables: {},\n      error: challengeError,\n      fetchPolicy: 'network-only',\n    });\n\n    // Check challenge\n    if (!authChallenge) throw challengeError; // Should never occur\n\n    // Check server signature\n    const signatureOK = await CryptoService.verify(authChallenge.challenge, authChallenge.signature, authChallenge.pubkey);\n    if (!signatureOK) {\n      console.warn('FIXME: Bad peer signature on auth challenge !', authChallenge);\n    }\n    return authChallenge;\n  }\n\n  protected startListenRemoteChanges(opts?: AccountWatchOptions): Subscription {\n    if (this._listenChangesSubscription) this.stopListenRemoteChanges(); // Stop previous subscription\n    if (this.network.offline) return new Subscription(); // Offline: skip\n\n    this._listenChangesSubscription = this.watchChanges(opts).subscribe({\n      next: (data) => {\n        console.debug(`[account] Remote update detected at ${data.updateDate}`);\n        this.reload();\n      },\n      error: (err) => {\n        if (err && +err.code === ServerErrorCodes.NOT_FOUND) {\n          console.info('[account] [WS] Account not exists anymore: force user to logout...', err);\n          this.logout();\n        } else if (err && +err.code === ServerErrorCodes.UNAUTHORIZED) {\n          console.info('[account] [WS] Account not authorized: force user to logout...', err);\n          this.logout();\n        } else {\n          console.warn('[account] [WS] Received error:', err);\n        }\n      },\n    });\n    this._listenChangesSubscription.add(() => {\n      console.debug(`[account] Stop watching remote changes`);\n      this._listenChangesSubscription = null;\n    });\n    return this._listenChangesSubscription;\n  }\n\n  protected stopListenRemoteChanges() {\n    this._listenChangesSubscription?.unsubscribe();\n  }\n\n  protected watchChanges(opts?: AccountWatchOptions): Observable<Account> {\n    if (!this.started) {\n      // Wait service ready, then loop\n      return from(this.ready()).pipe(switchMap(() => this.watchChanges(opts)));\n    }\n\n    if (!this._cache.pubkey) throw new Error('Not logged in');\n    if (this.network.offline) throw new Error('Cannot watch account changes: network is offline.');\n\n    const variables = {\n      interval: toNumber(opts && opts.intervalInSeconds, this._listenIntervalInSeconds),\n    };\n\n    console.debug(`[account] Watching remote changes, every ${variables.interval}s`);\n\n    return this.graphql\n      .subscribe<{ data: any }>({\n        query: this.subscriptions.listenChanges,\n        variables,\n        error: {\n          code: ErrorCodes.SUBSCRIBE_ACCOUNT_ERROR,\n          message: 'ACCOUNT.ERROR.SUBSCRIBE_ERROR',\n        },\n      })\n      .pipe(\n        map(({ data }) => data),\n        // Keep only if newer\n        filter((data) => {\n          const currentUpdateDate: Moment = fromDateISOString(this._data?.updateDate);\n          const remoteUpdateDate: Moment = fromDateISOString(data?.updateDate);\n          return remoteUpdateDate && (!currentUpdateDate || !remoteUpdateDate.isSame(currentUpdateDate, 'millisecond'));\n        })\n      );\n  }\n\n  protected copyIdAndUpdateDate(source: Account | undefined, target: Account) {\n    if (!source) return;\n\n    target.id = source.id || target.id;\n    target.updateDate = source.updateDate || target.updateDate;\n\n    // Update settings\n    this.copyIdAndUpdateDateSettings(source.settings, target.settings);\n\n    // Update tokens\n    if (this._apiTokenEnabled) {\n      this.copyIdAndUpdateDateToken(source.tokens, target.tokens);\n    }\n  }\n\n  protected copyIdAndUpdateDateSettings(source: UserSettings | undefined, target: UserSettings) {\n    if (!source) return;\n\n    target.id = source.id || target.id;\n    target.updateDate = source.updateDate || target.updateDate;\n  }\n\n  protected copyIdAndUpdateDateToken(sources: UserToken[] | undefined, targets: UserToken[]) {\n    if (isEmptyArray(sources)) return;\n\n    sources.forEach((source) => {\n      const target = targets.find((value) => UserToken.equals(value, source));\n      if (target) {\n        target.id = source.id || target.id;\n        target.creationDate = source.creationDate || target.creationDate;\n        target.updateDate = source.updateDate || target.updateDate;\n        target.token = undefined;\n      }\n    });\n  }\n\n  protected showToast<T = any>(opts: ShowToastOptions): Promise<OverlayEventDetail<T>> {\n    return Toasts.show(this.toastController, this.translate, opts);\n  }\n}\n\nexport function provideAccountService() {\n  return <Provider>{\n    provide: APP_ACCOUNT_SERVICE, useClass: AccountService, deps: [ENVIRONMENT]\n  }\n}\n","import { Moment } from 'moment';\nimport { FormFieldDefinition } from '../../../shared/form/field.model';\nimport { Entity, EntityAsObjectOptions, EntityUtils, IEntity } from './entity.model';\nimport { Department } from './department.model';\nimport { PropertyMap } from '../../../shared/types';\nimport { fromDateISOString, toDateISOString } from '../../../shared/dates';\nimport { isNotNil, isNotNilOrBlank, isNotNilOrNaN, undefinedIfNull } from '../../../shared/functions';\nimport { EntityClass } from './entity.decorators';\n\n// @dynamic\n@EntityClass({ typename: 'SoftwareVO' })\nexport class Software<T extends Software<any> = Software<any>> extends Entity<T, number> implements IEntity<T, number> {\n  static fromObject: (source: any, opts?: any) => Software;\n\n  label: string;\n  name: string;\n  description: string;\n  comments: string;\n  creationDate: Date | Moment;\n  statusId: number;\n  properties: PropertyMap;\n\n  constructor(__typename?: string) {\n    super(__typename || Software.TYPENAME);\n  }\n\n  asObject(options?: EntityAsObjectOptions): any {\n    const target: any = super.asObject(options);\n    target.creationDate = toDateISOString(this.creationDate);\n    target.properties = this.properties;\n    return target;\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.label = source.label;\n    this.name = source.name;\n    this.description = source.description;\n    this.comments = source.comments;\n    this.creationDate = fromDateISOString(source.creationDate);\n    this.statusId = source.statusId;\n\n    if (source.properties && Array.isArray(source.properties)) {\n      this.properties = EntityUtils.getPropertyArrayAsObject(source.properties);\n    } else {\n      this.properties = { ...source.properties };\n    }\n  }\n}\n\n// @dynamic\n@EntityClass({ typename: 'ConfigurationVO' })\nexport class Configuration extends Software<Configuration> {\n  static fromObject: (source: any, opts?: any) => Configuration;\n\n  smallLogo: string;\n  largeLogo: string;\n  backgroundImages: string[];\n  partners: Department[];\n\n  constructor() {\n    super(Configuration.TYPENAME);\n  }\n\n  clone(): Configuration {\n    return this.copy(new Configuration());\n  }\n\n  copy(target: Configuration): Configuration {\n    target.fromObject(this);\n    return target;\n  }\n\n  asObject(options?: EntityAsObjectOptions): any {\n    const target: any = super.asObject(options);\n    target.partners = (this.partners && this.partners.map((p) => p.asObject(options))) || undefined;\n    return target;\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.smallLogo = source.smallLogo;\n    this.largeLogo = source.largeLogo;\n    this.backgroundImages = source.backgroundImages;\n    this.partners = (source.partners && source.partners.map(Department.fromObject)) || undefined;\n  }\n\n  getPropertyAsBoolean(definition: FormFieldDefinition): boolean {\n    const value = this.getProperty(definition);\n    return isNotNil(value) ? value && value !== 'false' : undefined;\n  }\n\n  getPropertyAsInt(definition: FormFieldDefinition): number {\n    const value = this.getProperty(definition);\n    return isNotNil(value) ? parseInt(value) : undefined;\n  }\n\n  getPropertyAsNumber(definition: FormFieldDefinition): number {\n    const value = +this.getProperty(definition);\n    return isNotNilOrNaN(value) ? value : undefined;\n  }\n\n  getPropertyAsNumbers(definition: FormFieldDefinition): number[] {\n    const value = this.getProperty(definition);\n    if (typeof value === 'string') return value.split(',').filter(isNotNilOrBlank).map(parseFloat) || undefined;\n    return isNotNil(value) ? [parseFloat(value)] : undefined;\n  }\n\n  getPropertyAsStrings(definition: FormFieldDefinition): string[] {\n    const value = this.getProperty(definition);\n    return (value && value.split(',').filter(isNotNilOrBlank)) || undefined;\n  }\n\n  getProperty<T = string>(definition: FormFieldDefinition): T {\n    return isNotNil(this.properties[definition.key]) ? this.properties[definition.key] : undefinedIfNull(definition.defaultValue);\n  }\n\n  hasProperty<T = string>(definition: FormFieldDefinition): boolean {\n    return isNotNil(this.properties[definition.key]);\n  }\n}\n","import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { gql } from 'apollo-angular';\nimport { Configuration } from './model/config.model';\nimport { Storage } from '@ionic/storage-angular';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { ErrorCodes } from './errors';\nimport { GraphqlService } from '../graphql/graphql.service';\nimport { FormFieldDefinition, FormFieldDefinitionMap } from '../../shared/form/field.model';\nimport { isNotEmptyArray, isNotNil } from '../../shared/functions';\nimport { FileService } from '../../shared/file/file.service';\nimport { NetworkService } from './network.service';\nimport { CORE_CONFIG_OPTIONS } from './config/core.config';\nimport { Platform, ToastController } from '@ionic/angular';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { TranslateService } from '@ngx-translate/core';\nimport { filter } from 'rxjs/operators';\nimport { EntityServiceLoadOptions, IEntityService } from '../../shared/services/entity-service.class';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { BaseGraphqlService } from './base-graphql-service.class';\nimport { IStartableService } from '../../shared/services/startable-service.class';\nimport { AccountService } from './account.service';\nimport { isMobile } from '../../shared/platforms';\nimport { BaseEntityGraphqlMutations } from './base-entity-service.class';\n\nimport { ImagesUtils } from '../../shared/file/images.utils';\n\nconst CONFIGURATION_STORAGE_KEY = 'configuration';\n\n/* ------------------------------------\n * GraphQL queries\n * ------------------------------------*/\nexport const ConfigFragments = {\n  config: gql`\n    fragment ConfigFragment on ConfigurationVO {\n      id\n      label\n      name\n      description\n      comments\n      properties\n      smallLogo\n      largeLogo\n      backgroundImages\n      partners {\n        id\n        label\n        name\n        logo\n        siteUrl\n        __typename\n      }\n      updateDate\n      creationDate\n      statusId\n      __typename\n    }\n  `,\n};\n\nconst ConfigQueries: { load: any } = {\n  load: gql`\n    query Configuration {\n      data: configuration {\n        ...ConfigFragment\n      }\n    }\n    ${ConfigFragments.config}\n  `,\n};\n\n// Save (create or update) account mutation\nconst ConfigMutations: BaseEntityGraphqlMutations = {\n  save: gql`\n    mutation SaveConfiguration($data: ConfigurationVOInput) {\n      data: saveConfiguration(config: $data) {\n        ...ConfigFragment\n      }\n    }\n    ${ConfigFragments.config}\n  `,\n};\n\nconst ClearCache: any = gql`\n  query ClearCache($name: String) {\n    clearCache(name: $name)\n  }\n`;\n\nconst CacheStatistics: any = gql`\n  query CacheStatistics {\n    cacheStatistics\n  }\n`;\n\nexport const APP_CONFIG_OPTIONS = new InjectionToken<FormFieldDefinitionMap>('defaultOptions');\n\n@Injectable({\n  providedIn: 'root',\n  deps: [APP_CONFIG_OPTIONS],\n})\nexport class ConfigService\n  extends BaseGraphqlService<Configuration, any, number, Configuration>\n  implements IEntityService<Configuration>, IStartableService<Configuration>\n{\n  private _optionDefs: FormFieldDefinition[];\n  private $data = new BehaviorSubject<Configuration>(null);\n\n  get config(): Observable<Configuration> {\n    // If first call: start loading\n    if (!this.started) this.start();\n    return this.$data.pipe(filter(isNotNil));\n  }\n\n  constructor(\n    protected platform: Platform,\n    protected graphql: GraphqlService,\n    protected storage: Storage,\n    protected network: NetworkService,\n    protected file: FileService,\n    protected toastController: ToastController,\n    protected translate: TranslateService,\n    protected accountService: AccountService,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_CONFIG_OPTIONS) defaultOptionsMap: FormFieldDefinitionMap\n  ) {\n    super(graphql, environment);\n\n    this._debug = !environment.production;\n    if (this._debug) console.debug('[config] Creating service');\n\n    this._optionDefs = Object.values({ ...CORE_CONFIG_OPTIONS, ...defaultOptionsMap });\n  }\n\n  protected async ngOnStart(): Promise<Configuration> {\n    console.debug('[config] Starting configuration...');\n\n    const data = await this.loadOrRestoreLocally();\n    this.$data.next(data);\n\n    // Restart if graphql service restart\n    this.registerSubscription(this.graphql.stopSubject.subscribe(() => this.restart()));\n\n    return data;\n  }\n\n  async loadDefault(opts?: EntityServiceLoadOptions): Promise<Configuration> {\n    const now = Date.now();\n    console.debug('[config] Loading Pod configuration...');\n\n    const query = (opts && opts.query) || ConfigQueries.load;\n    const variables = (opts && opts.variables) || undefined;\n    const res = await this.graphql.query<{ data: any }>({\n      query,\n      variables,\n      error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },\n      fetchPolicy: (opts && opts.fetchPolicy) || undefined /*default*/,\n    });\n\n    const data = res?.data && opts?.toEntity !== false ? Configuration.fromObject(res.data) : res?.data;\n    console.info(`[config] Pod configuration loaded in ${Date.now() - now}ms:`, data);\n    return data;\n  }\n\n  async load(id: number, opts?: EntityServiceLoadOptions & { query?: any; variables?: any }): Promise<Configuration> {\n    console.warn('[config] Invalid call of configService.load(id). Please use loadDefault() instead');\n\n    return this.loadDefault(opts);\n  }\n\n  canUserWrite(data: Configuration): boolean {\n    return this.accountService.isAdmin();\n  }\n\n  /**\n   * Save a configuration\n   *\n   * @param config\n   */\n  async save(config: Configuration): Promise<Configuration> {\n    console.debug('[config] Saving Pod configuration...', config);\n\n    const json = config.asObject();\n\n    // Execute mutation\n    const res = await this.graphql.mutate<{ data: any }>({\n      mutation: ConfigMutations.save,\n      variables: {\n        data: json,\n      },\n      error: {\n        code: ErrorCodes.SAVE_CONFIG_ERROR,\n        message: 'ERROR.SAVE_CONFIG_ERROR',\n      },\n    });\n\n    // Copy update properties\n    const savedConfig = res?.data;\n    this.copyIdAndUpdateDate(savedConfig, config);\n\n    console.debug('[config] Pod configuration saved!');\n\n    // Full reload, to let pod recomputing some fields\n    const reloadedConfig = await this.loadDefault({ fetchPolicy: 'network-only' });\n\n    // Update computed properties, from reloaded item\n    config.smallLogo = reloadedConfig?.smallLogo;\n    config.largeLogo = reloadedConfig?.largeLogo;\n    config.backgroundImages = reloadedConfig?.backgroundImages;\n    config.partners = reloadedConfig?.partners;\n\n    // If this is the default config\n    const defaultConfig = this.$data.value;\n    if (isNotNil(defaultConfig) && reloadedConfig?.label === defaultConfig.label) {\n      // Emit update event when is default config\n      this.$data.next(reloadedConfig);\n    }\n\n    // return the original entity\n    return config;\n  }\n\n  async getCacheStatistics(): Promise<string> {\n    const now = Date.now();\n    console.debug('[config] Loading server cache statistics...');\n\n    const res = await this.graphql.query<{ cacheStatistics: any }>({\n      query: CacheStatistics,\n      variables: null,\n      error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },\n      fetchPolicy: 'network-only',\n    });\n\n    const data = (res && res.cacheStatistics) || undefined;\n    console.info(`[config] Server cache statistics loaded in ${Date.now() - now}ms:`, data);\n    return data;\n  }\n\n  async clearCache(opts?: { cacheName?: string }) {\n    const now = Date.now();\n    console.debug('[config] Clear server cache...');\n\n    const variables = (opts && opts.cacheName && { name: opts.cacheName }) || undefined;\n\n    const res = await this.graphql.query<{ clearCache: boolean }>({\n      query: ClearCache,\n      variables,\n      error: { code: ErrorCodes.LOAD_CONFIG_ERROR, message: 'ERROR.LOAD_CONFIG_ERROR' },\n      fetchPolicy: 'no-cache',\n    });\n\n    const data = (res && res.clearCache) || undefined;\n    console.info(`[config] Clear server cache in ${Date.now() - now}ms:`, data);\n    return data;\n  }\n\n  delete(data: Configuration): Promise<any> {\n    throw new Error('Not implemented yet!');\n  }\n\n  listenChanges(id: number): Observable<Configuration | undefined> {\n    return new Subject(); // TODO\n  }\n\n  get optionDefs(): FormFieldDefinition[] {\n    return this._optionDefs;\n  }\n\n  /* -- protected method -- */\n\n  protected copyIdAndUpdateDate(source: Configuration | undefined, target: Configuration) {\n    if (!source) return;\n\n    target.id = source.id || target.id;\n    target.updateDate = source.updateDate || target.updateDate;\n  }\n\n  private async loadOrRestoreLocally(): Promise<Configuration> {\n    let data: Configuration;\n    let wasJustLoaded = false;\n    if (this.network.online) {\n      try {\n        data = await this.loadDefault({ fetchPolicy: 'network-only' });\n        wasJustLoaded = true;\n      } catch (err) {\n        // Log, then continue\n        console.error((err && err.message) || err, err);\n      }\n    }\n\n    // Save it into local storage, for next startup\n    if (data) {\n      setTimeout(() => this.storeLocally(data), 2000);\n    }\n\n    // If not loaded remotely: try to restore it\n    else {\n      data = await this.restoreLocally();\n    }\n\n    // Make sure label has been filled\n    data.label = data.label || this.environment.name;\n\n    // Reset name (if same as label)\n    data.name = data.name !== data.label ? data.name : undefined;\n\n    // Check compatible version\n    if (wasJustLoaded) {\n      // TODO\n    }\n\n    return data;\n  }\n\n  private async restoreLocally(): Promise<Configuration> {\n    let data: Configuration;\n\n    // Try to load from local storage\n    const value: any = await this.storage.get(CONFIGURATION_STORAGE_KEY);\n    if (value) {\n      console.debug('[config] Restoring configuration from local storage...');\n      if (typeof value === 'string') {\n        try {\n          data = Configuration.fromObject(JSON.parse(value));\n        } catch (err) {\n          console.error(`Failed to parse config found in local storage: ${(err && err.message) || err}`, err);\n        }\n      } else if (typeof value === 'object') {\n        data = Configuration.fromObject(value);\n      }\n\n      console.debug('[config] Restoring configuration [OK]');\n    }\n\n    // Or load default value, from the environment\n    if (!data) {\n      console.debug('[config] No configuration found. Using environment...');\n      data = Configuration.fromObject(this.environment as any);\n    }\n\n    return data;\n  }\n\n  private async storeLocally(data?: Configuration) {\n    // Nothing to store : reset\n    if (!data) {\n      await this.storage.remove(CONFIGURATION_STORAGE_KEY);\n    }\n    // Config exists: store it in the local storage\n    else {\n      let now = this._debug && Date.now();\n\n      // Convert images, for offline usage\n      if (this.network.online && isMobile(window)) {\n        const jobs = [];\n\n        // Download logos\n        if (data.largeLogo && data.largeLogo.startsWith('http')) {\n          const largeLogo = ImagesUtils.getImageAndCredit(data.largeLogo)?.image; // Remove credit\n          jobs.push(this.file.getImage(largeLogo).then((imgUrl) => (data.largeLogo = imgUrl)));\n        }\n        if (data.smallLogo && data.smallLogo.startsWith('http')) {\n          const smallLogo = ImagesUtils.getImageAndCredit(data.smallLogo)?.image; // Remove credit\n          jobs.push(this.file.getImage(smallLogo).then((imgUrl) => (data.smallLogo = imgUrl)));\n        }\n\n        // Background images\n        if (isNotEmptyArray(data.backgroundImages)) {\n          const options = {\n            maxWidth: this.platform.width(),\n            maxHeight: this.platform.height(),\n          };\n\n          // Convert the FIRST image found\n          // WARN: it's NOT necessary to convert ALL image, but only one, for smaller memory footprint\n          const index = data.backgroundImages.findIndex((img) => img?.startsWith('http'));\n          if (index !== -1) {\n            const image = ImagesUtils.getImageAndCredit(data.backgroundImages[index])?.image; // Remove credit\n            jobs.push(this.file.getImage(image, options).then((dataUrl) => (data.backgroundImages = [dataUrl])));\n          }\n        }\n\n        // Partners\n        if (isNotEmptyArray(data.partners)) {\n          data.partners.forEach((dep) => {\n            if (dep?.logo && dep.logo.startsWith('http')) {\n              jobs.push(\n                this.file\n                  .getImage(dep.logo, {\n                    maxHeight: 50 /*see home page CSS */,\n                  })\n                  .then((img) => (dep.logo = img))\n                  .catch((err) => {\n                    console.error((err && err.message) || err);\n                    delete dep.logo;\n                  })\n              );\n            }\n          });\n        }\n\n        if (jobs.length) {\n          if (this._debug) console.debug(`[config] Fetching ${jobs.length} images...`);\n          try {\n            await Promise.all(jobs);\n            if (this._debug) console.debug(`[config] Fetching ${jobs.length} images [OK] in ${Date.now() - now}ms`);\n          } catch (err) {\n            console.error(`[config] Failed to fetch image(s): ${(err && err.message) || err}`, err);\n          }\n        }\n      }\n\n      // Saving config to storage\n      {\n        now = this._debug && Date.now();\n        if (this._debug) console.debug('[config] Saving config into local storage...');\n        await this.storage.set(CONFIGURATION_STORAGE_KEY, data.asObject());\n        if (this._debug) console.debug(`[config] Saving config into local storage [OK] in ${Date.now() - now}ms`);\n      }\n    }\n  }\n\n  protected async showToast(opts: ShowToastOptions) {\n    await Toasts.show(this.toastController, this.translate, opts);\n  }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { Platform, ToastController } from '@ionic/angular';\nimport { NetworkService } from './network.service';\nimport { AuthTokenType } from './network.types';\nimport { Platforms } from '@ionic/core';\nimport { LocalSettingsService } from './local-settings.service';\nimport { CacheService } from 'ionic-cache';\nimport { AudioProvider } from '../../shared/audio/audio';\nimport { Platform as CdkPlatform } from '@angular/cdk/platform';\n\nimport { isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';\nimport { EntitiesStorage } from './storage/entities-storage.service';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { TranslateService } from '@ngx-translate/core';\nimport { AccountService } from './account.service';\nimport { BehaviorSubject, combineLatest, from, Observable, of, Subscription, timer } from 'rxjs';\nimport { catchError, skip, tap } from 'rxjs/operators';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { ConfigService } from './config.service';\nimport { CORE_CONFIG_OPTIONS } from './config/core.config';\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\nimport { Downloader, DownloadRequest, NotificationVisibility } from '@awesome-cordova-plugins/downloader/ngx';\nimport { StartableService } from '../../shared/services/startable-service.class';\nimport { isMobile, isWindows } from '../../shared/platforms';\nimport { VersionUtils } from '../../shared/version/versions';\nimport { FilesUtils, MimeTypes } from '../../shared/file/file.utils';\nimport { UriUtils } from '../../shared/file/uri.utils';\nimport { SplashScreen } from '@capacitor/splash-screen';\nimport { StatusBar, Style } from '@capacitor/status-bar';\nimport { Browser, OpenOptions } from '@capacitor/browser';\nimport { Keyboard } from '@capacitor/keyboard';\nimport { CapacitorPlugins } from '../../shared/capacitor/plugins';\nimport { locale as momentLocale } from 'moment';\nimport { ILogger, ILoggingService } from '../../shared/logging/logger.model';\nimport { APP_LOGGING_SERVICE } from '../../shared/logging/logging-service.class';\nimport { Clipboard as CdkClipboard } from '@angular/cdk/clipboard';\nimport { Clipboard } from '@capacitor/clipboard';\nimport { WriteOptions } from '@capacitor/clipboard/dist/esm/definitions';\nimport { EdgeToEdge } from '@capawesome/capacitor-android-edge-to-edge-support';\nimport { getColorContrast, getColorShade, getColorTint, hexToRgbArray, isLightColor, mixHex } from '../../shared/graph/colors.utils';\nimport { Peer } from './model/peer.model';\nimport { UrlUtils } from '../../shared/file/url.utils';\nimport { APP_BASE_HREF } from '@angular/common';\n\nexport const AndroidOsEnvironment = Object.freeze({\n  DIRECTORY_DOWNLOADS: 'Download',\n  DIRECTORY_DOWNLOADS_OLD: 'Downloads', // Old name, for older Android version\n  // TODO: find value for this. See https://developer.android.com/reference/android/os/Environment#getExternalStorageState(java.io.File)\n  // DIRECTORY_MUSIC,\n  // DIRECTORY_PODCASTS,\n  // DIRECTORY_RINGTONES,\n  // DIRECTORY_ALARMS,\n  // DIRECTORY_NOTIFICATIONS,\n  // DIRECTORY_PICTURES,\n  // DIRECTORY_MOVIES,\n  // DIRECTORY_DCIM,\n  // DIRECTORY_DOCUMENTS,\n  // DIRECTORY_AUDIOBOOKS,\n});\n\n@Injectable({ providedIn: 'root' })\nexport class PlatformService extends StartableService {\n  private _logger: ILogger;\n  private _mobile: boolean;\n  private _desktop: boolean;\n  private _cordova: boolean;\n  private _capacitor: boolean;\n  private _android: boolean;\n  private _ios: boolean;\n\n  busySubject = new BehaviorSubject<boolean>(false);\n\n  constructor(\n    private ionicPlatform: Platform,\n    private cdkPlatform: CdkPlatform,\n    private cdkClipboard: CdkClipboard,\n    private toastController: ToastController,\n    private translate: TranslateService,\n    private dateAdapter: MomentDateAdapter,\n    private entitiesStorage: EntitiesStorage,\n    private settings: LocalSettingsService,\n    private networkService: NetworkService,\n    private accountService: AccountService,\n    private configService: ConfigService,\n    private cache: CacheService,\n    private audioProvider: AudioProvider,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_LOGGING_SERVICE) loggingService: ILoggingService,\n    @Optional() private downloader: Downloader,\n    @Optional() @Inject(APP_BASE_HREF) protected appBaseHref: string\n  ) {\n    super(ionicPlatform);\n\n    this._logger = loggingService?.getLogger('platform');\n    this._debug = !environment.production;\n    if (this._debug) console.debug('[platform] Creating service');\n\n    if (this._logger) {\n      this._logger.debug('ctor', 'Creating service');\n      ionicPlatform.pause.subscribe(() => {\n        this._logger.info('ctor', 'Pause app');\n      });\n      ionicPlatform.resume.subscribe(() => {\n        this._logger.info('ctor', 'Resume app');\n      });\n    }\n  }\n  private _downloadingJobs: Map<string, Observable<string>> = new Map();\n\n  private checkAppVersionTimer: Subscription;\n\n  is(platformName: Platforms): boolean {\n    switch (platformName) {\n      case 'mobile':\n        // Exclude Windows touch screens - see sumaris-app issues #323 and #346\n        return isMobile(window);\n      case 'mobileweb':\n        // Exclude Windows touch screens - see sumaris-app issues #323 and #346\n        return this.ionicPlatform.is(platformName) && !isWindows(window);\n      default:\n        return this.ionicPlatform.is(platformName);\n    }\n  }\n\n  get mobile(): boolean {\n    return isNotNil(this._mobile) ? this._mobile : this.is('mobile');\n  }\n\n  /**\n   * Say if opened has been opened inside an Android or iOs App.\n   * This is used to known if there is cordova features\n   */\n  isCapacitor(): boolean {\n    return this._capacitor;\n  }\n\n  /**\n   * Say if opened has been opened inside an Android or iOs App.\n   * This is used to known if there is cordova features\n   */\n  isCordova(): boolean {\n    return this._cordova;\n  }\n\n  isAndroidCordova(): boolean {\n    return (this._android && this._cordova) || false;\n  }\n\n  isIOSCordova(): boolean {\n    return (this._ios && this._cordova) || false;\n  }\n\n  isAndroid(): boolean {\n    return this._android || false;\n  }\n\n  isIOS(): boolean {\n    return this._ios || false;\n  }\n\n  isMacOSDesktop(): boolean {\n    return this._desktop && this.isCordova();\n  }\n\n  /**\n   * Is a native App (and NOT a mobile web)\n   */\n  isApp(): boolean {\n    return this.isAndroidCordova() || this.isIOSCordova();\n  }\n\n  isWeb(): boolean {\n    return !this.isApp();\n  }\n\n  isMobileWeb(): boolean {\n    return this.mobile && this.isWeb();\n  }\n\n  get canDownload(): boolean {\n    return this.downloader && this.isAndroidCordova();\n  }\n\n  get canOpenFile(): boolean {\n    return false; // TODO: fixme using @capacitor/filesystem ?\n  }\n\n  width(): number {\n    return this.ionicPlatform.width();\n  }\n\n  height(): number {\n    return this.ionicPlatform.height();\n  }\n\n  protected async ngOnStart(): Promise<any> {\n    const now = Date.now();\n    this.accountService.tokenType = undefined;\n    console.debug('[platform] Starting platform...');\n    this._logger?.info('ngOnStart', 'Starting platform...');\n\n    try {\n      this._mobile = this.is('mobile');\n      this._desktop = this.is('desktop');\n      this._cordova = this.is('cordova');\n      this._capacitor = this.is('capacitor');\n      this._android = this.is('android');\n      this._ios = this.is('ios');\n\n      const logMessage = `Detected {mobile: ${this._mobile}, desktop: ${this._desktop}, cordova: ${this._cordova}, capacitor: ${this._capacitor}, android: ${this._android}, ios: ${this._ios}}`;\n      console.info('[platform] ' + logMessage);\n      this._logger?.info('ngOnStart', logMessage);\n\n      // Configure theme\n      await this.configureTheme(this._mobile);\n\n      // Configure Capacitor plugins\n      await this.configureCapacitorPlugins();\n\n      // Configure translation\n      this.configureTranslate();\n\n      // Configure cache\n      this.configureCache();\n\n      // Start root services\n      await Promise.all([this.entitiesStorage.ready(), this.settings.ready(), this.networkService.ready(), this.audioProvider.ready()]);\n\n      // Check if web app has update, and reload page if need\n      if (this.isWeb() && this.environment.production) {\n        await this.checkAppVersion({ canReload: true });\n      }\n\n      // Update cache configuration when network changed\n      this.registerSubscription(\n        this.networkService.onNetworkStatusChanges\n          .pipe(\n            skip(1) // Already done once, so we skip the first event\n          )\n          .subscribe((type) => this.configureCache(type !== 'none'))\n      );\n\n      console.info(\n        `[platform] Starting platform [OK] {mobile: ${this._mobile}, capacitor: ${this._capacitor}, web: ${this.isWeb()}, downloader: ${this.canDownload}} in ${Date.now() - now}ms`\n      );\n\n      // Pass auth token\n      this.registerSubscription(\n        this.configService.config.subscribe((config) => {\n          if (!config) return; // Skip\n\n          // Update authentication type\n          const tokenType: AuthTokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE) as AuthTokenType;\n          if (isNotNilOrBlank(tokenType) && this.accountService.tokenType !== tokenType) {\n            console.info(`[platform] Using auth token type {${tokenType}}`);\n            this.accountService.tokenType = tokenType;\n          }\n\n          // Enable auth API using tokens\n          const authApiEnabled = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.AUTH_API_TOKEN_ENABLED);\n          if (isNotNil(authApiEnabled) && authApiEnabled !== this.accountService.apiTokenEnabled) {\n            console.info(`[platform] Using auth API tokens ? ${authApiEnabled}}`);\n            this.accountService.apiTokenEnabled = authApiEnabled;\n          }\n        })\n      );\n\n      // Hide the splashscreen (if mobile or macOS) - after 1s\n      if (this._mobile || this.isMacOSDesktop()) {\n        setTimeout(async () => {\n          await SplashScreen.hide();\n\n          // Play startup sound (is mobile)\n          if (this._mobile) {\n            await this.audioProvider.playStartupSound();\n          }\n        }, 1000);\n      }\n\n      // Check if new version, every 1 min\n      const checkIntervalMs = (this.environment.checkAppVersionIntervalInSeconds || 0) * 1000;\n      if (this.isWeb() && this.environment.production && checkIntervalMs > 0) {\n        this.checkAppVersionTimer?.unsubscribe();\n        const subscription = timer(checkIntervalMs, checkIntervalMs).subscribe((_) =>\n          this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ })\n        );\n        this.checkAppVersionTimer = subscription;\n        this.registerSubscription(subscription);\n        subscription.add(() => this.unregisterSubscription(subscription));\n      }\n    } catch (err) {\n      // Manage startup error\n      return this.onStartupError(err);\n    }\n  }\n\n  /**\n   * Used to show a backdrop when platform is busy (e.g. from the app.component.ts)\n   */\n  markAsBusy() {\n    if (!this.busySubject.value) {\n      this.busySubject.next(true);\n    }\n  }\n\n  markAsNotBusy() {\n    if (this.busySubject.value) {\n      this.busySubject.next(false);\n    }\n  }\n\n  async open(url: string, opts?: Omit<OpenOptions, 'url'>): Promise<void> {\n    console.info(`[platform] Opening link: ${url}`);\n    if (this._mobile && this._capacitor) {\n      await Browser.open({ url, ...opts });\n    } else {\n      window.open(url, opts?.windowName);\n    }\n  }\n\n  getDownloadingJob(uri: string): Observable<string> {\n    return this._downloadingJobs.get(uri);\n  }\n\n  download(request: { uri: string; filename?: string } & Partial<DownloadRequest>): Observable<string | undefined> {\n    if (!request || !request.uri) throw new Error(\"Missing argument 'request' or 'request.uri'\");\n\n    if (this.canDownload) {\n      // Check if not already downloading file\n      let job$ = this._downloadingJobs.get(request.uri);\n      if (job$) return job$;\n\n      // Compute subPath (final filename)\n      let subPath =\n        request.destinationInExternalPublicDir?.subPath ||\n        request.destinationInExternalFilesDir?.subPath ||\n        request.filename ||\n        UriUtils.getFilename(request.uri) ||\n        request.title ||\n        'download';\n\n      subPath = subPath\n        .toLowerCase()\n        // Remove spaces\n        .replace(/\\s+/g, '-');\n\n      // Force APK to finish with '.apk'\n      if (request.mimeType === MimeTypes.ANDROID_APK && !subPath.toLowerCase().endsWith('.apk')) {\n        subPath += '.apk';\n      }\n\n      const downloadRequest = <DownloadRequest>{\n        visibleInDownloadsUi: true,\n        notificationVisibility: NotificationVisibility.VisibleNotifyCompleted,\n        ...request,\n        filename: undefined, // Force unset\n        destinationInExternalPublicDir: !request.destinationInExternalFilesDir\n          ? {\n              dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,\n              ...request.destinationInExternalPublicDir,\n              subPath,\n            }\n          : undefined,\n        destinationInExternalFilesDir: request.destinationInExternalFilesDir\n          ? {\n              dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,\n              ...request.destinationInExternalFilesDir,\n              subPath,\n            }\n          : undefined,\n      };\n\n      // Start download\n      console.debug('[platform] Downloading, using request: ' + JSON.stringify(downloadRequest));\n      job$ = from(this.downloader.download(downloadRequest));\n\n      // Remember this request uri\n      this._downloadingJobs.set(downloadRequest.uri, job$);\n      return job$.pipe(\n        tap((location) => {\n          console.info('[platform] File successfully downloaded at:' + location);\n          // Forget job\n          this._downloadingJobs.delete(downloadRequest.uri);\n          return location;\n        }),\n        catchError((err) => {\n          console.error('[platform] Unable to download: ' + ((err && err.message) || err));\n          // Forget the request\n          this._downloadingJobs.delete(downloadRequest.uri);\n\n          // Retry with another location - issue in older Android version\n          if (downloadRequest.destinationInExternalPublicDir?.dirType === AndroidOsEnvironment.DIRECTORY_DOWNLOADS) {\n            downloadRequest.destinationInExternalPublicDir.dirType = AndroidOsEnvironment.DIRECTORY_DOWNLOADS_OLD;\n            return this.download(downloadRequest);\n          }\n          throw err;\n        })\n      );\n    }\n\n    // Fallback (if not Android and Capacitor): opening the URI\n    // TODO: find a way to download under iOS (see https://www.c-sharpcorner.com/article/how-to-download-a-file-using-file-transfer-plugin-in-ionic-3/)\n    else {\n      FilesUtils.downloadUri(request.uri, request.filename);\n      return of(undefined);\n    }\n  }\n\n  async copyToClipboard(data: string | WriteOptions, opts?: ShowToastOptions) {\n    const value = typeof data === 'string' ? data : data.string;\n    let copied = true;\n    if (this.isAndroidCordova()) {\n      const writeOptions = typeof data === 'string' ? { string: value } : data;\n      await Clipboard.write(writeOptions);\n    } else {\n      copied = this.cdkClipboard.copy(value);\n    }\n\n    if (copied) {\n      // Show toast\n      if (opts && isNotNilOrBlank(opts.message)) {\n        await Toasts.show(this.toastController, this.translate, {\n          type: 'info',\n          ...opts,\n        });\n      }\n    } else {\n      console.error('[platform] Unable to copy to clipboard: ' + data);\n    }\n  }\n\n  async updateTheme(options: { darkMode?: boolean; colors?: { [color: string]: string }; vars?: { [color: string]: string } }) {\n    if (!options) return;\n    const style = document.documentElement.style;\n\n    // options.colors = {\n    //   ...options.colors,\n    //   primary: '#124541',\n    // };\n\n    // Set colors\n    if (options.colors) {\n      console.info('[platform] Changing theme colors ', options.colors);\n\n      // Add 100 & 900 color for primary and secondary color\n      ['primary', 'secondary'].forEach((colorName) => {\n        const color = options.colors[colorName];\n        options.colors[colorName + '100'] = (color && mixHex('#ffffff', color, 10)) || undefined;\n        options.colors[colorName + '900'] = (color && mixHex('#000000', color, 12)) || undefined;\n      });\n\n      Object.getOwnPropertyNames(options.colors).forEach((colorName) => {\n        // Remove existing value\n        style.removeProperty(`--ion-color-${colorName}`);\n        style.removeProperty(`--ion-color-${colorName}-rgb`);\n        style.removeProperty(`--ion-color-${colorName}-contrast`);\n        style.removeProperty(`--ion-color-${colorName}-contrast-rgb`);\n        style.removeProperty(`--ion-color-${colorName}-shade`);\n        style.removeProperty(`--ion-color-${colorName}-tint`);\n\n        // Set new value, if any\n        const color = options.colors[colorName];\n        if (isNotNilOrBlank(color)) {\n          // Base color\n          style.setProperty(`--ion-color-${colorName}`, color);\n          style.setProperty(`--ion-color-${colorName}-rgb`, hexToRgbArray(color).join(', '));\n\n          // Contrast color\n          const contrastColor = getColorContrast(color, true);\n          style.setProperty(`--ion-color-${colorName}-contrast`, contrastColor);\n          style.setProperty(`--ion-color-${colorName}-contrast-rgb`, hexToRgbArray(contrastColor).join(', '));\n\n          // Shade color\n          style.setProperty(`--ion-color-${colorName}-shade`, getColorShade(color));\n\n          // Tint color\n          style.setProperty(`--ion-color-${colorName}-tint`, getColorTint(color));\n        }\n      });\n    }\n\n    // Set CSS vars\n    if (options.vars) {\n      console.info('[platform] Changing theme vars ', options.vars);\n      Object.getOwnPropertyNames(options.vars).forEach((varName) => {\n        // Set new value, if any\n        const value = options.vars[varName];\n        if (isNotNilOrBlank(value)) {\n          style.setProperty(varName, value);\n        } else {\n          style.removeProperty(varName);\n        }\n      });\n    }\n\n    // Set dark mode\n    if (isNotNil(options.darkMode)) {\n      await this.toggleDarkTheme(options.darkMode);\n    }\n  }\n\n  async toggleDarkTheme(enable: boolean) {\n    const classList = document.documentElement.classList;\n\n    // Toggle the class\n    const wasEnabled = classList.contains('dark');\n    if (enable !== wasEnabled) {\n      console.debug(`[platform] ${enable ? 'Enable' : 'Disable'} dark mode...`);\n      classList.toggle('dark', enable);\n\n      // If mobile (Android or iOS)\n      if (this.isApp() && (this.isIOS() || this.isAndroid())) {\n        // Read the primary color, if any\n        const style = getComputedStyle(document.documentElement);\n        const primaryColor = style.getPropertyValue('--ion-color-primary')?.trim();\n        const backgroundColor = !primaryColor || enable ? '#000000' : primaryColor;\n\n        // Configure status bar style\n        const statusBarStyle = isLightColor(backgroundColor) ? Style.Light : Style.Dark;\n        console.debug(`[platform] StatusBar icons style: ${statusBarStyle} ...`);\n        try {\n          await StatusBar.setStyle({ style: statusBarStyle });\n        } catch (err) {\n          console.error('[platform] Error while setting StatusBar icons style', err);\n        }\n\n        // Configure status bar background color (always use black on dark mode)\n\n        if (this.isAndroid()) {\n          try {\n            console.debug(`[platform] EdgeToEdge background color: ${backgroundColor}`);\n            await EdgeToEdge.setBackgroundColor({ color: backgroundColor });\n          } catch (err) {\n            console.error('[platform] Error while setting EdgeToEdge background color', err);\n            await StatusBar.setBackgroundColor({ color: backgroundColor });\n          }\n        } else {\n          try {\n            console.debug(`[platform] StatusBar background color: ${backgroundColor}`);\n            await StatusBar.setBackgroundColor({ color: backgroundColor });\n          } catch (err) {\n            console.error('[platform] Error while setting StatusBar background color', err);\n          }\n        }\n      }\n    }\n  }\n\n  toggleHighContrast(enable: boolean) {\n    if (enable && !document.documentElement.classList.contains('high-contrast')) {\n      console.debug('[platform] Enable high contrast...');\n    }\n    document.documentElement.classList.toggle('high-contrast', enable);\n  }\n\n  /**\n   * Handle deep links (Android App Links / iOS Universal Links)\n   */\n  async addDeepLinkListener(listenerFn: (deppLink: { peerUrl: string; path: string }) => void): Promise<Subscription> {\n    if (!this.isApp() || typeof listenerFn !== 'function') return; // Skip\n\n    // Handle deep links (Android App Links / iOS Universal Links)\n    try {\n      console.info('[platform] Start listen deep links');\n\n      const { App } = await import('@capacitor/app');\n      const listener = await App.addListener('appUrlOpen', (data: any) => {\n        try {\n          console.info(`[platform] Processing deep link: ${data?.url}`);\n\n          const url = new URL(data?.url || '');\n\n          // Get the peer\n          const peer = Peer.parseUrl(url);\n          peer.path = undefined; // FIXME We clean the path (=baseHref) as we cannot detect it from a deep link\n\n          // Build an absolute path from the URL pathname and search\n          const path = UrlUtils.addTrailingSlash(UrlUtils.cleanUrl(url.pathname || '/'));\n          const query = url.search || '';\n          const fullPath = `${path}${query}`;\n\n          console.info(`[platform] Processing deep link [OK] - peer: ${peer.url} path: ${fullPath}`);\n\n          // Call the given listener\n          listenerFn({ peerUrl: peer.url, path: fullPath });\n        } catch (e) {\n          console.warn('[platform] Failed to handle deep link', e, data);\n        }\n      });\n      let subscription = new Subscription();\n      subscription.add(() => {\n        console.info('[platform] Stop listen deep links');\n        listener.remove();\n        this.unregisterSubscription(subscription);\n        subscription = null; // Forget the subscription\n      });\n      this.registerSubscription(subscription);\n      return subscription;\n    } catch (err) {\n      console.warn('[platform] Capacitor App plugin not available for deep links', err);\n    }\n  }\n\n  showToast(opts: ShowToastOptions): Promise<HTMLIonToastElement> {\n    if (!this.toastController) throw new Error(\"Missing toastController in component's constructor\");\n    return new Promise((resolve) =>\n      Toasts.show(this.toastController, this.translate, {\n        ...opts,\n        onWillPresent: (t) => resolve(t),\n      })\n    );\n  }\n\n  async closeToast(id?: string) {\n    return this.toastController?.dismiss(null, null, id);\n  }\n\n  /* -- protected methods -- */\n\n  protected async configureTheme(mobile: boolean, win: any = window) {\n    // Listen for changes to settings dark mode\n    if (this.environment.allowDarkMode) {\n      const isScreen$ = new Observable<boolean>((observer) => {\n        const matchMedia = win.matchMedia('screen');\n        matchMedia.addEventListener('change', (e) => observer.next(e.matches));\n        observer.next(matchMedia.matches);\n      });\n      this.registerSubscription(\n        combineLatest([isScreen$, this.settings.darkMode$]).subscribe(([isScreen, enable]) => this.toggleDarkTheme(isScreen && enable))\n      );\n    } else {\n      await this.toggleDarkTheme(false);\n    }\n\n    // Workaround, for MS Windows touch screen (detected as mobile, but forced as desktop)\n    if (\n      !mobile &&\n      (win.document.documentElement?.classList.contains('plt-mobile') || win.document.documentElement.classList?.contains('plt-mobileweb'))\n    ) {\n      console.warn('[platform] Force class list to: <html class=\"plt-desktop\">. Workaround for Windows touch screen.');\n      win.document.documentElement.classList.remove('plt-mobile', 'plt-mobileweb');\n      win.document.documentElement.classList.add('plt-desktop');\n    }\n  }\n\n  protected async configureCapacitorPlugins() {\n    if (!this._capacitor) return; // Skip\n\n    console.info('[platform] Configuring Capacitor plugins...');\n\n    let pluginName: string;\n    try {\n      pluginName = CapacitorPlugins.EdgeToEdge;\n      if (this.isApp() && this.isAndroid()) {\n        await EdgeToEdge.enable();\n      }\n\n      pluginName = CapacitorPlugins.StatusBar;\n      if (this.isApp()) {\n        // Avoid overlays (Android 15 or iOS)\n        await StatusBar.setOverlaysWebView({ overlay: false });\n      }\n\n      // Hide accessory bar (iOS only)\n      if (this.isApp() && this.isIOS()) {\n        pluginName = CapacitorPlugins.Keyboard;\n        // Let Capacitor config handle accessory bar\n        //await Keyboard.setAccessoryBarVisible({ isVisible: false });\n      }\n    } catch (err) {\n      const logMessage = `Error while configuring ${pluginName} plugin: ${err.message || err}\\n${err?.originalStack || JSON.stringify(err)}`;\n      console.error('[platform] ' + logMessage);\n      this._logger?.error('configureCapacitorPlugins', logMessage);\n    }\n  }\n\n  protected configureTranslate() {\n    console.info('[platform] Configuring i18n ...');\n\n    // this language will be used as a fallback when a translation isn't found in the current language\n    this.translate.setDefaultLang(this.environment.defaultLocale);\n    // apply locale immediately\n    this.applyLocale(this.environment.defaultLocale);\n\n    // When locale changes, apply to date adapter\n    this.registerSubscription(\n      this.translate.onLangChange.subscribe((event) => {\n        if (event && event.lang) {\n          this.applyLocale(event.lang);\n        }\n      })\n    );\n\n    this.registerSubscription(\n      this.settings.onChange.subscribe((data) => {\n        if (data) {\n          // Apply locale\n          if (data.locale) {\n            if (data.locale !== this.translate.currentLang) {\n              this.translate.use(data.locale);\n            }\n          } else {\n            // Applying default, when settings has no locale property (hotfix - ludovic.pecquot@e-is.pro - 14/11/2021 - since v1.20.42)\n            console.warn('[platform] No locale found in settings: applying defaultLocale: ', this.environment.defaultLocale);\n            this.translate.use(this.environment.defaultLocale);\n          }\n        }\n      })\n    );\n\n    // Use account's settings, (like locale), when account inheritance enabled\n    this.registerSubscription(\n      this.accountService.onLogin.subscribe(async (account) => {\n        if (account.settings && this.settings.settings.accountInheritance) {\n          console.debug('[platform] Copying account settings into local settings...');\n          await this.settings.apply(account.settings.asLocalSettings());\n        }\n      })\n    );\n  }\n\n  protected applyLocale(locale: string) {\n    // force 'en' as 'en_GB'\n    if (locale === 'en') {\n      locale = 'en_GB';\n    }\n\n    // config moment lib\n    try {\n      momentLocale(locale);\n      console.debug('[platform] Use locale {' + locale + '}');\n    } catch (err) {\n      // If error, fallback to en\n      momentLocale('en');\n      console.warn('[platform] Unknown locale for moment lib. Using default [en]');\n    }\n\n    // Config date adapter\n    this.dateAdapter.setLocale(momentLocale());\n  }\n\n  protected configureCache(online?: boolean) {\n    online = toBoolean(online, this.cache.isOnline());\n    const cacheTTL = online ? 3600 /* 1h */ : 3600 * 24 * 30; /* 1 month */\n    console.info(`[platform] Configuring cache [OK] {online: ${online}, timeToLive: ${cacheTTL / 3600}h, offlineInvalidate: false}`);\n    this.cache.setDefaultTTL(cacheTTL);\n    this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline\n  }\n\n  protected async checkAppVersion(opts?: { canReload?: boolean; silent?: boolean }) {\n    if (this.networkService.offline || !this.isWeb()) return; // Skip\n\n    const silent = opts?.silent === true;\n    const production = this.environment.production;\n    const canAutoReload = !opts || opts.canReload !== false;\n\n    if (!silent) console.info('[platform] Checking remote app version...');\n\n    const actualVersion = this.environment.version;\n    if (isNilOrBlank(actualVersion)) {\n      console.error(\"[platform] Missing required value for 'environment.version'. Cannot check remote app version.\");\n      this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists\n      return; // Skip\n    }\n\n    const remoteVersion = (await this.networkService.getAppVersion(this.appBaseHref)).trim();\n    if (isNilOrBlank(remoteVersion)) {\n      if (production && !silent) console.error('[platform] Cannot load remote app version. Skipping version check');\n      this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists\n      return;\n    }\n\n    if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {\n      if (!silent) console.info(`[platform] Checking remote app version [OK] {remote: '${remoteVersion}', actual: '${actualVersion}'}`);\n      return;\n    }\n\n    // If newer version exists\n    let reloadPath = location.href.replace(/[&?]version=[^&]*/gi, ''); // Remove old version in query params\n    reloadPath += reloadPath.indexOf('?') === -1 ? '?' : '&'; // Add query param separator\n    reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)\n\n    // Already try to reload, but version still bad\n    if (reloadPath === location.href) {\n      if (canAutoReload)\n        console.error(\n          `[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`\n        );\n      // Stop timer, to avoid infinite loop\n      this.checkAppVersionTimer?.unsubscribe();\n      return;\n    }\n\n    console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);\n\n    // Auto reload\n    if (canAutoReload) {\n      console.info('[platform] Will reloading at ' + reloadPath);\n      location.href = reloadPath;\n      // App stop\n    }\n    // Ask user to reload\n    else {\n      // Stop timer, to avoid infinite loop\n      this.checkAppVersionTimer?.unsubscribe();\n\n      // Display a reload toast\n      await this.showToast({\n        message: 'CONFIRM.RELOAD_APP',\n        messageParams: { version: remoteVersion, name: this.environment.name },\n        type: 'info',\n        duration: -1,\n        showCloseButton: true,\n        buttons: [\n          // Reload button\n          {\n            text: this.translate.instant('COMMON.BTN_UPDATE'),\n            side: 'end',\n            handler: () => {\n              location.href = reloadPath;\n              return true;\n            },\n          },\n        ],\n      });\n    }\n  }\n\n  protected async onStartupError(err) {\n    console.error('[platform] Failed starting the platform! ' + JSON.stringify(err));\n    let message = (err && err.message) || err;\n    const detailsMessage = err && ((err.details && err.details.message) || err.details);\n    // Set specific error when Firefox is in private mode or history never remembered (see Mantis Ifremer #56441)\n    if (err.code === 11 && this.cdkPlatform.FIREFOX) {\n      message = 'ERROR.FIREFOX_NO_STORAGE';\n    }\n    if (this.translate) {\n      message = await this.translate.instant(message);\n      if (err && err.code) {\n        message += ` {code: ${err.code}}`;\n      }\n    } else {\n      message = `Fatal error: Please contact your administrator.\\n\\n{code: ${(err && err.code) || 'null'}, message: \"${message}\"}`;\n    }\n    if (this.toastController) {\n      if (detailsMessage) {\n        message += `<br/><small>${detailsMessage}</small>`;\n      }\n      await this.showToast({\n        type: 'error',\n        duration: -1,\n        showCloseButton: true,\n        message,\n      });\n    } else if (window) {\n      if (detailsMessage) {\n        message += `\\n\\n{cause: \"${detailsMessage}\"}`;\n      }\n      window.alert(message);\n    } else {\n      console.error(message);\n      if (err && err.details) console.error('cause', err.details);\n    }\n  }\n}\n","import { Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ErrorCodes } from './errors';\n\nimport { FetchPolicy, InternalRefetchQueriesInclude, WatchQueryFetchPolicy } from '@apollo/client/core';\nimport { SortDirection } from '@angular/material/sort';\n\nimport { BaseGraphqlService } from './base-graphql-service.class';\nimport {\n  EntitiesServiceDeleteOptions,\n  EntitiesServiceLoadOptions,\n  EntitiesServiceWatchOptions,\n  EntityServiceListenChangesOptions,\n  EntityServiceSaveOptions,\n  IEntitiesService,\n  IEntityService,\n  LoadResult,\n} from '../../shared/services/entity-service.class';\nimport { GraphqlService } from '../graphql/graphql.service';\nimport { PlatformService } from './platform.service';\nimport { environment } from '../../../environments/environment';\nimport { Entity, EntityAsObjectOptions, EntityUtils } from './model/entity.model';\nimport { chainPromises } from '../../shared/observables';\nimport { isEmptyArray, isNil, isNotEmptyArray, isNotNil, removeEnd, toNumber } from '../../shared/functions';\nimport { Directive } from '@angular/core';\nimport { FetchResult } from '@apollo/client/link/core';\nimport { EntityFilter, EntityFilterUtils } from './model/filter.model';\nimport { DocumentNode } from 'graphql';\nimport type { Unmasked } from '@apollo/client/masking';\n\nexport type MutableWatchQueriesUpdatePolicy = 'update-cache' | 'refetch-queries' | 'none';\n\n/**\n * @deprecated Use EntityServiceSaveOptions\n */\nexport interface EntitySaveOptions<T = any, V = any> extends EntityServiceSaveOptions<T, V> {}\n\nexport interface BaseEntityGraphqlQueries {\n  load?: any;\n  loadAll: any;\n  loadAllWithTotal?: any;\n  countAll?: any;\n}\nexport interface BaseEntityGraphqlMutations {\n  save?: any;\n  delete?: any;\n  saveAll?: any;\n  deleteAll?: any;\n}\n\nexport interface BaseEntityGraphqlSubscriptions {\n  listenChanges?: any;\n}\nexport interface BaseEntityServiceOptions<\n  T extends Entity<any, ID>,\n  ID = number,\n  Q extends BaseEntityGraphqlQueries = BaseEntityGraphqlQueries,\n  M extends BaseEntityGraphqlMutations = BaseEntityGraphqlMutations,\n  S extends BaseEntityGraphqlSubscriptions = BaseEntityGraphqlSubscriptions,\n> {\n  queries: Q;\n  mutations?: Partial<M>;\n  subscriptions?: Partial<S>;\n\n  equals?: (e1: T, e2: T) => boolean;\n\n  /**\n   * @deprecated Use 'equals' instead\n   */\n  equalsFn?: (e1: T, e2: T) => boolean;\n\n  isNew?: (e: T) => boolean;\n\n  /**\n   * @deprecated Use 'isNew' instead\n   */\n  isNewFn?: (e: T) => boolean;\n  defaultSortBy?: keyof T;\n  defaultSortDirection?: SortDirection;\n  watchQueriesUpdatePolicy?: MutableWatchQueriesUpdatePolicy;\n  watchQueriesDeletePolicy?: MutableWatchQueriesUpdatePolicy;\n}\n\nexport interface EntityServiceRefetchQueriesOptions<T = any> {\n  refetchQueries?: ((result: FetchResult<Unmasked<{ data: T[] }>>) => InternalRefetchQueriesInclude) | InternalRefetchQueriesInclude;\n  policy?: MutableWatchQueriesUpdatePolicy;\n}\n\n// @dynamic\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class BaseEntityService<\n    T extends Entity<T, ID>,\n    F extends EntityFilter<F, T, ID>,\n    ID = number,\n    WO extends EntitiesServiceWatchOptions = EntitiesServiceWatchOptions<T>,\n    LO extends EntitiesServiceLoadOptions = EntitiesServiceLoadOptions<T>,\n    DO extends EntitiesServiceDeleteOptions = EntitiesServiceDeleteOptions<T>,\n    Q extends BaseEntityGraphqlQueries = BaseEntityGraphqlQueries,\n    M extends BaseEntityGraphqlMutations = BaseEntityGraphqlMutations,\n    S extends BaseEntityGraphqlSubscriptions = BaseEntityGraphqlSubscriptions,\n  >\n  extends BaseGraphqlService<T, F, ID>\n  implements IEntitiesService<T, F, WO>, IEntityService<T, ID, LO>\n{\n  protected readonly _typename: string;\n  protected readonly _logTypeName: string;\n\n  protected readonly queries: Q;\n  protected readonly mutations: Partial<M>;\n  protected readonly subscriptions: Partial<S>;\n  protected readonly _equalsFn: (e1: T, e2: T) => boolean;\n  protected readonly _isNewFn: (e: T) => boolean;\n\n  protected readonly defaultSortBy: keyof T;\n  protected readonly defaultSortDirection: SortDirection;\n  protected readonly watchQueriesUpdatePolicy: MutableWatchQueriesUpdatePolicy;\n  protected readonly watchQueriesDeletePolicy: MutableWatchQueriesUpdatePolicy;\n\n  get defaultFetchPolicy(): WatchQueryFetchPolicy {\n    return this.graphql.defaultFetchPolicy;\n  }\n\n  protected constructor(\n    protected graphql: GraphqlService,\n    protected platform: PlatformService,\n    protected dataType: new () => T,\n    protected filterType: new () => F,\n    options: BaseEntityServiceOptions<T, ID, Q, M, S>\n  ) {\n    super(graphql, environment);\n    this.queries = options.queries;\n    this.mutations = options.mutations || <Partial<M>>{};\n    this.subscriptions = options.subscriptions || <Partial<S>>{};\n    this._equalsFn = options.equals || options.equalsFn;\n    this._isNewFn = options.isNew || options.isNewFn;\n    this.defaultSortBy = options.defaultSortBy || 'id';\n    this.defaultSortDirection = options.defaultSortDirection || 'asc';\n    this.watchQueriesUpdatePolicy = options.watchQueriesUpdatePolicy || 'update-cache';\n    this.watchQueriesDeletePolicy = options.watchQueriesDeletePolicy || this.watchQueriesUpdatePolicy;\n\n    const obj = new dataType();\n    this._typename = obj.__typename || 'UnknownVO';\n    this._logTypeName = removeEnd(this._typename, 'VO');\n\n    // For DEV only\n    this._debug = !environment.production;\n  }\n\n  watch(id: number, opts?: WO): Observable<T> {\n    if (this._debug) console.debug(this._logPrefix + `Watching ${this._logTypeName} {${id}}...`);\n\n    const variables: any = opts?.variables || { id };\n\n    const query = (opts && opts.query) || this.queries.load;\n    return this.graphql\n      .watchQuery<{ data: any }>({\n        query,\n        variables,\n        fetchPolicy: (opts && (opts.fetchPolicy as FetchPolicy)) || undefined,\n        error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },\n      })\n      .pipe(map(({ data }) => this.fromObject(data, opts)));\n  }\n\n  async load(id: ID, opts?: LO): Promise<T> {\n    if (this._debug) console.debug(this._logPrefix + `Loading ${this._logTypeName} {${id}}...`);\n\n    const variables: any = opts?.variables || { id };\n\n    const query = opts?.query || this.queries.load;\n    const { data } = await this.graphql.query<{ data: any }>({\n      query,\n      variables,\n      fetchPolicy: (opts && (opts.fetchPolicy as FetchPolicy)) || undefined,\n      error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },\n    });\n\n    // Convert to entity\n    return this.fromObject(data, opts);\n  }\n\n  watchAll(offset: number, size: number, sortBy?: string, sortDirection?: SortDirection, dataFilter?: F, opts?: WO): Observable<LoadResult<T>> {\n    dataFilter = this.asFilter(dataFilter);\n\n    const variables: any = {\n      ...(opts?.variables || {}),\n      offset: offset || 0,\n      size: size || 100,\n      sortBy: sortBy || this.defaultSortBy,\n      sortDirection: sortDirection || this.defaultSortDirection,\n      filter: dataFilter && dataFilter.asPodObject(),\n    };\n\n    let now = this._debug && Date.now();\n    if (this._debug) console.debug(this._logPrefix + `Watching ${this._logTypeName}...`, variables);\n\n    const withTotal = (!opts || opts.withTotal !== false) && this.queries.loadAllWithTotal && true;\n    const query =\n      (opts && opts.query) || // use given query\n      // Or get loadAll or loadAllWithTotal query\n      (withTotal ? this.queries.loadAllWithTotal : this.queries.loadAll);\n    return this.mutableWatchQuery<LoadResult<any>>({\n      query,\n      variables,\n      // Force cached mutable query\n      queryName: withTotal ? 'LoadAllWithTotal' : 'LoadAll',\n      arrayFieldName: 'data',\n      totalFieldName: withTotal ? 'total' : undefined,\n      insertFilterFn: dataFilter && dataFilter.asFilterFn(),\n      error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },\n      fetchPolicy: (opts && opts.fetchPolicy) || undefined,\n    }).pipe(\n      map(({ data, total }) => {\n        // Convert to entities (if need)\n        const entities = this.fromObjects(data, opts);\n\n        if (now) {\n          console.debug(this._logPrefix + `${this._logTypeName} loaded in ${Date.now() - now}ms`, entities);\n          now = null;\n        }\n        return { data: entities, total };\n      })\n    );\n  }\n\n  async loadAll(\n    offset: number,\n    size: number,\n    sortBy?: keyof T | string,\n    sortDirection?: SortDirection,\n    filter?: Partial<F>,\n    opts?: LO & {\n      debug?: boolean;\n    }\n  ): Promise<LoadResult<T>> {\n    const debug = this._debug && (!opts || opts.debug !== false);\n\n    filter = this.asFilter(filter);\n\n    const variables: any = {\n      ...(opts?.variables || {}),\n      offset: offset || 0,\n      size: size || 100,\n      sortBy: sortBy || 'id',\n      sortDirection: sortDirection || 'asc',\n      filter: filter && filter.asPodObject(),\n    };\n\n    const now = Date.now();\n    if (debug) console.debug(this._logPrefix + `Loading ${this._logTypeName}...`, variables);\n\n    const withTotal = (!opts || opts.withTotal !== false) && this.queries.loadAllWithTotal && true;\n    // use given query\n    const query =\n      opts?.query ||\n      // Or get loadAll or loadAllWithTotal query\n      (withTotal ? this.queries.loadAllWithTotal : this.queries.loadAll);\n    const { data, total } = await this.graphql.query<LoadResult<any>>({\n      query,\n      variables,\n      error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.LOAD_DATA_ERROR' },\n      fetchPolicy: (opts && opts.fetchPolicy) || 'network-only',\n    });\n\n    const entities = this.fromObjects(data, opts);\n    if (debug) console.debug(this._logPrefix + `${this._logTypeName} items loaded in ${Date.now() - now}ms`);\n\n    const result: LoadResult<T> = {\n      data: entities,\n      total: total || entities.length,\n    };\n\n    // Add fetch more capability, if total was fetched\n    if (withTotal) {\n      const nextOffset = (offset || 0) + entities.length;\n      if (nextOffset < result.total) {\n        result.fetchMore = () => this.loadAll(nextOffset, size, sortBy, sortDirection, filter, opts);\n      }\n    }\n\n    return result;\n  }\n\n  async countAll(filter?: Partial<F>, opts?: LO) {\n    // If no countAll query\n    if (!this.queries.countAll && !opts?.query) {\n      // Fail if no loadAll (cannot count)\n      if (!this.queries.loadAllWithTotal) throw new Error('Not implemented');\n\n      // Use loadAll query, with size = 0;\n      return (await this.loadAll(0, 1, null, null, filter, <LO & { withTotal: boolean }>{ withTotal: true }))?.total || 0;\n    }\n\n    filter = this.asFilter(filter);\n\n    const variables: any = {\n      ...(opts?.variables || {}),\n      filter: filter && filter.asPodObject(),\n    };\n\n    const query = opts?.query || this.queries.countAll;\n    const res = await this.graphql.query<{ total: number }>({\n      query,\n      variables,\n      error: { code: ErrorCodes.LOAD_DATA_ERROR, message: 'ERROR.COUNT_DATA_ERROR' },\n      fetchPolicy: (opts && opts.fetchPolicy) || 'network-only',\n    });\n    return res.total;\n  }\n\n  canUserWrite(data: T, opts?: any): boolean {\n    return !!data;\n  }\n\n  async saveAll(entities: T[], opts?: EntityServiceSaveOptions | EntitySaveOptions): Promise<T[]> {\n    if (isEmptyArray(entities)) return entities; // Nothing to save: skip\n\n    if (!this.mutations.saveAll) {\n      if (!this.mutations.save) throw new Error('Not implemented');\n      // Save one by one\n      return chainPromises((entities || []).map((entity) => () => this.save(entity, opts)));\n    }\n\n    const newEntities: T[] = [];\n    const json = entities.map((entity) => {\n      if (this.isNew(entity)) newEntities.push(entity);\n      this.fillDefaultProperties(entity);\n      return this.asObject(entity);\n    });\n\n    const now = Date.now();\n    if (this._debug) console.debug(this._logPrefix + `Saving all ${this._logTypeName}...`, json);\n\n    await this.graphql.mutate<{ data: T[] }>({\n      mutation: this.mutations.saveAll,\n      refetchQueries: this.getRefetchQueriesForMutation(opts),\n      awaitRefetchQueries: opts && opts.awaitRefetchQueries,\n      variables: {\n        data: json,\n      },\n      error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },\n      update: (cache, { data }, { context, variables }) => {\n        const savedEntities = data?.data as T[];\n        if (savedEntities) {\n          // Update entities (id and update date)\n          entities.forEach((entity) => {\n            const savedEntity = savedEntities.find((e) => this.equals(entity, e));\n            this.copyIdAndUpdateDate(savedEntity, entity);\n          });\n\n          // Update the cache, with new entities\n          if (isNotEmptyArray(newEntities) && this.watchQueriesUpdatePolicy === 'update-cache') {\n            this.insertIntoMutableCachedQueries(cache, {\n              queries: this.getLoadQueries(),\n              data: newEntities,\n            });\n          }\n        }\n\n        // Call update function, if any\n        if (opts?.update) {\n          opts.update(cache, { data }, { context, variables });\n        }\n\n        if (this._debug) console.debug(`${this._logTypeName} saved in ${Date.now() - now}ms`, entities);\n      },\n    });\n\n    return entities;\n  }\n\n  /**\n   * Save a referential entity\n   *\n   * @param entity\n   * @param opts\n   */\n  async save(entity: T, opts?: EntityServiceSaveOptions): Promise<T> {\n    if (!this.mutations.save) {\n      if (!this.mutations.saveAll) throw new Error('Not implemented');\n      const data = await this.saveAll([entity], opts);\n      return data && data[0];\n    }\n\n    const isNewEntity = this.isNew(entity);\n\n    // Fill default properties\n    this.fillDefaultProperties(entity);\n\n    // Transform into json\n    const json = this.asObject(entity);\n\n    const now = Date.now();\n    if (this._debug) console.debug(this._logPrefix + `Saving ${this._logTypeName}...`, json);\n\n    await this.graphql.mutate<{ data: any }>({\n      mutation: this.mutations.save,\n      refetchQueries: this.getRefetchQueriesForMutation(opts),\n      awaitRefetchQueries: opts && opts.awaitRefetchQueries,\n      variables: {\n        data: json,\n      },\n      error: { code: ErrorCodes.SAVE_DATA_ERROR, message: 'ERROR.SAVE_DATA_ERROR' },\n      update: (cache, { data }, { context, variables }) => {\n        // Update entity\n        const savedEntity = data && data.data;\n        this.copyIdAndUpdateDate(savedEntity, entity);\n\n        // Insert into the cache\n        if (isNewEntity && this.watchQueriesUpdatePolicy === 'update-cache') {\n          this.insertIntoMutableCachedQueries(cache, {\n            queries: this.getLoadQueries(),\n            data: savedEntity,\n          });\n        }\n\n        // Call update function, if any\n        if (opts?.update) {\n          opts.update(cache, { data }, { context, variables });\n        }\n\n        if (this._debug) console.debug(this._logPrefix + `${entity.__typename} saved in ${Date.now() - now}ms`, entity);\n      },\n    });\n\n    return entity;\n  }\n\n  /**\n   * Delete referential entities\n   */\n  async deleteAll(entities: T[], opts?: DO | any): Promise<any> {\n    if (!opts?.mutation && !this.mutations.deleteAll) {\n      if (!this.mutations.delete) throw new Error('Not implemented');\n      // Delete one by one\n      return chainPromises((entities || []).map((entity) => () => this.delete(entity, opts)));\n    }\n\n    // Filter saved entities\n    entities = entities && entities.filter((e) => isNotNil(e.id));\n\n    // Nothing to save: skip\n    if (isEmptyArray(entities)) return;\n\n    const ids = opts?.variables?.ids ?? entities.map((t) => t.id);\n    const variables = {\n      ids,\n      ...opts?.variables,\n    };\n    const now = Date.now();\n    if (this._debug) console.debug(this._logPrefix + `Deleting ${this._logTypeName}...`, ids);\n\n    await this.graphql.mutate<any>({\n      mutation: opts?.mutation ?? this.mutations.deleteAll,\n      refetchQueries: this.getRefetchQueriesForMutation({ policy: this.watchQueriesDeletePolicy, ...opts }),\n      awaitRefetchQueries: opts?.awaitRefetchQueries,\n      variables,\n      error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },\n      update: (cache, res) => {\n        // Remove from cache\n        if (this.watchQueriesDeletePolicy === 'update-cache') {\n          this.removeFromMutableCachedQueriesByIds(cache, {\n            queries: this.getLoadQueries(),\n            ids,\n          });\n        }\n\n        if (opts && opts.update) {\n          opts.update(cache, res);\n        }\n\n        if (this._debug) console.debug(this._logPrefix + `${this._logTypeName} deleted in ${Date.now() - now}ms`);\n      },\n    });\n  }\n\n  /**\n   * Delete a referential entity\n   */\n  async delete(entity: T, opts?: DO | any): Promise<any> {\n    if (!opts?.mutation && !this.mutations.delete) {\n      if (!this.mutations.deleteAll) throw new Error('Not implemented');\n      const data = await this.deleteAll([entity], opts);\n      return data && data[0];\n    }\n\n    // Nothing to save: skip\n    if (!entity || isNil(entity.id)) return;\n\n    const id = opts?.variables?.id ?? entity.id;\n    const variables = {\n      id,\n      ...opts?.variables\n    };\n    const now = new Date();\n    if (this._debug) console.debug(this._logPrefix + `Deleting ${this._logTypeName} {${id}}...`);\n\n    await this.graphql.mutate<any>({\n      mutation: opts?.mutation ?? this.mutations.delete,\n      refetchQueries: this.getRefetchQueriesForMutation({ policy: this.watchQueriesDeletePolicy, ...opts }),\n      awaitRefetchQueries: opts?.awaitRefetchQueries,\n      variables,\n      error: { code: ErrorCodes.DELETE_DATA_ERROR, message: 'ERROR.DELETE_DATA_ERROR' },\n      update: (proxy, res) => {\n        // Remove from cache\n        if (this.watchQueriesDeletePolicy === 'update-cache') {\n          this.removeFromMutableCachedQueriesByIds(proxy, {\n            queries: this.getLoadQueries(),\n            ids: [id],\n          });\n        }\n\n        if (opts && opts.update) {\n          opts.update(proxy, res);\n        }\n\n        if (this._debug) console.debug(this._logPrefix + `${this._logTypeName} deleted in ${new Date().getTime() - now.getTime()}ms`);\n      },\n    });\n  }\n\n  listenChanges(id: ID, opts?: EntityServiceListenChangesOptions<T>): Observable<T> {\n    if (isNil(id)) throw Error(\"Missing argument 'id' \");\n    if (!this.subscriptions.listenChanges) {\n      console.warn(`${this.constructor.name}.listenChanges() not implemented yet. Will empty observable`);\n      return of();\n    }\n\n    const variables = opts?.variables || {\n      id,\n      interval: toNumber(opts?.interval, 0), // no timer by default\n    };\n    if (this._debug) console.debug(this._logPrefix + `[WS] Listening for changes on ${this._logTypeName} {${id}}...`);\n\n    return this.graphql\n      .subscribe<{ data: any }>({\n        query: opts?.query || this.subscriptions.listenChanges,\n        fetchPolicy: opts?.fetchPolicy || 'no-cache',\n        variables,\n        error: {\n          code: ErrorCodes.SUBSCRIBE_DATA_ERROR,\n          message: 'ERROR.SUBSCRIBE_DATA_ERROR',\n        },\n      })\n      .pipe(\n        map(({ data }) => {\n          // Convert to entity (if need)\n          const entity = this.fromObject(data, opts);\n          //if (entity && this._debug) console.debug(this._logPrefix + `[WS] Received changes on ${this._logTypeName} {${id}}`, entity);\n\n          if (!entity) console.warn(this._logPrefix + `[WS] Received empty data on ${this._logTypeName} {${id}} - Check if entity has been deleted`);\n\n          return entity;\n        })\n      );\n  }\n\n  copyIdAndUpdateDate(source: T, target: T) {\n    if (!source) return;\n\n    // Update (id and updateDate)\n    EntityUtils.copyIdAndUpdateDate(source, target);\n  }\n\n  fromObject(\n    source: any,\n    opts?: {\n      toEntity?: boolean | ((source: any, opts?: any) => T);\n      [key: string]: any;\n    }\n  ): T {\n    // Simple cast (skip conversion)\n    if (!source || opts?.toEntity === false) return source as T;\n\n    // User defined function\n    if (typeof opts?.toEntity === 'function') {\n      return opts.toEntity(source, opts);\n    }\n\n    // Entity conversion\n    const target = new this.dataType();\n    target.fromObject(source, opts);\n    return target;\n  }\n\n  asFilter(source: any): F {\n    return EntityFilterUtils.fromObject(source, this.filterType);\n  }\n\n  equals(d1: T, d2: T): boolean {\n    if (this._equalsFn) return this._equalsFn(d1, d2);\n    return d1 && d1.equals ? d1.equals(d2) : EntityUtils.equals(d1, d2, 'id');\n  }\n\n  isNew(data: T) {\n    if (this._isNewFn) return this._isNewFn(data);\n    return EntityUtils.isEmpty(data, 'id');\n  }\n\n  /**\n   * @deprecated Use equals() instead\n   */\n  equalsFn(d1: T, d2: T) {\n    return this.equals(d1, d2);\n  }\n\n  /**\n   * @deprecated Use isNew() instead\n   * @param data\n   */\n  isNewFn(data: T) {\n    return this.isNew(data);\n  }\n\n  /* -- protected functions -- */\n\n  protected async ngOnStart() {\n    // No limit for updatable watch queries, if desktop\n    if (!this.platform.mobile) {\n      this._mutableWatchQueriesMaxCount = -1;\n    }\n  }\n\n  protected fillDefaultProperties(source: T) {\n    // Can be overridden by subclasses\n  }\n\n  protected fromObjects(\n    sources: any[],\n    opts?: {\n      toEntity?: boolean | ((source: any, opts?: any) => T);\n      [key: string]: any;\n    }\n  ): T[] {\n    return (sources || []).map((source) => this.fromObject(source, opts));\n  }\n\n  protected asObject(source: T, opts?: EntityAsObjectOptions): any {\n    // Can be overridden by subclasses\n    return source.asObject(opts);\n  }\n\n  protected getRefetchQueriesForMutation(\n    opts?: EntityServiceRefetchQueriesOptions<T>\n  ): ((result: FetchResult<Unmasked<{ data: T[] }>>) => InternalRefetchQueriesInclude) | InternalRefetchQueriesInclude {\n    if (opts?.refetchQueries) return opts.refetchQueries;\n\n    // Skip if update policy not used refecth queries\n    const watchQueriesPolicy = opts?.policy ?? this.watchQueriesUpdatePolicy;\n    if (watchQueriesPolicy !== 'refetch-queries') return undefined;\n\n    const queries = this.getLoadQueries();\n    if (isEmptyArray(queries)) return undefined; // Skip if empty\n\n    console.debug(`${this._logPrefix}Will refetch ${queries.length} queries, after the mutation`);\n\n    // Find the refetch queries definition\n    return this.findRefetchQueries({ queries });\n  }\n\n  protected getLoadQueries(): DocumentNode[] {\n    return [this.queries.loadAll, this.queries.loadAllWithTotal].filter(isNotNil);\n  }\n\n  protected getLoadQueryNames(): string[] {\n    return ['LoadAll', 'LoadAllWithTotal'];\n  }\n}\n","import { Directive, InjectionToken } from '@angular/core';\nimport { EntityUtils } from '../../core/services/model/entity.model';\nimport {\n  EntitiesServiceLoadOptions,\n  EntityServiceWatchOptions,\n  IEntitiesService,\n  IEntityService,\n  LoadResult,\n  SuggestService,\n} from '../services/entity-service.class';\nimport { GraphqlService } from '../../core/graphql/graphql.service';\nimport { BaseEntityService, BaseEntityServiceOptions } from '../../core/services/base-entity-service.class';\nimport { PlatformService } from '../../core/services/platform.service';\nimport { AccountService } from '../../core/services/account.service';\nimport { isNil } from '../functions';\nimport { INamedFilter, INamedFilterFilter, NamedFilter, NamedFilterFilter } from './named-filter.model';\n\nexport const APP_NAMED_FILTER_SERVICE = new InjectionToken<INamedFilterService<any, any, any, any>>('namedFilterService');\n\nexport interface INamedFilterService<\n  T extends INamedFilter<T>,\n  F extends INamedFilterFilter<F, T>,\n  WO extends NamedFilterWatchOptions,\n  LO extends NamedFilterLoadOptions,\n> extends IEntitiesService<T, F, WO>,\n    IEntityService<T, number, LO>,\n    SuggestService<T, F> {}\n\nexport interface NamedFilterWatchOptions extends EntityServiceWatchOptions {\n  withContent?: boolean;\n}\n\nexport interface NamedFilterLoadOptions extends EntitiesServiceLoadOptions {\n  withContent?: boolean;\n}\n\n// @dynamic\n@Directive()\nexport abstract class AbstractNamedFilterService<\n    T extends NamedFilter<T>,\n    F extends NamedFilterFilter<F, T>,\n    WO extends NamedFilterWatchOptions = NamedFilterWatchOptions,\n    LO extends NamedFilterLoadOptions = NamedFilterLoadOptions,\n  >\n  extends BaseEntityService<T, F, number>\n  implements INamedFilterService<T, F, WO, LO>\n{\n  protected constructor(\n    protected graphql: GraphqlService,\n    protected platform: PlatformService,\n    protected account: AccountService,\n    protected dataType: new () => T,\n    protected filterType: new () => F,\n    protected options: BaseEntityServiceOptions<T, number>\n  ) {\n    super(graphql, platform, dataType, filterType, {\n      defaultSortBy: 'name',\n      defaultSortDirection: 'asc',\n      ...options,\n    });\n    this._logPrefix = '[named-filter-service] ';\n  }\n\n  async suggest(value: any, filter: Partial<F>): Promise<LoadResult<T>> {\n    if (EntityUtils.isNotEmpty(value, 'id')) return { data: [value] };\n    value = (typeof value === 'string' && value !== '*' && value) || undefined;\n    return this.loadAll(0, !value ? 30 : 10, 'name', 'asc', this.asSuggestFilter(value, filter), <EntitiesServiceLoadOptions>{\n      withTotal: true,\n    });\n  }\n\n  asSuggestFilter(searchText: string, filter?: Partial<F>): F {\n    return <F>{\n      ...filter,\n      searchText,\n    };\n  }\n\n  asFilter(source: any): F {\n    const filter = super.asFilter(source);\n\n    // Default filter on current user\n    if (this.account.isLogin() && isNil(filter.recorderPersonId) && isNil(filter.recorderDepartmentId))\n      filter.recorderPersonId = this.account.person.id;\n\n    return filter;\n  }\n\n  protected fillDefaultProperties(source: T) {\n    super.fillDefaultProperties(source);\n\n    // Default recorder\n    if (isNil(source.recorderPersonId) && isNil(source.recorderDepartmentId)) source.recorderPersonId = this.account.person.id;\n\n    // Stringify content\n    if (typeof source.content === 'object') {\n      source.content = JSON.stringify(source.content);\n    }\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Inject,\n  Injector,\n  Input,\n  OnInit,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport { UntypedFormBuilder } from '@angular/forms';\nimport { PopoverController, ToastController } from '@ionic/angular';\nimport { AppForm } from '../../core/form/form.class';\nimport { FilesUtils } from '../file/file.utils';\nimport { isEmptyArray, isNil, isNilOrBlank, isNilOrNaN, isNotNil, isNotNilOrBlank } from '../functions';\nimport { MatAutocompleteField } from '../material/autocomplete/material.autocomplete';\nimport { MatAutocompleteFieldConfig } from '../material/autocomplete/material.autocomplete.config';\nimport { Toasts } from '../toast/toasts';\nimport { INamedFilter, INamedFilterFilter, NamedFilter } from './named-filter.model';\nimport { APP_NAMED_FILTER_SERVICE, INamedFilterService, NamedFilterLoadOptions, NamedFilterWatchOptions } from './named-filter.service';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';\n\nimport { APP_SHOW_TOOLTIP } from '../constants';\n\nexport type NamedFilterSelectorButtonsPosition = 'matSuffix' | 'after';\n\n@Component({\n  selector: 'app-named-filter-selector',\n  styleUrls: ['./named-filter-selector.component.scss'],\n  templateUrl: './named-filter-selector.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NamedFilterSelector extends AppForm<{ namedFilter: any }> implements OnInit {\n  protected readonly logPrefix = '[named-filter-selector]';\n\n  private _entityName: string;\n  private _deleteDisabled = false;\n\n  @Input() mobile: boolean;\n  @Input() set entityName(entityName: string) {\n    if (!entityName || this._entityName === entityName) return;\n    this._entityName = entityName;\n    // Update autocomplete filter\n    this.autocompleteField.filter = { ...this.autocompleteField.filter, ...this.getFilter() };\n  }\n\n  get entityName(): string {\n    return this._entityName;\n  }\n\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() subscriptSizing: SubscriptSizing;\n  @Input() filterContentProvider: () => any;\n  @Input() filterImportCallback: (namedFilter: NamedFilter) => Promise<NamedFilter>;\n  @Input() filterFormDirty: boolean;\n  @Input() showButtons = true;\n  @Input() exportFileNamePrefix = 'filter';\n  @Input() autocompleteConfig: MatAutocompleteFieldConfig;\n  @Input() dropButtonTitle: string;\n  @Input() clearButtonTitle: string;\n  @Input() detectChangeOnSelectFilter: boolean = false; // Else is on value change\n  @Input() buttonsPosition: NamedFilterSelectorButtonsPosition;\n\n  @Input() set disabled(_disabled: boolean) {\n    if (_disabled) this.disable();\n    else this.enable();\n  }\n  get disabled(): boolean {\n    return !this._enabled;\n  }\n\n  get isNew(): boolean {\n    return isNilOrNaN(this.value?.namedFilter?.id);\n  }\n\n  get saveDisabled(): boolean {\n    return !this.dirty || isNilOrBlank(this.value.namedFilter);\n  }\n\n  get deleteDisabled(): boolean {\n    return this._deleteDisabled || this.isNew;\n  }\n\n  get dirty(): boolean {\n    return super.dirty || this.filterFormDirty;\n  }\n\n  @Output() filterSelected = new EventEmitter<any>();\n  @Output() filterDeleted = new EventEmitter<NamedFilter>();\n  @Output() filterCleared = new EventEmitter<void>();\n\n  @ViewChild(MatAutocompleteField, { static: true }) autocompleteField: MatAutocompleteField;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected injector: Injector,\n    protected formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef,\n    protected toastController: ToastController,\n    protected popoverController: PopoverController,\n    @Inject(APP_NAMED_FILTER_SERVICE)\n    protected dataService: INamedFilterService<INamedFilter<any>, INamedFilterFilter<any, any>, NamedFilterWatchOptions, NamedFilterLoadOptions>\n  ) {\n    super(injector, formBuilder.group({ namedFilter: [null] }));\n  }\n\n  ngOnInit(): void {\n    this.mobile = this.mobile ?? this.settings.mobile;\n    this.buttonsPosition = this.buttonsPosition ?? (this.mobile ? 'after' : 'matSuffix');\n\n    this.registerAutocompleteField('namedFilter', {\n      suggestFn: (value, filter) => this.dataService.suggest(value, filter),\n      attributes: ['name'],\n      filter: this.getFilter(),\n      applyImplicitValue: false,\n      ...this.autocompleteConfig,\n    });\n\n    if (this.detectChangeOnSelectFilter) {\n      this.registerSubscription(this.autocompleteField.selectionChange.subscribe((event) => this.onFilterChanges(event.value)));\n    } else {\n      this.registerSubscription(\n        this.form.controls.namedFilter.valueChanges.pipe(debounceTime(100), distinctUntilChanged()).subscribe((value) => this.onFilterChanges(value))\n      );\n    }\n  }\n\n  getFilter(): any {\n    return {\n      entityName: this.entityName,\n    };\n  }\n\n  markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  async save(event: UIEvent) {\n    if (event?.defaultPrevented) return;\n    event?.preventDefault();\n    event?.stopPropagation();\n\n    const filterContent = this.filterContentProvider();\n\n    if (this.debug) console.debug(`${this.logPrefix} save named filter`, filterContent);\n\n    if (isNilOrBlank(filterContent)) return;\n\n    const currentSelected = this.value.namedFilter;\n    let result: NamedFilter;\n\n    if (typeof currentSelected === 'string') {\n      result = NamedFilter.fromObject({\n        name: currentSelected,\n        entityName: this.entityName,\n        content: filterContent,\n      });\n    } else {\n      result = NamedFilter.fromObject({\n        ...currentSelected,\n        content: filterContent,\n      });\n    }\n\n    const savedEntity = await this.dataService.save(result);\n    this.setControlValue(savedEntity);\n    this.autocompleteField.reloadItems();\n    this.markAsPristine();\n  }\n\n  async delete(event?: UIEvent) {\n    if (event?.defaultPrevented) return;\n    event?.preventDefault();\n    event?.stopPropagation();\n\n    const data = this.value.namedFilter;\n\n    if (this.debug) console.debug(`${this.logPrefix} delete named filter`, data);\n\n    if (typeof data === 'object') {\n      await this.dataService.delete(data);\n      this.reset();\n      this.autocompleteField.reloadItems();\n      this.autocompleteField.blurred.emit();\n      this.filterDeleted.emit(data);\n      Toasts.show(this.toastController, this.translate, {\n        type: 'info',\n        message: 'COMMON.NAMED_FILTER.DELETED',\n      });\n    }\n  }\n\n  onMoreOptionsClick(event: Event) {\n    event.preventDefault();\n    event.stopPropagation(); // Avoid field focus gain\n  }\n\n  async export(event?: UIEvent) {\n    if (event?.defaultPrevented) return;\n    event?.preventDefault();\n\n    const id = this.autocompleteField.value?.id;\n\n    if (this.debug) console.debug(`${this.logPrefix} export named filter`, id);\n\n    if (!id) return;\n\n    const data = await this.dataService.load(id, { withContent: true });\n\n    if (data) {\n      FilesUtils.writeTextToFile(JSON.stringify(data, null, 2), {\n        type: 'application/json',\n        filename: `${this.exportFileNamePrefix}-${data.entityName}-${data.name}.json`,\n      });\n    } else {\n      Toasts.show(this.toastController, this.translate, {\n        type: 'error',\n        message: 'COMMON.NAMED_FILTER.NOT_FOUND',\n      });\n    }\n  }\n\n  async import(event: Event) {\n    if (event?.defaultPrevented) return;\n    event?.preventDefault();\n\n    const result = await FilesUtils.showUploadPopover(this.popoverController, event, {\n      uploadFn: (file) => FilesUtils.readAsText(file),\n      title: 'COMMON.NAMED_FILTER.IMPORT',\n      fileExtension: '.json',\n      uniqueFile: true,\n      instantUpload: true,\n    });\n    if (!result || isEmptyArray(result.data)) return;\n    try {\n      let data = JSON.parse(result.data[0].response.body);\n      if (this.debug) console.debug(`${this.logPrefix} import named filter`, data);\n      if (this.filterImportCallback) {\n        data = await this.filterImportCallback(data);\n        if (isNil(data)) {\n          return; // Abort import if callback returns null or undefined\n        }\n      }\n      this.setControlValue(data);\n      this.filterSelected.emit(data.content);\n      this.markAsDirty();\n    } catch (e) {\n      console.error(e);\n      Toasts.show(this.toastController, this.translate, {\n        type: 'error',\n        message: 'COMMON.NAMED_FILTER.IMPORT_FAILED',\n      });\n    }\n  }\n\n  protected async onFilterChanges(value: NamedFilter | string) {\n    if (this.debug) console.debug(`${this.logPrefix} filter change`, value);\n\n    // Emit cleared event if bound\n    if (isNil(value) && this.filterCleared.observed) {\n      this.filterCleared.emit();\n    }\n\n    if (typeof value === 'object' && value?.id && isNotNil(value.id)) {\n      try {\n        const data = await this.dataService.load(value.id, { withContent: true });\n        this._deleteDisabled = !this.dataService.canUserWrite(data);\n\n        const filter = isNotNilOrBlank(data?.content) ? data.content : null;\n        if (filter) {\n          this.filterSelected.emit(filter);\n          this.markAsPristine();\n        }\n      } catch (e) {\n        Toasts.show(this.toastController, this.translate, {\n          type: 'error',\n          message: 'COMMON.NAMED_FILTER.LOAD_FAILED',\n        });\n      }\n    }\n  }\n\n  protected setControlValue(value: NamedFilter) {\n    this.setValue({ namedFilter: value });\n    this.autocompleteField.blurred.emit();\n  }\n}\n","<ion-grid class=\"ion-no-padding\">\n  <ion-row class=\"ion-no-padding\">\n    <ion-col class=\"ion-no-padding\">\n      <form class=\"form-container\" [formGroup]=\"form\">\n        <mat-autocomplete-field\n          formControlName=\"namedFilter\"\n          [config]=\"autocompleteFields.namedFilter\"\n          [appearance]=\"appearance\"\n          [subscriptSizing]=\"subscriptSizing\"\n          [placeholder]=\"'COMMON.NAMED_FILTER.TITLE' | translate\"\n          [clearable]=\"true\"\n          [dropButtonTitle]=\"dropButtonTitle\"\n          [clearButtonTitle]=\"clearButtonTitle\"\n        >\n          @if (showButtons && buttonsPosition === 'matSuffix') {\n            <ng-container matSuffix>\n              <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n            </ng-container>\n          }\n        </mat-autocomplete-field>\n      </form>\n    </ion-col>\n    @if (showButtons && buttonsPosition === 'after') {\n      <ion-col size=\"auto\" class=\"ion-no-padding\">\n        <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n      </ion-col>\n    }\n  </ion-row>\n</ion-grid>\n\n<ng-template #buttons>\n  <!-- save -->\n  <button\n    mat-icon-button\n    [color]=\"'primary'\"\n    [disabled]=\"saveDisabled\"\n    [title]=\"!showTooltip ? ('COMMON.NAMED_FILTER.SAVE' | translate) : ''\"\n    [matTooltip]=\"showTooltip ? ('COMMON.NAMED_FILTER.SAVE' | translate) : ''\"\n    (click)=\"save($event)\"\n  >\n    <mat-icon>save</mat-icon>\n    <mat-icon *ngIf=\"isNew\" class=\"icon-secondary\" style=\"left: 12px; top: 0\">add</mat-icon>\n  </button>\n\n  <!-- delete -->\n  <button\n    mat-icon-button\n    [disabled]=\"deleteDisabled\"\n    [title]=\"!showTooltip ? ('COMMON.NAMED_FILTER.DELETE' | translate) : ''\"\n    [matTooltip]=\"showTooltip ? ('COMMON.NAMED_FILTER.DELETE' | translate) : ''\"\n    (click)=\"delete($event)\"\n  >\n    <mat-icon>delete</mat-icon>\n  </button>\n\n  <!-- more '...' -->\n  <button mat-icon-button [matMenuTriggerFor]=\"moreMenu\" (click)=\"onMoreOptionsClick($event)\">\n    <mat-icon>more_vert</mat-icon>\n  </button>\n\n  <!-- more menu -->\n  <mat-menu #moreMenu=\"matMenu\">\n    <ng-template matMenuContent>\n      <!-- import -->\n      <button mat-menu-item (click)=\"import($event)\">\n        <mat-icon>file_upload</mat-icon>\n        <ion-label>{{ 'COMMON.NAMED_FILTER.IMPORT' | translate }}</ion-label>\n      </button>\n\n      <mat-divider></mat-divider>\n\n      <!-- export -->\n      <button mat-menu-item (click)=\"export($event)\" [disabled]=\"isNew\">\n        <mat-icon>file_download</mat-icon>\n        <ion-label>{{ 'COMMON.NAMED_FILTER.EXPORT' | translate }}</ion-label>\n      </button>\n    </ng-template>\n  </mat-menu>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NamedFilterSelector } from './named-filter-selector.component';\nimport { SharedMatAutocompleteModule } from '../material/autocomplete/material.autocomplete.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { SharedMaterialModule } from '../material/material.module';\n\n@NgModule({\n  imports: [CommonModule, IonicModule, TranslateModule.forChild(), SharedMatAutocompleteModule, ReactiveFormsModule, SharedMaterialModule],\n  declarations: [NamedFilterSelector],\n  exports: [NamedFilterSelector],\n})\nexport class SharedNamedFilterModule {}\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule, Provider } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SharedMaterialModule } from './material/material.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { IonicModule } from '@ionic/angular';\nimport { DateFormatService } from './pipes/date-format.pipe';\nimport { DateFromNowPipe } from './pipes/date-from-now.pipe';\nimport { MAT_PAGINATOR_DEFAULT_OPTIONS, MatPaginatorIntl } from '@angular/material/paginator';\nimport { MatPaginatorI18n } from './material/paginator/material.paginator-i18n';\nimport { ColorPickerModule } from 'ngx-color-picker';\nimport { AppFormField } from './form/field.component';\nimport { AudioProvider } from './audio/audio';\nimport { CloseScrollStrategy, FullscreenOverlayContainer, Overlay, OverlayContainer } from '@angular/cdk/overlay';\nimport { SharedHotkeysModule } from './hotkeys/shared-hotkeys.module';\nimport { FileService } from './file/file.service';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { MAT_AUTOCOMPLETE_DEFAULT_OPTIONS, MAT_AUTOCOMPLETE_SCROLL_STRATEGY } from '@angular/material/autocomplete';\nimport { MAT_SELECT_SCROLL_STRATEGY } from '@angular/material/select';\nimport { SharedDirectivesModule } from './directives/directives.module';\nimport { SharedPipesModule } from './pipes/pipes.module';\nimport { AppLoadingSpinner } from './form/loading-spinner';\nimport { DateDiffDurationPipe } from './pipes/date-diff-duration.pipe';\nimport { LatitudeFormatPipe, LatLongFormatPipe, LongitudeFormatPipe } from './pipes/latlong-format.pipe';\nimport { HighlightPipe } from './pipes/highlight.pipe';\nimport { NumberFormatPipe } from './pipes/number-format.pipe';\nimport { MarkdownModule } from 'ngx-markdown';\nimport { TranslateContextService } from './services/translate-context.service';\nimport { MatStepperIntl } from '@angular/material/stepper';\nimport { MatStepperI18n } from './material/stepper/material.stepper-i18n';\nimport { UploadFileComponent } from './upload-file/upload-file.component';\nimport { UploadFilePopover } from './upload-file/upload-file-popover.component';\nimport { SharedTestsPage } from './testing/tests.page';\nimport { APP_STORAGE } from './storage/storage.utils';\nimport { StorageService } from './storage/storage.service';\nimport { SharedToolbarModule } from './toolbar/toolbar.module';\nimport { NgxJdenticonModule } from 'ngx-jdenticon';\nimport { SharedNamedFilterModule } from './named-filter/named-filter.module';\nimport { EnvironmentLoader } from '../../environments/environment.loader';\nimport { ENVIRONMENT } from '../../environments/environment.class';\nimport { RxStateModule } from './rx-state/rx-state.module';\n\nexport function scrollFactory(overlay: Overlay): () => CloseScrollStrategy {\n  return () => overlay.scrollStrategies.close();\n}\n\nexport interface SharedModuleConfig {\n  loader?: Provider;\n}\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ReactiveFormsModule,\n    TranslateModule,\n    ColorPickerModule,\n    DragDropModule,\n    MarkdownModule,\n    RxStateModule,\n\n    // Sub modules\n    SharedMaterialModule,\n    SharedDirectivesModule,\n    SharedPipesModule,\n    SharedHotkeysModule,\n    SharedToolbarModule,\n    SharedNamedFilterModule,\n  ],\n  declarations: [\n    // Components\n    AppFormField,\n    AppLoadingSpinner,\n    UploadFileComponent,\n    UploadFilePopover,\n    SharedTestsPage,\n  ],\n  exports: [\n    CommonModule,\n    IonicModule,\n    TranslateModule,\n    ReactiveFormsModule,\n    ColorPickerModule,\n    DragDropModule,\n    MarkdownModule,\n    NgxJdenticonModule,\n    RxStateModule,\n\n    // Sub-modules\n    SharedMaterialModule,\n    SharedDirectivesModule,\n    SharedPipesModule,\n    SharedHotkeysModule,\n    SharedToolbarModule,\n    SharedNamedFilterModule,\n\n    // Components\n    AppFormField,\n    AppLoadingSpinner,\n    UploadFileComponent,\n    UploadFilePopover,\n    SharedTestsPage,\n  ],\n})\nexport class SharedModule {\n  static forRoot(config?: SharedModuleConfig): ModuleWithProviders<SharedModule> {\n    console.debug('[shared] Creating module (root)');\n\n    return {\n      ngModule: SharedModule,\n\n      providers: [\n        // Load environment (if a loader has been defined)\n        ...(config?.loader\n          ? [\n              config.loader,\n\n              {\n                provide: APP_INITIALIZER,\n                deps: [EnvironmentLoader],\n                useFactory: (loader: EnvironmentLoader) => () => loader.load(),\n                multi: true,\n              },\n              {\n                provide: ENVIRONMENT,\n                deps: [EnvironmentLoader],\n                useFactory: (loader: EnvironmentLoader) => loader.get(),\n              },\n            ]\n          : []),\n\n        // { provide: StorageService, useClass: StorageService, deps: [ENVIRONMENT]},\n        { provide: APP_STORAGE, useExisting: StorageService },\n\n        StorageService,\n        AudioProvider,\n        FileService,\n        TranslateContextService,\n        DateFormatService,\n\n        // Export Pipes as providers\n        DateFromNowPipe,\n        DateDiffDurationPipe,\n        LatLongFormatPipe,\n        LatitudeFormatPipe,\n        LongitudeFormatPipe,\n        HighlightPipe,\n        NumberFormatPipe,\n\n        { provide: OverlayContainer, useClass: FullscreenOverlayContainer },\n        { provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: { formFieldAppearance: 'fill' } },\n        { provide: MatPaginatorIntl, useClass: MatPaginatorI18n, deps: [TranslateService] },\n        { provide: MatStepperIntl, useClass: MatStepperI18n, deps: [TranslateService] },\n\n        // FIXME: try to force a custom overlay for autocomplete, because of there is a bug when using inside an ionic modal\n        //{ provide: Overlay, useClass: Overlay},\n        { provide: MAT_AUTOCOMPLETE_SCROLL_STRATEGY, useFactory: scrollFactory, deps: [Overlay] },\n        {\n          provide: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS,\n          useValue: {\n            autoActiveFirstOption: true,\n          },\n        },\n        { provide: MAT_SELECT_SCROLL_STRATEGY, useFactory: scrollFactory, deps: [Overlay] },\n      ],\n    };\n  }\n}\n","import { AlertController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport class Alerts {\n  /**\n   * Ask the user to save before leaving. If return undefined: user has cancelled\n   * <p>\n   *   from a routed page, prefer using ComponentDirtyGuard\n   *\n   * @param alertCtrl\n   * @param translate\n   * @param event\n   */\n  static async askSaveBeforeLeave(alertCtrl: AlertController, translate: TranslateService, event?: Event): Promise<boolean | undefined> {\n    let confirm = false;\n    let cancel = false;\n    const translations = translate.instant([\n      'COMMON.BTN_SAVE',\n      'COMMON.BTN_CANCEL',\n      'COMMON.BTN_ABORT_CHANGES',\n      'CONFIRM.SAVE',\n      'CONFIRM.ALERT_HEADER',\n    ]);\n    const alert = await alertCtrl.create({\n      header: translations['CONFIRM.ALERT_HEADER'],\n      message: translations['CONFIRM.SAVE'],\n      buttons: [\n        {\n          text: translations['COMMON.BTN_CANCEL'],\n          role: 'cancel',\n          cssClass: 'secondary',\n          handler: () => {\n            cancel = true;\n          },\n        },\n        {\n          text: translations['COMMON.BTN_ABORT_CHANGES'],\n          cssClass: 'secondary',\n          handler: () => {},\n        },\n        {\n          text: translations['COMMON.BTN_SAVE'],\n          handler: () => {\n            confirm = true; // update upper value\n          },\n        },\n      ],\n    });\n    await alert.present();\n    await alert.onDidDismiss();\n\n    if (confirm) return true; // = Do save and leave\n\n    if (cancel) {\n      // Stop the event\n      if (event) event.preventDefault();\n\n      return undefined; // User cancelled\n    }\n\n    return false; // Leave without saving\n  }\n\n  /**\n   * Ask the user to conform an action. If return undefined: user has cancelled\n   *\n   * @param alertCtrl\n   * @param translate\n   * @param immediate is action has an immediate effect ?\n   * @param event\n   * @param interpolateParams\n   */\n  static async askActionConfirmation(\n    alertCtrl: AlertController,\n    translate: TranslateService,\n    immediate?: boolean,\n    event?: Event,\n    interpolateParams?: any\n  ): Promise<boolean | undefined> {\n    const messageKey = immediate === true ? 'CONFIRM.ACTION_IMMEDIATE' : 'CONFIRM.ACTION';\n    return Alerts.askConfirmation(messageKey, alertCtrl, translate, event, interpolateParams);\n  }\n\n  /**\n   * Ask the user to confirm. If return undefined: user has cancelled\n   *\n   * @pram messageKey i18n message key\n   * @param messageKey\n   * @param alertCtrl\n   * @param translate\n   * @param event\n   * @param interpolateParams\n   */\n  static async askConfirmation(\n    messageKey: string,\n    alertCtrl: AlertController,\n    translate: TranslateService,\n    event?: Event,\n    interpolateParams?: any\n  ): Promise<boolean | undefined> {\n    if (!alertCtrl || !translate) throw new Error(\"Missing required argument 'alertCtrl' or 'translate'\");\n    let confirm = false;\n    let cancel = false;\n    const translations = translate.instant(['COMMON.BTN_YES_CONTINUE', 'COMMON.BTN_CANCEL', messageKey, 'CONFIRM.ALERT_HEADER'], interpolateParams);\n    const alert = await alertCtrl.create({\n      header: translations['CONFIRM.ALERT_HEADER'],\n      message: translations[messageKey],\n      buttons: [\n        {\n          text: translations['COMMON.BTN_CANCEL'],\n          role: 'cancel',\n          cssClass: 'secondary',\n          handler: () => {\n            cancel = true;\n          },\n        },\n        {\n          text: translations['COMMON.BTN_YES_CONTINUE'],\n          handler: () => {\n            confirm = true; // update upper value\n          },\n        },\n      ],\n    });\n    await alert.present();\n    await alert.onDidDismiss();\n\n    if (confirm) return true; // = Do save and leave\n\n    if (cancel) {\n      // Stop the event\n      if (event) event.preventDefault();\n\n      return undefined; // User cancelled\n    }\n\n    return false; // Leave without saving\n  }\n\n  /**\n   * Ask the user to save before leaving. If return undefined: user has cancelled\n   *\n   * @param alertCtrl\n   * @param translate\n   * @param event\n   * @param interpolateParams\n   */\n  static async askDeleteConfirmation(\n    alertCtrl: AlertController,\n    translate: TranslateService,\n    event?: Event,\n    interpolateParams?: any\n  ): Promise<boolean | undefined> {\n    let confirm = false;\n    let cancel = false;\n    const translations = translate.instant(\n      ['COMMON.BTN_YES_DELETE', 'COMMON.BTN_CANCEL', 'CONFIRM.DELETE', 'CONFIRM.ALERT_HEADER'],\n      interpolateParams\n    );\n    const alert = await alertCtrl.create({\n      header: translations['CONFIRM.ALERT_HEADER'],\n      message: translations['CONFIRM.DELETE'],\n      buttons: [\n        {\n          text: translations['COMMON.BTN_CANCEL'],\n          role: 'cancel',\n          cssClass: 'secondary',\n          handler: () => {\n            cancel = true;\n          },\n        },\n        {\n          text: translations['COMMON.BTN_YES_DELETE'],\n          handler: () => {\n            confirm = true; // update upper value\n          },\n        },\n      ],\n    });\n    await alert.present();\n    await alert.onDidDismiss();\n\n    if (confirm) return true; // = Do save and leave\n\n    if (cancel) {\n      // Stop the event\n      if (event) event.preventDefault();\n\n      return undefined; // User cancelled\n    }\n\n    return false; // Leave without saving\n  }\n\n  static async askSaveBeforeAction(\n    alertCtrl: AlertController,\n    translate: TranslateService,\n    opts?: { valid?: boolean; validMessageI18n?: string; invalidMessageI18n?: string },\n    interpolateParams?: any\n  ): Promise<{ confirmed: boolean; save: boolean } | undefined> {\n    let save = false;\n    let confirmed = false;\n    let alert: HTMLIonAlertElement;\n    const validMessageI18n = opts?.validMessageI18n || 'CONFIRM.SAVE_BEFORE_CONTINUE';\n    const invalidMessageI18n = opts?.invalidMessageI18n || 'CONFIRM.CANCEL_CHANGES';\n\n    // Ask user before save\n    if (opts?.valid) {\n      const translations = translate.instant(\n        ['COMMON.BTN_CANCEL', 'COMMON.BTN_SAVE', 'COMMON.BTN_ABORT_CHANGES', 'CONFIRM.ALERT_HEADER', validMessageI18n],\n        interpolateParams\n      );\n      alert = await alertCtrl.create({\n        header: translations['CONFIRM.ALERT_HEADER'],\n        message: translations[validMessageI18n],\n        buttons: [\n          {\n            text: translations['COMMON.BTN_CANCEL'],\n            role: 'cancel',\n            cssClass: 'secondary',\n            handler: () => {},\n          },\n          {\n            text: translations['COMMON.BTN_ABORT_CHANGES'],\n            cssClass: 'secondary',\n            handler: () => {\n              confirmed = true;\n            },\n          },\n          {\n            text: translations['COMMON.BTN_SAVE'],\n            handler: () => {\n              save = true;\n              confirmed = true;\n            },\n          },\n        ],\n      });\n    } else {\n      const translations = translate.instant(\n        ['COMMON.BTN_ABORT_CHANGES', 'COMMON.BTN_CANCEL', 'CONFIRM.ALERT_HEADER', invalidMessageI18n],\n        interpolateParams\n      );\n\n      alert = await alertCtrl.create({\n        header: translations['CONFIRM.ALERT_HEADER'],\n        message: translations[invalidMessageI18n],\n        buttons: [\n          {\n            text: translations['COMMON.BTN_ABORT_CHANGES'],\n            cssClass: 'secondary',\n            handler: () => {\n              confirmed = true;\n            },\n          },\n          {\n            text: translations['COMMON.BTN_CANCEL'],\n            role: 'cancel',\n            handler: () => {},\n          },\n        ],\n      });\n    }\n\n    await alert.present();\n    await alert.onDidDismiss();\n\n    return { confirmed, save };\n  }\n\n  static async showError(\n    messageKey: string,\n    alertCtrl: AlertController,\n    translate: TranslateService,\n    opts?: {\n      titleKey?: string;\n    },\n    interpolateParams?: any\n  ) {\n    if (!messageKey || !alertCtrl || !translate) throw new Error(\"Missing a required argument ('messageKey', 'alertCtrl' or 'translate')\");\n    const titleKey = (opts && opts.titleKey) || 'ERROR.ALERT_HEADER';\n    const translations = translate.instant(['COMMON.BTN_OK', messageKey, titleKey], interpolateParams);\n    const alert = await alertCtrl.create({\n      header: translations[titleKey],\n      message: translations[messageKey],\n      buttons: [\n        {\n          text: translations['COMMON.BTN_OK'],\n          role: 'cancel',\n        },\n      ],\n    });\n    await alert.present();\n    await alert.onDidDismiss();\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot, UrlTree } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { AlertController } from '@ionic/angular';\nimport { Alerts } from '../alerts';\nimport { CanLeave } from '../../core/form/form.utils';\nimport { UrlUtils } from '../file/url.utils';\n\n@Injectable()\nexport class ComponentDirtyGuard implements CanDeactivate<CanLeave> {\n  private debug = false;\n\n  constructor(\n    protected translate: TranslateService,\n    protected alertCtrl: AlertController\n  ) {}\n\n  async canDeactivate(\n    component: CanLeave,\n    currentRoute: ActivatedRouteSnapshot,\n    currentState: RouterStateSnapshot,\n    nextState: RouterStateSnapshot\n  ): Promise<boolean | UrlTree> {\n    const dirty = component?.dirty;\n    const valid = component?.valid;\n    let can = {\n      confirmed: !dirty,\n      save: false,\n    };\n\n    if (this.debug) {\n      console.debug(`[dirty-guard] canDeactivate component dirty: ${dirty}, valid: ${valid}`);\n    }\n\n    if (dirty) {\n      // Ask confirmation\n      can = await Alerts.askSaveBeforeAction(this.alertCtrl, this.translate, { valid });\n    }\n\n    if (this.debug) console.debug(`[dirty-guard] confirm: ${can.confirmed}`);\n\n    if (can.confirmed) {\n      if (can.save) {\n        if (this.debug) console.debug(`[dirty-guard] do save`);\n        const saved = await component.save();\n        if (!saved) {\n          if (this.debug) console.debug(`[dirty-guard] save failed, cancel deactivate`);\n          return false;\n        }\n      } else {\n        if (this.debug) console.debug(`[dirty-guard] do cancel()`);\n        if (dirty) component.cancel();\n      }\n\n      // Emit\n      if (typeof component.deactivate === 'function') {\n        const currentUrl = UrlUtils.stripFragmentAndQuery(currentState.url);\n        const navigateForward = nextState.url.startsWith(UrlUtils.addTrailingSlash(currentUrl));\n        if (this.debug) console.debug(`[dirty-guard] calling deactivate() - navigateForward: ${navigateForward}`);\n        component.deactivate(navigateForward);\n      }\n\n      // Allow deactivation\n      return true;\n    }\n\n    // Cancel deactivate\n    return false;\n  }\n}\n","import { Injectable, NgModule } from '@angular/core';\nimport { ActivatedRouteSnapshot, RouteReuseStrategy, RouterModule } from '@angular/router';\nimport { IonicRouteStrategy } from '@ionic/angular';\nimport { ComponentDirtyGuard } from './guard/component-dirty.guard';\nimport { isNil, isNotNil } from './functions';\n\n@Injectable()\nexport class CustomReuseStrategy extends IonicRouteStrategy {\n  /**\n   * Force to reuse the route when:\n   *  - path change from [/new] -> [/:id]\n   *  - or path change from [/new] -> [/new?id=:id]\n   *\n   * @param future\n   * @param curr\n   */\n  shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\n    const reuse = super.shouldReuseRoute(future, curr);\n\n    // Is sam route config\n    if (!reuse && future.routeConfig && future.routeConfig === curr.routeConfig) {\n      // Read the parameter name, where id is stored\n      const pathIdParam = (future.routeConfig.data && future.routeConfig.data.pathIdParam) || 'id';\n\n      // Read the current route id\n      const currId =\n        curr.params[pathIdParam] === 'new'\n          ? curr.queryParams[pathIdParam] || curr.queryParams['id'] || 'new' // e.g. path like '/new/?id=<ID>'\n          : curr.params[pathIdParam]; // e.g. path like '/<ID>'\n\n      // Read the future route id\n      const futureId =\n        future.params[pathIdParam] === 'new'\n          ? future.queryParams[pathIdParam] || future.queryParams['id'] || 'new' // e.g. path like '/new/?id=<ID>'\n          : future.params[pathIdParam]; // e.g. path like '/<ID>'\n\n      // Reuse if same ID, using a futureId, if exists\n      if (isNotNil(futureId)) {\n        // Allow reuse when changing from /new to /new?id=:id\n        if (\n          currId === 'new' &&\n          isNil(curr.queryParams[pathIdParam]) &&\n          future.params[pathIdParam] === 'new' &&\n          isNotNil(future.queryParams[pathIdParam])\n        ) {\n          return true;\n        }\n\n        // Allow reuse same id, expect when expected '/new'\n        return futureId !== 'new' && futureId === currId;\n      }\n    }\n\n    return reuse;\n  }\n}\n\n@NgModule({\n  imports: [RouterModule],\n  providers: [\n    { provide: RouteReuseStrategy, useClass: CustomReuseStrategy },\n    { provide: ComponentDirtyGuard, useClass: ComponentDirtyGuard },\n  ],\n})\nexport class SharedRoutingModule {\n  constructor() {\n    console.debug('[shared-routing] Creating module...');\n  }\n}\n","import { Observable } from 'rxjs';\nimport { ProjectValueReducer, RxState } from '@rx-angular/state';\nimport { map } from 'rxjs/operators';\nimport { select } from '@rx-angular/state/selections';\nimport { Constructor } from '../types';\n\nlet production = false;\n\nexport function enableRxStateProdMode() {\n  production = true;\n}\n\nexport type ObservablePropertyDecorator<R> = <K extends PropertyKey>(target: any, propertyKey: K) => void;\nexport type StatePropertyDecorator<R> = <K extends PropertyKey>(target: any, propertyKey: K) => void;\n\n// Utility for decorators\nclass DecoratorUtils {\n  static capitalize(str: string): string {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n  }\n\n  static createMethodName(prefix: string, propertyKey: string): string {\n    return `${prefix}${this.capitalize(propertyKey)}`;\n  }\n\n  static createPropertyName(prefix: string, propertyKey: string): string {\n    return `${prefix}${this.capitalize(propertyKey)}`;\n  }\n\n  static validateStateProperty(target: Constructor<any>, stateObject: RxState<any>): void {\n    if (!stateObject) {\n      throw new Error(`Missing state! Please add a RxState in class: ${target.constructor.name}`);\n    }\n  }\n}\n\nconst STATE_VAR_NAME_KEY = '__stateName';\nconst DEFAULT_STATE_VAR_NAME = '_state';\n\n/**\n * Decorator to register the RxState property in a component\n */\nexport function RxStateRegister(): PropertyDecorator {\n  return function <P extends PropertyKey>(target: Constructor<any>, key: P) {\n    if (target[STATE_VAR_NAME_KEY]) {\n      throw new Error(`Cannot define more than one @RxStateRegister() in class hierarchy. Found: ${target[STATE_VAR_NAME_KEY]} and ${String(key)}`);\n    }\n\n    // Store the state property name\n    Object.defineProperty(target, STATE_VAR_NAME_KEY, {\n      value: String(key),\n      writable: false,\n      enumerable: false,\n      configurable: false,\n    });\n  };\n}\n\n/**\n * Decorator for RxState properties with getter/setter access\n */\nexport function RxStateProperty<T extends Object, K extends keyof T, R extends T[K] = T[K]>(\n  statePropertyName?: string | K,\n  projectValueReducer?: ProjectValueReducer<T, K, R>\n): StatePropertyDecorator<R> {\n  return function <P extends PropertyKey>(target: Constructor<any>, key: P) {\n    const finalStatePropertyName = String(statePropertyName || key) as K;\n    const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || DEFAULT_STATE_VAR_NAME;\n\n    // Define property with getter/setter\n    Object.defineProperty(target, key, {\n      get: function () {\n        const stateObject: RxState<T> = stateVarName ? this[stateVarName] : this;\n        DecoratorUtils.validateStateProperty(target, stateObject);\n        return stateObject.get(finalStatePropertyName);\n      },\n      set: function (value: R) {\n        const stateObject: RxState<T> = stateVarName ? this[stateVarName] : this;\n        DecoratorUtils.validateStateProperty(target, stateObject);\n        if (projectValueReducer) {\n          stateObject.set(finalStatePropertyName, (state: T) => projectValueReducer(state, value));\n        } else {\n          stateObject.set(<Partial<T>>{ [finalStatePropertyName]: value });\n        }\n      },\n      enumerable: true,\n      configurable: true,\n    });\n\n    // Development logging\n    if (!production) {\n      console.debug(`[RxStateProperty] ${target.constructor?.name}.${String(key)} -> state.${String(finalStatePropertyName)}`);\n    }\n  };\n}\n\n/**\n * Decorator for RxState observable selectors\n */\nexport function RxStateSelect<T extends Object = any, K extends keyof T = any, R extends T[K] = T[K]>(\n  statePropertyName?: string | K | '$',\n  opts?: {\n    stateName?: string;\n  }\n): ObservablePropertyDecorator<Observable<R>> {\n  return function <P extends PropertyKey>(target: any, key: P) {\n    // Naming convention check\n    if (!production && !(key as string).endsWith('$')) {\n      console.warn(\n        `[RxStateSelect] Convention: Property ${target.constructor?.name}.${String(key)} should end with '$' to indicate it's an Observable`\n      );\n    }\n\n    // Determine state property name\n    const finalStatePropertyName = (statePropertyName as string) || (key as string).replace(/\\$$/, '');\n\n    // Determine state object\n    const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || opts?.stateName || DEFAULT_STATE_VAR_NAME;\n\n    // Create cache property name\n    const internalPropertyName = `__${key as string}`;\n\n    // Define property with getter only\n    Object.defineProperty(target, key, {\n      get: function () {\n        const stateObject: RxState<T> = stateVarName ? this[stateVarName] : this;\n        DecoratorUtils.validateStateProperty(target, stateObject);\n\n        // Create observable if not exists\n        if (!this[internalPropertyName]) {\n          if (finalStatePropertyName === '$') {\n            this[internalPropertyName] = stateObject.$;\n          } else if (finalStatePropertyName.includes('.')) {\n            const args = finalStatePropertyName.split('.');\n            // @ts-ignore\n            this[internalPropertyName] = stateObject.select(...args);\n          } else {\n            this[internalPropertyName] = stateObject.select(finalStatePropertyName as K);\n          }\n        }\n\n        return this[internalPropertyName];\n      },\n      enumerable: true,\n      configurable: false,\n    });\n\n    // Development logging\n    if (!production) {\n      console.debug(`[RxStateSelect] ${target.constructor?.name}.${String(key)} -> state.select('${finalStatePropertyName}')`);\n    }\n  };\n}\n\n/**\n * Utility decorator to create computed observables from state\n */\nexport function RxStateComputed<T extends Object = any, K extends keyof T = any, R extends T[K] = T[K]>(\n  dependencies: K[],\n  computeFn?: (slice: Pick<T, K>) => R,\n  opts?: {\n    stateName?: string;\n    keyCompareMap?: any;\n  }\n): ObservablePropertyDecorator<Observable<R>> {\n  return function <P extends PropertyKey>(target: any, key: P) {\n    // Naming convention check\n    if (!production && !(key as string).endsWith('$')) {\n      console.warn(\n        `[RxStateComputed] Convention: Property ${target.constructor?.name}.${String(key)} should end with '$' to indicate it's an Observable`\n      );\n    }\n\n    const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || opts?.stateName || DEFAULT_STATE_VAR_NAME;\n    const cachePropertyName = `__${key as string}_cache`;\n\n    // Define property with getter only\n    Object.defineProperty(target, key, {\n      get: function () {\n        const stateObject: RxState<T> = stateVarName ? this[stateVarName] : this;\n        DecoratorUtils.validateStateProperty(target, stateObject);\n\n        // Create observable if not exists\n        if (!this[cachePropertyName]) {\n          let observable = stateObject.select(dependencies, opts?.keyCompareMap);\n\n          // Apply computeFn if provided\n          if (computeFn) {\n            observable = observable.pipe(map(computeFn));\n          }\n\n          this[cachePropertyName] = observable;\n        }\n\n        return this[cachePropertyName];\n      },\n      enumerable: true,\n      configurable: false,\n    });\n\n    // Development logging\n    if (!production) {\n      console.debug(\n        `[RxStateComputed] ${target.constructor?.name}.${String(key)} -> state.select([${dependencies.map((dep) => `'${dep as string}'`).join(', ')}])`\n      );\n    }\n  };\n}\n\n/**\n * Decorator for RxState observable as output\n */\nexport function RxStateOutput<T extends Object, K extends keyof T, R extends T[K] = T[K]>(\n  statePropertyName?: string | K | '$',\n  opts?: {\n    alias?: string;\n    stateName?: string;\n  }\n): ObservablePropertyDecorator<Observable<R>> {\n  return function <P extends PropertyKey>(target: any, key: P) {\n    // Naming convention check\n    if (!production && !(key as string).endsWith('Changes') && !(key as string).endsWith('Change')) {\n      console.warn(\n        `[RxStateOutput] Convention: Property ${target.constructor?.name}.${String(key)} should end with 'Change' or 'Changes' to indicate it's an Output`\n      );\n    }\n\n    // Determine state property name\n    const finalStatePropertyName = (statePropertyName as K) || ((key as string).replace(/Changes?$/, '') as K);\n\n    // Determine state object\n    const stateVarName = target instanceof RxState ? null : target[STATE_VAR_NAME_KEY] || opts?.stateName || DEFAULT_STATE_VAR_NAME;\n    const cachePropertyName = `__${key as string}_cache`;\n\n    // Define property with getter only\n    Object.defineProperty(target, key, {\n      get: function () {\n        const stateObject: RxState<T> = stateVarName ? this[stateVarName] : this;\n        DecoratorUtils.validateStateProperty(target, stateObject);\n\n        // Create observable if not exists\n        // See https://www.rx-angular.io/docs/state/getting-started#output-property-bindings\n        if (!this[cachePropertyName]) {\n          this[cachePropertyName] = finalStatePropertyName === '$' ? stateObject.$ : stateObject.$.pipe(select<T, K>(finalStatePropertyName));\n        }\n\n        return this[cachePropertyName];\n      },\n      enumerable: true,\n      configurable: false,\n    });\n\n    // Development logging\n    if (!production) {\n      console.debug(`[RxStateOutput] ${target.constructor?.name}.${String(key)} -> state.$.pipe(select('${String(finalStatePropertyName)}'))`);\n    }\n  };\n}\n","import { NgModule } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TextForm } from './text-form.component';\nimport { SharedModule } from '../../../shared/shared.module';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild()],\n\n  declarations: [\n    // Components\n    TextForm,\n  ],\n  exports: [\n    TranslateModule,\n    // Components\n    TextForm,\n  ],\n})\nexport class AppTextFormModule {}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { IconRef } from '../../shared/types';\n\nexport interface IconEntry {\n  name: string;\n  label: string;\n  keywords: string[];\n}\n\nexport interface IconsRefJson {\n  generatedAt: string;\n  ionic: IconEntry[];\n  material: IconEntry[];\n}\n\n/**\n * Service de chargement et de filtrage des icônes disponibles.\n * Charge le fichier assets/icons-ref.json en lazy (une seule fois).\n */\n@Injectable({ providedIn: 'root' })\nexport class IconSelectorService {\n  private _ionic = signal<IconEntry[]>([]);\n  private _material = signal<IconEntry[]>([]);\n  private _ready = false;\n  private _readyPromise: Promise<void> | null = null;\n\n  readonly ionicIcons = this._ionic.asReadonly();\n  readonly materialIcons = this._material.asReadonly();\n\n  constructor(private http: HttpClient) {}\n\n  ready(): Promise<void> {\n    if (this._ready) return Promise.resolve();\n    if (this._readyPromise) return this._readyPromise;\n\n    this._readyPromise = firstValueFrom(\n      this.http.get<IconsRefJson>('assets/icons-ref.json')\n    ).then((data) => {\n      this._ionic.set(data.ionic || []);\n      this._material.set(data.material || []);\n      this._ready = true;\n    });\n\n    return this._readyPromise;\n  }\n\n  /**\n   * Convertit un IconEntry en IconRef selon son origine.\n   */\n  toIconRef(entry: IconEntry, origin: 'ionic' | 'material'): IconRef {\n    if (origin === 'ionic') {\n      return { icon: entry.name };\n    }\n    return { matIcon: entry.name };\n  }\n\n  /**\n   * Filtre les icônes par texte de recherche.\n   * Cherche dans le nom, le label, et les mots-clés.\n   * Insensible à la casse.\n   */\n  search(searchText: string, origin: 'ionic' | 'material'): IconEntry[] {\n    const icons = origin === 'ionic' ? this._ionic() : this._material();\n    const q = (searchText || '').trim().toLowerCase();\n\n    if (!q) return icons;\n\n    return icons.filter(\n      (entry) =>\n        entry.name.toLowerCase().includes(q) ||\n        entry.label.toLowerCase().includes(q) ||\n        (entry.keywords || []).some((kw) => kw.includes(q))\n    );\n  }\n}","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Input } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ModalController } from '@ionic/angular';\nimport { Subject, debounceTime, distinctUntilChanged } from 'rxjs';\nimport { IconSelectorService, IconEntry } from './icon-selector.service';\nimport { IconRef } from '../../shared/types';\n\n@Component({\n  selector: 'app-icon-selector-modal',\n  templateUrl: './icon-selector.modal.html',\n  styleUrls: ['./icon-selector.modal.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppIconSelectorModal {\n  @Input() title = 'ICON_SELECTOR.TITLE';\n\n  protected readonly ionicTabIndex = 0;\n  protected readonly materialTabIndex = 1;\n\n  protected searchText = '';\n  protected ionicFiltered: IconEntry[] = [];\n  protected materialFiltered: IconEntry[] = [];\n  protected selectedIndex = 0;\n  protected loading = true;\n\n  private searchSubject = new Subject<string>();\n\n  private iconService = inject(IconSelectorService);\n  private viewCtrl = inject(ModalController);\n  private cdr = inject(ChangeDetectorRef);\n\n  constructor() {\n    this.loadIcons();\n\n    this.searchSubject\n      .pipe(\n        debounceTime(150),\n        distinctUntilChanged(),\n        takeUntilDestroyed()\n      )\n      .subscribe((value) => {\n        this.ionicFiltered = this.iconService.search(value, 'ionic');\n        this.materialFiltered = this.iconService.search(value, 'material');\n        this.cdr.markForCheck();\n      });\n  }\n\n  private async loadIcons(): Promise<void> {\n    await this.iconService.ready();\n    this.ionicFiltered = this.iconService.ionicIcons();\n    this.materialFiltered = this.iconService.materialIcons();\n    this.loading = false;\n    this.cdr.markForCheck();\n  }\n\n  onSearchChange(value: string): void {\n    this.searchText = value;\n    this.searchSubject.next(value);\n  }\n\n  selectIcon(entry: IconEntry, origin: 'ionic' | 'material'): void {\n    const ref = this.iconService.toIconRef(entry, origin);\n    this.viewCtrl.dismiss(ref);\n  }\n\n  cancel(): void {\n    this.viewCtrl.dismiss(null);\n  }\n}","<ion-header>\n  <ion-toolbar>\n    <ion-title>{{ title | translate }}</ion-title>\n    <ion-buttons slot=\"end\">\n      <ion-button (click)=\"cancel()\">\n        <mat-icon>close</mat-icon>\n      </ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <!-- Barre de recherche -->\n  <div class=\"search-bar\">\n    <mat-form-field appearance=\"outline\" class=\"search-field\">\n      <mat-label translate>COMMON.SEARCH</mat-label>\n      <input matInput type=\"text\" [ngModel]=\"searchText\" (ngModelChange)=\"onSearchChange($event)\" [placeholder]=\"'ICON_SELECTOR.SEARCH_PLACEHOLDER' | translate\" autofocus>\n      <mat-icon matSuffix>search</mat-icon>\n    </mat-form-field>\n  </div>\n\n  <!-- Onglets Ionic / Material -->\n  <mat-tab-group [(selectedIndex)]=\"selectedIndex\" *ngIf=\"!loading\">\n    <mat-tab>\n      <ng-template mat-tab-label>\n        {{ 'ICON_SELECTOR.TAB_IONIC' | translate }}\n        <span class=\"badge\" [matBadge]=\"ionicFiltered.length | badgeNumber\" matBadgeOverlap=\"false\" matBadgeSize=\"small\" matBadgeColor=\"primary\"></span>\n      </ng-template>\n      <div class=\"icon-grid\" *ngIf=\"selectedIndex === ionicTabIndex\">\n        <button mat-icon-button\n                *ngFor=\"let entry of ionicFiltered\"\n                [matTooltip]=\"entry.label\"\n                [attr.aria-label]=\"entry.label\"\n                (click)=\"selectIcon(entry, 'ionic')\">\n          <ion-icon [name]=\"entry.name\"></ion-icon>\n        </button>\n        <div *ngIf=\"ionicFiltered | isEmptyArray\" class=\"no-results\" translate>COMMON.NO_RESULT</div>\n      </div>\n    </mat-tab>\n\n    <mat-tab>\n      <ng-template mat-tab-label>\n        {{ 'ICON_SELECTOR.TAB_MATERIAL' | translate }}\n        <span class=\"badge\" [matBadge]=\"materialFiltered.length | badgeNumber\" matBadgeOverlap=\"false\" matBadgeSize=\"small\" matBadgeColor=\"accent\"></span>\n      </ng-template>\n      <div class=\"icon-grid\" *ngIf=\"selectedIndex === materialTabIndex\">\n        <button mat-icon-button\n                *ngFor=\"let entry of materialFiltered\"\n                [matTooltip]=\"entry.label\"\n                [attr.aria-label]=\"entry.label\"\n                (click)=\"selectIcon(entry, 'material')\">\n          <mat-icon>{{ entry.name }}</mat-icon>\n        </button>\n        <div *ngIf=\"materialFiltered | isEmptyArray\" class=\"no-results\" translate>COMMON.NO_RESULT</div>\n      </div>\n    </mat-tab>\n  </mat-tab-group>\n\n  <app-loading-spinner *ngIf=\"loading\"></app-loading-spinner>\n</ion-content>\n","import { Component, Input } from '@angular/core';\nimport { AppColors, IconRef } from '../../shared/types';\n\n@Component({\n  selector: 'app-icon',\n  templateUrl: './icon.component.html',\n})\nexport class AppIconComponent {\n  @Input() icon: string = null;\n  @Input() matIcon: string = null;\n  @Input() matSvgIcon: string = null;\n  @Input() color: AppColors = null;\n  @Input() height: number | string;\n  @Input() width: number | string;\n\n  @Input() set ref(value: IconRef) {\n    this.icon = value.icon;\n    this.matIcon = value.matIcon;\n    this.matSvgIcon = value.matSvgIcon;\n    this.color = value.color || this.color; // Keep existing, if not defined in the reference\n  }\n}\n","<ion-icon\n  *ngIf=\"icon; else matIconTemplate\"\n  slot=\"icon-only\"\n  [color]=\"color\"\n  [name]=\"icon\"\n  [style.height.px]=\"height\"\n  [style.width.px]=\"width\"\n></ion-icon>\n<ng-template #matIconTemplate>\n  <mat-icon\n    [svgIcon]=\"matSvgIcon\"\n    [style.color]=\"'var(--ion-color-' + color + ')'\"\n    [style.height.px]=\"height\"\n    [style.width.px]=\"width\"\n    [style.font-size.px]=\"height || width\"\n  >\n    {{ matIcon }}\n  </mat-icon>\n</ng-template>\n","import {booleanAttribute, Component, forwardRef, inject, Input, OnInit, Optional} from '@angular/core';\nimport {ControlValueAccessor, FormGroupDirective, NG_VALUE_ACCESSOR, UntypedFormControl} from '@angular/forms';\nimport { ModalController } from '@ionic/angular';\nimport {AppFloatLabelType, IconRef} from '../../shared/types';\nimport { AppIconSelectorModal } from './icon-selector.modal';\nimport {MatFormFieldAppearance, SubscriptSizing} from '@angular/material/form-field';\n\nconst noop = (_?: IconRef | null) => {};\n\n@Component({\n  selector: 'app-icon-selector-field',\n  templateUrl: './icon-selector.field.html',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => AppIconSelectorField),\n      multi: true,\n    },\n  ],\n})\nexport class AppIconSelectorField implements OnInit, ControlValueAccessor {\n\n  private _onChange: (value: IconRef | null) => void = noop;\n  private _onTouched: () => void = noop;\n  private modalCtrl = inject(ModalController);\n  private formGroupDir = inject(FormGroupDirective, {optional: true});\n\n  protected value: IconRef | null = null;\n\n  @Input({ transform: booleanAttribute }) disabled = false;\n  @Input() formControl: UntypedFormControl;\n  @Input() formControlName: string;\n  @Input() placeholder = '';\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() subscriptSizing: SubscriptSizing;\n\n\n  ngOnInit() {\n    this.formControl =\n      this.formControl || (this.formControlName && this.formGroupDir && (this.formGroupDir.form.get(this.formControlName) as UntypedFormControl));\n    if (!this.formControl) throw new Error(\"Missing mandatory attribute 'formControl' or 'formControlName' in <app-icon-selector-field>.\");\n\n  }\n\n  writeValue(obj: IconRef | null): void {\n    this.value = obj;\n  }\n\n  registerOnChange(fn: (value: IconRef | null) => void): void {\n    this._onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this._onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n\n  async openSelector(): Promise<void> {\n    if (this.disabled) return;\n\n    const modal = await this.modalCtrl.create({\n      component: AppIconSelectorModal,\n      componentProps: { title: 'ICON_SELECTOR.TITLE' },\n    });\n\n    await modal.present();\n    const result = await modal.onDidDismiss<IconRef | null>();\n    if (result.data !== undefined) {\n      this.value = result.data;\n      this._onChange(result.data);\n      this._onTouched();\n    }\n  }\n}\n","<mat-form-field [floatLabel]=\"value && (!floatLabel || floatLabel === 'auto') ? 'always' : (floatLabel | asFloatLabelType)\"\n                [appearance]=\"appearance\"\n                [subscriptSizing]=\"subscriptSizing\">\n\n  @if (floatLabel !== 'never' && !!placeholder) {\n    <mat-label>{{ placeholder }}</mat-label>\n  }\n\n  <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\"/>\n  @if (value) {\n    <app-icon [ref]=\"value\"></app-icon>\n  }\n\n  <!-- open selector modal -->\n  <button mat-icon-button matSuffix\n        type=\"button\"\n        [disabled]=\"disabled\"\n        (click)=\"openSelector()\"\n        class=\"icon-selector-btn\">\n    <mat-icon>list</mat-icon>\n  </button>\n</mat-form-field>\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\n// import ngx-translate and the http loader\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppIconComponent } from './icon.component';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule],\n\n  declarations: [AppIconComponent],\n  exports: [AppIconComponent],\n})\nexport class AppIconModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppIconSelectorModal } from './icon-selector.modal';\nimport { AppIconSelectorField } from './icon-selector.field';\nimport { AppIconModule } from './icon.module';\nimport { FormsModule } from '@angular/forms';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild(), AppIconModule, FormsModule],\n  declarations: [AppIconSelectorModal, AppIconSelectorField],\n  exports: [AppIconSelectorModal, AppIconSelectorField, AppIconModule],\n})\nexport class AppIconSelectorModule {}","import { catchError, tap } from 'rxjs/operators';\nimport { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { APP_PROGRESS_BAR_SERVICE, IProgressBarService } from '../services/progress-bar.service';\nimport { Inject } from '@angular/core';\n\nexport class ProgressInterceptor implements HttpInterceptor {\n  constructor(@Inject(APP_PROGRESS_BAR_SERVICE) private progressBarService: IProgressBarService) {}\n\n  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n    this.progressBarService.increase();\n    return next.handle(req).pipe(\n      tap((event) => {\n        if (event instanceof HttpResponse) {\n          this.progressBarService.decrease();\n        }\n      }),\n      catchError((err, event) => {\n        this.progressBarService.decrease();\n        throw err;\n      })\n    );\n  }\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  HostListener,\n  inject,\n  Input,\n  OnDestroy,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport { TableElement } from '@e-is/ngx-material-table';\nimport { AlertController, IonicSlides } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Swiper } from 'swiper/types';\nimport { Image, ImageSize } from '../../image.model';\nimport { isNilOrBlank } from '../../../functions';\nimport { createPromiseEventEmitter, emitPromiseEvent } from '../../../events';\nimport { Alerts } from '../../../alerts';\nimport { APP_SHOW_TOOLTIP } from '../../../constants';\nimport {ImageEditEvent, ImageEditFormat, ImageGallerySlideChangeEvent} from '../image-gallery.model';\nimport {waitFor, WaitForOptions} from '../../../observables';\nimport {fadeInAnimation, fadeInSlowAnimation} from '../../../material/material.animations';\n\ninterface CropRect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\ntype CropHandle = 'move' | 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\n/**\n * The zoom/pan/rotate/crop slideshow shown when clicking an image in `AppImageGalleryComponent`.\n * Extracted into its own component so the exact same slideshow can be presented either inside an\n * `ion-modal` (default), or inline as an overlay directly within the gallery, without any duplication.\n */\n@Component({\n  selector: 'app-image-gallery-slideshow',\n  templateUrl: './image-gallery-slideshow.component.html',\n  styleUrls: ['./image-gallery-slideshow.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AppImageGallerySlideshowComponent<T extends Image = Image> implements OnDestroy {\n  protected _swiper: Swiper;\n  protected swiperModules = [IonicSlides];\n  protected _activeIndex = 0;\n\n  // Mouse wheel zoom & rotation state\n  protected _zoomState = { scale: 1, tx: 0, ty: 0 };\n  protected _rotation = 0; // degrees: 0, 90, 180, 270\n  protected _dragState: { startX: number; startY: number; startTx: number; startTy: number } | null = null;\n  protected _wheelListener: ((e: WheelEvent) => void) | null = null;\n  protected _wheelEl: HTMLElement | null = null;\n\n  // Crop & rotate state. Rotation is always available; the crop grid/handles only show once the\n  // crop tool has been explicitly activated (fab button). Validate/cancel show up once something changed.\n  // Inset applied to the crop selection as soon as the tool is activated (or reset), so the resize\n  // handles start away from the image edges, where they are hard to grab.\n  protected readonly _defaultCropInset = 0.15;\n  protected _cropToolActive = false;\n  protected _cropRect: CropRect = { x: 0, y: 0, width: 1, height: 1 };\n  protected _cropOverlayRect: { width: number; height: number } | null = null;\n  protected _cropDragState: { handle: CropHandle; startX: number; startY: number; startRect: CropRect } | null = null;\n  protected readonly _cropHandles: CropHandle[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n\n  // Set by slidePrev()/slideNext() just before asking Swiper to move, so onSlideChange() can tell apart\n  // a \"step\" from a \"wrap\" unambiguously (with exactly 2 slides, both produce the very same index change).\n  protected _pendingSlideDirection: 'prev' | 'next' | null = null;\n\n  get activeIndex() {\n    return this._activeIndex ?? this.selectedIndex;\n  }\n\n  @Input() rows: TableElement<T>[] | ReadonlyArray<TableElement<T>> = [];\n  @Input() selectedIndex = 0;\n\n  @Input({ transform: booleanAttribute }) mobile = false;\n  @Input({ transform: booleanAttribute }) readOnly = false;\n  @Input({ transform: booleanAttribute }) disabled = false;\n  @Input({ transform: booleanAttribute }) debug = false;\n  @Input({ transform: booleanAttribute }) enableMouseZoom = false;\n  @Input() wheelZoomStep = 0.3;\n  @Input() maxZoomRatio = 3;\n  @Input({ transform: booleanAttribute }) enableRotate = true;\n  @Input({ transform: booleanAttribute }) enableCrop = true;\n  @Input() editionFormat: ImageEditFormat = 'png';\n  @Input() editionQuality = 0.92;\n  @Input() imageSizeQueryParam = 'size';\n  @Input() modalImageSize: ImageSize | string;\n  /** Whether reaching the last (resp. first) slide should wrap around to the first (resp. last) one. Default true. */\n  @Input({ transform: booleanAttribute }) enableLoop = true;\n  /** Whether more rows may exist beyond the ones currently loaded (e.g. a further page, not yet fetched). When true, reaching the last slide asks the parent (via `fetchMore`) instead of looping/stopping. */\n  @Input({ transform: booleanAttribute }) canFetchMore = false;\n\n  /** Requests deletion of the given row. The caller (gallery) owns the confirmation/deletion logic and resolves the promise with whether it actually happened. */\n  @Output() deleteRequested = createPromiseEventEmitter<boolean, { row: TableElement<T> }>();\n  @Output() closeRequested = new EventEmitter<void>();\n  @Output() afterEditImage = new EventEmitter<ImageEditEvent<T>>();\n  @Output() afterEditRow = new EventEmitter<TableElement<T>>();\n  /** Emitted whenever the active slide moves backward (previous image), whether triggered by the side button, a swipe, or looping past the first slide. */\n  @Output() previousSlide = new EventEmitter<ImageGallerySlideChangeEvent<T>>();\n  /** Emitted whenever the active slide moves forward (next image), whether triggered by the side button, a swipe, or looping past the last slide. */\n  @Output() nextSlide = new EventEmitter<ImageGallerySlideChangeEvent<T>>();\n  /**\n   * Emitted when reaching the last slide while `canFetchMore` is true: the parent is expected to fetch\n   * the next page (however it does so) and resolve with whether new rows were actually added.\n   */\n  @Output() fetchMore = createPromiseEventEmitter<boolean, void>();\n\n  @ViewChild('swiperContainer') swiperRef: ElementRef;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  protected get hasPendingEdit(): boolean {\n    const r = this._cropRect;\n    return this._rotation !== 0 || r.x !== 0 || r.y !== 0 || r.width !== 1 || r.height !== 1;\n  }\n\n  /** No \"fetch previous page\" concept exists: reaching the first slide can only loop, or stop. */\n  protected get isPrevDisabled(): boolean {\n    return !this.enableLoop && this._activeIndex === 0;\n  }\n\n  protected get isNextDisabled(): boolean {\n    return !this.enableLoop && !this.canFetchMore && this._activeIndex === this.rows.length - 1;\n  }\n\n  constructor(\n    protected alterCtrl: AlertController,\n    protected translate: TranslateService,\n    protected cd: ChangeDetectorRef\n  ) {}\n\n  ngOnDestroy() {\n    this._cleanupWheelZoom();\n  }\n\n  protected getSwiper(swiperElement?: any): Swiper {\n    this._swiper = (swiperElement || this.swiperRef?.nativeElement)?.swiper || this._swiper;\n    return this._swiper;\n  }\n\n  protected async waitForSwiper(swiperElement?: any, waitForOptions?: WaitForOptions): Promise<Swiper> {\n    await waitFor(() => !!this.getSwiper(swiperElement), {checkPeriod: 50, timeout: 500, ...waitForOptions})\n    return this._swiper;\n  }\n\n  /**\n   * Waits (a few animation frames) until Swiper's own slides array reflects at least `minCount` items.\n   * Needed after `fetchMore`: the new `<swiper-slide>` elements come from the `rows` input re-rendering,\n   * which may not have reached the DOM by the time the parent's returned promise resolves.\n   */\n  protected _waitForSlideCount(swiper: Swiper, minCount: number, retriesLeft = 30): Promise<boolean> {\n    if ((swiper.slides?.length ?? 0) >= minCount) return Promise.resolve(true);\n    if (retriesLeft <= 0) return Promise.resolve(false);\n    return new Promise<boolean>((resolve) => {\n      requestAnimationFrame(() => resolve(this._waitForSlideCount(swiper, minCount, retriesLeft - 1)));\n    });\n  }\n\n  protected onSlideChange(swiperElement: any) {\n    const swiper = this.getSwiper(swiperElement);\n    const previousIndex = swiper.previousIndex;\n    const activeIndex = swiper.activeIndex;\n    this._activeIndex = activeIndex;\n    this._resetZoom(swiperElement);\n    this._updateSwiperTouchMove(swiperElement);\n    this.markForCheck();\n    this._emitSlideChange(previousIndex, activeIndex);\n  }\n\n  /**\n   * Emits `previousSlide`/`nextSlide` from the actual index change, covering side buttons as well as touch\n   * swipes. When `slidePrev()`/`slideNext()` triggered the change, their explicit intent is used (since with\n   * exactly 2 slides, a \"step\" and a manual \"wrap\" produce the very same index change and can't be told apart\n   * from the indexes alone). Otherwise (a plain touch swipe) Swiper never wraps on its own (no `loop` mode\n   * configured here), so a simple index comparison is unambiguous.\n   */\n  protected _emitSlideChange(previousIndex: number, activeIndex: number) {\n    if (previousIndex === activeIndex) return;\n    const isNext = this._pendingSlideDirection ? this._pendingSlideDirection === 'next' : activeIndex > previousIndex;\n    this._pendingSlideDirection = null;\n    const event: ImageGallerySlideChangeEvent<T> = { index: activeIndex, row: this.rows?.[activeIndex] };\n    (isNext ? this.nextSlide : this.previousSlide).emit(event);\n  }\n\n  protected async onSwiperInit(swiperElement: any) {\n    this._resetZoom(swiperElement);\n\n    // Get the swiper\n    const swiper = await this.waitForSwiper(swiperElement, {timeout: 1000});\n\n    // The `initialSlide` binding can NOT work here: Angular inserts <swiper-container> into the DOM (which\n    // synchronously runs its connectedCallback, constructing the Swiper instance and reading `initialSlide`\n    // off the element) *before* it applies property bindings in its update pass -- so Swiper always reads\n    // `initialSlide` as unset (0). It must be corrected explicitly, once Swiper actually exists.\n    if (this.selectedIndex > 0 && swiper && swiper.activeIndex !== this.selectedIndex) {\n      swiper.slideTo(this.selectedIndex, 0 /*no transition, to avoid a \"revert\" effect*/);\n    }\n    this._activeIndex = swiper?.activeIndex ?? this.selectedIndex;\n    if (this.debug) console.debug(`[image-gallery-slideshow] Initializing slideshow, activeSlideIndex=${this._activeIndex}`);\n    this._setupWheelZoom(swiperElement);\n    this._updateSwiperTouchMove(swiperElement);\n    this.markForCheck();\n    setTimeout(() => {\n      this._updateEditImageSize(swiperElement);\n      this._updateCropOverlayPosition(swiperElement);\n    });\n  }\n\n  /**\n   * Swiper's own touch/mouse-drag-to-swipe gesture is captured very early (before our crop overlay's\n   * own mousedown handler can stop it), so it must be disabled upfront whenever the crop tool is active\n   * -- otherwise dragging inside the crop selection ends up sliding to the next/previous image instead.\n   * Prev/next arrow buttons keep working, since they call the Swiper API directly.\n   */\n  protected _updateSwiperTouchMove(swiperElement: any) {\n    const swiper = this.getSwiper(swiperElement);\n    if (!swiper) return;\n    swiper.allowTouchMove = !this._cropToolActive;\n  }\n\n  protected async zoom(swiperElement: any, zoomIn: boolean) {\n    if (this.debug) console.debug('[image-gallery-slideshow] zoom ' + (zoomIn ? 'in' : 'out'), swiperElement);\n    if (this.enableMouseZoom) {\n      const delta = zoomIn ? this.wheelZoomStep : -this.wheelZoomStep;\n      const newScale = Math.max(1, Math.min(this._zoomState.scale + delta, this.maxZoomRatio));\n      if (newScale === this._zoomState.scale) return;\n      if (newScale === 1) {\n        this._zoomState = { scale: 1, tx: 0, ty: 0 };\n      } else {\n        this._zoomState.scale = newScale;\n        this._clampTranslations(swiperElement);\n      }\n      this._applyZoom(swiperElement);\n    } else {\n      const swiper = this.getSwiper(swiperElement);\n      if (zoomIn) swiper.zoom.in();\n      else swiper.zoom.out();\n    }\n  }\n\n  protected async requestDelete(swiperElement: any): Promise<boolean> {\n    const swiper = this.getSwiper(swiperElement);\n    const currentRow = this.rows.find((row, index) => index === swiper.activeIndex);\n    if (!currentRow) return false; // Row not found\n\n    let deleted = false;\n    try {\n      deleted = await emitPromiseEvent(this.deleteRequested, 'delete', { detail: { row: currentRow } });\n    } catch (err) {\n      if (err === 'CANCELLED') return false; // User cancel\n      throw err;\n    }\n\n    if (deleted) {\n      if (!this.rows?.length) {\n        this.closeRequested.emit();\n      } else {\n        this._resetZoom(swiperElement);\n        swiper.update();\n        this.markForCheck();\n      }\n    }\n    return deleted;\n  }\n\n  async slidePrev(swiperElement?: any) {\n    const swiper = this.getSwiper(swiperElement);\n    if (!swiper) return;\n\n    const activeIndex = swiper?.activeIndex ?? this.selectedIndex;\n    if (activeIndex === 0) {\n      // No previous page concept (pagination only ever loads forward): just loop, or stay put\n      if (!this.enableLoop) return;\n      this._pendingSlideDirection = 'prev';\n      await swiper.slideTo(this.rows.length - 1, 0 /*no transition, to avoid a \"revert\" effect*/);\n    } else {\n      this._pendingSlideDirection = 'prev';\n      await swiper.slidePrev();\n    }\n  }\n\n  async slideNext(swiperElement?: any) {\n    const swiper = this.getSwiper(swiperElement);\n    if (!swiper) return;\n\n    const activeIndex = swiper.activeIndex;\n    if (activeIndex === this.rows.length - 1) {\n      // Try fetching a further page first, before falling back to looping/stopping\n      if (this.canFetchMore && this.fetchMore.observed) {\n        const rowCountBeforeFetch = this.rows.length;\n        let fetched = false;\n        try {\n          fetched = await emitPromiseEvent(this.fetchMore, 'fetchMore');\n        } catch (err) {\n          if (err !== 'CANCELLED') throw err;\n        }\n        if (fetched && this.rows.length > rowCountBeforeFetch) {\n          // The new <swiper-slide> elements come from the `rows` input re-rendering, which may not have\n          // reached the DOM yet at this point: wait for Swiper to actually see the extra slide(s).\n          await this._waitForSlideCount(swiper, rowCountBeforeFetch + 1);\n          this._pendingSlideDirection = 'next';\n          await swiper.slideNext();\n          return;\n        }\n        // Nothing new was actually added: fall through to loop/stop below\n      }\n      if (!this.enableLoop) return;\n      this._pendingSlideDirection = 'next';\n      await swiper.slideTo(0, 0 /*no transition, to avoid a \"revert\" effect*/);\n    } else {\n      this._pendingSlideDirection = 'next';\n      await swiper.slideNext();\n    }\n  }\n\n  protected getImageSizeQueryParams(): { [key: string]: any } {\n    if (!this.imageSizeQueryParam || isNilOrBlank(this.modalImageSize)) return undefined;\n    return {\n      [this.imageSizeQueryParam]: this.modalImageSize,\n    };\n  }\n\n  // --- Crop & rotate tools: always available (no \"enter edit mode\" step) ---\n  // Validate/Cancel only appear once the user actually changed something (see `hasPendingEdit`).\n\n  protected discardEdit(swiperElement: any) {\n    this._resetEditState(swiperElement);\n  }\n\n  protected resetCrop(_swiperElement: any) {\n    this._cropRect = this._createDefaultCropRect();\n    this.markForCheck();\n  }\n\n  protected _createDefaultCropRect(): CropRect {\n    const inset = this._defaultCropInset;\n    return { x: inset, y: inset, width: 1 - 2 * inset, height: 1 - 2 * inset };\n  }\n\n  protected toggleCropTool(swiperElement: any) {\n    if (!this.enableCrop || this.readOnly) return;\n    this._cropToolActive = !this._cropToolActive;\n    if (this._cropToolActive) {\n      // Start with an inset selection: handles right at the image edges are hard to grab\n      this._cropRect = this._createDefaultCropRect();\n    } else {\n      // Discard any pending crop selection when hiding the tool\n      this._cropRect = { x: 0, y: 0, width: 1, height: 1 };\n      this._cropDragState = null;\n    }\n    this._updateSwiperTouchMove(swiperElement);\n    this.markForCheck();\n    if (this._cropToolActive) {\n      // Wait for the crop overlay to be rendered, then compute its position\n      setTimeout(() => this._updateCropOverlayPosition(swiperElement));\n    }\n  }\n\n  protected async validateEdit(swiperElement: any) {\n    const swiper = this.getSwiper(swiperElement);\n    const currentRow = this.rows.find((row, index) => index === swiper.activeIndex);\n    if (!currentRow) return;\n\n    const image = currentRow.currentData as T;\n    const format = this.editionFormat ?? 'png';\n    const mimeType = 'image/' + format;\n    const quality = format === 'jpeg' ? this.editionQuality : undefined;\n\n    try {\n      const canvas = await this._renderEditedImage(image, this._rotation, this._cropRect);\n      const dataUrl = canvas.toDataURL(mimeType, quality);\n      const blob = await new Promise<Blob>((resolve, reject) => {\n        canvas.toBlob((b) => (b ? resolve(b) : reject(new Error('canvas.toBlob() failed'))), mimeType, quality);\n      });\n\n      // Update the row, so the slideshow and thumbnail reflect the change immediately\n      image.dataUrl = dataUrl;\n      image.url = null;\n\n      this.afterEditImage.emit({ row: currentRow, image, dataUrl, blob, format });\n      this.afterEditRow.emit(currentRow);\n\n      this._resetEditState(swiperElement);\n    } catch (err) {\n      console.error('[image-gallery-slideshow] Failed to export the edited image', err);\n      await Alerts.showError('IMAGE.GALLERY.ERROR_EDIT_IMAGE', this.alterCtrl, this.translate);\n    }\n  }\n\n  protected _resetEditState(swiperElement: any) {\n    this._rotation = 0;\n    this._cropRect = { x: 0, y: 0, width: 1, height: 1 };\n    this._cropDragState = null;\n    this._cropToolActive = false;\n    this._applyZoom(swiperElement);\n    this._updateEditImageSize(swiperElement);\n    this._updateSwiperTouchMove(swiperElement);\n    this.markForCheck();\n  }\n\n  @HostListener('window:resize')\n  protected onWindowResize() {\n    const swiperElement = this.swiperRef?.nativeElement;\n    if (!swiperElement) return;\n    this._updateEditImageSize(swiperElement);\n    this._updateCropOverlayPosition(swiperElement);\n  }\n\n  protected rotate(swiperElement: any, direction: 'left' | 'right') {\n    if (!this.enableRotate) return;\n    const delta = direction === 'right' ? 90 : -90;\n    this._rotation = (((this._rotation + delta) % 360) + 360) % 360;\n    this._applyZoom(swiperElement);\n    this._updateEditImageSize(swiperElement);\n    this._updateCropOverlayPosition(swiperElement);\n  }\n\n  /**\n   * Constrains the displayed image so that, even once rotated 90°/270° via CSS transform,\n   * its visual bounding box always fits inside the slide container (no overflow).\n   */\n  protected _updateEditImageSize(swiperElement: any, retriesLeft = 60) {\n    const swiper = this.getSwiper(swiperElement);\n    const activeSlide = swiper?.slides?.[swiper.activeIndex] as HTMLElement;\n    if (!activeSlide) return;\n    const containerEl = activeSlide.querySelector('.swiper-zoom-container') as HTMLElement;\n    const imgEl = activeSlide.querySelector('.swiper-zoom-target, .swiper-zoom-container > img') as HTMLElement;\n    if (!containerEl || !imgEl) return;\n    if (!this.enableCrop && !this.enableRotate) {\n      imgEl.style.width = '';\n      imgEl.style.height = '';\n      return;\n    }\n    const containerRect = containerEl.getBoundingClientRect();\n    const naturalSize = this._getImageNaturalSize(imgEl);\n    // The container/image may not be laid out or loaded yet: skip and retry on the next frame\n    if (!containerRect.width || !containerRect.height || !naturalSize) {\n      if (retriesLeft > 0) {\n        requestAnimationFrame(() => this._updateEditImageSize(swiperElement, retriesLeft - 1));\n      }\n      return;\n    }\n    // Compute the exact box (preserving the image's aspect ratio) that fits the available space,\n    // swapping width/height when rotated 90°/270° so the rotated visual box never overflows.\n    const swapped = this._rotation % 180 !== 0;\n    const availWidth = swapped ? containerRect.height : containerRect.width;\n    const availHeight = swapped ? containerRect.width : containerRect.height;\n    const ratio = Math.min(availWidth / naturalSize.width, availHeight / naturalSize.height);\n    imgEl.style.width = `${naturalSize.width * ratio}px`;\n    imgEl.style.height = `${naturalSize.height * ratio}px`;\n  }\n\n  protected _getImageNaturalSize(imgEl: HTMLElement): { width: number; height: number } | null {\n    const inner = (imgEl.tagName === 'ION-IMG' ? imgEl.shadowRoot?.querySelector('img') : imgEl) as HTMLImageElement;\n    if (!inner?.naturalWidth || !inner?.naturalHeight) return null;\n    return { width: inner.naturalWidth, height: inner.naturalHeight };\n  }\n\n  // --- Crop overlay: drag to move/resize the crop rectangle ---\n\n  protected onCropPointerDown(event: MouseEvent | TouchEvent, swiperElement: any, handle: CropHandle) {\n    event.preventDefault();\n    event.stopPropagation();\n    const pt = this._getEventPoint(event);\n    this._cropOverlayRect = this._cropOverlayRect ?? this._updateCropOverlayPosition(swiperElement);\n    this._cropDragState = {\n      handle,\n      startX: pt.x,\n      startY: pt.y,\n      startRect: { ...this._cropRect },\n    };\n    // Also disable programmatic slide navigation while dragging (allowTouchMove is already\n    // permanently off whenever crop is enabled, see `_updateSwiperTouchMove`)\n    const swiper = this.getSwiper(swiperElement);\n    if (swiper) {\n      swiper.allowSlideNext = false;\n      swiper.allowSlidePrev = false;\n    }\n  }\n\n  protected onCropPointerMove(event: MouseEvent | TouchEvent, _swiperElement: any) {\n    if (!this._cropDragState) return;\n    event.preventDefault();\n    const rect = this._cropOverlayRect;\n    if (!rect?.width || !rect?.height) return;\n    const pt = this._getEventPoint(event);\n    const dx = (pt.x - this._cropDragState.startX) / rect.width;\n    const dy = (pt.y - this._cropDragState.startY) / rect.height;\n    this._cropRect = this._computeCropRect(this._cropDragState.handle, this._cropDragState.startRect, dx, dy);\n    this.markForCheck();\n  }\n\n  protected onCropPointerUp(_event: MouseEvent | TouchEvent, swiperElement?: any) {\n    if (!this._cropDragState) return;\n    this._cropDragState = null;\n    const swiper = swiperElement ? this.getSwiper(swiperElement) : null;\n    if (swiper) {\n      swiper.allowSlideNext = true;\n      swiper.allowSlidePrev = true;\n    }\n    if (swiperElement) this._updateSwiperTouchMove(swiperElement);\n  }\n\n  protected _computeCropRect(handle: CropHandle, start: CropRect, dx: number, dy: number): CropRect {\n    const MIN_SIZE = 0.08;\n    const clamp01 = (v: number) => Math.max(0, Math.min(1, v));\n\n    if (handle === 'move') {\n      let x = clamp01(start.x + dx);\n      let y = clamp01(start.y + dy);\n      x = Math.min(x, 1 - start.width);\n      y = Math.min(y, 1 - start.height);\n      return { x, y, width: start.width, height: start.height };\n    }\n\n    let left = start.x;\n    let top = start.y;\n    let right = start.x + start.width;\n    let bottom = start.y + start.height;\n\n    if (handle.includes('w')) left = clamp01(start.x + dx);\n    if (handle.includes('e')) right = clamp01(start.x + start.width + dx);\n    if (handle.includes('n')) top = clamp01(start.y + dy);\n    if (handle.includes('s')) bottom = clamp01(start.y + start.height + dy);\n\n    if (right - left < MIN_SIZE) {\n      if (handle.includes('w')) left = right - MIN_SIZE;\n      else right = left + MIN_SIZE;\n    }\n    if (bottom - top < MIN_SIZE) {\n      if (handle.includes('n')) top = bottom - MIN_SIZE;\n      else bottom = top + MIN_SIZE;\n    }\n\n    left = clamp01(left);\n    right = clamp01(right);\n    top = clamp01(top);\n    bottom = clamp01(bottom);\n\n    return { x: left, y: top, width: right - left, height: bottom - top };\n  }\n\n  protected _getEventPoint(event: MouseEvent | TouchEvent): { x: number; y: number } {\n    if ('touches' in event && event.touches.length) {\n      return { x: event.touches[0].clientX, y: event.touches[0].clientY };\n    }\n    if ('changedTouches' in event && event.changedTouches.length) {\n      return { x: event.changedTouches[0].clientX, y: event.changedTouches[0].clientY };\n    }\n    const mouseEvent = event as MouseEvent;\n    return { x: mouseEvent.clientX, y: mouseEvent.clientY };\n  }\n\n  protected _updateCropOverlayPosition(swiperElement: any, retriesLeft = 60): { width: number; height: number } | null {\n    const swiper = this.getSwiper(swiperElement);\n    const activeSlide = swiper?.slides?.[swiper.activeIndex] as HTMLElement;\n    if (!activeSlide) return null;\n    const containerEl = activeSlide.querySelector('.swiper-zoom-container') as HTMLElement;\n    const imgEl = activeSlide.querySelector('.swiper-zoom-target, .swiper-zoom-container > img') as HTMLElement;\n    const overlayEl = activeSlide.querySelector('.crop-overlay') as HTMLElement;\n    if (!containerEl || !imgEl || !overlayEl) return null;\n    const containerRect = containerEl.getBoundingClientRect();\n    const imgRect = imgEl.getBoundingClientRect();\n    // The image may not be laid out yet: keep any previous (non-zero) value and retry on the next frame\n    if (!imgRect.width || !imgRect.height) {\n      if (retriesLeft > 0) {\n        requestAnimationFrame(() => this._updateCropOverlayPosition(swiperElement, retriesLeft - 1));\n      }\n      return this._cropOverlayRect;\n    }\n    overlayEl.style.left = `${imgRect.left - containerRect.left}px`;\n    overlayEl.style.top = `${imgRect.top - containerRect.top}px`;\n    overlayEl.style.width = `${imgRect.width}px`;\n    overlayEl.style.height = `${imgRect.height}px`;\n    this._cropOverlayRect = { width: imgRect.width, height: imgRect.height };\n    return this._cropOverlayRect;\n  }\n\n  // --- Canvas rendering, used to export the cropped/rotated image ---\n\n  protected async _renderEditedImage(image: Image, rotation: number, cropRect: CropRect): Promise<HTMLCanvasElement> {\n    const src = image.dataUrl || image.url;\n    const img = await this._loadImageElement(src);\n    const sw = img.naturalWidth;\n    const sh = img.naturalHeight;\n    const swapped = rotation % 180 !== 0;\n    const rw = swapped ? sh : sw;\n    const rh = swapped ? sw : sh;\n\n    // 1) Draw the full (uncropped) image, rotated\n    const rotCanvas = document.createElement('canvas');\n    rotCanvas.width = rw;\n    rotCanvas.height = rh;\n    const rctx = rotCanvas.getContext('2d');\n    rctx.translate(rw / 2, rh / 2);\n    rctx.rotate((rotation * Math.PI) / 180);\n    rctx.drawImage(img, -sw / 2, -sh / 2);\n\n    // 2) Crop the rotated image\n    const cropX = Math.round(cropRect.x * rw);\n    const cropY = Math.round(cropRect.y * rh);\n    const cropW = Math.max(1, Math.round(cropRect.width * rw));\n    const cropH = Math.max(1, Math.round(cropRect.height * rh));\n\n    const outCanvas = document.createElement('canvas');\n    outCanvas.width = cropW;\n    outCanvas.height = cropH;\n    outCanvas.getContext('2d').drawImage(rotCanvas, cropX, cropY, cropW, cropH, 0, 0, cropW, cropH);\n\n    return outCanvas;\n  }\n\n  protected _loadImageElement(src: string): Promise<HTMLImageElement> {\n    return new Promise((resolve, reject) => {\n      const img = new Image();\n      if (!src.startsWith('data:')) img.crossOrigin = 'anonymous';\n      img.onload = () => resolve(img);\n      img.onerror = () => reject(new Error(`[image-gallery-slideshow] Cannot load image: ${src}`));\n      img.src = src;\n    });\n  }\n\n  // --- Mouse-wheel zoom & mouse-drag pan ---\n\n  protected onPointerDown(event: MouseEvent, swiperElement: any) {\n    if (!this.enableMouseZoom || this._zoomState.scale <= 1) return;\n    // Don't intercept clicks on buttons/controls\n    if ((event.target as HTMLElement).closest('ion-fab-button, ion-button, button')) return;\n    event.preventDefault();\n    this._dragState = {\n      startX: event.clientX,\n      startY: event.clientY,\n      startTx: this._zoomState.tx,\n      startTy: this._zoomState.ty,\n    };\n    const wrapEl = this._getActiveZoomWrapEl(swiperElement);\n    if (wrapEl) wrapEl.style.cursor = 'grabbing';\n\n    // Disable Swiper slide-change while dragging\n    const swiper = this.getSwiper(swiperElement);\n    if (swiper) {\n      swiper.allowSlideNext = false;\n      swiper.allowSlidePrev = false;\n    }\n  }\n\n  protected onPointerMove(event: MouseEvent, swiperElement: any) {\n    if (this._cropDragState) {\n      this.onCropPointerMove(event, swiperElement);\n      return;\n    }\n    if (!this._dragState) return;\n    event.preventDefault();\n    this._zoomState.tx = this._dragState.startTx + event.clientX - this._dragState.startX;\n    this._zoomState.ty = this._dragState.startTy + event.clientY - this._dragState.startY;\n    this._clampTranslations(swiperElement);\n    this._applyZoom(swiperElement);\n  }\n\n  protected onPointerUp(event: MouseEvent, swiperElement?: any) {\n    if (this._cropDragState) {\n      this.onCropPointerUp(event, swiperElement);\n      return;\n    }\n    if (!this._dragState) return;\n    this._dragState = null;\n    const wrapEl = this._getActiveZoomWrapEl(swiperElement);\n    if (wrapEl) wrapEl.style.cursor = this._zoomState.scale > 1 ? 'grab' : '';\n    // Re-enable Swiper navigation\n    const swiper = swiperElement ? this.getSwiper(swiperElement) : null;\n    if (swiper) {\n      swiper.allowSlideNext = true;\n      swiper.allowSlidePrev = true;\n    }\n  }\n\n  protected _resetZoom(swiperElement?: any) {\n    this._zoomState = { scale: 1, tx: 0, ty: 0 };\n    this._dragState = null;\n    this._rotation = 0;\n    this._cropRect = { x: 0, y: 0, width: 1, height: 1 };\n    this._cropDragState = null;\n    this._cropToolActive = false;\n    if (swiperElement) {\n      this._applyZoom(swiperElement);\n      this._updateEditImageSize(swiperElement);\n    }\n  }\n\n  protected _setupWheelZoom(swiperElement: any) {\n    this._cleanupWheelZoom();\n    if (!this.enableMouseZoom) return;\n    const el: HTMLElement = swiperElement?.nativeElement ?? swiperElement;\n    if (!el) return;\n\n    this._wheelListener = (event: WheelEvent) => {\n      event.preventDefault();\n      const step = this.wheelZoomStep;\n      const oldScale = this._zoomState.scale;\n      const newScale = Math.max(1, Math.min(oldScale + (event.deltaY < 0 ? step : -step), this.maxZoomRatio));\n      if (newScale === oldScale) return;\n\n      if (newScale === 1) {\n        this._zoomState = { scale: 1, tx: 0, ty: 0 };\n      } else {\n        // Zoom towards cursor position\n        const swiper = this.getSwiper(el);\n        const activeSlide = swiper?.slides?.[swiper.activeIndex] as HTMLElement;\n        if (activeSlide) {\n          const rect = activeSlide.getBoundingClientRect();\n          const cx = event.clientX - rect.left - rect.width / 2;\n          const cy = event.clientY - rect.top - rect.height / 2;\n          this._zoomState.tx = cx - ((cx - this._zoomState.tx) * newScale) / oldScale;\n          this._zoomState.ty = cy - ((cy - this._zoomState.ty) * newScale) / oldScale;\n        }\n        this._zoomState.scale = newScale;\n        this._clampTranslations(el);\n      }\n      this._applyZoom(el);\n    };\n\n    el.addEventListener('wheel', this._wheelListener, { passive: false });\n    this._wheelEl = el;\n  }\n\n  protected _cleanupWheelZoom() {\n    if (this._wheelEl && this._wheelListener) {\n      this._wheelEl.removeEventListener('wheel', this._wheelListener);\n    }\n    this._wheelEl = null;\n    this._wheelListener = null;\n  }\n\n  protected _applyZoom(swiperElement: any) {\n    const swiper = this.getSwiper(swiperElement);\n    const activeSlide = swiper?.slides?.[swiper.activeIndex] as HTMLElement;\n    if (!activeSlide) return;\n    const wrapEl = activeSlide.querySelector('.swiper-zoom-container') as HTMLElement;\n    const imgEl = activeSlide.querySelector('.swiper-zoom-target, .swiper-zoom-container > img') as HTMLElement;\n    if (!wrapEl || !imgEl) return;\n    const { scale, tx, ty } = this._zoomState;\n    wrapEl.style.transitionDuration = '0ms';\n    wrapEl.style.transform = `translate3d(${tx}px, ${ty}px, 0)`;\n    imgEl.style.transitionDuration = '0ms';\n    imgEl.style.transform = `translate3d(0, 0, 0) scale(${scale}) rotate(${this._rotation}deg)`;\n    wrapEl.style.cursor = scale > 1 ? 'grab' : '';\n  }\n\n  protected _clampTranslations(swiperElement: any) {\n    const swiper = this.getSwiper(swiperElement);\n    const activeSlide = swiper?.slides?.[swiper.activeIndex] as HTMLElement;\n    if (!activeSlide) return;\n    const imgEl = activeSlide.querySelector('.swiper-zoom-target, .swiper-zoom-container > img') as HTMLElement;\n    if (!imgEl) return;\n    const imgW = imgEl.offsetWidth || imgEl.clientWidth;\n    const imgH = imgEl.offsetHeight || imgEl.clientHeight;\n    if (!imgW || !imgH) return;\n    const { scale } = this._zoomState;\n    const maxTx = Math.max(0, (imgW * scale - activeSlide.offsetWidth) / 2);\n    const maxTy = Math.max(0, (imgH * scale - activeSlide.offsetHeight) / 2);\n    this._zoomState.tx = Math.max(-maxTx, Math.min(maxTx, this._zoomState.tx));\n    this._zoomState.ty = Math.max(-maxTy, Math.min(maxTy, this._zoomState.ty));\n  }\n\n  protected _getActiveZoomWrapEl(swiperElement: any): HTMLElement | null {\n    const swiper = this.getSwiper(swiperElement);\n    const activeSlide = swiper?.slides?.[swiper.activeIndex] as HTMLElement;\n    return activeSlide?.querySelector('.swiper-zoom-container') ?? null;\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<ion-content\n  class=\"ion-no-padding ion-no-margin\"\n  (mousedown)=\"onPointerDown($event, swiperContainer)\"\n  (mousemove)=\"onPointerMove($event, swiperContainer)\"\n  (mouseup)=\"onPointerUp($event, swiperContainer)\"\n  (mouseleave)=\"onPointerUp($event, swiperContainer)\"\n  (touchmove)=\"onCropPointerMove($event, swiperContainer)\"\n  (touchend)=\"onCropPointerUp($event, swiperContainer)\"\n  (touchcancel)=\"onCropPointerUp($event, swiperContainer)\"\n>\n  @let count = rows?.length || 0;\n  <!-- Counter  -->\n  <div class=\"top-left\">\n    <ion-label color=\"light\">{{ _activeIndex + 1 }} / {{ count }}</ion-label>\n  </div>\n\n  <!-- zoom / rotation / crop buttons: all shown together, no \"enter edit mode\" step needed -->\n  <div class=\"top-right\">\n    @if (!mobile) {\n      <ion-fab-button size=\"small\" (click)=\"zoom(swiperContainer, true)\" color=\"light\">\n        <ion-icon name=\"search\"></ion-icon>\n        <ion-icon class=\"icon-secondary\" name=\"add\"></ion-icon>\n      </ion-fab-button>\n      <ion-fab-button size=\"small\" (click)=\"zoom(swiperContainer, false)\" color=\"light\">\n        <ion-icon name=\"search\"></ion-icon>\n        <ion-icon class=\"icon-secondary\" name=\"remove\"></ion-icon>\n      </ion-fab-button>\n    }\n    @if (!readOnly && enableRotate) {\n      <ion-fab-button\n        size=\"small\"\n        (click)=\"rotate(swiperContainer, 'left')\"\n        color=\"light\"\n        [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_LEFT' | translate) : ''\"\n      >\n        <mat-icon>rotate_left</mat-icon>\n      </ion-fab-button>\n      <ion-fab-button\n        size=\"small\"\n        (click)=\"rotate(swiperContainer, 'right')\"\n        color=\"light\"\n        [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_ROTATE_RIGHT' | translate) : ''\"\n      >\n        <mat-icon>rotate_right</mat-icon>\n      </ion-fab-button>\n    }\n    @if (!readOnly && enableCrop) {\n      <ion-fab-button\n        size=\"small\"\n        (click)=\"toggleCropTool(swiperContainer)\"\n        [color]=\"_cropToolActive ? 'tertiary' : 'light'\"\n        [title]=\"\n          !showTooltip\n            ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n            : ''\n        \"\n        [matTooltip]=\"\n          showTooltip\n            ? ((_cropToolActive ? 'IMAGE.GALLERY.BTN_CROP_DEACTIVATE' : 'IMAGE.GALLERY.BTN_CROP_ACTIVATE') | translate)\n            : ''\n        \"\n      >\n        <mat-icon>crop</mat-icon>\n      </ion-fab-button>\n      @if (_cropToolActive) {\n        <ion-fab-button\n          size=\"small\"\n          (click)=\"resetCrop(swiperContainer)\"\n          color=\"light\"\n          [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CROP_RESET' | translate) : ''\"\n        >\n          <mat-icon>crop_free</mat-icon>\n        </ion-fab-button>\n      }\n    }\n  </div>\n\n  <!-- navigation side buttons next/back: hidden while a crop/rotation edit is pending, to keep the focus on validating/cancelling it -->\n  <ng-container *ngIf=\"!mobile && !hasPendingEdit && (rows | isArrayLength: { greaterThan: 1 })\">\n    <div class=\"side-buttons prev\" [class.disabled]=\"isPrevDisabled\" (click)=\"slidePrev(swiperContainer)\">\n      <ion-icon name=\"chevron-back\"></ion-icon>\n    </div>\n    <div class=\"side-buttons next\" [class.disabled]=\"isNextDisabled\" (click)=\"slideNext(swiperContainer)\">\n      <ion-icon name=\"chevron-forward\"></ion-icon>\n    </div>\n  </ng-container>\n\n  <!-- image slides -->\n  <swiper-container\n    #swiperContainer\n    [modules]=\"swiperModules\"\n    [zoom]=\"!enableMouseZoom\"\n    [initialSlide]=\"selectedIndex\"\n    (swiperslidechange)=\"onSlideChange(swiperContainer)\"\n    (swiperinit)=\"onSwiperInit(swiperContainer)\"\n  >\n    @for (row of rows; track row.id; let index = $index) {\n      <ng-container *ngTemplateOutlet=\"slideTemplate; context: { image: row.currentData, index }\"></ng-container>\n    }\n  </swiper-container>\n</ion-content>\n\n<ion-footer>\n  <ion-toolbar color=\"light\">\n    @if (!hasPendingEdit) {\n      <ion-row>\n        <ion-col size=\"4\" class=\"ion-text-start\">\n          @if (!readOnly) {\n            <ion-button\n              (click)=\"requestDelete(swiperContainer)\"\n              [disabled]=\"disabled\"\n              fill=\"clear\"\n              color=\"danger\"\n            >\n              <mat-icon slot=\"start\">delete</mat-icon>\n              {{ 'COMMON.BTN_DELETE' | translate }}\n            </ion-button>\n          }\n        </ion-col>\n        <ion-col size=\"4\"></ion-col>\n        <ion-col size=\"4\" class=\"ion-text-end\">\n          <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\" fill=\"clear\" *ngIf=\"mobile; else desktop\">\n            <ion-icon slot=\"start\" name=\"close\"></ion-icon>\n            {{ 'COMMON.BTN_CLOSE' | translate }}\n          </ion-button>\n          <ng-template #desktop>\n            <ion-button (click)=\"closeRequested.emit()\" color=\"tertiary\">\n              {{ 'COMMON.BTN_CLOSE' | translate }}\n            </ion-button>\n          </ng-template>\n        </ion-col>\n      </ion-row>\n    } @else {\n      <!-- A crop or rotation change is pending: ask for an explicit validation before exporting the image -->\n      <ion-row>\n        <ion-col size=\"12\" class=\"ion-text-end\">\n          <ion-button\n            (click)=\"discardEdit(swiperContainer)\"\n            color=\"dark\"\n            fill=\"clear\"\n            [title]=\"!showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('IMAGE.GALLERY.BTN_CANCEL_EDIT' | translate) : ''\"\n          >\n            <ion-icon slot=\"start\" name=\"arrow-undo\"></ion-icon>\n            {{ 'COMMON.BTN_CANCEL' | translate }}\n          </ion-button>\n          <ion-button (click)=\"validateEdit(swiperContainer)\" color=\"danger\">\n            <ion-icon slot=\"start\" name=\"checkmark\"></ion-icon>\n            {{ 'COMMON.BTN_VALIDATE' | translate }}\n          </ion-button>\n        </ion-col>\n      </ion-row>\n    }\n  </ion-toolbar>\n</ion-footer>\n\n<ng-template #slideTemplate let-image=\"image\" let-index=\"index\">\n  <swiper-slide>\n    <div class=\"swiper-zoom-container\" [class.cdk-visually-hidden]=\"!_swiper && index !== selectedIndex\">\n\n      <!-- the image -->\n      @if (image?.url) {\n        <ion-img class=\"swiper-zoom-target\" [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n      } @else {\n        <img [src]=\"image.dataUrl\" [alt]=\"image.title\" />\n      }\n\n      <!-- crop overlay: only rendered for the active slide -->\n      @if (!readOnly && enableCrop && _cropToolActive && index === _activeIndex) {\n        <div\n          class=\"crop-overlay\"\n          (mousedown)=\"onCropPointerDown($event, swiperContainer, 'move')\"\n          (touchstart)=\"onCropPointerDown($event, swiperContainer, 'move')\"\n        >\n          <!-- darkened mask around the selection: clipped to the image bounds -->\n          <div class=\"crop-mask\">\n            <div\n              class=\"crop-mask-rect\"\n              [style.left.%]=\"_cropRect.x * 100\"\n              [style.top.%]=\"_cropRect.y * 100\"\n              [style.width.%]=\"_cropRect.width * 100\"\n              [style.height.%]=\"_cropRect.height * 100\"\n            ></div>\n          </div>\n\n          <!-- interactive selection border, grid & drag handles: never clipped, so corner/edge handles\n               remain fully grabbable even when the selection touches the image bounds -->\n          <div\n            class=\"crop-rect\"\n            [style.left.%]=\"_cropRect.x * 100\"\n            [style.top.%]=\"_cropRect.y * 100\"\n            [style.width.%]=\"_cropRect.width * 100\"\n            [style.height.%]=\"_cropRect.height * 100\"\n          >\n            <div class=\"crop-grid\">\n              <span class=\"line v\" style=\"left: 33.333%\"></span>\n              <span class=\"line v\" style=\"left: 66.666%\"></span>\n              <span class=\"line h\" style=\"top: 33.333%\"></span>\n              <span class=\"line h\" style=\"top: 66.666%\"></span>\n            </div>\n            @for (handle of _cropHandles; track handle) {\n              <div\n                class=\"crop-handle {{ handle }}\"\n                (mousedown)=\"onCropPointerDown($event, swiperContainer, handle)\"\n                (touchstart)=\"onCropPointerDown($event, swiperContainer, handle)\"\n              ></div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  </swiper-slide>\n</ng-template>\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { PopoverController } from '@ionic/angular';\n\nimport { TranslateService } from '@ngx-translate/core';\nimport { StartableService } from '../services/startable-service.class';\nimport { ENVIRONMENT, Environment } from '../../../environments/environment.class';\nimport { PlatformService } from '../../core/services/platform.service';\nimport { LocalSettingsService } from '../../core/services/local-settings.service';\nimport { FilesUtils } from '../file/file.utils';\nimport { ImagesUtils } from '../file/images.utils';\nimport { isEmptyArray } from '../functions';\n\nimport { Image } from './image.model';\nimport { Capacitor } from '@capacitor/core';\nimport { Camera, CameraResultType, CameraSource, ImageOptions } from '@capacitor/camera';\n\n@Injectable({ providedIn: 'root' })\nexport class ImageService extends StartableService {\n  private defaultMaxHeight = 1024;\n  private defaultMaxWidth = 1024;\n\n  constructor(\n    protected platform: PlatformService,\n    protected settings: LocalSettingsService,\n    protected translate: TranslateService,\n    protected popoverController: PopoverController,\n    @Inject(ENVIRONMENT) @Optional() protected environment?: Environment\n  ) {\n    super(platform);\n    this._debug = !environment.production;\n    if (this._debug) console.debug(`[image] Creating service`);\n  }\n\n  protected async ngOnStart(): Promise<any> {\n    try {\n      const camera = Capacitor.isPluginAvailable('Camera');\n      console.info(`[image] Starting... {camera: ${camera}}`);\n    } catch (err) {\n      console.error('Cannot check Camera plugin: ' + (err?.message || err));\n    }\n  }\n\n  async add(\n    event?: Event,\n    opts?: {\n      maxHeight?: number;\n      maxWidth?: number;\n      quality?: number;\n      multiple?: boolean;\n      autoHideDropArea?: boolean;\n      style?: 'camera' | 'upload-popover' | 'auto';\n      uploadButtonText?: string;\n    } & Omit<ImageOptions, 'resultType'>\n  ): Promise<Image[] | undefined> {\n    if (!this.started) await this.ready();\n\n    const style =\n      opts?.style && opts?.style !== 'auto'\n        ? opts?.style\n        : opts?.source === CameraSource.Camera\n          ? 'camera'\n          : !this.platform.mobile\n            ? 'upload-popover'\n            : 'camera';\n\n    // Open upload popover\n    if (style === 'upload-popover') {\n      return this.addUploadedImages(event, opts);\n    }\n\n    console.info(`[image-service] Adding image from camera...`, opts);\n\n    try {\n      const data = await Camera.getPhoto({\n        height: this.defaultMaxHeight,\n        width: this.defaultMaxWidth,\n        promptLabelCancel: this.translate.instant('COMMON.BTN_CANCEL'),\n        promptLabelPicture: this.translate.instant('IMAGE.BTN_CAMERA_SOURCE'),\n        promptLabelPhoto: this.translate.instant('IMAGE.BTN_GALLERY_SOURCE'),\n        resultType: CameraResultType.DataUrl,\n        ...opts,\n      });\n      if (!data) return undefined;\n\n      // DEBUG\n      if (this._debug && data.exif) {\n        console.debug(`[image-service] Image added, with exif:`, data.exif);\n      }\n\n      return [\n        <Image>{\n          dataUrl: data.dataUrl,\n          exif: data.exif,\n        },\n      ];\n    } catch (err) {\n      console.info(`[image-service] Error while adding image: ${err?.message || err} -> ${err?.originalStack || ''}`);\n      return undefined;\n    }\n  }\n\n  /* -- protected functions -- */\n\n  protected async addUploadedImages(\n    event?: Event,\n    opts?: { maxHeight?: number; mawWidth?: number; quality?: number; multiple?: boolean; autoHideDropArea?: boolean;\n      uploadButtonText?: string;\n    }\n  ): Promise<Image[] | undefined> {\n    const { data } = await FilesUtils.showUploadPopover(this.popoverController, event, {\n      uniqueFile: opts?.multiple !== true,\n      autoHideDropArea: opts?.autoHideDropArea !== false,\n      fileExtension: '.png, .jpg',\n      instantUpload: true,\n      okButtonText: opts?.uploadButtonText || 'COMMON.BTN_IMPORT',\n      uploadFn: (file) =>\n        ImagesUtils.readAsDataURL(file, {\n          maxWidth: this.defaultMaxWidth,\n          maxHeight: this.defaultMaxHeight,\n          ...opts,\n        }),\n    });\n\n    if (isEmptyArray(data)) return; // No files uploaded: skip\n    return (data || [])\n      .map((file) => file.response.body) // Get response body = data as base64\n      .map((dataUrl) => <Image>{ dataUrl });\n  }\n}\n","import {\n  AfterContentChecked,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  TemplateRef,\n  ViewChild,\n} from '@angular/core';\nimport {BehaviorSubject, Observable, Subject, Subscription} from 'rxjs';\nimport {TableDataSource, TableElement} from '@e-is/ngx-material-table';\nimport {ENVIRONMENT, Environment} from '../../../../environments/environment.class';\nimport {ImageService} from '../image.service';\nimport {Image, ImageSize} from '../image.model';\nimport {AlertController, IonModal, IonPopover, Platform} from '@ionic/angular';\nimport {isMobile} from '../../platforms';\nimport {fadeInAnimation, fadeInOutAnimation} from '../../material/material.animations';\nimport {isEmptyArray, isNilOrBlank, toBoolean} from '../../functions';\nimport {CollectionViewer, isDataSource, ListRange} from '@angular/cdk/collections';\nimport {takeUntil} from 'rxjs/operators';\nimport {Alerts} from '../../alerts';\nimport {TranslateService} from '@ngx-translate/core';\nimport {AppColors} from '../../types';\nimport {FormControl, FormGroup, Validators} from '@angular/forms';\nimport {createPromiseEventEmitter, emitPromiseEvent, PromiseEvent} from '../../events';\nimport {PredefinedColors} from '@ionic/core';\nimport {ImageOptions} from '@capacitor/camera';\n\nimport {APP_SHOW_TOOLTIP} from '../../constants';\nimport {GalleryMode, ImageEditEvent, ImageEditFormat, ImageGallerySlideChangeEvent} from './image-gallery.model';\nimport {AppImageGallerySlideshowComponent} from './slideshow/image-gallery-slideshow.component';\n\nexport type ImageGallerySlideshowMode = 'modal' | 'inline';\n\nconst ImageGalleryModeColSize = Object.freeze({\n  mosaic: 4,\n  list: 12,\n});\n\nexport interface ImageGallerySizes {\n  mosaic: ImageSize | string;\n  list: ImageSize | string;\n  modal: ImageSize | string;\n}\n\n@Component({\n  selector: 'app-image-gallery',\n  templateUrl: './image-gallery.component.html',\n  styleUrls: ['./image-gallery.component.scss'],\n  animations: [fadeInAnimation, fadeInOutAnimation],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppImageGalleryComponent<T extends Image> implements OnInit, OnDestroy, CollectionViewer, AfterContentChecked {\n  protected _destroySubject = new Subject<void>();\n  protected _renderChangeSubscription: Subscription;\n  protected _subscription = new Subscription();\n  protected _dataSource: TableDataSource<T>;\n  protected _data$ = new BehaviorSubject<TableElement<T>[] | ReadonlyArray<TableElement<T>>>(null);\n\n  protected _colSize: number;\n  protected _selectedRowIndex: number;\n  protected _presentingElement: Element = null;\n  protected _titleForm: FormGroup;\n  protected _titleAutofocus = false;\n  protected _slidesSubscription: Subscription;\n  protected _showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  protected zoomActive = false;\n  protected zoomScale = 1;\n  /** Whether the inline slideshow overlay is currently shown (only relevant when zoomPresentation === 'inline'). */\n  protected _slideshowVisible = false;\n\n\n  viewChange: BehaviorSubject<ListRange>;\n\n  @Input() cardColor: string | PredefinedColors;\n  @Input({ transform: booleanAttribute }) debug: boolean = null;\n  @Input({ transform: booleanAttribute }) disabled = false;\n  @Input({ transform: booleanAttribute }) readOnly = false;\n  @Input({ transform: booleanAttribute }) mobile: boolean = null;\n  @Input() mode: GalleryMode = null;\n  @Input() confirmBeforeDelete = true;\n  @Input({ transform: booleanAttribute }) showToolbar = true;\n  @Input({ transform: booleanAttribute }) showFabButton: boolean;\n  @Input({ transform: booleanAttribute }) showTitle = true;\n  @Input({ transform: booleanAttribute }) showAddToolbarButton: boolean;\n  @Input({ transform: booleanAttribute }) showAddTextButton = false;\n  @Input({ transform: booleanAttribute }) showAddCardButton = true;\n  @Input({ transform: booleanAttribute }) showCardToolbar = true;\n  @Input() addButtonColor: AppColors = 'tertiary';\n  @Input() addButtonText: string = 'COMMON.BTN_ADD';\n  @Input() cardTemplate: TemplateRef<{ $implicit: TableElement<T>; image: T; mode: GalleryMode }>;\n  @Input() imageSizes: ImageGallerySizes = {\n    mosaic: <ImageSize>'small',\n    list: <ImageSize>'medium',\n    modal: <ImageSize>'large',\n  };\n  @Input() imageSizeQueryParam = 'size';\n\n  /** Enable mouse-wheel zoom and mouse-drag pan in the slideshow (defaults to true on desktop). */\n  @Input({ transform: booleanAttribute }) enableMouseZoom: boolean = null;\n  /** Zoom step applied on each mouse-wheel tick (default 0.3). */\n  @Input() wheelZoomStep = 0.3;\n  /** Maximum zoom ratio reachable via mouse wheel (default 3). */\n  @Input() maxZoomRatio = 3;\n  /** Enable 90° rotation buttons in the slideshow (defaults to true). */\n  @Input({ transform: booleanAttribute }) enableRotate: boolean = null;\n  /** Enable the crop tool in the slideshow (defaults to true). */\n  @Input({ transform: booleanAttribute }) enableCrop: boolean = null;\n  /** Image format used when emitting the edited (cropped/rotated) image. */\n  @Input() editionFormat: ImageEditFormat = 'png';\n  /** Export quality, applied only when editionFormat is 'jpeg' (0 to 1). */\n  @Input() editionQuality = 0.92;\n  /** Where to show the slideshow: in a full-screen modal (default), or inline, as an overlay over the gallery itself (desktop only). */\n  @Input() slideshowMode: ImageGallerySlideshowMode = 'inline';\n  /** Height of the inline slideshow overlay (CSS value, e.g. '60vh'). Only used when zoomPresentation is 'inline'. */\n  @Input() inlineZoomHeight = '100%';\n  /** Whether reaching the last (resp. first) image should wrap around to the first (resp. last) one. Default true. */\n  @Input({ transform: booleanAttribute }) enableSlideshowLoop = true;\n  /**\n   * Whether more rows may exist beyond the ones currently loaded (e.g. a further page, not yet fetched).\n   * When true, reaching the last image asks the parent (via `fetchMore`) instead of looping/stopping.\n   * The gallery has no opinion on how fetching is actually done: it's entirely up to the parent.\n   */\n  @Input({ transform: booleanAttribute }) canFetchMore = false;\n\n  @Input() set dataSource(dataSource: TableDataSource<T, any, any, any>) {\n    if (this._dataSource !== dataSource) {\n      this._switchDataSource(dataSource);\n    }\n  }\n  get dataSource(): TableDataSource<T, any, any, any> {\n    return this._dataSource;\n  }\n  get enabled() {\n    return !this.disabled;\n  }\n\n  get rows(): TableElement<T>[] | ReadonlyArray<TableElement<T>> {\n    return this._data$.value;\n  }\n\n  get rowCount() {\n    return this.rows?.length || 0;\n  }\n\n  get isSlideshowVisible() {\n    return this._slideshowVisible;\n  }\n\n  /**\n   * Whether the inline slideshow overlay is currently shown over the gallery grid. Only meaningful for\n   * `slideshowMode === 'inline'`: in 'modal' mode, the grid behind the (fully opaque) modal must stay\n   * untouched, otherwise toggling it in/out of view causes a layout jump when the modal is dismissed.\n   */\n  protected get isInlineSlideshowOpen(): boolean {\n    return this.slideshowMode === 'inline' && this._slideshowVisible;\n  }\n\n  @ViewChild('zoomModal') zoomModal: IonModal;\n  @ViewChild('titlePopover') titlePopover: IonPopover;\n\n  @Output() onBeforeDeleteRows = createPromiseEventEmitter<boolean, { rows: TableElement<T>[] }>();\n  @Output() onAfterAddRows = new EventEmitter<TableElement<T>[]>();\n  @Output() onAfterEditRow = new EventEmitter<TableElement<T>>();\n  @Output() onAfterEditImage = new EventEmitter<ImageEditEvent<T>>();\n  @Output('clickCard') cardClicked = new EventEmitter<TableElement<T>>();\n  /** Emitted from the slideshow whenever the active slide moves backward (previous image). */\n  @Output() previousSlide = new EventEmitter<ImageGallerySlideChangeEvent<T>>();\n  /** Emitted from the slideshow whenever the active slide moves forward (next image). */\n  @Output() nextSlide = new EventEmitter<ImageGallerySlideChangeEvent<T>>();\n  /**\n   * Forwarded as-is from the slideshow when reaching the last image while `canFetchMore` is true: the\n   * parent must fetch the next page (however it does so) and resolve with whether new rows were added.\n   */\n  @Output() fetchMore = createPromiseEventEmitter<boolean, void>();\n\n  @Output() slideshowOpened = new EventEmitter<boolean>();\n  @Output() slideshowClosed = new EventEmitter<void>();\n\n\n  get activeIndex() {\n    if (!this.inlineSlideshow) throw new Error('Cannot get slide active index while inline slideshow is open');\n    return this.inlineSlideshow.activeIndex;\n  }\n\n  @ViewChild('inlineSlideshow', {static: false}) inlineSlideshow: AppImageGallerySlideshowComponent;\n\n  constructor(\n    protected imageService: ImageService,\n    protected platform: Platform,\n    protected alterCtrl: AlertController,\n    protected translate: TranslateService,\n    protected cd: ChangeDetectorRef,\n    @Optional() @Inject(ENVIRONMENT) environment?: Environment\n  ) {\n    this.viewChange = new BehaviorSubject({ start: 0, end: Number.MAX_VALUE });\n\n    // DEV log\n    this.debug = environment && !environment.production;\n  }\n\n  ngOnInit() {\n    this.mobile = toBoolean(this.mobile, isMobile(window));\n    this.mode = this.mode ?? (this.mobile ? 'list' : 'mosaic');\n    this._colSize = ImageGalleryModeColSize[this.mode];\n    this.showToolbar = toBoolean(this.showToolbar, !this.mobile);\n    this.showCardToolbar = toBoolean(this.showCardToolbar, !this.mobile);\n    this.showAddCardButton = toBoolean(this.showAddCardButton, this.mobile);\n    this.showFabButton = toBoolean(this.showFabButton, this.mobile && !this.showAddCardButton);\n    this.showAddToolbarButton = this.showAddToolbarButton ?? (this.showToolbar && !this.readOnly);\n    this.enableMouseZoom = toBoolean(this.enableMouseZoom, !this.mobile);\n    this.enableRotate = toBoolean(this.enableRotate, true);\n    this.enableCrop = toBoolean(this.enableCrop, true);\n    // The inline presentation is only meaningful on desktop: there is no \"rest of the page\" worth\n    // preserving on a small mobile screen, and the fullscreen modal already works well there.\n    if (this.mobile) this.slideshowMode = 'modal';\n\n    // Get modal presenting element (iOS only)\n    this._presentingElement = this.mobile ? document.querySelector('.ion-page') : null;\n  }\n\n  ngAfterContentChecked() {\n    if (this.dataSource && !this._renderChangeSubscription) {\n      this._observeRenderChanges();\n    }\n  }\n\n  ngOnDestroy() {\n    this._destroySubject.next();\n    this._destroySubject.complete();\n\n    this._subscription.unsubscribe();\n    this._slidesSubscription?.unsubscribe();\n\n    if (isDataSource(this.dataSource)) {\n      this.dataSource.disconnect(this);\n    }\n  }\n\n  async add(\n    event?: Event,\n    opts?: { maxHeight?: number; mawWidth?: number; quality?: number; multiple?: boolean; autoHideDropArea?: boolean } & Omit<\n      ImageOptions,\n      'resultType'\n    >\n  ): Promise<void> {\n    const images = await this.imageService.add(event, opts);\n\n    if (isEmptyArray(images)) return;\n\n    console.info(`[image-gallery] Adding new ${images.length} image(s)`, images);\n\n    const rows: TableElement<T>[] = [];\n    for (const image of images) {\n      const row = await this._dataSource.createNew();\n      row.currentData = image as unknown as T;\n      rows.push(row);\n      const added = await row.confirmEditCreate();\n      if (!added) {\n        console.warn('[image-gallery] Cannot confirm new image!');\n        break;\n      }\n    }\n\n    this.onAfterAddRows.emit(rows);\n  }\n\n  async delete(event: Event, row: TableElement<T>, opts?: { interactive?: boolean }): Promise<boolean> {\n    if (event?.defaultPrevented || this.readOnly) return false;\n    event?.preventDefault();\n    event?.stopPropagation();\n\n    // Check using emitter\n    const confirmed = await this.canDeleteRows([row]);\n    if (!confirmed) return false;\n\n    let deleted: boolean;\n    if (row.id === -1) {\n      console.info('[image-gallery] Removing new image');\n      deleted = await row.cancelOrDelete();\n    } else {\n      console.info('[image-gallery] Removing image (at #' + row.id + ')');\n      deleted = await row.delete();\n    }\n\n    return deleted;\n  }\n\n  toggleViewMode(_?: Event) {\n    this.setViewMode(this.mode === 'list' ? 'mosaic' : 'list');\n  }\n\n  setViewMode(mode: GalleryMode) {\n    if (this.mode !== mode) {\n      this.mode = mode;\n      this._colSize = ImageGalleryModeColSize[this.mode];\n      this.markForCheck();\n    }\n  }\n\n  slideNext() {\n    if (!this.inlineSlideshow) throw new Error('Cannot slide previous while inline slideshow is open');\n    return this.inlineSlideshow.slideNext();\n  }\n\n  slidePrev() {\n    if (!this.inlineSlideshow) throw new Error('Cannot slide previous while inline slideshow is open');\n    return this.inlineSlideshow.slidePrev();\n  }\n\n  trackByFn(index: number, row: TableElement<T>) {\n    return row.id;\n  }\n\n  async editTitle(event: MouseEvent, row: TableElement<T>, cardToolbar: any) {\n    if (event?.defaultPrevented) return;\n    event?.preventDefault();\n    event?.stopPropagation();\n    event?.stopImmediatePropagation();\n\n    this.focusCardToolbar(cardToolbar);\n\n    const titleControl = new FormControl(row.currentData.title, Validators.compose([Validators.required, Validators.maxLength(255)]));\n    this._titleForm = new FormGroup({ title: titleControl });\n    this._titleAutofocus = this.mobile && this.enabled && !this.readOnly;\n    this.cd.detectChanges();\n\n    await this.titlePopover.present();\n\n    const { data, role } = await this.titlePopover.onDidDismiss();\n\n    if (!role || role !== 'CANCEL') {\n      console.debug('[image-gallery] User set title: ' + data);\n      row.currentData.title = data;\n      this.markForCheck();\n      this.onAfterEditRow.emit(row);\n    }\n\n    // Hide the toolbar, because the focus have been given to the event's origin (the edit button)\n    setTimeout(() => this.hideCardToolbar(cardToolbar), 750);\n  }\n\n  protected focusCardToolbar(cardToolbar: any) {\n    const el = cardToolbar['el'] as HTMLElement;\n    el.classList.add('focused');\n  }\n\n  protected hideCardToolbar(cardToolbar: any) {\n    const el = cardToolbar['el'] as HTMLElement;\n    el.classList.remove('focused');\n  }\n\n  protected _switchDataSource(dataSource: TableDataSource<T>) {\n    if (isDataSource(this._dataSource)) {\n      this._dataSource.disconnect(this);\n    }\n    this._dataSource = dataSource;\n  }\n\n  protected _observeRenderChanges() {\n    // If no data source has been set, there is nothing to observe for changes.\n    if (!this.dataSource) {\n      return;\n    }\n    let dataStream: Observable<TableElement<T>[] | ReadonlyArray<TableElement<T>>>;\n    if (isDataSource(this.dataSource)) {\n      dataStream = this.dataSource.connect(this);\n    }\n    if (dataStream === undefined) {\n      throw this.getTableUnknownDataSourceError();\n    }\n    this._renderChangeSubscription?.unsubscribe();\n    this._renderChangeSubscription = dataStream.pipe(takeUntil(this._destroySubject)).subscribe((data) => {\n      console.debug('[image-gallery] Received new rows', data);\n      this._data$.next(data);\n      this.markForCheck();\n    });\n  }\n\n  protected getTableUnknownDataSourceError() {\n    return Error(`Provided data source did not match an array, Observable, or DataSource`);\n  }\n\n  clickCard(event: Event | undefined, row: TableElement<T>): boolean {\n    // Delegate click action\n    if (this.cardClicked.observed) {\n      this.cardClicked.emit(row);\n      return true;\n    }\n\n    // By default, open the slideshow\n    this.openSlideshow(event, row);\n    return true;\n  }\n\n  /**\n   * Opens the slideshow (inline overlay, or full-screen modal, depending on `zoomPresentation`) on the row at the given index.\n   * Can be called from outside the component (e.g. to open the gallery directly on a given image).\n   */\n  async openSlideshow(event: Event | undefined, row: TableElement<T>): Promise<void> {\n    const index = this.rows?.findIndex((r) => r === row);\n    if (index == null || index < 0 || index >= this.rowCount) {\n      console.warn(`[image-gallery] Cannot open slideshow: invalid index (${index})`);\n      return;\n    }\n\n    if (this._selectedRowIndex != index) {\n      this._selectedRowIndex = index;\n      this.markForCheck();\n    }\n\n    if (this.slideshowMode === 'inline') {\n      this.markSlideshowAsOpened();\n    } else {\n      await this.zoomModal.present();\n      this.markSlideshowAsOpened();\n\n      await this.zoomModal.onDidDismiss();\n\n      // Mark as closed\n      this.markSlideshowAsClosed();\n    }\n  }\n\n  async closeSlideshow(role?: string) {\n    if (this.slideshowMode === 'inline') {\n      this.markSlideshowAsClosed();\n      return true;\n    } else {\n      const promise = this.zoomModal.dismiss(null, role ?? 'cancel');\n      this.markSlideshowAsClosed();\n      return promise;\n    }\n  }\n\n  protected markSlideshowAsOpened() {\n    if (!this._slideshowVisible) {\n      this._slideshowVisible = true;\n      this.slideshowOpened.emit(true);\n      this.markForCheck();\n    }\n  }\n  protected markSlideshowAsClosed() {\n    if (this._slideshowVisible) {\n      this._slideshowVisible = false;\n      this.slideshowOpened.emit(false);\n      this.slideshowClosed.emit();\n      this.markForCheck();\n    }\n  }\n\n  /**\n   * Handles a delete request coming from the slideshow component (either inline or in the modal):\n   * runs the same confirmation/deletion flow as a card's delete button, then resolves the promise\n   * so the slideshow knows whether to reset its zoom or close.\n   */\n  protected async onSlideshowDeleteRequested(promiseEvent: PromiseEvent<boolean, { row: TableElement<T> }>) {\n    try {\n      const deleted = await this.delete(promiseEvent, promiseEvent.detail.row);\n      promiseEvent.detail.success(deleted);\n      if (deleted && isEmptyArray(this.rows) && this.slideshowMode === 'inline') {\n        this.closeSlideshow();\n      }\n    } catch (err) {\n      promiseEvent.detail.error(err);\n    }\n  }\n\n  protected async canDeleteRows(rows: TableElement<T>[], opts?: { interactive?: boolean }): Promise<boolean> {\n    // Check using emitter\n    if (this.onBeforeDeleteRows.observed) {\n      try {\n        const canDelete = await emitPromiseEvent(this.onBeforeDeleteRows, 'canDelete', {\n          detail: { rows },\n        });\n        if (!canDelete) return false;\n      } catch (err) {\n        if (err === 'CANCELLED') return false; // User cancel\n        console.error('Error while checking if can delete rows', err);\n        throw err;\n      }\n    }\n\n    if (this.confirmBeforeDelete) {\n      const confirmed = await Alerts.askDeleteConfirmation(this.alterCtrl, this.translate, event);\n      if (!confirmed) return false; // Cancelled\n    }\n\n    return true;\n  }\n\n  protected getImageSizeQueryParams(mode?: GalleryMode | 'modal'): { [key: string]: any } {\n    mode = mode ?? this.mode;\n    if (!this.imageSizeQueryParam || isNilOrBlank(this.imageSizes?.[mode])) return undefined;\n    return {\n      [this.imageSizeQueryParam]: this.imageSizes[mode],\n    };\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","@if (showToolbar && !isInlineSlideshowOpen) {\n  <ion-toolbar color=\"light\" class=\"gallery-toolbar\">\n    <ng-content select=\"ion-buttons[slot=start]\"></ng-content>\n\n    <!-- Add -->\n    @if (!readOnly && showAddToolbarButton && enabled) {\n      <button\n        mat-icon-button\n        [title]=\"!_showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n        [matTooltip]=\"_showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n        (click)=\"add()\"\n      >\n        <mat-icon>add</mat-icon>\n      </button>\n    }\n\n    <ng-content select=\"ion-buttons[slot=end]\"></ng-content>\n\n    <ion-buttons slot=\"end\">\n      <!-- Toggle view mode -->\n      <ion-segment (ionChange)=\"toggleViewMode($event)\" color=\"accent\" [value]=\"_colSize\">\n        <ion-segment-button [value]=\"4\">\n          <mat-icon>view_module</mat-icon>\n        </ion-segment-button>\n        <ion-segment-button [value]=\"12\">\n          <mat-icon>view_list</mat-icon>\n        </ion-segment-button>\n      </ion-segment>\n    </ion-buttons>\n  </ion-toolbar>\n}\n\n<div\n  class=\"gallery-container ion-padding-bottom {{ mode }}\"\n  [class.inline-zoom-active]=\"isInlineSlideshowOpen\"\n  [style.--inline-zoom-height]=\"inlineZoomHeight\"\n>\n  @if (mobile && zoomActive) {\n    <div class=\"backdrop\" [style.opacity]=\"zoomScale\"></div>\n  }\n\n  <ion-grid class=\"ion-no-padding\" [class.cdk-visually-hidden]=\"isInlineSlideshowOpen\">\n    <ion-row>\n      <ion-col *rxFor=\"let row of _data$; trackBy: trackByFn\" [size]=\"_colSize\">\n        @let image = row | propertyGet: 'currentData';\n        @if (cardTemplate) {\n          <ng-container\n            *ngTemplateOutlet=\"cardTemplate; context: { $implicit: row, mode: mode, image: image }\"\n          ></ng-container>\n        } @else {\n          <ion-card\n            #card\n            class=\"image-card\"\n            [class.zoom-hover]=\"!mobile\"\n            [color]=\"cardColor\"\n            (click)=\"clickCard($event, row)\"\n            tappable\n            @fadeInAnimation\n          >\n            <figure class=\"card-thumbnail\">\n              @if (image.url) {\n                <ion-img [src]=\"image.url | appendQueryParams: getImageSizeQueryParams()\" />\n              } @else {\n                <ion-img [src]=\"image.dataUrl\" />\n              }\n            </figure>\n\n            <!-- toolbar for title (when not hover) -->\n            @if (showTitle && image.title) {\n              <ion-toolbar color=\"transparent\" class=\"title\">\n                <ion-label class=\"card-title\">{{ image.title }}</ion-label>\n              </ion-toolbar>\n            }\n\n            <!-- action toolbar shown when hover image -->\n            @if (!readOnly && !mobile && showCardToolbar) {\n              <ion-toolbar #cardToolbar color=\"light\" class=\"buttons\">\n                <!-- edit title button -->\n                @if (showTitle) {\n                  <button\n                    mat-button\n                    slot=\"start\"\n                    [disabled]=\"disabled\"\n                    (click)=\"editTitle($event, row, cardToolbar)\"\n                    (focusin)=\"focusCardToolbar(cardToolbar)\"\n                  >\n                    <mat-icon>edit</mat-icon>\n                    <mat-label>\n                      @if (row.currentData.title | isNotNilOrBlank) {\n                        <span translate>IMAGE.GALLERY.BTN_EDIT_TITLE</span>\n                      } @else {\n                        <span translate>IMAGE.GALLERY.BTN_ADD_TITLE</span>\n                      }\n                    </mat-label>\n                  </button>\n                }\n\n                <div class=\"flex-spacer\"></div>\n\n                <!-- delete button -->\n                <button\n                  mat-icon-button\n                  slot=\"end\"\n                  class=\"ion-float-end\"\n                  [title]=\"!_showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n                  [matTooltip]=\"_showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n                  [disabled]=\"disabled\"\n                  (click)=\"delete($event, row)\"\n                >\n                  <mat-icon>delete</mat-icon>\n                </button>\n              </ion-toolbar>\n            }\n          </ion-card>\n        }\n      </ion-col>\n\n      <!-- add button -->\n      @if ((showAddTextButton || showAddCardButton) && !readOnly) {\n        <ion-col [size]=\"_colSize\" @fadeInAnimation>\n          @if (showAddTextButton) {\n            <ion-button (click)=\"add($event)\" [disabled]=\"disabled\" [color]=\"addButtonColor\">\n              <mat-label>{{ addButtonText | translate }}</mat-label>\n              <ion-icon slot=\"end\" name=\"camera\"></ion-icon>\n            </ion-button>\n          } @else if (showAddCardButton) {\n            <ion-card\n              class=\"image-card-button\"\n              color=\"light\"\n              (click)=\"add($event)\"\n              [disabled]=\"disabled\"\n              [title]=\"!_showTooltip ? (addButtonText | translate) : ''\"\n              [matTooltip]=\"_showTooltip ? (addButtonText | translate) : ''\"\n              tappable\n            >\n              <ion-card-content>\n                <div class=\"icon-container\">\n                  <ion-icon name=\"camera\" [color]=\"addButtonColor\"></ion-icon>\n                  <ion-icon name=\"add\" [color]=\"addButtonColor\" class=\"icon-secondary\"></ion-icon>\n                </div>\n              </ion-card-content>\n            </ion-card>\n          }\n        </ion-col>\n      }\n    </ion-row>\n  </ion-grid>\n\n  <!-- Inline slideshow: shown as an overlay directly within the gallery, instead of a full-screen modal.\n       The rest of the page (outside the gallery) stays fully visible and usable, unlike the modal's backdrop. -->\n  @if (isInlineSlideshowOpen) {\n    <app-image-gallery-slideshow #inlineSlideshow\n      class=\"inline-overlay\"\n      [rows]=\"rows\"\n      [selectedIndex]=\"_selectedRowIndex\"\n      [mobile]=\"mobile\"\n      [readOnly]=\"readOnly\"\n      [disabled]=\"disabled\"\n      [enableMouseZoom]=\"enableMouseZoom\"\n      [wheelZoomStep]=\"wheelZoomStep\"\n      [maxZoomRatio]=\"maxZoomRatio\"\n      [enableRotate]=\"enableRotate\"\n      [enableCrop]=\"enableCrop\"\n      [enableLoop]=\"enableSlideshowLoop\"\n      [editionFormat]=\"editionFormat\"\n      [editionQuality]=\"editionQuality\"\n      [imageSizeQueryParam]=\"imageSizeQueryParam\"\n      [modalImageSize]=\"imageSizes?.modal\"\n      (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n      (closeRequested)=\"closeSlideshow()\"\n      (afterEditImage)=\"onAfterEditImage.emit($event)\"\n      (afterEditRow)=\"onAfterEditRow.emit($event)\"\n      (previousSlide)=\"previousSlide.emit($event)\"\n      (nextSlide)=\"nextSlide.emit($event)\"\n      [canFetchMore]=\"canFetchMore\"\n      (fetchMore)=\"fetchMore.emit($event)\"\n      [debug]=\"debug\"\n    ></app-image-gallery-slideshow>\n  }\n</div>\n\n<!-- FAB button: add -->\n@if (showFabButton && !readOnly) {\n  <ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" [class.cdk-visually-hidden]=\"disabled\" @fadeInOutAnimation>\n    <ion-fab-button color=\"tertiary\" (click)=\"add($event)\">\n      <ion-icon name=\"camera\"></ion-icon>\n      <ion-icon name=\"add\" class=\"icon-secondary\" style=\"left: 33px; top: 9px; font-size: 20px\"></ion-icon>\n    </ion-fab-button>\n  </ion-fab>\n}\n\n<!-- Zoom modal -->\n@if (slideshowMode === 'modal') {\n  <ion-modal #zoomModal class=\"stack-modal zoom-modal\" [class.modal-fullscreen]=\"mobile\" [class.modal-large]=\"!mobile\">\n    <ng-template>\n      <app-image-gallery-slideshow\n        [rows]=\"rows\"\n        [selectedIndex]=\"_selectedRowIndex\"\n        [mobile]=\"mobile\"\n        [readOnly]=\"readOnly\"\n        [disabled]=\"disabled\"\n        [debug]=\"debug\"\n        [enableMouseZoom]=\"enableMouseZoom\"\n        [wheelZoomStep]=\"wheelZoomStep\"\n        [maxZoomRatio]=\"maxZoomRatio\"\n        [enableRotate]=\"enableRotate\"\n        [enableCrop]=\"enableCrop\"\n        [enableLoop]=\"enableSlideshowLoop\"\n        [editionFormat]=\"editionFormat\"\n        [editionQuality]=\"editionQuality\"\n        [imageSizeQueryParam]=\"imageSizeQueryParam\"\n        [modalImageSize]=\"imageSizes?.modal\"\n        (deleteRequested)=\"onSlideshowDeleteRequested($event)\"\n        (closeRequested)=\"closeSlideshow()\"\n        (afterEditImage)=\"onAfterEditImage.emit($event)\"\n        (afterEditRow)=\"onAfterEditRow.emit($event)\"\n        (previousSlide)=\"previousSlide.emit($event)\"\n        (nextSlide)=\"nextSlide.emit($event)\"\n        [canFetchMore]=\"canFetchMore\"\n        (fetchMore)=\"fetchMore.emit($event)\"\n      ></app-image-gallery-slideshow>\n    </ng-template>\n  </ion-modal>\n}\n\n<ion-popover #titlePopover>\n  <ng-template>\n    <ion-content class=\"ion-padding\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n      <form [formGroup]=\"_titleForm\">\n        <mat-form-field floatLabel=\"auto\">\n          <mat-label translate>IMAGE.GALLERY.TITLE</mat-label>\n          <input\n            matInput\n            formControlName=\"title\"\n            [readonly]=\"disabled\"\n            [appAutofocus]=\"_titleAutofocus\"\n            (keydown.control.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n          />\n        </mat-form-field>\n      </form>\n    </ion-content>\n\n    <ion-footer>\n      <ion-toolbar>\n        <ion-row class=\"ion-no-padding\" nowrap>\n          <ion-col></ion-col>\n\n          <ion-col size=\"auto\">\n            <ion-button fill=\"clear\" color=\"dark\" (click)=\"titlePopover.dismiss(null, 'CANCEL')\">\n              <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n            </ion-button>\n            <ion-button\n              [fill]=\"disabled ? 'clear' : 'solid'\"\n              (click)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n              (keyup.enter)=\"titlePopover.dismiss(_titleForm.controls.title.value)\"\n              color=\"tertiary\"\n              [disabled]=\"disabled\"\n              [title]=\"!_showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n              [matTooltip]=\"_showTooltip ? ('COMMON.BTN_VALIDATE_WITH_SHORTCUT_HELP' | translate) : ''\"\n            >\n              <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n            </ion-button>\n          </ion-col>\n        </ion-row>\n      </ion-toolbar>\n    </ion-footer>\n  </ng-template>\n</ion-popover>\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppImageGalleryComponent } from './image-gallery.component';\nimport { AppImageGallerySlideshowComponent } from './slideshow/image-gallery-slideshow.component';\nimport { IonicModule } from '@ionic/angular';\nimport { CommonModule } from '@angular/common';\nimport { SharedPipesModule } from '../../pipes/pipes.module';\nimport { SharedMaterialModule } from '../../material/material.module';\nimport { SharedDirectivesModule } from '../../directives/directives.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { RxStateModule } from '../../rx-state/rx-state.module';\n\n@NgModule({\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  imports: [\n    CommonModule,\n    IonicModule,\n    ReactiveFormsModule,\n    SharedMaterialModule,\n    SharedPipesModule,\n    SharedDirectivesModule,\n    TranslateModule.forChild(),\n    RxStateModule,\n  ],\n  declarations: [\n    // Components\n    AppImageGalleryComponent,\n    AppImageGallerySlideshowComponent,\n  ],\n  exports: [\n    IonicModule,\n    TranslateModule,\n    // Components\n    AppImageGalleryComponent,\n    AppImageGallerySlideshowComponent,\n  ],\n})\nexport class ImageGalleryModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ImageGalleryModule } from './gallery/image-gallery.module';\n\n@NgModule({\n  imports: [CommonModule, ImageGalleryModule],\n  exports: [\n    // Sub module\n    ImageGalleryModule,\n  ],\n})\nexport class ImageModule {}\n","import { InjectionToken } from '@angular/core';\n\nexport const APP_DEBUG_DATA_SERVICE = new InjectionToken<IDebugDataService>('DebugDataService');\n\nexport interface IDebugDataService {\n  sendDebugData: (data: any) => Promise<void>;\n}\n","import { FilesUtils } from './file.utils';\nimport { Observable } from 'rxjs';\nimport { FileEvent, FileResponse } from '../upload-file/upload-file.model';\nimport { filter, map } from 'rxjs/operators';\nimport { HttpEventType } from '@angular/common/http';\nimport { isNil, isNotNil } from '../functions';\nimport { stringToU8a } from '@polkadot/util';\nimport { TranslateService } from '@ngx-translate/core';\n\n//@dynamic\nexport class JsonUtils {\n  static DEFAULT_ENCODING = 'UTF-8';\n\n  static exportToFile(\n    content: any,\n    opts?: {\n      filename?: string;\n      encoding?: string;\n      type?: string;\n    }\n  ) {\n    if (isNil(content)) return; // Skip if empty\n\n    // Create text content\n    const textContent = content === 'string' ? content : JSON.stringify(content);\n\n    // Write to file\n    FilesUtils.writeTextToFile(textContent, {\n      type: 'application/json',\n      filename: 'export.json',\n      ...opts,\n    });\n  }\n\n  static writeToFile(\n    content: any,\n    opts?: {\n      filename?: string;\n      type?: string;\n    }\n  ) {\n    if (!content || typeof content !== 'object') return; // Skip if empty\n\n    opts = {\n      type: 'application/json',\n      filename: 'export.json',\n      ...opts,\n    };\n\n    // Create text content\n    const arrayUt8 = stringToU8a(JSON.stringify(content));\n\n    const blob = new Blob([arrayUt8], { type: opts.type });\n    blob['lastModifiedDate'] = new Date().toISOString();\n    blob['name'] = opts.filename;\n\n    return <File>blob;\n  }\n\n  static parseFile<T = any>(file: File, opts?: { encoding?: string }): Observable<FileEvent<T>> {\n    return FilesUtils.readAsText(file, opts?.encoding).pipe(\n      map((e) => {\n        if (e.type === HttpEventType.UploadProgress) {\n          const loaded = Math.round(e.loaded * 0.8);\n          return { ...e, loaded };\n        } else if (e instanceof FileResponse) {\n          const body = e.body;\n          const data = JSON.parse(body) as T;\n          return new FileResponse<T>({ body: data });\n        }\n      }),\n      filter(isNotNil)\n    );\n  }\n\n  static getLocalizedEncoding(translate: TranslateService, defaultEncoding = JsonUtils.DEFAULT_ENCODING): string {\n    const key = 'FILE.JSON.ENCODING';\n    const encoding = translate?.instant(key);\n    if (encoding && encoding !== key) return encoding;\n    return defaultEncoding;\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  inject,\n  Inject,\n  InjectionToken,\n  Input,\n  OnInit,\n  Optional,\n  ViewChild,\n} from '@angular/core';\nimport { AlertController, IonModal, ToastController } from '@ionic/angular';\nimport { BehaviorSubject } from 'rxjs';\nimport { isNotNilOrBlank, removeDuplicatesFromArray, sleep, toBoolean } from '../functions';\nimport { APP_STORAGE, IStorage } from './storage.utils';\nimport { APP_DEBUG_DATA_SERVICE, IDebugDataService } from '../debug/debug-service.class';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Toasts } from '../toast/toasts';\nimport { JsonUtils } from '../file/json.utils';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { Log, LogUtils } from '../logging/logger.model';\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\nimport { DATE_ISO_PATTERN, APP_SHOW_TOOLTIP } from '../constants';\nimport { LogLevel } from '../logging/log-level.model';\nimport { DateUtils } from '../dates';\nimport { Alerts } from '../alerts';\nimport { FilesUtils } from '../file/file.utils';\nimport { PlatformService } from '../../core/services/platform.service';\n\ninterface StorageItemInfo {\n  key: string;\n  type: 'array' | 'object' | 'string' | 'number';\n  total: number;\n}\n\nexport const APP_STORAGE_EXPLORER_PROTECTED_KEYS = new InjectionToken<string[]>('StorageExplorerProtectedKeys');\n\n@Component({\n  selector: 'app-storage-explorer',\n  templateUrl: './storage-explorer.component.html',\n  styleUrls: ['./storage-explorer.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StorageExplorerComponent implements OnInit {\n  private _logPrefix = '[storage-explorer] ';\n  protected $loading = new BehaviorSubject<boolean>(true);\n  protected $items = new BehaviorSubject<StorageItemInfo[]>([]);\n  protected _logKey: string;\n\n  protected data: any;\n  protected logs: Log[];\n  protected key: string;\n\n  @Input() mobile: boolean;\n  @Input() showSendButton: boolean;\n\n  @ViewChild('sendDataModal') sendDataModal: IonModal;\n  @ViewChild('viewDataModal') viewDataModal: IonModal;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected platform: PlatformService,\n    protected toastController: ToastController,\n    protected alertCtrl: AlertController,\n    protected translate: TranslateService,\n    protected dateAdapter: MomentDateAdapter,\n    protected cd: ChangeDetectorRef,\n    @Inject(APP_STORAGE) protected readonly storage: IStorage,\n    @Inject(ENVIRONMENT) protected readonly environment: Environment,\n    @Optional() @Inject(APP_DEBUG_DATA_SERVICE) protected readonly debugDataService: IDebugDataService,\n    @Optional() @Inject(APP_STORAGE_EXPLORER_PROTECTED_KEYS) private readonly _protectedKeys: string[]\n  ) {\n    this._protectedKeys = removeDuplicatesFromArray([...(this._protectedKeys || []), 'seckey', 'token']);\n    this._logKey = environment.logging?.localStorageAppender?.localStorageKey || 'log';\n  }\n\n  ngOnInit() {\n    this.showSendButton = toBoolean(this.showSendButton, true) && !!this.debugDataService;\n    this.mobile = toBoolean(this.mobile, this.platform.is('mobile'));\n\n    this.storage.ready().then(() => this.start());\n  }\n\n  async sendDataClick(event: Event, key: string) {\n    if (!this.debugDataService) {\n      console.warn(`${this._logPrefix}Cannot send debug data: missing provider for 'APP_DEBUG_DATA_SERVICE'`);\n      return;\n    }\n    this.sendDataModal.present();\n\n    const { data, role } = await this.sendDataModal.onDidDismiss();\n    if (role === 'send') {\n      this.sendData(key);\n    }\n  }\n\n  async viewDataClick(event: Event, key: string) {\n    if (!key) return; // skip\n\n    try {\n      this.key = key;\n      const data = await this.storage.get(key);\n      if (this._logKey === key) {\n        const logs = Array.isArray(data) ? data : JSON.parse(data);\n        this.logs = LogUtils.fromObjects(logs);\n      } else {\n        this.data = this.toString(key, data);\n      }\n\n      this.viewDataModal.present();\n\n      await this.viewDataModal.onWillDismiss();\n    } finally {\n      // Forget the data\n      this.data = null;\n      this.logs = null;\n      this.key = null;\n    }\n  }\n\n  async sendData(key: string) {\n    if (!key || !this.debugDataService) return; // Skip\n\n    const rawValue = await this.storage.get(key);\n    try {\n      await this.debugDataService.sendDebugData(rawValue);\n    } catch (e) {\n      await Toasts.show(this.toastController, this.translate, {\n        type: 'error',\n        message: e.message,\n      });\n      return;\n    }\n\n    // Confirm message was sent\n    await Toasts.show(this.toastController, this.translate, {\n      type: 'info',\n      message: this.translate.instant('SOCIAL.INFO.MESSAGE_SENT'),\n    });\n  }\n\n  async downloadAsJson(key: string) {\n    if (!key) return; // skip\n    const data = await this.storage.get(key);\n    const content = this.toString(key, data);\n\n    if (key === this._logKey) {\n      FilesUtils.writeTextToFile(content, { filename: `${key}.txt` });\n    } else {\n      JsonUtils.exportToFile(content, { filename: `${key}.json` });\n    }\n  }\n\n  async copyToClipboard(key: string) {\n    if (!key) return; // skip\n    const data = await this.storage.get(key);\n\n    try {\n      const text = this.toString(key, data);\n\n      // Copy to clipboard\n      await this.platform.copyToClipboard(text, { message: 'INFO.COPY_SUCCEED' });\n    } catch (error) {\n      console.error('Error copying text to clipboard', error);\n    }\n  }\n\n  protected async start() {\n    const items = [];\n    this.storage.forEach((value, key) => {\n      if (this._protectedKeys.includes(key)) return; // Skip protected keys\n\n      if (Array.isArray(value)) {\n        items.push({\n          key,\n          type: 'array',\n          total: value.length,\n        });\n      } else if (typeof value === 'object') {\n        let total;\n        if (value?.type && value?.type === 'object') {\n          const nestedValue = JSON.parse(value.value);\n          total = Array.isArray(nestedValue) ? nestedValue.length : Object.keys(nestedValue).length > 0 ? 1 : 0;\n        } else {\n          total = Object.keys(value).length > 0 ? 1 : 0;\n        }\n        items.push({\n          key,\n          type: 'object',\n          total,\n        });\n      } else {\n        const type = typeof value === 'number' ? 'number' : 'string';\n        items.push({\n          key,\n          type,\n          total: isNotNilOrBlank(value) ? 1 : 0,\n        });\n      }\n\n      this.$items.next(items);\n    });\n\n    this.$loading.next(false);\n  }\n\n  protected async refresh() {\n    if (this.$loading.value) return; // SKip if loading\n\n    this.$loading.next(true);\n    await this.start();\n  }\n\n  protected toString(key: string, data: any, html?: boolean): string {\n    if (key === this._logKey) {\n      let dateTimePattern = this.translate.instant('COMMON.DATE_TIME_SECONDS_PATTERN');\n      if (dateTimePattern === 'COMMON.DATE_TIME_SECONDS_PATTERN') {\n        dateTimePattern = DATE_ISO_PATTERN;\n      }\n      const logs = Array.isArray(data) ? data : JSON.parse(data);\n      return this.toLogs(data)\n        .map((log) =>\n          [this.dateAdapter.format(log.date, dateTimePattern), LogUtils.levelToString(log.level), log.loggerName + '\\t', log.message].join('\\t')\n        )\n        .join('\\n');\n    }\n\n    // Force settings to be indent\n    if (key === 'settings') {\n      data = typeof data === 'object' ? data : JSON.parse(data);\n    }\n\n    // Default case\n    return typeof data === 'string' ? data : JSON.stringify(data, null, 2);\n  }\n\n  protected toLogs(data: any): Log[] {\n    try {\n      const logs = Array.isArray(data) ? data : data ? JSON.parse(data) : [];\n      return LogUtils.fromObjects(logs);\n    } catch (err) {\n      console.error(err);\n      return [\n        {\n          loggerName: 'storage-explorer',\n          level: LogLevel.FATAL,\n          message: err?.message || JSON.stringify(err),\n          date: DateUtils.moment(),\n        },\n      ];\n    }\n  }\n\n  protected async clear(key: string) {\n    const confirmed = await Alerts.askActionConfirmation(this.alertCtrl, this.translate, true);\n    if (!confirmed) return;\n\n    this.logs = [];\n    this.cd.markForCheck();\n\n    await sleep(650);\n\n    await this.storage.remove(key);\n\n    this.viewDataModal.dismiss();\n\n    this.refresh();\n  }\n\n  protected trackByFn(index: number, item: StorageItemInfo): any {\n    return item.key;\n  }\n\n  protected levelToColor(level: LogLevel): string {\n    return `var(--ion-color-${LogUtils.levelToColor(level)})`;\n  }\n  protected levelToString = LogUtils.levelToString;\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-title>Storage Explorer</ion-title>\n\n    <ion-buttons slot=\"end\">\n      <!-- Refresh -->\n      <button\n        mat-icon-button\n        [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n        (click)=\"refresh()\"\n      >\n        <mat-icon>refresh</mat-icon>\n      </button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-no-padding\">\n  <ion-grid class=\"ion-padding list-istorage\">\n    <ion-row>\n      <ion-col size=\"12\" size-lg=\"6\" class=\"mat-header-cell\">\n        <ion-label translate>REFERENTIAL.LABEL</ion-label>\n      </ion-col>\n      <ion-col class=\"mat-header-cell\">\n        <ion-label translate>REFERENTIAL.TYPE</ion-label>\n      </ion-col>\n      <ion-col class=\"mat-header-cell ion-text-start\">\n        <ion-label>Nb</ion-label>\n      </ion-col>\n      <ion-col class=\"mat-header-cell\" size=\"auto\"></ion-col>\n    </ion-row>\n\n    <ion-row class=\"mat-row\" *rxFor=\"let item of $items; trackBy: trackByFn; odd as odd\" [class.odd]=\"odd\">\n      <ion-col size=\"12\" size-lg=\"6\">\n        <ion-label class=\"ion-text-wrap mat-cell\">\n          <b>{{ item.key }}</b>\n        </ion-label>\n      </ion-col>\n      <ion-col class=\"mat-cell\">\n        <ion-label>{{ item.type }}</ion-label>\n      </ion-col>\n      <ion-col class=\"mat-cell\">\n        <ion-label>{{ item.total }}</ion-label>\n      </ion-col>\n      <ion-col size=\"auto mat-cell\">\n        <ion-buttons>\n          <ion-button\n            color=\"primary\"\n            (click)=\"viewDataClick($event, item.key)\"\n            [title]=\"!showTooltip ? ('COMMON.BTN_PREVIEW' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('COMMON.BTN_PREVIEW' | translate) : ''\"\n          >\n            <mat-icon slot=\"icon-only\" [attr.aria-label]=\"'COMMON.BTN_PREVIEW' | translate\">remove_red_eye</mat-icon>\n          </ion-button>\n          <ion-button\n            *ngIf=\"showSendButton\"\n            color=\"primary\"\n            (click)=\"sendDataClick($event, item.key)\"\n            [title]=\"!showTooltip ? ('COMMON.BTN_SEND' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('COMMON.BTN_SEND' | translate) : ''\"\n          >\n            <mat-icon slot=\"icon-only\" [attr.aria-label]=\"'COMMON.BTN_SEND' | translate\">send</mat-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n\n  <ng-container *ngIf=\"$loading | async; else noResult\">\n    <ion-item>\n      <ion-skeleton-text animated></ion-skeleton-text>\n    </ion-item>\n  </ng-container>\n\n  <ng-template #noResult>\n    <ion-item *ngIf=\"$items | async | isEmptyArray\">\n      <ion-text color=\"danger\" class=\"text-italic\" [innerHTML]=\"'COMMON.NO_RESULT' | translate\"></ion-text>\n    </ion-item>\n  </ng-template>\n</ion-content>\n\n<ion-modal #sendDataModal>\n  <ng-template>\n    <ion-content class=\"ion-padding\">\n      <ion-item lines=\"none\" translate>CONFIRM.SEND_DEBUG_DATA</ion-item>\n    </ion-content>\n    <ion-footer>\n      <ion-toolbar>\n        <ion-row class=\"ion-no-padding\" nowrap>\n          <ion-col></ion-col>\n\n          <!-- buttons -->\n          <ion-col size=\"auto\">\n            <ion-button fill=\"clear\" color=\"dark\" (click)=\"sendDataModal.dismiss()\">\n              <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n            </ion-button>\n\n            <ion-button fill=\"solid\" (click)=\"sendDataModal.dismiss(null, 'send')\" color=\"tertiary\">\n              <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n            </ion-button>\n          </ion-col>\n        </ion-row>\n      </ion-toolbar>\n    </ion-footer>\n  </ng-template>\n</ion-modal>\n\n<ion-modal #viewDataModal class=\"modal-large view-modal\">\n  <ng-template>\n    <ion-content class=\"ion-no-padding\" scroll-y=\"true\">\n      <!-- display logs-->\n      <ng-container *ngIf=\"logs; else otherKey\">\n        <ion-grid>\n          <ion-row *ngFor=\"let log of logs\" [style.color]=\"levelToColor(log.level)\">\n            <ion-col size=\"2\" class=\"ion-text-start\">\n              {{ log.date | dateFormat: { time: true } }}\n            </ion-col>\n            <ion-col size=\"2\" class=\"ion-text-start\">\n              {{ levelToString(log.level) }}\n            </ion-col>\n            <ion-col size=\"2\" class=\"ion-text-start\">\n              {{ log.loggerName }}\n            </ion-col>\n            <ion-col size=\"12\" size-lg=\"6\" class=\"ion-text-wrap\">\n              {{ log.message }}\n            </ion-col>\n          </ion-row>\n        </ion-grid>\n      </ng-container>\n      <ng-template #otherKey>\n        <div class=\"ion-padding\">\n          <pre>{{ data }}</pre>\n        </div>\n      </ng-template>\n    </ion-content>\n\n    <ion-footer>\n      <ion-toolbar>\n        <ion-row class=\"ion-no-padding\" nowrap>\n          <ion-col></ion-col>\n\n          <!-- buttons -->\n          <ion-col size=\"auto\">\n            <ion-button fill=\"clear\" color=\"danger\" (click)=\"clear(key)\">\n              <mat-icon slot=\"start\">delete</mat-icon>\n              <ion-label translate>COMMON.BTN_CLEAR</ion-label>\n            </ion-button>\n            <ion-button fill=\"clear\" (click)=\"copyToClipboard(key)\">\n              <mat-icon slot=\"start\">content_copy</mat-icon>\n              <ion-label translate>COMMON.BTN_COPY</ion-label>\n            </ion-button>\n\n            <ion-button fill=\"clear\" *ngIf=\"!mobile\" (click)=\"downloadAsJson(key)\">\n              <mat-icon slot=\"start\">download</mat-icon>\n              <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n            </ion-button>\n\n            <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"viewDataModal.dismiss()\">\n              <ion-label translate>COMMON.BTN_CLOSE</ion-label>\n            </ion-button>\n          </ion-col>\n        </ion-row>\n      </ion-toolbar>\n    </ion-footer>\n  </ng-template>\n</ion-modal>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { StorageExplorerComponent } from './storage-explorer.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IonicModule } from '@ionic/angular';\nimport { SharedPipesModule } from '../pipes/pipes.module';\nimport { SharedMaterialModule } from '../material/material.module';\nimport { RxStateModule } from '../rx-state/rx-state.module';\n\n@NgModule({\n  imports: [\n    IonicModule,\n    CommonModule,\n    TranslateModule.forChild(),\n    RxStateModule,\n\n    // Other shared modules\n    SharedPipesModule,\n    SharedMaterialModule,\n  ],\n  declarations: [StorageExplorerComponent],\n  exports: [StorageExplorerComponent],\n})\nexport class StorageExplorerModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    TranslateModule.forChild(),\n\n    // Testing sub-modules\n  ],\n  declarations: [],\n  exports: [\n    // Testing sub-modules\n  ],\n})\nexport class LoggingServiceModule {}\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Directive, ElementRef, inject, Inject, Input, Output } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { distinctUntilChanged, map, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport { fromEvent, Observable } from 'rxjs';\n\n/** Largeur minimale par défaut d'une colonne en pixels */\nconst DEFAULT_MIN_WIDTH = 50;\n\n@Directive({\n  // eslint-disable-next-line @angular-eslint/directive-selector\n  selector: '[resizable]',\n})\nexport class ResizableDirective {\n  private readonly destroyRef = inject(DestroyRef);\n\n  /** Largeur minimale absolue de la colonne en pixels */\n  @Input() minWidth: number = DEFAULT_MIN_WIDTH;\n\n  @Output()\n  readonly resizable: Observable<number>;\n\n  // fit: doubleclick (utilise l'événement natif dblclick)\n  @Output()\n  readonly fit: Observable<MouseEvent>;\n\n  constructor(\n    @Inject(DOCUMENT) private readonly document: Document,\n    @Inject(ElementRef) private readonly elementRef: ElementRef<HTMLElement>\n  ) {\n    // resize: mousedown -> mousemove -> mouseup\n    this.resizable = fromEvent<MouseEvent>(this.elementRef.nativeElement, 'mousedown').pipe(\n      takeUntilDestroyed(this.destroyRef),\n      tap((e) => {\n        e.preventDefault();\n        e.stopPropagation();\n      }),\n      switchMap((startEvent) => {\n        const thElement = this.elementRef.nativeElement.closest('th');\n        if (!thElement) {\n          return [];\n        }\n        const { width } = thElement.getBoundingClientRect();\n        const startX = startEvent.clientX;\n\n        // Calcul de la largeur minimale basée sur la largeur du tableau\n        const minAllowedWidth = this.calculateMinWidth(thElement);\n\n        return fromEvent<MouseEvent>(this.document, 'mousemove').pipe(\n          map((moveEvent) => {\n            const deltaX = moveEvent.clientX - startX;\n            const newWidth = width + deltaX;\n            // Appliquer la limite minimale\n            return Math.max(newWidth, minAllowedWidth);\n          }),\n          distinctUntilChanged(),\n          takeUntil(fromEvent(this.document, 'mouseup'))\n        );\n      })\n    );\n\n    // fit: utilise l'événement natif dblclick pour une détection fiable\n    this.fit = fromEvent<MouseEvent>(this.elementRef.nativeElement, 'dblclick').pipe(takeUntilDestroyed(this.destroyRef));\n  }\n\n  /**\n   * Calcule la largeur minimale autorisée pour la colonne courante.\n   * La largeur minimale est calculée pour que la somme des largeurs de toutes les colonnes\n   * ne dépasse pas la largeur du conteneur du tableau.\n   *\n   * @param currentTh L'élément th de la colonne en cours de redimensionnement\n   * @returns La largeur minimale en pixels\n   */\n  private calculateMinWidth(currentTh: Element): number {\n    // Trouver le conteneur du tableau (div.table-container)\n    const tableContainer = currentTh.closest('div.table-container');\n    if (!tableContainer) {\n      return this.minWidth;\n    }\n\n    // Obtenir la largeur du conteneur\n    const containerWidth = tableContainer.getBoundingClientRect().width;\n\n    // Trouver toutes les colonnes du header dans le conteneur\n    const allColumns = Array.from(tableContainer.querySelectorAll('th'));\n\n    // Calculer la somme des largeurs des autres colonnes\n    let otherColumnsWidth = 0;\n    for (const th of allColumns) {\n      if (th !== currentTh) {\n        otherColumnsWidth += th.getBoundingClientRect().width;\n      }\n    }\n\n    // La largeur minimale est la largeur du conteneur moins les autres colonnes\n    // avec un minimum absolu défini par minWidth\n    const calculatedMinWidth = containerWidth - otherColumnsWidth;\n\n    return Math.min(calculatedMinWidth, this.minWidth);\n  }\n}\n","import { Component, EventEmitter, HostBinding, Input, Optional, Output } from '@angular/core';\nimport { MatColumnDef } from '@angular/material/table';\n\n@Component({\n  // eslint-disable-next-line @angular-eslint/component-selector\n  selector: 'th[resizable]',\n  templateUrl: './resizable.template.html',\n  styleUrls: ['./resizable.style.scss'],\n})\nexport class ResizableComponent {\n  @Input() resizable: boolean;\n  @Output() sizeChanged = new EventEmitter<number>();\n\n  @HostBinding('style.width')\n  width: string | null = null;\n\n  @HostBinding('style.min-width')\n  minWidth: string | null = null;\n\n  @HostBinding('style.max-width')\n  maxWidth: string | null = null;\n\n  private debug = false;\n\n  constructor(@Optional() public readonly columnDef: MatColumnDef) {}\n\n  onResize(width: number, opts?: { emitEvent: boolean }) {\n    if (!this.resizable) return;\n    if (this.debug) console.info(`resize:${width}`);\n    this.width = width + 'px';\n    this.minWidth = width + 'px';\n    this.maxWidth = width + 'px';\n    if (!opts || opts.emitEvent) {\n      this.sizeChanged.emit(width);\n    }\n  }\n\n  onFit(opts?: { emitEvent: boolean }) {\n    if (!this.resizable) return;\n    if (this.debug) console.info('fit');\n    this.width = 'auto';\n    this.minWidth = null;\n    this.maxWidth = null;\n    if (!opts || opts.emitEvent) {\n      this.sizeChanged.emit(undefined);\n    }\n  }\n}\n","<div class=\"wrapper\">\n  <div class=\"content\">\n    <ng-content></ng-content>\n  </div>\n  <div class=\"bar\" [class.cdk-visually-hidden]=\"!resizable\" (resizable)=\"onResize($event)\" (fit)=\"onFit()\"></div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { ResizableComponent } from './resizable.component';\nimport { ResizableDirective } from './resizable.directive';\n\n@NgModule({\n  declarations: [ResizableComponent, ResizableDirective],\n  exports: [ResizableComponent, ResizableDirective],\n})\nexport class ResizableModule {}\n","import { inject, Injectable, InjectionToken } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { isEmptyArray } from '../../functions';\nimport { EqualsFn } from '../../types';\n\nexport const APP_CELL_SELECTION_SERVICE_TOKEN = new InjectionToken<CellSelectionService>('CellSelectionService');\nexport const APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN = new InjectionToken<CellSelectionServiceConfig<any>>('CellSelectionServiceConfig');\n\nexport interface ICellId {\n  rowId: number;\n  columnName: string;\n}\n\nexport interface CellSelectionEvent<C extends ICellId> {\n  selectedCells: C[];\n  isRangeSelection: boolean;\n  isToggleSelection: boolean;\n}\n\nexport interface CellSelectionServiceConfig<C extends ICellId> {\n  equals: EqualsFn<C>;\n  new: (cellId: ICellId) => C;\n}\n\n/**\n * Service to manage cell selection state across multiple directive instances.\n * This service should be provided at the component level (not root) to ensure\n * proper isolation between different table instances.\n */\n@Injectable()\nexport class CellSelectionService<C extends ICellId = ICellId> {\n  // Configuration\n  config = inject(APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN, { optional: true });\n  selectableColumns: string[] = [];\n  disabled = false;\n\n  // Selection state\n  private _selectedCells: C[] = [];\n  private selectionStartCell: C | null = null;\n  private isSelecting = false;\n  private currentRangeColumnFirstIndex = -1;\n  private currentRangeColumnLastIndex = -1;\n\n  // Drag state\n  draggedCells: C[] = [];\n  private dragStartCell: C | null = null;\n  private isDragging = false;\n\n  // Observables\n  readonly selectionChangeSubject = new Subject<CellSelectionEvent<C>>();\n  readonly selectionRightClickSubject = new Subject<MouseEvent>();\n\n  // Overridable methods\n  private readonly _equals: EqualsFn<C>;\n  private readonly _new: (cellId: ICellId) => C;\n\n  constructor() {\n    this._equals = this.config?.equals;\n    this._new = this.config?.new;\n  }\n\n  // Override method\n  equals(cell1: C, cell2: C): boolean {\n    return this._equals ? this._equals(cell1, cell2) : cell1?.rowId === cell2?.rowId && cell1?.columnName === cell2?.columnName;\n  }\n\n  // Override method\n  new(cellId: ICellId): C {\n    return this._new ? this._new(cellId) : (cellId as C);\n  }\n\n  get selectedCells(): C[] {\n    return this._selectedCells;\n  }\n\n  set selectedCells(value: C[]) {\n    this.emitSelection(value, false, false);\n  }\n\n  isCellSelected(cellId: C): boolean {\n    return this.selectedCells.some((selectedCell) => this.equals(selectedCell, cellId));\n  }\n\n  isCellDragged(cellId: C): boolean {\n    return this.draggedCells.some((selectedCell) => this.equals(selectedCell, cellId));\n  }\n\n  // Core selection logic (moved from CellIdentifierDirective)\n  async handleCellMouseDown(event: MouseEvent, cellId: C) {\n    // Prevent selection if cell's column is not selectable or disabled\n    if (this.disabled || !this.selectableColumns.includes(cellId.columnName)) {\n      this.emitSelection([], false, false);\n      return;\n    }\n\n    // Handle right click\n    if (event.button === 2 && this.selectionRightClickSubject.observed) {\n      event.stopPropagation();\n      this.selectionRightClickSubject.next(event);\n      return;\n    }\n\n    const isCtrlKey = event.ctrlKey || event.metaKey;\n    const isShiftKey = event.shiftKey;\n    const newCellId = this.new(cellId);\n\n    if (!isShiftKey && !isCtrlKey) {\n      this.startSelection(newCellId);\n      // this.startDragSelection(cell);\n    } else if (isCtrlKey) {\n      this.toggleCellSelection(newCellId);\n    } else if (isShiftKey) {\n      this.selectRange(newCellId);\n    }\n  }\n\n  async handleCellMouseEnter(event: MouseEvent, cellId: C) {\n    if (this.disabled || !this.selectableColumns.includes(cellId.columnName)) {\n      return;\n    }\n    // TODO check if next cell can be selected\n\n    if (this.isSelecting && this.selectionStartCell) {\n      this.updateSelection(cellId);\n    } else if (this.isDragging && this.dragStartCell) {\n      this.updateDraggedCells(cellId);\n    }\n  }\n\n  endMouseMove(): void {\n    if (this.isSelecting) {\n      this.resetSelectionState();\n    } else if (this.isDragging) {\n      this.resetDragState();\n    }\n  }\n\n  // Private helper methods\n  private startSelection(cellId: C): void {\n    this.selectionStartCell = cellId;\n    this.isSelecting = true;\n    this.currentRangeColumnFirstIndex = -1;\n    this.currentRangeColumnLastIndex = -1;\n    this.emitSelection([cellId], false, false);\n  }\n\n  private startDragSelection(cellId: C): void {\n    this.dragStartCell = cellId;\n    this.isDragging = true;\n    this.draggedCells = [cellId];\n    // this.emitSelection([cellId], false, false);\n  }\n\n  private toggleCellSelection(cellId: C): void {\n    const currentCells = [...this.selectedCells];\n    const cellIndex = currentCells.findIndex((c) => this.equals(c, cellId));\n\n    if (cellIndex >= 0) {\n      currentCells.splice(cellIndex, 1);\n    } else {\n      currentCells.push(cellId);\n    }\n\n    this.emitSelection(currentCells, false, true);\n  }\n\n  private selectRange(endCell: C): void {\n    const rangeCells = this.calculateRangeCells(endCell);\n    this.emitSelection(rangeCells, true, false);\n  }\n\n  private updateSelection(currentCell: C): void {\n    const rangeCells = this.calculateRangeBetweenCells(this.selectionStartCell, currentCell);\n    this.emitSelection(rangeCells, true, false);\n  }\n\n  private updateDraggedCells(currentCell: C): void {\n    // this.draggedCells.set(rangeCells);\n  }\n\n  private emitSelection(cells: C[], isRange: boolean, isToggle: boolean): void {\n    this._selectedCells = cells;\n    this.selectionChangeSubject.next({\n      selectedCells: cells,\n      isRangeSelection: isRange,\n      isToggleSelection: isToggle,\n    });\n  }\n\n  calculateRangeCells(endCell: C): C[] {\n    if (isEmptyArray(this.selectedCells)) {\n      this.currentRangeColumnFirstIndex = -1;\n      this.currentRangeColumnLastIndex = -1;\n      return [endCell];\n    }\n\n    const lastSelectedCell = this.findFirstSelectedCell(this.selectedCells);\n    return this.calculateRangeBetweenCells(lastSelectedCell, endCell);\n  }\n\n  calculateRangeBetweenCells(startCell: C, endCell: C): C[] {\n    // Get first cell coordinates, then add this cell as a range\n    const firstRowId = Math.min(startCell.rowId, endCell.rowId);\n    const lastRowId = Math.max(startCell.rowId, endCell.rowId);\n    const startColumnIndex = this.selectableColumns.indexOf(startCell.columnName);\n    const endColumnIndex = this.selectableColumns.indexOf(endCell.columnName);\n    if (endColumnIndex !== -1) {\n      this.currentRangeColumnFirstIndex = Math.min(startColumnIndex, endColumnIndex);\n      this.currentRangeColumnLastIndex = Math.max(startColumnIndex, endColumnIndex);\n    }\n    // Iterate columns and rows\n    const rangeCells: C[] = [];\n    for (let i = this.currentRangeColumnFirstIndex; i <= this.currentRangeColumnLastIndex; i++) {\n      const columnName = this.selectableColumns[i];\n      for (let rowId = firstRowId; rowId <= lastRowId; rowId++) {\n        rangeCells.push(this.new({ rowId: rowId, columnName: columnName }));\n      }\n    }\n\n    return rangeCells;\n  }\n\n  resetSelectionState(): void {\n    this.selectionStartCell = null;\n    this.isSelecting = false;\n  }\n\n  resetDragState(): void {\n    this.dragStartCell = null;\n    this.isDragging = false;\n    this.draggedCells = [];\n  }\n\n  private findFirstSelectedCell(selectedCells: C[]): C {\n    // Find the cell with the lowest rowId and columnIndex\n    return this.findSelectedCell(\n      selectedCells,\n      Math.min(...selectedCells.map((cell) => cell.rowId)),\n      Math.min(...selectedCells.map((cell) => this.selectableColumns.indexOf(cell.columnName)))\n    );\n  }\n\n  private findLastSelectedCell(selectedCells: C[]): C {\n    // Find the cell with the lowest rowId and columnIndex\n    return this.findSelectedCell(\n      selectedCells,\n      Math.max(...selectedCells.map((cell) => cell.rowId)),\n      Math.max(...selectedCells.map((cell) => this.selectableColumns.indexOf(cell.columnName)))\n    );\n  }\n\n  private findSelectedCell(selectedCells: C[], rowId: number, columnIndex: number): C {\n    // Find the cell with the current indexes\n    return selectedCells.filter((cell) => cell.rowId === rowId && cell.columnName === this.selectableColumns[columnIndex])[0];\n  }\n}\n","import { DestroyRef, Directive, effect, ElementRef, inject, input, OnInit, output, Renderer2 } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\nimport { APP_CELL_SELECTION_SERVICE_TOKEN, CellSelectionEvent, ICellId } from './cell-selection.service';\nimport { isEmptyArray, isNotEmptyArray } from '../../functions';\n\ninterface SelectionBounds {\n  top: number;\n  left: number;\n  width: number;\n  height: number;\n}\n\n@Directive({\n  selector: '[appCellSelection]',\n  standalone: true,\n})\nexport class CellSelectionDirective<C extends ICellId = ICellId> implements OnInit {\n  // Inputs\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  selectableColumns = input<string[]>([], { alias: 'appSelectableColumns' });\n  disabled = input(false, { alias: 'appCellSelectionDisabled' });\n\n  // Outputs\n  // eslint-disable-next-line @angular-eslint/no-output-rename\n  selectionChange = output<CellSelectionEvent<C>>({ alias: 'appCellSelectionChange' });\n  // eslint-disable-next-line @angular-eslint/no-output-rename\n  rightClick = output<MouseEvent>({ alias: 'appCellRightClick' });\n\n  // Inject service by token\n  protected service = inject(APP_CELL_SELECTION_SERVICE_TOKEN);\n\n  private readonly elementRef = inject(ElementRef);\n  private readonly renderer = inject(Renderer2);\n  private readonly destroyRef = inject(DestroyRef);\n  private overlayElements: HTMLElement[] = [];\n\n  constructor() {\n    effect(() => {\n      this.service.disabled = this.disabled();\n    });\n  }\n\n  ngOnInit() {\n    // Initialize service with selectable columns\n    this.setupServiceConfiguration();\n    // Setup global mouseup listener\n    this.setupGlobalMouseEvents();\n    // Setup keyboard listener for copy (for test)\n    // this.setupCopyListener();\n  }\n\n  private setupServiceConfiguration() {\n    // Pass selectable columns to service\n    this.service.selectableColumns = this.selectableColumns();\n\n    // Listen to service selection changes and emit\n    this.service.selectionChangeSubject\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((event) => this.selectionChange.emit(event as CellSelectionEvent<C>));\n\n    // Listen to right-click event\n    this.service.selectionRightClickSubject.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => this.rightClick.emit(event));\n  }\n\n  private setupGlobalMouseEvents() {\n    fromEvent<MouseEvent>(document, 'mouseup')\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.service.endMouseMove());\n  }\n\n  // For test purpose only (type CTRL+C)\n  private setupCopyListener() {\n    fromEvent<KeyboardEvent>(document, 'keydown')\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((event) => {\n        if ((event.ctrlKey || event.metaKey) && event.key === 'c') {\n          const cells = this.service.selectedCells as C[];\n          if (isNotEmptyArray(cells)) {\n            // Show overlay\n            this.addCellsOverlay(cells);\n\n            event.preventDefault();\n\n            // Hide overlay after animation completes (1 second)\n            setTimeout(() => {\n              this.removeCellsOverlay();\n            }, 1000);\n          }\n        }\n      });\n  }\n\n  addCellsOverlay(cells: C[]) {\n    // Remove existing overlays\n    this.removeCellsOverlay();\n\n    // Group cells into contiguous regions\n    const cellGroups = this.groupContiguousCells(cells);\n\n    // Create and render overlay for each contiguous region\n    cellGroups.forEach((group) => {\n      const bounds = this.calculateSelectionBounds(group);\n      if (bounds) {\n        const overlay = this.createOverlayElement(bounds);\n        this.renderer.appendChild(this.elementRef.nativeElement, overlay);\n        this.overlayElements.push(overlay);\n      }\n    });\n  }\n\n  removeCellsOverlay() {\n    this.overlayElements.forEach((overlay) => {\n      this.renderer.removeChild(this.elementRef.nativeElement, overlay);\n    });\n    this.overlayElements = [];\n  }\n\n  private groupContiguousCells(cells: C[]): C[][] {\n    // Create a map for quick lookup\n    const cellMap = new Map<string, C>();\n    cells.forEach((cell) => {\n      cellMap.set(this.getCellKey(cell), cell);\n    });\n\n    const visited = new Set<string>();\n    const groups: C[][] = [];\n\n    // Process each cell\n    cells.forEach((cell) => {\n      const key = this.getCellKey(cell);\n      if (visited.has(key)) {\n        return;\n      }\n\n      // Start a new contiguous group with flood-fill\n      const group: C[] = [];\n      const queue: C[] = [cell];\n      visited.add(key);\n\n      while (queue.length > 0) {\n        const current = queue.shift()!;\n        group.push(current);\n\n        // Check all 4 adjacent cells (up, down, left, right)\n        const neighbors = this.getAdjacentCells(current);\n        neighbors.forEach((neighbor) => {\n          const neighborKey = this.getCellKey(neighbor);\n          if (cellMap.has(neighborKey) && !visited.has(neighborKey)) {\n            visited.add(neighborKey);\n            queue.push(neighbor);\n          }\n        });\n      }\n\n      groups.push(group);\n    });\n\n    return groups;\n  }\n\n  private getAdjacentCells(cell: C): C[] {\n    // Returns cells adjacent to the current cell (up, down, left, right)\n    // Note: We need to get column order from the actual table structure\n    // For now, we'll use a simple approach based on rowId adjacency\n    return [\n      { rowId: cell.rowId - 1, columnName: cell.columnName }, // up\n      { rowId: cell.rowId + 1, columnName: cell.columnName }, // down\n      { rowId: cell.rowId, columnName: this.getNextColumnName(cell.columnName, -1) }, // left\n      { rowId: cell.rowId, columnName: this.getNextColumnName(cell.columnName, 1) }, // right\n    ].filter((c) => c.columnName !== null) as C[];\n  }\n\n  private getNextColumnName(currentColumnName: string, offset: number): string | null {\n    const columns = this.service.selectableColumns;\n\n    const currentIndex = columns.indexOf(currentColumnName);\n    if (currentIndex === -1) {\n      return null;\n    }\n\n    const newIndex = currentIndex + offset;\n    if (newIndex < 0 || newIndex >= columns.length) {\n      return null;\n    }\n\n    return columns[newIndex];\n  }\n\n  private getCellKey(cell: C): string {\n    return `${cell.rowId}-${cell.columnName}`;\n  }\n\n  private calculateSelectionBounds(cells: C[]): SelectionBounds | null {\n    const container = this.elementRef.nativeElement as HTMLElement;\n\n    // Find all selected cell elements\n    const cellElements: HTMLElement[] = [];\n    cells.forEach((cell) => {\n      const cellElement = container.querySelector(`[data-row-id=\"${cell.rowId}\"][data-column-name=\"${cell.columnName}\"]`) as HTMLElement;\n      if (cellElement) {\n        cellElements.push(cellElement);\n      }\n    });\n\n    if (isEmptyArray(cellElements)) {\n      return null;\n    }\n\n    // Get container position\n    const containerRect = container.getBoundingClientRect();\n\n    // Calculate bounding box\n    let minTop = Infinity;\n    let minLeft = Infinity;\n    let maxBottom = -Infinity;\n    let maxRight = -Infinity;\n\n    cellElements.forEach((element) => {\n      const rect = element.getBoundingClientRect();\n      minTop = Math.min(minTop, rect.top - containerRect.top);\n      minLeft = Math.min(minLeft, rect.left - containerRect.left);\n      maxBottom = Math.max(maxBottom, rect.bottom - containerRect.top);\n      maxRight = Math.max(maxRight, rect.right - containerRect.left);\n    });\n\n    return {\n      top: minTop,\n      left: minLeft,\n      width: maxRight - minLeft,\n      height: maxBottom - minTop,\n    };\n  }\n\n  private createOverlayElement(bounds: SelectionBounds): HTMLElement {\n    const overlay = this.renderer.createElement('div');\n    this.renderer.addClass(overlay, 'cell-selection-overlay');\n\n    // Set position and size\n    this.renderer.setStyle(overlay, 'top', `${bounds.top}px`);\n    this.renderer.setStyle(overlay, 'left', `${bounds.left}px`);\n    this.renderer.setStyle(overlay, 'width', `${bounds.width}px`);\n    this.renderer.setStyle(overlay, 'height', `${bounds.height}px`);\n\n    return overlay;\n  }\n}\n","import { DestroyRef, Directive, inject, input, OnInit, signal } from '@angular/core';\nimport { APP_CELL_SELECTION_SERVICE_TOKEN, ICellId } from './cell-selection.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { filter } from 'rxjs/operators';\nimport { arraySize } from '../../functions';\n\n@Directive({\n  selector: '[appCellId]',\n  standalone: true,\n  host: {\n    '(mousedown)': 'handleMouseDown($event)',\n    '(mouseenter)': 'handleMouseEnter($event)',\n    '[class.cell-selected]': 'isCellSelected()',\n    '[class.cell-multiple-selected]': 'isMultipleCellsSelected()',\n    '[class.cell-dragging]': 'isDragging()',\n    '[attr.data-row-id]': 'cellId().rowId',\n    '[attr.data-column-name]': 'cellId().columnName',\n  },\n})\nexport class CellIdentifierDirective<C extends ICellId = ICellId> implements OnInit {\n  cellId = input.required<C>({ alias: 'appCellId' });\n\n  private isInitialized = false;\n  protected isCellSelected = signal(false);\n  protected isMultipleCellsSelected = signal(false);\n  protected isDragging = signal(false);\n\n  // Optional service dependency\n  private readonly service = inject(APP_CELL_SELECTION_SERVICE_TOKEN, { optional: true });\n  private readonly destroyRef = inject(DestroyRef);\n\n  ngOnInit() {\n    // Listen to service selection changes and emit\n    this.service?.selectionChangeSubject\n      .pipe(\n        filter(() => this.isInitialized),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe(() => {\n        this.isCellSelected.set(this.service.isCellSelected(this.cellId()));\n        this.isMultipleCellsSelected.set(arraySize(this.service.selectedCells) > 1);\n      });\n    this.isInitialized = true;\n  }\n\n  protected async handleMouseDown(event: MouseEvent) {\n    if (!this.isInitialized) return;\n    await this.service?.handleCellMouseDown(event, this.cellId());\n  }\n\n  protected async handleMouseEnter(event: MouseEvent) {\n    if (!this.isInitialized) return;\n    await this.service?.handleCellMouseEnter(event, this.cellId());\n  }\n}\n","import { Observable } from 'rxjs';\nimport { ApolloCache, FetchPolicy, MutationUpdaterFn, MutationUpdaterFunction, WatchQueryFetchPolicy } from '@apollo/client/core';\nimport { SortDirection } from '@angular/material/sort';\nimport { EmptyObject } from '../../core/graphql/graphql.utils';\nimport { MutationBaseOptions } from '@apollo/client/core/watchQueryOptions';\n\nexport declare interface Page {\n  offset: number;\n  size: number;\n  sortBy?: string;\n  sortDirection?: SortDirection;\n}\n\nexport type FetchMoreFn<R, V = EmptyObject> = (variables?: V) => Promise<R>;\n\nexport declare interface LoadResult<T> {\n  data: T[];\n  total?: number;\n  errors?: any[];\n  fetchMore?: FetchMoreFn<LoadResult<T>>;\n}\n\nexport type SuggestFn<T, F, R = T[] | LoadResult<T>> = (\n  value: any,\n  filter?: F,\n  sortBy?: string | keyof T,\n  sortDirection?: SortDirection,\n  opts?: {\n    fetchPolicy?: FetchPolicy;\n    offset?: number;\n    size?: number;\n    [key: string]: any;\n  }\n) => Promise<R>;\n\nexport declare interface SuggestService<T, F> {\n  suggest: SuggestFn<T, F>;\n}\n\nexport declare interface EntityServiceLoadOptions<T = any, V = any> {\n  fetchPolicy?: FetchPolicy;\n  trash?: boolean;\n  toEntity?: boolean | ((source: any, opts?: any) => T);\n  query?: any;\n  variables?: V;\n  [key: string]: any;\n}\n\n\nexport declare interface EntityServiceWatchOptions<T = any, V = any> {\n  query?: any;\n  variables?: V;\n  fetchPolicy?: WatchQueryFetchPolicy;\n  trash?: boolean;\n  toEntity?: boolean | ((source: any, opts?: any) => T);\n  [key: string]: any;\n}\n\nexport declare interface EntityServiceListenChangesOptions<T = any, V = any> {\n  query?: any;\n  variables?: V;\n  interval?: number;\n  fetchPolicy?: FetchPolicy;\n  toEntity?: boolean | ((source: any, opts?: any) => T);\n  [key: string]: any;\n}\n\nexport interface EntityServiceSaveOptions<T = any, V = any> {\n  query?: any;\n  variables?: V;\n  refetchQueries?: MutationBaseOptions<T>['refetchQueries'];\n  awaitRefetchQueries?: boolean;\n  update?: MutationUpdaterFn<{ data: any }> | MutationUpdaterFunction<{ data: any }, V, any, ApolloCache<{ data: any }>>;\n  [key: string]: any;\n}\n\nexport declare interface EntityServiceDeleteOptions<T = any, V = any> extends Omit<EntityServiceSaveOptions<T, V>, 'query'> {\n  mutation?: any;\n}\n\nexport declare interface IEntityService<\n  T,\n  ID = any,\n  LO = EntityServiceLoadOptions<T>,\n  SO = EntityServiceSaveOptions<T>,\n  DO = EntityServiceDeleteOptions<T>,\n> {\n  load(id: ID, opts?: LO): Promise<T>;\n\n  canUserWrite(data: T, opts?: any): boolean;\n\n  save(data: T, opts?: SO): Promise<T>;\n\n  delete(data: T, opts?: DO): Promise<any>;\n\n  listenChanges(id: ID, opts?: any): Observable<T | undefined>;\n}\n\nexport declare interface EntitiesServiceLoadOptions<T = any, V = any> extends EntityServiceLoadOptions<T, V> {\n  withTotal?: boolean;\n}\n\nexport declare interface EntitiesServiceWatchOptions<T = any, V = any> extends EntityServiceWatchOptions<T, V> {\n  withTotal?: boolean;\n}\n\nexport declare interface EntitiesServiceSaveOptions<T = any, V = any> extends EntityServiceSaveOptions<T, V> {}\n\nexport declare interface EntitiesServiceDeleteOptions<T = any, V = any> extends EntityServiceDeleteOptions<T, V> {}\n\nexport declare interface IEntitiesService<\n  T,\n  F,\n  O extends EntitiesServiceWatchOptions = EntitiesServiceWatchOptions<T>,\n  SO extends EntitiesServiceSaveOptions = EntitiesServiceSaveOptions<T>,\n  DO extends EntitiesServiceDeleteOptions = EntitiesServiceDeleteOptions<T>,\n> {\n  // TODO change to required (in a future version)\n  readonly defaultFetchPolicy?: WatchQueryFetchPolicy;\n\n  watchAll(offset: number, size: number, sortBy?: string, sortDirection?: SortDirection, filter?: Partial<F>, options?: O): Observable<LoadResult<T>>;\n\n  // TODO\n  /*watchPage(\n    page: Page<T>,\n    filter?: F,\n    options?: O\n  ): Observable<LoadResult<T>>;*/\n\n  saveAll(data: T[], opts?: SO): Promise<T[]>;\n\n  deleteAll(data: T[], opts?: DO): Promise<any>;\n\n  asFilter(filter: Partial<F>): F;\n}\n\nexport type LoadResultByPageFn<T> = (offset: number, size: number) => Promise<LoadResult<T>>;\n\nexport interface IEntityFullService<T, ID, F, O extends EntitiesServiceWatchOptions & EntityServiceLoadOptions>\n  extends IEntityService<T, ID, O>,\n    IEntitiesService<T, F, O> {}\n\n/**\n * Merges two LoadResult objects into a single LoadResult object by combining their data arrays and summing their total counts.\n *\n * @param {LoadResult<T>} res1 - The first LoadResult object to merge.\n * @param {LoadResult<T>} res2 - The second LoadResult object to merge.\n * @return {LoadResult<T>} A new LoadResult object containing the combined data and total count from both input objects.\n */\nexport function mergeLoadResult<T>(res1: LoadResult<T>, res2: LoadResult<T>): LoadResult<T> {\n  return {\n    data: (res1.data || []).concat(...res2.data),\n    total: (res1.total || res1.data?.length || 0) + (res2.total || res2.data?.length || 0),\n  };\n}\n\n\n/**\n * Converts an array of items or an already structured LoadResult object\n * into a LoadResult object.\n *\n * @param {T[] | LoadResult<T>} res - The input which can either be an\n * array of items or a LoadResult object.\n *\n * @return {LoadResult<T>} Returns a LoadResult object. If the input is\n * an array, it is converted into a LoadResult object with the data property\n * containing the array. If the input is already a LoadResult, it is returned as is.\n */\nexport function toLoadResult<T>(res: T[] | LoadResult<T>): LoadResult<T> {\n  if (!res) return res as LoadResult<T>;\n  // Convert T[] => LoadResult<T>\n  if (Array.isArray(res)) return {data: res};\n  return res as LoadResult<T>;\n}\n\nexport function toLoadData<T>(res: T[] | LoadResult<T>): T[] {\n  if (!res) return res as T[];\n  if (Array.isArray(res)) return res;\n  // Convert LoadResult<T> => T[]\n  return res.data;\n}\n\nexport function isEntityService<T, ID>(service: any): service is IEntityService<T, ID> {\n  return service && service.load && service.save && service.delete;\n}\n","import { BehaviorSubject, merge, Observable } from 'rxjs';\nimport { filter, map, mergeMap, takeUntil, tap } from 'rxjs/operators';\nimport { isEmptyArray, isNil, isNotEmptyArray, isNotNil } from '../functions';\nimport { EntitiesServiceLoadOptions, EntitiesServiceWatchOptions, IEntitiesService, LoadResult } from './entity-service.class';\nimport { SortDirection } from '@angular/material/sort';\nimport { Directive, OnDestroy } from '@angular/core';\nimport { EntityUtils, IEntity } from '../../core/services/model/entity.model';\nimport { EntityFilter, EntityFilterUtils } from '../../core/services/model/filter.model';\nimport { firstFalsePromise, WaitForOptions } from '../observables';\nimport { StartableObservableService } from './startable-observable-service.class';\nimport { FilterFn, FilterFnFactory } from '../types';\n\nexport interface InMemoryEntitiesServiceOptions<T, F> {\n  onSort?: (data: T[], sortBy?: string, sortDirection?: SortDirection) => T[];\n  onLoad?: (data: T[]) => T[] | Promise<T[]>;\n  onSave?: (data: T[]) => T[] | Promise<T[]>;\n  equals?: (d1: T, d2: T) => boolean;\n\n  filterFnFactory?: FilterFnFactory<T, F>;\n  filterFn?: FilterFn<T>;\n\n  sortByReplacement?: { [key: string]: string };\n}\n\n// @dynamic\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class InMemoryEntitiesService<\n    T extends IEntity<T, ID>,\n    F = any,\n    ID = number,\n    O extends EntitiesServiceWatchOptions = EntitiesServiceWatchOptions,\n    SO extends InMemoryEntitiesServiceOptions<T, F> = InMemoryEntitiesServiceOptions<T, F>\n  >\n  extends StartableObservableService<T[], T[]>\n  implements IEntitiesService<T, F, O>, OnDestroy\n{\n  debug = false;\n\n  private _hiddenData: T[] = null;\n\n  readonly dirtySubject = new BehaviorSubject<boolean>(false);\n  readonly savingSubject = new BehaviorSubject<boolean>(false);\n\n  protected sortByReplacement: { [key: string]: string };\n  private _sortFn: (data: T[], sortBy?: string, sortDirection?: SortDirection) => T[];\n  private _onLoad: (data: T[]) => T[] | Promise<T[]>;\n  private _onSaveFn: (data: T[]) => T[] | Promise<T[]>;\n  private _equalsFn: (d1: T, d2: T) => boolean;\n  private _filterFnFactory: FilterFnFactory<T, F>;\n\n  get defaultFetchPolicy(): 'cache-only' {\n    return 'cache-only';\n  }\n\n  set value(data: T[]) {\n    this.setValue(data);\n  }\n\n  get value(): T[] {\n    return this.dataSubject.getValue();\n  }\n\n  get saving(): boolean {\n    return this.savingSubject.value;\n  }\n\n  get dirty(): boolean {\n    return this.dirtySubject.value;\n  }\n\n  constructor(\n    protected dataType: new () => T,\n    protected filterType: new () => F,\n    options?: SO\n  ) {\n    super(null);\n    this._startByReadyFunction = false; // Need setValue() to be called, to start the service\n    this.setOptions(options);\n  }\n\n  /**\n   * Configures and sets options for the instance.\n   *\n   * @param {SO} options - An object containing configuration options such as `onSort`, `onLoad`, `onSave`, `equals`, `filterFnFactory`, and `sortByReplacement`.\n   * @return {void} This method does not return a value.\n   */\n  setOptions(options: SO) {\n    this._sortFn = options?.onSort ?? this._sortFn ?? this.sort;\n    this._onLoad = options?.onLoad ?? this._onLoad;\n    this._onSaveFn = options?.onSave ?? this._onSaveFn;\n    this._equalsFn = options?.equals ?? this._equalsFn;\n    this._filterFnFactory =\n      options?.filterFnFactory ?? this._filterFnFactory ?? ((f) => {\n        const filter = this.asFilter(f) as F;\n        if (filter instanceof EntityFilter) {\n          return filter.asFilterFn();\n        }\n        return undefined;\n      })\n    this.sortByReplacement = {\n      ...this.sortByReplacement,\n      ...options?.sortByReplacement,\n    };\n\n  }\n\n  protected async ngOnStart(data?: T[]): Promise<T[]> {\n    if (!data) throw new Error('Missing required data, to start this service');\n    if (this.debug) console.debug('[memory-data-service] Starting...');\n    this._hiddenData = [];\n    this.markAsSaved();\n    this.markAsPristine();\n    return data;\n  }\n\n  protected async ngOnStop(): Promise<void> {\n    if (this.debug) console.debug('[memory-data-service] Stopping...');\n    this._hiddenData = null;\n    this.markAsSaved();\n    this.markAsPristine();\n  }\n\n  ngOnDestroy() {\n    this.stop();\n  }\n\n  setValue(data: T[]) {\n    // If service already started\n    if (this.started) {\n      // Update the data, if changed\n      if (this.dataSubject.value !== data) {\n        this._hiddenData = [];\n        this.dataSubject.next(data);\n      }\n\n      // Reset dirty and saving state\n      // (Fix ObsBio issue on samples table : still dirty after setting the same value again)\n      this.markAsSaved();\n      this.markAsPristine();\n    }\n    // If service not started yet, then start it, using given data\n    else {\n      this.start(data);\n    }\n  }\n\n  async loadAll(\n    offset: number,\n    size: number,\n    sortBy?: string,\n    sortDirection?: SortDirection,\n    filter?: F,\n    opts?: EntitiesServiceLoadOptions & { updateHiddenData?: boolean }\n  ): Promise<LoadResult<T>> {\n    offset = offset >= 0 ? offset : 0;\n    size = size >= 0 ? size : -1;\n\n    const originalData = this.dataSubject.value;\n    if (isNil(originalData)) {\n      console.warn('[memory-data-service] Cannot load all: no value set. Will return empty result');\n    }\n\n    try {\n      // Wait service is ready\n      await this.ready();\n\n      // Wait while busy (e.g. when saving, or deleting)\n      await this.waitIdle({ stopError: false /*avoid error when stopped*/ });\n    } catch (err) {\n      // Should be a stop error: log and continue\n      if (!this.stopped) console.error('Unexpected error, while waiting :', err);\n    }\n\n    // Make sure service is not stopped\n    if (this.stopped) return undefined;\n\n    const excludedDataByFilter: T[] = [];\n    let excludedDataByPagination: T[];\n\n    try {\n      if (isEmptyArray(originalData)) {\n        return { data: [], total: 0 };\n      }\n\n      // Apply sort\n      let data = this._sortFn(originalData, sortBy, sortDirection);\n\n      if (this._onLoad) {\n        data = await this._onLoad(data);\n      }\n\n      // Apply filter (will update hiddenData)\n      data = this.filter(data, filter, excludedDataByFilter);\n\n      // Compute the total length\n      const total = data.length;\n\n      // If page size=0 (e.g. only need total)\n      if (size === 0) {\n        excludedDataByPagination = data;\n        return { data: [], total };\n      }\n\n      // Slice in a page (using offset and size)\n      if (offset > 0) {\n        // Offset after the end: no result\n        if (offset >= data.length) {\n          excludedDataByPagination = data;\n          data = [];\n        } else {\n          excludedDataByPagination =\n            size > 0 && offset + size < data.length\n              ? // Slice using limit to size\n                data.slice(0, offset).concat(data.slice(offset + size))\n              : // Slice without limit\n                data.slice(0, offset);\n\n          data =\n            size > 0 && offset + size < data.length\n              ? // Slice using limit to size\n                data.slice(offset, offset + size)\n              : // Slice without limit\n                data.slice(offset);\n        }\n      }\n\n      // Apply a limit\n      else if (size > 0) {\n        excludedDataByPagination = data.slice(size);\n        data = data.slice(0, size);\n      }\n\n      // No limit:\n      else if (size === -1) {\n        // Keep all data\n      }\n\n      // /!\\ If already observed, then always create a copy of the original array\n      // Because datasource will only update if the array changed\n      if (data === originalData) {\n        data = data.slice();\n      }\n\n      const res: LoadResult<T> = { data, total };\n\n      const nextOffset = size > 0 ? (offset || 0) + size : total;\n      if (nextOffset < total) {\n        res.fetchMore = async () => {\n          const res = await this.loadAll(nextOffset, size, sortBy, sortDirection, filter, { ...opts, updateHiddenData: false });\n          // Update hidden data (remove new fetched item)\n          if (res.data?.length) {\n            this._hiddenData = this._hiddenData?.filter((item) => !res.data.includes(item));\n          }\n          return res;\n        };\n      }\n\n      return res;\n    } finally {\n      // Remember hidden data\n      if (opts?.updateHiddenData !== false) {\n        this._hiddenData = !excludedDataByPagination ? excludedDataByFilter : excludedDataByFilter.concat(...excludedDataByPagination);\n      }\n    }\n  }\n\n  watchAll(offset: number, size: number, sortBy?: string, sortDirection?: SortDirection, filterData?: F, options?: any): Observable<LoadResult<T>> {\n    offset = offset >= 0 ? offset : 0;\n    size = size >= 0 ? size : -1;\n\n    return this.dataSubject.pipe(\n      // Warn if waiting value to be set\n      tap((data) => this.debug && !data && console.debug('[memory-data-service] Waiting value to be set...')),\n      filter(isNotNil),\n      mergeMap((_) => this.loadAll(offset, size, sortBy, sortDirection, filterData, options)),\n      filter(isNotNil), // Skip no result (e.g. when stopped)\n      takeUntil(this.stopSubject)\n    );\n  }\n\n  async saveAll(data: T[], options?: any): Promise<T[]> {\n    if (!this.dataSubject.value) throw new Error('[memory-service] Could not save, because value not set');\n\n    this.markAsSaving();\n\n    try {\n      // Restore hidden data\n      if (isNotEmptyArray(this._hiddenData)) data = data.concat(...this._hiddenData);\n\n      if (this._onSaveFn) {\n        const res = this._onSaveFn(data);\n        data = res instanceof Promise ? await res : res;\n      }\n\n      this.dataSubject.next(data);\n      this.markAsDirty();\n      return data;\n    } finally {\n      this.markAsSaved();\n    }\n  }\n\n  async deleteAll(dataToRemove: T[], options?: any): Promise<any> {\n    let data = this.dataSubject.value;\n    if (!data) throw new Error('[memory-service] Could not delete, because value not set');\n\n    this.markAsSaving();\n\n    try {\n      // Remove deleted item, from data\n      const updatedData = data.filter((entity) => {\n        const removed = dataToRemove.findIndex((entityToRemove) => this.equals(entityToRemove, entity)) !== -1;\n        return !removed;\n      });\n      const deleteCount = data.length - updatedData.length;\n      if (deleteCount > 0) {\n        data = updatedData;\n        this.dataSubject.next(data);\n        this.markAsDirty();\n      }\n    } finally {\n      this.markAsSaved();\n    }\n  }\n\n  sort(data: T[], sortBy?: string, sortDirection?: SortDirection): T[] {\n    // Make sure to fill sortBy BEFORE checking in the replacement map\n    sortBy = sortBy || 'id';\n    // Replace sortBy, using the replacement map\n    sortBy = this.sortByReplacement[sortBy] || sortBy;\n\n    // Execute the sort\n    return EntityUtils.sort(data, sortBy, sortDirection);\n  }\n\n  asFilter(source: Partial<F>): F {\n    return EntityFilterUtils.fromObject(source, this.filterType);\n  }\n\n  addSortByReplacement(source: string, target: string) {\n    this.sortByReplacement[source] = target;\n  }\n\n  equals(d1: T, d2: T): boolean {\n    if (this._equalsFn) return this._equalsFn(d1, d2);\n    return d1 && d1.equals ? d1.equals(d2) : EntityUtils.equals(d1, d2, 'id');\n  }\n\n  /**\n   * Count data stored by the service (without hidden data).\n   *\n   * @param opts\n   */\n  // get visibleCount(): number {\n  //   return (this.dataSubject.value?.length || 0);\n  // }\n\n  /**\n   * Count data stored by the service (without hidden data).\n   *\n   * @deprecated Please use visibleCount - Will be removed in a future version\n   */\n  get count(): number {\n    return this.visibleCount;\n  }\n\n  get totalCount(): number {\n    return this.visibleCount + this.hiddenCount;\n  }\n\n  get visibleCount(): number {\n    return this.dataSubject.value?.length ?? 0;\n  }\n\n  get hiddenCount(): number {\n    return this._hiddenData?.length ?? 0;\n  }\n\n  async waitIdle(opts?: WaitForOptions) {\n    await this.waitWhileSaving(opts);\n  }\n\n  markAsDirty() {\n    if (!this.dirtySubject.value) {\n      this.dirtySubject.next(true);\n    }\n  }\n\n  markAsPristine() {\n    if (this.dirtySubject.value) {\n      this.dirtySubject.next(false);\n    }\n  }\n\n  /* -- protected methods -- */\n\n  protected filter(data: T[], _filter: F, hiddenData: T[]): T[] {\n    // if filter is DataFilter instance, use its test function\n    const filterFn = this._filterFnFactory && this._filterFnFactory(_filter);\n    if (filterFn) {\n      return data.reduce((res, value) => {\n        if (filterFn(value)) {\n          return res.concat(value);\n        }\n        hiddenData.push(value);\n        return res;\n      }, []);\n    }\n\n    // default, no filter\n    return data;\n  }\n\n  protected connect(): Observable<LoadResult<T>> {\n    return this.dataSubject.pipe(\n      map((data) => {\n        data = data || [];\n        const total = data.length;\n        return { data, total };\n      })\n    );\n  }\n\n  protected async waitWhileSaving(opts?: WaitForOptions): Promise<void> {\n    if (this.saving) {\n      return firstFalsePromise(this.savingSubject, {\n        stop: opts?.stop || merge(this.stopSubject, this.dataSubject), // Stop if destroyed or new data Received\n        stopError: false, // Avoid error when stopped\n        ...opts,\n      });\n    }\n  }\n\n  protected markAsSaving() {\n    if (!this.savingSubject.value) {\n      this.savingSubject.next(true);\n    }\n  }\n\n  protected markAsSaved() {\n    if (this.savingSubject.value) {\n      this.savingSubject.next(false);\n    }\n  }\n}\n","import { BehaviorSubject, defer, Observable } from 'rxjs';\nimport { isNil, isNotNil, toNumber } from '../functions';\nimport { LoadResult, LoadResultByPageFn } from './entity-service.class';\n\nexport type CallableWithProgressionFn<O extends CallableWithProgressionOptions> = (opts?: O) => Promise<any>;\nexport interface CallableWithProgressionOptions {\n  maxProgression?: number;\n  progression?: BehaviorSubject<number>;\n  [key: string]: any;\n}\n\n// @dynamic\nexport class JobUtils {\n  static defers<O extends CallableWithProgressionOptions>(runnableList: CallableWithProgressionFn<O>[], opts?: O): Observable<number>[] {\n    return runnableList.map((runnable) => JobUtils.defer(runnable, opts));\n  }\n\n  static defer<O extends CallableWithProgressionOptions>(runnable: CallableWithProgressionFn<O>, opts?: O): Observable<number> {\n    return defer<Observable<number>>(() => JobUtils.run(runnable, opts));\n  }\n\n  static run<O extends CallableWithProgressionOptions>(runnable: CallableWithProgressionFn<O>, opts: O): Observable<number> {\n    const progression = new BehaviorSubject<number>(0);\n    runnable({ ...opts, progression })\n      .then(() => {\n        if (opts?.maxProgression) progression.next(opts.maxProgression);\n        progression.complete();\n      })\n      .catch((err) => progression.error(err));\n    return progression;\n  }\n\n  static async fetchAllPages<T>(\n    loadPageFn: LoadResultByPageFn<T>,\n    opts?: {\n      progression?: BehaviorSubject<number>;\n      maxProgression?: number;\n      onPageLoaded?: (pageResult: LoadResult<T>) => any;\n      logPrefix?: string;\n      fetchSize?: number;\n    }\n  ): Promise<LoadResult<T>> {\n    const maxProgression = toNumber(opts?.maxProgression, 100);\n    const progression = opts?.progression;\n    let total;\n    let pageCount;\n    let progressionStep;\n    let currentPageDataCount: number;\n    const fetchSize = toNumber(opts?.fetchSize, 1000);\n    if (fetchSize <= 0) throw new Error('Unable to fetch pages: invalid fetchSize: ' + fetchSize);\n    let offset = 0;\n    let data: T[] = [];\n    do {\n      if (opts && opts.logPrefix) console.debug(`${opts.logPrefix} Fetching page #${offset / fetchSize}...`);\n\n      // Fetch a page\n      const res = await loadPageFn(offset, fetchSize);\n\n      // Concat to previous result\n      data = data.concat(res.data);\n\n      // Compute variables, for next loop\n      currentPageDataCount = (res.data && res.data.length) || 0;\n      offset += currentPageDataCount;\n\n      // Set total count (only once)\n      if (isNil(total) && isNotNil(res.total)) {\n        total = res.total;\n        // Compute the number of page\n        pageCount = Math.round(res.total / fetchSize + 0.5); // Round to HALF_UP integer\n        // Compute step, by dividing maxProgression by number of page\n        if (progression) {\n          progressionStep = maxProgression / pageCount;\n          // DEBUG\n          if (opts && opts.logPrefix)\n            console.debug(\n              `${opts.logPrefix} {pageCount: ${pageCount}, progress: ${progression.value?.toFixed(2)}, pageProgressStep: ${progressionStep?.toFixed(1)}}`\n            );\n        }\n      }\n\n      // Increment progression on each iteration (if possible)\n      if (isNotNil(progressionStep)) {\n        progression.next(progression.value + progressionStep);\n      }\n\n      if (opts?.onPageLoaded) opts.onPageLoaded(res);\n    } while (currentPageDataCount > 0 && ((isNil(total) && currentPageDataCount === fetchSize) || (isNotNil(total) && offset < total)));\n\n    // Complete progression to reach progressionStep value (because of round)\n    if (isNotNil(progressionStep)) {\n      // If total return by loadAll was bad !\n      if (isNotNil(total) && data.length < total) {\n        console.warn(`A function loadAll() returned a bad total (less than all page's data)! Expected ${total} but fetch ${data.length}`);\n        total = data.length;\n        pageCount = Math.round(data.length / fetchSize + 0.5);\n      }\n\n      // Compute final increment, using the real page count\n      progressionStep = Math.max(0, maxProgression - progressionStep * pageCount);\n    }\n\n    // Or increment once (e.g. when total is not known, in received LoadResult)\n    else if (progression) {\n      progressionStep = maxProgression;\n    }\n\n    // DEBUG\n    if (opts && opts.logPrefix)\n      console.debug(\n        `${opts.logPrefix} All pages fetched - {progress: ${progression.value?.toFixed(2)}, lastProgressStep: ${progressionStep?.toFixed(1)}`\n      );\n\n    // Final increment\n    if (progression && progressionStep > 0) {\n      progression.next(progression.value + progressionStep);\n    }\n\n    return {\n      data,\n      total,\n    };\n  }\n}\n","// Converts an ArrayBuffer directly to base64, without any intermediate 'convert to string then\n// use window.btoa' step. According to my tests, this appears to be a faster approach:\n// http://jsperf.com/encoding-xhr-image-data/5\n\n/*\nMIT LICENSE\nCopyright 2011 Jon Leighton\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n/**\n * Converts an ArrayBuffer into a Base64 encoded string.\n *\n * @param {ArrayBuffer} arrayBuffer - The buffer to be converted into a Base64 string.\n * @return {string} The Base64 encoded string representation of the provided ArrayBuffer.\n */\nexport function base64ArrayBuffer(arrayBuffer) {\n  let base64 = '';\n  const encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n  const bytes = new Uint8Array(arrayBuffer);\n  const byteLength = bytes.byteLength;\n  const byteRemainder = byteLength % 3;\n  const mainLength = byteLength - byteRemainder;\n\n  let a;\n  let b;\n  let c;\n  let d;\n  let chunk;\n\n  // Main loop deals with bytes in chunks of 3\n  for (let i = 0; i < mainLength; i += 3) {\n    // Combine the three bytes into a single integer\n    chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\n\n    // Use bitmasks to extract 6-bit segments from the triplet\n    a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18\n    b = (chunk & 258048) >> 12; // 258048   = (2^6 - 1) << 12\n    c = (chunk & 4032) >> 6; // 4032     = (2^6 - 1) << 6\n    d = chunk & 63; // 63       = 2^6 - 1\n\n    // Convert the raw binary segments to the appropriate ASCII encoding\n    base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];\n  }\n\n  // Deal with the remaining bytes and padding\n  if (byteRemainder === 1) {\n    chunk = bytes[mainLength];\n\n    a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2\n\n    // Set the 4 least significant bits to zero\n    b = (chunk & 3) << 4; // 3   = 2^2 - 1\n\n    base64 += `${encodings[a]}${encodings[b]}==`;\n  } else if (byteRemainder === 2) {\n    chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];\n\n    a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10\n    b = (chunk & 1008) >> 4; // 1008  = (2^6 - 1) << 4\n\n    // Set the 2 least significant bits to zero\n    c = (chunk & 15) << 2; // 15    = 2^4 - 1\n\n    base64 += `${encodings[a]}${encodings[b]}${encodings[c]}=`;\n  }\n\n  return base64;\n}\n","import { Geolocation, Position } from '@capacitor/geolocation';\nimport { PlatformService } from '../../core/services/platform.service';\nimport { Platform } from '@ionic/angular';\nimport { isNil } from '../functions';\n\nexport class IPosition {\n  latitude: number;\n  longitude: number;\n}\n\nexport abstract class GeolocationUtils {\n  static isNotNilAndValid(position: IPosition, opts?: { debug?: boolean }) {\n    if (!position || isNil(position.latitude) || isNil(position.longitude)) return false;\n\n    // Invalid lat/lon\n    if (position.latitude < -90 || position.latitude > 90 || position.longitude < -180 || position.longitude > 180) {\n      // /!\\ Log in console, because should never occur\n      if (opts?.debug) console.warn('Invalid lat/long position:  ', position);\n      return false;\n    }\n\n    // OK: valid\n    return true;\n  }\n\n  static isNilOrInvalid(position: IPosition, opts?: { debug?: boolean }) {\n    return !GeolocationUtils.isNotNilAndValid(position, opts);\n  }\n\n  /**\n   * @deprecated Use computeDistanceInNauticalMiles instead\n   * @param position1\n   * @param position2\n   */\n  static computeDistanceInMiles(position1: IPosition, position2: IPosition): number {\n    return GeolocationUtils.computeDistanceInNauticalMiles(position1, position2);\n  }\n\n  static computeDistanceInNauticalMiles(position1: IPosition, position2: IPosition): number {\n\n    // Invalid position(s): skip\n    if (GeolocationUtils.isNilOrInvalid(position1, { debug: true }) || GeolocationUtils.isNilOrInvalid(position2, { debug: true })) return;\n\n    const latitude1Rad = (Math.PI * position1.latitude) / 180;\n    const longitude1Rad = (Math.PI * position1.longitude) / 180;\n    const latitude2Rad = (Math.PI * position2.latitude) / 180;\n    const longitude2Rad = (Math.PI * position2.longitude) / 180;\n\n    let distance =\n      2 *\n      6371 *\n      Math.asin(\n        Math.sqrt(\n          Math.pow(Math.sin((latitude1Rad - latitude2Rad) / 2), 2) +\n            Math.cos(latitude1Rad) * Math.cos(latitude2Rad) * Math.pow(Math.sin((longitude2Rad - longitude1Rad) / 2), 2)\n        )\n      );\n    distance = Math.round((distance / 1.852 + Number.EPSILON) * 100) / 100;\n    return distance;\n  }\n\n  /**\n   * Get the position by geo loc sensor\n   */\n  static async getCurrentPosition(platform: PlatformService | Platform, options?: PositionOptions): Promise<IPosition> {\n    // Use Capacitor plugin\n    if (platform.is('capacitor')) {\n      try {\n        console.info(`[geolocation-utils] Get current geo location, using Capacitor...(timeout: ${options?.timeout})`);\n        const pos: Position = await Geolocation.getCurrentPosition(options);\n        return <IPosition>{\n          latitude: pos.coords.latitude,\n          longitude: pos.coords.longitude,\n        };\n      } catch (err) {\n        console.error(`[geolocation-utils] Cannot get current geo location, using Capacitor: ${err?.message || ''}`);\n\n        // Detect some error, to add code\n        // FIXME - Capacitor use hardcoded strings! (see https://github.com/ionic-team/capacitor-plugins)\n        const message = ((err?.message || '') as string).toLowerCase();\n\n        // Permission denied\n        if (message.includes('location permission was denied') || message.includes('location disabled')) {\n          throw { ...err, code: GeolocationPositionError.PERMISSION_DENIED };\n        }\n\n        // Timeout\n        if (message.includes('timeout expired')) {\n          throw { ...err, code: GeolocationPositionError.TIMEOUT };\n        }\n        throw err;\n      }\n    }\n\n    // Or fallback to navigator\n    console.info('[geolocation-utils] Get current geo location, using browser...');\n    return new Promise<IPosition>((resolve, reject) => {\n      navigator.geolocation.getCurrentPosition(\n        (res) => {\n          resolve(<IPosition>{\n            latitude: res.coords.latitude,\n            longitude: res.coords.longitude,\n          });\n        },\n        (err) => {\n          let message = err?.message || err;\n          message = typeof message === 'string' ? message : JSON.stringify(message);\n          console.error('[geolocation-utils] Cannot get current geo location, using browser:' + message);\n          reject(err);\n        },\n        options\n      );\n    });\n  }\n}\n","import { Observable } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport { HttpEventType } from '@angular/common/http';\nimport { FileEvent, FileResponse } from '../upload-file/upload-file.model';\nimport { FilesUtils } from './file.utils';\nimport { getPropertyByPath, isNil, isNotEmptyArray, isNotNil } from '../functions';\nimport { TranslateService } from '@ngx-translate/core';\n\nimport { DisplayFn } from '../types';\n\n//@dynamic\nexport class CsvUtils {\n  static DEFAULT_SEPARATOR = ',';\n  static DEFAULT_ENCODING = 'UTF-8';\n\n  static exportToFile(\n    rows: object[],\n    opts?: {\n      filename?: string;\n      headers?: string[];\n      includedProperties?: string[];\n      excludedProperties?: string[];\n      formatters?: { [key: string]: DisplayFn };\n      separator?: string;\n      encoding?: string;\n      type?: string;\n    }\n  ) {\n    if (!rows || !rows.length) return; // Skip if empty\n\n    // Create text content\n    const separator = opts?.separator || ',';\n    const protectCellRegexp = new RegExp('/(\"|' + separator + '|\\n)/');\n    const includedProperties = opts?.includedProperties || Object.keys(rows[0]);\n    const filteredProperties = isNotEmptyArray(opts?.excludedProperties)\n      ? includedProperties.filter((k) => !opts?.excludedProperties.includes(k))\n      : includedProperties;\n    const headers = opts?.headers || includedProperties;\n    const textContent =\n      // Header row\n      headers.join(separator) +\n      '\\n' +\n      // Data rows\n      rows\n        .map((row) =>\n          filteredProperties\n            .map((k) => {\n              const value = getPropertyByPath(row, k);\n              const cell = isNil(value) ? '' : value;\n              const formatter = opts?.formatters?.[k];\n              let cellStr: string = formatter ? formatter(cell) : cell instanceof Date ? cell.toLocaleString() : cell.toString().replace(/\"/g, '\"\"');\n              if (protectCellRegexp.test(cellStr)) {\n                cellStr = `\"${cellStr}\"`;\n              }\n              return cellStr;\n            })\n            .join(separator)\n        )\n        .join('\\n');\n\n    // Write to file\n    FilesUtils.writeTextToFile(textContent, {\n      type: 'text/csv',\n      filename: 'export.csv',\n      ...opts,\n    });\n  }\n\n  static parseFile(file: File, opts?: { separator?: string; encoding?: string }): Observable<FileEvent<string[][]>> {\n    return FilesUtils.readAsText(file, opts?.encoding).pipe(\n      map((e) => {\n        if (e.type === HttpEventType.UploadProgress) {\n          const loaded = Math.round(e.loaded * 0.8);\n          return { ...e, loaded };\n        } else if (e instanceof FileResponse) {\n          const body = e.body;\n          const data = CsvUtils.parseCSV(body, opts);\n          return new FileResponse<string[][]>({ body: data });\n        }\n      }),\n      filter(isNotNil)\n    );\n  }\n\n  static parseCSV(body: string, opts?: { separator?: string; skipEmptyLine?: boolean }): string[][] {\n    const separator = opts?.separator || ',';\n    const skipEmptyLine = !opts || opts.skipEmptyLine !== false;\n\n    // Protect special characters (quote and /n)\n    body = body\n      .replace('\"\"', '<quote>') // Protect double quote\n      .replace(/(\"[^\\n\"]+)\\n\\r?/gm, '\"$1<br>') // Protect \\n inside a quoted expression\n      .replace(/\\n\\r/gm, '\\n'); // Windows CR\n\n    const headerAndRows = body.split('\\n', 2);\n    const headers = headerAndRows[0].split(separator);\n\n    return body\n      .split('\\n') // split into rows\n      .filter((line) => !skipEmptyLine || line.trim().length > 0) // Skip empty line\n      .map((line) => {\n        const cells = line\n          .split(separator, headers.length) // split into cells\n          .map((cell) => cell.replace(/^\"([^\"]*)\"$/, '$1')) // Clean trailing quotes\n          .map((cell) => cell.replace('<quote>', '\"')) // restore protected quote\n          .map((cell) => cell.replace('<br>', '\\n')); // restore protected br\n        return cells;\n      });\n  }\n\n  static getLocalizedSeparator(translate?: TranslateService, defaultSeparator = CsvUtils.DEFAULT_SEPARATOR): string {\n    const key = 'FILE.CSV.SEPARATOR';\n    const separator = translate?.instant(key);\n    if (separator && separator !== key) return separator;\n    return defaultSeparator;\n  }\n\n  static getLocalizedEncoding(translate: TranslateService, defaultEncoding = CsvUtils.DEFAULT_ENCODING): string {\n    const key = 'FILE.CSV.ENCODING';\n    const encoding = translate?.instant(key);\n    if (encoding && encoding !== key) return encoding;\n    return defaultEncoding;\n  }\n}\n","import { PredefinedColors } from '@ionic/core';\nimport { isNil, isNotNil } from '../functions';\n\nexport type ColorName = PredefinedColors | 'white' | 'red' | 'green' | 'blue';\n\n/**\n * Define here theme colors\n */\nconst rgbArrayMap = {\n  white: [255, 255, 255],\n  primary: [20, 67, 145], // ok\n  secondary: [117, 196, 253], // ok\n  tertiary: [91, 94, 244], // ok\n  danger: [245, 61, 61], // ok\n  light: [244, 245, 248], // ok\n  medium: [152, 154, 162], // ok\n  dark: [34, 36, 40], // ok\n  red: [255, 0, 0],\n  green: [0, 255, 0],\n  blue: [0, 0, 255],\n};\n\n// Fill a map of Color objects\nconst colorsMap: { [key: string]: Color } = {};\n\n/**\n * Useful class for color conversion\n */\n// @dynamic\nexport class Color {\n  // Helper method, to retrieve a color\n  static get(name: ColorName): Color {\n    return colorsMap[name] as Color;\n  }\n\n  static parseRgba(rgba: string): Color | null {\n    if (!rgba || (!rgba.startsWith('rgb(') && !rgba.startsWith('rgba('))) return null;\n\n    // Parse parts\n    const parts = rgba.replace('rgb(', '').replace('rgba(', '').replace(')', '').split(',');\n\n    if (parts.length !== 3 && parts.length !== 4) return null;\n\n    return new Color([+parts[0], +parts[1], +parts[2]], (parts.length === 4 && +parts[3]) || 1, 'custom');\n  }\n\n  static transparent = function () {\n    return new Color([0, 0, 0], 0, 'translucent');\n  };\n\n  constructor(\n    private _rgbArray: number[],\n    private _opacity?: number,\n    private _name: string = 'custom'\n  ) {}\n  get name(): string {\n    return this._name;\n  }\n  get opacity(): number {\n    return isNotNil(this._opacity) ? this._opacity : 1;\n  }\n  get rgb(): number[] {\n    return this._rgbArray;\n  }\n\n  get r(): number {\n    return this._rgbArray[0];\n  }\n\n  get g(): number {\n    return this._rgbArray[1];\n  }\n\n  get b(): number {\n    return this._rgbArray[2];\n  }\n\n  rgba(opacity?: number): string {\n    opacity = isNotNil(opacity) ? opacity : this._opacity;\n    if (isNil(opacity) || opacity < 0 || opacity > 1) {\n      return 'rgb(' + this._rgbArray.join(',') + ')';\n    }\n    return 'rgba(' + this._rgbArray.join(',') + ',' + opacity + ')';\n  }\n}\n\nexport declare interface ColorGradientOptions {\n  startColor?: number[];\n  mainColor?: number[];\n  mainColorIndex?: number;\n  endColor?: number[];\n}\n\nexport declare interface ColorScaleOptions extends ColorGradientOptions {\n  opacity?: number;\n  min?: number;\n  max?: number;\n  upperMax?: boolean;\n}\n\nexport declare interface ColorScaleLegendItem {\n  label: string | number[];\n  color: Color;\n}\n\nexport declare interface ColorScaleLegend {\n  items: ColorScaleLegendItem[];\n}\n\n/**\n * Helper class for colors scale\n */\n// @dynamic\nexport class ColorScale {\n  static custom = (count: number, options?: ColorScaleOptions) => {\n    options = options || {};\n    return new ColorScale(\n      linearColorGradientWithIntermediate(count, {\n        startColor: options.startColor || undefined,\n        mainColor: options.mainColor || undefined,\n        mainColorIndex: isNotNil(options.mainColorIndex) ? options.mainColorIndex : undefined,\n        endColor: options.endColor || undefined,\n      }),\n      options\n    );\n  };\n\n  static default() {\n    return ColorScale.custom(25);\n  }\n\n  /**\n   * Create an array with the given color\n   **/\n  static fix(length?: number, colorName?: ColorName): string[] {\n    const color = Color.get(colorName || 'primary').rgba(0.5);\n    return new Array<string>(length || 25).fill(color);\n  }\n\n  private _min: number;\n  private _max: number;\n  private _rangeSize: number;\n  private _legendItems: ColorScaleLegendItem[];\n\n  get min(): number {\n    return this._min;\n  }\n  get max(): number {\n    return this._max;\n  }\n\n  constructor(colorArray: number[][], options?: ColorScaleOptions) {\n    options = options || {};\n    // reserved last colors for value > max\n    const nbIntervalBeforeUpper = !options.upperMax ? colorArray.length : colorArray.length - 1;\n    this._min = options.min || 0;\n    this._max = options.max || nbIntervalBeforeUpper;\n    this._rangeSize = Math.round((this._max - this._min) / nbIntervalBeforeUpper);\n    this._legendItems = this.computeLegendItems(colorArray);\n  }\n\n  get legend(): ColorScaleLegend {\n    return {\n      items: this._legendItems,\n    };\n  }\n\n  getValueColor(value: number): Color {\n    return this.getLegendForValue(value).color;\n  }\n\n  getLegendForValue(value: number): ColorScaleLegendItem {\n    if (value <= this._min) return this._legendItems[0];\n    if (value >= this._max) return this._legendItems[this._legendItems.length - 1];\n    const index = Math.floor((value * (this._legendItems.length - 1)) / this._max);\n    return this._legendItems[index];\n  }\n\n  getLegendAtIndex(index: number): ColorScaleLegendItem {\n    return this._legendItems[index];\n  }\n\n  protected computeLegendItems(colorArray: number[][]): ColorScaleLegendItem[] {\n    return colorArray.map((color, index) => {\n      const start = index * this._rangeSize;\n      const end = start + this._rangeSize;\n      return {\n        color: new Color(color),\n        label: end < this._max ? `${start.toLocaleString()} - ${end.toLocaleString()}` : ` >= ${start}`,\n      };\n    });\n  }\n}\n\n// Fill colorsMap\nObject.getOwnPropertyNames(rgbArrayMap).forEach((key) => {\n  colorsMap[key] = new Color(rgbArrayMap[key], 1, key);\n});\n\n/**\n * Internal function, that create a colors scale, using iteration\n *\n * @param count\n * @param opacity\n * @param startColor\n * @param startState\n * @returns\n */\nfunction linearColorGradientWithIntermediate(count: number, options?: ColorGradientOptions): number[][] {\n  options = options || {};\n\n  // From [0,1]\n  options.startColor = options.startColor || [255, 255, 190]; // default start = creme\n  options.mainColorIndex = options.mainColorIndex && options.mainColorIndex < count - 1 ? options.mainColorIndex : count - 1;\n  options.endColor = options.endColor || [255, 0, 0]; // default main = red\n\n  if (!options.mainColor) {\n    return linearColorGradient(count, {\n      startColor: options.startColor,\n      endColor: options.endColor,\n    });\n  } else {\n    // Step 1: startColor -> mainColor\n    const result = linearColorGradient(options.mainColorIndex + 1, {\n      startColor: options.startColor,\n      endColor: options.mainColor,\n    });\n\n    // Step 2: mainColor -> endColor\n    if (options.mainColorIndex < count - 1) {\n      return result.concat(\n        linearColorGradient(count - options.mainColorIndex, {\n          startColor: options.mainColor,\n          endColor: options.endColor,\n        })\n      );\n    } else {\n      return result;\n    }\n  }\n}\n\nfunction linearColorGradient(count: number, options?: ColorGradientOptions): any[] {\n  options = options || {};\n\n  // From [0,1]\n  options.startColor = options.startColor || [255, 255, 255]; // default start = white\n  options.endColor = options.endColor || [255, 0, 0]; // default end = red\n\n  const result: number[][] = [];\n  const color = options.startColor.slice(); // copy the start color\n  const delta = [\n    Math.round((options.endColor[0] - options.startColor[0]) / count),\n    Math.round((options.endColor[1] - options.startColor[1]) / count),\n    Math.round((options.endColor[2] - options.startColor[2]) / count),\n  ];\n\n  for (let i = 0; i < count - 1; i++) {\n    for (let j = 0; j < 3; j++) {\n      color[j] += delta[j];\n    }\n    result.push(color.slice());\n  }\n\n  // Force last color = end color\n  result.push(options.endColor.slice());\n\n  // Output as array\n  return result;\n}\n","import { Component, Inject, Input, Optional, ViewChild } from '@angular/core';\nimport { MatExpansionPanel } from '@angular/material/expansion';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\n\n@Component({\n  selector: 'app-debug',\n  templateUrl: './debug.component.html',\n  styleUrls: ['./debug.component.scss']\n})\nexport class DebugComponent {\n  @Input() titlePrefix = 'COMMON.DEBUG.TITLE';\n  @Input() title = '';\n  @Input() enable: boolean = null;\n  @Input() expanded = false;\n\n  @ViewChild('expansionPanel') expansionPanel: MatExpansionPanel;\n\n  constructor(@Inject(ENVIRONMENT) @Optional() environment: Environment) {\n    this.enable = !environment || !environment.production;\n  }\n\n  toggle() {\n    this.expansionPanel.toggle();\n  }\n}\n","<!-- debug -->\n<ion-item tappable (click)=\"toggle()\" lines=\"none\" color=\"secondary50\">\n  <ion-icon slot=\"start\" name=\"bug\"></ion-icon>\n  <ion-label color=\"primary\">{{ titlePrefix | translate }} {{ title }}</ion-label>\n  <mat-icon slot=\"end\">{{ expansionPanel.expanded ? 'expand_less' : 'expand_more' }}</mat-icon>\n</ion-item>\n<mat-expansion-panel #expansionPanel [(expanded)]=\"expanded\">\n  <ion-text color=\"primary100\">\n    <div class=\"ion-margin-start\">\n      <ng-content></ng-content>\n    </div>\n  </ion-text>\n</mat-expansion-panel>\n","import { NgModule } from '@angular/core';\nimport { DebugComponent } from './debug.component';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { MatIcon, MatIconModule } from '@angular/material/icon';\n\n@NgModule({\n  imports: [CommonModule, IonicModule, MatExpansionModule, MatIconModule, TranslateModule.forChild(), MatExpansionModule],\n  declarations: [DebugComponent],\n  exports: [DebugComponent, TranslateModule],\n})\nexport class SharedDebugModule {}\n","import { UriUtils } from '../file/uri.utils';\nimport { UrlUtils } from '../file/url.utils';\n\nexport class MarkdownUtils {\n  static readonly HTML_ENTITIES_MAP: { [entity: string]: string } = {\n    '&#39;': \"'\", // Single quote\n    '&quot;': '\"', // Double quote\n    '&amp;': '&', // Ampersand\n    '&lt;': '<', // Less-than\n    '&gt;': '>', // Greater-than\n    '&nbsp;': ' ', // Non-breaking space\n    // Add more entities here if needed\n  };\n\n  /**\n   * Converts the given text into a valid anchor-compatible format.\n   *\n   * @param {string} text - The input text to be transformed into an anchor.\n   * @return {string} The formatted string suitable for use as an anchor.\n   */\n  static textToAnchor(text: string): string {\n    if (!text) return '';\n    return (\n      text\n        .toLowerCase()\n        .trim()\n        // Replace entities\n        .replace(/&#?[a-z0-9]+;/g, (entity) => this.HTML_ENTITIES_MAP[entity] || '')\n        .replace(/['\"&<>=\\\\()]+/g, '')\n        .replace(/\\s/g, '-')\n        .replace(/^-|-$/g, '-')\n    );\n  }\n\n  /**\n   * Adjusts the given anchor ID by replacing underscores with hyphens and converting to lowercase.\n   *\n   * @param {string} anchorId - The anchor ID string to be fixed.\n   * @return {string} The modified anchor ID with underscores replaced by hyphens and converted to lowercase, or the original anchor ID if it is falsy.\n   */\n  static fixAnchor(anchorId: string): string {\n    if (!anchorId) return anchorId;\n    return anchorId.replace(/_/g, '-').toLowerCase();\n  }\n\n  static isMarkdownFile(url: string) {\n    if (!url) return false;\n    const cleanUrl = UrlUtils.stripFragmentAndQuery(url);\n    const filename = UriUtils.getFilename(cleanUrl);\n    return filename.endsWith('.md');\n  }\n\n  static resolveRelativeUrl(baseUrl: string, relativePath: string, opts?: { absoluteByDefault: boolean }) {\n    if (!baseUrl) throw new Error(\"Argument 'baseUrl' is missing\");\n    if (!relativePath) throw new Error(\"Argument 'relativePath' is missing\");\n    if (!UrlUtils.isRelativeUrl(relativePath)) throw new Error('Should be a relative path');\n\n    // Detect absolute URL\n    if (relativePath.startsWith('/') || (opts?.absoluteByDefault && !relativePath.startsWith('.'))) {\n      baseUrl = this.getRootUrl(baseUrl);\n      relativePath = relativePath.startsWith('/') ? relativePath.substring(1) : relativePath;\n    }\n\n    return UrlUtils.normalizeUrl(UrlUtils.concat(baseUrl, relativePath));\n  }\n\n  static isGitlabUrl(url: string) {\n    if (!url) return false;\n    return url.startsWith('https://gitlab.') || url.includes('/-/raw/') || url.includes('/-/blob/');\n  }\n\n  static fixGitlabUrlToRaw(url: string) {\n    if (!this.isGitlabUrl(url)) return url;\n    return url.replace('/-/blob/', '/-/raw/').replace('/-/tree/', '/-/raw/');\n  }\n\n  static getRootUrl(url: string) {\n    if (this.isGitlabUrl(url)) {\n      console.debug('[markdown] Gitlab URL detected: ' + url);\n      url = url.replace('/-/blob/', '/-/raw/');\n      if (url.includes('/-/raw/')) {\n        const index = url.indexOf('/-/raw/') + '/-/raw/'.length;\n        const rootPath = url.substring(0, index);\n        const branch = url.substring(index).split('/', 2)[0];\n        return rootPath + branch;\n      }\n    }\n    return UrlUtils.getRootUrl(url);\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRoute, Router, UrlTree } from '@angular/router';\nimport { NavController } from '@ionic/angular';\nimport { LocationStrategy } from '@angular/common';\nimport { MarkedRenderer } from 'ngx-markdown';\nimport { UrlUtils } from '../file/url.utils';\nimport { Subject, Subscription } from 'rxjs';\nimport { isNotNilOrBlank } from '../functions';\nimport { MarkdownUtils } from './markdown.utils';\nimport { PlatformService } from '../../core/services/platform.service';\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownService {\n  private route = inject(ActivatedRoute);\n  private router = inject(Router);\n  private platform = inject(PlatformService);\n  private locationStrategy = inject(LocationStrategy);\n  private navController = inject(NavController);\n\n  private baseUrl: string;\n\n  private readonly _defaultRenderer = new MarkedRenderer();\n  private _markedRenderer: MarkedRenderer;\n\n  get renderer(): MarkedRenderer {\n    return this._markedRenderer;\n  }\n\n  set renderer(value: MarkedRenderer) {\n    this.setRenderer(value);\n  }\n\n  onClickMarkdownUrl = new Subject<string>();\n\n  constructor() {\n    this.setRenderer(new MarkedRenderer());\n  }\n\n  setBaseUrl(baseUrl: string) {\n    console.debug('[markdown-service] Base URL: ' + baseUrl);\n    this.baseUrl = baseUrl;\n  }\n\n  resetBaseUrl() {\n    this.setBaseUrl(null);\n  }\n\n  getUrlTree(url: string): UrlTree {\n    url = UrlUtils.normalizeUrl(url);\n    const urlPath = UrlUtils.stripFragmentAndQuery(url) || UrlUtils.stripFragmentAndQuery(this.router.url);\n    const parsedUrl = this.router.parseUrl(url);\n    const fragment = parsedUrl.fragment;\n    const queryParams = parsedUrl.queryParams;\n    return this.router.createUrlTree([urlPath], { relativeTo: this.route, fragment, queryParams });\n  }\n\n  navigate(url: string, replaceUrl = false) {\n    const urlTree = this.getUrlTree(url);\n    this.router.navigated = false;\n    this.navController.navigateForward(urlTree, { replaceUrl });\n  }\n\n  listenClickEvents(nativeElement: HTMLElement): Subscription {\n    console.debug('[markdown-service] Start listening click events...');\n    const subscription = new Subscription();\n    const listener = (event: Event) => this.click(event, nativeElement);\n    const links = nativeElement.querySelectorAll('a');\n    links.forEach((link) => {\n      // DEBUG\n      //console.debug('[markdown-service] Adding click listener to', link);\n      link.addEventListener('click', listener);\n      subscription.add(() => link.removeEventListener('click', listener));\n    });\n\n    // DEBUG\n    subscription.add(() => console.debug('[markdown-service] Stop listening click events'));\n\n    return subscription;\n  }\n\n  /**\n   * Transform a relative URL to its absolute representation according to current router state.\n   * @param url Relative URL path.\n   * @return Absolute URL based on the current route.\n   */\n  normalizeUrl(url: string): string {\n    if (UrlUtils.isExternalUrl(url)) {\n      return url;\n    }\n    if (this.baseUrl && UrlUtils.isRelativeUrl(url)) {\n      return MarkdownUtils.resolveRelativeUrl(this.baseUrl, url);\n    }\n\n    const urlTree = this.getUrlTree(url);\n    const serializedUrl = this.router.serializeUrl(urlTree);\n    return this.locationStrategy.prepareExternalUrl(serializedUrl);\n  }\n\n  scrollToAnchor(containerElement: HTMLElement, anchorId: string) {\n    if (!containerElement || !anchorId) {\n      console.warn(\"Missing 'containerElement' or 'fragment' argument.\");\n      return;\n    }\n\n    console.debug('[markdown-anchor] Scrolling to anchor #' + anchorId);\n\n    // Find the target element with the specified fragment ID\n    let targetElement = containerElement.querySelector(`#${anchorId}`);\n\n    // If not found, retry fix a fixed anchor id. This can occur when ToC has been generated for the maven-markdown-plugin\n    if (!targetElement) {\n      targetElement = containerElement.querySelector(`#${MarkdownUtils.fixAnchor(anchorId)}`);\n    }\n\n    if (targetElement) {\n      // Scroll smoothly to the target element\n      targetElement.scrollIntoView({\n        behavior: 'smooth', // Smooth scrolling behavior\n        block: 'start', // Align the target element to the top of the container\n      });\n    } else {\n      console.warn(`No element found with the ID \"${anchorId}\" inside the container.`);\n    }\n  }\n\n  /* -- protected function -- */\n\n  protected setRenderer(renderer: MarkedRenderer) {\n    console.debug('[markdown-service] Set renderer', renderer);\n    renderer.link = (href, title, text) => this.link(href, title, text);\n    renderer.image = (href, title, text) => this.image(href, title, text);\n    renderer.heading = (text, level, raw) => this.heading(text, level, raw);\n    this._markedRenderer = renderer;\n  }\n\n  protected async click(event: Event, containerElement: HTMLElement): Promise<boolean> {\n    console.debug('[markdown-service] Processing click event...', event);\n\n    if (!(event.target instanceof HTMLAnchorElement) && !(event.target?.['tagName'] === 'A')) {\n      console.warn('[markdown-service] Invalid click event target. Should an anchor <a>', event.target);\n      return;\n    }\n\n    const element = event.target as HTMLAnchorElement;\n\n    let href = element.getAttribute('href');\n    const fragment = UrlUtils.getFragment(href);\n\n    // Fragment\n    if (href?.startsWith('#') && isNotNilOrBlank(fragment)) {\n      event.preventDefault();\n      this.scrollToAnchor(containerElement, fragment);\n      return true;\n    }\n\n    const routerLink = element.getAttribute('routerLink');\n    if (isNotNilOrBlank(routerLink)) {\n      event.preventDefault();\n      return this.navController.navigateForward(routerLink);\n    }\n\n    // Resolve relative URL, if baseUrl has been set\n    if (this.baseUrl && UrlUtils.isRelativeUrl(href)) {\n      if (MarkdownUtils.isMarkdownFile(href) && this.onClickMarkdownUrl.observed) {\n        event.preventDefault();\n        this.onClickMarkdownUrl.next(href);\n        return true;\n      }\n\n      // Resolve URL, then open using the platform\n      href = MarkdownUtils.resolveRelativeUrl(this.baseUrl, href);\n    }\n\n    // Resolve internal URL as an app route\n    if (UrlUtils.isInternalUrl(href)) {\n      const routePath = this.normalizeUrl(href.startsWith('/') ? href : `/${href}`);\n      const urlTree = this.getUrlTree(routePath);\n      event.preventDefault();\n      this.router.navigated = false;\n      // Opening route\n      return this.navController.navigateForward(urlTree);\n    }\n\n    // External URL: open using the platform\n    event.preventDefault();\n    await this.platform.open(href);\n    return true;\n  }\n\n  protected link(href: string | null, title: string | null, text: string): string {\n    // Resolve router links\n    if (UrlUtils.isInternalUrl(href) && !href.startsWith('#') && !this.baseUrl && !MarkdownUtils.isMarkdownFile(href)) {\n      const externalUrl = this.normalizeUrl(href);\n      return `<a href=\"${externalUrl}\" routerLink=\"${href}\" title=\"${title || ''}\">${text}</a>`;\n    }\n    return `<a href=\"${href || ''}\" title=\"${title || ''}\">${text}</a>`;\n  }\n\n  protected image(href: string, title: string | null, text: string): string {\n    let url = href;\n    let fallbackUrl: string;\n    if (UrlUtils.isRelativeUrl(href) && this.baseUrl) {\n      // Resolve relative path\n      url = MarkdownUtils.resolveRelativeUrl(this.baseUrl, href);\n\n      // Compute a fallback URL\n      fallbackUrl = MarkdownUtils.resolveRelativeUrl(this.baseUrl, href, { absoluteByDefault: true });\n      fallbackUrl = fallbackUrl === url ? null : fallbackUrl;\n\n      // DEBUG\n      console.debug(`[markdown-service] Replacing image: ${href} -> ${url}`);\n\n      if (fallbackUrl) {\n        const fallbackHtml = `<img src=\"${fallbackUrl}\" title=\"${title || ''}\" alt=\"${text}\" onerror=\"this.style.display='none';\" />`;\n        return `<img src=\"${url}\" title=\"${title || ''}\" alt=\"${text}\" onerror=\"this.style.display='none';\" />` + fallbackHtml;\n      } else {\n        return this._defaultRenderer.image(url, title, text);\n      }\n    }\n    return this._defaultRenderer.image(url, title, text);\n  }\n\n  protected heading(text: string, level: number, raw: string): string {\n    // If NOT the h1 (document title)\n    const anchor = MarkdownUtils.textToAnchor(text);\n    if (isNotNilOrBlank(anchor)) {\n      const pageBreak = level < 2;\n      console.debug(`[markdown-service] Heading ${level} '${text}' with anchor ${anchor}`);\n      const link = `<a id=\"${anchor}\" class=\"anchor ${pageBreak ? 'page-break' : ''}\" aria-hidden=\"true\" href=\"#${anchor}\"></a>`;\n      return this._defaultRenderer.heading(link + text, level, raw);\n    }\n    return this._defaultRenderer.heading(text, level, raw);\n  }\n}\n","import { Directive, ElementRef, HostListener, OnDestroy } from '@angular/core';\nimport { MarkdownService } from './markdown.service';\nimport { Subscription } from 'rxjs';\n\n@Directive({\n  selector: 'markdown,[markdown]',\n})\nexport class MarkdownDirective implements OnDestroy {\n  private _subscription = new Subscription();\n\n  constructor(\n    private service: MarkdownService,\n    private element: ElementRef<HTMLElement>\n  ) {\n    // DEBUG\n    //console.debug('[markdown] Creating markdown directive');\n  }\n\n  @HostListener('ready')\n  public processAnchors() {\n    // Listening click events\n    this._subscription.add(this.service.listenClickEvents(this.element.nativeElement));\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n}\n","import { ShowToastOptions, Toasts } from '../toast/toasts';\nimport { OverlayEventDetail } from '@ionic/core';\nimport { ToastController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { StorageService } from '../storage/storage.service';\nimport { isNil, isNilOrBlank, isNotNil, isNotNilOrBlank } from '../functions';\nimport { waitForTrue } from '../observables';\nimport { mergeMap, timer } from 'rxjs';\nimport { isChrome } from '../platforms';\n\nexport interface PrintOptions {\n  id?: string | number;\n  title?: string;\n  showToast?: boolean;\n  toastMessage?: string;\n  style?: string;\n}\n\nexport const PRINT_LOADING_STORAGE_KEY_PREFIX = 'print-loading-';\nexport const PRINT_ID_QUERY_PARAM = 'print-id';\n\n@Injectable({ providedIn: 'root' })\nexport class PrintService {\n  private _printId = 0;\n\n  constructor(\n    protected toastController: ToastController,\n    protected translate: TranslateService,\n    protected storage: StorageService,\n    @Inject(DOCUMENT) protected document: Document\n  ) {}\n\n  nextJobId(): number {\n    return ++this._printId;\n  }\n\n  /**\n   * Extracts and returns the job ID from a given URL.\n   *\n   * @param {string} [url] - The URL from which to extract the job ID. If not provided, `window.location.href` will be used.\n   * @return {number | undefined} The extracted job ID as a number, or `undefined` if the job ID is not present or invalid.\n   */\n  getJobId(url?: string): string | undefined {\n    url = url || window.location.href;\n    const matches = url.match(/print-id=(\\d+)/);\n    return matches?.[1] || undefined;\n  }\n\n  /**\n   * Determines whether the provided URL or the current page's URL contains\n   * a specific query parameter, indicating it's a printing-related URL.\n   *\n   * @param {string} [url] - The optional URL to check. If not provided, the current page's URL is used.\n   * @param {string} [queryParam='print-id'] - The query parameter to look for, defaulting to 'print-id'.\n   * @return {boolean} Returns true if the query parameter is found in the URL; otherwise, false.\n   */\n  isPrintingUrl(url?: string, queryParam: string = 'print-id'): boolean {\n    let query: string;\n    if (isNotNilOrBlank(url)) query = new URL(url).search;\n    query = query || window.location.search || '?';\n    return query.indexOf(queryParam) !== -1;\n  }\n\n  async printElement(element: HTMLElement, opts?: PrintOptions): Promise<number | string> {\n    if (!element) throw new Error(\"Missing required 'element' argument\");\n\n    return this.printHTML(element.innerHTML, opts);\n  }\n\n  async printHTML(html: string, opts?: PrintOptions): Promise<number | string> {\n    if (!html) throw new Error(\"Missing required 'html' argument\");\n\n    // Create iframe\n    const iframe = this.createPrintIframeByHtml(html, opts);\n\n    return this.printIframe(iframe, opts);\n  }\n\n  /**\n   * Prints the content of a URL by rendering it in an iframe.\n   *\n   * @param {string} url The URL of the content to print. This parameter is required.\n   * @param {Omit<PrintOptions, 'style'>} [opts] Optional settings for printing, excluding the 'style' option.\n   * @return {Promise<number>} A promise that resolves to the ID of the print job.\n   */\n  async printUrl(url: string, opts?: Omit<PrintOptions, 'style'>): Promise<number | string> {\n    if (isNilOrBlank(url)) throw new Error(\"Missing required 'url' argument\");\n\n    const jobId = opts?.id ?? this.nextJobId();\n\n    // Create iframe\n    const iframe = this.createPrintIframeByUrl(url, { id: jobId });\n\n    // Launch the print job\n    return this.printIframe(iframe, opts);\n  }\n\n  /**\n   * Prints the content of the specified iframe element.\n   *\n   * @param {HTMLIFrameElement} iframe - The iframe element whose content needs to be printed. Must be a valid and loaded iframe element.\n   * @param {PrintOptions} [opts] - Optional parameters for the print operation, which may include options for toast messages and job configuration.\n   * @return {Promise<number>} A promise that resolves to the unique ID of the print job.\n   * @throws Will throw an error if the required 'iframe' argument is missing or invalid.\n   */\n  async printIframe(iframe: HTMLIFrameElement, opts?: PrintOptions): Promise<number | string> {\n    if (!iframe) throw new Error(\"Missing required 'iframe' argument\");\n\n    const jobId = opts?.id ?? this.nextJobId();\n    const toastId = `printing-${jobId}`;\n    const showLoadingToast = opts?.showToast !== false;\n    if (showLoadingToast)\n      await this.showToast({\n        id: toastId,\n        message: opts?.toastMessage || 'COMMON.PLEASE_WAIT',\n        duration: 0,\n      });\n\n    try {\n      // Wait end of iframe load\n      await this.waitIdle(iframe, { id: jobId });\n\n      // Print (and wait end of print)\n      await this.print(iframe);\n\n      return jobId;\n    } catch (err) {\n      console.error('[print-service] Failed to create hidden iframe', err);\n    } finally {\n      iframe.remove();\n      if (showLoadingToast) await this.toastController.dismiss(null, null, toastId);\n    }\n  }\n\n  async markAsLoading(id: string | number) {\n    console.debug(`[print-service] Mark print job #${id} as loading`);\n    await this.storage.set(PRINT_LOADING_STORAGE_KEY_PREFIX + id, '1');\n  }\n\n  async markAsLoaded(id: string | number) {\n    console.debug(`[print-service] Mark print job #${id} as loaded`);\n    await this.storage.remove(PRINT_LOADING_STORAGE_KEY_PREFIX + id);\n  }\n\n  async isLoaded(id: string | number): Promise<boolean> {\n    const result = await this.storage.get(PRINT_LOADING_STORAGE_KEY_PREFIX + id);\n    return isNil(result);\n  }\n\n  async isLoading(id: string | number): Promise<boolean> {\n    return !(await this.isLoaded(id));\n  }\n\n  /* -- protected functions -- */\n\n  protected createPrintIframeByUrl(url: string, opts?: { id?: number | string }): HTMLIFrameElement {\n    // Make sure to add the job id inside the URL (e.g. to allow getJobIdFromUrl() to retrieve it)\n    if (isNotNil(opts?.id)) {\n      const newUrl = new URL(url);\n      newUrl.searchParams.set(PRINT_ID_QUERY_PARAM, '' + opts.id);\n      url = newUrl.href;\n    }\n\n    // Create a iframe with the given url\n    const iframe = this.document.createElement('iframe');\n    iframe.classList.add('cdk-visually-hidden');\n    iframe.style.width = '100%';\n    iframe.style.height = '100%';\n    this.document.body.appendChild(iframe);\n    iframe.src = url;\n    return iframe;\n  }\n\n  protected createPrintIframeByHtml(html: string, opts?: { title?: string; inlineStyle?: string }): HTMLIFrameElement {\n    if (!html) throw new Error(\"Missing required 'html' argument\");\n\n    const lang = this.document.documentElement?.lang || 'en';\n\n    // Create an empty iframe\n    const iframe = this.document.createElement('iframe');\n    iframe.classList.add('cdk-visually-hidden');\n    iframe.style.width = '100%';\n    iframe.style.height = '100%';\n    this.document.body.appendChild(iframe);\n\n    // Write iframe content\n    const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;\n    if (iframeDocument) {\n      iframeDocument.open();\n      iframeDocument.write(`\n        <!DOCTYPE html>\n        <html lang=\"${lang}\" class=\"print-pdf\">\n          <head>\n            <title>${opts?.title || ''}</title>\n            <style>\n            @media print {\n              body {\n                font-family: 'Roboto', Helvetica, Arial, sans-serif;\n                margin: 0;\n                padding: 0;\n                overflow: hidden;\n              }\n              img {\n                max-width: 100%;\n                height: auto;\n                page-break-inside: avoid;\n              }\n            }\n            ${opts?.inlineStyle || ''}\n          </style>\n          </head>\n          <body>\n            ${html}\n          </body>\n        </html>\n      `);\n      iframeDocument.close();\n    }\n\n    // Set iframe style\n    // FIXME - Ignore style injection, because it failed in Firefox (e.g. on user manual) and Chrome (e.g. in privacy policy)\n    //         Nothing appear in the print dialog\n    //this.applyDocumentStyleToIframe(iframe);\n\n    return iframe;\n  }\n\n  /**\n   * Applies the styles from the provided document, including external stylesheets and inline styles,\n   * to the specified iframe's document.\n   *\n   * @param {HTMLIFrameElement} iframe - The iframe to which the styles are applied.\n   * @return {void} Does not return a value.\n   */\n  protected applyDocumentStyleToIframe(iframe: HTMLIFrameElement): void {\n    const iframeDocument = iframe.contentDocument || iframe.contentWindow?.document;\n    if (iframeDocument) {\n      // Récupérer tous les styles (liens CSS)\n      const links = Array.from(this.document.querySelectorAll('style,link[rel=\"stylesheet\"]'));\n      links.forEach((element) => {\n        // Insert inline style\n        if (element.tagName === 'STYLE') {\n          const newStyle = iframeDocument.createElement('style');\n          newStyle.innerHTML = element.innerHTML;\n          iframeDocument.head.appendChild(newStyle);\n\n          console.debug('[print-service] Add style to iframe', newStyle);\n        }\n\n        // Insert link to stylesheet file\n        else if (element.tagName === 'LINK' && element.getAttribute('href')) {\n          const newLink = iframeDocument.createElement('link');\n          newLink.rel = 'stylesheet';\n          newLink.href = element.getAttribute('href');\n          iframeDocument.head.appendChild(newLink);\n\n          console.debug('[print-service] Add stylesheet to iframe: ', newLink.href);\n        }\n      });\n    }\n  }\n\n  protected async waitIdle(iframe: HTMLIFrameElement, opts?: { id?: number | string; timeout?: number }): Promise<void> {\n    // Wait job finished\n    const printId = opts?.id ?? this._printId;\n    await waitForTrue(timer(500, 500).pipe(mergeMap(() => this.isLoaded(printId))), { timeout: opts?.timeout });\n\n    // Wait end of iframe load\n    await new Promise<void>((resolve, reject) => {\n      const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;\n      if (iframeWindow.document.readyState === 'complete') {\n        resolve();\n      } else {\n        // Stop if timeout reached\n        if (opts?.timeout > 0) {\n          setTimeout(() => reject('timeout'), opts.timeout);\n        }\n\n        const readyListener = () => {\n          if (iframeWindow.document.readyState === 'complete') {\n            resolve();\n\n            iframeWindow.document.removeEventListener('readystatechange', readyListener);\n          }\n        };\n        iframeWindow.document.addEventListener('readystatechange', readyListener);\n      }\n    });\n  }\n\n  /**\n   * Triggers the print functionality of the given iframe and resolves or rejects based on the print completion or timeout.\n   *\n   * @param {HTMLIFrameElement} iframe - The iframe element to be printed.\n   * @param {{timeout?: number}} [opts] - An optional configuration object.\n   * @param {number} [opts.timeout] - The maximum time in milliseconds to wait for the print to complete before rejecting the promise.\n   * @return {Promise<void>} A promise that resolves after the print is completed or rejects if a timeout occurs.\n   */\n  protected print(iframe: HTMLIFrameElement, opts?: { timeout?: number }): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const iframeWindow = iframe.contentWindow?.window || iframe.contentWindow;\n\n      // Stop if timeout reached\n      if (opts?.timeout > 0) {\n        setTimeout(() => reject('timeout'), opts.timeout);\n      }\n\n      // On Chrome\n      if (isChrome(window)) {\n        // Wait after print event, to resolve the promise\n        const afterPrintListener = () => {\n          console.debug('[print-service] After print');\n\n          resolve();\n\n          // Remove the listener\n          iframeWindow.removeEventListener('afterprint', afterPrintListener);\n        };\n        iframeWindow.addEventListener('afterprint', afterPrintListener);\n        iframe.contentWindow.window.print();\n      }\n\n      // Otherwise (e.g. Firefox)\n      else {\n        iframe.contentWindow.window.print();\n        resolve();\n      }\n    });\n  }\n\n  private async showToast<T = any>(opts: ShowToastOptions): Promise<OverlayEventDetail<T>> {\n    if (!this.toastController) throw new Error(\"Missing toastController in component's constructor\");\n    return await Toasts.show(this.toastController, this.translate, opts);\n  }\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Inject,\n  inject,\n  Input,\n  OnDestroy,\n  Optional,\n  Output,\n} from '@angular/core';\nimport { LocalSettingsService } from '../../core/services/local-settings.service';\nimport { TranslateService } from '@ngx-translate/core';\nimport { NetworkService } from '../../core/services/network.service';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { slideDownAnimation } from '../material/material.animations';\nimport { MarkdownService } from './markdown.service';\nimport { Subscription } from 'rxjs';\nimport { UrlUtils } from '../file/url.utils';\nimport { isNotEmptyArray, isNotNilOrBlank } from '../functions';\nimport { NavController, ToastController } from '@ionic/angular';\nimport { MarkdownUtils } from './markdown.utils';\nimport { ActivatedRoute } from '@angular/router';\nimport { DOCUMENT } from '@angular/common';\nimport { PrintService } from '../print/print.service';\n\nexport interface AppMarkdownOptions {\n  data?: string;\n  src?: string;\n  showError?: boolean;\n}\n\n@Component({\n  selector: 'app-markdown-content',\n  templateUrl: './markdown.component.html',\n  styleUrls: ['./markdown.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  animations: [slideDownAnimation],\n})\nexport class AppMarkdownContent implements AppMarkdownOptions, OnDestroy {\n  private _printId: number;\n  private _clickSubscription: Subscription;\n\n  protected navController = inject(NavController);\n  protected settings = inject(LocalSettingsService);\n  protected translate = inject(TranslateService);\n  protected network = inject(NetworkService);\n  protected markdownService = inject(MarkdownService);\n  protected toastController = inject(ToastController);\n  protected printService = inject(PrintService);\n\n  protected loading = true;\n  protected error: string = undefined;\n\n  protected baseUrl: string;\n\n  protected _data: string;\n  protected _src: string;\n  protected _fallbackSrc: string;\n  protected _anchor: string;\n\n  protected _navHistory: { src?: string; fallbackSrc?: string; data?: string; anchor?: string }[] = [];\n\n  @Input() set data(value: string) {\n    this.setData(value);\n  }\n  get data() {\n    return this._data;\n  }\n\n  @Input() set src(value: string) {\n    this.setSrc(value);\n  }\n  get src() {\n    return this._src;\n  }\n\n  @Input() set anchor(value: string) {\n    this._anchor = value;\n  }\n  get anchor() {\n    return this._anchor;\n  }\n\n  @Input({ transform: booleanAttribute }) debug: boolean;\n  @Input({ transform: booleanAttribute }) showError = true;\n  @Input({ transform: booleanAttribute }) animated = true;\n  @Input({ transform: booleanAttribute }) enableNavigationHistory = true;\n  @Input({ transform: booleanAttribute }) updateRouteLocation = false;\n\n  @Output() markdownUrlChange = new EventEmitter<string>();\n\n  constructor(\n    protected cd: ChangeDetectorRef,\n    protected element: ElementRef<HTMLElement>,\n    @Inject(DOCUMENT) private _document: Document,\n    @Optional() protected route: ActivatedRoute // Modal editor give 'null'\n  ) {\n    this._printId = this.printService.nextJobId();\n    this.markAsLoading({ emitEvent: false });\n\n    // TODO: for DEV only\n    //this.debug = !environment.production;\n  }\n\n  ngOnDestroy() {\n    this._clickSubscription?.unsubscribe();\n    this.markdownService.resetBaseUrl();\n  }\n\n  goBack(event?: Event) {\n    console.debug('[markdown] Going back');\n    if (isNotEmptyArray(this._navHistory)) {\n      const { src, fallbackSrc, data, anchor } = this._navHistory.pop();\n      if (src) this.setSrc(src, { fallbackSrc, anchor });\n      else this.setData(data);\n    } else {\n      this.navController.back();\n    }\n  }\n\n  get canGoBack() {\n    return isNotEmptyArray(this._navHistory);\n  }\n\n  async print() {\n    if (this.loading) return; // skip\n    console.debug('[markdown] Print...');\n\n    if (!this.element) {\n      console.error('Element to print not found. Please check the HTML template.');\n      return;\n    }\n\n    this.markAsLoading({ emitEvent: false });\n\n    try {\n      // Print\n      await this.printService.printElement(this.element.nativeElement, {\n        id: this._printId,\n\n        // Print as portrait, by default\n        style: `@media print {\n          @page {\n            size: portrait;\n            margin: 1.1cm;\n          }\n          markdown hr {\n            page-break-before: always;\n            border: none;\n            margin: 0;\n            padding: 0;\n          }\n          markdown img {\n            max-width: 100%;\n            height: auto;\n            page-break-inside: avoid;\n          }\n        }`,\n      });\n    } finally {\n      this.markAsLoaded({ emitEvent: false });\n    }\n  }\n\n  markAsLoaded(opts?: { emitEvent?: boolean }) {\n    this.loading = false;\n\n    if (opts?.emitEvent !== false) {\n      this.printService.markAsLoaded(this._printId);\n      this.cd.markForCheck();\n    }\n  }\n\n  markAsLoading(opts?: { emitEvent?: boolean }) {\n    this.loading = true;\n\n    if (opts?.emitEvent !== false) {\n      this.printService.markAsLoading(this._printId);\n\n      this.cd.markForCheck();\n    }\n  }\n\n  setError(error: string | Error) {\n    this.error = error?.['message'] || error || null;\n    this.cd.markForCheck();\n  }\n\n  resetError() {\n    this.error = null;\n    this.cd.markForCheck();\n  }\n\n  /* -- protected functions -- */\n\n  protected setData(value: string, opts?: { anchor?: string; addToNavigationHistory?: boolean }) {\n    const anchor = opts?.anchor || null;\n\n    if (this._data !== value || this._anchor !== anchor) {\n      if (value) {\n        // Save current state to navigation history\n        if (opts?.addToNavigationHistory) {\n          this._navHistory.push({\n            src: this._src,\n            fallbackSrc: this._fallbackSrc,\n            data: this._data,\n            anchor: this._anchor,\n          });\n        }\n\n        this._data = value;\n        this._anchor = anchor;\n\n        // Clear src\n        this._src = null;\n        this._fallbackSrc = null;\n\n        this.resetError();\n        this.markAsLoaded();\n      } else {\n        this._data = null;\n      }\n      this.cd.markForCheck();\n    }\n  }\n\n  protected setSrc(src: string, opts?: { fallbackSrc?: string; anchor?: string; addToNavigationHistory?: boolean }) {\n    // Clean URL (remove fragment and query)\n    const anchor = opts?.anchor || UrlUtils.getFragment(src);\n    src = UrlUtils.stripFragmentAndQuery(src);\n    src = MarkdownUtils.isGitlabUrl(src) ? MarkdownUtils.fixGitlabUrlToRaw(src) : src;\n\n    let fallbackSrc = opts?.fallbackSrc ? UrlUtils.stripFragmentAndQuery(opts.fallbackSrc) : null;\n    fallbackSrc = MarkdownUtils.isGitlabUrl(fallbackSrc) ? MarkdownUtils.fixGitlabUrlToRaw(fallbackSrc) : fallbackSrc;\n\n    if (this._src !== src || this._fallbackSrc !== fallbackSrc || this._anchor !== anchor) {\n      const url = src ? src + (isNotNilOrBlank(anchor) ? `#${anchor}` : '') : null;\n      if (url) console.debug(`[markdown] Loading ${url}...`);\n\n      // Give baseUrl to the service, to be able to resolve relative path - e.g. images)\n      if (src && UrlUtils.isExternalUrl(src)) {\n        this.baseUrl = UrlUtils.getParent(src);\n        this.markdownService.setBaseUrl(this.baseUrl);\n      }\n\n      if (src) {\n        // Save current state to navigation history\n        if (opts?.addToNavigationHistory) {\n          this._navHistory.push({\n            src: this._src,\n            fallbackSrc: this._fallbackSrc,\n            data: this._data,\n            anchor: this._anchor,\n          });\n        }\n\n        this._src = src;\n        this._fallbackSrc = fallbackSrc;\n        this._anchor = anchor;\n\n        // Clear data\n        this._data = null;\n\n        // Reset error\n        this.resetError();\n        this.markAsLoading();\n      } else {\n        this._src = null;\n        this._fallbackSrc = null;\n        this._anchor = null;\n        this.cd.markForCheck();\n      }\n    }\n  }\n\n  protected onReady() {\n    const url = this._src ? this._src + (isNotNilOrBlank(this._anchor) ? `#${this._anchor}` : '') : null;\n\n    if (url) {\n      console.debug(`[markdown] Ready - ${url}`);\n      // Clear fallback (no more need)\n      if (this._fallbackSrc) this._fallbackSrc = null;\n\n      // Emit change\n      this.markdownUrlChange.emit(url);\n    }\n\n    this.startListenClickEvents();\n\n    this.markAsLoaded();\n\n    // Scroll to anchor\n    if (isNotNilOrBlank(this._anchor)) {\n      this.markdownService.scrollToAnchor(this.element.nativeElement, this._anchor);\n    }\n  }\n\n  protected onLoadError(error?: string | Error) {\n    // Translate error\n    if (error instanceof HttpErrorResponse && this.network.offline) {\n      console.error(`[markdown] Error loading markdown URL {${this.src}} (offline: true): `, error);\n      this.setError('NETWORK.INFO.OFFLINE');\n    } else {\n      // Retry with fallback URL\n      if (this._fallbackSrc) {\n        console.debug(`[markdown] Error loading markdown URL {${this.src}} - fallback to URL ${this._fallbackSrc}`);\n        this.setSrc(this._fallbackSrc, { anchor: this._anchor });\n        return;\n      }\n\n      console.error(`[markdown] Error loading markdown URL {${this.src}} (offline: true): `, error);\n      this.setError('ERROR.LOAD_DATA_ERROR');\n    }\n\n    this.markAsLoaded();\n  }\n\n  protected startListenClickEvents() {\n    this._clickSubscription?.unsubscribe();\n    this._clickSubscription = new Subscription();\n\n    // Listen for click link to Markdown URL\n    this._clickSubscription.add(\n      this.markdownService.onClickMarkdownUrl.subscribe((href) => {\n        console.debug('[markdown] Received click event, on a markdown URL', href);\n\n        let fragment = UrlUtils.getFragment(href);\n        let url = UrlUtils.stripFragmentAndQuery(href);\n        let fallbackUrl = null;\n\n        // Resolve relative path\n        if (UrlUtils.isRelativeUrl(href) && this.baseUrl) {\n          // Get absolute url\n          url = MarkdownUtils.resolveRelativeUrl(this.baseUrl, href);\n\n          // Create a fallback url, in relative path was wrong\n          fallbackUrl = MarkdownUtils.resolveRelativeUrl(this.baseUrl, href, { absoluteByDefault: true });\n          fallbackUrl = url === fallbackUrl ? null : fallbackUrl;\n        }\n\n        // Opening the new URL\n        this.setSrc(url, { fallbackSrc: fallbackUrl, anchor: fragment, addToNavigationHistory: this.enableNavigationHistory });\n      })\n    );\n  }\n}\n","<app-debug *ngIf=\"debug\">\n  <ion-grid class=\"ion-no-padding\">\n    <ion-row>\n      <ion-col>\n        loading: {{ loading }}\n        <br />\n        error: {{ error }}\n        <br />\n        <br />\n        baseUrl: {{ baseUrl }}\n        <br />\n        markdownUrl: {{ src }}\n        <br />\n        markdownFragment: {{ _anchor }}\n        <br />\n        markdownContent: {{ data }}\n        <br />\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n</app-debug>\n\n<!-- error -->\n@if (showError && error; as error) {\n  <ion-item lines=\"none\" @slideDownAnimation>\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n} @else {\n  @if (data) {\n    <markdown [data]=\"data\" (ready)=\"onReady()\" emoji></markdown>\n  } @else if (src) {\n    <markdown [src]=\"src\" (error)=\"onLoadError($event)\" (ready)=\"onReady()\" emoji></markdown>\n  }\n}\n\n<!-- loading spinner -->\n@if (loading) {\n  <div class=\"loading-spinner\">\n    <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n    <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n    <ng-container *ngTemplateOutlet=\"loadingParagraph\"></ng-container>\n  </div>\n}\n\n<ng-template #loadingParagraph>\n  <p>\n    <ion-skeleton-text [animated]=\"animated\" style=\"width: 75%; margin-inline-start: 5%\"></ion-skeleton-text>\n    <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n    <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n    <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n    <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n    <ion-skeleton-text [animated]=\"animated\" style=\"width: 80%\"></ion-skeleton-text>\n  </p>\n</ng-template>\n","import { booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector, Input, ViewChild } from '@angular/core';\nimport { ModalController } from '@ionic/angular';\nimport { PlatformService } from '../../core/services/platform.service';\nimport { LocalSettingsService } from '../../core/services/local-settings.service';\nimport { TranslateService } from '@ngx-translate/core';\nimport { NetworkService } from '../../core/services/network.service';\nimport { AppMarkdownContent } from './markdown.component';\n\nexport interface AppMarkdownModalOptions {\n  title?: string;\n  data?: string;\n  src?: string;\n  showError?: boolean;\n  cssClass?: string;\n  canPrint?: boolean;\n  enableNavigationHistory?: boolean;\n\n  debug?: boolean;\n}\n\n@Component({\n  selector: 'app-markdown-modal',\n  templateUrl: './markdown.modal.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppMarkdownModal implements AppMarkdownModalOptions {\n  @Input() title: string;\n  @Input({ transform: booleanAttribute }) showError = true;\n  @Input({ transform: booleanAttribute }) canPrint = false;\n  @Input() data: string;\n  @Input() src: string;\n  @Input({ transform: booleanAttribute }) enableNavigationHistory = true;\n  @Input({ transform: booleanAttribute }) debug: boolean;\n\n  @ViewChild('content') content: AppMarkdownContent;\n\n  static async show(modalCtrl: ModalController, options: AppMarkdownModalOptions) {\n    const modal = await modalCtrl.create({\n      component: AppMarkdownModal,\n      componentProps: options,\n      keyboardClose: true,\n      cssClass: options?.cssClass || 'modal-large',\n    });\n\n    await modal.present();\n\n    return modal.onWillDismiss();\n  }\n\n  constructor(\n    protected injector: Injector,\n    protected viewCtrl: ModalController,\n    protected platform: PlatformService,\n    protected settings: LocalSettingsService,\n    protected translate: TranslateService,\n    protected network: NetworkService,\n    protected cd: ChangeDetectorRef\n  ) {\n    // TODO: for DEV only\n    //this.debug = !environment.production;\n  }\n\n  close(_?: Event) {\n    return this.viewCtrl.dismiss();\n  }\n\n  goBack(event: Event, content: AppMarkdownContent) {\n    if (content?.canGoBack) {\n      content.goBack(event);\n      this.cd.markForCheck();\n    } else {\n      this.close(event);\n    }\n  }\n\n  protected markAsLoaded() {\n    this.content?.markAsLoaded();\n  }\n\n  protected markAsLoading() {\n    this.content?.markAsLoading();\n  }\n\n  protected setError(err: string | Error) {\n    this.content?.setError(err);\n  }\n\n  protected resetError() {\n    this.content?.resetError();\n  }\n}\n","<app-modal-toolbar color=\"light\" [title]=\"title | translate\">\n  @if (content.canGoBack) {\n    <ion-button slot=\"start\" class=\"back-button\" (click)=\"goBack($event, content)\" routerDirection=\"back\">\n      <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n    </ion-button>\n  }\n\n  <ion-buttons slot=\"end\">\n    @if (canPrint) {\n      <ion-button slot=\"end\" (click)=\"content.print()\">\n        <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n      </ion-button>\n    }\n\n    <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n      {{ 'COMMON.BTN_CLOSE' | translate }}\n    </ion-button>\n  </ion-buttons>\n</app-modal-toolbar>\n\n<ion-content class=\"ion-padding\">\n  <app-markdown-content\n    #content\n    [src]=\"src\"\n    [data]=\"data\"\n    [showError]=\"showError\"\n    [debug]=\"debug\"\n    [enableNavigationHistory]=\"enableNavigationHistory\"\n    [updateRouteLocation]=\"false\"\n  ></app-markdown-content>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <ion-toolbar>\n    <ion-row class=\"ion-no-padding\">\n      <ion-col></ion-col>\n      <ion-col size=\"auto\">\n        <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","// function that returns `MarkedOptions` with renderer override\nimport { MarkdownModule, MARKED_OPTIONS, MarkedOptions } from 'ngx-markdown';\nimport { ModuleWithProviders, NgModule, SecurityContext } from '@angular/core';\nimport { MarkdownService } from './markdown.service';\nimport { MarkdownDirective } from './markdown.directive';\nimport { HttpClient } from '@angular/common/http';\nimport { AppMarkdownModal } from './markdown.modal';\nimport { IonicModule } from '@ionic/angular';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { SharedToolbarModule } from '../toolbar/toolbar.module';\nimport { CommonModule } from '@angular/common';\nimport { AppMarkdownContent } from './markdown.component';\nimport { SharedDebugModule } from '../debug/debug.module';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    TranslateModule.forChild(),\n    MarkdownModule.forChild(),\n\n    // App module\n    SharedToolbarModule,\n    SharedDebugModule,\n  ],\n  declarations: [\n    // Component\n    AppMarkdownContent,\n    AppMarkdownModal,\n    // Directive\n    MarkdownDirective,\n  ],\n  exports: [TranslateModule, MarkdownModule, AppMarkdownContent, MarkdownDirective],\n})\nexport class SharedMarkdownModule {\n  static forRoot(): ModuleWithProviders<SharedMarkdownModule> {\n    console.debug('[markdown] Creating module (root)');\n\n    return {\n      ngModule: SharedMarkdownModule,\n      providers: [\n        MarkdownService,\n        MarkdownModule.forRoot({\n          loader: HttpClient, // Allow to load using [src]\n          sanitize: SecurityContext.NONE,\n          markedOptions: {\n            provide: MARKED_OPTIONS,\n            deps: [MarkdownService],\n            useFactory: (markdownService: MarkdownService) => {\n              console.debug('[markdown] Creating marked options');\n              return <MarkedOptions>{\n                renderer: markdownService.renderer,\n                gfm: true,\n                breaks: false,\n                pedantic: false,\n                smartLists: true,\n                smartypants: false,\n              };\n            },\n          },\n        }).providers,\n      ],\n    };\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\n\n@NgModule({ imports: [], providers: [provideHttpClient(withInterceptorsFromDi())] })\nexport class AppGraphQLModule {\n  constructor() {}\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, InjectionToken, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { ModalController } from '@ionic/angular';\nimport { ENVIRONMENT } from '../../../environments/environment.class';\nimport { capitalizeFirstLetter } from '../../shared/functions';\nimport { Department } from '../services/model/department.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ConfigService } from '../services/config.service';\nimport { Configuration } from '../services/model/config.model';\nimport { Observable, Subscription } from 'rxjs';\nimport { CORE_CONFIG_OPTIONS } from '../services/config/core.config';\nimport { NetworkService } from '../services/network.service';\nimport { NodeInfo } from '../services/network.utils';\n\nexport const APP_ABOUT_DEVELOPERS = new InjectionToken<Partial<Department>[]>('aboutDevelopers');\nexport const APP_ABOUT_PARTNERS = new InjectionToken<Partial<Department>[]>('aboutPartners');\n\n@Component({\n  selector: 'app-about-modal',\n  templateUrl: './about.modal.html',\n  styleUrls: ['./about.modal.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AboutModal implements OnInit, OnDestroy {\n  private readonly _subscription = new Subscription();\n\n  protected _logPrefix = '[about] ';\n  protected readonly name: string;\n  protected readonly version: string;\n  protected readonly sourceUrl: string;\n  protected readonly config$: Observable<Configuration>;\n  protected reportIssueUrl: string;\n  protected forumUrl: string;\n  protected helpUrl: string;\n\n  protected showVersionDetails = false;\n  protected nodeInfo: NodeInfo;\n  protected buildDate: string;\n\n  protected get allowVersionDetails() {\n    return !!this.buildDate || !!this.nodeInfo?.softwareVersion;\n  }\n\n  constructor(\n    protected translate: TranslateService,\n    protected modalController: ModalController,\n    protected configService: ConfigService,\n    protected networkService: NetworkService,\n    protected cd: ChangeDetectorRef,\n    @Optional() @Inject(ENVIRONMENT) protected environment,\n    @Optional() @Inject(APP_ABOUT_DEVELOPERS) public developers: Partial<Department>[],\n    @Optional() @Inject(APP_ABOUT_PARTNERS) public partners: Partial<Department>[]\n  ) {\n    this.name = translate.instant('APP_NAME');\n    if (this.name === 'APP_NAME') {\n      // Not translated: use name from the environment\n      this.name = (environment?.name && capitalizeFirstLetter(environment.name)) || undefined;\n    }\n    this.version = environment?.version;\n    this.sourceUrl = environment?.sourceUrl;\n    this.reportIssueUrl = environment?.reportIssueUrl;\n    this.forumUrl = environment?.forumUrl;\n    this.helpUrl = environment?.helpUrl;\n    this.config$ = configService.config;\n    this._subscription.add(this.config$.subscribe((config) => this.setConfig(config)));\n  }\n\n  ngOnInit() {\n    // Load node info\n    this.loadNodeInfo();\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n\n  async close() {\n    await this.modalController.dismiss();\n  }\n\n  /* -- protected functions -- */\n\n  protected setConfig(config?: Configuration) {\n    this.forumUrl = config?.getProperty(CORE_CONFIG_OPTIONS.FORUM_URL) || this.environment?.forumUrl;\n    this.helpUrl = config?.getProperty(CORE_CONFIG_OPTIONS.HELP_URL) || this.environment?.helpUrl;\n    this.reportIssueUrl = config?.getProperty(CORE_CONFIG_OPTIONS.REPORT_ISSUE_URL) || this.environment?.reportIssueUrl;\n    this.buildDate = this.environment?.buildDate;\n  }\n\n  protected async loadNodeInfo() {\n    this.nodeInfo = await this.getNodeInfo();\n    this.cd.markForCheck();\n  }\n\n  protected async getNodeInfo(): Promise<NodeInfo> {\n    if (this.networkService.offline) return null; // Skip if offline\n\n    try {\n      return await this.networkService.getNodeInfo();\n    } catch (error) {\n      console.error(`${this._logPrefix} Error while loading node info`, error);\n      return null;\n    }\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"light\">\n    <ion-title>\n      {{ 'ABOUT.TITLE' | translate }}\n    </ion-title>\n\n    <ion-buttons slot=\"end\">\n      <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n        {{ 'COMMON.BTN_CLOSE' | translate }}\n      </ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <ion-list lines=\"none\">\n    <!-- Peer info -->\n    @if (config$ | async; as config) {\n      <ion-item>\n        <span slot=\"start\">&nbsp;</span>\n        <ion-label class=\"ion-text-wrap\">\n          <h2>\n            <b>{{ config.label | capitalize }}</b>\n            @if (config.name) {\n              -\n              <span [innerHTML]=\"config.name\"></span>\n            }\n          </h2>\n\n          @if (config.description) {\n            <p>\n              <markdown [data]=\"config.description\" emoji></markdown>\n            </p>\n          }\n        </ion-label>\n      </ion-item>\n    }\n\n    <!-- Version info -->\n    <ion-item>\n      <span slot=\"start\">&nbsp;</span>\n      <ion-label class=\"ion-text-wrap\">\n        <h2>\n          @if (name) {\n            <small>{{ 'ABOUT.POWERED_BY' | translate }}</small>\n            {{ name }}\n          }\n          @if (version) {\n            <span [innerHTML]=\"'ABOUT.VERSION' | translate: { version: version }\"></span>\n          }\n          @if(allowVersionDetails) {\n            &nbsp;\n            <small>\n              <a (click)=\"showVersionDetails=!showVersionDetails\" tappable>\n                {{'COMMON.BTN_SHOW_MORE' | translate}}\n                <ion-icon [name]=\"!showVersionDetails ? 'chevron-down' : 'chevron-up'\"></ion-icon>\n              </a>\n            </small>\n          }\n        </h2>\n\n        <!-- version details -->\n        @if (showVersionDetails) {\n          <p class=\"version-details\">\n            <!-- App version -->\n            @if (buildDate) {\n              <small>\n                <ion-icon name=\"logo-angular\"></ion-icon>\n                <span [innerHTML]=\"'ABOUT.APP_VERSION' | translate: { version: version }\"></span>\n                &nbsp;\n                <ion-icon name=\"time-outline\"></ion-icon>\n                {{ buildDate | dateFormat: { time: true, seconds: false } }}\n              </small>\n              <br/>\n            }\n            <!-- Pod version -->\n            @if (nodeInfo?.softwareVersion && nodeInfo.buildDate) {\n                <small>\n                  <ion-icon name=\"server\"></ion-icon>\n                  <span [innerHTML]=\"'ABOUT.POD_VERSION' | translate: { version: nodeInfo.softwareVersion }\"></span>\n                  &nbsp;\n                  <ion-icon name=\"time-outline\"></ion-icon>\n                  {{ nodeInfo.buildDate | dateFormat: { time: true, seconds: false } }}\n                </small>\n            }\n          </p>\n        }\n\n        <!-- license-->\n        <p [innerHTML]=\"'ABOUT.LICENSE' | translate\"></p>\n      </ion-label>\n    </ion-item>\n\n    <!-- Help -->\n    <ion-item *ngIf=\"forumUrl || helpUrl\">\n      <mat-icon slot=\"start\">help_outline</mat-icon>\n      <ion-label>\n        <p>\n          {{ 'ABOUT.HELP' | translate }}\n        </p>\n        <p>\n          <ion-button fill=\"solid\" color=\"accent\" href=\"{{ helpUrl }}\" target=\"help\" size=\"default\">\n            <mat-icon slot=\"start\">description</mat-icon>\n            <ion-text translate>ABOUT.USER_MANUAL</ion-text>\n          </ion-button>\n          <ion-button fill=\"solid\" color=\"secondary\" href=\"{{ forumUrl }}\" target=\"forum\" size=\"default\">\n            <ion-icon slot=\"start\" name=\"chatbubbles\"></ion-icon>\n            <ion-text translate>ABOUT.FORUM</ion-text>\n          </ion-button>\n        </p>\n      </ion-label>\n    </ion-item>\n\n    <!-- Report issue -->\n    <ion-item *ngIf=\"reportIssueUrl\">\n      <ion-icon slot=\"start\" name=\"bug\" color=\"dark\"></ion-icon>\n      <ion-label>\n        <p>\n          {{ 'ABOUT.REPORT_ISSUE' | translate }}\n        </p>\n        <p>\n          <a color=\"primary\" href=\"{{ reportIssueUrl }}\" target=\"_system\" translate>ABOUT.BTN_REPORT_ISSUE</a>\n        </p>\n      </ion-label>\n    </ion-item>\n\n    <!-- Source code -->\n    <ion-item *ngIf=\"sourceUrl\">\n      <ion-icon slot=\"start\" name=\"code\" color=\"dark\"></ion-icon>\n      <ion-label>\n        <p>\n          {{ 'ABOUT.SOURCE_CODE' | translate }}\n        </p>\n        <p>\n          <a color=\"primary\" href=\"{{ sourceUrl }}\" target=\"_system\">{{ sourceUrl }}</a>\n        </p>\n      </ion-label>\n    </ion-item>\n\n    <!-- Developers -->\n    <ion-item *ngIf=\"developers | isNotEmptyArray\">\n      <ion-icon slot=\"start\" name=\"people\" color=\"dark\"></ion-icon>\n      <ion-label>\n        <p>\n          {{ 'ABOUT.DEVELOPED_BY' | translate }}\n        </p>\n        <ion-list lines=\"none\">\n          <ion-item *ngFor=\"let item of developers\" class=\"ion-no-padding\">\n            <ion-label>\n              <p>\n                <a color=\"primary\" href=\"{{ item.siteUrl }}\" target=\"_system\">{{ item.name || item.label }}</a>\n              </p>\n            </ion-label>\n            <ion-img slot=\"end\" [src]=\"item.logo\" />\n          </ion-item>\n        </ion-list>\n      </ion-label>\n    </ion-item>\n\n    <!-- Partners -->\n    <ion-item class=\"item-partners\" *ngIf=\"partners | isNotEmptyArray\">\n      <ion-icon slot=\"start\" name=\"megaphone\" color=\"dark\"></ion-icon>\n      <ion-text>\n        <p>{{ 'ABOUT.PARTNERS' | translate }}</p>\n        <p>\n          <a *ngFor=\"let item of partners\" href=\"{{ item.siteUrl }}\" class=\"partners\" target=\"_system\">\n            <img *ngIf=\"item.logo; else partnerName\" [src]=\"item.logo\" [alt]=\"item.label\" />\n            <ng-template #partnerName>\n              <ion-text>{{ item.label }}</ion-text>\n            </ng-template>\n          </a>\n        </p>\n      </ion-text>\n    </ion-item>\n  </ion-list>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <ion-toolbar>\n    <ion-row class=\"ion-no-padding\" nowrap>\n      <ion-col></ion-col>\n      <ion-col size=\"auto\">\n        <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\">{{ 'COMMON.BTN_CLOSE' | translate }}</ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { UserProfileLabel } from '../services/model/person.model';\nimport { Configuration } from '../services/model/config.model';\nimport { AppColors, IconRef } from '../../shared/types';\nimport { isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean, toInt } from '../../shared/functions';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { MenuPathParam } from './menu.service';\nimport { Account, AccountUtils } from '../services/model/account.model';\nimport { Entity, EntityAsObjectOptions } from '../services/model/entity.model';\nimport { ITreeItemEntity } from '../services/model/tree-item-entity.model';\nimport { EntityClass } from '../services/model/entity.decorators';\nimport { PredefinedColors } from '@ionic/core';\n\nexport interface IMenuItem extends IconRef {\n  id?: number;\n  parent?: IMenuItem;\n  children?: IMenuItem[];\n\n  title: string;\n  tooltip?: string;\n\n  path?: string;\n\n  badge?: string | number;\n  badgeColor?: PredefinedColors;\n  badge$?: Observable<string | number>;\n  badgeColor$?: Observable<PredefinedColors>;\n\n  // Injection point\n  after?: string;\n  before?: string;\n  static?: boolean;\n\n  action?: string | any;\n  profile?: UserProfileLabel;\n  exactProfile?: UserProfileLabel;\n  color?: string | AppColors;\n  cssClass?: string;\n  // A config property, to enable the menu item\n  ifProperty?: string;\n  // A config property, to override the title\n  titleProperty?: string;\n  titleArgs?: { [key: string]: string };\n  pathParams?: { [key: string]: string };\n  parentPath?: string;\n  parentPathParams?: { [key: string]: string };\n  pinned?: boolean;\n}\n\n// @dynamic\n@EntityClass({ typename: 'MenuItemVO' })\nexport class MenuItem extends Entity<MenuItem> implements IMenuItem, ITreeItemEntity<MenuItem> {\n  static fromObject: (source: any, opts?: { withChildren?: boolean }) => MenuItem;\n\n  _badgeSubscription: Subscription;\n  _badgeColorSubscription: Subscription;\n\n  parent: MenuItem;\n  parentId: number;\n  $children = new BehaviorSubject<MenuItem[]>([]);\n  static: boolean;\n\n  $title = new BehaviorSubject<string>(undefined);\n  titleProperty?: string; // A config property, to override the title\n  titleArgs?: { [key: string]: string };\n\n  $badge = new BehaviorSubject<string | number>(undefined);\n  $badgeColor = new BehaviorSubject<PredefinedColors>(undefined);\n\n  tooltip?: string;\n  path?: string;\n  pathParams?: { [key: string]: string };\n  parentPath?: string;\n  parentPathParams?: { [key: string]: string };\n\n  // Injection point\n  after?: string;\n  before?: string;\n\n  action?: string | any;\n  profile?: UserProfileLabel;\n  exactProfile?: UserProfileLabel;\n  color?: string | AppColors;\n  cssClass?: string;\n  // A config property, to enable the menu item\n  ifProperty?: string;\n  pinned?: boolean;\n\n  // Icon\n  icon?: string;\n  matIcon?: string;\n  matSvgIcon?: string;\n\n  fromObject(source: any, opts?: { withChildren?: boolean }) {\n    this.id = source.id;\n\n    this.title = source.title;\n    this.titleProperty = source.titleProperty;\n    this.titleArgs = source.titleArgs;\n\n    if (source.badge$) {\n      this.badge$ = source.badge$;\n    } else {\n      this.badge = source.badge;\n    }\n    if (source.badgeColor$) {\n      this.badgeColor$ = source.badgeColor$;\n    } else {\n      this.badgeColor = source.badgeColor;\n    }\n\n    // Clean path\n    if (source.path) {\n      const { path, params } = MenuItems.parsePathWithQuery(source.path);\n      this.path = path;\n      this.pathParams = { ...source.pathParams, ...params };\n    }\n    // Clean parent path\n    if (source.parentPath) {\n      const { path, params } = MenuItems.parsePathWithQuery(source.parentPath);\n      this.parentPath = path;\n      this.parentPathParams = { ...source.parentPathParams, ...params };\n    }\n\n    this.after = source.after;\n    this.before = source.before;\n\n    this.action = source.action;\n    this.profile = source.profile;\n    this.exactProfile = source.exactProfile;\n    this.color = source.color;\n    this.cssClass = source.cssClass;\n    this.ifProperty = source.ifProperty;\n    this.pinned = toBoolean(source.pinned, false);\n    this.static = isNotNil(source.static) ? source.static : undefined; // If undefined, will be set by service\n\n    // Icon\n    this.icon = source.icon;\n    this.matIcon = source.matIcon;\n    this.matSvgIcon = source.matSvgIcon;\n\n    if (!opts || opts.withChildren === false) {\n      this.children = (source.children || []).map((json: any) => MenuItem.fromObject(json, opts)) || [];\n    }\n  }\n\n  asObject(opts?: { withChildren?: boolean } & EntityAsObjectOptions): any {\n    const target: any = Object.assign({}, this);\n    target.title = this.title;\n\n    if (opts?.keepLocalId === false) {\n      delete target.id;\n    }\n\n    if (opts?.withChildren !== false) {\n      target.children = (this.children || []).map((c) => c.asObject(opts));\n    }\n\n    delete target.$children;\n    delete target.$title;\n    delete target.$badge;\n    delete target.$badgeColor;\n    delete target.parent;\n\n    return target;\n  }\n\n  // addChild(child: MenuItem) {\n  //   this.$children.next(this.$children.value)\n  // }\n\n  get children(): MenuItem[] {\n    return this.$children.value;\n  }\n  set children(value: MenuItem[]) {\n    this.$children.next(value);\n  }\n\n  get title(): string {\n    return this.$title.value;\n  }\n  set title(value: string) {\n    if (this.pinned) {\n      // If loading, keep existing title if pinned (avoid to show skeleton)\n      if (isNotNilOrBlank(value)) this.$title.next(value);\n    } else if (isNotNil(value)) {\n      this.$title.next(value);\n    }\n  }\n\n  get badge(): string | number {\n    return this.$badge.value;\n  }\n  set badge(value: string | number) {\n    if (this.$badge.value !== value) {\n      this.$badge.next(value);\n    }\n  }\n\n  get badge$(): Observable<string | number> {\n    return this.$badge.asObservable();\n  }\n  set badge$(value$: Observable<string | number>) {\n    this._badgeSubscription?.unsubscribe();\n    this._badgeSubscription = value$?.subscribe((value) => {\n      this.badge = value;\n    });\n  }\n  get badgeColor(): PredefinedColors {\n    return this.$badgeColor.value;\n  }\n  set badgeColor(value: PredefinedColors) {\n    if (this.$badgeColor.value !== value) {\n      this.$badgeColor.next(value);\n    }\n  }\n  get badgeColor$(): Observable<PredefinedColors> {\n    return this.$badgeColor.asObservable();\n  }\n  set badgeColor$(value$: Observable<PredefinedColors>) {\n    this._badgeColorSubscription?.unsubscribe();\n    this._badgeColorSubscription = value$?.subscribe((value) => {\n      this.badgeColor = value;\n    });\n  }\n\n  get detached(): boolean {\n    return !this.parentPath || !this.parent;\n  }\n\n  get visible(): boolean {\n    return this.static || !this.detached;\n  }\n\n  get expanded(): boolean {\n    return this.action !== 'expand' || this.matIcon === 'expand_less';\n  }\n\n  get ancestor(): MenuItem {\n    if (!this.parent) return null; // root = not ancestor\n    if (!this.parent.parent) return this; // first sub menu = ancestor\n    return this.parent?.ancestor; // loop\n  }\n\n  get divider(): boolean {\n    return !this.action && !this.path;\n  }\n\n  get pinnable(): boolean {\n    return !this.static && typeof this.action !== 'function';\n  }\n\n  isPinned() {\n    if (this.pinned) return true;\n    return (this.children || []).some((child) => child.isPinned());\n  }\n}\n\nexport class MenuItems {\n  /**\n   * Compare, without checking the children\n   *\n   * @param mainItem\n   * @param otherItem\n   */\n  static isSame(mainItem: IMenuItem, otherItem: IMenuItem) {\n    return this.isSameIdOrPathAndParams(mainItem, otherItem) && mainItem.title === otherItem.title;\n  }\n\n  /**\n   * Compare, without checking the children and the title\n   *\n   * @param mainItem\n   * @param otherItem\n   */\n  static isSameIdOrPathAndParams(mainItem: IMenuItem, otherItem: IMenuItem) {\n    return (isNotNil(mainItem?.id) && mainItem.id === otherItem?.id) || this.isSamePathAndParams(mainItem, otherItem);\n  }\n\n  /**\n   * Compare, without checking the children\n   *\n   * @param mainItem\n   * @param otherItem\n   */\n  static isSamePathAndParams(mainItem: IMenuItem, otherItem: IMenuItem) {\n    return (\n      mainItem &&\n      mainItem.path === otherItem?.path &&\n      mainItem.parentPath === otherItem.parentPath &&\n      this.isSameParams(mainItem.pathParams, otherItem.pathParams)\n    );\n  }\n\n  /**\n   * All key/value of the mainParams should exist (and be equals) in the other params\n   *\n   * @param mainParams\n   * @param otherParams\n   */\n  static isSameParams(mainParams: { [key: string]: string }, otherParams: { [key: string]: string }) {\n    const mainEntries = Object.entries(mainParams);\n    const otherEntries = Object.entries(otherParams);\n    // TODO: est-ce que un item ne pourrait pas avoir plus de params dans l'item existant ?\n    return mainEntries.length === otherEntries.length && mainEntries.every(([key, value]) => value === otherParams[key]);\n  }\n\n  static isParent(child: IMenuItem, parent: IMenuItem | MenuPathParam) {\n    return (\n      (child.parentPath &&\n        child.parentPath === parent?.path &&\n        this.isSameParams(child.parentPathParams, parent['pathParams'] || parent['params'])) ||\n      false\n    );\n  }\n\n  static checkIfVisible(\n    item: IMenuItem,\n    account: Account,\n    config: Configuration,\n    opts?: {\n      isLogin?: boolean;\n      debug?: boolean;\n      logPrefix?: string;\n    }\n  ): boolean {\n    opts = opts || {};\n    if (item.profile) {\n      const hasProfile = AccountUtils.hasMinProfile(account, item.profile);\n      if (!hasProfile) {\n        if (opts.debug)\n          console.debug(\n            `${(opts && opts.logPrefix) || '[menu-service]'} Hide item '${item.title}': need the min profile '${item.profile}' to access path '${item.path}'`\n          );\n        return false;\n      }\n    } else if (item.exactProfile) {\n      const hasExactProfile = AccountUtils.hasExactProfile(account, item.exactProfile);\n      if (!hasExactProfile) {\n        if (opts.debug)\n          console.debug(\n            `${(opts && opts.logPrefix) || '[menu-service]'} Hide item '${item.title}': need exact profile '${item.exactProfile}' to access path '${item.path}'`\n          );\n        return false;\n      }\n    }\n\n    // If enable by config\n    if (item.ifProperty) {\n      //console.debug(\"[menu] Checking if property enable ? \" + item.ifProperty, config && config.properties);\n      const isEnableByConfig = item.ifProperty.startsWith('!')\n        ? config?.properties?.[item.ifProperty.substring(1)] !== 'true'\n        : config?.properties?.[item.ifProperty] === 'true';\n      if (!isEnableByConfig) {\n        if (opts.debug) console.debug(\"[menu-service] Config property '\" + item.ifProperty + \"' not 'true' for \", item.path);\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  static checkIfSubMenuVisible(item: MenuItem, currentPathParam: MenuPathParam) {\n    if (!item.parentPath) return false; // Should have a parent\n\n    if (item.static) return true; // Always keep static items\n\n    if (item.isPinned()) return true; // Always keep pinned items\n\n    // Keep each menu items in the scope of the current url path\n    if (currentPathParam?.path.startsWith(item.path)) return true;\n\n    // Keep if parent is an expanded item\n    if (item.parent?.action === 'expand' && item.parent.expanded) return true;\n\n    // Not visible\n    return false;\n  }\n\n  static parsePathWithQuery(pathWithQuery: string): MenuPathParam {\n    const index = pathWithQuery.lastIndexOf('?');\n    if (index < 0) return { path: pathWithQuery, params: {} };\n    const path = pathWithQuery.substring(0, index);\n    const queryString = pathWithQuery.substring(index);\n    const params = Object.fromEntries(new URLSearchParams(queryString));\n    return { path, params };\n  }\n\n  static getUrl(item: IMenuItem) {\n    return this.getUrlFromPathAndParams(item?.path, item?.pathParams);\n  }\n\n  static getUrlFromPathAndParams(path: string, params?: any) {\n    const queryString = Object.entries(params || {})\n      .map(([key, value]) => `${key}=${value}`)\n      .join('&');\n    if (isNilOrBlank(queryString)) return path || '';\n    return `${path || ''}?${queryString}`;\n  }\n\n  static sortByParamOrIdComparator(paramName?: string): (n1: IMenuItem, n2: IMenuItem) => number {\n    paramName = paramName || 'tab';\n    return (n1: IMenuItem, n2: IMenuItem) => {\n      const d1 = toInt(n1.pathParams?.[paramName], n1.id);\n      const d2 = toInt(n2.pathParams?.[paramName], n2.id);\n      return d1 === d2 ? 0 : d1 > d2 ? 1 : -1;\n    };\n  }\n\n  static sortByTabOrId = this.sortByParamOrIdComparator('tab');\n}\n\n/**\n * Options to configure specific behavior on projects\n */\nexport class MenuOptions {\n  subMenu?: {\n    enable?: boolean;\n    showPinButton?: boolean;\n    disableIcon?: boolean;\n    savePinned?: boolean;\n  };\n}\n","import { EventEmitter, Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { AlertController, ModalController, NavController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, combineLatest, from, merge, Observable, Subject } from 'rxjs';\nimport { distinctUntilChanged, filter, map, switchMap, throttleTime } from 'rxjs/operators';\nimport { ENVIRONMENT, Environment } from '../../../environments/environment.class';\nimport { DateUtils } from '../../shared/dates';\nimport { isEmptyArray, isNil, isNotEmptyArray, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';\nimport { firstNotNilPromise } from '../../shared/observables';\nimport { StartableObservableService } from '../../shared/services/startable-observable-service.class';\nimport { IconRef } from '../../shared/types';\nimport { AboutModal } from '../about/about.modal';\nimport { AccountService } from '../services/account.service';\nimport { ConfigService } from '../services/config.service';\nimport { CORE_CONFIG_OPTIONS } from '../services/config/core.config';\nimport { LocalSettingsService } from '../services/local-settings.service';\nimport { Account } from '../services/model/account.model';\nimport { Configuration } from '../services/model/config.model';\nimport { TreeItemEntityUtils } from '../services/model/tree-item-entity.model';\nimport { IMenuItem, MenuItem, MenuItems, MenuOptions } from './menu.model';\n\nexport type SplitPaneShowWhen = boolean | 'lg';\nexport const DEFAULT_MENU_SHOW_WHEN: SplitPaneShowWhen = 'lg';\nexport const APP_MENU_ITEMS = new InjectionToken<IMenuItem[]>('menuItems');\nexport const APP_MENU_OPTIONS = new InjectionToken<MenuOptions>('menuOptions');\n\nexport interface MenuPathParam {\n  path: string;\n  params: { [key: string]: string };\n}\n\n@Injectable({\n  providedIn: 'root',\n  deps: [ENVIRONMENT],\n})\nexport class MenuService extends StartableObservableService<MenuItem[]> {\n  readonly accountChanges = new BehaviorSubject<Account>(undefined);\n  readonly onPinned = new EventEmitter<MenuItem>(true);\n\n  private _staticItems: MenuItem[];\n  private _detachedSubItems: MenuItem[] = [];\n  private _itemCounter = 0;\n  private readonly _options: MenuOptions;\n  private readonly _logPrefix = '[menu-service] ';\n  private readonly _$opened = new Subject<boolean>();\n  private readonly _$splitPaneWhen = new BehaviorSubject<SplitPaneShowWhen>(DEFAULT_MENU_SHOW_WHEN);\n  private readonly _$enabled: BehaviorSubject<boolean>;\n  private readonly _$enableSubMenu: BehaviorSubject<boolean>;\n\n  constructor(\n    protected settings: LocalSettingsService,\n    protected configService: ConfigService,\n    protected accountService: AccountService,\n    protected router: Router,\n    protected modalCtrl: ModalController,\n    protected alertController: AlertController,\n    protected navController: NavController,\n    protected translate: TranslateService,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_MENU_OPTIONS) options?: MenuOptions,\n    @Optional() @Inject(APP_MENU_ITEMS) staticItems?: IMenuItem[]\n  ) {\n    super(settings);\n    this._options = {\n      ...options,\n      subMenu: {\n        disableIcon: false,\n        savePinned: true,\n        ...(options?.subMenu || {}),\n        // Force disable on mobile\n        enable: options?.subMenu?.enable !== false && !this.settings.mobile,\n      },\n    };\n    this._$enabled = new BehaviorSubject<boolean>(this.environment?.enableMenu !== false);\n    this._$enableSubMenu = new BehaviorSubject<boolean>(this._options.subMenu.enable);\n    this._detachedSubItems = [];\n    this._staticItems = (staticItems || []).map((source) => {\n      const target = this.fromObject({ static: true, ...source }, { computeId: true, fillParent: true, fillDefaultFromParent: true });\n\n      const detachedSubItems = TreeItemEntityUtils.deleteRecursively(target, (item) => item.static !== true);\n      if (detachedSubItems?.length) {\n        detachedSubItems.forEach((item) => this._detachToParent(item));\n        console.debug(this._logPrefix + 'Initial detached sub items', detachedSubItems);\n        this._detachedSubItems.push(...detachedSubItems);\n      }\n      return target;\n    });\n\n    // DEBUG\n    this._debug = !environment.production;\n  }\n\n  get opened(): Observable<boolean> {\n    return this._$opened.asObservable();\n  }\n\n  get splitPaneWhen(): Observable<SplitPaneShowWhen> {\n    return this._$splitPaneWhen.asObservable();\n  }\n\n  get enabled(): Observable<boolean> {\n    return this._$enabled.asObservable();\n  }\n\n  get subMenuEnabled(): boolean {\n    return this._$enableSubMenu.value;\n  }\n\n  get subItems(): MenuItem[] {\n    return (this.data || []).reduce((res, rootElement) => res.concat(rootElement.children), []);\n  }\n\n  private get _staticSubItems(): MenuItem[] {\n    return (this._staticItems || []).reduce((res, rootElement) => res.concat(rootElement.children), []);\n  }\n\n  enable(value: boolean) {\n    this._$enabled.next(value);\n  }\n\n  enableSubMenu(value: boolean) {\n    this._$enableSubMenu.next(value);\n  }\n\n  setSplitPaneShowWhen(value: SplitPaneShowWhen) {\n    if (this._$splitPaneWhen.value !== value) {\n      this._$splitPaneWhen.next(value);\n    }\n  }\n\n  toggleSplitPaneWhen() {\n    if (this._$splitPaneWhen.value !== false) {\n      this._$splitPaneWhen.next(false);\n    } else {\n      this._$splitPaneWhen.next(DEFAULT_MENU_SHOW_WHEN);\n    }\n  }\n\n  fromObject(source: any, opts?: { withChildren?: boolean; computeId?: boolean; fillParent?: boolean; fillDefaultFromParent?: boolean }): MenuItem {\n    const target = MenuItem.fromObject(source, { withChildren: false });\n    // Compute id if need\n    if (opts?.computeId && isNil(target.id)) target.id = this._computeNewId();\n\n    // Remove icon if disabled\n    if (this._options.subMenu.disableIcon) {\n      Object.assign(target, <IconRef>{ icon: undefined, matIcon: undefined, matSvgIcon: undefined });\n    }\n\n    // Recursive\n    target.children = (source.children || []).map((json: any) => this.fromObject(json, { ...opts, fillParent: false }));\n\n    // Fill parent (once, when the full tree is ready)\n    if (opts?.fillParent) {\n      TreeItemEntityUtils.treeFillParent(target);\n\n      // Fill defaults from the parent (once filled)\n      if (opts?.fillDefaultFromParent) {\n        TreeItemEntityUtils.visit(target, (item) => {\n          if (!item.parent) return; // Skip if no parent\n          item.parentPath = item.parentPath || item.parent.path;\n          item.parentPathParams = item.parentPathParams || item.parent.pathParams;\n          item.static = toBoolean(item.static, item.parent.static);\n          // Compute path, from parent path + action\n          if (!item.path && !!item.action) {\n            item.path = item.parent.path;\n            item.pathParams = typeof item.action === 'string' ? { action: item.action } : { actionId: item.id.toString(), actionTitle: item.title };\n          }\n        });\n      }\n    }\n\n    return target;\n  }\n\n  createSubMenu(source: Partial<IMenuItem>): MenuItem {\n    if (!this.subMenuEnabled) return null; // Skip if disabled\n\n    const target = this.fromObject(source);\n\n    // Check if exists\n    if (this.started) {\n      const existingItem = this._findExistingItem(target);\n      if (existingItem) return existingItem;\n    }\n\n    // Create\n    if (isNil(target.id)) target.id = this._computeNewId();\n\n    return target;\n  }\n\n  async addSubMenuItems(sources: IMenuItem[], opts?: { skipIfExists?: boolean }) {\n    if (!this.started) await this.ready();\n    if (!this.subMenuEnabled) return; // Skip\n    return sources.map((source) => this._addSubMenuItem(this.fromObject(source), opts));\n  }\n\n  async addSubMenuItem(item: IMenuItem, opts?: { skipIfExists?: boolean }) {\n    if (!this.started) await this.ready();\n    if (!this.subMenuEnabled) return; // Skip\n    return this._addSubMenuItem(this.fromObject(item), opts);\n  }\n\n  async removeSubMenuItems(items: IMenuItem[]) {\n    if (!this.started) await this.ready();\n    return (items || []).map((item) => this._removeSubMenuItem(this.fromObject(item)));\n  }\n\n  async removeSubMenuItem(item: IMenuItem) {\n    if (!this.started) await this.ready();\n    return this._removeSubMenuItem(this.fromObject(item));\n  }\n\n  togglePinned(source: IMenuItem) {\n    const item = source instanceof MenuItem ? source : this._findExistingItem(this.fromObject(source));\n\n    // Skip if not found\n    if (!item) {\n      if (this._debug) console.warn(this._logPrefix + `Sub menu {${source.path}} cannot be found - unable to toggle pinned!`);\n      return;\n    }\n\n    // Skip if static\n    if (item.static) return;\n\n    // Unpinned\n    if (item.pinned) {\n      item.pinned = false;\n      if (!item.detached) {\n        this._detachedSubItems = [...this._detachedSubItems, ...this._detachSubMenuItems()];\n      }\n    }\n\n    // Pinned\n    else {\n      item.pinned = true;\n    }\n\n    this.onPinned.emit(item);\n  }\n\n  async executeAction(event: Event, item: MenuItem) {\n    const action = item?.action;\n    if (!action) return; // skip\n    if (typeof action === 'string') {\n      switch (action as string) {\n        case 'logout':\n          await this.logout();\n          break;\n        case 'about':\n          await this.openAboutModal();\n          break;\n        case 'expand':\n          await this.toggleExpandableItem(item);\n          if (item.path) {\n            await this.navController.navigateRoot(item.path, {\n              queryParams: item.pathParams,\n            });\n          }\n          break;\n        default: {\n          if (item.path) {\n            await this.navController.navigateRoot(item.path, {\n              queryParams: item.pathParams,\n            });\n          } else {\n            throw new Error('Unknown action: ' + action);\n          }\n        }\n      }\n    } else if (typeof action === 'function') {\n      (action as unknown as any)(event);\n    }\n  }\n\n  async logout() {\n    const translations = await this.translate.instant([\n      'AUTH.LOGOUT.CONFIRM_TITLE',\n      'AUTH.LOGOUT.CONFIRM_MESSAGE',\n      'COMMON.BTN_CANCEL',\n      'AUTH.LOGOUT.BTN_CONFIRM',\n    ]);\n    const alert = await this.alertController.create({\n      header: translations['AUTH.LOGOUT.CONFIRM_TITLE'],\n      message: translations['AUTH.LOGOUT.CONFIRM_MESSAGE'],\n      buttons: [\n        {\n          text: translations['COMMON.BTN_CANCEL'],\n          role: 'cancel',\n          cssClass: 'secondary',\n        },\n        {\n          text: translations['AUTH.LOGOUT.BTN_CONFIRM'],\n          cssClass: 'ion-color-primary',\n          handler: async () => {\n            // Back to home\n            await this.navController.navigateRoot('/');\n\n            // WARNING: logout should be done AFTER home redirection, because of cache clearing - see issue #5\n            this.accountService.logout();\n          },\n        },\n      ],\n    });\n\n    await alert.present();\n  }\n\n  async openAboutModal() {\n    const modal = await this.modalCtrl.create({ component: AboutModal });\n    return modal.present();\n  }\n\n  async toggleExpandableItem(item: MenuItem) {\n    if (!item.expanded) {\n      if (this._debug) console.debug(this._logPrefix + 'Expand item', item);\n\n      item.matIcon = 'expand_less';\n\n      // Try to attach some item\n      this._detachedSubItems\n        .filter((childItem) => !!this._findParent(childItem, [item]))\n        .forEach((childItem) => this._attachMenuToParent(item, childItem));\n    } else {\n      item.matIcon = 'expand_more';\n\n      this._detachedSubItems = [...this._detachedSubItems, ...this._detachSubMenuItems({ path: '/', params: {} }, item.children)];\n    }\n  }\n\n  _markAsOpened() {\n    this._$opened.next(true);\n  }\n\n  _markAsClosed() {\n    this._$opened.next(false);\n  }\n\n  async close() {\n    this._$opened.next(false);\n  }\n\n  async open() {\n    this._$opened.next(true);\n  }\n\n  protected async ngOnStart() {\n    console.info(`${this._logPrefix}Starting...`);\n\n    // Restore sub items from settings\n    await this.settings.ready();\n    const settingsSubItems: IMenuItem[] = this.settings.getPageSettings('menu', 'sub-items');\n    if (isNotEmptyArray(settingsSubItems)) {\n      const detachedSubItems = settingsSubItems.map((source) => this.fromObject(source, { computeId: true, fillParent: true }));\n      console.debug(this._logPrefix + 'Restoring pinned sub items from settings', detachedSubItems);\n\n      // TODO check if previous sub menu (from menu token) are kept\n      //this._detachedSubItems.push(...detachedSubItems);\n      this._detachedSubItems = detachedSubItems;\n    }\n\n    const accountEvent$ = merge(\n      from(this.accountService.ready()),\n      this.accountService.onLogin,\n      this.accountService.onLogout.pipe(map((_) => null))\n    ).pipe(\n      map((account) => (isNotNil(account?.id) ? account : null)),\n      distinctUntilChanged((a1, a2) => DateUtils.isSame(a1?.updateDate, a2?.updateDate))\n    );\n\n    this.registerSubscription(\n      // Combine config and account events\n      combineLatest([this.configService.config, accountEvent$]).subscribe(([config, account]) => {\n        const isLogin = this.accountService.isLogin();\n        if (this._debug) console.debug(`${this._logPrefix}Received config or account event. Refreshing items... isLogin? `, isLogin);\n\n        // Make sure to clear account, if not login\n        account = isLogin ? account : null;\n\n        // Load all items\n        const items = this._loadMenuItems(config, account);\n\n        // Emit new root items\n        this.dataSubject.next(items);\n\n        // Emit account changes event\n        this.accountChanges.next(account);\n      })\n    );\n\n    this.registerSubscription(\n      merge(\n        // Force refresh when login/logout\n        this.accountChanges.pipe(map(() => MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url))),\n        // Start listening route\n        this.startSubject.pipe(\n          switchMap((_) => this.router.events),\n          filter((event) => {\n            return event instanceof NavigationEnd;\n          }),\n          map((event: NavigationEnd) => MenuItems.parsePathWithQuery(event.url))\n        )\n      )\n        .pipe(throttleTime(250))\n        .subscribe((pathParam) => {\n          const detachedSubItems = this._detachSubMenuItems(pathParam);\n          if (detachedSubItems?.length) {\n            this._detachedSubItems = [...this._detachedSubItems, ...detachedSubItems];\n            if (this._debug) console.debug(`${this._logPrefix}Newly detached items: `, detachedSubItems);\n          }\n        })\n    );\n\n    // Save pinned items\n    this.registerSubscription(\n      this.onPinned.subscribe((item) => {\n        // Collect pinned elements, then serialize it (without id)\n        const pinnedSubItems = this.subItems.filter((i) => i.isPinned()).map((item) => item.asObject({ withChildren: true, keepLocalId: false }));\n\n        if (pinnedSubItems.length && this._debug)\n          console.debug(this._logPrefix + `Saving ${pinnedSubItems.length} pinned items, in local settings`, pinnedSubItems);\n        this.settings.savePageSetting('menu', pinnedSubItems, 'sub-items');\n      })\n    );\n\n    return firstNotNilPromise(this.dataSubject);\n  }\n\n  private _loadMenuItems(config: Configuration | null, account: Account | null) {\n    if (this._debug) console.debug(`${this._logPrefix}Loading menu items...`);\n\n    // Save previous children of root items\n    const detachedSubItems = (this.subItems || []).concat(this._staticSubItems || []).reduce((res, rootItem) => {\n      const children = rootItem.children;\n      if (isEmptyArray(children)) return res;\n      // Detach all root children\n      rootItem.children = [];\n      children.forEach((child) => (child.parent = null));\n      // Return root children\n      return res.concat(children);\n    }, this._detachedSubItems || []);\n\n    // Reset base root items (clean items added by config)\n    let items: MenuItem[] = this._staticItems.slice();\n\n    // Concat config's items\n    const configValue: string = config?.getProperty(CORE_CONFIG_OPTIONS.MENU_ITEMS);\n    if (isNotNilOrBlank(configValue)) {\n      try {\n        const configItems = JSON.parse(configValue) as IMenuItem[];\n        items = (configItems || []).reduce((res: MenuItem[], source) => {\n          // Normalize the item\n          const item = this.fromObject({ static: true, ...source }, { computeId: true });\n\n          // Skip is already loaded\n          if (res.find((i) => MenuItems.isSame(i, item))) return res;\n\n          // Reuse existing id, if possible\n          const existingItem = this.data?.find((i) => MenuItems.isSame(i, item));\n          if (existingItem) {\n            item.id = existingItem.id;\n          }\n\n          if (item.after) {\n            const index = res.findIndex((i) => i.title === item.after);\n            if (index !== -1) {\n              return res\n                .slice(0, index + 1)\n                .concat(item)\n                .concat(res.slice(index + 1));\n            }\n          } else if (item.before) {\n            const index = res.findIndex((i) => i.title === item.before);\n            if (index !== -1) {\n              return res.slice(0, index).concat(item).concat(res.slice(index));\n            }\n          }\n          return res.concat(item);\n        }, items);\n      } catch (err) {\n        console.error(`${this._logPrefix}Invalid value for option '${CORE_CONFIG_OPTIONS.MENU_ITEMS.key}'. Expected an array of menu item`, err);\n      }\n    }\n\n    // Filter item using account rights\n    const opts = { debug: this._debug };\n    items = items\n      .filter((item) => MenuItems.checkIfVisible(item, account, config, opts))\n      .map((item) => {\n        // Replace title using a config property\n        if (isNotNilOrBlank(item.titleProperty) && config) {\n          item.title = config.properties[item.titleProperty] || item.title;\n        }\n\n        return item;\n      });\n\n    if (this._debug) console.debug(`${this._logPrefix}Found ${items.length} visible root items...`);\n\n    // Re-attach sub menu items\n    if (this.subMenuEnabled && detachedSubItems.length) {\n      if (account) {\n        this._addSubMenuItems(detachedSubItems, { skipIfExists: false, availableParents: detachedSubItems.concat(items) });\n      } else {\n        this._detachedSubItems = detachedSubItems;\n      }\n    } else {\n      this._detachedSubItems = [];\n    }\n\n    return items;\n  }\n\n  private _addSubMenuItems(sources: MenuItem[], opts?: { skipIfExists?: boolean; availableParents?: MenuItem[] }) {\n    return sources.map((source) => this._addSubMenuItem(source, opts));\n  }\n\n  private _addSubMenuItem(newItem: MenuItem, opts?: { skipIfExists?: boolean; availableParents?: MenuItem[] }) {\n    opts = {\n      skipIfExists: true,\n      ...opts,\n    };\n\n    const pathParam = MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url);\n\n    // Find if item already exists\n    const existingItem = this._findExistingItem(newItem, opts?.availableParents);\n    if (existingItem) {\n      // No changes\n      if (opts.skipIfExists && MenuItems.isSame(existingItem, newItem) && existingItem.visible) {\n        // DEBUG\n        if (this._debug) console.debug(`${this._logPrefix}Skipping sub item (same visible item already exist)`, newItem);\n        return existingItem;\n      }\n\n      if (this._debug) console.debug(`${this._logPrefix}Updating existing sub item #`, existingItem.id);\n\n      // Replace existing item, but keep the existing id\n      if (newItem !== existingItem) {\n        newItem.id = existingItem.id;\n        newItem.$children = existingItem.$children;\n        newItem.pinned = existingItem.pinned;\n        newItem.static = existingItem.static;\n        if (newItem.pinned || newItem.static || existingItem.expanded) {\n          // If loading, keep existing title if pinned (avoid to show skeleton)\n          newItem.title = newItem.title || existingItem.title;\n        } else {\n          newItem.title = isNotNil(newItem.title) ? newItem.title : existingItem.title;\n        }\n        // Auto set icon, for expand action\n        if (existingItem.action === 'expand') {\n          newItem.icon = null;\n          newItem.matIcon = existingItem.expanded ? 'expand_less' : 'expand_more';\n        }\n      }\n    }\n\n    // Generate item's id (if need)\n    else if (isNil(newItem.id)) {\n      newItem.id = this._computeNewId();\n    }\n\n    // Default icon for expand action\n    if (newItem.action === 'expand' && !newItem.matIcon) {\n      newItem.matIcon = 'expand_more';\n    }\n\n    // If visible, get the parent where to attach the item\n    const parent = this._findParent(newItem, opts?.availableParents);\n    if (parent && parent.expanded) {\n      // Attach item to parent\n      this._attachMenuToParent(parent, newItem);\n\n      // Update detached items :\n      // - excluded new item\n      // - attach and exclude those than can be attached to the new item\n      // Search in detached items one have newItem as parent\n      if (newItem.expanded) {\n        const ancestor = newItem.ancestor;\n        this._detachedSubItems = this._detachedSubItems.concat(...newItem.children).reduce((res, item) => {\n          // Excluded newly add item\n          if (item.id === newItem.id) return res;\n\n          // If some detached can be attached to the new item: do it\n          if (MenuItems.checkIfSubMenuVisible(item, pathParam)) {\n            const parent = this._findParent(item, [ancestor]);\n            if (parent) {\n              // Update item's children\n              const detachedChildren = this._detachSubMenuItems(pathParam, item.children || []);\n\n              // Attach item\n              this._attachMenuToParent(parent, item);\n\n              // Remember detached children\n              return res.concat(...detachedChildren);\n            }\n          }\n\n          // Detach (if need)\n          this._detachToParent(item);\n\n          // Add to detached items\n          return res.concat(item);\n        }, []);\n      } else {\n        // Remove from detached elements\n        this._detachedSubItems = this._detachedSubItems.filter((item) => item.id !== newItem.id);\n\n        // Detach children\n        newItem.children.forEach((item) => this._detachToParent(item));\n      }\n    } else {\n      // Add or update detached item\n      const detachedIndex = isNotNil(newItem.id) ? this._detachedSubItems.findIndex((item) => item.id === newItem.id) : -1;\n      if (detachedIndex !== -1) {\n        this._detachedSubItems[detachedIndex] = newItem;\n      } else {\n        this._detachedSubItems.push(newItem);\n      }\n    }\n\n    return newItem;\n  }\n\n  private _computeNewId() {\n    return this._itemCounter++;\n  }\n\n  private _removeSubMenuItem(item: MenuItem) {\n    const existingItem = this._findExistingItem(item);\n    if (existingItem) {\n      this._detachToParent(existingItem);\n      return existingItem;\n    }\n  }\n\n  private _detachSubMenuItems(currentPathParam?: MenuPathParam, subItems?: MenuItem[]) {\n    currentPathParam = currentPathParam ? currentPathParam : MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url.toString());\n    return (subItems || this.subItems).reduce((res, subItem) => {\n      // Not visible => should be detach\n      if (!MenuItems.checkIfSubMenuVisible(subItem, currentPathParam)) {\n        this._detachToParent(subItem);\n\n        return res.concat(subItem);\n      }\n      // Visible: check children\n      return res.concat(this._detachSubMenuItems(currentPathParam, subItem.children));\n    }, []);\n  }\n\n  private _detachToParent(item: MenuItem) {\n    if (!item?.parent) return; // Skip if already detached\n    let children = item.parent.children || [];\n\n    // Remove from parent children\n    const indexInParent = children.indexOf(item);\n    if (indexInParent !== -1) {\n      children = children.slice(); // Copy original array, because it can be used in a loop\n      children.splice(indexInParent, 1);\n      item.parent.children = children;\n    }\n\n    item.parent = null;\n  }\n\n  private _findExistingItem(searchItem: IMenuItem, items?: MenuItem[], recursive = true): MenuItem {\n    items = items || [...this._detachedSubItems, ...this.data];\n    if (!items.length) return undefined; // Not found\n    for (const item of items) {\n      if (MenuItems.isSameIdOrPathAndParams(searchItem, item)) return item;\n      if (recursive && item.children) {\n        const child = this._findExistingItem(searchItem, item.children);\n        if (child) return child;\n      }\n    }\n    return null;\n  }\n\n  private _findParent(childItem: MenuItem, availableParents?: MenuItem[]): MenuItem {\n    if (!childItem?.path) return undefined;\n    if (childItem.parent) return childItem.parent;\n\n    availableParents = availableParents || [...this._detachedSubItems, ...this.data];\n\n    return availableParents.reduce((res, item) => {\n      if (!item?.path) return res;\n\n      // A found item already match with the menuItem.parentPath : keep it as it\n      // There is a found candidate that already match the current candidate : keep it\n      if (MenuItems.isParent(childItem, res)) return res;\n\n      // If the menu item has explicit parentPath and its path and path param are the same as the candidate  : use it as parent\n      if (MenuItems.isParent(childItem, item)) return item;\n\n      if (!res && item.children?.length) {\n        return this._findParent(childItem, item.children);\n      }\n\n      return res;\n    }, undefined);\n  }\n\n  private _attachMenuToParent(parent: MenuItem, child: MenuItem) {\n    if (this._debug) console.debug(`${this._logPrefix}Attach sub-menu {${MenuItems.getUrl(child)}} to parent {${MenuItems.getUrl(parent)}}`);\n\n    // Avoid to keep identical menu item (we replace it with the new child menu item)\n    //if (!parent?.$children) parent.$children = new BehaviorSubject<MenuItem[]>([]);\n    const children = parent.children || [];\n    const existingIndex = children.findIndex((item) => MenuItems.isSameIdOrPathAndParams(item, child));\n\n    // Update existing element\n    if (existingIndex !== -1) {\n      if (children[existingIndex] !== child) {\n        children[existingIndex] = child;\n        parent.children = children;\n        child.parent = parent;\n      }\n    } else {\n      children.push(child);\n\n      // Sort by tab (or id)\n      parent.children = children.sort(MenuItems.sortByTabOrId);\n      child.parent = parent;\n    }\n  }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Inject, Input, OnInit, Optional, ViewChild } from '@angular/core';\nimport { IonSplitPane, MenuController, ModalController, NavController } from '@ionic/angular';\n\nimport { Account } from '../services/model/account.model';\nimport { AccountService } from '../services/account.service';\n\nimport { fadeInSlowAnimation } from '../../shared/material/material.animations';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subscription } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { DEFAULT_MENU_SHOW_WHEN, MenuService, SplitPaneShowWhen } from './menu.service';\nimport { IMenuItem, MenuItem } from './menu.model';\nimport { firstNotNilPromise } from '../../shared/observables';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { RxStrategyNames } from '@rx-angular/cdk/render-strategies';\nimport { PersonUtils } from '../services/model/person.model';\nimport { APP_BASE_HREF } from '@angular/common';\n\nimport { APP_SHOW_TOOLTIP } from '../../shared/constants';\n\n@Component({\n  selector: 'app-menu',\n  templateUrl: 'menu.component.html',\n  styleUrls: ['./menu.component.scss'],\n  animations: [fadeInSlowAnimation],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuComponent implements OnInit {\n  @Input() id = 'menu';\n  @Input() menuId = 'left';\n  @Input() side = 'left';\n  @Input() contentId = 'menu-content';\n  @Input() logo: string;\n  @Input() appName: string;\n  @Input() rxStrategy: RxStrategyNames = 'normal';\n  @Input() appVersion: string;\n\n  @ViewChild('splitPane', { static: true }) splitPane: IonSplitPane;\n\n  loading = true;\n  isLogin = false;\n  accountName: string;\n  accountAvatar: string;\n  accountEmail: string;\n\n  protected readonly defaultAvatarImage: string;\n\n  private readonly _debug: boolean;\n  private _subscription = new Subscription();\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected accountService: AccountService,\n    protected navController: NavController,\n    protected menu: MenuController,\n    protected modalCtrl: ModalController,\n    protected translate: TranslateService,\n    protected cd: ChangeDetectorRef,\n    protected menuService: MenuService,\n    protected router: Router,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_BASE_HREF) protected appBaseHref: string,\n    @Optional() protected route: ActivatedRoute // Modal editor give 'null'\n  ) {\n    console.debug('[menu-component] Create');\n    this.appVersion = environment.version;\n    this.defaultAvatarImage = (appBaseHref || '/') + PersonUtils.DEFAULT_AVATAR_IMAGE;\n    this._debug = !environment.production;\n  }\n\n  async ngOnInit() {\n    this.splitPane.when = await firstNotNilPromise(this.menuService.splitPaneWhen);\n\n    this._subscription.add(\n      this.menuService.accountChanges.subscribe((account) => {\n        if (account) this.onLogin(account);\n        else this.onLogout(true);\n      })\n    );\n\n    // Listen to menu service event\n    this._subscription.add(this.menuService.splitPaneWhen.subscribe((value) => this.setSplitPaneWhen(value)));\n    this._subscription.add(this.menuService.enabled.subscribe((value) => this.enable(value)));\n    this._subscription.add(\n      this.menuService.opened\n        // Avoid duplicated events\n        .pipe(distinctUntilChanged())\n        .subscribe((value) => (value ? this.open({ emitEvent: false }) : this.close({ emitEvent: false })))\n    );\n\n    // TODO : Find a more reliable way to do this :\n    //    Must be donne after menuService subscription :\n    //    - In MenuService.ngOnStart accountChanges change will be emitted before the service is ready\n    //    - This is required because subjectData be filled after get account change\n    //      and MenuService await for subjectData be filled to be ready\n    await this.menuService.ready();\n  }\n\n  async onLogin(account: Account) {\n    console.info('[menu] Update (on login)');\n    this.accountAvatar = account.avatar;\n    this.accountName = account.displayName;\n    this.accountEmail = account.email;\n    this.isLogin = true;\n    this.markAsLoaded({ emitEvent: false });\n    this.markForCheck();\n  }\n\n  async onLogout(skipRedirect?: boolean) {\n    if (!this.isLogin) {\n      this.markAsLoaded();\n      return; // Skip if already logout\n    }\n\n    if (!skipRedirect) {\n      console.debug('[menu] Logout');\n    } else {\n      console.debug('[menu] Update (on logout)');\n    }\n    this.accountAvatar = null;\n    this.accountEmail = null;\n    this.accountName = null;\n\n    // Wait the end of fadeout, to reset the account\n    if (!skipRedirect) {\n      await this.navController.navigateRoot('/');\n    }\n\n    this.isLogin = false;\n    this.markAsLoaded({ emitEvent: false });\n    this.markForCheck();\n  }\n\n  trackByFn(index: number, item: IMenuItem) {\n    return item.id.toString();\n  }\n\n  async enable(value: boolean): Promise<void> {\n    const enabled = await this.menu.isEnabled(this.menuId);\n    if (enabled !== value) {\n      await this.menu.enable(value, this.menuId);\n      if (!value) await this.close();\n    }\n  }\n\n  async open(opts?: { emitEvent?: boolean }): Promise<boolean> {\n    console.debug('[menu] Checking open event...');\n    const opened = await this.menu.isOpen(this.menuId);\n    if (!opened) {\n      console.debug('[menu] Opening menu');\n      await this.menu.open(this.menuId);\n\n      // Propagate to service\n      if (!opts || opts.emitEvent !== false) {\n        this.menuService._markAsOpened();\n      }\n    }\n    return true;\n  }\n\n  async close(opts?: { emitEvent?: boolean }): Promise<boolean> {\n    console.debug('[menu] Checking close event...');\n    const opened = await this.menu.isOpen(this.menuId);\n    if (opened) {\n      console.debug('[menu] Closing menu');\n      await this.menu.close(this.menuId);\n\n      // Propagate to service\n      if (!opts || opts.emitEvent !== false) {\n        this.menuService._markAsClosed();\n      }\n    }\n    return true;\n  }\n\n  async setSplitPaneWhen(value: SplitPaneShowWhen) {\n    console.debug('[menu] Checking splitPane when...');\n    if (this.splitPane.when !== value) {\n      console.debug('[menu] Set splitPane when to ' + value);\n      this.splitPane.when = value;\n      this.detectChanges();\n\n      // Propagate to the menu service\n      setTimeout(() => this.menuService.setSplitPaneShowWhen(value), 200);\n    }\n  }\n\n  toggleSplitPaneShow(event?: Event) {\n    if (event && event.defaultPrevented) return;\n    if (event) event.preventDefault();\n\n    if (this.splitPane.when === false) {\n      return this.setSplitPaneWhen(DEFAULT_MENU_SHOW_WHEN);\n    } else {\n      return this.setSplitPaneWhen(false);\n    }\n  }\n\n  executeAction(event: Event, item: MenuItem) {\n    this.close();\n\n    // Delegate execution to service\n    return this.menuService.executeAction(event, item);\n  }\n\n  onSwipeRight(event) {\n    // Skip, if not a valid swipe event\n    if (!event || event.pointerType !== 'touch' || event.velocity < 0.4) {\n      //event.preventDefault();\n      return false;\n    }\n\n    // Will open the left menu, so cancelled this swipe event\n    const startX = event.center.x - event.distance;\n    if (startX <= 50) {\n      // DEBUG\n      //console.debug(\"[menu] Cancel swipe right, because near the left menu {x: \" + startX + \", velocity: \" + event.velocity + \"}\");\n      event.preventDefault();\n      return false;\n    }\n\n    // OK: continue\n\n    // DEBUG\n    //console.debug(\"[menu] Received swipe right {x: \" + startX + \", velocity: \" + event.velocity + \"}\");\n  }\n\n  protected markAsLoaded(opts?: { emitEvent?: boolean }) {\n    if (this.loading) {\n      setTimeout(() => {\n        this.loading = false;\n\n        if (!opts || opts.emitEvent !== false) this.markForCheck();\n      }, 450);\n    }\n  }\n\n  protected markAsLoading(opts?: { emitEvent?: boolean }) {\n    if (!this.loading) {\n      this.loading = true;\n\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  protected detectChanges() {\n    this.cd.detectChanges();\n  }\n\n  protected markForCheck() {\n    this.cd.detectChanges();\n  }\n\n  protected togglePinned(event: Event, item: IMenuItem) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.menuService.togglePinned(item);\n  }\n}\n","<ion-split-pane #splitPane [contentId]=\"contentId\" (swiperight)=\"onSwipeRight($event)\">\n  <ion-menu [id]=\"id\" [menuId]=\"menuId\" [contentId]=\"contentId\">\n    <ion-header>\n      <ion-toolbar *ngIf=\"!loading && isLogin; else notLogin\" @fadeInSlowAnimation class=\"user-toolbar\">\n        <ion-grid>\n          <ion-row>\n            <ion-col size=\"4\">\n              <button\n                type=\"button\"\n                mat-flat-button\n                class=\"user-avatar\"\n                [class.primary]=\"!accountAvatar\"\n                [style.background-image]=\"'url(' + (accountAvatar || defaultAvatarImage) + ')'\"\n                [routerLink]=\"['/account']\"\n                routerDirection=\"root\"\n                routerLinkActive=\"ion-color-primary\"\n                (click)=\"close()\"\n                [title]=\"!showTooltip ? ('MENU.BTN_MY_ACCOUNT' | translate) : ''\"\n                [matTooltip]=\"showTooltip ? ('MENU.BTN_MY_ACCOUNT' | translate) : ''\"\n              ></button>\n            </ion-col>\n            <ion-col size=\"8\" class=\"user-logo\">\n              <img\n                *ngIf=\"logo; else noLogo\"\n                [attr.src]=\"logo\"\n                [title]=\"!showTooltip ? ('APP_NAME' | translate: { appName: appName }) : ''\"\n                [matTooltip]=\"showTooltip ? ('APP_NAME' | translate: { appName: appName }) : ''\"\n                alt=\"Logo\"\n                width=\"108px\"\n              />\n              <ng-template #noLogo>\n                <span style=\"width: 108px\">{{ appName }}</span>\n              </ng-template>\n            </ion-col>\n          </ion-row>\n          <ion-row class=\"ion-no-padding\">\n            <ion-col>\n              <button\n                mat-button\n                type=\"button\"\n                [routerLink]=\"['/account']\"\n                routerDirection=\"root\"\n                routerLinkActive=\"selected\"\n                (click)=\"close()\"\n                [title]=\"!showTooltip ? ('MENU.BTN_MY_ACCOUNT' | translate) : ''\"\n                [matTooltip]=\"showTooltip ? ('MENU.BTN_MY_ACCOUNT' | translate) : ''\"\n              >\n                <ion-label class=\"ion-text-wrap ion-text-start\">\n                  <h3 class=\"no-margin username\">\n                    <b>{{ accountName }}</b>\n                  </h3>\n                  <h4>{{ accountEmail }}</h4>\n                </ion-label>\n              </button>\n            </ion-col>\n\n            <!-- Insertion headerBottomRight -->\n            <ion-col size=\"auto\">\n              <ng-container *ngTemplateOutlet=\"headerBottomRight\"></ng-container>\n            </ion-col>\n          </ion-row>\n        </ion-grid>\n      </ion-toolbar>\n\n      <!-- User not logged -->\n      <ng-template #notLogin>\n        <mat-toolbar\n          class=\"ion-padding\"\n          *ngIf=\"!loading\"\n          style=\"height: unset; display: block; margin: auto; text-align: center\"\n        >\n          <img\n            *ngIf=\"logo\"\n            [attr.src]=\"logo\"\n            [title]=\"!showTooltip ? ('APP_NAME' | translate: { appName: appName }) : ''\"\n            [matTooltip]=\"showTooltip ? ('APP_NAME' | translate: { appName: appName }) : ''\"\n            width=\"150px;\"\n            alt=\"logo\"\n          />\n          <span *ngIf=\"!logo\" style=\"width: 150px\">{{ appName }}</span>\n        </mat-toolbar>\n      </ng-template>\n    </ion-header>\n\n    <ion-content [class.has-user-header]=\"isLogin\">\n      <!-- will close the menu, after a click, in mobile -->\n      <ion-menu-toggle auto-hide=\"false\">\n        <ion-list lines=\"none\" *ngIf=\"!loading\">\n          <ng-container *rxFor=\"let item of menuService.dataSubject; strategy: rxStrategy; trackBy: trackByFn\">\n            <ng-container *ngTemplateOutlet=\"menuItem; context: { $implicit: item, level: 0 }\"></ng-container>\n          </ng-container>\n        </ion-list>\n      </ion-menu-toggle>\n    </ion-content>\n\n    <ion-footer class=\"hidden-xxs hidden-xs hidden-sm hidden-md\">\n      <ion-toolbar>\n        <ion-buttons slot=\"start\">\n          <ion-button mat-icon-button color=\"accent\" (click)=\"menuService.openAboutModal()\">\n            <mat-icon slot=\"icon-only\">help_outline</mat-icon>\n          </ion-button>\n        </ion-buttons>\n\n        <ion-title (click)=\"menuService.openAboutModal()\" color=\"medium\">\n          {{ 'MENU.FOOTER_VERSION_ABOUT' | translate: { version: appVersion } }}\n        </ion-title>\n\n        <ion-buttons slot=\"end\">\n          <button\n            mat-icon-button\n            color=\"accent\"\n            (click)=\"toggleSplitPaneShow($event)\"\n            class=\"hidden-xs hidden-sm hidden-md\"\n            [title]=\"!showTooltip ? ((splitPane.when ? 'COMMON.BTN_HIDE_MENU' : 'COMMON.BTN_SHOW_MENU') | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ((splitPane.when ? 'COMMON.BTN_HIDE_MENU' : 'COMMON.BTN_SHOW_MENU') | translate) : ''\"\n          >\n            <mat-icon>\n              <span>{{ splitPane.when ? '&#xab;' : '&#xbb;' }}</span>\n            </mat-icon>\n          </button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-footer>\n  </ion-menu>\n\n  <ng-content></ng-content>\n</ion-split-pane>\n\n<ng-template #headerBottomRight>\n  <ng-content select=\"[headerBottomRight]\"></ng-content>\n</ng-template>\n\n<ng-template #menuItem let-item let-level=\"level\">\n  @if (item.divider) {\n    <!-- divider -->\n    <ion-item-divider class=\"{{ item.cssClass }} {{ item.color }}\" @fadeInSlowAnimation>\n      <ion-icon slot=\"start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n      <mat-icon slot=\"start\" *ngIf=\"item.matIcon\">{{ item.matIcon }}</mat-icon>\n      <ion-label *ngIf=\"item.cssClass !== 'flex-spacer'\">\n        <span *rxIf=\"item.$title; let title; else: skeletonText\" [innerHTML]=\"title | translate\"></span>\n      </ion-label>\n    </ion-item-divider>\n  } @else if (item.path && !item.action) {\n    <!-- tappable link -->\n    <ion-item\n      @fadeInSlowAnimation\n      class=\"{{ item.cssClass }} {{ item.color }}\"\n      [class.menu-item-sub]=\"level !== 0\"\n      tappable\n      [routerLink]=\"item.path\"\n      [queryParams]=\"item.pathParams\"\n      routerDirection=\"root\"\n      routerLinkActive=\"selected\"\n      [routerLinkActiveOptions]=\"{\n        paths: item.path === '/' || level !== 0 ? 'exact' : 'subset',\n        queryParams: item.pathParams?.tab || level === 0 ? 'subset' : 'exact',\n        matrixParams: 'exact',\n        fragment: 'ignored',\n      }\"\n    >\n      @if (item.icon) {\n        <ion-icon slot=\"start\" [name]=\"item.icon\"></ion-icon>\n      } @else if (item.matIcon) {\n        <mat-icon slot=\"start\">{{ item.matIcon }}</mat-icon>\n      } @else if (item.matSvgIcon) {\n        <mat-icon slot=\"start\" [svgIcon]=\"item.matSvgIcon\"></mat-icon>\n      }\n      <ion-label *rxLet=\"item.$title; let title\">\n        <span *ngIf=\"title; else skeletonText\" [innerHTML]=\"title | translate\"></span>\n        <!--<span *ngIf=\"_debug\"> {{item.id}}</span>-->\n      </ion-label>\n\n      <ion-badge *rxIf=\"item.$badge; let badge\" [color]=\"item.$badgeColor | push\">\n        {{badge}}\n      </ion-badge>\n\n      <!-- pin button -->\n      <ng-container *ngTemplateOutlet=\"pinButton; context: { $implicit: item, level: level }\"></ng-container>\n    </ion-item>\n  } @else if (item.action) {\n    <!-- action -->\n    <ion-item\n      @fadeInSlowAnimation\n      class=\"{{ item.cssClass }} {{ item.color }} text-1x\"\n      [class.menu-item-sub]=\"level !== 0\"\n      tappable\n      (click)=\"executeAction($event, item)\"\n    >\n      <ion-icon slot=\"start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n      <mat-icon slot=\"start\" *ngIf=\"item.matIcon\">{{ item.matIcon }}</mat-icon>\n      <ion-label>\n        <span *rxIf=\"item.$title; let title; else: skeletonText\" [innerHTML]=\"title | translate\"></span>\n        <!--<span *ngIf=\"_debug\"> {{item.id}}</span>-->\n      </ion-label>\n\n      <ion-badge *rxIf=\"item.$badge; let badge\" [color]=\"item.$badgeColor | push\">\n        {{badge}}\n      </ion-badge>\n\n      <!-- pin button -->\n      <ng-container *ngTemplateOutlet=\"pinButton; context: { $implicit: item, level: level }\"></ng-container>\n    </ion-item>\n  }\n\n  <!-- children -->\n  @if (item.$children) {\n    <div class=\"sub-menu-container\">\n      <ng-container *rxFor=\"let child of item.$children; strategy: rxStrategy; trackBy: trackByFn\">\n        <ng-container *ngTemplateOutlet=\"menuItem; context: { $implicit: child, level: level + 1 }\"></ng-container>\n      </ng-container>\n    </div>\n  }\n</ng-template>\n\n<ng-template #pinButton let-item let-level=\"level\">\n  <!-- pin button -->\n  @if (level && item.pinnable) {\n    <ion-button\n      slot=\"end\"\n      shape=\"round\"\n      fill=\"clear\"\n      size=\"small\"\n      [class.visible-hover]=\"!item.pinned\"\n      (click)=\"togglePinned($event, item)\"\n    >\n      <!--<mat-icon slot=\"icon-only\" [color]=\"item.pinned ? 'primary' : undefined\">push_pin</mat-icon>-->\n      <ion-icon slot=\"icon-only\" [name]=\"item.pinned ? 'pin' : 'pin-outline'\"></ion-icon>\n    </ion-button>\n  }\n</ng-template>\n\n<ng-template #skeletonText let-width let-animated>\n  <ion-skeleton-text [animated]=\"animated\" [style.width.%]=\"width || 60\"></ion-skeleton-text>\n</ng-template>\n","import { AfterViewInit, Directive, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { MatTab, MatTabGroup } from '@angular/material/tabs';\nimport { Router } from '@angular/router';\nimport { MenuService } from './menu.service';\nimport { MenuItem, MenuItems } from './menu.model';\nimport { isNotNil } from '../../shared/functions';\nimport { IconRef } from '../../shared/types';\n\n@Directive({\n  selector: '[appSubMenuTab]',\n})\nexport class SubMenuTabDirective implements OnChanges, AfterViewInit {\n  private _menuItem: MenuItem;\n\n  @Input() label: string;\n  @Input() disabled: boolean;\n  @Input() parentPath: string;\n  @Input() path: string;\n  @Input() subMenuTitle: string;\n  @Input() subMenuBadge: string | number;\n  @Input() subMenuIcon: IconRef = null; // { icon: 'none' };\n\n  constructor(\n    private menuService: MenuService,\n    private tabGroup: MatTabGroup,\n    private tab: MatTab,\n    private router: Router\n  ) {\n    this.path = MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url).path;\n  }\n\n  ngAfterViewInit() {\n    if (!this.tab.disabled) this._addToMenu();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.disabled || changes.label || changes.subMenuTitle || changes.parentPath || changes.path || changes.subMenuBadge) {\n      if (this.disabled) {\n        this._removeToMenu();\n      } else {\n        this._addToMenu();\n      }\n    }\n  }\n\n  private async _removeToMenu() {\n    const menuItem = this.menuItem;\n    if (menuItem) {\n      await this.menuService.removeSubMenuItem(menuItem);\n    }\n  }\n\n  private async _addToMenu() {\n    const menuItem = this.menuItem;\n    if (!menuItem?.parentPath) return;\n\n    // DEBUG\n    //if (this._debug) console.debug(`[sub-menu-tab] Refreshing sub menu {${menuItem.path}?tab=${menuItem.pathParams?.tab || 0} on parent {${menuItem.parentPath}}`);\n\n    this._menuItem = await this.menuService.addSubMenuItem(menuItem, { skipIfExists: false });\n  }\n\n  private get menuItem(): MenuItem {\n    const index = this.tabGroup.selectedIndex + this.tab.position;\n    const parentPath = index === 0 ? this.parentPath : this.path;\n    if (!parentPath) return null;\n    const tabParams = index === 0 ? {} : { tab: index.toString() };\n\n    // Create or load\n    if (!this._menuItem) {\n      this._menuItem = this.menuService.createSubMenu({\n        path: this.path,\n        pathParams: tabParams,\n        parentPath,\n        badge: this.subMenuBadge,\n      });\n    }\n\n    // Update existing\n    else {\n      const { path, params } = MenuItems.parsePathWithQuery(this.path);\n      this._menuItem.path = path;\n      this._menuItem.pathParams = { ...params, ...tabParams };\n    }\n\n    // Update item (title and icon)\n    if (this._menuItem) {\n      this._menuItem.title = this.title;\n      this._menuItem.badge = this.subMenuBadge;\n      if (this.subMenuIcon) {\n        Object.assign(this._menuItem, this.subMenuIcon);\n      }\n    }\n\n    return this._menuItem;\n  }\n\n  private get title(): string {\n    return isNotNil(this.subMenuTitle) ? this.subMenuTitle : this.label;\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { MenuComponent } from './menu.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { RouterModule } from '@angular/router';\nimport { SubMenuTabDirective } from './sub-menu-tab.directive';\nimport { RxStateModule } from '../../shared/rx-state/rx-state.module';\n\n@NgModule({\n  imports: [SharedModule, RouterModule, RxStateModule, TranslateModule.forChild()],\n\n  declarations: [\n    // Components\n    MenuComponent,\n    // Directive\n    SubMenuTabDirective,\n  ],\n  exports: [\n    // Modules\n    TranslateModule,\n    // Components\n    MenuComponent,\n    // Directive\n    SubMenuTabDirective,\n  ],\n})\nexport class AppMenuModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { TextPopover } from './text-popover.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppTextFormModule } from '../text/text-form.module';\n\n@NgModule({\n  imports: [SharedModule, AppTextFormModule, TranslateModule.forChild()],\n\n  declarations: [\n    // Components\n    TextPopover,\n  ],\n  exports: [\n    TranslateModule,\n    // Components\n    TextPopover,\n  ],\n})\nexport class AppTextPopoverModule {}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\n\nimport { UsageMode } from '../model/settings.model';\n\n@Pipe({\n  name: 'isOnField',\n})\n@Injectable({ providedIn: 'root' })\nexport class IsOnFieldPipe implements PipeTransform {\n  transform(value: UsageMode): boolean {\n    return value === 'FIELD';\n  }\n}\n\n@Pipe({\n  name: 'isOnDesk',\n})\n@Injectable({ providedIn: 'root' })\nexport class IsOnDeskPipe implements PipeTransform {\n  transform(value: UsageMode): boolean {\n    return value !== 'FIELD';\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { Person, PersonUtils } from '../model/person.model';\n\n@Pipe({\n  name: 'personToString',\n})\n@Injectable({ providedIn: 'root' })\nexport class PersonToStringPipe implements PipeTransform {\n  transform(value: Person | Person[], separator?: string, opts?: { withDepartment?: boolean }): string {\n    if (Array.isArray(value)) return PersonUtils.personsToString(value, separator, opts);\n    return PersonUtils.personToString(value as Person, opts);\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { Account, accountToString } from '../model/account.model';\n\n@Pipe({\n  name: 'isLogin',\n})\n@Injectable({ providedIn: 'root' })\nexport class IsLoginAccountPipe implements PipeTransform {\n  transform(value: Account): boolean {\n    return value && value.pubkey && true;\n  }\n}\n\n@Pipe({\n  name: 'accountToString',\n})\n@Injectable({ providedIn: 'root' })\nexport class AccountToStringPipe implements PipeTransform {\n  transform(value: Account): string {\n    return accountToString(value);\n  }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { Department, departmentsToString, departmentToString } from '../model/department.model';\n\n@Pipe({\n  name: 'departmentToString',\n})\n@Injectable({ providedIn: 'root' })\nexport class DepartmentToStringPipe implements PipeTransform {\n  transform(value: Department | Department[], separator?: string): string {\n    if (Array.isArray(value)) return departmentsToString(value, separator);\n    return departmentToString(value);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { IsOnDeskPipe, IsOnFieldPipe } from './usage-mode.pipes';\nimport { PersonToStringPipe } from './person-to-string.pipe';\nimport { AccountToStringPipe, IsLoginAccountPipe } from './account.pipes';\nimport { DepartmentToStringPipe } from './department-to-string.pipe';\nimport { ReferentialsToStringPipe, ReferentialToStringPipe } from './referential-to-string.pipe';\n\n@NgModule({\n  declarations: [\n    // Pipes\n    IsOnFieldPipe,\n    IsOnDeskPipe,\n    PersonToStringPipe,\n    IsLoginAccountPipe,\n    AccountToStringPipe,\n    DepartmentToStringPipe,\n    ReferentialToStringPipe,\n    ReferentialsToStringPipe,\n  ],\n  exports: [\n    // Pipes\n    IsOnFieldPipe,\n    IsOnDeskPipe,\n    PersonToStringPipe,\n    IsLoginAccountPipe,\n    AccountToStringPipe,\n    DepartmentToStringPipe,\n    ReferentialToStringPipe,\n    ReferentialsToStringPipe,\n  ],\n})\nexport class CorePipesModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { SelectPeerModal } from './select-peer.modal';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppTextPopoverModule } from '../form/text-popover/text-popover.module';\nimport { CorePipesModule } from '../services/pipes/pipes.module';\nimport { FormsModule } from '@angular/forms';\n\n@NgModule({\n  declarations: [\n    // Network\n    SelectPeerModal,\n  ],\n  exports: [\n    TranslateModule,\n    // Components\n    SelectPeerModal,\n  ],\n  imports: [SharedModule, TranslateModule.forChild(), AppTextPopoverModule, CorePipesModule, FormsModule],\n  providers: [provideHttpClient(withInterceptorsFromDi())],\n})\nexport class AppSelectPeerModule {}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, OnDestroy, OnInit } from '@angular/core';\nimport { AlertController, ModalController, ToastController } from '@ionic/angular';\nimport { firstValueFrom, from, Observable, Subscription } from 'rxjs';\nimport { Configuration } from '../services/model/config.model';\nimport { ConfigService } from '../services/config.service';\nimport { PlatformService } from '../services/platform.service';\nimport { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';\nimport { NetworkService } from '../services/network.service';\nimport { CORE_CONFIG_OPTIONS } from '../services/config/core.config';\nimport { VersionUtils } from '../../shared/version/versions';\nimport { slideUpDownAnimation } from '../../shared/material/material.animations';\nimport { isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrBlank, sleep } from '../../shared/functions';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Peer } from '../services/model/peer.model';\nimport { MimeTypes } from '../../shared/file/file.utils';\nimport { UriUtils } from '../../shared/file/uri.utils';\nimport { isAndroid, isIOS } from '../../shared/platforms';\n\nexport declare interface InstallAppLink {\n  name: string;\n  url: string;\n  platform?: 'android' | 'ios' | 'electron';\n  version?: string;\n  filename?: string;\n  title?: string;\n  description?: string;\n  mimeType?: string;\n  downloading?: boolean;\n  location?: string;\n}\n\n@Component({\n  selector: 'app-install-upgrade-card',\n  templateUrl: 'install-upgrade-card.component.html',\n  styleUrls: ['./install-upgrade-card.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  animations: [slideUpDownAnimation],\n})\nexport class AppInstallUpgradeCard implements OnInit, OnDestroy {\n  private _subscription = new Subscription();\n\n  loading = true;\n  hasDownloader = false;\n  downloading = false;\n  waitingNetwork = false;\n  installLinks: InstallAppLink[];\n  upgradeLinks: InstallAppLink[];\n  offline: boolean;\n\n  @Input() isLogin: boolean;\n  @Input() showUpgradeWarning = true;\n  @Input() showOfflineWarning = true;\n  @Input() showInstallButton = false;\n  @Input() debug: boolean;\n\n  constructor(\n    private configService: ConfigService,\n    private toastController: ToastController,\n    private alertController: AlertController,\n    private translate: TranslateService,\n    private cd: ChangeDetectorRef,\n    public platform: PlatformService,\n    public network: NetworkService,\n    @Inject(ENVIRONMENT) protected environment: Environment\n  ) {\n    this.debug = !environment.production;\n  }\n\n  ngOnInit() {\n    this.offline = this.network.offline;\n\n    // Listen pod config\n    this._subscription.add(\n      from(this.network.ready())\n        .pipe(\n          debounceTime(1000),\n          switchMap(() => this.configService.config),\n          filter(isNotNil)\n        )\n        .subscribe((config) => this.checkNeedInstallOrUpdate(config))\n    );\n\n    // Listen network changes\n    this._subscription.add(\n      this.network.onNetworkStatusChanges\n        .pipe(\n          //debounceTime(450),\n          //tap(() => this.waitingNetwork = false),\n          map((connectionType) => connectionType === 'none'),\n          distinctUntilChanged()\n        )\n        .subscribe((offline) => {\n          if (this.offline !== offline) {\n            this.offline = offline;\n            this.markForCheck();\n          }\n        })\n    );\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n    this._subscription = null;\n    this.installLinks = null;\n    this.upgradeLinks = null;\n  }\n\n  async download(event: Event, link: InstallAppLink) {\n    if (!link || !link.url) {\n      console.error(\"[install-upgrade-card] Missing required argument 'link.url'\");\n      return; // Skip\n    }\n\n    // Mark link as downloading\n    link.downloading = true;\n    this.markForCheck();\n\n    this.listenDownloadJob(\n      link.url,\n      this.platform.download({\n        uri: link.url,\n        title: link.title,\n        filename: link.filename,\n        mimeType: link.mimeType,\n      })\n    )\n      .then((location) => {\n        if (this.platform.canOpenFile) link.location = location;\n        link.downloading = false;\n      })\n      .catch(() => (link.downloading = false))\n      .then(() => this.markForCheck());\n  }\n\n  async openFile(event: Event, link: InstallAppLink) {\n    if (!link || !link.location || !link.mimeType) {\n      console.error(\"[install-upgrade-card] Missing required argument 'link.location' or 'link.mimeType'\");\n      return; // Skip\n    }\n    try {\n      await this.platform.open(link.location);\n    } catch (err) {\n      console.error('[install-upgrade-card] Cannot open file: ' + ((err && err.message) || err), err);\n    }\n  }\n\n  async tryOnline() {\n    this.waitingNetwork = true;\n    this.markForCheck();\n\n    try {\n      await this.network.tryOnline({\n        showLoadingToast: false,\n        showOnlineToast: true,\n        showOfflineToast: false,\n      });\n    } finally {\n      this.waitingNetwork = false;\n      this.markForCheck();\n    }\n  }\n\n  getPlatformName(platform: 'android' | 'ios' | 'electron') {\n    switch (platform) {\n      case 'android':\n        return 'Android';\n      case 'ios':\n        return 'iOS';\n      case 'electron':\n        return 'desktop';\n      default:\n        return '';\n    }\n  }\n\n  asLink(value: any): InstallAppLink {\n    return value as InstallAppLink;\n  }\n\n  /* -- private method  -- */\n\n  private async checkNeedInstallOrUpdate(config: Configuration) {\n    if (!config) return; // Skip\n\n    console.info('[install-upgrade-card] Check if need to install or upgrade...');\n\n    this.hasDownloader = this.platform.canDownload;\n\n    try {\n      const links = this.getLinks(config);\n\n      // Check for upgrade\n      this.upgradeLinks = this.getCompatibleUpgradeLinks(links, config);\n\n      if (isNotEmptyArray(this.upgradeLinks)) {\n        console.info(`[install-upgrade-card] Find upgrade links: ${this.upgradeLinks.map((l) => l.url).join(',')}`);\n        this.installLinks = null;\n        this.listenDownloadJobs();\n      } else {\n        // Check for install links\n        this.installLinks = this.getCompatibleInstallLinks(links);\n        if (isNotEmptyArray(this.installLinks)) {\n          console.info(`[install-upgrade-card] Find installation links ${this.installLinks.map((l) => l.url).join(',')}`);\n          await sleep(1000); // Add a delay, for animation\n        } else {\n          console.info(`[install-upgrade-card] No installation or upgrade links to display.`);\n        }\n      }\n    } finally {\n      this.loading = false;\n      this.markForCheck();\n    }\n  }\n\n  private getCompatibleInstallLinks(installLinks: InstallAppLink[]): InstallAppLink[] {\n    // Already an native App: not need to install\n    if (this.platform.isApp()) return undefined;\n\n    // If mobile web: return all compatible, depending on the platform\n    if (this.platform.isMobileWeb()) {\n      return installLinks.filter(\n        (link) =>\n          !link.platform ||\n          this.platform.is(link.platform) ||\n          (link.platform === 'android' && isAndroid(window)) ||\n          (link.platform === 'ios' && isIOS(window))\n      );\n    }\n\n    return undefined;\n  }\n\n  private getCompatibleUpgradeLinks(installLinks: InstallAppLink[], config: Configuration): InstallAppLink[] {\n    const appVersion = this.environment.version;\n    const appMinVersionFromPod = config.getProperty(CORE_CONFIG_OPTIONS.APP_MIN_VERSION);\n\n    if (!appVersion) {\n      console.error(\"Missing value for 'environment.version': cannot check app compatibility!\");\n      return undefined;\n    }\n\n    const needUpgrade = appMinVersionFromPod && !VersionUtils.isCompatible(appMinVersionFromPod, appVersion);\n    if (!needUpgrade) return undefined;\n\n    // Filter on platform, if mobile App\n    const upgradeLinks = (installLinks || []).filter((link) => link.platform && this.platform.is(link.platform));\n\n    // Use min version as default version\n    upgradeLinks.forEach((link) => {\n      link.version = link.version || appMinVersionFromPod;\n    });\n\n    return isNotEmptyArray(upgradeLinks) ? upgradeLinks : undefined;\n  }\n\n  private getLinks(config: Configuration): InstallAppLink[] {\n    const result: InstallAppLink[] = [];\n\n    // Compute App name\n    const minVersion = config.getProperty(CORE_CONFIG_OPTIONS.APP_MIN_VERSION);\n    const defaultAppName = this.environment.defaultAppName || 'SUMARiS';\n\n    // Android\n    {\n      // Get URL (from config, or environment)\n      let url = config.getProperty(CORE_CONFIG_OPTIONS.ANDROID_INSTALL_URL);\n      if (isNilOrBlank(url)) url = this.environment.defaultAndroidInstallUrl || null;\n\n      // Resolve relative URL\n      const peer = this.network.peer;\n      if (peer && url && (url.startsWith('./') || url.startsWith('/'))) {\n        url = Peer.path(peer, url);\n      }\n\n      // Compute App name (use config if URL is specific)\n      const name: string = isNotNilOrBlank(url) ? config.label : defaultAppName;\n\n      if (url) {\n        let title: string;\n        let mimeType: string;\n\n        // Get file name\n        let filename = UriUtils.getFilename(url);\n        let version = minVersion || 'latest';\n\n        // OK, this is a downloadable APK file (e.g. NOT a link to a playstore)\n        if (filename?.toLowerCase().endsWith('.apk')) {\n          // Define mime type\n          mimeType = MimeTypes.ANDROID_APK;\n\n          // Get the file version (if any)\n          const versionMatches = /-v([1-9][0-9]*\\.[0-9]+\\.(:?(:?alpha|beta|rc)?[0-9]*))/i.exec(filename);\n          version = (versionMatches && versionMatches[1]) || version;\n\n          // Compute a new file name, with the version\n          if (isNotNilOrBlank(name) && version !== 'latest') {\n            filename = `${name}-v${version}.apk`.toLowerCase();\n            title = `${name} v${version}`;\n          }\n\n          // Replace 'latest' with the app version, if present in the filename\n          else if (filename.indexOf('latest') !== -1 && version !== 'latest') {\n            filename = filename.replace('latest', version);\n          }\n        }\n\n        result.push({ name, url, platform: 'android', version, filename, title, mimeType });\n      }\n    }\n\n    // iOS\n    {\n      // Get URL (from config, or environment)\n      let url = config.getProperty(CORE_CONFIG_OPTIONS.IOS_INSTALL_URL);\n      if (isNilOrBlank(url)) url = this.environment.defaultIOSInstallUrl || null;\n\n      // Resolve relative URL\n      const peer = this.network.peer;\n      if (peer && url && (url.startsWith('./') || url.startsWith('/'))) {\n        url = Peer.path(peer, url);\n      }\n\n      // Compute App name (use config if URL is specific)\n      const name: string = isNotNilOrBlank(url) ? config.label : defaultAppName;\n\n      if (url) {\n        const version = minVersion || 'latest';\n        const title = `${name} v${version}`;\n        result.push({ name, url, platform: 'ios', version, title });\n      }\n    }\n\n    // Desktop (Electron)\n    {\n      // Get URL (from config, or environment)\n      let url = config.getProperty(CORE_CONFIG_OPTIONS.DESKTOP_INSTALL_URL);\n      if (isNilOrBlank(url)) url = this.environment.defaultDesktopInstallUrl || null;\n\n      // Resolve relative URL\n      const peer = this.network.peer;\n      if (peer && url && (url.startsWith('./') || url.startsWith('/'))) {\n        url = Peer.path(peer, url);\n      }\n\n      // Compute App name (use config if URL is specific)\n      const name: string = isNotNilOrBlank(url) ? config.label : defaultAppName;\n\n      if (url) {\n        const version = minVersion || 'latest';\n        const title = `${name} v${version}`;\n        result.push({ name, url, platform: 'electron', version, title });\n      }\n    }\n\n    return result;\n  }\n\n  private listenDownloadJobs() {\n    // Listening downloading promise, if exists\n    (this.upgradeLinks || []).forEach((link) => {\n      const job = this.platform.getDownloadingJob(link.url);\n      if (job) {\n        link.downloading = true;\n        this.listenDownloadJob(link.url, job)\n          .then((location) => {\n            link.location = location;\n            link.downloading = false;\n          })\n          .catch(() => (link.downloading = false))\n          .then(() => this.markForCheck());\n      }\n    });\n  }\n\n  private async listenDownloadJob(url: string, job: Observable<string>): Promise<string> {\n    if (!url || !job) return; // Skip\n\n    try {\n      // Mark as downloading\n      if (!this.downloading) {\n        console.info(`[install-upgrade-card] Asking platform to download '${url}'...`);\n        this.downloading = true;\n        this.markForCheck();\n      } else {\n        console.info(`[install-upgrade-card] Platform is already downloading!`);\n      }\n\n      const location = await firstValueFrom(job);\n      if (location) {\n        console.info('[install-upgrade-card] File downloaded at: ' + location);\n        this.showDownloadCompleteDialog();\n      }\n      return location;\n    } catch (err) {\n      // Failed: display a toast\n      console.error('[install-upgrade-card] Download failed: ' + ((err && err.message) || err));\n      this.showDownloadFailedToast(err);\n      throw err;\n    } finally {\n      this.downloading = false;\n      this.markForCheck();\n    }\n  }\n\n  private showDownloadFailedToast(err) {\n    return this.showToast({\n      message: 'ERROR.DOWNLOAD_FAILED',\n      messageParams: { error: err },\n      type: 'error',\n      showCloseButton: true,\n    });\n  }\n\n  private async showDownloadCompleteDialog() {\n    if (!this._subscription) return; // Skip if component has been destroyed\n\n    const translations = await this.translate.instant(['INFO.ALERT_HEADER', 'INFO.UPDATE_APP_DOWNLOADED', 'COMMON.BTN_CLOSE']);\n    const alert = await this.alertController.create({\n      header: translations['INFO.ALERT_HEADER'],\n      message: translations['INFO.UPDATE_APP_DOWNLOADED'],\n      buttons: [\n        {\n          text: translations['COMMON.BTN_CLOSE'],\n          role: 'cancel',\n          cssClass: 'secondary',\n        },\n      ],\n    });\n\n    await alert.present();\n    await alert.onDidDismiss();\n  }\n\n  private markForCheck() {\n    if (!this._subscription) return; // Skip if destroyed\n    this.cd.markForCheck();\n  }\n\n  private async showToast(opts: ShowToastOptions) {\n    if (!this._subscription) return; // Skip if component has been destroyed\n    await Toasts.show(this.toastController, this.translate, opts);\n  }\n}\n","<!-- Offline mode card-->\n<ion-card\n  *ngIf=\"showOfflineWarning && ((!loading && offline) || waitingNetwork)\"\n  color=\"accent\"\n  class=\"main ion-no-margin\"\n  @slideUpDownAnimation\n>\n  <ion-card-content class=\"ion-no-padding\">\n    <ion-grid>\n      <ion-row>\n        <ion-col>\n          @if (waitingNetwork) {\n            <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT' | translate\"></ion-text>\n          } @else {\n            <ion-text class=\"ion-text-wrap\">\n              <h4>\n                @if (isLogin) {\n                  <b [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED' | translate\"></b>\n                } @else {\n                  <b [innerHTML]=\"'NETWORK.INFO.OFFLINE' | translate\"></b>\n                }\n              </h4>\n              <h3>\n                <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP' | translate\"></small>\n              </h3>\n            </ion-text>\n          }\n        </ion-col>\n        <ion-col size=\"auto\" class=\"ion-align-items-end\">\n          <!-- Retry button -->\n          @if (waitingNetwork) {\n            <ion-spinner color=\"light\"></ion-spinner>\n          } @else {\n            <ion-button color=\"tertiary\" class=\"ion-float-end\" (click)=\"tryOnline()\">\n              <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n            </ion-button>\n          }\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card\n  *ngIf=\"showUpgradeWarning && !loading && !offline && upgradeLinks\"\n  color=\"accent\"\n  class=\"ion-no-margin\"\n  @slideUpDownAnimation\n>\n  <ion-card-content class=\"ion-no-padding\">\n    <ion-grid>\n      <ion-row *ngFor=\"let link of upgradeLinks; last as last\">\n        <ion-col>\n          <ion-text class=\"ion-text-wrap\">\n            <h3>\n              @if (link.version) {\n                <span [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION' | translate: link\"></span>\n              } @else {\n                <span [innerHTML]=\"'INFO.UPDATE_APP' | translate: link\"></span>\n              }\n            </h3>\n            <h4>\n              @if (last) {\n                <small [innerHTML]=\"'INFO.UPDATE_APP_HELP' | translate\"></small>\n              }\n            </h4>\n          </ion-text>\n        </ion-col>\n\n        <ion-col size=\"auto\">\n          <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card\n  *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n  color=\"secondary\"\n  class=\"ion-no-margin\"\n  @slideUpDownAnimation\n>\n  <ion-card-content class=\"ion-no-padding\">\n    <ion-grid>\n      <ion-row *ngFor=\"let link of installLinks; last as last\">\n        <ion-col size=\"12\" size-sm=\"8\">\n          <ion-text class=\"ion-text-wrap\">\n            <h3\n              [innerHTML]=\"\n                'INFO.DOWNLOAD_APP_TITLE' | translate: { name: link.name, platform: getPlatformName(link.platform) }\n              \"\n            ></h3>\n            <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP' | translate\"></small></h4>\n          </ion-text>\n        </ion-col>\n        <ion-col size=\"12\" size-sm=\"4\">\n          <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </ion-card-content>\n</ion-card>\n\n<!-- Display a download button, depending on the link URL, and the device platform -->\n<ng-template #downloadButton let-link>\n  @if (link.filename) {\n    @if (hasDownloader) {\n      <!-- Download using platform -->\n      @if (!link.location) {\n        <ion-button\n          (click)=\"download($event, asLink(link))\"\n          [disabled]=\"link.downloading\"\n          color=\"tertiary\"\n          class=\"ion-float-end\"\n        >\n          <ion-icon slot=\"start\" *ngIf=\"!link.downloading\" name=\"download\"></ion-icon>\n          <ion-spinner slot=\"start\" class=\"ion-no-padding\" *ngIf=\"link.downloading\"></ion-spinner>\n          <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n        </ion-button>\n      } @else {\n        <!-- Open APK button -->\n        <ion-button (click)=\"openFile($event, link)\" color=\"tertiary\" class=\"ion-float-end\">\n          <ion-label translate>COMMON.BTN_INSTALL</ion-label>\n        </ion-button>\n      }\n    } @else {\n      <!-- Web download button -->\n      <ion-button [download]=\"link.filename\" [href]=\"link.url\" color=\"tertiary\" class=\"ion-float-end\">\n        <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n      </ion-button>\n    }\n  } @else {\n    <!-- Web redirect button -->\n    <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n      <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n    </ion-button>\n    @if (debug) {\n      <ion-note>{{ link.url }}</ion-note>\n    }\n  }\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { AppInstallUpgradeCard } from './install-upgrade-card.component';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild()],\n  declarations: [\n    // Components\n    AppInstallUpgradeCard,\n  ],\n  exports: [\n    TranslateModule,\n    // Components\n    AppInstallUpgradeCard,\n  ],\n})\nexport class AppInstallUpgradeCardModule {}\n","import { ValidatorService } from '@e-is/ngx-material-table';\nimport { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { IValidatorService } from '../../../shared/services/validator-service.class';\nimport { Directive } from '@angular/core';\nimport { AppFormUtils } from '../../form/form.utils';\nimport { changeCaseToUnderscore } from '../../../shared/functions';\nimport { TranslateService } from '@ngx-translate/core';\nimport { FormErrors } from '../../../shared/forms';\n\n@Directive()\nexport abstract class AppValidatorService<T = any, O = any> extends ValidatorService implements IValidatorService<T> {\n  protected constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected translate?: TranslateService\n  ) {\n    super();\n  }\n\n  getRowValidator(): UntypedFormGroup {\n    return this.getFormGroup();\n  }\n\n  getFormGroup(data?: T, opts?: O): UntypedFormGroup {\n    return this.formBuilder.group(this.getFormGroupConfig(data));\n  }\n\n  getFormGroupConfig(data?: T, opts?: O): { [key: string]: any[] } {\n    return {};\n  }\n\n  getI18nFormErrors(control: AbstractControl): string[] {\n    const errors = AppFormUtils.getFormErrors(control);\n    return this.getI18nErrors(errors);\n  }\n\n  getI18nErrors(errors: FormErrors): string[] {\n    return Object.keys(errors || {}).map((errorKey) => this.getI18nError(errorKey, errors[errorKey]));\n  }\n\n  protected getI18nError(errorKey: string, errorContent?: any): string {\n    const i18nKey = 'ERROR.FIELD_' + changeCaseToUnderscore(errorKey).toUpperCase();\n    const i18nMessage = this.translate.instant(i18nKey, errorContent);\n    if (i18nKey !== i18nMessage) return i18nMessage;\n    if (typeof errorContent === 'string') return errorContent;\n\n    // Not translated: show error\n    console.error(`[validator] Cannot translate error key '${errorKey}'. Please override getI18nError() in your validator`);\n\n    return changeCaseToUnderscore(errorKey);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { UntypedFormBuilder, ValidatorFn, Validators } from '@angular/forms';\nimport { Person, PersonUtils } from '../../core/services/model/person.model';\nimport { SharedValidators } from '../../shared/validator/validators';\nimport { StatusIds } from '../../core/services/model/model.enum';\nimport { AccountService } from '../../core/services/account.service';\nimport { FormFieldDefinition } from '../../shared/form/field.model';\nimport { AppValidatorService } from '../../core/services/validator/base.validator.class';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport interface PersonValidatorOptions {\n  withAvatar?: boolean;\n  withUsername?: boolean;\n  withUsernameExtranet?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class PersonValidatorService<T extends Person = Person, O extends PersonValidatorOptions = PersonValidatorOptions> extends AppValidatorService<\n  T,\n  O\n> {\n  constructor(\n    formBuilder: UntypedFormBuilder,\n    translate: TranslateService,\n    protected accountService: AccountService\n  ) {\n    super(formBuilder, translate);\n  }\n\n  getFormGroupConfig(data?: T, opts?: O): { [key: string]: any } {\n    opts = this.fillDefaultOptions(opts);\n\n    const formConfig: { [key: string]: any[] } = {\n      id: [''],\n      updateDate: [''],\n      creationDate: [''],\n      lastName: [data?.lastName || null, Validators.compose([Validators.required, Validators.minLength(2)])],\n      firstName: [data?.firstName || null, Validators.compose([Validators.required, Validators.minLength(2)])],\n      email: [data?.email || null, Validators.compose([Validators.required, Validators.email])],\n      mainProfile: [data?.mainProfile || PersonUtils.getMainProfile(data?.profiles) || 'GUEST', Validators.required],\n      statusId: [data?.statusId || StatusIds.TEMPORARY, Validators.required],\n      pubkey: [data?.pubkey || null, SharedValidators.pubkey]\n    };\n\n    if (opts.withAvatar) {\n      formConfig.avatar = [data?.avatar || null];\n    }\n    if (opts.withUsername) {\n      formConfig.username = [(data && data.username) || null, Validators.minLength(2)];\n    }\n    if (opts.withUsernameExtranet) {\n      formConfig.usernameExtranet = [(data && data.usernameExtranet) || null, Validators.minLength(2)];\n    }\n\n    // Add additional fields\n    this.accountService.additionalFields\n      .filter(field => field.extra.registration || field.extra.account)\n      .forEach((field) => {\n        //console.debug(\"[register-form] Add additional field {\" + field.name + \"} to form\", field);\n        formConfig[field.key] = [(data && data[field.key]) || null, this.getValidators(field)];\n      });\n\n    return formConfig;\n  }\n\n  getValidators(field: FormFieldDefinition, required?: boolean): ValidatorFn | ValidatorFn[] {\n    const validatorFns: ValidatorFn[] = [];\n    required = required ?? field.extra?.account?.required ?? false;\n    if (required) {\n      validatorFns.push(Validators.required);\n    }\n    if (field.type === 'entity') {\n      validatorFns.push(SharedValidators.entity);\n    }\n    if (field.type === 'entities') {\n      validatorFns.push(SharedValidators.entities);\n    }\n\n    return validatorFns.length ? Validators.compose(validatorFns) : validatorFns.length === 1 ? validatorFns[0] : undefined;\n  }\n\n  /* -- protected methods -- */\n\n  protected fillDefaultOptions(opts?: O): O {\n    return {\n      withAvatar: true,\n      withUsername: true,\n      withUsernameExtranet: true,\n      ...opts,\n    };\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { AppValidatorService } from './base.validator.class';\nimport { UserSettings } from '../model/account.model';\n\n@Injectable({ providedIn: 'root' })\nexport class UserSettingsValidatorService extends AppValidatorService<UserSettings> {\n  constructor(formBuilder: UntypedFormBuilder) {\n    super(formBuilder);\n  }\n\n  getFormGroup(data?: UserSettings): UntypedFormGroup {\n    return this.formBuilder.group({\n      id: [data?.id || null],\n      updateDate: [data?.updateDate || null],\n      locale: [data?.locale || null, Validators.required],\n      latLongFormat: [data?.latLongFormat || null, Validators.required],\n      content: [data?.content || null],\n      nonce: [data?.nonce || null],\n    });\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { UntypedFormBuilder } from '@angular/forms';\nimport { Account } from '../model/account.model';\nimport { AccountService } from '../account.service';\nimport { UserSettingsValidatorService } from './user-settings.validator';\nimport { PersonValidatorOptions, PersonValidatorService } from '../../../admin/users/person.validator';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport interface AccountValidatorOptions extends PersonValidatorOptions {\n  withSettings?: boolean;\n  withTokens?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AccountValidatorService<\n  T extends Account = Account,\n  O extends AccountValidatorOptions = AccountValidatorOptions,\n> extends PersonValidatorService<T, O> {\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected translate: TranslateService,\n    protected accountService: AccountService,\n    protected userSettingsValidatorService: UserSettingsValidatorService\n  ) {\n    super(formBuilder, translate, accountService);\n  }\n\n  getFormGroupConfig(data?: T, opts?: O): { [key: string]: any[] } {\n    opts = this.fillDefaultOptions(opts);\n\n    const formConfig = super.getFormGroupConfig(data, opts);\n\n    if (opts.withSettings) {\n      formConfig.settings = this.userSettingsValidatorService.getFormGroup(data?.settings);\n    }\n    if (opts.withTokens) {\n      formConfig.tokens = [data?.tokens || null];\n    }\n\n    return formConfig;\n  }\n\n  protected fillDefaultOptions(opts?: O): O {\n    return {\n      withAvatar: true,\n      withSettings: true,\n      withTokens: true,\n      ...super.fillDefaultOptions(opts),\n    };\n  }\n}\n","import { Component, EventEmitter, Inject, OnInit, Output, ViewChild } from '@angular/core';\nimport {\n  AbstractControl,\n  AsyncValidatorFn,\n  UntypedFormBuilder,\n  UntypedFormControl,\n  UntypedFormGroup,\n  ValidationErrors,\n  ValidatorFn,\n  Validators,\n} from '@angular/forms';\nimport { AccountService, RegisterData } from '../services/account.service';\nimport { Account } from '../services/model/account.model';\nimport { referentialToString } from '../services/model/referential.model';\nimport { MatStepper } from '@angular/material/stepper';\nimport { delay, Observable, of, Subscription } from 'rxjs';\nimport { AccountValidatorService } from '../services/validator/account.validator';\nimport { FormFieldDefinition } from '../../shared/form/field.model';\nimport { mergeMap } from 'rxjs/operators';\nimport { LocalSettingsService } from '../services/local-settings.service';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { MatAutocompleteConfigHolder } from '../../shared/material/autocomplete/material.autocomplete.config';\nimport { isNotNil } from '../../shared/functions';\n\n@Component({\n  selector: 'app-register-form',\n  templateUrl: 'register.form.html',\n  styleUrls: ['./register.form.scss'],\n})\nexport class RegisterForm implements OnInit {\n  protected debug = false;\n\n  autocompleteHelper: MatAutocompleteConfigHolder;\n  additionalFields: FormFieldDefinition[];\n  form: UntypedFormGroup;\n  forms: UntypedFormGroup[];\n  subscriptions: Subscription[] = [];\n  error: string;\n  sending = false;\n\n  showPwd = false;\n  showConfirmPwd = false;\n\n  @ViewChild('stepper', { static: true }) private stepper: MatStepper;\n\n  @Output()\n  onCancel = new EventEmitter<any>();\n\n  @Output()\n  onSubmit = new EventEmitter<RegisterData>();\n\n  constructor(\n    private accountService: AccountService,\n    private accountValidatorService: AccountValidatorService,\n    public formBuilder: UntypedFormBuilder,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    protected settings?: LocalSettingsService\n  ) {\n    this.forms = [];\n    // Email form\n    this.forms.push(\n      formBuilder.group({\n        email: new UntypedFormControl(null, Validators.compose([Validators.required, Validators.email]), this.emailAvailability(this.accountService)),\n        confirmEmail: new UntypedFormControl(null, Validators.compose([Validators.required, this.equalsValidator('email')])),\n      })\n    );\n\n    // Password form\n    this.forms.push(\n      formBuilder.group({\n        password: new UntypedFormControl(null, Validators.compose([Validators.required, Validators.minLength(8)])),\n        confirmPassword: new UntypedFormControl(null, Validators.compose([Validators.required, this.equalsValidator('password')])),\n      })\n    );\n\n    // Detail form\n    const formDetailDef = {\n      lastName: new UntypedFormControl(null, Validators.compose([Validators.required, Validators.minLength(2)])),\n      firstName: new UntypedFormControl(null, Validators.compose([Validators.required, Validators.minLength(2)])),\n    };\n\n    // Prepare autocomplete settings\n    this.autocompleteHelper = new MatAutocompleteConfigHolder(\n      settings && {\n        getUserAttributes: (a, b) => settings.getFieldDisplayAttributes(a, b),\n      }\n    );\n\n    // Add additional fields to details form\n    this.additionalFields = this.accountService.additionalFields\n      // Keep only required fields\n      .filter((field) => field.extra?.registration && field.extra.registration.disabled !== false)\n      .map((field) => {\n        //if (this.debug) console.debug(\"[register-form] Add additional field {\" + field.name + \"} to form\", field);\n        formDetailDef[field.key] = new UntypedFormControl(null, this.accountValidatorService.getValidators(field, field.extra.registration.required));\n\n        if (isNotNil(field.autocomplete)) {\n          field.autocomplete = this.autocompleteHelper.add(field.key, field.autocomplete);\n        }\n        return field;\n      });\n\n    this.forms.push(formBuilder.group(formDetailDef));\n\n    this.form = formBuilder.group({\n      emailStep: this.forms[0],\n      passwordStep: this.forms[1],\n      detailsStep: this.forms[2],\n    });\n  }\n\n  ngOnInit() {\n    // For DEV only ------------------------\n    if (!this.environment.production) {\n      this.form.setValue({\n        emailStep: {\n          email: 'contact@e-is.pro',\n          confirmEmail: 'contact@e-is.pro',\n        },\n        passwordStep: {\n          password: 'contactera',\n          confirmPassword: 'contactera',\n        },\n        detailsStep: {\n          lastName: 'Lavenier 2',\n          firstName: 'Benoit',\n          department: null,\n          programs: null\n        },\n      });\n    }\n  }\n\n  get value(): RegisterData {\n    const result: RegisterData = {\n      username: this.form.value.emailStep.email,\n      password: this.form.value.passwordStep.password,\n      account: new Account(),\n    };\n    result.account.fromObject(this.form.value.detailsStep);\n    result.account.email = result.username;\n\n    return result;\n  }\n\n  get valid(): boolean {\n    return this.form.valid;\n  }\n\n  isEnd(): boolean {\n    return this.stepper.selectedIndex === 2;\n  }\n\n  isBeginning(): boolean {\n    return this.stepper.selectedIndex === 0;\n  }\n\n  slidePrev() {\n    return this.stepper.previous();\n  }\n\n  slideNext(event?: Event) {\n    if (event) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n    return this.stepper.next();\n  }\n\n  equalsValidator(otherControlName: string): ValidatorFn {\n    return function (c: AbstractControl): ValidationErrors | null {\n      if (c.parent && c.value !== c.parent.value[otherControlName]) {\n        return {\n          equals: true,\n        };\n      }\n      return null;\n    };\n  }\n\n  emailAvailability(accountService: AccountService): AsyncValidatorFn {\n    return function (control: AbstractControl): Observable<ValidationErrors | null> {\n      return of(null).pipe(\n        delay(500),\n        mergeMap(() =>\n          accountService\n            .checkEmailAvailable(control.value)\n            .then((res) => null)\n            .catch((err) => {\n              console.error(err);\n              return { availability: true };\n            })\n        )\n      );\n    };\n  }\n\n  cancel() {\n    this.onCancel.emit();\n  }\n\n  doSubmit(event?: any) {\n    if (this.form.invalid) return;\n    this.sending = true;\n    this.onSubmit.emit(this.value);\n  }\n\n  referentialToString = referentialToString;\n\n  markAsTouched() {\n    this.form.markAsTouched();\n  }\n\n  disable() {\n    this.form.disable();\n  }\n\n  enable() {\n    this.form.enable();\n  }\n}\n","<mat-horizontal-stepper linear #stepper=\"matHorizontalStepper\">\n  <!-- Step 1: Username -->\n  <mat-step [stepControl]=\"forms[0]\" *ngIf=\"forms[0].controls; let controls\">\n    <form [formGroup]=\"forms[0]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n      <ng-template matStepLabel>{{ 'REGISTER.STEP_EMAIL' | translate }}</ng-template>\n\n      <!-- Email -->\n      <mat-form-field>\n        <mat-label>{{ 'USER.EMAIL' | translate }}</mat-label>\n        <input\n          matInput\n          [appAutofocus]=\"true\"\n          [autofocusDelay]=\"500\"\n          formControlName=\"email\"\n          autocomplete=\"off\"\n          required\n        />\n        <mat-error *ngIf=\"controls.email.hasError('required') && controls.email.touched\" translate>\n          ERROR.FIELD_REQUIRED\n        </mat-error>\n        <mat-error\n          *ngIf=\"controls.email.hasError('email') && !controls.email.hasError('required') && controls.email.touched\"\n        >\n          <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n        </mat-error>\n        <mat-error *ngIf=\"controls.email.hasError('availability') && controls.email.touched\" translate>\n          REGISTER.ERROR.EMAIL_ALREADY_REGISTERED\n        </mat-error>\n      </mat-form-field>\n\n      <!-- Confirm Email -->\n      <mat-form-field>\n        <mat-label>{{ 'REGISTER.CONFIRM_EMAIL' | translate }}</mat-label>\n        <input matInput autocomplete=\"off\" matFormFieldControl formControlName=\"confirmEmail\"/>\n        <mat-error *ngIf=\"controls.confirmEmail.hasError('required') && controls.confirmEmail.touched\" translate>\n          ERROR.FIELD_REQUIRED\n        </mat-error>\n        <mat-error *ngIf=\"controls.confirmEmail.hasError('equals') && controls.confirmEmail.touched\">\n          <span>{{ 'REGISTER.ERROR.NOT_SAME_EMAIL' | translate }}</span>\n        </mat-error>\n      </mat-form-field>\n    </form>\n  </mat-step>\n\n  <!-- Step 2: Password -->\n  <mat-step [stepControl]=\"forms[1]\" *ngIf=\"forms[1].controls; let controls\">\n    <form [formGroup]=\"forms[1]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n      <ng-template matStepLabel>{{ 'REGISTER.STEP_PASSWORD' | translate }}</ng-template>\n\n      <!-- Password -->\n      <mat-form-field>\n        <mat-label>{{ 'USER.PASSWORD' | translate }}</mat-label>\n        <input\n          matInput\n          formControlName=\"password\"\n          autocomplete=\"section-red new-password\"\n          [type]=\"showPwd ? 'text' : 'password'\"\n          required\n        />\n        <button matSuffix mat-icon-button type=\"button\" (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n          <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n        </button>\n        <mat-error *ngIf=\"controls.password.hasError('required') && controls.password.touched\" translate>\n          ERROR.FIELD_REQUIRED\n        </mat-error>\n        <mat-error *ngIf=\"controls.password.hasError('minlength') && controls.password.touched\">\n          <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 8} }}</span>\n        </mat-error>\n      </mat-form-field>\n\n      <!-- Confirm password -->\n      <mat-form-field>\n        <mat-label>{{ 'REGISTER.CONFIRM_PASSWORD' | translate }}</mat-label>\n        <input\n          matInput\n          formControlName=\"confirmPassword\"\n          autocomplete=\"section-red new-password\"\n          [type]=\"showConfirmPwd ? 'text' : 'password'\"\n          required\n        />\n        <button mat-icon-button matSuffix (click)=\"showConfirmPwd = !showConfirmPwd\" tabindex=\"-1\">\n          <mat-icon>{{ showConfirmPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n        </button>\n        <mat-error *ngIf=\"controls.confirmPassword.hasError('required') && controls.confirmPassword.touched\" translate>\n          ERROR.FIELD_REQUIRED\n        </mat-error>\n        <mat-error *ngIf=\"controls.confirmPassword.hasError('equals') && controls.confirmPassword.touched\">\n          <span>{{ 'REGISTER.ERROR.NOT_SAME_PASSWORD' | translate }}</span>\n        </mat-error>\n      </mat-form-field>\n    </form>\n  </mat-step>\n\n  <!-- Step 3: user details -->\n  <mat-step [stepControl]=\"forms[2]\" *ngIf=\"forms[2].controls; let controls\">\n    <form\n      [formGroup]=\"forms[2]\"\n      (ngSubmit)=\"doSubmit($event)\"\n      class=\"form-container ion-padding\"\n      (keyup.enter)=\"doSubmit()\"\n    >\n      <ng-template matStepLabel>{{ 'REGISTER.STEP_USER_DETAILS' | translate }}</ng-template>\n\n      <!-- error -->\n      <ion-item *ngIf=\"error && !sending\" lines=\"none\">\n        <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n        <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n      </ion-item>\n\n      <!-- Last name -->\n      <mat-form-field>\n        <mat-label>{{ 'USER.LAST_NAME' | translate }}</mat-label>\n        <input matInput formControlName=\"lastName\" autocomplete=\"section-blue family-name\" required/>\n        <mat-error *ngIf=\"controls.lastName.hasError('required') && controls.lastName.dirty\" translate>\n          ERROR.FIELD_REQUIRED\n        </mat-error>\n        <mat-error *ngIf=\"controls.lastName.hasError('minlength') && controls.lastName.dirty\">\n          <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 2} }}</span>\n        </mat-error>\n      </mat-form-field>\n\n      <!-- First name -->\n      <mat-form-field>\n        <mat-label>{{ 'USER.FIRST_NAME' | translate }}</mat-label>\n        <input matInput formControlName=\"firstName\" autocomplete=\"section-blue given-name\" required/>\n        <mat-error *ngIf=\"controls.firstName.hasError('required') && controls.firstName.dirty\" translate>\n          ERROR.FIELD_REQUIRED\n        </mat-error>\n        <mat-error *ngIf=\"controls.firstName.hasError('minlength') && controls.firstName.dirty\">\n          <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 2} }}</span>\n        </mat-error>\n      </mat-form-field>\n\n      <!-- Additional fields -->\n      @for (field of additionalFields; track field.key) {\n        @if (field.extra.registration?.description; as description) {\n          <ion-text>\n            <p [innerHTML]=\"description | translate\"></p>\n          </ion-text>\n        }\n        <app-form-field\n          [definition]=\"field\"\n          [formControlName]=\"field.key\"\n          [required]=\"field.extra?.registration.required ?? field.extra?.account.required ?? false\"\n        ></app-form-field>\n      }\n    </form>\n  </mat-step>\n</mat-horizontal-stepper>\n","import { Component, ViewChild } from '@angular/core';\nimport { ModalController } from '@ionic/angular';\nimport { AccountService } from '../services/account.service';\nimport { RegisterForm } from './register.form';\n\n@Component({\n  selector: 'app-register-modal',\n  templateUrl: 'register.modal.html',\n})\nexport class RegisterModal {\n  sending = false;\n\n  @ViewChild('form', { static: true }) private form: RegisterForm;\n\n  constructor(\n    private accountService: AccountService,\n    public viewCtrl: ModalController\n  ) {}\n\n  cancel() {\n    console.debug('[register] cancelled');\n    this.viewCtrl.dismiss();\n  }\n\n  async doSubmit(event?: any) {\n    if (this.form.form.disabled || this.sending) return; // Skip\n    if (!this.form.valid || !this.form.isEnd()) {\n      this.form.markAsTouched();\n      return;\n    }\n\n    this.sending = true;\n    const data = this.form.value;\n\n    this.form.disable();\n\n    try {\n      console.debug('[register] Sending registration to server...', data);\n      const res = await this.accountService.register(data);\n\n      console.debug('[register] Account registered!');\n      await this.viewCtrl.dismiss();\n    } catch (err) {\n      this.form.error = (err && err.message) || err;\n      this.form.enable();\n    } finally {\n      this.sending = false;\n    }\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"secondary\">\n    <ion-buttons slot=\"start\">\n      <ion-button *ngIf=\"form.isBeginning()\" (click)=\"cancel()\" visible-xs visible-sm visible-mobile>\n        <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n      </ion-button>\n      <ion-button *ngIf=\"!form.isBeginning()\" (click)=\"form.slidePrev()\" visible-xs visible-sm visible-mobile>\n        <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n\n    <ion-title translate>REGISTER.TITLE</ion-title>\n\n    <ion-buttons slot=\"end\">\n      <ion-spinner *ngIf=\"sending\"></ion-spinner>\n\n      <ion-button *ngIf=\"!form.isEnd()\" (click)=\"form.slideNext()\" visible-xs visible-sm visible-mobile>\n        <ion-label translate>COMMON.BTN_NEXT</ion-label>\n        <ion-icon slot=\"end\" name=\"arrow-forward\"></ion-icon>\n      </ion-button>\n\n      <ion-button *ngIf=\"form.isEnd() && !sending\" (click)=\"doSubmit()\" visible-xs visible-sm visible-mobile>\n        <ion-icon slot=\"icon-only\" name=\"send\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <app-register-form #form (onSubmit)=\"doSubmit()\" (onCancel)=\"cancel()\"></app-register-form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <!-- buttons -->\n  <ion-toolbar>\n    <ion-row>\n      <ion-col></ion-col>\n      <ion-col size=\"auto\">\n        <ion-button *ngIf=\"form.isBeginning()\" fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n\n        <ion-button\n          *ngIf=\"!form.isBeginning()\"\n          fill=\"clear\"\n          color=\"dark\"\n          (click)=\"form.slidePrev()\"\n          [disabled]=\"sending\"\n        >\n          <ion-icon slot=\"start\" name=\"arrow-back\"></ion-icon>\n          <ion-label translate>COMMON.BTN_BACK</ion-label>\n        </ion-button>\n\n        <ion-button *ngIf=\"!form.isEnd()\" (click)=\"form.slideNext()\" fill=\"solid\" color=\"tertiary\">\n          <ion-label translate>COMMON.BTN_NEXT</ion-label>\n          <ion-icon slot=\"end\" name=\"arrow-forward\"></ion-icon>\n        </ion-button>\n\n        <ion-button *ngIf=\"form.isEnd()\" (click)=\"doSubmit()\" fill=\"solid\" [disabled]=\"sending\" color=\"tertiary\">\n          <span translate>COMMON.BTN_SEND</span>\n          <ion-icon slot=\"end\" name=\"send\"></ion-icon>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector, Input } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormControl, Validators } from '@angular/forms';\nimport { AppForm } from '../form.class';\nimport { isMobile } from '../../../shared/platforms';\n\n@Component({\n  selector: 'app-username-form',\n  templateUrl: 'username.form.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppUsernameForm extends AppForm<{ username: string }> {\n  @Input({ transform: booleanAttribute }) mobile: boolean;\n  @Input() usernamePlaceHolder: string = 'USER.EMAIL';\n  @Input({ transform: booleanAttribute }) emailValidator = true;\n\n  constructor(\n    injector: Injector,\n    formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef\n  ) {\n    super(\n      injector,\n      formBuilder.group({\n        username: new UntypedFormControl(null, Validators.required),\n      })\n    );\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n    this.mobile = this.mobile ?? isMobile(window);\n\n    const userNameControl = this.form.get('username');\n    if (!this.emailValidator && userNameControl.hasValidator(Validators.email)) {\n      userNameControl.removeValidators(Validators.email);\n    } else if (this.emailValidator && !userNameControl.hasValidator(Validators.email)) {\n      userNameControl.addValidators(Validators.email);\n    }\n  }\n\n  markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<form *ngIf=\"form.controls; let controls\" [formGroup]=\"form\" class=\"form-container\">\n  <!-- Username -->\n  @let formControl = form | formGetControl: 'username';\n  <mat-form-field>\n    <mat-label>{{ usernamePlaceHolder | translate }}</mat-label>\n    <input\n      matInput\n      [appAutofocus]=\"!mobile\"\n      [autofocusDelay]=\"500\"\n      formControlName=\"username\"\n      autocomplete=\"off\"\n      required\n    />\n\n    <!-- error -->\n    <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n      @switch (errorKey) {\n        @case ('required') {\n          <span translate>ERROR.FIELD_REQUIRED</span>\n        }\n        @case ('email') {\n          <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n        }\n      }\n    </mat-error>\n  </mat-form-field>\n</form>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core';\nimport { ModalController, ToastController } from '@ionic/angular';\nimport { AccountService } from '../services/account.service';\nimport { AppUsernameForm } from '../form/username/username.form';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { TranslateService } from '@ngx-translate/core';\nimport { slideUpDownAnimation } from '../../shared/material/material.animations';\nimport { filter } from 'rxjs/operators';\nimport { Subscription, TeardownLogic } from 'rxjs';\n\n@Component({\n  selector: 'app-reset-password-modal',\n  templateUrl: 'reset-password.modal.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  animations: [slideUpDownAnimation],\n})\nexport class AppResetPasswordModal implements OnInit {\n  protected readonly subscription = new Subscription();\n  protected sending = false;\n\n  @Input() username: string;\n  @Input() usernamePlaceholder: string;\n  @Input() emailValidator = true;\n\n  @ViewChild('form', { static: true }) private form: AppUsernameForm;\n\n  constructor(\n    protected accountService: AccountService,\n    protected viewCtrl: ModalController,\n    protected toastController: ToastController,\n    protected translate: TranslateService,\n    protected cd: ChangeDetectorRef\n  ) {}\n\n  ngOnInit() {\n    this.form.setValue({ username: this.username });\n    this.form.enable();\n\n    // Reset error if form changed\n    this.registerSubscription(this.form.form.valueChanges.pipe(filter(() => !this.sending)).subscribe(() => (this.form.error = null)));\n  }\n\n  async cancel() {\n    console.debug('[reset-password] cancelled');\n    await this.viewCtrl.dismiss();\n  }\n\n  async doSubmit(event?: any) {\n    if (this.sending) return;\n\n    this.sending = true;\n    const data = this.form.value;\n\n    this.form.error = null;\n    this.form.disable();\n\n    try {\n      console.debug(`[reset-password] Asking password reset for user '${data.username}' ...`);\n      await this.accountService.sendResetPasswordEmail(data.username);\n      await this.viewCtrl.dismiss();\n\n      await this.showToast({ message: 'AUTH.CONFIRM.RESET_PASSWORD_SENT', type: 'info', showCloseButton: true });\n    } catch (err) {\n      console.error('[reset-password] Error while sending password reset email', err);\n      this.form.error = err?.message || err;\n      this.form.enable();\n    } finally {\n      this.sending = false;\n      this.markForCheck();\n    }\n  }\n\n  protected async showToast(opts: ShowToastOptions) {\n    await Toasts.show(this.toastController, this.translate, opts);\n  }\n\n  protected registerSubscription(teardown: TeardownLogic) {\n    this.subscription.add(teardown);\n  }\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"secondary\">\n    <ion-buttons slot=\"start\">\n      <ion-button (click)=\"cancel()\" class=\"visible-xs visible-sm visible-mobile\">\n        <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n\n    <ion-title>{{ 'AUTH.RESET_PASSWORD.TITLE' | translate }}</ion-title>\n\n    <ion-buttons slot=\"end\">\n      @if (sending) {\n        <ion-spinner></ion-spinner>\n      } @else {\n        <ion-button (click)=\"doSubmit()\" class=\"visible-xs visible-sm visible-mobile\">\n          <ion-icon slot=\"icon-only\" name=\"checkmark\"></ion-icon>\n        </ion-button>\n      }\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <!-- error -->\n  <ion-item *ngIf=\"form.errorSubject | async; let error\" lines=\"none\" @slideUpDownAnimation>\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n\n  <ion-text>\n    <p [innerHTML]=\"'AUTH.RESET_PASSWORD.HELP' | translate\"></p>\n  </ion-text>\n\n  <app-username-form\n    #form\n    [usernamePlaceHolder]=\"usernamePlaceholder\"\n    [emailValidator]=\"emailValidator\"\n    (onSubmit)=\"doSubmit()\"\n    (onCancel)=\"cancel()\"\n  ></app-username-form>\n</ion-content>\n\n<ion-footer class=\"hidden-xs hidden-sm hidden-mobile\">\n  <!-- buttons -->\n  <ion-toolbar>\n    <ion-row>\n      <ion-col>\n        <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n          <ion-label>{{ 'COMMON.BTN_CANCEL' | translate }}</ion-label>\n        </ion-button>\n      </ion-col>\n      <ion-col size=\"auto\">\n        <ion-button (click)=\"doSubmit()\" fill=\"solid\" [disabled]=\"sending\" color=\"tertiary\">\n          <span translate>AUTH.RESET_PASSWORD.BTN_SEND</span>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Injector, OnInit, Optional, Output } from '@angular/core';\nimport { UntypedFormBuilder, Validators } from '@angular/forms';\nimport { ModalController } from '@ionic/angular';\nimport { RegisterModal } from '../register/register.modal';\nimport { AuthData } from '../services/account.service';\nimport { NetworkService } from '../services/network.service';\nimport { AuthTokenType } from '../services/network.types';\nimport { LocalSettingsService } from '../services/local-settings.service';\nimport { slideUpDownAnimation } from '../../shared/material/material.animations';\nimport { AppForm } from '../form/form.class';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { CORE_CONFIG_OPTIONS } from '../services/config/core.config';\nimport { ConfigService } from '../services/config.service';\nimport { AppFormUtils } from '../form/form.utils';\nimport { AppResetPasswordModal } from './reset-password.modal';\n\n@Component({\n  selector: 'app-auth-form',\n  templateUrl: 'auth.form.html',\n  styleUrls: ['./auth.form.scss'],\n  animations: [slideUpDownAnimation],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppAuthForm extends AppForm<AuthData> implements OnInit {\n  protected readonly mobile: boolean;\n  protected canWorkOffline = false;\n  protected showPwd = false;\n  protected canRegister: boolean;\n  protected canResetPassword: boolean;\n  protected usernamePlaceholder: string;\n\n  @Output() onCancel = new EventEmitter<any>();\n  @Output() onSubmit = new EventEmitter<AuthData>();\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    super.disable(opts);\n    this.showPwd = false; // Hide pwd when disable (e.g. when submitted)\n  }\n\n  constructor(\n    injector: Injector,\n    formBuilder: UntypedFormBuilder,\n    settings: LocalSettingsService,\n    private configService: ConfigService,\n    private modalCtrl: ModalController,\n    public network: NetworkService,\n    private cd: ChangeDetectorRef,\n    @Optional() @Inject(ENVIRONMENT) protected environment: Environment\n  ) {\n    super(\n      injector,\n      formBuilder.group({\n        username: [null, Validators.required],\n        password: [null, Validators.required],\n        offline: [network.offline],\n      })\n    );\n\n    this.mobile = settings.mobile;\n    this.canWorkOffline = this.settings.hasOfflineFeature();\n    this._enabled = true;\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Load config, to set username's label and validator\n    this.registerSubscription(\n      this.configService.config.subscribe((config) => {\n        // Set the username placeholder, with email or username\n        const tokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE) as AuthTokenType;\n        if (tokenType === 'token') {\n          this.usernamePlaceholder = 'USER.EMAIL';\n          this.form.get('username').setValidators(Validators.compose([Validators.required, Validators.email]));\n        } else {\n          this.usernamePlaceholder = 'USER.USERNAME';\n          this.form.get('username').setValidators(Validators.required);\n        }\n\n        // Enable/disable registration link\n        this.canRegister = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.REGISTRATION_ENABLE);\n\n        // Enable/Disable reset password link\n        this.canResetPassword = tokenType == 'token' && config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.AUTH_RESET_PASSWORD_ENABLE);\n\n        this.markForCheck();\n      })\n    );\n\n    // For DEV only\n    if (this.environment && this.environment.production === false && this.environment.defaultAuthValues) {\n      // Set the default user, for testing.\n      // Override using environment, if any\n      this.form.patchValue(this.environment.defaultAuthValues);\n    }\n  }\n\n  async cancel() {\n    this.onCancel.emit();\n  }\n\n  async doSubmit(event?: Event) {\n    if (event) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    if (this.loading) return;\n\n    if (!this.form.valid) {\n      await AppFormUtils.waitWhilePending(this.form);\n      if (this.form.invalid) {\n        AppFormUtils.logFormErrors(this.form);\n        return; // Skip if invalid\n      }\n    }\n\n    this.markAsLoading();\n    const data = this.form.value;\n    this.showPwd = false; // Hide password\n    this.error = null; // Reset error\n\n    setTimeout(() =>\n      this.onSubmit.emit({\n        username: data.username,\n        password: data.password,\n        offline: data.offline,\n      })\n    );\n  }\n\n  register() {\n    this.onCancel.emit();\n    setTimeout(async () => {\n      const modal = await this.modalCtrl.create({\n        component: RegisterModal,\n        backdropDismiss: false,\n      });\n      return modal.present();\n    }, 200);\n  }\n\n  resetPassword() {\n    this.onCancel.emit();\n    const data = this.form.value;\n\n    setTimeout(async () => {\n      const modal = await this.modalCtrl.create({\n        component: AppResetPasswordModal,\n        componentProps: {\n          username: data.username || null,\n          usernamePlaceholder: this.usernamePlaceholder,\n        },\n        backdropDismiss: false,\n      });\n      return modal.present();\n    }, 200);\n  }\n\n  /* -- protected functions -- */\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<form\n  [formGroup]=\"form\"\n  novalidate\n  (ngSubmit)=\"doSubmit($event)\"\n  class=\"form-container ion-padding\"\n  (keyup.enter)=\"doSubmit($event)\"\n>\n  <!-- error -->\n  <ion-item lines=\"none\" *ngIf=\"error && !loading\" @slideUpDownAnimation>\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n\n  <!-- Username -->\n  <mat-form-field>\n    <mat-label>{{ usernamePlaceholder | translate }}</mat-label>\n    <input\n      matInput\n      [appAutofocus]=\"true\"\n      [autofocusDelay]=\"500\"\n      formControlName=\"username\"\n      autocomplete=\"off\"\n      required\n    />\n    <mat-error *ngIf=\"form.controls.username.hasError('required') && form.controls.username.dirty\">\n      {{ 'ERROR.FIELD_REQUIRED' | translate }}\n    </mat-error>\n    <mat-error *ngIf=\"form.controls.username.hasError('email') && form.controls.username.dirty\">\n      <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n    </mat-error>\n  </mat-form-field>\n\n  <!-- Password -->\n  <mat-form-field>\n    <mat-label>{{ 'USER.PASSWORD' | translate }}</mat-label>\n    <input\n      matInput\n      formControlName=\"password\"\n      autocomplete=\"section-red new-password\"\n      [type]=\"showPwd ? 'text' : 'password'\"\n      (keyup.enter)=\"doSubmit($event)\"\n      required\n    />\n\n    <!-- Show pwd button -->\n    <button matSuffix type=\"button\" mat-icon-button (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n      <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n    </button>\n    <mat-error *ngIf=\"form.controls.password.hasError('required') && form.controls.password.touched\">\n      {{ 'ERROR.FIELD_REQUIRED' | translate }}\n    </mat-error>\n  </mat-form-field>\n\n  <ng-container *ngIf=\"canWorkOffline\">\n    <!-- Force offline (desktop) -->\n    <mat-form-field hidden-xs hidden-sm hidden-mobile [color]=\"'medium' | matColor\">\n      <input matInput hidden formControlName=\"offline\" type=\"text\" />\n\n      <!-- check box  -->\n      <mat-checkbox\n        [disabled]=\"network.offline\"\n        (change)=\"form.controls.offline.setValue($event.checked)\"\n        [checked]=\"form.controls.offline.value\"\n      >\n        <ion-text color=\"medium\">{{ 'AUTH.OFFLINE_MODE' | translate }}</ion-text>\n      </mat-checkbox>\n    </mat-form-field>\n\n    <!-- Force offline (mobile) -->\n    <mat-form-field visible-xs visible-sm visible-mobile [color]=\"'medium' | matColor\">\n      <input matInput hidden formControlName=\"offline\" type=\"text\" />\n      <!-- slide toggle  -->\n      <ion-text color=\"medium\">{{ 'AUTH.OFFLINE_MODE' | translate }}</ion-text>\n      <mat-slide-toggle\n        matSuffix\n        [disabled]=\"network.offline\"\n        (change)=\"form.controls.offline.setValue($event.checked)\"\n        [checked]=\"form.controls.offline.value\"\n      ></mat-slide-toggle>\n    </mat-form-field>\n  </ng-container>\n\n  <!-- Not register yet ? -->\n  @if (canRegister) {\n    <ion-text class=\"ion-text-center\">\n      <p>\n        <span>{{ 'AUTH.NO_ACCOUNT_QUESTION' | translate }}</span>\n        <br />\n        <a href=\"#\" (click)=\"register()\">\n          <span>{{ 'AUTH.BTN_REGISTER' | translate }}</span>\n        </a>\n      </p>\n    </ion-text>\n  }\n\n  <!-- Reset password -->\n  @if (canResetPassword) {\n    <ion-text class=\"ion-text-center\">\n      <p>\n        <span>{{ 'AUTH.RESET_PASSWORD_QUESTION' | translate }}</span>\n        <br />\n        <a href=\"#\" (click)=\"resetPassword()\">\n          <span>{{ 'AUTH.BTN_RESET_PASSWORD' | translate }}</span>\n        </a>\n      </p>\n    </ion-text>\n  }\n</form>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';\nimport { ModalController } from '@ionic/angular';\nimport { AccountService } from '../services/account.service';\nimport { firstNotNilPromise } from '../../shared/observables';\nimport { AppAuthForm } from './auth.form';\n\n@Component({\n  templateUrl: 'auth.modal.html',\n  styleUrls: ['./auth.modal.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppAuthModal implements OnInit {\n  get loading() {\n    return this.form?.loading;\n  }\n\n  @ViewChild('form', { static: true }) private form: AppAuthForm;\n\n  constructor(\n    private accountService: AccountService,\n    private viewCtrl: ModalController,\n    private cd: ChangeDetectorRef\n  ) {}\n\n  ngOnInit() {\n    this.form.markAsReady({ emitEvent: false });\n    this.form.markAsLoaded();\n  }\n\n  cancel() {\n    this.viewCtrl.dismiss();\n  }\n\n  async doSubmit(): Promise<any> {\n    if (this.form.disabled) return;\n    if (!this.form.valid) {\n      this.form.markAllAsTouched();\n      return;\n    }\n    this.markAsLoading();\n\n    try {\n      const data = this.form.value;\n\n      // Disable the form\n      this.form.disable();\n\n      const account = await this.accountService.login(data);\n      return this.viewCtrl.dismiss(account);\n    } catch (err) {\n      this.form.error = (err && err.message) || err;\n      this.markAsLoaded();\n\n      // Enable the form\n      this.form.enable();\n\n      // Reset form error on next changes\n      firstNotNilPromise(this.form.form.valueChanges).then(() => {\n        this.form.error = null;\n        this.markForCheck();\n      });\n\n      return;\n    }\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected markAsLoading(opts?: { emitEvent?: boolean }) {\n    this.form.markAsLoading(opts);\n  }\n\n  protected markAsLoaded(opts?: { emitEvent?: boolean }) {\n    this.form.markAsLoaded(opts);\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"accent\">\n    <ion-buttons slot=\"start\">\n      <ion-button (click)=\"cancel()\" visible-xs visible-sm visible-mobile>\n        <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n\n    <ion-title>\n      {{ 'AUTH.TITLE' | translate }}\n    </ion-title>\n\n    <ion-buttons slot=\"end\">\n      <ion-spinner *ngIf=\"loading\"></ion-spinner>\n\n      <ion-button (click)=\"doSubmit()\" *ngIf=\"!loading\" visible-xs visible-sm visible-mobile>\n        <ion-icon slot=\"icon-only\" name=\"checkmark\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <app-auth-form #form (onSubmit)=\"doSubmit()\" (onCancel)=\"cancel()\"></app-auth-form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <ion-toolbar>\n    <ion-row class=\"ion-no-padding\" nowrap>\n      <ion-col></ion-col>\n\n      <!-- buttons -->\n      <ion-col size=\"auto\">\n        <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n\n        <ion-button\n          [fill]=\"form.invalid ? 'clear' : 'solid'\"\n          [disabled]=\"loading || form.invalid\"\n          (click)=\"doSubmit()\"\n          (keyup.enter)=\"doSubmit()\"\n          color=\"tertiary\"\n        >\n          <ion-label translate>AUTH.BTN_LOGIN</ion-label>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { FormFieldDefinition } from '../../shared/form/field.model';\n\nexport const SOCIAL_CONFIG_OPTIONS = Object.freeze({\n  ENABLE_NOTIFICATION_ICONS: <FormFieldDefinition>{\n    key: 'sumaris.social.notification.icons.enable',\n    label: 'CONFIGURATION.OPTIONS.SOCIAL.ENABLE_NOTIFICATION_ICONS',\n    type: 'boolean',\n    defaultValue: false,\n  },\n});\n","export const SocialErrorCodes = {\n  LOAD_USER_EVENTS_ERROR: 50000,\n  SAVE_USER_EVENT_ERROR: 50001,\n  COUNT_USER_EVENT_ERROR: 50002,\n  SEND_MESSAGE_ERROR: 50003,\n  DELETE_MESSAGE_ERROR: 50004,\n  SUBSCRIBE_USER_EVENTS_ERROR: 50005,\n\n  SUBSCRIBE_JOB_PROGRESSION_ERROR: 50010,\n  LOAD_JOB_PROGRESSIONS_ERROR: 50011,\n};\n","import { Directive, InjectionToken, OnDestroy } from '@angular/core';\nimport { FetchPolicy } from '@apollo/client/core';\nimport { SocialErrorCodes } from '../social.errors';\nimport { AccountService } from '../../core/services/account.service';\nimport { GraphqlService } from '../../core/graphql/graphql.service';\nimport { BehaviorSubject, merge, Observable, of, Subscription, timer } from 'rxjs';\nimport { IUserEvent, IUserEventFilter } from './user-event.model';\nimport { SortDirection } from '@angular/material/sort';\nimport {\n  EntitiesServiceLoadOptions,\n  EntitiesServiceWatchOptions,\n  EntityServiceSaveOptions,\n  IEntitiesService,\n  LoadResult,\n  Page,\n} from '../../shared/services/entity-service.class';\nimport { distinctUntilChanged, map, mergeMap, startWith } from 'rxjs/operators';\nimport { isEmptyArray, isNotEmptyArray, isNotNil, toNumber } from '../../shared/functions';\nimport { TranslateService } from '@ngx-translate/core';\nimport { NetworkService } from '../../core/services/network.service';\nimport { BaseGraphqlService, BaseGraphqlServiceOptions } from '../../core/services/base-graphql-service.class';\nimport { EntityUtils } from '../../core/services/model/entity.model';\nimport { DateUtils } from '../../shared/dates';\nimport { Moment } from 'moment';\nimport { IStartableService } from '../../shared/services/startable-service.class';\nimport { MINIFY_ENTITY_FOR_POD } from '../../core/services/model/referential.model';\nimport { DocumentNode } from 'graphql/index';\nimport { MutableWatchQueriesUpdatePolicy } from '../../core/services/base-entity-service.class';\n\nexport const APP_USER_EVENT_SERVICE = new InjectionToken<IUserEventService<any, any>>('UserEventService');\n\nexport declare interface UserEventLoadOptions<T> extends EntitiesServiceLoadOptions<T> {\n  withContent?: boolean; // Default to false\n}\nexport declare interface UserEventWatchOptions<T> extends EntitiesServiceWatchOptions<T> {\n  withContent?: boolean; // Default to false\n}\nexport interface IUserEventQueries {\n  loadAll: any;\n  loadAllWithContent: any;\n  count?: any;\n}\n\nexport interface IUserEventMutations {\n  save: any;\n  markAsRead?: any;\n  deleteByIds: any;\n}\n\nexport interface IUserEventSubscriptions {\n  listenAllChanges: any;\n  listenCountChanges?: any;\n}\n\nexport interface IUserEventListener<E extends IUserEvent<E, ID>, ID = number> {\n  accept: (E) => boolean;\n  onReceived?: (E) => Promise<E> | E | undefined;\n  onRead?: (E) => Promise<void> | void;\n}\n\nexport interface UserEventServiceOptions<\n  Q extends IUserEventQueries = IUserEventQueries,\n  M extends IUserEventMutations = IUserEventMutations,\n  S extends IUserEventSubscriptions = IUserEventSubscriptions,\n> extends BaseGraphqlServiceOptions {\n  queries: Q;\n  mutations?: Partial<M>;\n  subscriptions?: Partial<S>;\n  watchQueriesUpdatePolicy?: MutableWatchQueriesUpdatePolicy;\n}\n\nexport interface IUserEventService<\n  E extends IUserEvent<E, ID>,\n  F extends IUserEventFilter<E, ID>,\n  ID = number,\n  WO extends UserEventWatchOptions<E> = UserEventWatchOptions<E>,\n  LO extends UserEventLoadOptions<E> = UserEventLoadOptions<E>,\n> extends IEntitiesService<E, F, WO>,\n    IStartableService {\n  countSubject: Observable<number>;\n\n  add(entity: E): Promise<E>;\n\n  load(id: ID, opts?: LO): Promise<E>;\n\n  count(filter: Partial<F>, options?: { fetchPolicy?: FetchPolicy }): Promise<number>;\n\n  listenCountChanges(filter: Partial<F>, options?: Omit<LO, 'toEntity'> & { interval?: number }): Observable<number>;\n\n  listenAllChanges(filter: Partial<F>, options?: LO & { interval?: number }): Observable<E[]>;\n\n  save(entity: E, options?: EntityServiceSaveOptions<E>): Promise<E>;\n\n  delete(entity: E): Promise<any>;\n\n  markAllAsRead(entities: E[]);\n\n  registerListener(listener: IUserEventListener<E, ID>);\n\n  resetCount();\n}\n\n@Directive()\nexport abstract class AbstractUserEventService<\n    E extends IUserEvent<E, ID, any>,\n    F extends IUserEventFilter<E, ID, any>,\n    ID = number,\n    WO extends UserEventWatchOptions<E> = UserEventWatchOptions<E>,\n    LO extends UserEventLoadOptions<E> = UserEventLoadOptions<E>,\n    Q extends IUserEventQueries = IUserEventQueries,\n    M extends IUserEventMutations = IUserEventMutations,\n    S extends IUserEventSubscriptions = IUserEventSubscriptions,\n  >\n  extends BaseGraphqlService<E, F, ID>\n  implements IUserEventService<E, F, ID, WO, LO>, OnDestroy\n{\n  protected readonly queries: Q;\n  protected readonly mutations: Partial<M>;\n  protected readonly subscriptions: Partial<S>;\n  protected readonly _countSubject = new BehaviorSubject<number>(0);\n  protected readonly watchQueriesUpdatePolicy: MutableWatchQueriesUpdatePolicy;\n  protected resetCountDate: Moment;\n  protected listeners: IUserEventListener<E, ID>[] = [];\n  private _subscriptions = new Subscription();\n  private _listenSubscription: Subscription;\n\n  get countSubject(): Observable<number> {\n    return this._countSubject.pipe(startWith(this._countSubject.getValue()), distinctUntilChanged());\n  }\n\n  protected constructor(\n    protected graphql: GraphqlService,\n    protected accountService: AccountService,\n    protected network: NetworkService,\n    protected translate: TranslateService,\n    protected options: UserEventServiceOptions<Q, M, S>\n  ) {\n    super(graphql, options);\n    this.queries = options.queries;\n    this.mutations = options.mutations || <Partial<M>>{};\n    this.subscriptions = options.subscriptions || <Partial<S>>{};\n    this.watchQueriesUpdatePolicy = options.watchQueriesUpdatePolicy || 'update-cache';\n    this._logPrefix = '[user-event-service] ';\n  }\n\n  protected async ngOnStart(): Promise<void> {\n    // Update component when refresh is need (=login events)\n    this._subscriptions.add(\n      merge(\n        this.accountService.onLogin,\n        this.accountService.onLogout,\n        timer(1000) // Starts with -  first attempt if account is ready\n      )\n        .pipe(\n          // Wait account service ready (can be restarted)\n          mergeMap(() => this.accountService.ready()),\n          map(() => this.accountService.isLogin()),\n          distinctUntilChanged()\n        )\n        .subscribe((login) => {\n          if (login) {\n            this.onLogin();\n          } else {\n            this.onLogout();\n          }\n        })\n    );\n  }\n\n  ngOnDestroy() {\n    this._subscriptions.unsubscribe();\n  }\n\n  abstract asFilter(filter: Partial<F>): F;\n\n  abstract fromObject(source: any): E;\n\n  watchAll(\n    offset: number,\n    size: number,\n    sortBy?: string,\n    sortDirection?: SortDirection,\n    filter?: Partial<F>,\n    options?: WO\n  ): Observable<LoadResult<E>> {\n    return this.watchPage(<Page>{ offset, size, sortBy, sortDirection }, filter, options);\n  }\n\n  watchPage(page: Page, filter?: Partial<F>, opts?: WO): Observable<LoadResult<E>> {\n    let now = this._debug && Date.now();\n    if (!filter) {\n      filter = this.defaultFilter();\n    }\n    console.debug(`${this._logPrefix}Loading user events...`, filter);\n\n    filter = this.asFilter(filter);\n\n    // Force recipient to current issuer, if not admin and not specified\n    if (isEmptyArray(filter?.recipients) || !this.accountService.isAdmin()) {\n      const recipient = this.defaultRecipient();\n      if (!filter?.recipients?.includes(recipient)) {\n        console.warn('[user-events-service] Force user event filter.recipient=' + recipient);\n        filter.recipients = [recipient];\n      }\n    }\n\n    const withContent = opts?.withContent === true;\n\n    return this.mutableWatchQuery<LoadResult<E>, { filter: any; page: Page }>({\n      queryName: withContent ? 'LoadAllWithContent' : 'LoadAll',\n      query: withContent ? this.queries.loadAllWithContent : this.queries.loadAll,\n      variables: {\n        page: {\n          sortBy: 'creationDate',\n          ...page,\n          sortDirection: (page.sortDirection || 'desc').toUpperCase() as SortDirection,\n        },\n        filter: filter && filter.asPodObject(),\n      },\n      arrayFieldName: 'data',\n      error: { code: SocialErrorCodes.LOAD_USER_EVENTS_ERROR, message: 'SOCIAL.ERROR.LOAD_USER_EVENTS_ERROR' },\n      fetchPolicy: opts?.fetchPolicy || 'cache-first',\n      insertFilterFn: filter && filter.asFilterFn(),\n    }).pipe(\n      mergeMap(async (res) => {\n        let data = await Promise.all((res?.data || []).map((value) => this.processUserEvent(value)));\n\n        if (now) {\n          console.debug(`${this._logPrefix}${data.length} user events loaded in ${Date.now() - now}ms`);\n          now = null;\n        }\n\n        // Must re-order because of listenAllChanges result will add new event at the end\n        data = EntityUtils.sort(data, page.sortBy, page.sortDirection);\n\n        const result = <LoadResult<E>>{\n          data,\n          total: toNumber(res?.total, data.length),\n        };\n\n        // Add fetch more capability, if total was fetched\n        if (isNotNil(res.total)) {\n          const nextOffset = (page.offset || 0) + data.length;\n          if (nextOffset < result.total) {\n            result.fetchMore = (_) =>\n              this.loadPage({ ...page, offset: nextOffset }, filter, { ...opts, fetchPolicy: <FetchPolicy>'no-cache' } as unknown as LO);\n          }\n        }\n\n        return result;\n      })\n    );\n  }\n\n  async loadPage(page: Page, filter?: Partial<F>, opts?: LO): Promise<LoadResult<E>> {\n    const now = this._debug && Date.now();\n    if (!filter) filter = this.defaultFilter();\n\n    console.debug(`${this._logPrefix}Loading user events...`, filter);\n\n    filter = this.asFilter(filter);\n\n    // Force recipient to current issuer, if not admin and not specified\n    if (isEmptyArray(filter?.recipients) || !this.accountService.isAdmin()) {\n      const recipient = this.defaultRecipient();\n      if (!filter?.recipients?.includes(recipient)) {\n        console.warn('[user-events-service] Force user event filter.recipient=' + recipient);\n        filter.recipients = [recipient];\n      }\n    }\n\n    const withContent = opts?.withContent === true;\n\n    const res = await this.graphql.query<LoadResult<E>>({\n      query: withContent ? this.queries.loadAllWithContent : this.queries.loadAll,\n      variables: {\n        page: {\n          sortBy: 'creationDate',\n          ...page,\n          sortDirection: (page.sortDirection || 'desc').toUpperCase() as SortDirection,\n        },\n        filter: filter && filter.asPodObject(),\n      },\n      error: { code: SocialErrorCodes.LOAD_USER_EVENTS_ERROR, message: 'SOCIAL.ERROR.LOAD_USER_EVENTS_ERROR' },\n      fetchPolicy: opts?.fetchPolicy,\n    });\n    let data = await Promise.all((res?.data || []).map((value) => this.processUserEvent(value)));\n\n    if (now) console.debug(`${this._logPrefix}${data.length} user events loaded in ${Date.now() - now}ms`);\n\n    // Must re-order because of listenAllChanges result will add new event at the end\n    data = EntityUtils.sort(data, page.sortBy, page.sortDirection);\n\n    const result = <LoadResult<E>>{\n      data,\n      total: toNumber(res?.total, data.length),\n    };\n\n    // Add fetch more capability, if total was fetched\n    if (isNotNil(res.total)) {\n      const nextOffset = (page.offset || 0) + data.length;\n      if (nextOffset < result.total) {\n        result.fetchMore = (_) => this.loadPage({ ...page, offset: nextOffset }, filter, opts);\n      }\n    }\n\n    return result;\n  }\n\n  async load(id: ID, opts?: LO): Promise<E> {\n    const filter = this.defaultFilter();\n    filter.includedIds = [id];\n    const { data } = await this.loadPage({ offset: 0, size: 1 }, filter, opts);\n    return data && data[0];\n  }\n\n  async add(entity: E): Promise<E> {\n    entity = await this.processUserEvent(entity);\n\n    if (!entity) return; // Rejected\n\n    const withContent = !!entity.content;\n\n    // Add user event locally\n    if (this.watchQueriesUpdatePolicy === 'update-cache') {\n      if (withContent) {\n        this.insertIntoMutableCachedQueries(this.graphql.cache, {\n          query: this.queries.loadAllWithContent,\n          data: entity,\n        });\n      }\n      this.insertIntoMutableCachedQueries(this.graphql.cache, {\n        query: this.queries.loadAll,\n        data: {\n          ...entity,\n          content: null,\n        },\n      });\n    }\n\n    // Update count\n    this._countSubject.next(this._countSubject.value + 1);\n\n    // Add id\n    //console.log('TODO: add an ID to user event ?');\n\n    return entity;\n  }\n\n  async count(filter: Partial<F>, options?: { fetchPolicy?: FetchPolicy }): Promise<number> {\n    if (!this.queries?.count) {\n      console.warn(`${this._logPrefix}Query 'count' not provided, skip.`);\n      return undefined;\n    }\n\n    if (!filter) filter = this.defaultFilter();\n    // Apply last reset date as start date\n    filter.startDate = this.resetCountDate;\n    filter = this.asFilter(filter);\n\n    if (this._debug) console.debug(`${this._logPrefix}Counting user events with filter:`, filter);\n\n    const res = await this.graphql.query<{ total: number }>({\n      query: this.queries.count,\n      variables: {\n        filter: filter.asPodObject(),\n      },\n      error: { code: SocialErrorCodes.COUNT_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.COUNT_USER_EVENT_ERROR' },\n      fetchPolicy: options?.fetchPolicy || 'network-only',\n    });\n    return res.total;\n  }\n\n  listenCountChanges(filter: Partial<F>, options?: Omit<LO, 'toEntity'> & { interval?: number }): Observable<number> {\n    if (!this.subscriptions?.listenCountChanges) {\n      console.warn(`${this._logPrefix}Subscription query 'listenCountChanges' not provided, skip.`);\n      return of();\n    }\n\n    const isDefault = !filter;\n    if (isDefault) filter = this.defaultFilter();\n    // Apply last reset date as start date\n    filter.startDate = this.resetCountDate;\n    filter.excludeRead = true;\n    filter = this.asFilter(filter);\n\n    if (this._debug) console.debug(`${this._logPrefix}[WS] Listening count changes for user events with filter:`, filter);\n\n    return this.graphql\n      .subscribe<{ total: number }, { filter: any; interval: number }>({\n        query: this.subscriptions.listenCountChanges,\n        fetchPolicy: options?.fetchPolicy,\n        variables: { filter: filter.asPodObject(), interval: toNumber(options?.interval, 10) },\n        error: {\n          code: SocialErrorCodes.SUBSCRIBE_USER_EVENTS_ERROR,\n          message: 'SOCIAL.ERROR.SUBSCRIBE_USER_EVENTS_ERROR',\n        },\n      })\n      .pipe(\n        map(({ total }) => {\n          if (total && this._debug) console.debug(`${this._logPrefix}Received new user events count:`, total);\n          // update count\n          if (isDefault) this._countSubject.next(total);\n\n          return total;\n        })\n      );\n  }\n\n  listenAllChanges(filter: Partial<F>, opts?: LO & { interval?: number }): Observable<E[]> {\n    if (!this.subscriptions?.listenAllChanges) {\n      console.warn(`${this._logPrefix}Subscription query 'listenAllChanges' not provided, skip.`);\n      return of();\n    }\n\n    if (!filter) filter = this.defaultFilter();\n    filter = this.asFilter(filter);\n\n    const withContent = opts?.withContent === true;\n\n    if (this._debug) console.debug(`${this._logPrefix}[WS] Listening changes for user events with filter:`, filter);\n\n    return this.graphql\n      .subscribe<{ data: any[] }, { filter: any; interval: number }>({\n        query: this.subscriptions.listenAllChanges,\n        fetchPolicy: opts?.fetchPolicy,\n        variables: { filter: filter.asPodObject(), interval: toNumber(opts?.interval, 10) },\n        error: {\n          code: SocialErrorCodes.SUBSCRIBE_USER_EVENTS_ERROR,\n          message: 'SOCIAL.ERROR.SUBSCRIBE_USER_EVENTS_ERROR',\n        },\n      })\n      .pipe(\n        mergeMap(async ({ data }) => {\n          if (data && this._debug) console.debug(`${this._logPrefix}Received new user events:`, data);\n\n          // Update cache (will update watchAll queries)\n          if (isNotEmptyArray(data)) {\n            this.insertIntoMutableCachedQueries(this.graphql.cache, {\n              query: withContent ? this.queries.loadAllWithContent : this.queries.loadAll,\n              data,\n            });\n          }\n\n          // Convert to entities\n          if (!opts || opts.toEntity !== false) {\n            return await Promise.all((data || []).map((value) => this.processUserEvent(value)));\n          } else {\n            return data;\n          }\n        })\n      );\n  }\n\n  async delete(entity: E): Promise<any> {\n    if (!entity) return; // skip\n    await this.deleteAll([entity]);\n  }\n\n  async deleteAll(entities: E[], opts?: any): Promise<any> {\n    const ids = entities && entities.map((t) => t.id);\n    if (isEmptyArray(ids)) return; // stop, if nothing else to do\n\n    const now = Date.now();\n    if (this._debug) console.debug(`${this._logPrefix}Deleting events... ids:`, ids);\n\n    await this.graphql.mutate<any>({\n      mutation: this.mutations.deleteByIds,\n      variables: {\n        ids,\n      },\n      update: (cache) => {\n        // Remove from cache\n        if (this.watchQueriesUpdatePolicy === 'update-cache') {\n          this.removeFromMutableCachedQueriesByIds(cache, {\n            queries: this.getLoadQueries(),\n            ids,\n          });\n        }\n\n        if (this._debug) console.debug(`${this._logPrefix}Events deleted in ${Date.now() - now}ms`);\n      },\n    });\n  }\n\n  async save(entity: E, opts?: EntityServiceSaveOptions<E>): Promise<E> {\n    this.fillDefaultProperties(entity);\n\n    // Transform into json\n    const withContent = !!entity.content;\n    const json = entity.asObject(MINIFY_ENTITY_FOR_POD);\n\n    const now = Date.now();\n    if (this._debug) console.debug(`${this._logPrefix}Saving user event...`, json);\n\n    await this.graphql.mutate<{ data: any }>({\n      mutation: this.mutations.save,\n      variables: {\n        data: json,\n      },\n      error: { code: SocialErrorCodes.SAVE_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.SAVE_USER_EVENT_ERROR' },\n      update: (cache, { data }, { context, variables }) => {\n        // Update entity\n        const savedEntity = data && data.data;\n        if (savedEntity) {\n          if (this._debug) console.debug(`${this._logPrefix}User event saved in ${Date.now() - now}ms`, entity);\n          this.copyIdAndUpdateDate(savedEntity, entity);\n\n          // Add to cache\n          if (this.watchQueriesUpdatePolicy === 'update-cache') {\n            if (withContent) {\n              this.insertIntoMutableCachedQueries(cache, {\n                query: this.queries.loadAllWithContent,\n                data: savedEntity,\n              });\n            }\n            this.insertIntoMutableCachedQueries(cache, {\n              query: this.queries.loadAll,\n              data: {\n                ...savedEntity,\n                content: null,\n              },\n            });\n          }\n\n          if (opts?.update) {\n            opts.update(cache, { data }, { context, variables });\n          }\n        }\n      },\n    });\n\n    return entity;\n  }\n\n  async saveAll(entities: E[], opts?: EntityServiceSaveOptions<E>): Promise<E[]> {\n    return Promise.all(entities.map((entity) => this.save(entity, opts)));\n  }\n\n  async markAllAsRead(entities: E[]) {\n    const userEventWithoutReadListeners: E[] = [];\n    for (const entity of entities || []) {\n      // Get onRead listeners\n      const onReadListeners = (this.listeners || []).filter((listener) => !!listener.onRead).filter((listener) => listener.accept(entity));\n      if (onReadListeners.length) {\n        for (const listener of onReadListeners) {\n          await listener.onRead(entity);\n        }\n      } else {\n        // Add to this list for default operation\n        userEventWithoutReadListeners.push(entity);\n      }\n    }\n\n    // Use default\n    await this.defaultMarkAsRead(userEventWithoutReadListeners);\n  }\n\n  registerListener(listener: IUserEventListener<E, ID>) {\n    if (!this.listeners) this.listeners = [];\n    this.listeners.push(listener);\n  }\n\n  resetCount() {\n    this._countSubject.next(undefined);\n    this.resetCountDate = DateUtils.moment();\n    // restart listening count changes\n    this.startListenCountChanges();\n  }\n\n  /* -- protected methods -- */\n\n  protected async onLogin() {\n    // Get first count\n    const count = await this.count(undefined);\n    if (this._debug) console.debug(`${this._logPrefix}Receiving user events count`, count);\n    // Update count\n    this._countSubject.next(count);\n\n    // Then listen changes\n    this.startListenCountChanges();\n  }\n\n  protected onLogout() {\n    // Reset counter\n    this._countSubject.next(0);\n    // Stop listening\n    this.stopListenCountChanges();\n  }\n\n  protected startListenCountChanges() {\n    this.stopListenCountChanges();\n    this._listenSubscription = this.listenCountChanges(undefined).subscribe();\n  }\n\n  protected stopListenCountChanges() {\n    this._listenSubscription?.unsubscribe();\n    this._listenSubscription = undefined;\n  }\n\n  protected async processUserEvent(source: any): Promise<E> {\n    // Convert json source to IUserEvent\n    let target = this.fromObject(source);\n\n    // Get listeners\n    const listeners = (this.listeners || []).filter((listener) => !!listener.onReceived).filter((listener) => listener.accept(target));\n    for (const listener of listeners) {\n      if (target) {\n        const res = listener.onReceived(target);\n        target = res instanceof Promise ? await res : res;\n      } else {\n        if (this._debug) console.debug(`${this._logPrefix}Event has been rejected by a listener`, source);\n        break;\n      }\n    }\n\n    return target;\n  }\n\n  protected async defaultMarkAsRead(userEvents: E[]) {\n    if (!userEvents) throw new Error(`${this._logPrefix}Invalid event to save`);\n    if (!userEvents.length) return;\n\n    // set read date\n    userEvents.forEach((userEvent) => (userEvent.readDate = DateUtils.moment()));\n\n    // split local/remote entities\n    const localEntities = userEvents.filter(EntityUtils.isLocal);\n    const remoteEntities = userEvents.filter(EntityUtils.isRemote);\n\n    // save local entities\n    if (localEntities.length) {\n      if (this._debug) console.debug(`${this._logPrefix}Save local user event`);\n      // TODO !!!!!!!!!!!!!\n    }\n    // mark remote entities as read\n    if (remoteEntities.length) {\n      if (!this.mutations?.markAsRead) {\n        console.warn(`${this._logPrefix}Mutation query 'markAsRead' not provided, skip.`);\n        return;\n      }\n\n      // Collect ids\n      const ids = remoteEntities.map((value) => value.id);\n      const now = Date.now();\n      if (this._debug) console.debug(`${this._logPrefix}Mark user events as read...`, ids);\n\n      await this.graphql.mutate<{ data: any }>({\n        mutation: this.mutations.markAsRead,\n        variables: {\n          ids,\n        },\n        error: { code: SocialErrorCodes.SAVE_USER_EVENT_ERROR, message: 'SOCIAL.ERROR.SAVE_USER_EVENT_ERROR' },\n      });\n\n      if (this._debug) console.debug(`${this._logPrefix}User events marked as read in ${Date.now() - now}ms`, ids);\n    }\n  }\n\n  protected defaultFilter(): F {\n    // By default\n    return <F>{\n      recipients: [this.defaultRecipient()],\n    };\n  }\n\n  protected abstract defaultRecipient(): any;\n\n  protected fillDefaultProperties(entity: E) {}\n\n  protected unreadEvents(events: E[]): number {\n    // default calculation on unread events from a list\n    if (isEmptyArray(events)) return undefined;\n    const lastReadDate = events\n      .filter((event) => isNotNil(event.readDate))\n      .reduce((lastDate, event) => DateUtils.max(lastDate, event.readDate), undefined as Moment);\n    return events.filter((event) => event.creationDate.isSameOrAfter(lastReadDate)).length;\n  }\n\n  protected copyIdAndUpdateDate(source: E, target: E) {\n    EntityUtils.copyIdAndUpdateDate(source, target);\n  }\n\n  protected getLoadQueries(): DocumentNode[] {\n    return [this.queries.loadAll, this.queries.loadAllWithContent].filter(isNotNil);\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Inject,\n  InjectionToken,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  QueryList,\n  ViewChild,\n  ViewChildren,\n} from '@angular/core';\nimport { IUserEvent, IUserEventAction, IUserEventFilter } from '../user-event.model';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { IonContent, IonItem, PopoverController } from '@ionic/angular';\nimport { APP_USER_EVENT_SERVICE, IUserEventService } from '../user-event.service';\nimport { LocalSettingsService } from '../../../core/services/local-settings.service';\nimport { FetchMoreFn, LoadResult } from '../../../shared/services/entity-service.class';\nimport { isNotEmptyArray, removeDuplicatesFromArray } from '../../../shared/functions';\nimport { fromScrollEndEvent } from '../../../shared/events';\nimport { waitFor } from '../../../shared/observables';\nimport { SortDirection } from '@angular/material/sort';\nimport { debounceTime, distinctUntilChanged, filter, first, map, switchMap } from 'rxjs/operators';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\nexport const APP_USER_EVENT_LIST_INFINITE_SCROLL_THRESHOLD = new InjectionToken<string>('infiniteScrollThreshold');\n\nexport interface UserEventNotificationListOptions<\n  E extends IUserEvent<any> = IUserEvent<any>,\n  F extends IUserEventFilter<any> = IUserEventFilter<any>,\n> {\n  debug?: boolean;\n  titleI18n?: string;\n  readEvent?: EventEmitter<E>;\n  readEvents?: EventEmitter<E[]>;\n  filter?: Partial<F>;\n  headerActions?: IUserEventAction[];\n  footerActions?: IUserEventAction[];\n  showTooltip?: boolean;\n}\n\n@Component({\n  selector: 'app-user-event-notification-list',\n  templateUrl: './user-event-notification.list.html',\n  styleUrls: ['./user-event-notification.list.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserEventNotificationList<E extends IUserEvent<any> = IUserEvent<any>, F extends IUserEventFilter<any> = IUserEventFilter<any>>\n  implements OnInit, OnDestroy, UserEventNotificationListOptions<E, F>\n{\n  protected fetchingMore = false;\n  protected $items = new BehaviorSubject<E[]>(undefined);\n  protected _subscriptions = new Subscription();\n  protected _fetchMoreFn: FetchMoreFn<LoadResult<E>>;\n  protected _fetchMoreSubscription: Subscription;\n  protected _$pageSize = new BehaviorSubject<number>(20);\n  protected _panelElement: HTMLElement = null;\n\n  @Input() titleI18n: string = 'SOCIAL.USER_EVENT.NOTIFICATION.TITLE';\n  @Input() sortBy = 'creationDate';\n  @Input() sortDirection: SortDirection = 'desc';\n  @Input() filter: Partial<F>;\n  @Input() enableInfiniteScroll = true;\n  @Input() infiniteScrollThreshold: string;\n  @Input() headerActions: IUserEventAction[];\n  @Input() footerActions: IUserEventAction[];\n  @Input() showHeader = true;\n  @Input() showFooter = true;\n  @Input() mobile: boolean;\n  @Input() debug = false;\n\n  @Input() set pageSize(value: number) {\n    if (value > 0 && value !== this._$pageSize.value) this._$pageSize.next(value);\n  }\n\n  $itemCount = new BehaviorSubject<number>(undefined);\n\n  get pageSize(): number {\n    return this._$pageSize.value;\n  }\n\n  get hasItem$(): Observable<boolean> {\n    return this.$items.pipe(map(isNotEmptyArray));\n  }\n\n  get itemCount$(): Observable<number> {\n    return this.$itemCount.pipe(map((value) => value ?? 0));\n  }\n\n  @Output() readEvent: EventEmitter<E>;\n  @Output() readEvents: EventEmitter<E[]>;\n  @Output() dismiss = new EventEmitter<Event>();\n\n  @ViewChild(IonContent) ionContent: IonContent;\n  @ViewChildren(IonItem) ionItems: QueryList<IonItem>;\n\n  get canFetchMore(): boolean {\n    return this.enableInfiniteScroll && !!this._fetchMoreFn;\n  }\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected cd: ChangeDetectorRef,\n    protected popoverController: PopoverController,\n    @Optional() protected settings: LocalSettingsService,\n    @Optional() @Inject(APP_USER_EVENT_SERVICE) public userEventService: IUserEventService<E, IUserEventFilter<any>>,\n    @Optional() @Inject(APP_USER_EVENT_LIST_INFINITE_SCROLL_THRESHOLD) public infiniteScrollThresholdFromToken: string\n  ) {\n    this.mobile = this.settings?.mobile || false;\n    this.infiniteScrollThreshold = infiniteScrollThresholdFromToken;\n  }\n\n  ngOnInit(): void {\n    // Watch all user events\n    if (this.userEventService) {\n      this._subscriptions.add(\n        this._$pageSize\n          .pipe(\n            distinctUntilChanged(),\n            switchMap((pageSize) => this.userEventService.watchAll(0, pageSize, this.sortBy, this.sortDirection, this.filter)),\n            first()\n          )\n          .subscribe((result) => {\n            if (this.debug) console.debug(`[user-event-notification-list] Receiving ${result.total} user events`, result.data);\n            this.$items.next(result.data);\n            this.$itemCount.next(result.total ?? result.data?.length ?? 0);\n            this._fetchMoreFn = result.fetchMore;\n            this.fetchingMore = false; // Allow to refetch more\n            this.markForCheck();\n          })\n      );\n\n      // Listen changes\n      this._subscriptions.add(\n        this.userEventService\n          .listenAllChanges(this.filter)\n          .pipe(filter(isNotEmptyArray))\n          .subscribe((data) => {\n            if (this.debug) console.debug(`[user-event-notification-list] Receiving ${data.length} new user events (by WS)`, data);\n            const oldItemsCount = this.$itemCount.value || 0;\n            const items = removeDuplicatesFromArray([...data, ...(this.$items.value || [])], 'id');\n\n            // Compute delta count\n            // When an existing event is update, the delta count should be = 0\n            const deltaCount = items.length - oldItemsCount;\n\n            // Update observables\n            this.$items.next(items);\n            if (deltaCount !== 0) this.$itemCount.next(oldItemsCount + deltaCount);\n          })\n      );\n\n      if (this.enableInfiniteScroll) this.initInfiniteScroll(this.infiniteScrollThreshold);\n    }\n  }\n\n  ngOnDestroy() {\n    this._subscriptions.unsubscribe();\n    this.$items.complete();\n    this.$itemCount.complete();\n  }\n\n  async click(event: Event, userEvent: E) {\n    if (!userEvent) return; // Skip\n\n    // MarkAsRead\n    this.markAsRead(event, userEvent);\n\n    // Get the default action (if any)\n    const defaultAction = (userEvent?.actions || []).find((a) => a.default);\n\n    if (defaultAction) {\n      await this.executeAction(event, defaultAction, userEvent);\n    }\n  }\n\n  isDefaultAction(action: IUserEventAction): boolean {\n    return (action && action.default) || false;\n  }\n\n  markAsRead(event: Event, userEvent: E) {\n    if (userEvent?.readDate) return;\n    this.readEvent?.emit(userEvent);\n  }\n\n  markAllAsRead(event: Event) {\n    const unreadUserEvents = (this.$items.value || []).filter((value) => !value.readDate);\n    if (!unreadUserEvents.length) return;\n    this.readEvents?.emit(unreadUserEvents);\n  }\n\n  async executeAction(event: Event, action: IUserEventAction, userEvent: IUserEvent<any>) {\n    if (event?.defaultPrevented) return; // Skip if prevented\n\n    // Disable default action (.e.g avoid to call click() function)\n    if (event) event.preventDefault();\n\n    // Execute then close popover\n    try {\n      const res = action.executeAction(userEvent);\n      this.close();\n      if (res instanceof Promise) await res;\n    } catch (err) {\n      console.error(err);\n    }\n  }\n\n  close() {\n    if (this.dismiss.observed) {\n      this.dismiss.emit();\n    } else {\n      this.popoverController.dismiss();\n    }\n\n    // Reset counter (need if event has been received while popover if open)\n    this.userEventService?.resetCount();\n  }\n\n  async fetchMore(event?: CustomEvent & { target?: EventTarget & { complete?: () => void } }) {\n    if (!this._fetchMoreFn || this.fetchingMore) return;\n\n    console.debug('[user-event-notification-list] Fetching more notifications...', event);\n    this.fetchingMore = true;\n    const fetchMoreFn = this._fetchMoreFn;\n\n    try {\n      const result = await fetchMoreFn();\n      let data = [...(this.$items.value || []), ...result.data];\n\n      // Remove duplication (e.g. when new user event was added by subscription)\n      data = removeDuplicatesFromArray(data, 'id');\n\n      // fetch more changes (e.g. if watchAll observable as been refreshed)\n      if (fetchMoreFn !== this._fetchMoreFn) return; // Skip\n\n      this.$items.next(data);\n      this.$itemCount.next(result.total ?? result.data?.length ?? 0);\n      this._fetchMoreFn = result.fetchMore;\n\n      // Update the page size, to keep same scroll height, after the next refresh\n      //this.pageSize = Math.max(this.pageSize, data.length);\n    } catch (err) {\n      console.error(err);\n      this._fetchMoreFn = undefined; // Forget the function\n    } finally {\n      this.markForCheck();\n      this.fetchingMore = false;\n    }\n  }\n\n  protected async initInfiniteScroll(threshold?: string) {\n    console.debug('[user-event-notification-list] Init infinite loop');\n    if (this._fetchMoreSubscription) this._fetchMoreSubscription.unsubscribe();\n\n    threshold = threshold || (this.mobile ? '15%' : '2%');\n    await waitFor(() => !!this.ionContent, { dueTime: 250, timeout: 1000 });\n    const panel = await this.getPanelElement();\n\n    // Trigger fetch more, end end scroll reached\n    this._fetchMoreSubscription = this.$items\n      .pipe(\n        debounceTime(250),\n        filter(() => this.canFetchMore),\n        switchMap(() => fromScrollEndEvent(panel, threshold, 250 /*force to check when no scrollbar - e.g. in large screen*/))\n      )\n      .subscribe(() => this.fetchMore());\n\n    this._subscriptions.add(this._fetchMoreSubscription);\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected async getPanelElement(): Promise<HTMLElement> {\n    if (!this._panelElement) {\n      this._panelElement = await this.ionContent.getScrollElement();\n    }\n    return this._panelElement;\n  }\n}\n","<ion-content>\n  <ion-list class=\"ion-list-popover\">\n    <!-- header -->\n    @if (showHeader) {\n      <ion-row class=\"ion-list-header column\">\n        <ion-col>\n          @if (titleI18n) {\n            <ion-label>{{ titleI18n | translate }}</ion-label>\n          }\n        </ion-col>\n        <ion-col size=\"auto\" class=\"header-action\" *ngIf=\"$items | async | isNotEmptyArray\">\n          <ion-text color=\"primary\">\n            <a\n              (click)=\"markAllAsRead($event)\"\n              [title]=\"!showTooltip ? ('SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate) : ''\"\n            >\n              {{ 'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate }}\n            </a>\n          </ion-text>\n        </ion-col>\n        <ion-col size=\"auto\" class=\"header-action\">\n          <ion-text *ngFor=\"let action of headerActions\">\n            <a\n              (click)=\"executeAction($event, action, undefined)\"\n              [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n              [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n            >\n              {{ action.name | translate }}\n            </a>\n          </ion-text>\n        </ion-col>\n      </ion-row>\n    }\n\n    @for (item of $items | async; track item.id; let last = $last) {\n      <ion-item\n        [lines]=\"last ? 'none' : undefined\"\n        [class.unread]=\"!item.readDate\"\n        [class.tappable]=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\"\n        (click)=\"click($event, item)\"\n      >\n        <ion-avatar slot=\"start\">\n          <ion-img *ngIf=\"item.avatar; else avatarIcon\" [src]=\"item.avatar\" />\n\n          <ng-template #avatarIcon>\n            <app-icon\n              *ngIf=\"item.avatarIcon; else generateIcon\"\n              [ref]=\"item.avatarIcon\"\n              height=\"40\"\n              width=\"40\"\n            ></app-icon>\n          </ng-template>\n\n          <ng-template #generateIcon>\n            <div class=\"avatar\" *ngIf=\"item.avatarJdenticon\">\n              <svg width=\"40\" width=\"40\" [data-jdenticon-value]=\"item.avatarJdenticon\"></svg>\n            </div>\n          </ng-template>\n        </ion-avatar>\n\n        <ion-grid class=\"ion-no-margin ion-no-padding message\">\n          <ion-row>\n            <ion-col size=\"12\">\n              <ion-text class=\"ion-text-wrap\">\n                <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\n              </ion-text>\n            </ion-col>\n          </ion-row>\n\n          <!-- date -->\n          <ion-row>\n            <ion-col size=\"12\">\n              <app-icon\n                *ngIf=\"item.icon\"\n                [ref]=\"item.icon\"\n                height=\"16\"\n                width=\"16\"\n                style=\"vertical-align: sub; margin-right: 3px\"\n              ></app-icon>\n              <small>\n                <span>{{ item.creationDate | dateFromNow }}</span>\n                <span style=\"color: gray\">{{ ' | ' + (item.creationDate | dateFormat: { time: true }) }}</span>\n              </small>\n            </ion-col>\n          </ion-row>\n\n          <!-- actions -->\n          <ion-row *ngIf=\"item.actions | isNotEmptyArray\">\n            <ion-col></ion-col>\n            <ion-col size=\"auto\">\n              <ng-container *ngFor=\"let action of item.actions\">\n                <a\n                  *ngIf=\"!action.default\"\n                  class=\"action\"\n                  (click)=\"executeAction($event, action, item)\"\n                  [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n                  [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n                >\n                  <app-icon\n                    *ngIf=\"action.iconRef\"\n                    slot=\"start\"\n                    height=\"20\"\n                    width=\"20\"\n                    [ref]=\"action.iconRef\"\n                  ></app-icon>\n                  <span>{{ action.name | translate }}</span>\n                </a>\n              </ng-container>\n            </ion-col>\n          </ion-row>\n        </ion-grid>\n\n        <mat-icon slot=\"end\" *ngIf=\"item.actions | arrayFilter: isDefaultAction | isNotEmptyArray\">\n          chevron_right\n        </mat-icon>\n      </ion-item>\n    }\n    <!-- loading -->\n    <ng-container *ngIf=\"($items | async) === undefined; else notLoading\">\n      <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n    </ng-container>\n\n    <ng-template #notLoading>\n      <!-- no result -->\n      <ion-item *ngIf=\"$items | async | isEmptyArray\" lines=\"none\">\n        <ion-text color=\"dark\" class=\"text-italic\">{{ 'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate }}</ion-text>\n      </ion-item>\n\n      <!-- Fetching more -->\n      <ng-container *ngIf=\"fetchingMore; else infiniteLoop\" lines=\"none\" disabled>\n        <ng-container *ngTemplateOutlet=\"loadingItem\"></ng-container>\n      </ng-container>\n\n      <!-- Infinite loop -->\n      <ng-template #infiniteLoop>\n        <ng-container *ngIf=\"canFetchMore\" lines=\"none\" disabled [ngTemplateOutlet]=\"loadingItem\"></ng-container>\n      </ng-template>\n    </ng-template>\n\n    <!-- footer -->\n    @if (showFooter) {\n      <ion-row class=\"ion-list-footer column\">\n        <ion-col size=\"auto\" class=\"footer-action\">\n          <ion-text *ngFor=\"let action of footerActions\">\n            <a\n              (click)=\"executeAction($event, action, undefined)\"\n              [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n              [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n            >\n              {{ action.name | translate }}\n            </a>\n          </ion-text>\n        </ion-col>\n        <ion-col>\n          <ion-text *ngIf=\"$itemCount | async; let count\" class=\"ion-float-end ion-padding-end\">\n            <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n          </ion-text>\n        </ion-col>\n      </ion-row>\n    }\n  </ion-list>\n</ion-content>\n\n<!-- loading -->\n<ng-template #loadingItem>\n  <ion-item lines=\"none\" [disabled]>\n    <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n  </ion-item>\n</ng-template>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Inject, Input, OnInit, Optional, ViewChild } from '@angular/core';\nimport { IUserEvent, IUserEventAction, IUserEventFilter } from '../user-event.model';\nimport { ModalController } from '@ionic/angular';\nimport { SortDirection } from '@angular/material/sort';\nimport { UserEventNotificationList, UserEventNotificationListOptions } from './user-event-notification.list';\nimport { APP_USER_EVENT_SERVICE, IUserEventService } from '../user-event.service';\nimport { LocalSettingsService } from '../../../core/services/local-settings.service';\nimport { Observable } from 'rxjs';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\nexport interface UserEventNotificationModalOptions<\n  E extends IUserEvent<any> = IUserEvent<any>,\n  F extends IUserEventFilter<any> = IUserEventFilter<any>,\n> extends UserEventNotificationListOptions<E, F> {}\n\n@Component({\n  selector: 'app-user-event-notification-modal',\n  templateUrl: './user-event-notification.modal.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserEventNotificationModal<E extends IUserEvent<any> = IUserEvent<any>, F extends IUserEventFilter<any> = IUserEventFilter<any>>\n  implements UserEventNotificationModalOptions<E, F>, OnInit\n{\n  protected itemCount$: Observable<number>;\n\n  @Input() titleI18n: string = 'SOCIAL.USER_EVENT.NOTIFICATION.TITLE';\n  @Input() sortBy = 'creationDate';\n  @Input() sortDirection: SortDirection = 'desc';\n  @Input() filter: Partial<F>;\n  @Input() enableInfiniteScroll = true;\n  @Input() infiniteScrollThreshold: string;\n  @Input() headerActions: IUserEventAction[];\n  @Input() footerActions: IUserEventAction[];\n  @Input() pageSize: number;\n  @Input() mobile: boolean;\n  @Input() debug = false;\n\n  @ViewChild('list', { static: true }) list: UserEventNotificationList<E, F>;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected cd: ChangeDetectorRef,\n    protected settings: LocalSettingsService,\n    protected modalController: ModalController,\n    @Optional() @Inject(APP_USER_EVENT_SERVICE) public userEventService: IUserEventService<E, IUserEventFilter<any>>\n  ) {\n    this.mobile = settings.mobile;\n  }\n\n  ngOnInit() {\n    this.itemCount$ = this.list.itemCount$;\n  }\n\n  protected close() {\n    this.modalController.dismiss();\n    this.userEventService?.resetCount();\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"secondary\">\n    @if (mobile) {\n      <ion-buttons slot=\"start\">\n        <ion-button (click)=\"close()\" visible-xs visible-sm>\n          <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n        </ion-button>\n      </ion-buttons>\n    }\n\n    <ion-title>\n      {{ titleI18n | translate }}\n      @if (itemCount$ | async; as count) {\n        <i>({{ count }})</i>\n      }\n    </ion-title>\n\n    <ion-buttons slot=\"end\">\n      @for (action of headerActions; track $index) {\n        <ion-button\n          (click)=\"list.executeAction($event, action, undefined)\"\n          [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n          [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n        >\n          {{ action.name | translate }}\n        </ion-button>\n      }\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-not-padding\">\n  <app-user-event-notification-list\n    #list\n    [showHeader]=\"false\"\n    [showFooter]=\"false\"\n    [sortBy]=\"sortBy\"\n    [sortDirection]=\"sortDirection\"\n    [filter]=\"filter\"\n    [enableInfiniteScroll]=\"enableInfiniteScroll\"\n    [infiniteScrollThreshold]=\"infiniteScrollThreshold\"\n    [mobile]=\"mobile\"\n    [debug]=\"debug\"\n    (dismiss)=\"close()\"\n  ></app-user-event-notification-list>\n</ion-content>\n\n<ion-footer>\n  <ion-toolbar>\n    <ion-row>\n      <ion-col>\n        @if (list.hasItem$ | async) {\n          <ion-button fill=\"clear\" (click)=\"list.markAllAsRead($event)\">\n            <ion-label translate>SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL</ion-label>\n          </ion-button>\n        }\n        @for (action of footerActions; track $index) {\n          <ion-button\n            fill=\"clear\"\n            (click)=\"list.executeAction($event, action, undefined)\"\n            [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n            [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n          >\n            {{ action.name | translate }}\n          </ion-button>\n        }\n      </ion-col>\n      @if (!mobile) {\n        <ion-col size=\"auto\">\n          <ion-button fill=\"solid\" color=\"tertiary\" (click)=\"close()\" hidden-xs hidden-sm>\n            {{ 'COMMON.BTN_CLOSE' | translate }}\n          </ion-button>\n        </ion-col>\n      }\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { ModalController, PopoverController } from '@ionic/angular';\nimport { APP_USER_EVENT_SERVICE, IUserEventService } from '../user-event.service';\nimport { UserEventNotificationList, UserEventNotificationListOptions } from './user-event-notification.list';\nimport { IUserEvent, IUserEventAction, IUserEventFilter } from '../user-event.model';\nimport { AccountService } from '../../../core/services/account.service';\nimport { map, tap } from 'rxjs/operators';\nimport { isNil, toBoolean } from '../../../shared/functions';\nimport { AppColors } from '../../../shared/types';\nimport { LocalSettingsService } from '../../../core/services/local-settings.service';\nimport { UserEventNotificationModal } from './user-event-notification.modal';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\n@Component({\n  selector: 'app-user-event-notification-icon',\n  templateUrl: './user-event-notification.icon.html',\n  styleUrls: ['./user-event-notification.icon.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserEventNotificationIcon implements OnInit, OnDestroy {\n  private _logPrefix = '[user-event-notification] ';\n  private _readEvent = new EventEmitter<IUserEvent<any>>();\n  private _readEvents = new EventEmitter<IUserEvent<any>[]>();\n\n  protected visible: boolean;\n  protected readonly count$: Observable<number>;\n\n  @Input() titleI18n = 'SOCIAL.USER_EVENT.NOTIFICATION.TITLE';\n  @Input() disabled = false;\n  @Input() filter: any = null;\n  @Input() autoHide: boolean = false;\n  @Input() headerActions: IUserEventAction[];\n  @Input() footerActions: IUserEventAction[];\n  @Input() style: 'mat-button' | 'ion-button' = 'mat-button';\n  @Input() color: AppColors;\n  @Input() unreadColor: AppColors;\n  @Input() fill: 'clear' | 'outline' | 'solid';\n  @Input() mobile: boolean;\n  @Input() listStyle: 'popover' | 'modal';\n  @Input() debug = false;\n\n  @Output('showList') onShowList = new EventEmitter<Event>();\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    @Optional() @Inject(APP_USER_EVENT_SERVICE) public userEventService: IUserEventService<IUserEvent<any>, IUserEventFilter<any>>,\n    protected accountService: AccountService,\n    protected popoverController: PopoverController,\n    protected modalController: ModalController,\n    protected settings: LocalSettingsService,\n    private cd: ChangeDetectorRef\n  ) {\n    this.mobile = settings.mobile;\n    this.listStyle = this.mobile ? 'modal' : 'popover';\n    this.count$ = !this.userEventService\n      ? of()\n      : this.userEventService.countSubject.pipe(\n          tap((value) => {\n            const visible = !this.autoHide || value > 0;\n            this.setVisible(visible);\n          }),\n          map((value) => (value === 0 ? undefined : value))\n        );\n  }\n\n  async ngOnInit() {\n    // Service is missing: fallback\n    if (isNil(this.userEventService)) {\n      console.warn(`${this._logPrefix}No service injected`);\n      this.disabled = true;\n      this.setVisible(false);\n      return;\n    }\n\n    // User event service exists\n    else {\n      this.setVisible(toBoolean(this.visible, !this.autoHide));\n\n      // Wait service\n      await this.userEventService.ready();\n\n      // Subscribe to read event\n      this._readEvent.subscribe((item) => {\n        // default: mark event as read\n        this.userEventService.markAllAsRead([item]);\n      });\n      this._readEvents.subscribe((items) => {\n        this.userEventService.markAllAsRead(items);\n      });\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.debug) {\n      console.debug(`${this._logPrefix}Destroying`);\n    }\n    this._readEvent.complete();\n    this._readEvents.complete();\n  }\n\n  async showList(\n    event: Event = undefined,\n    options?: UserEventNotificationListOptions & {\n      style: 'modal' | 'popover';\n    }\n  ) {\n    if (this.onShowList.observed) {\n      this.onShowList.emit(event);\n      return;\n    }\n    // Reset count (if not auto hide. else it will be hidden bellow)\n    if (!this.autoHide) {\n      this.userEventService.resetCount();\n    }\n\n    options = {\n      debug: this.debug,\n      titleI18n: this.titleI18n,\n      readEvent: this._readEvent,\n      readEvents: this._readEvents,\n      filter: this.filter,\n      headerActions: this.headerActions,\n      footerActions: this.footerActions,\n      showTooltip: this.showTooltip,\n      ...options,\n    };\n\n    // Open using modal\n    const listStyle = options?.style || this.listStyle;\n    if (listStyle === 'modal') {\n      const modal = await this.modalController.create({\n        component: UserEventNotificationModal,\n        componentProps: options,\n        backdropDismiss: true,\n        keyboardClose: true,\n        cssClass: 'modal-notifications',\n      });\n      await modal.present();\n    }\n\n    // Open using popover\n    else {\n      const popover = await this.popoverController.create({\n        component: UserEventNotificationList,\n        componentProps: options,\n        backdropDismiss: true,\n        keyboardClose: true,\n        event,\n        translucent: true,\n        cssClass: 'popover-large popover-notifications',\n      });\n      await popover.present();\n    }\n\n    // Reset count (if auto hide - after list has been opened)\n    if (this.autoHide) {\n      this.userEventService.resetCount();\n    }\n  }\n\n  protected setVisible(value: boolean) {\n    if (this.visible !== value) {\n      this.visible = value;\n      this.cd.markForCheck();\n    }\n  }\n}\n","@let count = count$ | async;\n@if (visible) {\n  @switch (style) {\n    <!-- mat icon button (e.g. for home toolbar) -->\n    @case ('mat-button') {\n      <button\n        mat-icon-button\n        [color]=\"(count && unreadColor) || color | matColor\"\n        [title]=\"!showTooltip ? (titleI18n | translate) : ''\"\n        [matTooltip]=\"showTooltip ? (titleI18n | translate) : ''\"\n        [disabled]=\"disabled\"\n        (click)=\"showList($event)\"\n      >\n        <mat-icon\n          [matBadge]=\"count | badgeNumber\"\n          [matBadgeHidden]=\"!count\"\n          matBadgeColor=\"accent\"\n          matBadgeSize=\"small\"\n          matBadgePosition=\"above after\"\n          aria-hidden=\"false\"\n        >\n          notifications\n        </mat-icon>\n      </button>\n    }\n\n    <!-- ion button (e.g. for home toolbar) -->\n    @case ('ion-button') {\n      <ion-button\n        [fill]=\"fill\"\n        [color]=\"(count && unreadColor) || color\"\n        [title]=\"!showTooltip ? (titleI18n | translate) : ''\"\n        [matTooltip]=\"showTooltip ? (titleI18n | translate) : ''\"\n        [disabled]=\"disabled\"\n        (click)=\"showList($event)\"\n      >\n        <mat-icon\n          slot=\"icon-only\"\n          [matBadge]=\"count | badgeNumber\"\n          [matBadgeHidden]=\"!count\"\n          matBadgeColor=\"accent\"\n          matBadgeSize=\"small\"\n          matBadgePosition=\"above after\"\n          aria-hidden=\"false\"\n        >\n          notifications\n        </mat-icon>\n      </ion-button>\n    }\n  }\n}\n","import { isNotEmptyArray, isNotNilOrBlank } from '../../shared/functions';\nimport { truncateHtml } from '../../shared/html.utils';\n\nexport interface JsonFeed<I extends JsonFeedItem = JsonFeedItem> {\n  version: string;\n  title: string;\n  home_page_url?: string;\n  feed_url?: string;\n  description?: string;\n  user_comment?: string;\n  next_url?: string;\n  icon?: string;\n  favicon?: string;\n  authors: JsonFeedAuthor[];\n  language?: string;\n  expired?: boolean;\n\n  items: I[];\n\n  hubs?: {\n    type?: string;\n    url: string;\n  }[];\n\n  // Custom property\n  tag_template?: string;\n\n  /**\n   * @deprecated since version 1.1\n   */\n  author: JsonFeedAuthor;\n}\n\nexport interface JsonFeedItem {\n  id: string;\n  url?: string;\n  external_url?: string;\n  title?: string;\n\n  content_html?: string;\n  content_text?: string;\n\n  summary?: string;\n  banner_image?: string;\n  date_published?: string;\n  date_modified?: string;\n  authors: JsonFeedAuthor[];\n  tags: string[];\n  language: string;\n\n  /**\n   * @deprecated since version 1.1\n   */\n  author: JsonFeedAuthor;\n\n  // Custom property\n  truncated: boolean;\n}\n\nexport interface JsonFeedAuthor {\n  id?: string; // Not in the JsonFeed 1.1 specifications\n\n  name?: string;\n  url?: string;\n  avatar?: string;\n}\n\nexport class JsonFeedUtils {\n  static DEFAULT_MAX_POST_AGE_IN_MONTHS = 3;\n\n  static VERSION_1 = 'https://jsonfeed.org/version/1';\n  static VERSION_1_1 = 'https://jsonfeed.org/version/1.1';\n\n  static ACCEPTED_VERSIONS = [this.VERSION_1, this.VERSION_1_1];\n\n  static removeJsonExtension(url: string) {\n    if (!url) return url;\n    return url.replace(/\\.json$/, '');\n  }\n\n  static isJsonFeed(json: any): json is JsonFeed {\n    return (json && this.ACCEPTED_VERSIONS.includes(json.version) && isNotEmptyArray(json.items)) || isNotNilOrBlank(json.next_url);\n  }\n\n  static isJsonFeedItem(json: any): json is JsonFeedItem {\n    return json && isNotEmptyArray(json.id) && (isNotNilOrBlank(json.content_text) || isNotNilOrBlank(json.content_html));\n  }\n\n  static truncateFeedItemsHtml(feed: JsonFeed, opts?: { maxContentLength?: number }): JsonFeed {\n    if (!feed?.items) return feed;\n\n    feed.items.forEach((item) => {\n      // Truncate items html\n      if (item.content_html) {\n        const html = truncateHtml(item.content_html, opts?.maxContentLength);\n        item.truncated = html.length !== item.content_html.length;\n        item.content_html = html;\n      }\n    });\n\n    return feed;\n  }\n\n  static truncateHtml = truncateHtml;\n\n  /**\n   * Migrate from old version 1.0 to 1.1\n   * @param feed\n   */\n  static migrateFeed(feed: JsonFeed): JsonFeed {\n    if (!feed) return feed;\n\n    // Migrate from old version 1.0 to 1.1\n    if (feed.version === JsonFeedUtils.VERSION_1) {\n      // Migrate feed author\n      if (feed.author && !feed.authors) {\n        feed.authors = [feed.author];\n        delete feed.author;\n      }\n\n      // Migrate items author\n      feed.items?.forEach((item) => {\n        if (item.author && !item.authors) {\n          item.authors = [item.author];\n          delete item.author;\n        }\n      });\n\n      // Change version\n      feed.version = JsonFeedUtils.VERSION_1_1;\n    }\n    return feed;\n  }\n}\n","import { EntityClass } from '../../core/services/model/entity.decorators';\nimport { EntityFilter } from '../../core/services/model/filter.model';\nimport { Person } from '../../core/services/model/person.model';\nimport { EntityAsObjectOptions, EntityUtils } from '../../core/services/model/entity.model';\nimport { StoreObject } from '@apollo/client/core';\nimport { getPropertyByPath, isNil, isNotEmptyArray, isNotNil } from '../../shared/functions';\nimport { FilterFn } from '../../shared/types';\n\n// @dynamic\n@EntityClass({ typename: 'PersonFilterVO' })\nexport class PersonFilter<F extends PersonFilter<F, T> = PersonFilter<any, any>, T extends Person<T> = Person<any>> extends EntityFilter<F, T> {\n  static FIELDS: (keyof PersonFilter)[] = [\n    '__typename',\n    'id',\n    'updateDate',\n    'email',\n    'pubkey',\n    'searchText',\n    'statusIds',\n    'userProfiles',\n    'excludedIds',\n    'searchAttribute',\n    'searchAttributes',\n    'additionalFields',\n  ];\n\n  static fromObject: (source, opts?: any) => PersonFilter;\n\n  static asFilterFn(source: any): FilterFn<Person> {\n    return PersonFilter.fromObject(source)?.asFilterFn();\n  }\n\n  /**\n   * @deprecated Use `PersonFilter.asFilterFn` instead\n   */\n  static searchFilter = PersonFilter.asFilterFn;\n\n  email: string;\n  pubkey: string;\n  searchText: string;\n  statusIds: number[];\n  userProfiles: string[];\n  includedIds: number[];\n  excludedIds: number[];\n  searchAttribute: string;\n  searchAttributes: string[];\n  additionalFields: PersonFilterAdditionalFields;\n\n  constructor() {\n    super(PersonFilter.TYPENAME);\n  }\n\n  fromObject(source: any, opts?: EntityAsObjectOptions) {\n    super.fromObject(source, opts);\n    this.email = source.email;\n    this.pubkey = source.pubkey;\n    this.searchText = source.searchText;\n    this.statusIds = source.statusIds || (isNotNil(source.statusId) ? [source.statusId] : undefined);\n    this.userProfiles = source.userProfiles;\n    this.excludedIds = source.excludedIds;\n    this.searchAttribute = source.searchAttribute;\n    this.searchAttributes = source.searchAttributes;\n\n    // Extract additional fields\n    this.additionalFields = PersonFilterAdditionalFields.fromObject(source, opts);\n  }\n\n  asObject(opts?: EntityAsObjectOptions): StoreObject {\n    const target = super.asObject(opts);\n    target.email = this.email;\n    target.pubkey = this.pubkey;\n    target.searchText = this.searchText;\n    target.statusIds = this.statusIds;\n    target.userProfiles = this.userProfiles;\n    target.excludedIds = this.excludedIds;\n    target.searchAttribute = this.searchAttribute;\n    target.searchAttributes = this.searchAttributes;\n\n    PersonFilterAdditionalFields.asObject(this.additionalFields, target, opts);\n    delete target.additionalFields;\n\n    if (opts?.minify) {\n      target.userProfiles = Array.isArray(target.userProfiles) ? target.userProfiles?.map((up) => up?.label ?? up) : undefined;\n    }\n    return target;\n  }\n\n  protected buildFilter(): FilterFn<Person>[] {\n    const filterFns = super.buildFilter();\n\n    // Filter by status\n    if (isNotEmptyArray(this.statusIds)) {\n      filterFns.push((e) => this.statusIds.includes(e.statusId));\n    }\n\n    // Filter included ids\n    const includedIds = this.includedIds;\n    if (isNotEmptyArray(includedIds)) {\n      filterFns.push((e) => isNotNil(e.id) && includedIds.includes(e.id));\n    }\n\n    // Filter excluded ids\n    const excludedIds = this.excludedIds;\n    if (isNotEmptyArray(excludedIds)) {\n      filterFns.push((e) => isNil(e.id) || !excludedIds.includes(e.id));\n    }\n\n    // Search text\n    const searchTextFilter = EntityUtils.searchTextFilter(\n      this.searchAttribute || this.searchAttributes || ['lastName', 'firstName', 'department.name'],\n      this.searchText\n    );\n    if (searchTextFilter) filterFns.push(searchTextFilter);\n\n    // Filter by additional fields\n    if (this.additionalFields) {\n      Object.keys(this.additionalFields).forEach((fieldKey) => {\n        const fieldValue = this.additionalFields[fieldKey];\n        if (isNotNil(fieldValue)) {\n          filterFns.push((person: Person) => {\n            const personValue = getPropertyByPath(person, fieldKey);\n            // Handle different value types (string, object with id, array, etc.)\n            if (Array.isArray(fieldValue)) {\n              // Multiple selection - check if person value matches any selected value\n              return fieldValue.some((selectedValue) => {\n                const selectedId = selectedValue?.id ?? selectedValue;\n                const personId = personValue?.id ?? personValue;\n                return selectedId === personId;\n              });\n            } else {\n              // Single value - direct comparison\n              const selectedId = fieldValue?.id ?? fieldValue;\n              const personId = personValue?.id ?? personValue;\n              return selectedId === personId;\n            }\n          });\n        }\n      });\n    }\n\n    return filterFns;\n  }\n}\n\nexport class PersonFilterAdditionalFields {\n  [key: string]: any;\n\n  static fromObject(source: any, opts?: any): { [key: string]: any } {\n    if (!source || !(typeof source == 'object')) return;\n    return (\n      Object.keys(source)\n        // Exclude common fields, from PersonFilter\n        .filter((key) => !PersonFilter.FIELDS.includes(key as keyof PersonFilter) && key !== 'and' && key !== 'or' && key !== 'not')\n        .reduce(\n          (target, key) => {\n            if (isNil(source[key])) return target;\n            target = target || {};\n            target[key] = source[key];\n            return target;\n          },\n          undefined as { [key: string]: any }\n        )\n    );\n  }\n\n  static asObject(source: any, target: any = {}, opts?: EntityAsObjectOptions): { [key: string]: any } {\n    if (!source || !(typeof source == 'object')) return;\n    Object.keys(source).reduce((target, key) => {\n      const value = EntityUtils.asObject(source[key], opts);\n      if (isNil(value)) return target;\n      target = target || {};\n      target[key] = value;\n      return target;\n    }, target);\n    return target;\n  }\n}\n","import { EntityClass } from '../../core/services/model/entity.decorators';\nimport { Entity, EntityAsObjectOptions } from '../../core/services/model/entity.model';\nimport { StoreObject } from '@apollo/client/core';\nimport { EntityFilter } from '../../core/services/model/filter.model';\nimport { Person } from '../../core/services/model/person.model';\nimport { PersonFilter } from '../../admin/users/person.filter';\nimport { FilterFn } from '../../shared/types';\nimport { fromDateISOString, toDateISOString } from '../../shared/dates';\nimport { Moment } from 'moment';\n\nexport const MessageTypes = {\n  INBOX_MESSAGE: 'INBOX_MESSAGE',\n  EMAIL: 'EMAIL',\n  FEED: 'FEED',\n};\nexport const MessageTypeList = Object.freeze([\n  {\n    id: MessageTypes.INBOX_MESSAGE,\n    icon: 'notifications',\n    label: 'SOCIAL.MESSAGE.TYPE_ENUM.INBOX_MESSAGE',\n  },\n  {\n    id: MessageTypes.EMAIL,\n    icon: 'mail',\n    label: 'SOCIAL.MESSAGE.TYPE_ENUM.EMAIL',\n  },\n  {\n    id: MessageTypes.FEED,\n    icon: 'megaphone',\n    label: 'SOCIAL.MESSAGE.TYPE_ENUM.FEED',\n  },\n]);\n\n// @dynamic\n@EntityClass({ typename: 'MessageVO' })\nexport class Message extends Entity<Message> {\n  static fromObject: (source: any, opts?: any) => Message;\n\n  type: string;\n  issuer: Person;\n  recipient: Person;\n  recipients: Person[];\n  recipientFilter: PersonFilter;\n  subject: string;\n  body: string;\n  creationDate: Moment;\n\n  constructor() {\n    super();\n  }\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source, opts);\n    this.type = source.type;\n    this.issuer = source.issuer && Person.fromObject(source.issuer);\n    this.recipient = source.recipient && Person.fromObject(source.recipient);\n    this.recipients = source.recipients && source.recipients.map(Person.fromObject);\n    this.recipientFilter = (source.recipientFilter && PersonFilter.fromObject(source.recipientFilter)) || undefined;\n    this.subject = source.subject;\n    this.body = source.body;\n    this.creationDate = fromDateISOString(source.creationDate);\n  }\n\n  asObject(opts?: EntityAsObjectOptions): StoreObject {\n    const target = super.asObject(opts);\n    target.creationDate = toDateISOString(this.creationDate);\n    target.recipient = this.recipient?.asObject(opts);\n    target.recipients = this.recipients?.map((p) => p.asObject(opts));\n    target.recipientFilter = (this.recipientFilter && this.recipientFilter.asObject(opts)) || undefined;\n    if (opts.minify) {\n      target.recipients = target.recipient ? [target.recipient, ...((target.recipients as any[]) || [])] : target.recipients;\n      delete target.recipient;\n    }\n    return target;\n  }\n}\n\n// @dynamic\n@EntityClass({ typename: 'MessageFilterVO' })\nexport class MessageFilter extends EntityFilter<MessageFilter, Message> {\n  static fromObject: (source: any, opts?: any) => MessageFilter;\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source, opts);\n  }\n\n  protected buildFilter(): FilterFn<Message>[] {\n    return super.buildFilter();\n  }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector, Input, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { Message, MessageTypeList, MessageTypes } from './message.model';\nimport { AppForm } from '../../core/form/form.class';\nimport { StatusIds } from '../../core/services/model/model.enum';\nimport { Person, PersonUtils } from '../../core/services/model/person.model';\nimport { SuggestFn } from '../../shared/services/entity-service.class';\nimport { PersonFilter } from '../../admin/users/person.filter';\nimport { EntityUtils } from '../../core/services/model/entity.model';\nimport { changeCaseToUnderscore, isNotNil, toBoolean } from '../../shared/functions';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n  selector: 'app-message-form',\n  templateUrl: './message.form.html',\n  styleUrls: ['./message.form.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageForm extends AppForm<Message> implements OnInit {\n  @Input() mobile: boolean;\n  @Input() suggestFn: SuggestFn<Person, PersonFilter>;\n  @Input() subjectMinLength = 5;\n  @Input() subjectMaxLength = 255;\n  @Input() bodyMaxLength = 2000;\n  @Input() bodyAutoHeight = true;\n  @Input() canSelectType = false;\n  @Input() canRecipientFilter = false;\n  @Input() recipientFilterCount = 0;\n\n  types = MessageTypeList;\n\n  constructor(\n    injector: Injector,\n    private formBuilder: UntypedFormBuilder,\n    private readonly cd: ChangeDetectorRef\n  ) {\n    super(injector);\n    this.mobile = this.settings.mobile;\n  }\n\n  ngOnInit() {\n    this.setForm(\n      this.formBuilder.group({\n        id: [null],\n        type: [MessageTypes.INBOX_MESSAGE, Validators.required],\n        recipients: [null, Validators.required],\n        recipientFilter: [null],\n        subject: [\n          null,\n          this.subjectMaxLength\n            ? Validators.compose([Validators.required, Validators.minLength(this.subjectMinLength), Validators.maxLength(this.subjectMaxLength)])\n            : Validators.required,\n        ],\n        body: [null, this.bodyMaxLength ? Validators.compose([Validators.maxLength(this.bodyMaxLength)]) : Validators.required],\n        creationDate: [null],\n        updateDate: [null],\n      })\n    );\n\n    this.registerSubscription(\n      this._form\n        .get('type')\n        .valueChanges.pipe(filter(isNotNil))\n        .subscribe((type) => this.updateFormGroup(this._form, { type }))\n    );\n\n    // Person combo\n    const personAttributes = this.settings.getFieldDisplayAttributes('person', ['lastName', 'firstName', 'department.name']);\n    this.registerAutocompleteField('recipients', {\n      showAllOnFocus: false,\n      suggestFn: this.suggestFn,\n      filter: {\n        statusIds: [StatusIds.TEMPORARY, StatusIds.ENABLE],\n      },\n      attributes: personAttributes,\n      columnNames: personAttributes.map((attr) => `USER.${changeCaseToUnderscore(attr).toUpperCase()}`),\n      displayWith: PersonUtils.personToString,\n      multiple: true,\n      mobile: this.mobile,\n    });\n  }\n\n  isSamePerson(o1: Person, o2: Person): boolean {\n    return EntityUtils.equals(o1, o2, 'id');\n  }\n\n  protected updateFormGroup(formGroup: UntypedFormGroup, opts?: { type?: string; recipientRequired?: boolean }) {\n    console.debug('[message-form] Updating form group...', opts);\n\n    // Recipient validator\n    const recipientsRequired = toBoolean(opts?.recipientRequired, opts?.type !== MessageTypes.FEED);\n    {\n      const control = formGroup.get('recipients');\n      if (recipientsRequired) {\n        if (!control.hasValidator(Validators.required)) {\n          control.addValidators(Validators.required);\n        }\n        control.enable();\n      } else {\n        if (control.hasValidator(Validators.required)) {\n          control.removeValidators(Validators.required);\n        }\n        control.disable();\n      }\n    }\n\n    // Recipient filter validator\n    const recipientFilterRequired = this.canRecipientFilter && !recipientsRequired;\n    {\n      const control = formGroup.get('recipientFilter');\n      if (recipientFilterRequired) {\n        if (!control.hasValidator(Validators.required)) {\n          control.addValidators(Validators.required);\n        }\n        control.enable();\n      } else {\n        if (control.hasValidator(Validators.required)) {\n          control.removeValidators(Validators.required);\n        }\n        control.disable();\n      }\n    }\n\n    formGroup.updateValueAndValidity();\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<!-- debug -->\n@if (debug) {\n  <ng-container *ngTemplateOutlet=\"debugPanel\"></ng-container>\n}\n\n<form [formGroup]=\"form\" class=\"form-container\">\n  <!-- type -->\n  <mat-form-field *ngIf=\"canSelectType\">\n    <mat-label>{{ 'SOCIAL.MESSAGE.TYPE' | translate }}</mat-label>\n    <mat-select formControlName=\"type\">\n      @for (item of types; track item.id) {\n        @if (canRecipientFilter || item.id !== 'FEED') {\n          <mat-option [value]=\"item.id\">\n            <ion-icon [name]=\"item.icon\"></ion-icon>\n            {{ item.label | translate }}\n          </mat-option>\n        }\n      }\n    </mat-select>\n  </mat-form-field>\n\n  <!-- Recipients -->\n  @if ((form | formGetValue: 'type') !== 'FEED') {\n    <mat-chips-field\n      formControlName=\"recipients\"\n      chipColor=\"accent\"\n      [placeholder]=\"'SOCIAL.MESSAGE.RECIPIENTS' | translate\"\n      [config]=\"autocompleteFields.recipients\"\n      [equals]=\"isSamePerson\"\n    ></mat-chips-field>\n  } @else {\n    <mat-form-field>\n      <input matInput hidden formControlName=\"recipients\" type=\"text\" />\n      <mat-chip-grid>\n        <mat-chip-row>\n          {{ 'SOCIAL.MESSAGE.RECIPIENT_FILTER_COUNT' | translate: { count: recipientFilterCount } }}\n        </mat-chip-row>\n      </mat-chip-grid>\n    </mat-form-field>\n  }\n\n  <!-- Subject -->\n  <mat-form-field>\n    <mat-label>{{ 'SOCIAL.MESSAGE.SUBJECT' | translate }}</mat-label>\n    <input matInput type=\"text\" formControlName=\"subject\" autocomplete=\"off\" required />\n    <mat-error *ngIf=\"form.controls.subject.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n    <mat-error *ngIf=\"form.controls.subject.hasError('minlength')\">\n      {{ 'ERROR.FIELD_MIN_LENGTH_COMPACT' | translate }}\n    </mat-error>\n    <mat-error *ngIf=\"form.controls.subject.hasError('maxlength')\">\n      {{ 'ERROR.FIELD_MAX_LENGTH_COMPACT' | translate }}\n    </mat-error>\n    <mat-hint *ngIf=\"subjectMaxLength\" align=\"end\">\n      {{\n        'INFO.TEXT_PROGRESS' | translate: { current: form.controls.subject.value?.length || 0, max: subjectMaxLength }\n      }}\n    </mat-hint>\n  </mat-form-field>\n\n  <!-- Body -->\n  <mat-form-field>\n    <mat-label>{{ 'SOCIAL.MESSAGE.BODY_HELP' | translate }}</mat-label>\n    <textarea\n      matInput\n      type=\"text\"\n      formControlName=\"body\"\n      [class.fixed-height]=\"!bodyAutoHeight\"\n      [cdkTextareaAutosize]=\"bodyAutoHeight\"\n      (keydown.control.enter)=\"doSubmit($event)\"\n    ></textarea>\n    <mat-error *ngIf=\"form.controls.body.hasError('maxlength')\">\n      {{ 'ERROR.FIELD_MAX_LENGTH' | translate: form.controls.body.errors.maxlength }}\n    </mat-error>\n    <mat-hint *ngIf=\"bodyMaxLength\" align=\"end\">\n      {{ 'INFO.TEXT_PROGRESS' | translate: { current: form.controls.body.value?.length || 0, max: bodyMaxLength } }}\n    </mat-hint>\n  </mat-form-field>\n</form>\n\n\n<ng-template #debugPanel>\n  <app-debug title=\"Message form\">\n    <ion-grid>\n      <ion-row>\n        <ion-col>\n          ready: {{ readySubject | async }}\n          <br />\n          loading: {{ loadingSubject | async }}\n          <br />\n          enabled: {{ enabled }}\n          <br />\n          dirty: {{ dirty }}\n          <br />\n          valid: {{ valid }}\n          <br />\n          <br />\n          error: {{ _form | formError | json}}\n          <br />\n          recipients: {{ _form | formGetValue: 'recipients' | personToString}}\n          <br />\n          recipientFilter: {{ _form | formGetValue: 'recipientFilter' | json}}\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </app-debug>\n</ng-template>\n","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core';\n\nimport { ModalController } from '@ionic/angular';\nimport { Message, MessageTypes } from './message.model';\nimport { Person } from '../../core/services/model/person.model';\nimport { SuggestFn } from '../../shared/services/entity-service.class';\nimport { PersonFilter } from '../../admin/users/person.filter';\nimport { LocalSettingsService } from '../../core/services/local-settings.service';\nimport { MessageForm } from './message.form';\nimport { firstNotNilPromise } from '../../shared/observables';\nimport { AppFormUtils } from '../../core/form/form.utils';\nimport { toBoolean } from '../../shared/functions';\nimport { AccountService } from '../../core/services/account.service';\n\nexport interface MessageModalOptions {\n  debug?: boolean;\n  suggestFn: SuggestFn<Person, PersonFilter>;\n  title?: string;\n  data?: Message;\n  canSelectType?: boolean;\n  canRecipientFilter?: boolean;\n  recipientFilterCount?: number;\n}\n\n@Component({\n  selector: 'app-message-modal',\n  templateUrl: './message.modal.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageModal implements OnInit, AfterViewInit, MessageModalOptions {\n  readonly mobile: boolean;\n\n  @Input() debug = false;\n  @Input() title = 'SOCIAL.MESSAGE.NEW.TITLE';\n  @Input() suggestFn: SuggestFn<Person, PersonFilter>;\n  @Input() data: Message;\n  @Input() canSelectType: boolean;\n  @Input() canRecipientFilter: boolean;\n  @Input() recipientFilterCount: number;\n\n  @ViewChild('form', { static: true }) private form: MessageForm;\n\n  constructor(\n    protected settings: LocalSettingsService,\n    protected viewCtrl: ModalController,\n    protected accountService: AccountService,\n    protected cd: ChangeDetectorRef\n  ) {\n    this.mobile = this.settings.mobile;\n  }\n\n  ngOnInit() {\n    this.canSelectType = toBoolean(this.canSelectType, this.accountService.isAdmin());\n  }\n\n  ngAfterViewInit() {\n    setTimeout(() => {\n      this.form.markAsReady({ emitEvent: false });\n      if (this.data) {\n        this.data.type = this.data.type || MessageTypes.INBOX_MESSAGE;\n        this.form.setValue(this.data);\n      }\n      this.form.markAsLoaded();\n      this.form.enable();\n    });\n  }\n\n  cancel() {\n    this.viewCtrl.dismiss();\n  }\n\n  async doSubmit(): Promise<any> {\n    if (this.form.disabled) return;\n    if (!this.form.valid) {\n      await AppFormUtils.waitWhilePending(this.form);\n\n      if (this.form.invalid) {\n        AppFormUtils.logFormErrors(this.form.form, '[message-modal] ');\n        this.form.markAllAsTouched();\n        return;\n      }\n    }\n    this.markAsLoading();\n\n    try {\n      const data = this.form.value;\n\n      // Disable the form\n      this.form.disable();\n\n      const entity = Message.fromObject(data);\n\n      return this.viewCtrl.dismiss(entity);\n    } catch (err) {\n      this.form.error = (err && err.message) || err;\n      this.markAsLoaded();\n\n      // Enable the form\n      this.form.enable();\n\n      // Reset form error on next changes\n      firstNotNilPromise(this.form.form.valueChanges).then(() => {\n        this.form.error = null;\n        this.markForCheck();\n      });\n\n      return;\n    }\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected markAsLoading(opts?: { emitEvent?: boolean }) {\n    this.form.markAsLoading(opts);\n  }\n\n  protected markAsLoaded(opts?: { emitEvent?: boolean }) {\n    this.form.markAsLoaded(opts);\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"secondary\">\n    <ion-buttons slot=\"start\">\n      <ion-button class=\"back-button\" (click)=\"cancel()\" visible-xs visible-sm visible-mobile>\n        <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n\n    <ion-title>\n      {{ title | translate}}\n    </ion-title>\n\n    <ion-buttons slot=\"end\">\n      <ion-button\n        class=\"back-button\"\n        (click)=\"doSubmit()\"\n        [disabled]=\"!form.valid\"\n        visible-xs\n        visible-sm\n        visible-mobile\n      >\n        <ion-icon slot=\"icon-only\" name=\"checkmark\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <ion-item *ngIf=\"form.error\" visible-xs visible-sm visible-mobile lines=\"none\">\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"form.error | translate\"></ion-label>\n  </ion-item>\n\n  <app-message-form\n    #form\n    (onSubmit)=\"doSubmit()\"\n    (onCancel)=\"cancel()\"\n    [canSelectType]=\"canSelectType\"\n    [canRecipientFilter]=\"canRecipientFilter\"\n    [recipientFilterCount]=\"recipientFilterCount\"\n    [suggestFn]=\"suggestFn\"\n    [debug]=\"debug\">\n  ></app-message-form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <ion-toolbar>\n    <ion-row class=\"ion-no-padding\" nowrap>\n      <ion-col></ion-col>\n\n      <!-- buttons -->\n      <ion-col size=\"auto\">\n        <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n\n        <ion-button\n          [fill]=\"form.invalid ? 'clear' : 'solid'\"\n          [disabled]=\"form.loading || form.invalid\"\n          (keyup.enter)=\"doSubmit()\"\n          (click)=\"doSubmit()\"\n          color=\"tertiary\"\n        >\n          <ion-label translate>COMMON.BTN_SEND</ion-label>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { Directive, Injectable, inject, Inject, InjectionToken, Optional, Provider } from '@angular/core';\nimport { GraphqlService } from '../../core/graphql/graphql.service';\nimport { Person } from '../../core/services/model/person.model';\nimport { StatusIds } from '../../core/services/model/model.enum';\nimport { SortDirection } from '@angular/material/sort';\nimport {\n  EntitiesServiceLoadOptions,\n  EntitiesServiceWatchOptions,\n  EntityServiceLoadOptions,\n  IEntitiesService,\n  LoadResult,\n  SuggestService,\n} from '../../shared/services/entity-service.class';\nimport { PlatformService } from '../../core/services/platform.service';\nimport { PersonFilter } from './person.filter';\nimport {\n  BaseEntityGraphqlMutations,\n  BaseEntityGraphqlQueries,\n  BaseEntityGraphqlSubscriptions,\n  BaseEntityService,\n  BaseEntityServiceOptions,\n} from '../../core/services/base-entity-service.class';\nimport { IStartableService } from '../../shared/services/startable-service.class';\nimport { isNotEmptyArray } from '../../shared/functions';\nimport { NetworkService } from '../../core/services/network.service';\nimport { EntitiesStorage } from '../../core/services/storage/entities-storage.service';\nimport { ENVIRONMENT } from '../../../environments/environment.class';\nimport { gql } from 'apollo-angular';\n\nexport const APP_PERSON_SERVICE = new InjectionToken<IPersonService<any, any>>('PersonService');\n\nexport interface IPersonService<\n  E extends Person<E> = Person<any>,\n  F extends PersonFilter = PersonFilter,\n  ID = number,\n  WO extends EntitiesServiceWatchOptions<E> = EntitiesServiceWatchOptions<E>,\n  LO extends EntitiesServiceLoadOptions<E> = EntitiesServiceLoadOptions<E>,\n> extends IEntitiesService<E, F, WO>,\n    SuggestService<E, F>,\n    IStartableService {\n  loadAll(\n    offset: number,\n    size: number,\n    sortBy?: keyof Person | string,\n    sortDirection?: SortDirection,\n    filter?: Partial<PersonFilter>,\n    opts?: LO & {\n      debug?: boolean;\n    }\n  ): Promise<LoadResult<Person>>;\n\n  loadById(id: number, opts?: EntityServiceLoadOptions): Promise<Person>;\n\n  loadByPubkey(pubkey: string, opts?: EntityServiceLoadOptions): Promise<Person>;\n\n  countAll(filter?: Partial<F>, opts?: LO): Promise<number>;\n}\n\nexport interface AbstractPersonServiceOptions<\n  T extends Person<any>,\n  Q extends BaseEntityGraphqlQueries = BaseEntityGraphqlQueries,\n  M extends BaseEntityGraphqlMutations = BaseEntityGraphqlMutations,\n  S extends BaseEntityGraphqlSubscriptions = BaseEntityGraphqlSubscriptions,\n> extends BaseEntityServiceOptions<T, number, Q, M, S> {}\n\n// Allow apps to override GraphQL operations used by PersonService\nexport interface PersonServiceOptions {\n  queries?: Partial<BaseEntityGraphqlQueries>;\n  mutations?: Partial<BaseEntityGraphqlMutations>;\n  subscriptions?: Partial<BaseEntityGraphqlSubscriptions>;\n}\nexport const APP_PERSON_SERVICE_OPTIONS = new InjectionToken<PersonServiceOptions>('PersonServiceOptions');\n\n// This class is under GPLv3 license\n@Directive()\nexport abstract class AbstractPersonService<\n    E extends Person<E> = Person<any>,\n    F extends PersonFilter<F, E> = PersonFilter<any, E>,\n    Q extends BaseEntityGraphqlQueries = BaseEntityGraphqlQueries,\n    M extends BaseEntityGraphqlMutations = BaseEntityGraphqlMutations,\n    S extends BaseEntityGraphqlSubscriptions = BaseEntityGraphqlSubscriptions,\n    WO extends EntitiesServiceWatchOptions<E> = EntitiesServiceWatchOptions<E>,\n    LO extends EntitiesServiceLoadOptions<E> = EntitiesServiceLoadOptions<E>,\n    O extends AbstractPersonServiceOptions<E, Q, M, S> = AbstractPersonServiceOptions<E, Q, M, S>,\n  >\n  extends BaseEntityService<E, F, number, WO, LO>\n  implements IPersonService<E, F>\n{\n  protected network = inject(NetworkService);\n  protected entities = inject(EntitiesStorage);\n\n  protected constructor(\n    graphql: GraphqlService,\n    platform: PlatformService,\n    protected dataType: new () => E,\n    protected filterType: new () => F,\n    protected options: O\n  ) {\n    super(graphql, platform, dataType, filterType, options);\n\n    // for DEV only -----\n    this._debug = !inject(ENVIRONMENT).production;\n  }\n\n  async loadAll(\n    offset: number,\n    size: number,\n    sortBy?: keyof E | string,\n    sortDirection?: SortDirection,\n    filter?: Partial<F>,\n    opts?: EntitiesServiceLoadOptions & { debug?: boolean }\n  ): Promise<LoadResult<E>> {\n    const offline = this.network.offline && (!opts || opts.fetchPolicy !== 'network-only');\n    if (offline) {\n      return this.loadAllLocally(offset, size, sortBy as string, sortDirection, filter, opts);\n    }\n    return super.loadAll(offset, size, sortBy as any, sortDirection, filter, opts as any);\n  }\n\n  protected async loadAllLocally(\n    offset: number,\n    size: number,\n    sortBy?: string,\n    sortDirection?: SortDirection,\n    filter?: Partial<F>,\n    opts?: EntitiesServiceLoadOptions & { debug?: boolean }\n  ): Promise<LoadResult<E>> {\n    filter = this.asFilter(filter);\n\n    const variables = {\n      offset: offset || 0,\n      size: size || 100,\n      sortBy: sortBy || (this.defaultSortBy as string),\n      sortDirection: sortDirection || this.defaultSortDirection,\n      filter: (filter as any) && (filter as any).asFilterFn ? (filter as any).asFilterFn() : filter,\n    };\n\n    const typename = (this.dataType as any).TYPENAME || new this.dataType().__typename || 'PersonVO';\n    const { data, total } = await this.entities.loadAll<E>(typename, variables);\n\n    const entities = this.fromObjects(data, opts as any);\n    const res: LoadResult<E> = { data: entities, total } as any;\n\n    // Add fetch more function\n    const nextOffset = (offset || 0) + entities.length;\n    if (nextOffset < total) {\n      res.fetchMore = () => this.loadAllLocally(nextOffset, size, sortBy, sortDirection, filter, opts);\n    }\n\n    return res;\n  }\n\n  async suggest(\n    value: any,\n    filter?: Partial<F>,\n    sortBy?: keyof E | string,\n    sortDirection?: SortDirection,\n    opts?: EntitiesServiceLoadOptions\n  ): Promise<LoadResult<E>> {\n    if ((value as any)?.id != null) return { data: [value] } as any;\n    value = (typeof value === 'string' && value !== '*' && value) || undefined;\n    const f = (filter as any) || {};\n    sortBy = (sortBy as any) || f.searchAttribute || (f.searchAttributes && f.searchAttributes[0]);\n    return this.loadAll(\n      0,\n      !value ? 30 : 10,\n      sortBy,\n      sortDirection,\n      {\n        ...(filter as any),\n        searchText: value as string,\n        statusIds: (f && f.statusIds) || [StatusIds.ENABLE, StatusIds.TEMPORARY],\n        userProfiles: f && f.userProfiles,\n      },\n      {\n        withTotal: true /* need by autocomplete */,\n        ...(opts as any),\n      } as any\n    );\n  }\n\n  async loadById(id: number, opts?: EntityServiceLoadOptions): Promise<E> {\n    const { data } = await this.loadAll(0, 1, null as any, null as any, { includedIds: [id] } as any, { withTotal: false, ...(opts as any) });\n    const source = isNotEmptyArray(data) ? (data[0] as any) : ({ id } as any);\n    return this.fromObject(source, opts as any);\n  }\n\n  async loadByPubkey(pubkey: string, opts?: EntityServiceLoadOptions): Promise<E> {\n    const { data } = await this.loadAll(0, 1, null as any, null as any, { pubkey } as any, { withTotal: false, ...(opts as any) });\n    const source = isNotEmptyArray(data) ? (data[0] as any) : ({ pubkey } as any);\n    return this.fromObject(source, opts as any);\n  }\n\n  protected asObject(source: E | any): any {\n    return super.asObject(source);\n  }\n}\n\n/* ------------------------------------\n * Default GraphQL (from former testing service)\n * ------------------------------------*/\nexport const PersonFragments = {\n  lightPerson: gql`\n    fragment LightPersonFragment on PersonVO {\n      id\n      firstName\n      lastName\n      avatar\n      department {\n        id\n        label\n        name\n        __typename\n      }\n      __typename\n    }\n  `,\n\n  person: gql`\n    fragment PersonFragment on PersonVO {\n      id\n      firstName\n      lastName\n      email\n      pubkey\n      avatar\n      statusId\n      updateDate\n      creationDate\n      profiles\n      username\n      usernameExtranet\n      department {\n        id\n        label\n        name\n        logo\n        __typename\n      }\n      __typename\n    }\n  `,\n\n  personFilter: gql`\n    fragment PersonFilterFragment on PersonFilterVO {\n      email\n      pubkey\n      searchText\n      statusIds\n      userProfiles\n      includedIds\n      excludedIds\n      searchAttribute\n      searchAttributes\n    }\n  `,\n};\n\nconst DefaultPersonQueries: BaseEntityGraphqlQueries = {\n  loadAll: gql`\n    query Persons($offset: Int, $size: Int, $sortBy: String, $sortDirection: String, $filter: PersonFilterVOInput) {\n      data: persons(filter: $filter, offset: $offset, size: $size, sortBy: $sortBy, sortDirection: $sortDirection) {\n        ...PersonFragment\n      }\n    }\n    ${PersonFragments.person}\n  `,\n\n  loadAllWithTotal: gql`\n    query PersonsWithTotal($offset: Int, $size: Int, $sortBy: String, $sortDirection: String, $filter: PersonFilterVOInput) {\n      data: persons(filter: $filter, offset: $offset, size: $size, sortBy: $sortBy, sortDirection: $sortDirection) {\n        ...PersonFragment\n      }\n      total: personsCount(filter: $filter)\n    }\n    ${PersonFragments.person}\n  `,\n};\n\nconst DefaultPersonMutations: BaseEntityGraphqlMutations = {\n  saveAll: gql`\n    mutation savePersons($data: [PersonVOInput]) {\n      data: savePersons(persons: $data) {\n        ...PersonFragment\n      }\n    }\n    ${PersonFragments.person}\n  `,\n  deleteAll: gql`\n    mutation deletePersons($ids: [Int]) {\n      deletePersons(ids: $ids)\n    }\n  `,\n};\n\n@Injectable({ providedIn: 'root' })\nexport class PersonService extends AbstractPersonService<Person, PersonFilter> implements IPersonService {\n  constructor(\n    graphql: GraphqlService,\n    platform: PlatformService,\n    @Optional() @Inject(APP_PERSON_SERVICE_OPTIONS) options?: PersonServiceOptions\n  ) {\n    super(graphql, platform, Person, PersonFilter, {\n      queries: { ...DefaultPersonQueries, ...(options?.queries || {}) },\n      mutations: { ...DefaultPersonMutations, ...(options?.mutations || {}) },\n      subscriptions: options?.subscriptions as any,\n      defaultSortBy: 'lastName',\n      defaultSortDirection: 'asc',\n      watchQueriesDeletePolicy: 'refetch-queries',\n    });\n  }\n\n  /* -- protected methods -- */\n  protected asObject(source: Person | any): any {\n    if (!source) return undefined;\n\n    if (!(source instanceof Person)) {\n      source = Person.fromObject(source);\n    }\n    const target = source.asObject();\n\n    // Not known in server GraphQL schema\n    delete (target as any).mainProfile;\n\n    (target as any).department = source.department?.asObject();\n\n    return target;\n  }\n}\n\nexport function providePersonService() {\n  return <Provider>{\n    provide: APP_PERSON_SERVICE,\n    useExisting: PersonService,\n  }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { gql } from 'apollo-angular';\nimport { SocialErrorCodes } from '../social.errors';\nimport { GraphqlService } from '../../core/graphql/graphql.service';\nimport { ModalController, ToastController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BaseGraphqlService } from '../../core/services/base-graphql-service.class';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { Message, MessageFilter } from './message.model';\nimport { MINIFY_ENTITY_FOR_POD } from '../../core/services/model/referential.model';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { MessageModal, MessageModalOptions } from './message.modal';\nimport { OmitFunctions } from '../../core/services/model/entity.model';\nimport { PersonFragments } from '../../admin/users/person.service';\n\nconst MessageFragments = {\n  message: gql`\n    fragment MessageFragment on MessageVO {\n      id\n      subject\n      body\n      type\n      recipient {\n        ...LightPersonFragment\n      }\n      recipients {\n        ...LightPersonFragment\n      }\n      recipientFilter {\n        ...PersonFilterFragment\n      }\n      issuer {\n        ...LightPersonFragment\n      }\n      creationDate\n      updateDate\n    }\n  `,\n};\n\nconst Queries = {\n  load: gql`\n    mutation LoadMessage($id: Int!) {\n      data: message(id: $id) {\n        ...MessageFragment\n      }\n    }\n    ${MessageFragments.message}\n    ${PersonFragments.lightPerson}\n    ${PersonFragments.personFilter}\n  `,\n};\nconst Mutations = {\n  send: gql`\n    mutation SendMessage($data: MessageVOInput) {\n      done: sendMessage(message: $data)\n    }\n  `,\n  delete: gql`\n    mutation DeleteMessage($id: Int!) {\n      done: deleteMessage(id: $id)\n    }\n  `,\n};\n\n@Injectable({ providedIn: 'root' })\nexport class MessageService extends BaseGraphqlService<Message, MessageFilter> {\n  constructor(\n    protected graphql: GraphqlService,\n    protected translate: TranslateService,\n    protected modalCtrl: ModalController,\n    protected toastController: ToastController,\n    @Optional() @Inject(ENVIRONMENT) protected environment: Environment\n  ) {\n    super(graphql, environment);\n\n    // For DEV only\n    this._debug = !environment.production;\n  }\n\n  /**\n   * Send a message to recipient(s)\n   *\n   * @param entity\n   * @param opts\n   */\n  async send(entity: Message, opts?: { showToast?: boolean }): Promise<boolean> {\n    // Transform into json\n    const data = entity.asObject(MINIFY_ENTITY_FOR_POD);\n\n    const now = Date.now();\n    if (this._debug) console.debug(`[message-service] Sending message...`);\n\n    try {\n      const { done } = await this.graphql.mutate<{ done: boolean }>({\n        mutation: Mutations.send,\n        variables: { data },\n        error: { code: SocialErrorCodes.SEND_MESSAGE_ERROR, message: 'SOCIAL.ERROR.SEND_MESSAGE_ERROR' },\n      });\n\n      if (this._debug) console.debug(`[message-service] Send message [OK] in ${Date.now() - now}ms`);\n\n      if (done && (!opts || opts.showToast !== false)) {\n        await this.showToast({ type: 'info', message: 'SOCIAL.INFO.MESSAGE_SENT' });\n      }\n      return done;\n    } catch (err) {\n      const error = (err && err.message) || err;\n      console.error(error);\n\n      // Show error\n      if (!opts || opts.showToast !== false) {\n        const message = error || 'SOCIAL.ERROR.SEND_MESSAGE_ERROR';\n        await this.showToast({ type: 'error', message });\n      }\n      return false;\n    }\n  }\n\n  /**\n   * Delete a message by ID\n   *\n   * @param id\n   * @param opts\n   */\n  async delete(id: number, opts?: { showToast?: boolean }): Promise<boolean> {\n    const now = Date.now();\n    if (this._debug) console.debug(`[message-service] Deleting message #${id}...`);\n\n    try {\n      const { done } = await this.graphql.mutate<{ done: boolean }>({\n        mutation: Mutations.delete,\n        variables: { id },\n        error: { code: SocialErrorCodes.DELETE_MESSAGE_ERROR, message: 'SOCIAL.ERROR.DELETE_MESSAGE_ERROR' },\n      });\n\n      if (this._debug) console.debug(`[message-service] Delete message [OK] in ${Date.now() - now}ms`);\n\n      if (done && (!opts || opts.showToast !== false)) {\n        await this.showToast({ type: 'info', message: 'SOCIAL.INFO.MESSAGE_DELETED' });\n      }\n      return done;\n    } catch (err) {\n      const error = (err && err.message) || err;\n      console.error(error);\n\n      // Show error\n      if (!opts || opts.showToast !== false) {\n        const message = error || 'SOCIAL.ERROR.DELETE_MESSAGE_ERROR';\n        await this.showToast({ type: 'error', message });\n      }\n      return false;\n    }\n  }\n\n  async openComposeModal(options: MessageModalOptions & { showToast?: boolean }): Promise<any> {\n    const hasTopModal = !!(await this.modalCtrl.getTop());\n    const modal = await this.modalCtrl.create({\n      component: MessageModal,\n      componentProps: options,\n      cssClass: hasTopModal && 'stack-modal',\n    });\n\n    // Open the modal\n    await modal.present();\n\n    // On dismiss\n    const { data } = await modal.onDidDismiss();\n    if (!data || !(data instanceof Message)) return true; // CANCELLED\n\n    // Send message\n    return await this.send(data, { showToast: options?.showToast });\n  }\n\n  async load(id: number, opts?: { toEntity?: boolean }): Promise<Message> {\n    const { data } = await this.graphql.query<{ data: OmitFunctions<Message> }>({\n      query: Queries.load,\n      variables: {\n        id,\n      },\n      fetchPolicy: 'no-cache',\n    });\n    const entity = opts?.toEntity !== false ? Message.fromObject(data) : (data as Message);\n\n    console.debug(`[message-service] Loaded message #${id}:`, entity);\n\n    return entity;\n  }\n\n  /* -- protected methods -- */\n\n  protected async showToast(opts: ShowToastOptions) {\n    return Toasts.show(this.toastController, this.translate, {\n      type: 'info',\n      message: 'SOCIAL.INFO.MESSAGE_SENT',\n      ...opts,\n    });\n  }\n}\n","import { from, Observable, of, switchMap } from 'rxjs';\nimport { LoadResult } from '../../shared/services/entity-service.class';\nimport { JsonFeed, JsonFeedItem, JsonFeedUtils } from './feed.model';\nimport { Inject, inject, Injectable, InjectionToken, Optional } from '@angular/core';\n\nimport { firstArrayValue, isEmptyArray, isNilOrNaN, isNotEmptyArray, isNotNilOrBlank } from '../../shared/functions';\nimport { filter, map, mergeMap } from 'rxjs/operators';\nimport { StartableService } from '../../shared/services/startable-service.class';\nimport { NetworkService } from '../../core/services/network.service';\nimport { LocalSettingsService } from '../../core/services/local-settings.service';\nimport { RxState } from '@rx-angular/state';\nimport { ENVIRONMENT, Environment } from '../../../environments/environment.class';\nimport { UrlUtils } from '../../shared/file/url.utils';\nimport { Message } from '../message/message.model';\nimport { MessageModal, MessageModalOptions } from '../message/message.modal';\nimport { ModalController } from '@ionic/angular';\nimport { MessageService } from '../message/message.service';\nimport { AccountService } from '../../core/services/account.service';\nimport { APP_PERSON_SERVICE } from '../../admin/users/person.service';\n\nexport const APP_FEED_SERVICE = new InjectionToken<IFeedService<any>>('FeeService');\n\nexport interface FeedLoadOptions {\n  locale?: string;\n  maxAgeInMonths?: number;\n  maxContentLength?: number;\n  cache?: boolean;\n}\n\nexport interface FeedsLoadOptions extends FeedLoadOptions {\n  urls?: string[];\n}\nexport interface FeedsWatchOptions extends FeedsLoadOptions {}\n\nexport interface IFeedService<T extends JsonFeed = JsonFeed> {\n  ready(): Promise<FeedServiceState>;\n\n  load(url: string, opts?: FeedLoadOptions): Promise<T>;\n\n  loadAll(opts?: FeedsLoadOptions): Promise<LoadResult<T>>;\n\n  watchAll(opts?: FeedsWatchOptions): Observable<LoadResult<T>>;\n\n  getHomeUrl(feed?: T): string;\n\n  getTagUrl(feed: T, tag: string): string;\n\n  openEditModal(event: Event, feedItem: T['items'][0]): Promise<any>;\n\n  deleteItem(feedItem: T['items'][0]): Promise<boolean>;\n\n  feedUrls$: Observable<string[]>;\n}\n\nexport interface FeedServiceState {\n  locale: string;\n  feedUrls?: string[];\n}\n\n@Injectable()\nexport class FeedService<S extends FeedServiceState, T extends JsonFeed = JsonFeed> extends StartableService<S> implements IFeedService<T> {\n  protected _logPrefix = '[feed-service] ';\n  protected _state = new RxState<S>();\n  protected network = inject(NetworkService);\n  protected modalCtrl = inject(ModalController);\n  protected messageService = inject(MessageService);\n  protected personService = inject(APP_PERSON_SERVICE);\n\n  protected locale$ = this._state.select('locale');\n  feedUrls$ = this._state.select('feedUrls');\n\n  get feedUrls(): string[] {\n    return this._state.get('feedUrls');\n  }\n\n  set feedUrls(urls: string[]) {\n    this._state.set('feedUrls', () => urls);\n  }\n\n  constructor(\n    private accountService: AccountService,\n    private settings: LocalSettingsService,\n    @Optional() @Inject(ENVIRONMENT) protected environment: Environment\n  ) {\n    super(settings);\n\n    this._state.connect('locale', this.settings.locale$);\n\n    this._state.connect(\n      'feedUrls',\n      this.locale$.pipe(\n        filter(isNotNilOrBlank),\n        map((locale) => (locale && environment.feed?.jsonFeed?.[locale]) ?? [])\n      )\n    );\n\n    // DEBUG\n    this._debug = !environment.production;\n    if (this._debug) console.debug(`${this._logPrefix}created`);\n  }\n\n  protected async ngOnStart(): Promise<S> {\n    await Promise.all([this.settings.ready(), this.network.ready()]);\n\n    return <S>{\n      locale: this.settings.locale,\n    };\n  }\n\n  watchAll(opts?: FeedsWatchOptions): Observable<LoadResult<T>> {\n    if (!this.started) {\n      return from(this.start()).pipe(switchMap(() => this.watchAll(opts)));\n    }\n    if (isNotEmptyArray(opts?.urls)) {\n      const locale$ = opts.locale ? of(opts.locale) : this.locale$;\n      return locale$.pipe(mergeMap((locale) => this.loadAll({ locale, ...opts })));\n    }\n    return this.feedUrls$.pipe(\n      filter(isNotEmptyArray),\n      mergeMap((urls) => this.loadAll({ ...opts, urls }))\n    );\n  }\n\n  getHomeUrl(feed?: JsonFeed) {\n    const feedUrl = feed?.feed_url ?? firstArrayValue(this.feedUrls);\n    return feedUrl ? UrlUtils.getRootUrl(feedUrl) : undefined;\n  }\n\n  getTagUrl(feed: JsonFeed, tag: string): string {\n    if (!feed || !tag) throw new Error(\"Missing 'feed' or 'tag' argument\");\n    const baseUrl = this.getHomeUrl(feed);\n    return feed.tag_template?.replace('{tag}', tag) ?? baseUrl + '/tag/' + tag;\n  }\n\n  async load(\n    url: string,\n    opts?: FeedLoadOptions & {\n      // Internal options (for recursive calls)\n      depth?: number;\n    }\n  ): Promise<T> {\n    if (!url) throw new Error('Missing url argument');\n    const { data } = await this.loadAll({ ...opts, urls: [url] });\n    return firstArrayValue(data);\n  }\n\n  async loadAll(\n    opts?: FeedsLoadOptions & {\n      // Internal options (for recursive calls)\n      depth?: number;\n      [key: string]: any;\n    }\n  ): Promise<LoadResult<T>> {\n    await this.ready();\n    const urls = opts?.urls ?? this.feedUrls;\n    opts = {\n      maxAgeInMonths: opts?.maxAgeInMonths ?? this.environment.feed?.maxAgeInMonths,\n      maxContentLength: opts?.maxContentLength ?? this.environment.feed?.maxContentLength,\n      locale: this.settings.locale,\n      depth: 0,\n      ...opts,\n    };\n    const feeds = await Promise.all(\n      (urls || []).map(async (url) => {\n        try {\n          // Get JSON\n          const json = await this.network.get(url, { nocache: opts?.cache });\n          console.debug(`${this._logPrefix}Loaded JSON from ${url}`, json);\n\n          // Resolve feed\n          return await this.resolveFeed(json, url, opts);\n        } catch (err) {\n          if (err?.status === 404) {\n            console.error(`${this._logPrefix} Error while fetching feeds at ${url}. 404 (Not found)`);\n          } else {\n            console.error(`${this._logPrefix} Error while fetching feeds at ${url}`, err);\n          }\n          return Promise.resolve([]);\n        }\n      })\n    );\n\n    const data = feeds.filter(isNotEmptyArray).flat();\n\n    // Close opened resources\n    if (opts.depth === 0) {\n      this.onAfterLoadAll();\n    }\n\n    return { data, total: data.length };\n  }\n\n  async openEditModal(event: Event, feedItem: JsonFeedItem, opts?: { showToast?: boolean }): Promise<boolean> {\n    const messageId = +feedItem.id;\n    if (isNilOrNaN(messageId)) throw new Error(`Cannot load message - invalid id: ${feedItem.id}`);\n\n    // Fetch the original message\n    const message = await this.messageService.load(messageId);\n\n    // Count recipients\n    let recipientFilterCount: number;\n    if (message.recipientFilter) {\n      recipientFilterCount = await this.personService.countAll(message.recipientFilter);\n    } else {\n      recipientFilterCount = message.recipients?.length ?? (!!message.recipient ? 1 : 0);\n      message.recipients = isNotEmptyArray(message.recipients) ? message.recipients : message.recipient ? [message.recipient] : [];\n      delete message.recipient;\n    }\n    const canRecipientFilter =\n      message.recipientFilter && !message.recipientFilter.isEmpty() && (this.accountService.isAdmin() || this.accountService.isSupervisor());\n\n    const hasTopModal = !!(await this.modalCtrl.getTop());\n    const modal = await this.modalCtrl.create({\n      component: MessageModal,\n      componentProps: <MessageModalOptions>{\n        title: 'SOCIAL.FEED.EDIT_TITLE',\n        suggestFn: (value, filter, sortBy, sortDirection, opts) => this.personService.suggest(value, filter, sortBy, sortDirection, opts),\n        canSelectType: false,\n        canRecipientFilter,\n        recipientFilterCount,\n        data: message,\n        debug: this._debug,\n      },\n      cssClass: hasTopModal && 'stack-modal',\n    });\n\n    // Open the modal\n    await modal.present();\n\n    // On dismiss\n    const { data } = await modal.onDidDismiss();\n    if (!data || !(data instanceof Message)) return true; // CANCELLED\n\n    // Restore id and updateDate (form can lost it)\n    data.id = data.id ?? message.id;\n    data.updateDate = data.updateDate ?? message.updateDate;\n\n    return await this.messageService.send(data, opts);\n  }\n\n  async deleteItem(feedItem: JsonFeedItem): Promise<boolean> {\n    const messageId = +feedItem.id;\n    if (isNilOrNaN(messageId)) throw new Error(`Cannot delete message - invalid id: ${feedItem.id}`);\n\n    return await this.messageService.delete(messageId);\n  }\n\n  /* -- protected functions -- */\n\n  protected async resolveFeed(\n    json: any,\n    url: string,\n    opts?: {\n      locale?: string;\n      maxAgeInMonths?: number;\n      maxContentLength?: number;\n      // Internal options (for recursive calls)\n      depth?: number;\n      [key: string]: any;\n    }\n  ): Promise<JsonFeed[]> {\n    // Check json is JsonFeed compatible\n    if (JsonFeedUtils.isJsonFeed(json)) {\n      // Migrate from old versions\n      let feed = JsonFeedUtils.migrateFeed(json);\n\n      // Resolve items (e.g. using feed.next_url)\n      feed = await this.resolveFeedItems(feed, { ...opts, depth: opts?.depth ?? 0 });\n\n      // Truncate html\n      JsonFeedUtils.truncateFeedItemsHtml(feed, opts);\n\n      return isNotEmptyArray(feed?.items) ? [feed] : [];\n    }\n\n    // not resolved (unknown format)\n    return [];\n  }\n\n  protected async resolveFeedItems(\n    json: JsonFeed,\n    opts?: {\n      maxContentLength?: number;\n      depth?: number;\n    }\n  ): Promise<JsonFeed> {\n    if (!json) return json;\n\n    // Load items\n    if (isEmptyArray(json.items) && isNotNilOrBlank(json.next_url)) {\n      const depth = opts?.depth ?? 0;\n      if (depth >= 3) {\n        console.warn(`${this._logPrefix}Max depth reached (${depth}) for ${json.feed_url}`);\n        return json;\n      }\n\n      // Load items\n      const feed = await this.load(json.next_url, { ...opts, depth: depth + 1 });\n\n      if (isEmptyArray(feed?.items)) {\n        return json;\n      }\n\n      // Merge with the input json\n      return {\n        ...json,\n        title: json.title ?? feed.title,\n        home_page_url: json.home_page_url ?? feed.home_page_url,\n        authors: isNotEmptyArray(json.authors) ? json.authors : feed.authors,\n        items: feed.items,\n        tag_template: json.tag_template ?? feed.tag_template,\n      };\n    }\n\n    return json;\n  }\n\n  protected onAfterLoadAll() {\n    console.debug(`${this._logPrefix}Feeds loaded`);\n  }\n}\n","import { AfterViewInit, Directive, ElementRef, inject, Input, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ActivatedRoute, Router, UrlTree } from '@angular/router';\nimport { UrlUtils } from '../../shared/file/url.utils';\nimport { LocationStrategy } from '@angular/common';\nimport { isNotNilOrBlank } from '../../shared/functions';\nimport { NavController } from '@ionic/angular';\nimport { PlatformService } from '../../core/services/platform.service';\nimport { JsonFeedUtils } from './feed.model';\n\n@Directive({\n  selector: 'feed,[feed]',\n})\nexport class FeedDirective implements AfterViewInit, OnDestroy {\n  private _subscription = new Subscription();\n  private platform = inject(PlatformService);\n  private locationStrategy = inject(LocationStrategy);\n  private navController = inject(NavController);\n  private router = inject(Router);\n  private route = inject(ActivatedRoute);\n\n  private _feedUrl: string;\n  private _baseUrl: string;\n\n  @Input({ alias: 'feed', required: true }) set feedUrl(value: string) {\n    this._feedUrl = value;\n    this._baseUrl = value && JsonFeedUtils.removeJsonExtension(value);\n  }\n\n  get feedUrl(): string {\n    return this._feedUrl;\n  }\n\n  constructor(private element: ElementRef<HTMLElement>) {\n    // DEBUG\n    //console.debug('[feed-directive] Creating feed directive');\n  }\n\n  public ngAfterViewInit() {\n    console.debug('[feed-directive] Processing anchors');\n    // Listening click events\n    this._subscription.add(this.listenClickEvents(this.element.nativeElement));\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n\n  protected listenClickEvents(nativeElement: HTMLElement): Subscription {\n    console.debug('[feed-directive] Start listening click events...');\n    const subscription = new Subscription();\n    const listener = (event: Event) => this.click(event, nativeElement);\n    const links = nativeElement.querySelectorAll('a');\n    links.forEach((link) => {\n      // DEBUG\n      //console.debug('[feed-directive] Adding click listener to', link);\n      link.addEventListener('click', listener);\n      subscription.add(() => link.removeEventListener('click', listener));\n    });\n\n    // DEBUG\n    subscription.add(() => console.debug('[feed-directive] Stop listening click events'));\n\n    return subscription;\n  }\n\n  protected async click(event: Event, containerElement: HTMLElement): Promise<boolean> {\n    console.debug('[feed-directive] Processing click event...', event);\n\n    if (!(event.target instanceof HTMLAnchorElement) && !(event.target?.['tagName'] === 'A')) {\n      console.warn('[feed-directive] Invalid click event target. Should an anchor <a>', event.target);\n      return;\n    }\n\n    const element = event.target as HTMLAnchorElement;\n\n    let href = element.getAttribute('href');\n    const fragment = UrlUtils.getFragment(href);\n\n    // Fragment\n    if (href?.startsWith('#') && isNotNilOrBlank(fragment)) {\n      event.preventDefault();\n      this.scrollToAnchor(containerElement, fragment);\n      return true;\n    }\n\n    const routerLink = element.getAttribute('routerLink');\n    if (isNotNilOrBlank(routerLink)) {\n      event.preventDefault();\n      return this.navController.navigateForward(routerLink);\n    }\n\n    // Resolve relative URL, if baseUrl has been set\n    if (this._baseUrl && UrlUtils.isRelativeUrl(href)) {\n      // Resolve URL, then open using the platform\n      href = UrlUtils.resolveRelativeUrl(this._baseUrl, href);\n    }\n\n    // Resolve internal URL as an app route\n    if (UrlUtils.isInternalUrl(href)) {\n      const routePath = this.normalizeUrl(href.startsWith('/') ? href : `/${href}`);\n      const urlTree = this.getUrlTree(routePath);\n      event.preventDefault();\n      this.router.navigated = false;\n      // Opening route\n      return this.navController.navigateForward(urlTree);\n    }\n\n    // External URL: open using the platform\n    event.preventDefault();\n    await this.platform.open(href);\n    return true;\n  }\n\n  scrollToAnchor(containerElement: HTMLElement, anchorId: string) {\n    if (!containerElement || !anchorId) {\n      console.warn(\"Missing 'containerElement' or 'fragment' argument.\");\n      return;\n    }\n\n    console.debug('[feed-directive-anchor] Scrolling to anchor #' + anchorId);\n\n    // Find the target element with the specified fragment ID\n    const targetElement = containerElement.querySelector(`#${anchorId}`);\n\n    if (targetElement) {\n      // Scroll smoothly to the target element\n      // eslint-disable-next-line @rx-angular/prefer-no-layout-sensitive-apis\n      targetElement.scrollIntoView({\n        behavior: 'smooth', // Smooth scrolling behavior\n        block: 'start', // Align the target element to the top of the container\n      });\n    } else {\n      console.warn(`No element found with the ID \"${anchorId}\" inside the container.`);\n    }\n  }\n\n  /**\n   * Transform a relative URL to its absolute representation according to current router state.\n   * @param url Relative URL path.\n   * @return Absolute URL based on the current route.\n   */\n  normalizeUrl(url: string): string {\n    if (UrlUtils.isExternalUrl(url)) {\n      return url;\n    }\n    if (this._baseUrl && UrlUtils.isRelativeUrl(url)) {\n      return UrlUtils.resolveRelativeUrl(this._baseUrl, url);\n    }\n\n    const urlTree = this.getUrlTree(url);\n    const serializedUrl = this.router.serializeUrl(urlTree);\n    return this.locationStrategy.prepareExternalUrl(serializedUrl);\n  }\n\n  getUrlTree(url: string): UrlTree {\n    url = UrlUtils.normalizeUrl(url);\n    const urlPath = UrlUtils.stripFragmentAndQuery(url) || UrlUtils.stripFragmentAndQuery(this.router.url);\n    const parsedUrl = this.router.parseUrl(url);\n    const fragment = parsedUrl.fragment;\n    const queryParams = parsedUrl.queryParams;\n    return this.router.createUrlTree([urlPath], { relativeTo: this.route, fragment, queryParams });\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  EventEmitter,\n  HostBinding,\n  Inject,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport { RxState } from '@rx-angular/state';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Router } from '@angular/router';\nimport { arrayDistinct, isNil, isNotEmptyArray } from '../../shared/functions';\nimport { JsonFeed, JsonFeedItem, JsonFeedUtils } from './feed.model';\nimport { map, switchMap } from 'rxjs/operators';\nimport { PlatformService } from '../../core/services/platform.service';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { AppColors } from '../../shared/types';\nimport { APP_FEED_SERVICE, IFeedService } from './feed.service';\nimport { NetworkService } from '../../core/services/network.service';\nimport { UrlUtils } from '../../shared/file/url.utils';\nimport { AlertController, IonModal } from '@ionic/angular';\nimport { LocalSettingsService } from '../../core/services/local-settings.service';\nimport { AccountService } from '../../core/services/account.service';\nimport { merge } from 'rxjs';\nimport { Alerts } from '../../shared/alerts';\n\nimport { APP_SHOW_TOOLTIP } from '../../shared/constants';\n\nexport interface FeedState<T> {\n  peerUrl: string;\n  userId: number;\n  maxAgeInMonths: number;\n  maxContentLength: number;\n  urls: string[];\n  feeds: T[];\n  hasFeeds: boolean;\n  locale: string;\n}\n\nexport type FilterItemFunction = (item: JsonFeedItem) => boolean;\n\n@Component({\n  selector: 'app-feed',\n  templateUrl: './feed.component.html',\n  styleUrls: ['./feed.component.scss'],\n  providers: [RxState],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedsComponent<T extends JsonFeed = JsonFeed, S extends FeedState<T> = FeedState<T>> implements OnInit, OnDestroy {\n  protected _state = new RxState<S>();\n  protected translate = inject(TranslateService);\n  protected platform = inject(PlatformService);\n  protected networkService = inject(NetworkService);\n  protected router = inject(Router);\n  protected version: string;\n  protected modalItemId: string;\n  protected onRefresh = new EventEmitter<any>();\n\n  feeds$ = this._state.select('feeds');\n  urls$ = this._state.select('urls');\n  hasFeeds$ = this._state.select('hasFeeds');\n  userId$ = this._state.select('userId');\n\n  @Input() debug = false;\n  @Input() mobile: boolean;\n  @Input() showHeader = true;\n  @Input() showReadMoreButton = true;\n  @Input() headerColor: AppColors = 'secondary';\n  @Input() cardColor: AppColors | 'light-transparent' = 'light-transparent';\n  @Input() shape: 'round' | 'legacy' = 'legacy';\n  @Input() class: string = '';\n  @Input() itemId: string;\n  @Input() filterItem: FilterItemFunction;\n\n  @Output() editItem = new EventEmitter<JsonFeedItem>();\n  @Output() deleteItem = new EventEmitter<JsonFeedItem>();\n\n  @Input() set feeds(value: T[]) {\n    this._state.set('feeds', () => value);\n  }\n\n  get feeds() {\n    return this._state.get('feeds');\n  }\n\n  @Input() set urls(value: string[]) {\n    this._state.set('urls', () => value);\n  }\n\n  get urls() {\n    return this._state.get('urls');\n  }\n\n  get hasFeeds(): boolean {\n    return this._state.get('hasFeeds');\n  }\n\n  @Input() set maxAgeInMonths(value: number) {\n    this._state.set('maxAgeInMonths', () => value);\n  }\n\n  get maxAgeInMonths() {\n    return this._state.get('maxAgeInMonths');\n  }\n\n  @Input() set maxContentLength(value: number) {\n    this._state.set('maxContentLength', () => value);\n  }\n\n  get maxContentLength() {\n    return this._state.get('maxContentLength');\n  }\n\n  get peerUrl() {\n    return this._state.get('peerUrl');\n  }\n\n  @HostBinding('class')\n  get hostClass(): string {\n    const classes = [this.class];\n\n    if (this.shape) {\n      classes.push(`shape-${this.shape}`);\n    }\n\n    return classes.filter((cls) => cls).join(' ');\n  }\n\n  @ViewChild('modal') modal: IonModal;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    settings: LocalSettingsService,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Optional() @Inject(APP_FEED_SERVICE) public feedService: IFeedService<T>,\n    protected accountService: AccountService,\n    protected alertCtrl: AlertController\n  ) {\n    this.mobile = settings.mobile;\n    this._state.connect('locale', settings.locale$);\n    this._state.connect('hasFeeds', this.feeds$.pipe(map(isNotEmptyArray)));\n    this._state.connect('userId', this.accountService.person$.pipe(map((person) => person?.id)));\n    this._state.connect('peerUrl', this.networkService.peer$.pipe(map((peer) => peer?.url)));\n\n    if (this.feedService) {\n      this._state.connect(\n        'feeds',\n        merge(\n          this.onRefresh.pipe(map(() => ({ ...this._state.get(), cache: false }))),\n          this._state\n            .select(['urls', 'maxAgeInMonths', 'maxContentLength', 'locale'])\n            .pipe(map(({ urls, maxAgeInMonths, maxContentLength, locale }) => ({ urls, maxAgeInMonths, maxContentLength, locale, cache: true })))\n        ).pipe(\n          switchMap(({ urls, maxAgeInMonths, maxContentLength, locale, cache }) =>\n            this.feedService.watchAll({\n              urls: urls,\n              maxAgeInMonths,\n              maxContentLength,\n              locale,\n              cache,\n            })\n          ),\n          map(({ data }) => data)\n\n          // DEBUG\n          //tap((feeds) => console.debug('[feed-component] feeds', feeds))\n        )\n      );\n    }\n  }\n\n  ngOnInit() {\n    this.urls = this.urls ?? null; // Should set the urls, in order to trigger the select in constructor\n    this.maxAgeInMonths = this.maxAgeInMonths ?? this.environment.feed?.maxAgeInMonths ?? -1;\n    this.maxContentLength = this.maxContentLength ?? this.environment.feed?.maxContentLength ?? -1;\n\n    const self = this;\n    this.filterItem = this.filterItem ?? ((item) => !self.itemId || item.id === self.itemId);\n  }\n\n  ngOnDestroy() {\n    this._state.ngOnDestroy();\n  }\n\n  async openFeedHome(feed?: T) {\n    if (!feed) {\n      // Reduce feed by home url (keep one feed by home url)\n      const homeUrls = [];\n      const feeds = this.feeds?.reduce((res, item) => {\n        const url = this.getFeedHomeUrl(item);\n        if (!url || homeUrls.includes(url)) return res;\n        return res.concat(item);\n      }, []);\n\n      // Recursive call\n      if (isNotEmptyArray(feeds)) {\n        feeds.forEach((f) => this.openFeedHome(f));\n      }\n      return;\n    }\n\n    const url = this.getFeedHomeUrl(feed);\n    if (!url) return;\n\n    // Feed comes from the current pod:\n    if (url.startsWith(this.networkService.peer?.url) || UrlUtils.isInternalUrl(url)) {\n      await this.modal.present();\n      return;\n    }\n\n    return this.openUrl(url);\n  }\n\n  async openFeedItem(feedItem: JsonFeedItem, feed?: T) {\n    const url = feedItem?.url ?? feed?.feed_url;\n    if (!url || !this.showReadMoreButton) return;\n\n    // Feed comes from the current pod:\n    if (url.startsWith(this.networkService.peer?.url) || UrlUtils.isInternalUrl(url)) {\n      this.modalItemId = feedItem.id;\n      await this.modal.present();\n      await this.modal.onDidDismiss();\n\n      // Reset item id\n      this.modalItemId = undefined;\n      return;\n    }\n\n    const fixedUrl = JsonFeedUtils.removeJsonExtension(url);\n    return this.platform.open(fixedUrl);\n  }\n\n  openUrl(url: string) {\n    if (!url) return;\n    const fixedUrl = JsonFeedUtils.removeJsonExtension(url);\n    return this.platform.open(fixedUrl);\n  }\n\n  openTag(feed: T, tag: string) {\n    const url = this.feedService.getTagUrl(feed, tag);\n    return this.openUrl(url);\n  }\n\n  getTags(feedOrItem?: T | T['items'][0]) {\n    if (JsonFeedUtils.isJsonFeed(feedOrItem)) {\n      return arrayDistinct(\n        (feedOrItem.items || [])\n          .map((item) => item.tags)\n          .filter(isNotEmptyArray)\n          .flat()\n      );\n    }\n    if (JsonFeedUtils.isJsonFeedItem(feedOrItem)) {\n      return arrayDistinct((feedOrItem.tags || []).flat());\n    }\n    return [];\n  }\n\n  protected getFeedHomeUrl(feed: T) {\n    return feed.home_page_url ?? JsonFeedUtils.removeJsonExtension(feed.feed_url) ?? this.feedService.getHomeUrl();\n  }\n\n  /**\n   * Check if the current user is the author of the feed item\n   */\n  canEditItem = (item: JsonFeedItem, userId: number, feed?: T) => {\n    if (!item || isNil(userId)) return false; // No item, or user not connected\n\n    // DEBUG\n    //console.debug('[feed-component] canEditItem...');\n\n    // Check feed URL point on the current peer (/api/feed/ ...)\n    if (!item.url?.startsWith(this.peerUrl)) return false;\n\n    // Check item authors first\n    let isAuthor = false;\n    if (isNotEmptyArray(item.authors)) {\n      isAuthor = item.authors.some((author) => +author.id === userId);\n    }\n    // Check feed authors\n    if (!isAuthor && isNotEmptyArray(feed?.authors)) {\n      isAuthor = feed.authors.some((author) => +author.id === userId);\n    }\n\n    return isAuthor || this.accountService.isAdmin();\n  };\n\n  /**\n   * Handle edit item action\n   */\n  async onEditItem(event: Event, item: JsonFeedItem) {\n    if (event) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    if (this.editItem.observed) {\n      this.editItem.emit(item);\n    }\n\n    const done = await this.feedService?.openEditModal(event, item);\n    if (done) {\n      // force a refresh of the feeds\n      this.onRefresh.emit();\n    }\n  }\n\n  /**\n   * Handle delete item action\n   */\n  async onDeleteItem(event: Event, item: JsonFeedItem) {\n    if (event) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    // Ask for confirmation before deletion\n    const confirmed = await Alerts.askActionConfirmation(this.alertCtrl, this.translate, true, event);\n    if (confirmed !== true) {\n      return; // User cancelled or dismissed\n    }\n\n    if (this.deleteItem.observed) {\n      this.deleteItem.emit(item);\n    }\n\n    const done = await this.feedService?.deleteItem(item);\n    if (done) {\n      // force a refresh of the feeds\n      this.onRefresh.emit();\n    }\n  }\n}\n","<!-- debug -->\n@if (debug) {\n  <app-debug [title]=\"'Feed'\">\n    <p>\n      hasFeeds?: {{ hasFeeds$ | async }}\n      <br />\n      urls: {{ urls$ | async | json }}\n      <br />\n      shape: {{ shape }}\n    </p>\n  </app-debug>\n}\n\n@let feeds = feeds$ | async;\n@let userId = userId$ | async;\n\n@if (feeds | isNotEmptyArray) {\n  <!-- top header -->\n  @if (showHeader && (feeds | arrayFirst); as feed) {\n    <ion-item lines=\"none\" [color]=\"headerColor\" class=\"feed-header shape-{{ shape }}\">\n      <ion-icon slot=\"start\" name=\"megaphone\"></ion-icon>\n      <ion-label>\n        <b>{{ feed.title || ('SOCIAL.FEED.NEWS' | translate) }}</b>\n      </ion-label>\n      <ion-button slot=\"end\" fill=\"clear\" (click)=\"openFeedHome()\" shape=\"\">\n        <ion-label translate>SOCIAL.FEED.SHOW_ALL_FEED</ion-label>\n        <ion-icon slot=\"end\" name=\"chevron-forward-outline\"></ion-icon>\n      </ion-button>\n    </ion-item>\n  }\n\n  <div class=\"feed-content shape-{{ shape }} ion-no-padding\" [class.has-header]=\"showHeader\">\n    <!-- feeds -->\n    @for (feed of feeds; track feed.feed_url; let firstFeed = $first; let lastFeed = $last) {\n      <!-- items -->\n      @for (item of feed.items | arrayFilter: filterItem; track item.id; let firstItem = $first; let lastItem = $last) {\n        <ion-card\n          [class.first]=\"firstFeed && firstItem\"\n          [class.last]=\"lastFeed && lastItem\"\n          [color]=\"cardColor !== 'light-transparent' ? cardColor : undefined\"\n          class=\"feed-item-card\"\n        >\n          <ion-card-header>\n            <ion-card-subtitle style=\"vertical-align: middle\">\n              <!-- Authors -->\n              @for (author of item.authors || feed.authors; track author) {\n                @if (author.name || author.avatar) {\n                  <ion-chip (click)=\"openUrl(author.url)\" tappable>\n                    @if (author.avatar) {\n                      <ion-avatar>\n                        <ion-img [src]=\"author.avatar\" [alt]=\"author.name\"></ion-img>\n                      </ion-avatar>\n                    }\n                    @if (author.name) {\n                      <ion-label class=\"author\">{{ author.name }}</ion-label>\n                    }\n                  </ion-chip>\n                }\n              }\n              <ion-note class=\"ion-float-end\">\n                <small>{{ item.date_published | dateFromNow }}</small>\n              </ion-note>\n            </ion-card-subtitle>\n\n            <!-- title -->\n            <ion-card-title (click)=\"openFeedItem(item, feed)\" tappable>{{ item?.title }}</ion-card-title>\n\n            <!-- tags -->\n            @let tags = item | map: getTags;\n            @if (tags | isNotEmptyArray) {\n              <ion-text class=\"tags\">\n                @for (tag of tags; track tag; let last = $last) {\n                  <a (click)=\"openTag(feed, tag)\" tappable>\n                    <ion-text>#{{ tag }}</ion-text>\n                  </a>\n                  @if (!last) {\n                    &nbsp;\n                  }\n                }\n              </ion-text>\n            }\n          </ion-card-header>\n\n          <!-- Feed content -->\n          <ion-card-content>\n            <ion-text [feed]=\"item.url || feed.feed_url\">\n              @if (item.content_html) {\n                <p [innerHTML]=\"item.content_html\"></p>\n              } @else if (item.content_text) {\n                <p>\n                  <markdown [data]=\"item.content_text\" emoji></markdown>\n                </p>\n              }\n            </ion-text>\n          </ion-card-content>\n\n          @let editable = canEditItem(item, userId, feed);\n          @if (editable || showReadMoreButton) {\n            @if (editable) {\n\n              <!-- Delete button (visible hover)-->\n              <button\n                mat-icon-button\n                (click)=\"onDeleteItem($event, item)\"\n                class=\"visible-hover ion-float-start\"\n                [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n                [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n              >\n                <mat-icon>delete</mat-icon>\n              </button>\n              <!-- Edit button (visible hover) -->\n              <ion-button\n                (click)=\"onEditItem($event, item)\"\n                class=\"visible-hover ion-float-start\" fill=\"clear\"\n              >\n                <mat-icon slot=\"start\">edit</mat-icon>\n<!--                <ion-icon name=\"pencil\" slot=\"start\"></ion-icon>-->\n                <ion-label translate>COMMON.BTN_EDIT</ion-label>\n              </ion-button>\n            }\n            @if (showReadMoreButton) {\n              <ion-button  (click)=\"openFeedItem(item, feed)\" class=\"ion-float-end\" fill=\"clear\">\n                <ion-label>{{ (item.truncated ? 'SOCIAL.FEED.READ_MORE' : 'COMMON.BTN_SHOW') | translate }}</ion-label>\n                <ion-icon slot=\"end\" name=\"chevron-forward-outline\"></ion-icon>\n              </ion-button>\n            }\n          }\n        </ion-card>\n      }\n    }\n  </div>\n}\n\n<!-- Details modal -->\n<ion-modal #modal [showBackdrop]=\"false\"\n           class=\"stack-modal\" [class.modal-large]=\"!mobile\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar color=\"secondary\">\n        <ion-title>{{ 'SOCIAL.FEED.NEWS' | translate }}</ion-title>\n        <ion-buttons slot=\"end\">\n          <ion-button (click)=\"modal.dismiss()\">\n            <ion-icon slot=\"icon-only\" name=\"close\"></ion-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content>\n      <div class=\"ion-padding\">\n        <app-feed\n          [urls]=\"urls\"\n          [showHeader]=\"false\"\n          [showReadMoreButton]=\"false\"\n          [maxContentLength]=\"-1\"\n          [maxAgeInMonths]=\"-1\"\n          [itemId]=\"modalItemId\"\n          cardColor=\"light\"\n          [debug]=\"debug\"\n        ></app-feed>\n      </div>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component, inject,\n  Inject,\n  InjectionToken,\n  OnDestroy,\n  OnInit,\n  Optional,\n  ViewChild,\n} from '@angular/core';\nimport { IonContent, ModalController, ToastController } from '@ionic/angular';\nimport { RegisterModal } from '../register/register.modal';\nimport { BehaviorSubject, fromEvent, Subscription } from 'rxjs';\nimport { AccountService } from '../services/account.service';\nimport { Account, accountToString } from '../services/model/account.model';\nimport { Configuration } from '../services/model/config.model';\nimport { Department } from '../services/model/department.model';\nimport { APP_LOCALES, LocaleConfig, LocalSettings } from '../services/model/settings.model';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ConfigService } from '../services/config.service';\nimport { PlatformService } from '../services/platform.service';\nimport { LocalSettingsService } from '../services/local-settings.service';\nimport { debounceTime, distinctUntilChanged, map, startWith } from 'rxjs/operators';\nimport { AppAuthModal } from '../auth/auth.modal';\nimport { NetworkService } from '../services/network.service';\nimport { IMenuItem, MenuItem, MenuItems } from '../menu/menu.model';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { fadeInAnimation, slideInAnimation, slideUpDownAnimation } from '../../shared/material/material.animations';\nimport { isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrBlank } from '../../shared/functions';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { HistoryPageReference } from '../services/model/history.model';\nimport { CORE_CONFIG_OPTIONS } from '../services/config/core.config';\nimport { RxState } from '@rx-angular/state';\nimport { ImagesUtils } from '../../shared/file/images.utils';\nimport { UriUtils } from '../../shared/file/uri.utils';\nimport { Peer } from '../services/model/peer.model';\nimport { AppMarkdownModal } from '../../shared/markdown/markdown.modal';\nimport { SOCIAL_CONFIG_OPTIONS } from '../../social/config/social.config';\nimport { FeedsComponent } from '../../social/feed/feed.component';\n\nimport { APP_SHOW_TOOLTIP } from '../../shared/constants';\n\n/**\n * @param files\n * @deprecated use `getRandomImageWithCredit()` instead\n **/\nexport const getRandomImage = ImagesUtils.getRandomImage;\nexport const getRandomImageWithCredit = ImagesUtils.getRandomImageWithCredit;\n\nexport const APP_HOME_BUTTONS = new InjectionToken<IMenuItem[]>('homeButton');\n\nexport const APP_HOME_TOOLBAR_BUTTONS = new InjectionToken<IMenuItem[]>('homeToolbarButtons');\n\nexport const APP_HOME_CONFIG = new InjectionToken<IHomePageConfig>('homeConfig');\n\nexport interface IHomePageConfig {\n  showNotificationIcon?: boolean | 'mobile' | 'desktop';\n  autoHideNotificationIcon?: boolean | 'mobile' | 'desktop';\n}\n\nexport interface HomePageState {\n  loading: boolean;\n  showSpinner: boolean;\n  showPartnerBanner: boolean;\n  showLegalInformation: boolean;\n  showInstallLinks: boolean;\n  pageHistory: HistoryPageReference[];\n  darkMode: boolean;\n  hasFeed: boolean;\n}\n\n@Component({\n  selector: 'app-page-home',\n  templateUrl: 'home.html',\n  styleUrls: ['./home.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  animations: [fadeInAnimation, slideUpDownAnimation, slideInAnimation],\n})\nexport class HomePage extends RxState<HomePageState> implements OnInit, OnDestroy {\n  private _subscription = new Subscription();\n  private _config: Configuration;\n\n  protected readonly debug: boolean;\n  protected readonly mobile: boolean;\n  protected readonly showAccountButton: boolean;\n\n  protected accountName = '';\n  protected isLogin: boolean;\n  protected logo: string;\n  protected description: string;\n  protected appName: string;\n  protected isWeb: boolean;\n  protected canRegister: boolean;\n  protected contentStyle: any;\n  protected contentCredits: string;\n  protected legalInformation: IMenuItem[];\n  protected waitingNetwork = false;\n  protected offline: boolean;\n  protected showNotificationIcon: boolean;\n  protected autoHideNotificationIcon: boolean;\n  protected showFeed: boolean = false;\n  protected feedUrls: string[];\n  protected feedMaxAgeInMonths: number;\n  protected feedMaxContentLength: number;\n  protected hasScrollbar = false;\n\n  protected readonly buttons: MenuItem[];\n  protected readonly toolbarButtons: MenuItem[];\n  protected loading$ = this.select('loading');\n  protected $partners = new BehaviorSubject<Department[]>(null);\n  protected $filteredButtons = new BehaviorSubject<MenuItem[]>(undefined);\n  protected $filteredToolbarButtons = new BehaviorSubject<MenuItem[]>(undefined);\n  protected darkMode$ = this.select('darkMode');\n  protected pageHistory$ = this.select('pageHistory');\n  protected hasFeed$ = this.select('hasFeed');\n\n  set pageHistory(value: HistoryPageReference[]) {\n    this.set('pageHistory', () => value);\n  }\n\n  get pageHistory(): HistoryPageReference[] {\n    return this.get('pageHistory');\n  }\n\n  set loading(value: boolean) {\n    this.set('loading', () => value);\n  }\n\n  get loading(): boolean {\n    return this.get('loading');\n  }\n\n  set showSpinner(value: boolean) {\n    this.set('showSpinner', () => value);\n  }\n\n  get showSpinner(): boolean {\n    return this.get('showSpinner');\n  }\n\n  set showPartnerBanner(value: boolean) {\n    this.set('showPartnerBanner', () => value);\n  }\n\n  get showPartnerBanner(): boolean {\n    return this.get('showPartnerBanner');\n  }\n\n  set showLegalInformation(value: boolean) {\n    this.set('showLegalInformation', () => value);\n  }\n\n  get showLegalInformation(): boolean {\n    return this.get('showLegalInformation');\n  }\n\n  set showInstallLinks(value: boolean) {\n    this.set('showInstallLinks', () => value);\n  }\n\n  get showInstallLinks(): boolean {\n    return this.get('showInstallLinks');\n  }\n\n  set darkMode(value: boolean) {\n    this.set('darkMode', () => value);\n  }\n\n  get darkMode(): boolean {\n    return this.get('darkMode');\n  }\n\n  get currentLocale(): string {\n    return this.translate.currentLang || this.translate.defaultLang || this.environment.defaultLocale;\n  }\n\n  get partnerBannerSize(): number {\n    return this.showLegalInformation ? 8 : 12;\n  }\n\n  @ViewChild(IonContent, { static: true }) content: IonContent;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    private accountService: AccountService,\n    private modalCtrl: ModalController,\n    private translate: TranslateService,\n    private toastController: ToastController,\n    private configService: ConfigService,\n    private platform: PlatformService,\n    private cd: ChangeDetectorRef,\n    public network: NetworkService,\n    public settings: LocalSettingsService,\n    @Inject(ENVIRONMENT) protected environment: Environment,\n    @Inject(APP_LOCALES) protected locales: LocaleConfig[],\n    @Optional() @Inject(APP_HOME_BUTTONS) buttons: IMenuItem[],\n    @Optional() @Inject(APP_HOME_TOOLBAR_BUTTONS) toolbarButtons: IMenuItem[],\n    @Optional() @Inject(APP_HOME_CONFIG) protected config: IHomePageConfig\n  ) {\n    super();\n    this.set(<Partial<HomePageState>>{\n      loading: true,\n      showPartnerBanner: false,\n      showSpinner: !this.platform.started,\n      darkMode: this.settings.isDarkMode,\n    });\n\n    this.buttons = (buttons || [])?.map((item) => MenuItem.fromObject(item));\n    this.toolbarButtons = (toolbarButtons || [])?.map((item) => MenuItem.fromObject(item));\n    console.log('toolbarButtons', this.toolbarButtons);\n    this.mobile = this.platform.is('mobile');\n    this.platform.ready().then(() => this.start());\n    this.showAccountButton = environment.account?.showAccountButton ?? true;\n\n    this.connect('darkMode', this.settings.darkMode$);\n\n    // DEV\n    this.debug = !environment.production;\n  }\n\n  ngOnInit() {\n    fromEvent(window, 'resize')\n      .pipe(debounceTime(100)) // Évite les appels trop fréquents\n      .subscribe(() => this.checkScrollbar());\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n    this._subscription.unsubscribe();\n  }\n\n  async login() {\n    const modal = await this.modalCtrl.create({\n      component: AppAuthModal,\n    });\n    return modal.present();\n  }\n\n  async register() {\n    const modal = await this.modalCtrl.create({\n      component: RegisterModal,\n      backdropDismiss: false,\n    });\n    return modal.present();\n  }\n\n  async logout(event: any) {\n    await this.accountService.logout();\n\n    // If was offline, try to reconnect (because can be a forced offline mode)\n    if (this.offline) {\n      await this.tryOnline();\n    }\n  }\n\n  changeLanguage(locale: string) {\n    this.settings.apply({ locale }).then(() => {\n      this.markForCheck();\n    });\n  }\n\n  getPagePath(index: number, page: HistoryPageReference): string {\n    return page?.path;\n  }\n\n  tryOnline() {\n    this.waitingNetwork = true;\n    this.markForCheck();\n\n    this.network\n      .tryOnline({\n        showLoadingToast: false,\n        showOnlineToast: true,\n        showOfflineToast: false,\n      })\n      .then(() => {\n        this.waitingNetwork = false;\n        this.markForCheck();\n      });\n  }\n\n  /* -- protected method  -- */\n\n  protected async start() {\n    await this.accountService.ready();\n\n    this.isLogin = this.accountService.isLogin();\n    if (this.isLogin) {\n      this.onLogin(this.accountService.account);\n    }\n\n    this.offline = this.network.offline;\n\n    // Listen login/logout events\n    this._subscription.add(this.accountService.onLogin.subscribe((account) => this.onLogin(account)));\n    this._subscription.add(this.accountService.onLogout.subscribe(() => this.onLogout()));\n\n    // Listen pod config\n    this._subscription.add(this.configService.config.subscribe((config) => this.onConfigLoaded(config)));\n\n    // Listen settings changes\n    this._subscription.add(\n      this.settings.onChange\n        .pipe(\n          // Add a delay, to avoid to apply changes to often\n          debounceTime(250),\n          // Start with current settings\n          startWith(await this.settings.ready())\n        )\n        .subscribe((res) => this.onSettingsChanged(res))\n    );\n\n    // Listen network changes\n    this._subscription.add(\n      this.network.onNetworkStatusChanges\n        .pipe(\n          //debounceTime(450),\n          //tap(() => this.waitingNetwork = false),\n          map((connectionType) => connectionType === 'none'),\n          distinctUntilChanged()\n        )\n        .subscribe((offline) => {\n          this.offline = offline;\n          this.markForCheck();\n        })\n    );\n  }\n\n  protected async showToast(opts: ShowToastOptions) {\n    await Toasts.show(this.toastController, this.translate, opts);\n  }\n\n  protected onConfigLoaded(config: Configuration) {\n    console.debug('[home] Applying configuration', config);\n    this._config = config;\n\n    this.appName = config.label || this.environment.defaultAppName || 'SUMARiS';\n    this.logo = config.largeLogo || config.smallLogo || undefined;\n    this.description = config.name;\n    this.isWeb = this.platform.isWeb();\n    this.canRegister = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.REGISTRATION_ENABLE);\n\n    const showNotificationIconByConfig =\n      this.config?.showNotificationIcon === true ||\n      (this.config?.showNotificationIcon === 'mobile' && this.mobile) ||\n      (this.config?.showNotificationIcon === 'desktop' && !this.mobile);\n    this.showNotificationIcon = showNotificationIconByConfig && this._config.getPropertyAsBoolean(SOCIAL_CONFIG_OPTIONS.ENABLE_NOTIFICATION_ICONS);\n    this.autoHideNotificationIcon =\n      this.config?.autoHideNotificationIcon === true ||\n      (this.config?.autoHideNotificationIcon === 'mobile' && this.mobile) ||\n      (this.config?.autoHideNotificationIcon === 'desktop' && !this.mobile) ||\n      false;\n\n    // Feed\n    const locale = this.currentLocale;\n    this.showFeed = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.HOME_FEED_ENABLE) || !!this.environment?.feed?.jsonFeed;\n    this.feedUrls = config.getPropertyAsStrings(CORE_CONFIG_OPTIONS.HOME_FEED_URLS) ?? this.environment?.feed?.jsonFeed?.[locale];\n    this.feedMaxAgeInMonths =\n      config.getPropertyAsInt(CORE_CONFIG_OPTIONS.HOME_FEED_MAX_AGE_IN_MONTHS) ?? this.environment?.feed?.maxAgeInMonths ?? -1;\n    this.feedMaxContentLength =\n      config.getPropertyAsInt(CORE_CONFIG_OPTIONS.HOME_FEED_MAX_CONTENT_LENGTH) ?? this.environment?.feed?.maxContentLength ?? -1;\n\n    // Legal information\n    this.legalInformation = [\n      {\n        title: 'HOME.PRIVACY_POLICY',\n        path: this._config.getProperty(CORE_CONFIG_OPTIONS.PRIVACY_POLICY_URL) ?? (this.environment.privacyPolicyUrl as string),\n      },\n      {\n        title: 'HOME.TERMS_OF_USE',\n        path: this._config.getProperty(CORE_CONFIG_OPTIONS.TERMS_OF_USE_URL) ?? (this.environment.termsOfUseUrl as string),\n      },\n    ].filter((item) => isNotNilOrBlank(item.path));\n    this.showLegalInformation = isNotEmptyArray(this.legalInformation);\n\n    const partners = (this._config.partners || []).filter((p) => p && p.logo);\n    this.$partners.next(partners);\n    this.showPartnerBanner = partners.length > 0;\n    // TODO load install links\n\n    // If not already set, compute the background image\n    if (!this.contentStyle) {\n      const backgroundImages = (config.backgroundImages || [])\n        // Filter on not nil, because can occur if detected has not exists (see config-service.js)\n        .filter(\n          (img) =>\n            isNotNil(img) &&\n            // If offline, filter on local dataURL image\n            (!this.offline || !img.startsWith('http'))\n        );\n\n      // Background image found: select one randomly\n      if (backgroundImages.length) {\n        const { image, credits } = getRandomImageWithCredit(backgroundImages);\n        this.contentStyle = image ? { 'background-image': `url(${image})` } : {};\n        this.contentCredits = credits || '';\n      }\n\n      // Use background color\n      else {\n        const primaryColor = config.getProperty(CORE_CONFIG_OPTIONS.COLOR_PRIMARY) || 'var(--ion-color-primary)';\n        this.contentStyle = (primaryColor && { 'background-color': primaryColor }) || {};\n      }\n    }\n\n    this.checkScrollbar();\n    this.refreshButtons();\n    this.markForCheck();\n\n    // If first load, hide the loading indicator\n    this.loading = false;\n  }\n\n  protected onSettingsChanged(settings: LocalSettings) {\n    if (settings.pageHistory !== this.pageHistory) {\n      console.debug('[home] Page history loaded');\n      this.pageHistory = settings.pageHistory || [];\n    }\n  }\n\n  protected onLogin(account: Account) {\n    if (!account) return; // Skip\n    //console.debug('[home] Logged account: ', account);\n    this.isLogin = true;\n    this.accountName = accountToString(account);\n    this.refreshButtons(account);\n    this.markForCheck();\n  }\n\n  protected onLogout() {\n    this.isLogin = false;\n    this.accountName = '';\n    this.pageHistory = [];\n    this.refreshButtons();\n    this.markForCheck();\n  }\n\n  protected refreshButtons(account?: Account) {\n    if (!this._config) return; // Skip (waiting config to be loaded)\n    if (this.debug) console.debug('[home] Refreshing buttons...');\n\n    this.$filteredButtons.next(this.filterButtons(this.buttons, account));\n    this.$filteredToolbarButtons.next(this.filterButtons(this.toolbarButtons, account));\n  }\n\n  protected filterButtons(items: MenuItem[], account?: Account): MenuItem[] {\n    if (!this._config) return; // Skip (waiting config to be loaded)\n\n    account = account || this.accountService.account;\n    return (items || [])\n      .filter((item) =>\n        MenuItems.checkIfVisible(item, account, this._config, {\n          isLogin: this.isLogin,\n          debug: this.debug,\n          logPrefix: '[home]',\n        })\n      )\n      .map((item) => {\n        // Replace title using properties\n        if (isNotNilOrBlank(item.titleProperty) && this._config) {\n          const title = this._config.properties?.[item.titleProperty] ?? item.title;\n          if (item.title !== title) {\n            // Clone before changing, to be able to restore the original title (e.g. if config property changed)\n            item.clone();\n            item.title = title;\n          }\n        }\n        return item;\n      });\n  }\n\n  async openMarkdownModal(event?: Event, item: IMenuItem = null) {\n    if (isNilOrBlank(item?.path)) return;\n\n    // Resolve relative path\n    let url = item.path;\n    if (this.network.peer && (url.startsWith('./') || url.startsWith('/'))) {\n      url = Peer.path(this.network.peer, url);\n    }\n\n    const pathFilename = UriUtils.getFilename(url);\n    const isMarkdownFile = pathFilename.endsWith('.md');\n\n    // Open as markdown\n    if (isMarkdownFile) {\n      await AppMarkdownModal.show(this.modalCtrl, {\n        title: this.translate.instant(item.title, item.titleArgs),\n        src: url,\n        enableNavigationHistory: false,\n        canPrint: !this.mobile,\n      });\n    } else {\n      // Open as external link\n      await this.platform.open(url);\n    }\n  }\n\n  protected async toggleDarkMode() {\n    const enable = !this.settings.isDarkMode;\n    await this.settings.apply({ darkMode: enable, autoDarkMode: false });\n  }\n\n  protected async removePageHistory(path: string) {\n    await this.settings.removePageHistory(path);\n  }\n\n  protected async checkScrollbar() {\n    const scrollEl = await this.content.getScrollElement();\n    this.hasScrollbar = scrollEl.scrollHeight > window.innerHeight;\n\n    // DEBUG\n    console.debug('[home] Check scrollbar', this.hasScrollbar);\n\n    this.markForCheck();\n  }\n\n  protected initFeed(feed: FeedsComponent) {\n    if (!feed) return;\n    this.connect('hasFeed', feed.hasFeeds$);\n  }\n\n  protected onToolbarButtonClick(event: Event, item: MenuItem) {\n    if (typeof item.action === 'function') {\n      item.action(event);\n    }\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<app-toolbar [canGoBack]=\"false\" visible-xs visible-sm visible-mobile>\n  <ion-buttons slot=\"end\">\n    @if (showNotificationIcon) {\n      <app-user-event-notification-icon [autoHide]=\"autoHideNotificationIcon\"></app-user-event-notification-icon>\n    }\n\n    <!-- Injected toolbar buttons -->\n    @for (item of $filteredToolbarButtons | async; track item.title) {\n      <ion-button [color]=\"item.color\" (click)=\"onToolbarButtonClick($event, item)\"\n                  [class]=\"item.cssClass\"\n                  [title]=\"!showTooltip ? (item.tooltip | translate) : ''\"\n                  [matTooltip]=\"showTooltip ? (item.tooltip | translate) : ''\"\n                  [matBadge]=\"item.$badge | push\"\n                  [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n                  [matBadgeHidden]=\"!(item.$badge | push)\"\n                  matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\">\n        <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n        <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n        <ion-label *rxIf=\"item.$title; let title\">\n          <span [innerHTML]=\"title | translate\"></span>\n        </ion-label>\n      </ion-button>\n    }\n\n    <!-- dark mode (if allow by the environment token) -->\n    @if (settings.allowDarkMode) {\n      <ion-button (click)=\"toggleDarkMode()\">\n        <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'sunny' : 'moon'\"></ion-icon>\n      </ion-button>\n    }\n\n    <!-- Change locale button -->\n    <ion-button [matMenuTriggerFor]=\"localeMenu\">\n      <ion-icon slot=\"start\" name=\"language\"></ion-icon>\n    </ion-button>\n  </ion-buttons>\n</app-toolbar>\n\n<!-- Change locale menu -->\n<mat-menu #localeMenu=\"matMenu\">\n  <ng-template matMenuContent>\n    @for (item of locales; track item.key) {\n      <button mat-menu-item (click)=\"changeLanguage(item.key)\">\n        <!--<mat-icon>{{ currentLocale === item.key ? 'checkmark' : undefined }}</mat-icon>-->\n        <ion-label>{{ item.value }}</ion-label>\n      </button>\n    }\n  </ng-template>\n</mat-menu>\n\n<ion-content [ngStyle]=\"contentStyle\" [class.has-scrollbar]=\"hasScrollbar\" no-padding-xs>\n  <!-- loading spinner -->\n  <div class=\"loading-page\" [class.cdk-visually-hidden]=\"!(loading$ | push)\">\n    @if (showSpinner) {\n      <div class=\"spinner\">\n        <p [innerHTML]=\"'COMMON.LOADING_DOTS' | translate\"></p>\n        <div class=\"sk-cube1 sk-cube\"></div>\n        <div class=\"sk-cube2 sk-cube\"></div>\n        <div class=\"sk-cube4 sk-cube\"></div>\n        <div class=\"sk-cube3 sk-cube\"></div>\n      </div>\n    }\n  </div>\n\n  <!-- Desktop: translucent top toolbar -->\n  @if (!mobile) {\n    <div class=\"hidden-xs hidden-sm\">\n      <ion-toolbar color=\"transparent\" translucent>\n        <ion-buttons slot=\"start\">\n          <ion-menu-toggle>\n            <ion-button color=\"light\" fill=\"clear\">\n              <ion-icon slot=\"icon-only\" name=\"menu\"></ion-icon>\n            </ion-button>\n          </ion-menu-toggle>\n        </ion-buttons>\n\n        <ion-buttons slot=\"end\">\n          @if (showNotificationIcon) {\n            <app-user-event-notification-icon\n              [style]=\"'ion-button'\"\n              color=\"secondary\"\n              unreadColor=\"tertiary\"\n              fill=\"solid\"\n              [autoHide]=\"autoHideNotificationIcon\"\n            ></app-user-event-notification-icon>\n          }\n\n          <!-- Injected toolbar buttons -->\n          @for (item of $filteredToolbarButtons | async; track item.title) {\n            <ion-button\n              fill=\"solid\"\n              [color]=\"item.color || 'secondary'\"\n              (click)=\"onToolbarButtonClick($event, item)\"\n              [class]=\"item.cssClass\"\n              [title]=\"!showTooltip ? (item.tooltip | translate) : ''\"\n              [matTooltip]=\"showTooltip ? (item.tooltip | translate) : ''\"\n              [matBadge]=\"item.$badge | push\"\n              [matBadgeColor]=\"(item.$badgeColor | push) | matColor\"\n              [matBadgeHidden]=\"!(item.$badge | push)\"\n              matBadgeOverlap=\"true\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n            >\n              <ion-icon *ngIf=\"item.icon\" slot=\"icon-only\" [name]=\"item.icon\"></ion-icon>\n              <mat-icon *ngIf=\"item.matIcon\" slot=\"icon-only\">{{ item.matIcon }}</mat-icon>\n              <ion-label *rxIf=\"item.$title; let title\">\n                <span [innerHTML]=\"title | translate\"></span>\n              </ion-label>\n            </ion-button>\n          }\n\n          <!-- dark mode (if allow by the environment token) -->\n          @if (settings.allowDarkMode) {\n            <ion-button\n              color=\"secondary\"\n              fill=\"solid\"\n              (click)=\"toggleDarkMode()\"\n              [title]=\"!showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('HOME.BTN_DARK_MODE' | translate) : ''\"\n            >\n              <ion-icon slot=\"icon-only\" [name]=\"(darkMode$ | push) ? 'moon' : 'sunny'\"></ion-icon>\n            </ion-button>\n          }\n          <!-- change locale button -->\n          <ion-button\n            color=\"secondary\"\n            fill=\"solid\"\n            [matMenuTriggerFor]=\"localeMenu\"\n            [title]=\"!showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('SETTINGS.LOCALE' | translate) : ''\"\n          >\n            <ion-icon slot=\"icon-only\" name=\"language\"></ion-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </div>\n  }\n\n  <!-- Install (and upgrade) card -->\n  <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n  @if (!(loading$ | push)) {\n    @let hasFeed = hasFeed$ | async;\n    <ion-grid class=\"ion-no-padding\">\n      <ion-row>\n        <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 3 : 0\"></ion-col>\n        <ion-col>\n          <!-- Welcome card -->\n          <ion-card class=\"main welcome ion-padding ion-text-center ion-align-self-center\" @fadeInAnimation>\n            <ion-card-header>\n              <ion-card-title class=\"ion-text-center\">\n                <span *ngIf=\"isWeb\" [innerHTML]=\"'HOME.WELCOME_WEB' | translate: { appName: appName }\"></span>\n                <span *ngIf=\"!isWeb\" [innerHTML]=\"'HOME.WELCOME_APP' | translate: { appName: appName }\"></span>\n              </ion-card-title>\n              <ion-card-subtitle [innerHTML]=\"description\"></ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content class=\"ion-no-padding\">\n              <ion-text color=\"primary\">\n                <img *ngIf=\"logo\" [attr.src]=\"logo\" alt=\"Logo\" />\n              </ion-text>\n              <!-- register help text -->\n              <ion-text *ngIf=\"!isLogin && canRegister\">\n                <br />\n                <span translate>HOME.REGISTER_HELP</span>\n              </ion-text>\n              <div class=\"ion-padding-top\">\n                <!-- If NOT login -->\n                <ng-container *ngIf=\"!isLogin; else loginButtons\">\n                  <ion-button *ngIf=\"canRegister\" expand=\"block\" color=\"tertiary\" (click)=\"register()\">\n                    <span translate>HOME.BTN_REGISTER</span>\n                  </ion-button>\n                  <ion-button expand=\"block\" color=\"light\" [routerLink]=\"['/']\" (click)=\"login()\">\n                    <span translate>AUTH.BTN_LOGIN</span>\n                  </ion-button>\n                </ng-container>\n\n                <!-- If user login -->\n                <ng-template #loginButtons>\n                  <!-- Feature buttons -->\n                  <ng-container *rxIf=\"$filteredButtons; let buttons\">\n                    <ng-container *ngFor=\"let item of buttons\">\n                      @if (item.path) {\n                        <ion-button\n                          expand=\"block\"\n                          color=\"tertiary\"\n                          [class]=\"item.cssClass\"\n                          [routerLink]=\"item.path\"\n                          routerDirection=\"root\"\n                        >\n                          <ion-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.icon\" [name]=\"item.icon\"></ion-icon>\n                          <mat-icon slot=\"start\" class=\"ion-float-start\" *ngIf=\"item.matIcon\">\n                            {{ item.matIcon }}\n                          </mat-icon>\n                          <ion-label>{{ 'HOME.BTN_DATA_ENTRY' | translate: { name: (item.title | translate) } }}</ion-label>\n                          <ion-badge *rxIf=\"item.$badge; let badge\"\n                                     slot=\"end\"\n                                     [color]=\"(item.$badgeColor | push) || 'accent'\">\n                            {{badge}}\n                          </ion-badge>\n                        </ion-button>\n                      } @else {\n                        <!-- divider -->\n                        <div *ngIf=\"!item.action\" [class]=\"item.cssClass\" class=\"button-divider\">\n                          <ion-label translate>{{ item.title }}&nbsp;</ion-label>\n                        </div>\n                      }\n                    </ng-container>\n\n                    <!--<p *ngIf=\"buttons.length\" class=\"visible-mobile\">&nbsp;</p>-->\n                  </ng-container>\n\n                  <ion-button *ngIf=\"showAccountButton\" expand=\"block\" color=\"secondary\" [routerLink]=\"['/account']\">\n                    <ion-icon slot=\"start\" class=\"ion-float-start\" name=\"person-circle\"></ion-icon>\n                    <ion-text translate>HOME.BTN_MY_ACCOUNT</ion-text>\n                  </ion-button>\n\n                  <p hidden-xs hidden-sm hidden-mobile>\n                    <ion-text\n                      [innerHTML]=\"'HOME.NOT_THIS_ACCOUNT_QUESTION' | translate: { displayName: accountName }\"\n                    ></ion-text>\n                    <br />\n                    <ion-text>\n                      <a href=\"#\" (click)=\"logout($event)\">\n                        <span translate>HOME.BTN_DISCONNECT</span>\n                      </a>\n                    </ion-text>\n                  </p>\n                </ng-template>\n              </div>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n        <ion-col size=\"0\" [sizeXl]=\"hasFeed ? 1 : 0\"></ion-col>\n        <ion-col [class.feed]=\"hasFeed\" [size]=\"hasFeed ? 12 : 0\" [sizeXl]=\"hasFeed ? 4 : 0\">\n          @if (showFeed) {\n            @if (mobile) {\n              <app-feed\n                #feed\n                shape=\"round\"\n                [urls]=\"feedUrls\"\n                [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n                [maxContentLength]=\"feedMaxContentLength\"\n                (ngInit)=\"initFeed(feed)\"\n                @fadeInAnimation\n              ></app-feed>\n            } @else {\n              <app-feed\n                #feed\n                shape=\"round\"\n                [debug]=\"false\"\n                [urls]=\"feedUrls\"\n                [maxAgeInMonths]=\"feedMaxAgeInMonths\"\n                [maxContentLength]=\"feedMaxContentLength\"\n                (ngInit)=\"initFeed(feed)\"\n                @slideInAnimation\n                @fadeInAnimation\n              ></app-feed>\n            }\n          }\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n\n    <!-- Page history -->\n    @let pageHistory = isLogin && (pageHistory$ | push);\n    @if (pageHistory | isNotEmptyArray) {\n      <ion-grid class=\"history-container ion-align-self-center\">\n        <ion-row>\n          @for (page of pageHistory; track page.path) {\n            <ion-col size=\"12\" size-xl=\"\" class=\"ion-text-center\">\n              <ion-card class=\"ion-align-self-start ion-text-start\" @fadeInAnimation>\n                <ion-card-header class=\"ion-no-padding\">\n                  <!-- top bar -->\n                  <ion-card-subtitle>\n                    <button\n                      type=\"button\"\n                      tabindex=\"-1\"\n                      (click)=\"removePageHistory(page.path)\"\n                      mat-icon-button\n                      class=\"ion-float-start ion-no-margin close-button\"\n                    >\n                      <mat-icon>close</mat-icon>\n                    </button>\n                    <ion-label [innerHTML]=\"page.subtitle | translate\"></ion-label>\n                    <ion-text\n                      class=\"ion-float-end\"\n                      [title]=\"!showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n                      [matTooltip]=\"showTooltip ? (page.time | dateFormat: { time: true }) : ''\"\n                    >\n                      <small>\n                        <ion-icon name=\"time-outline\"></ion-icon>\n                        &nbsp;{{ page.time | dateFromNow }}\n                      </small>\n                      &nbsp;\n                    </ion-text>\n                  </ion-card-subtitle>\n\n                  <!-- main page -->\n                  <ion-card-title class=\"ion-no-margin ion-no-padding\">\n                    <ion-item\n                      detail=\"true\"\n                      tappable\n                      class=\"text-1x\"\n                      [routerLink]=\"page.path\"\n                      routerDirection=\"root\"\n                      lines=\"none\"\n                    >\n                      <!-- page icon-->\n                      <ion-icon *ngIf=\"page.icon\" slot=\"start\" [name]=\"page.icon\"></ion-icon>\n                      <mat-icon *ngIf=\"page.matIcon\" slot=\"start\">{{ page.matIcon }}</mat-icon>\n\n                      <ion-label color=\"primary\" [innerHTML]=\"page.title\"></ion-label>\n                    </ion-item>\n                  </ion-card-title>\n                </ion-card-header>\n\n                <!-- children pages -->\n                @if (page.children | isNotEmptyArray) {\n                  <ion-card-content class=\"ion-no-padding ion-padding-start\">\n                    <ion-list class=\"ion-no-padding\">\n                      @for (childPage of page.children; track childPage.path) {\n                        <ion-item\n                          detail=\"true\"\n                          tappable\n                          class=\"text-1x\"\n                          [routerLink]=\"childPage.path\"\n                          routerDirection=\"root\"\n                        >\n                          <!-- page icon-->\n                          <ion-icon *ngIf=\"childPage.icon\" slot=\"start\" color=\"dark\" [name]=\"childPage.icon\"></ion-icon>\n                          <mat-icon *ngIf=\"childPage.matIcon\" slot=\"start\" color=\"dark\">\n                            {{ childPage.matIcon }}\n                          </mat-icon>\n\n                          <ion-label color=\"dark\" [innerHTML]=\"childPage.title\"></ion-label>\n                        </ion-item>\n                      }\n                    </ion-list>\n                  </ion-card-content>\n                }\n              </ion-card>\n            </ion-col>\n          }\n        </ion-row>\n      </ion-grid>\n    }\n\n    <!-- Bottom banner -->\n    @if (showPartnerBanner || showLegalInformation) {\n      <ion-grid\n        class=\"bottom-banner ion-text-center\"\n        [class.floating]=\"!mobile && (pageHistory | isEmptyArray)\"\n        @fadeInAnimation\n      >\n        <ion-row>\n          <!-- partners logos -->\n          @if (showPartnerBanner) {\n            <ion-col size=\"12\" [sizeLg]=\"partnerBannerSize\" class=\"ion-text-center\">\n              @if (showLegalInformation) {\n                <ion-list class=\"legal-info\">\n                  <ion-list-header>{{ 'HOME.PARTNERS' | translate }}</ion-list-header>\n                </ion-list>\n              }\n              <!-- partners -->\n              @for (item of $partners | async; track $index) {\n                <a href=\"{{ item.siteUrl }}\">\n                  <img\n                    class=\"logo\"\n                    src=\"{{ item.logo }}\"\n                    alt=\"{{ item.label }}\"\n                    [title]=\"!showTooltip ? item.label : ''\"\n                    [matTooltip]=\"showTooltip ? item.label : ''\"\n                  />\n                </a>\n              }\n            </ion-col>\n          }\n\n          <!-- legal information -->\n          @if (showLegalInformation) {\n            <ion-col size=\"12\" size-sm=\"6\" size-lg=\"4\" [class.left-border]=\"showPartnerBanner\">\n              <ion-list class=\"legal-info\">\n                <ion-list-header class=\"ion-text-left\">{{ 'HOME.LEGAL_INFORMATION' | translate }}</ion-list-header>\n                @for (item of legalInformation; track item.path) {\n                  <ion-item (click)=\"openMarkdownModal($event, item)\" lines=\"none\" [button]=\"true\">\n                    <ion-label>\n                      <p>\n                        {{ item.title | translate: item.titleArgs }}\n                      </p>\n                    </ion-label>\n                  </ion-item>\n                }\n              </ion-list>\n            </ion-col>\n            @if (showInstallLinks) {\n              <ion-col size=\"12\" size-lg=\"3\" offset-lg=\"9\" [class.left-border]=\"showPartnerBanner\">\n                <ion-list class=\"legal-info\">\n                  <ion-list-header>{{ 'HOME.INSTALL_APP' | translate }}</ion-list-header>\n                  <!-- TODO -->\n                </ion-list>\n              </ion-col>\n            }\n          }\n        </ion-row>\n      </ion-grid>\n    }\n  }\n\n  <!-- image credits -->\n  @if (contentCredits | isNotNilOrBlank) {\n    <div class=\"content-credits\" [class.floating]=\"!mobile\">\n      <ion-text>{{ contentCredits }}</ion-text>\n    </div>\n  }\n</ion-content>\n","import { Component, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ActivatedRoute } from '@angular/router';\nimport { AccountService } from '../services/account.service';\nimport { getRandomImageWithCredit } from '../home/home';\nimport { ConfigService } from '../services/config.service';\nimport { PlatformService } from '../services/platform.service';\nimport { CORE_CONFIG_OPTIONS } from '../services/config/core.config';\nimport { isNotEmptyArray } from '../../shared/functions';\n\n@Component({\n  selector: 'app-register-confirm-page',\n  templateUrl: 'register-confirm.page.html',\n  styleUrls: ['./register-confirm.page.scss'],\n})\nexport class RegisterConfirmPage implements OnDestroy {\n  subscriptions: Subscription[] = [];\n\n  isLogin: boolean;\n  loading = true;\n  error: string;\n  email: string;\n  contentStyle = {};\n\n  constructor(\n    private platform: PlatformService,\n    private accountService: AccountService,\n    private activatedRoute: ActivatedRoute,\n    private configService: ConfigService\n  ) {\n    this.platform.ready().then(() => {\n      this.isLogin = accountService.isLogin();\n\n      // Subscriptions\n      this.subscriptions.push(this.accountService.onLogin.subscribe((_) => (this.isLogin = true)));\n      this.subscriptions.push(this.accountService.onLogout.subscribe(() => (this.isLogin = false)));\n      this.subscriptions.push(this.activatedRoute.paramMap.subscribe((params) => this.doConfirm(params.get('email'), params.get('code'))));\n\n      this.configService.config.subscribe((config) => {\n        if (isNotEmptyArray(config?.backgroundImages)) {\n          const { image } = getRandomImageWithCredit(config.backgroundImages);\n          this.contentStyle = { 'background-image': `url(${image})` };\n        } else {\n          const primaryColor = config.getProperty(CORE_CONFIG_OPTIONS.COLOR_PRIMARY) || 'var(--ion-color-primary)';\n          this.contentStyle = { 'background-color': primaryColor };\n        }\n\n        this.loading = false;\n      });\n    });\n  }\n\n  ngOnDestroy() {\n    this.subscriptions.forEach((s) => s.unsubscribe());\n    this.subscriptions = [];\n  }\n\n  async doConfirm(email: string, code: string) {\n    this.email = email;\n\n    if (!code) {\n      this.loading = false;\n      this.error = undefined;\n      return;\n    }\n\n    try {\n      if (this.accountService.isLogin()) {\n        const account = this.accountService.account;\n        const emailAccount = account && account.email;\n        if (email !== emailAccount) {\n          // Not same email => logout, then retry\n          await this.accountService.logout();\n          return this.doConfirm(email, code);\n        }\n      }\n\n      // Send the confirmation code\n      const confirmed = await this.accountService.confirmEmail(email, code);\n      if (confirmed && this.isLogin) {\n        await this.accountService.reload();\n      }\n      this.loading = false;\n      //this.location.replaceState(\"/confirm/\" + email + \"/\");\n    } catch (err) {\n      this.error = (err && err.message) || err;\n      this.loading = false;\n    }\n  }\n}\n","<app-toolbar [title]=\"'REGISTER.CONFIRMED.TITLE' | translate\" color=\"primary\"></app-toolbar>\n\n<ion-content class=\"bg-image-cover center ion-padding\" [ngStyle]=\"contentStyle\">\n  <p class=\"hidden-xs ion-padding\">\n    &nbsp;\n    <br />\n    <br />\n  </p>\n  <p class=\"hidden-xs\">&nbsp;</p>\n\n  <ion-card>\n    <ion-card-content>\n      <div>\n        <ng-container *ngIf=\"loading\">\n          <h4 translate>REGISTER.CONFIRMED.LOADING</h4>\n          <p><ion-spinner></ion-spinner></p>\n        </ng-container>\n\n        <!-- error -->\n        <ion-item *ngIf=\"!loading && error\">\n          <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n          <ion-label color=\"danger\" class=\"error ion-text-wrap\" [innerHTML]=\"error | translate\"></ion-label>\n        </ion-item>\n      </div>\n\n      <div *ngIf=\"!loading && !error\">\n        <h3>\n          <ion-icon name=\"checkmark\"></ion-icon>\n          <b translate>REGISTER.CONFIRMED.SUB_TITLE</b>\n        </h3>\n\n        <ion-text>\n          <p [innerHTML]=\"'REGISTER.CONFIRMED.SUCCESS' | translate: { email: email }\"></p>\n          <p *ngIf=\"!isLogin\" [innerHTML]=\"'REGISTER.CONFIRMED.LOGIN_HELP' | translate\"></p>\n        </ion-text>\n      </div>\n    </ion-card-content>\n\n    <ion-footer *ngIf=\"!loading\">\n      <ion-button expand=\"full\" color=\"primary\" [routerLink]=\"['/account']\" *ngIf=\"!isLogin\">\n        <ion-icon name=\"log-in\" slot=\"start\"></ion-icon>\n        <span translate>AUTH.BTN_LOGIN</span>\n      </ion-button>\n\n      <ion-button expand=\"full\" color=\"secondary\" [routerLink]=\"['/account']\" *ngIf=\"isLogin\">\n        <ion-icon name=\"contact\" slot=\"start\"></ion-icon>\n        <span translate>HOME.BTN_MY_ACCOUNT</span>\n      </ion-button>\n    </ion-footer>\n  </ion-card>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { RegisterConfirmPage } from './register-confirm.page';\nimport { RegisterForm } from './register.form';\nimport { RegisterModal } from './register.modal';\nimport { SharedModule } from '../../shared/shared.module';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n  imports: [SharedModule, RouterModule, TranslateModule.forChild()],\n\n  declarations: [RegisterForm, RegisterModal, RegisterConfirmPage],\n  exports: [TranslateModule, RegisterForm, RegisterModal, RegisterConfirmPage],\n})\nexport class AppRegisterModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppUsernameForm } from './username.form';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild()],\n\n  declarations: [AppUsernameForm],\n  exports: [TranslateModule, AppUsernameForm],\n})\nexport class AppUsernameFormModule {}\n","import { NgModule } from '@angular/core';\nimport { AppAuthForm } from './auth.form';\nimport { AppAuthModal } from './auth.modal';\nimport { SharedModule } from '../../shared/shared.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppRegisterModule } from '../register/register.module';\nimport { AppResetPasswordModal } from './reset-password.modal';\nimport { AppUsernameFormModule } from '../form/username/username.module';\n\n@NgModule({\n  imports: [\n    SharedModule,\n    TranslateModule.forChild(),\n\n    // App modules\n    AppRegisterModule,\n    AppUsernameFormModule,\n  ],\n\n  declarations: [\n    // Components\n    AppAuthForm,\n    AppAuthModal,\n    AppResetPasswordModal,\n  ],\n  exports: [\n    TranslateModule,\n\n    // Components\n    AppAuthForm,\n    AppAuthModal,\n    AppResetPasswordModal,\n  ],\n})\nexport class AppAuthModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SharedModule } from '../../shared/shared.module';\nimport { UserEventNotificationIcon } from './notification/user-event-notification.icon';\nimport { UserEventNotificationList } from './notification/user-event-notification.list';\nimport { AppIconModule } from '../../core/icon/icon.module';\nimport { NgxJdenticonModule } from 'ngx-jdenticon';\nimport { RxStateModule } from '../../shared/rx-state/rx-state.module';\nimport { UserEventNotificationModal } from './notification/user-event-notification.modal';\n\n@NgModule({\n  imports: [CommonModule, SharedModule, AppIconModule, RxStateModule, NgxJdenticonModule],\n  declarations: [UserEventNotificationIcon, UserEventNotificationList, UserEventNotificationModal],\n  exports: [UserEventNotificationIcon, UserEventNotificationModal],\n})\nexport class UserEventModule {}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { LocalSettingsService } from '../../core/services/local-settings.service';\nimport { APP_FEED_SERVICE, IFeedService } from './feed.service';\nimport { JsonFeed } from './feed.model';\nimport { firstNotNilPromise } from '../../shared/observables';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n@Component({\n  selector: 'app-feed-page',\n  templateUrl: './feed.page.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedPage<T extends JsonFeed = JsonFeed> implements OnInit, OnDestroy {\n  protected destroySubject = new Subject<void>();\n  protected loadingSubject = new BehaviorSubject(true);\n  @Input() debug: boolean;\n\n  @Input() title = 'SOCIAL.FEED.NEWS';\n  @Input() feedUrls: string[];\n  @Input() feedItemId: string;\n\n  constructor(\n    protected settings: LocalSettingsService,\n    protected cd: ChangeDetectorRef,\n    @Optional() @Inject(APP_FEED_SERVICE) public feedService: IFeedService<T>,\n    @Optional() @Inject(ENVIRONMENT) private environment: Environment\n  ) {\n    this.debug = !environment?.production;\n  }\n\n  async ngOnInit() {\n    this.feedService.ready();\n    this.feedUrls = this.feedUrls ?? (await firstNotNilPromise(this.feedService.feedUrls$, { stop: this.destroySubject }));\n    console.debug('[feed-page] Feed URLs:', this.feedUrls);\n    this.loadingSubject.next(false);\n    this.cd.markForCheck();\n  }\n\n  ngOnDestroy() {\n    this.destroySubject.next();\n    this.destroySubject.complete();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>{{ title | translate }}</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <div class=\"ion-padding\">\n    @if (loadingSubject | async) {\n      <ion-spinner></ion-spinner>\n    } @else {\n      <app-feed [showHeader]=\"false\"\n                [showReadMoreButton]=\"false\"\n                [urls]=\"feedUrls\"\n                cardColor=\"light\"\n                [debug]=\"debug\"\n      ></app-feed>\n    }\n  </div>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { FeedsComponent } from './feed.component';\nimport { FeedDirective } from './feed.directive';\nimport { SharedDebugModule } from '../../shared/debug/debug.module';\nimport { SharedMarkdownModule } from '../../shared/markdown/markdown.module';\nimport { FeedPage } from './feed.page';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild(), SharedDebugModule, SharedMarkdownModule],\n  declarations: [FeedsComponent, FeedPage, FeedDirective],\n  exports: [TranslateModule, FeedsComponent, FeedPage, FeedDirective],\n})\nexport class FeedModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { HomePage } from './home';\nimport { AppAuthModule } from '../auth/auth.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { RouterModule } from '@angular/router';\nimport { AppInstallUpgradeCardModule } from '../install/install-upgrade-card.module';\nimport { RxStateModule } from '../../shared/rx-state/rx-state.module';\nimport { SharedMarkdownModule } from '../../shared/markdown/markdown.module';\nimport { UserEventModule } from '../../social/user-event/user-event.module';\nimport { FeedModule } from '../../social/feed/feed.module';\n\n@NgModule({\n  imports: [\n    SharedModule,\n    RouterModule,\n    TranslateModule.forChild(),\n    RxStateModule,\n\n    // App modules\n    AppAuthModule,\n    AppInstallUpgradeCardModule,\n    SharedMarkdownModule,\n    UserEventModule,\n    FeedModule,\n  ],\n\n  declarations: [HomePage],\n  exports: [RouterModule, TranslateModule, HomePage],\n})\nexport class AppHomePageModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { IonicModule } from '@ionic/angular';\nimport { AboutModal } from './about.modal';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { MarkdownModule } from 'ngx-markdown';\n\n@NgModule({\n  imports: [SharedModule, IonicModule, TranslateModule.forChild(), MarkdownModule],\n\n  declarations: [AboutModal],\n  exports: [TranslateModule, AboutModal],\n})\nexport class AppAboutModalModule {}\n","import { Injectable } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { Property } from '../../../shared/types';\nimport { AppValidatorService } from '../../services/validator/base.validator.class';\nimport { isNil, isNotEmptyArray } from '../../../shared/functions';\nimport { FormFieldDefinition } from '../../../shared/form/field.model';\nimport { AppFormArray } from '../array/form-array';\nimport { AppPropertiesUtils } from './properties.utils';\n\nexport interface PropertyValidatorOptions {\n  definition?: FormFieldDefinition;\n  valueMaxLength?: number;\n}\n\nexport interface PropertiesValidatorOptions {\n  definitions?: FormFieldDefinition[];\n  valueMaxLength?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class PropertyValidator extends AppValidatorService<Property> {\n  constructor(protected formBuilder: UntypedFormBuilder) {\n    super(formBuilder, null);\n  }\n\n  getFormArray(data?: any, opts?: PropertiesValidatorOptions) {\n    const fromArray = new AppFormArray<Property, UntypedFormGroup>(\n      (value) => this.getFormGroup(value, { valueMaxLength: 2000 }),\n      (v1, v2) => this.equals(v1, v2),\n      (value) => this.isEmpty(value),\n      {\n        allowReuseControls: false,\n        allowEmptyArray: true,\n      }\n    );\n\n    // Set data, if any\n    if (data) {\n      const dataArrayOrPromise = AppPropertiesUtils.arrayFromObject(data, opts?.definitions);\n      if (Array.isArray(dataArrayOrPromise)) {\n        if (isNotEmptyArray(dataArrayOrPromise)) fromArray.patchValue(dataArrayOrPromise);\n      } else {\n        // If promise: wait and set after\n        dataArrayOrPromise\n          .catch((err) => {\n            console.error('[property-validator] Error during conversion from map to array conversion: ' + (err?.message || err), data, err);\n            return null;\n          })\n          .then((values) => {\n            if (isNotEmptyArray(values)) fromArray.patchValue(values);\n            fromArray.updateValueAndValidity();\n          });\n\n        // Wait value to be set\n        fromArray.markAsPending();\n      }\n    }\n    return fromArray;\n  }\n\n  getFormGroup(data?: Property, opts?: PropertyValidatorOptions): UntypedFormGroup {\n    return this.formBuilder.group(this.getFormGroupConfig(data, opts));\n  }\n\n  getFormGroupConfig(data?: Property, opts?: PropertyValidatorOptions): { [p: string]: any } {\n    return {\n      key: [data?.key ?? null, Validators.compose([Validators.required, Validators.max(50)])],\n      value: [\n        data?.value ?? null,\n        opts?.valueMaxLength > 0 ? Validators.compose([Validators.required, Validators.max(opts.valueMaxLength)]) : Validators.required,\n      ],\n    };\n  }\n\n  equals(v1: Property, v2: Property): boolean {\n    return (!v1 && !v2) || v1.key === v2.key;\n  }\n\n  isEmpty(obj: Property): boolean {\n    return isNil(obj?.key) || isNil(obj.value);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { AbstractControl, UntypedFormBuilder, UntypedFormGroup, ValidationErrors, Validators } from '@angular/forms';\nimport { LocalSettings } from '../model/settings.model';\nimport { SharedValidators } from '../../../shared/validator/validators';\nimport { NetworkService } from '../network.service';\nimport { AppValidatorService } from './base.validator.class';\nimport { toBoolean } from '../../../shared/functions';\nimport { PropertyValidator } from '../../form/properties/property.validator';\nimport { FormFieldDefinition } from '../../../shared/form/field.model';\n\n@Injectable({ providedIn: 'root' })\nexport class LocalSettingsValidatorService extends AppValidatorService<LocalSettings> {\n  constructor(\n    formBuilder: UntypedFormBuilder,\n    private propertyValidator: PropertyValidator,\n    private networkService: NetworkService\n  ) {\n    super(formBuilder);\n  }\n\n  getFormGroup(data?: LocalSettings, opts?: { definitions?: FormFieldDefinition[] }): UntypedFormGroup {\n    return this.formBuilder.group(\n      {\n        accountInheritance: [toBoolean(data?.accountInheritance, true), Validators.required],\n        locale: [data?.locale || null, Validators.required],\n        darkMode: [toBoolean(data?.darkMode, null)],\n        autoDarkMode: [toBoolean(data?.autoDarkMode, true)],\n        latLongFormat: [data?.latLongFormat || null, Validators.required],\n        usageMode: [data?.usageMode || 'DESK', Validators.required],\n        peerUrl: [data?.peerUrl || null, Validators.required],\n        properties: this.propertyValidator.getFormArray(data?.properties, opts),\n      },\n      {\n        asyncValidators: (group: UntypedFormGroup) => this.peerAlive(group.get('peerUrl')),\n      }\n    );\n  }\n\n  /* -- protected methods -- */\n\n  protected async peerAlive(peerUrlControl: AbstractControl): Promise<ValidationErrors | null> {\n    if (this.networkService.online) {\n      const alive = await this.networkService.checkPeerAlive(peerUrlControl.value);\n      // KO: add a validation error\n      if (!alive) {\n        const errors: ValidationErrors = peerUrlControl.errors || {};\n        errors['peerAlive'] = true;\n        peerUrlControl.setErrors(errors);\n        peerUrlControl.markAsTouched({ onlySelf: true });\n        // Return the error (should be apply to the parent form)\n        return { peerAlive: true };\n      }\n    }\n\n    // OK: remove the existing error on control\n    SharedValidators.clearError(peerUrlControl, 'peerAlive');\n    return null;\n  }\n}\n","import { Component, EventEmitter, inject, Input, OnDestroy, Output } from '@angular/core';\nimport { Hotkeys } from '../../../shared/hotkeys/hotkeys.service';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, filter } from 'rxjs/operators';\nimport { MenuService } from '../../menu/menu.service';\nimport { PredefinedColors } from '@ionic/core';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\nexport abstract class FormButtonsBarToken {\n  abstract onCancel: EventEmitter<Event>;\n  abstract onSave: EventEmitter<Event>;\n  abstract onNext: EventEmitter<Event>;\n  abstract onBack: EventEmitter<Event>;\n}\n\n@Component({\n  selector: 'app-form-buttons-bar',\n  templateUrl: './form-buttons-bar.component.html',\n  styleUrls: ['./form-buttons-bar.component.scss'],\n  providers: [{ provide: FormButtonsBarToken, useExisting: FormButtonsBarComponent }],\n})\nexport class FormButtonsBarComponent implements FormButtonsBarToken, OnDestroy {\n  private _subscription = new Subscription();\n\n  @Input() disabled = false;\n  @Input() disabledCancel = false;\n  @Input() disabledEscape = false;\n  @Input() classList: string;\n\n  @Input() saveButtonColor: PredefinedColors = 'danger';\n\n  @Input() backText = 'COMMON.BTN_CLOSE';\n  @Input() cancelText = 'COMMON.BTN_RESET';\n  @Input() nextText = 'COMMON.BTN_NEXT';\n\n  @Input() showBack = true;\n  @Input() showCancel = true;\n  @Input() showNext = true;\n  @Input() showSave = true;\n\n  @Output() onCancel = new EventEmitter<Event>();\n  @Output() onSave = new EventEmitter<Event>();\n  @Output() onNext = new EventEmitter<Event>();\n  @Output() onBack = new EventEmitter<Event>();\n  @Output() onSaveAndClose = new EventEmitter<Event>();\n  @Output() onSaveAndNext = new EventEmitter<Event>();\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    hotkeys: Hotkeys,\n    protected menu: MenuService\n  ) {\n    // Ctrl+S\n    this._subscription.add(\n      hotkeys\n        .addShortcut({ keys: `${hotkeys.defaultControlKey}.s`, description: 'COMMON.BTN_SAVE' })\n        .pipe(filter((_) => !this.disabled))\n        .subscribe((event) => this.onSave.emit(event))\n    );\n\n    // Ctrl+Z\n    this._subscription.add(\n      hotkeys\n        .addShortcut({ keys: `${hotkeys.defaultControlKey}.z`, description: 'COMMON.BTN_RESET' })\n        .pipe(filter((_) => !this.disabled && !this.disabledCancel))\n        .subscribe((event) => this.onCancel.emit(event))\n    );\n\n    // Escape\n    this._subscription.add(\n      hotkeys\n        .addShortcut({ keys: 'escape', description: 'COMMON.BTN_CLOSE', preventDefault: false })\n        .pipe(\n          debounceTime(100), // Allow other components to manage the event\n          filter((e) => this.showBack && !e.defaultPrevented && !this.disabledEscape)\n          //tap(() => console.debug('[form-buttons-bar] Emit back event (keydown.escape)'))\n        )\n        .subscribe((event) => this.onBack.emit(event))\n    );\n  }\n\n  ngOnDestroy(): void {\n    this._subscription.unsubscribe();\n    this.onCancel.complete();\n    this.onSave.complete();\n    this.onNext.complete();\n    this.onBack.complete();\n    this.onSaveAndNext.complete();\n    this.onSaveAndClose.complete();\n  }\n}\n","<ion-toolbar [class]=\"classList\">\n  <ion-row class=\"ion-no-padding\" nowrap>\n    <!-- show menu button -->\n    <ion-col size=\"auto\" class=\"hidden-xs hidden-sm\">\n      <ion-menu-toggle>\n        <button\n          mat-icon-button\n          color=\"accent\"\n          [title]=\"!showTooltip ? ('COMMON.BTN_SHOW_MENU' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('COMMON.BTN_SHOW_MENU' | translate) : ''\"\n          (click)=\"menu.toggleSplitPaneWhen()\"\n        >\n          <mat-icon><span>&#xbb;</span></mat-icon>\n        </button>\n      </ion-menu-toggle>\n    </ion-col>\n\n    <ion-col class=\"app-form-buttons-bar-content\">\n      <ng-content></ng-content>\n    </ion-col>\n\n    <ion-col size=\"auto\" class=\"app-form-buttons-bar-buttons\">\n      <ng-content select=\"[slot=end]\"></ng-content>\n\n      <!-- back -->\n      <ion-button\n        fill=\"clear\"\n        color=\"dark\"\n        (click)=\"onBack.emit($event)\"\n        (keyup.enter)=\"onBack.emit($event)\"\n        *ngIf=\"showBack && onBack.observed\"\n        class=\"back\"\n      >\n        <ion-label>{{ backText | translate }}</ion-label>\n      </ion-button>\n\n      <!-- cancel -->\n      <ion-button\n        fill=\"clear\"\n        color=\"dark\"\n        *ngIf=\"showCancel\"\n        (click)=\"onCancel.emit($event)\"\n        (keyup.enter)=\"onCancel.emit($event)\"\n        [disabled]=\"disabledCancel\"\n        class=\"cancel\"\n      >\n        <ion-icon slot=\"start\" name=\"refresh\"></ion-icon>\n        <ion-label>{{ cancelText | translate }}</ion-label>\n      </ion-button>\n\n      <!-- next -->\n      <ion-button\n        fill=\"solid\"\n        *ngIf=\"showNext && onNext.observed\"\n        (click)=\"onNext.emit($event)\"\n        (keyup.enter)=\"onNext.emit($event)\"\n        class=\"next\"\n      >\n        <ion-label>{{ nextText | translate }}</ion-label>\n        <ion-icon slot=\"end\" name=\"arrow-forward\"></ion-icon>\n      </ion-button>\n\n      <!-- save -->\n      @if (showSave && onSave.observed) {\n        <ion-button\n          [fill]=\"disabled ? 'clear' : 'solid'\"\n          (click)=\"onSave.emit($event)\"\n          (keyup.enter)=\"onSave.emit($event)\"\n          [color]=\"saveButtonColor\"\n          [disabled]=\"disabled\"\n          [title]=\"!showTooltip ? ('COMMON.BTN_SAVE_WITH_SHORTCUT_HELP' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('COMMON.BTN_SAVE_WITH_SHORTCUT_HELP' | translate) : ''\"\n          class=\"save\"\n        >\n          <ion-label>\n            <span [innerHTML]=\"'COMMON.BTN_SAVE_WITH_SHORTCUT' | translate\"></span>\n          </ion-label>\n        </ion-button>\n      }\n\n      <ng-content select=\"[slot=afterSave]\"></ng-content>\n    </ion-col>\n  </ion-row>\n</ion-toolbar>\n","import { Directive, Injector, Input } from '@angular/core';\n\nimport { TranslateService } from '@ngx-translate/core';\nimport { PopoverController, ToastController } from '@ionic/angular';\nimport { Observable } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport { HttpEventType } from '@angular/common/http';\nimport { Property } from '../../../shared/types';\nimport { FilesUtils } from '../../../shared/file/file.utils';\nimport { FileEvent, FileResponse } from '../../../shared/upload-file/upload-file.model';\nimport { CsvUtils } from '../../../shared/file/csv.utils';\nimport { isNotNil } from '../../../shared/functions';\nimport { ShowToastOptions, Toasts } from '../../../shared/toast/toasts';\n\nexport type ReferentialImportPolicy = 'insert-update' | 'insert-only' | 'update-only' | 'delete-only';\n\nexport const IMPORT_POLICIES: ReferentialImportPolicy[] = ['insert-update', 'insert-only', 'update-only'];\n\n@Directive()\nexport class PropertiesFileService {\n  private readonly logPrefix = '[properties-file-service] ';\n  private readonly translate: TranslateService;\n  private readonly toastController: ToastController;\n  private readonly popoverController: PopoverController;\n\n  @Input() i18nColumnPrefix: string;\n  @Input() importPolicy: ReferentialImportPolicy = 'insert-update';\n\n  constructor(injector: Injector) {\n    this.translate = injector.get(TranslateService);\n    this.toastController = injector.get(ToastController);\n    this.popoverController = injector.get(PopoverController);\n  }\n\n  exportToCsv(data: Property[], opts?: { context?: any }) {\n    // Prepare CSV options\n    const separator = CsvUtils.getLocalizedSeparator(this.translate);\n    const encoding = CsvUtils.getLocalizedEncoding(this.translate);\n    const translations = this.translate.instant(\n      ['FILE.PROPERTIES.CSV_FILENAME', 'FILE.PROPERTIES.LABEL_HEADER', 'FILE.PROPERTIES.VALUE_HEADER', 'FILE.PROPERTIES.DESCRIPTION_HEADER'],\n      opts?.context\n    );\n    const filename = translations['FILE.PROPERTIES.CSV_FILENAME'];\n    const headers = [\n      translations['FILE.PROPERTIES.LABEL_HEADER'],\n      translations['FILE.PROPERTIES.VALUE_HEADER'],\n      translations['FILE.PROPERTIES.DESCRIPTION_HEADER'],\n    ];\n\n    // Convert into CSV\n    CsvUtils.exportToFile(data, { filename, headers, separator, encoding });\n  }\n\n  async importFromCsv(event?: Event) {\n    let properties: Property[];\n\n    try {\n      const { data } = await FilesUtils.showUploadPopover(this.popoverController, event, {\n        uniqueFile: true,\n        fileExtension: '.csv',\n        uploadFn: (file) => this.readPropertiesCsvFile(file),\n      });\n\n      properties = (data || []).flatMap((file) => file.response?.body || []);\n    } catch (err) {\n      const message = (err && err.message) || err;\n      this.showToast({\n        type: 'error',\n        message: 'FILE.PROPERTIES.ERROR.IMPORT_ERROR',\n        messageParams: { error: message },\n        showCloseButton: true,\n        duration: -1,\n      });\n      return;\n    }\n\n    return properties;\n  }\n\n  protected readPropertiesCsvFile(file: File): Observable<FileEvent<Property[]>> {\n    console.info(this.logPrefix + `Reading properties CSV file ${file.name}...`);\n\n    const separator = CsvUtils.getLocalizedSeparator(this.translate);\n    const encoding = CsvUtils.getLocalizedEncoding(this.translate);\n\n    return CsvUtils.parseFile(file, { encoding, separator }).pipe(\n      map((event) => {\n        if (event.type === HttpEventType.UploadProgress) {\n          const loaded = Math.round(event.loaded * 0.8);\n          return { ...event, loaded };\n        } else if (event instanceof FileResponse) {\n          const properties = this.parsePropertiesCsvRows(event.body, separator);\n          return new FileResponse({ body: properties });\n        }\n        // Unknown event: skip\n        return null;\n      }),\n      filter(isNotNil)\n    );\n  }\n\n  protected parsePropertiesCsvRows(rows: string[][], separator: string): Property[] {\n    if (!rows || rows.length <= 1) throw { message: 'FILE.CSV.ERROR.EMPTY_FILE' };\n\n    const headerNames = rows.splice(0, 1)[0];\n    const total = rows.length;\n    console.debug(this.logPrefix + `Reading ${total} properties...`);\n\n    // Check headers\n    if (headerNames.length <= 1) {\n      const message = this.translate.instant('FILE.CSV.ERROR.NO_HEADER_OR_INVALID_SEPARATOR', {\n        separator,\n      });\n      throw { message };\n    }\n\n    // Check column names\n    console.debug(this.logPrefix + `Checking headers: ${headerNames.join(',')}`);\n    const translations = this.translate.instant([\n      'FILE.PROPERTIES.LABEL_HEADER',\n      'FILE.PROPERTIES.VALUE_HEADER',\n      'FILE.PROPERTIES.DESCRIPTION_HEADER',\n    ]);\n    const expectedHeaders = [\n      translations['FILE.PROPERTIES.LABEL_HEADER'],\n      translations['FILE.PROPERTIES.VALUE_HEADER'],\n      translations['FILE.PROPERTIES.DESCRIPTION_HEADER'],\n    ];\n    const unknownHeaders = headerNames.filter((h) => !expectedHeaders.includes(h));\n    if (unknownHeaders.length) {\n      const message = this.translate.instant('FILE.CSV.ERROR.UNKNOWN_HEADERS', {\n        headers: unknownHeaders.join(', '),\n      });\n      throw { message };\n    }\n\n    return rows.map((row: string[]) => {\n      return <Property>{\n        key: row[0],\n        value: row[1],\n      };\n    });\n  }\n\n  protected async showToast(opts: ShowToastOptions) {\n    if (!this.toastController) throw new Error(\"Missing toastController in component's constructor\");\n    return Toasts.show(this.toastController, this.translate, opts);\n  }\n}\n","import { booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Injector, Input, OnInit, Optional } from '@angular/core';\nimport { FormGroupDirective, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { FormFieldDefinition, FormFieldDefinitionMap, FormFieldDefinitionUtils } from '../../../shared/form/field.model';\nimport { isEmptyArray, isNil, isNotNil } from '../../../shared/functions';\nimport { DateAdapter, ThemePalette } from '@angular/material/core';\nimport { Moment } from 'moment';\nimport { AppForm } from '../form.class';\nimport { Property, PropertyMap } from '../../../shared/types';\nimport { PropertyValidator } from './property.validator';\nimport { PredefinedColors } from '@ionic/core';\nimport { FormArrayHelper, FormArrayHelperOptions } from '../array/form-array';\nimport { isMobile } from '../../../shared/platforms';\nimport { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field';\nimport { MatAutocompleteFieldConfig } from '../../../shared/material/autocomplete/material.autocomplete.config';\nimport { suggestFromArray } from '../../../shared/services';\nimport { LoadResult } from '../../../shared/services/entity-service.class';\nimport { AppPropertiesUtils, AppPropertyUtils } from './properties.utils';\nimport { RxState } from '@rx-angular/state';\nimport { firstNotNilPromise } from '../../../shared/observables';\nimport { SortDirection } from '@angular/material/sort';\nimport { RegExpUtils } from '../../../shared/regexps';\nimport { IMPORT_POLICIES, PropertiesFileService, ReferentialImportPolicy } from './properties-file.service';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\nexport interface AppPropertiesFormState {\n  definitions: FormFieldDefinition[];\n  definitionKeys: Property[];\n}\n\n@Component({\n  selector: 'app-properties-form',\n  templateUrl: 'properties.form.html',\n  styleUrls: ['properties.form.scss'],\n  providers: [{ provide: PropertyValidator, useClass: PropertyValidator }, RxState],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppPropertiesForm<O = any, T extends Property<O> = Property<O>, S extends AppPropertiesFormState = AppPropertiesFormState>\n  extends AppForm<T[]>\n  implements OnInit\n{\n  protected readonly _state: RxState<S> = inject(RxState);\n  protected readonly _importPolicies = IMPORT_POLICIES;\n\n  protected _definitions$ = this._state.select('definitions');\n  protected _definitionKeys$ = this._state.select('definitionKeys');\n\n  protected set _definitionKeys(value: Property[]) {\n    this._state.set('definitionKeys', () => value);\n  }\n  protected get _definitionKeys(): Property[] {\n    return this._state.get('definitionKeys');\n  }\n\n  protected _definitionByKey: FormFieldDefinitionMap = {};\n  protected _definitionsByIndex: { [index: number]: FormFieldDefinition } = {};\n  protected _helper: FormArrayHelper<Property>;\n  protected _propertiesFileService: PropertiesFileService;\n\n  protected _autocompleteConfig: MatAutocompleteFieldConfig;\n  protected _focusedControlIndex: number;\n\n  @Input({ transform: booleanAttribute }) showToolbar = false;\n  @Input() formArrayName: string;\n  @Input() formArray: UntypedFormArray;\n  @Input() options: FormArrayHelperOptions;\n  @Input() chipColor: ThemePalette | PredefinedColors = 'accent';\n  @Input({ transform: booleanAttribute }) mobile: boolean;\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() subscriptSizing: SubscriptSizing;\n  @Input({ transform: booleanAttribute }) showHintKey = false;\n  @Input() hintKeyPrefix = '';\n  @Input({ transform: booleanAttribute }) showMoreButton = true;\n  @Input() addButtonText = 'COMMON.BTN_ADD';\n  @Input() addButtonTitle = '';\n  @Input({ transform: booleanAttribute }) showAddButton = true;\n  @Input() panelClass: string;\n  @Input() panelWidth: string;\n  @Input({ transform: booleanAttribute }) canDownload = false;\n  @Input({ transform: booleanAttribute }) canImport = false;\n\n  /**\n   * @deprecated Use addButtonTitle instead\n   * @param value\n   */\n  @Input() set showMoreButtonTitle(value: string) {\n    this.addButtonTitle = value;\n  }\n  get showMoreButtonTitle(): string {\n    return this.addButtonTitle;\n  }\n\n  @Input() set definitions(value: FormFieldDefinition[]) {\n    this._state.set('definitions', () => value);\n  }\n  get definitions(): FormFieldDefinition[] {\n    return this._state.get('definitions');\n  }\n\n  set value(data: T[]) {\n    this.setValue(data);\n  }\n\n  get value(): T[] {\n    return this.formArray.value as T[];\n  }\n\n  get length(): number {\n    return this.formArray?.length || 0;\n  }\n\n  get fieldForms(): UntypedFormGroup[] {\n    return this.formArray.controls as UntypedFormGroup[];\n  }\n\n  @Input() set importPolicy(value: ReferentialImportPolicy) {\n    if (this._propertiesFileService) this._propertiesFileService.importPolicy = value;\n  }\n\n  get importPolicy(): ReferentialImportPolicy {\n    return this._propertiesFileService?.importPolicy || 'insert-update';\n  }\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected injector: Injector,\n    protected formBuilder: UntypedFormBuilder,\n    protected dateAdapter: DateAdapter<Moment>,\n    protected cd: ChangeDetectorRef,\n    protected validator: PropertyValidator,\n    @Optional() private formGroupDir: FormGroupDirective\n  ) {\n    super(injector, null);\n\n    this._propertiesFileService = new PropertiesFileService(injector);\n\n    this.tabindex = 20; // For compatibility - TODO remove later\n    //this.debug = !environment.production;\n  }\n\n  ngOnInit() {\n    if (this.options?.allowEmptyArray === false && isEmptyArray(this.definitions)) {\n      throw new Error(\"Missing or invalid attribute 'definitions'\");\n    }\n\n    // Retrieve the form\n    const form =\n      (this.formArray && (this.formArray.parent as UntypedFormGroup)) || (this.formGroupDir && this.formGroupDir.form) || this.formBuilder.group({});\n    this.setForm(form);\n\n    this.formArray = this.formArray || (this.formArrayName && (form.get(this.formArrayName) as UntypedFormArray));\n    this.formArrayName =\n      this.formArrayName || (this.formArray && Object.keys(form.controls).find((key) => form.get(key) === this.formArray)) || 'properties';\n    if (!this.formArray) {\n      console.warn(`Missing array control '${this.formArrayName}'. Will create it!`);\n      this.formArray = this.formBuilder.array([]);\n      this.form.addControl(this.formArrayName, this.formArray);\n    }\n\n    this._helper = new FormArrayHelper<Property>(\n      this.formArray,\n      (value) => this.validator.getFormGroup(value),\n      (v1, v2) => (!v1 && !v2) || v1.key === v2.key,\n      (value) => this.isEmptyProperty(value),\n      this.options\n    );\n\n    super.ngOnInit();\n\n    // Default values\n    this.mobile = this.mobile ?? isMobile(window);\n\n    // Combo key\n    this._autocompleteConfig = {\n      suggestFn: (value, filter, sortBy, sortDirection, opts) => this.suggestDefinitionKeys(value, filter, 'value', sortDirection, opts),\n      equals: (v1, v2) => (v1?.key || v1) === (v2?.key || v2),\n      displayWith: (value: any) => {\n        // DEBUG\n        //if (this.debug) console.debug('[app-properties-form] Displaying value', value);\n\n        // Value is an object (a Property)\n        if (value && typeof value === 'object') {\n          return (value as Property).value;\n        }\n\n        // Value is a key\n        const def = typeof value === 'string' && this._definitionByKey[value];\n        if (!def) return value;\n        return this.translate.instant(def.label);\n      },\n      attributes: ['value'],\n      columnNames: [this.translate.instant('SETTINGS.PROPERTY_KEY')],\n      splitSearchText: false,\n      showAllOnFocus: true,\n      selectInputContentOnFocus: true,\n    };\n\n    this._state.hold(this._state.select('definitions'), (definitions) => {\n      if (this.loaded) this.processDefinitions(definitions);\n    });\n\n    this.processDefinitions(this.definitions);\n  }\n\n  protected processDefinitions(definitions: FormFieldDefinition[]) {\n    if (!definitions) return [];\n\n    // DEBUG\n    if (this.debug) console.debug('[app-properties-form] Processing definitions...', definitions);\n\n    // Prepare definition (e.g. resolve tokens if any)\n    definitions = FormFieldDefinitionUtils.prepareDefinitions(this.injector, definitions || []);\n\n    // Fill options map\n    const definitionsByKey = <FormFieldDefinitionMap>{};\n    this._definitionKeys = definitions\n      .map((def) => {\n        definitionsByKey[def.key] = def;\n        if (def.disabled) return null;\n        return { key: def.key, value: this.translate.instant(def.label) };\n      })\n      .filter(isNotNil);\n    this._definitionByKey = definitionsByKey;\n  }\n\n  getDefinitionAt(index: number): FormFieldDefinition {\n    let definition = this._definitionsByIndex[index];\n    if (!definition) {\n      definition = this.updateDefinitionAt(index, { emitEvent: false });\n    }\n    return definition;\n  }\n\n  updateDefinitionAt(index: number, opts?: { emitEvent?: boolean }): FormFieldDefinition {\n    const value = (this.formArray.at(index) as UntypedFormGroup).controls.key.value;\n    const key = value?.key || value;\n    const definition = (key && this._definitionByKey[key]) || null;\n    this._definitionsByIndex[index] = definition; // update map by index\n    if (opts?.emitEvent !== false) {\n      this.markForCheck();\n    }\n    return definition;\n  }\n\n  removeAt(index: number) {\n    this._helper.removeAt(index);\n    this.clearTemplateCache();\n    this.markForCheck();\n  }\n\n  async setValue(data: PropertyMap | T[], opts?: { emitEvent?: boolean }) {\n    if (!data) return; // Skip\n\n    const [definitions, definitionKeys] = await Promise.all([\n      firstNotNilPromise(this._definitions$, { stop: this.destroySubject }),\n      firstNotNilPromise(this._definitionKeys$, { stop: this.destroySubject }),\n    ]);\n\n    // Transform properties map into array\n    const values = await AppPropertiesUtils.arrayFromObject(data, definitions);\n\n    // Workaround because when autocomplete use mat-select (when mobile), it needs to display the value - fix issue ngx-sumaris-components#16\n    if (this.mobile) {\n      values.forEach((property) => {\n        property.key = (definitionKeys.find((defKey) => defKey.key === property.key) || <Property>{ key: property.key, value: property.key }) as any;\n      });\n    }\n\n    this.clearTemplateCache();\n    this._helper.resize(values.length);\n    this._helper.formArray.patchValue(values, { emitEvent: false });\n\n    if (opts?.emitEvent !== false) {\n      this.markAsPristine();\n      this.markAsLoaded();\n    }\n  }\n\n  getValueAsJson(): PropertyMap {\n    const data = this.value;\n    const json = AppPropertiesUtils.arrayAsObject(data, this.definitions, {\n      omitNilOrBlank: this.options?.allowDuplicatedValues !== true,\n    });\n    console.debug('[app-properties-form] Converting data as object', data, json);\n    return json;\n  }\n\n  clear() {\n    if (this._helper.formArray.length) {\n      this._helper.resize(0);\n    }\n    this.clearTemplateCache();\n    this.markForCheck();\n  }\n\n  /* -- protected methods -- */\n\n  protected toggleShowHintKeys() {\n    this.showHintKey = !this.showHintKey;\n    this.markForCheck();\n  }\n\n  protected clearTemplateCache() {\n    this._definitionsByIndex = {}; // clear map by index\n  }\n\n  protected async suggestDefinitionKeys(\n    value: any,\n    filter?: any,\n    sortBy?: string | keyof Property,\n    sortDirection?: SortDirection,\n    opts?: {\n      offset?: number;\n      size?: number;\n      [key: string]: any;\n    }\n  ): Promise<LoadResult<Property>> {\n    let items = await firstNotNilPromise(this._definitionKeys$, { stop: this.destroySubject });\n\n    // DEBUG\n    if (this.debug) console.debug('[app-properties-form] Suggesting definition keys', value, items);\n\n    // Get as key\n    if (typeof value === 'string' && !RegExpUtils.hasWildcardCharacter(value)) {\n      const obj = items.find((o) => o.key === value);\n      if (obj) return { data: [obj] } as LoadResult<Property>;\n    }\n\n    // Get as object\n    if (value && typeof value === 'object') {\n      return { data: [value] } as LoadResult<Property>;\n    }\n\n    // Remove already used keys\n    if (this.options?.allowDuplicatedValues !== true) {\n      const existingKeys = (this.formArray.value || [])\n        .filter((_, index) => index !== this._focusedControlIndex)\n        .map(AppPropertyUtils.getPropertyKey);\n      items = items.filter((item) => !existingKeys.includes(item.key));\n    }\n\n    value = value ?? '*';\n\n    // Any match\n    if (!value.startsWith('*')) value = '*' + value;\n\n    return suggestFromArray(items, value, { searchAttribute: 'value', ...filter }, sortBy, sortDirection, opts);\n  }\n\n  protected async exportToCsv(label: string = '') {\n    if (this.loading) return; // skip\n    const properties = await AppPropertiesUtils.arrayFromObject<any>(this.getValueAsJson());\n    this._propertiesFileService.exportToCsv(properties, { context: { label } });\n  }\n\n  protected async importFromCsv(event?: Event) {\n    if (!this.enabled || this.loading) return; // skip\n\n    this.markAsLoading();\n\n    try {\n      const existingProperties = this.getValueAsJson();\n      const importedProperties = AppPropertiesUtils.arrayAsObject(await this._propertiesFileService.importFromCsv(event));\n      let mergedProperties: PropertyMap = {};\n\n      switch (this.importPolicy) {\n        case 'insert-update':\n          // Use imported properties first, and remove old\n          mergedProperties = { ...existingProperties, ...importedProperties };\n          break;\n        case 'insert-only':\n          // Prefer existing properties, then insert new\n          mergedProperties = { ...importedProperties, ...existingProperties };\n          break;\n        case 'update-only': {\n          const importKeys = Object.keys(importedProperties);\n          mergedProperties = Object.keys(existingProperties).reduce(\n            (res, key) => {\n              if (importKeys.includes(key)) {\n                res[key] = importedProperties[key];\n              }\n              return res;\n            },\n            <PropertyMap>{ ...existingProperties }\n          );\n          break;\n        }\n      }\n\n      await this.setValue(mergedProperties, { emitEvent: false });\n      this.markAsDirty();\n    } catch (err) {\n      this.setError(err);\n    } finally {\n      this.markAsLoaded();\n    }\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected isEmptyProperty(obj: Property): boolean {\n    return isNil(obj?.key) || isNil(obj.value);\n  }\n}\n","@if (showToolbar) {\n  <mat-toolbar>\n    <div class=\"toolbar-spacer\"></div>\n\n    <ion-item lines=\"none\" (click)=\"toggleShowHintKeys()\">\n      <ion-label color=\"dark\">{{ 'FILE.PROPERTIES.BTN_SHOW_HINT_KEY' | translate }}</ion-label>\n      <ion-toggle color=\"primary\" [checked]=\"showHintKey\"></ion-toggle>\n    </ion-item>\n\n    <!-- options sub menu -->\n    @if (canDownload || canImport) {\n      <button\n        slot=\"end\"\n        mat-icon-button\n        [matMenuTriggerFor]=\"optionsMenu\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_OPTIONS' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_OPTIONS' | translate) : ''\"\n      >\n        <mat-icon>more_vert</mat-icon>\n      </button>\n    }\n  </mat-toolbar>\n}\n\n<!-- Options menu -->\n<mat-menu #optionsMenu=\"matMenu\">\n  <!-- Download as CSV -->\n  @if (canDownload) {\n    <button mat-menu-item [disabled]=\"loading\" [matMenuTriggerFor]=\"downloadMenu\">\n      <mat-icon>download</mat-icon>\n      <ion-label translate>COMMON.BTN_DOWNLOAD_DOTS</ion-label>\n    </button>\n  }\n\n  <!-- Import from file -->\n  @if (canImport) {\n    <button mat-menu-item [disabled]=\"loading || disabled\" [matMenuTriggerFor]=\"importMenu\">\n      <mat-icon>upload</mat-icon>\n      <ion-label translate>COMMON.BTN_IMPORT_FROM_FILE_DOTS</ion-label>\n    </button>\n  }\n</mat-menu>\n\n<!-- Download menu -->\n<mat-menu #downloadMenu=\"matMenu\">\n  <button mat-menu-item [disabled]=\"loading\" (click)=\"exportToCsv()\">\n    <ion-label translate>FILE.PROPERTIES.BTN_DOWNLOAD_AS_CSV</ion-label>\n  </button>\n</mat-menu>\n\n<!-- Import menu -->\n<mat-menu #importMenu=\"matMenu\">\n  <!-- import from file -->\n  <button mat-menu-item (click)=\"importFromCsv($event)\">\n    <ion-label translate>FILE.PROPERTIES.BTN_IMPORT_FROM_CSV</ion-label>\n  </button>\n\n  <!-- import policy -->\n  <mat-divider></mat-divider>\n  <button mat-menu-item [matMenuTriggerFor]=\"importPolicyMenu\">\n    <ion-label translate>FILE.UPLOAD.BTN_IMPORT_POLICY_DOTS</ion-label>\n  </button>\n</mat-menu>\n\n<!-- Import policy menu -->\n<mat-menu #importPolicyMenu=\"matMenu\" class=\"ion-no-padding\">\n  <ng-template matMenuContent>\n    <!-- header-->\n    <ion-row class=\"mat-menu-header ion-no-padding column\">\n      <ion-col>\n        <ion-label translate>FILE.UPLOAD.IMPORT_POLICY.TITLE</ion-label>\n      </ion-col>\n    </ion-row>\n    @for (policy of _importPolicies; track policy) {\n      <button mat-menu-item (click)=\"importPolicy = policy\">\n        <mat-icon>{{ importPolicy === policy ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n        <ion-label>{{ 'FILE.UPLOAD.IMPORT_POLICY.' + policy | uppercase | translate }}</ion-label>\n      </button>\n    }\n  </ng-template>\n</mat-menu>\n\n<!-- Properties -->\n<form [formGroup]=\"form\" class=\"form-container\">\n  @if (loadingSubject | async) {\n    <ion-list [inset]=\"mobile\">\n      <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n      <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n      <ng-container *ngTemplateOutlet=\"propertyRowSkeleton\"></ng-container>\n    </ion-list>\n  } @else {\n    <ion-list formArrayName=\"properties\" [inset]=\"mobile\">\n      <!-- Show more options -->\n      @if ((_definitionKeys$ | async | isNotEmptyArray) && formArray?.length === 0) {\n        <ion-item lines=\"none\">\n          <ion-button\n            color=\"light\"\n            [title]=\"!showTooltip ? (addButtonTitle | translate) : ''\"\n            [matTooltip]=\"showTooltip ? (addButtonTitle | translate) : ''\"\n            (click)=\"_helper.add()\"\n          >\n            <ion-label>{{ addButtonText | translate }}</ion-label>\n            <mat-icon slot=\"end\">arrow_drop_down</mat-icon>\n          </ion-button>\n        </ion-item>\n      }\n\n      @for (fieldForm of fieldForms; track i; let i = $index) {\n        <ion-item lines=\"none\" [class.outline]=\"appearance === 'outline'\">\n          <ion-grid class=\"ion-no-padding\">\n            <ion-row [formGroupName]=\"i\" class=\"ion-no-padding\">\n              @let definition = getDefinitionAt(i);\n\n              <!-- property key -->\n              @if (fieldForm | formGetControl: 'key'; as control) {\n                <ion-col\n                  size=\"12\"\n                  size-sm=\"6\"\n                  [title]=\"!showTooltip ? ((definition | propertyGet: 'label' | translate) || '') : ''\"\n                  [matTooltip]=\"showTooltip ? ((definition | propertyGet: 'label' | translate) || '') : ''\"\n                  class=\"ion-no-padding\"\n                >\n                  <mat-autocomplete-field\n                    floatLabel=\"auto\"\n                    [formControl]=\"control\"\n                    [appearance]=\"appearance\"\n                    [subscriptSizing]=\"showHintKey ? 'fixed' : subscriptSizing\"\n                    (selectionChange)=\"updateDefinitionAt(i)\"\n                    [tabindex]=\"tabindex + i * 2\"\n                    [config]=\"_autocompleteConfig\"\n                    [placeholder]=\"'SETTINGS.PROPERTY_KEY' | translate\"\n                    [required]=\"true\"\n                    (focus)=\"_focusedControlIndex = i\"\n                    [readonly]=\"definition?.disabled\"\n                    [mobile]=\"mobile\"\n                    [panelClass]=\"panelClass\"\n                    [panelWidth]=\"panelWidth\"\n                  >\n                    <mat-hint [class.cdk-visually-hidden]=\"!showHintKey\">\n                      @let keyValue = control.value;\n                      {{ hintKeyPrefix || '' }}{{ keyValue?.key || keyValue || '' }}\n                    </mat-hint>\n                  </mat-autocomplete-field>\n                </ion-col>\n              }\n\n              <!-- property value -->\n              <ion-col size=\"\" size-sm=\"\" class=\"ion-no-padding ion-padding-start-xs\">\n                @if (definition) {\n                  <app-form-field\n                    floatLabel=\"auto\"\n                    [label]=\"mobile ? ('SETTINGS.PROPERTY_VALUE' | translate) : ' '\"\n                    [appearance]=\"appearance\"\n                    [subscriptSizing]=\"subscriptSizing\"\n                    [definition]=\"definition\"\n                    [formControl]=\"fieldForm | formGetControl: 'value'\"\n                    [placeholder]=\"'SETTINGS.PROPERTY_VALUE' | translate\"\n                    [chipColor]=\"chipColor\"\n                    [required]=\"true\"\n                    [hideRequiredMarker]=\"true\"\n                    [tabindex]=\"tabindex + i * 2 + 1\"\n                    [readonly]=\"definition?.disabled\"\n                    [panelClass]=\"panelClass\"\n                    [panelWidth]=\"panelWidth\"\n                  ></app-form-field>\n                } @else {\n                  <!-- unknown definition -->\n                  <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"subscriptSizing\">\n                    @if (mobile) {\n                      <mat-label>{{ 'SETTINGS.PROPERTY_VALUE' | translate }}</mat-label>\n                    }\n                    <input\n                      type=\"text\"\n                      matInput\n                      [formControl]=\"fieldForm | formGetControl: 'value'\"\n                      [placeholder]=\"mobile ? '' : ('SETTINGS.PROPERTY_VALUE' | translate)\"\n                      [required]=\"true\"\n                      [tabindex]=\"20 + i * 2 + 1\"\n                    />\n                  </mat-form-field>\n                }\n              </ion-col>\n\n              <ion-col size=\"auto\" class=\"ion-no-padding\">\n                @if (_helper.isLast(i)) {\n                  <button\n                    type=\"button\"\n                    mat-icon-button\n                    color=\"light\"\n                    [disabled]=\"\n                      disabled || (fieldForm.value | asBoolean: isEmptyProperty) || (_definitionKeys | isEmptyArray)\n                    \"\n                    [title]=\"!showTooltip ? ('SETTINGS.BTN_ADD_PROPERTY' | translate) : ''\"\n                    [matTooltip]=\"showTooltip ? ('SETTINGS.BTN_ADD_PROPERTY' | translate) : ''\"\n                    (click)=\"_helper.add()\"\n                    [tabindex]=\"20 + i * 2 + 2\"\n                  >\n                    <mat-icon>add</mat-icon>\n                  </button>\n                }\n                <button\n                  type=\"button\"\n                  mat-icon-button\n                  color=\"light\"\n                  [disabled]=\"definition?.disabled || disabled\"\n                  [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n                  [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n                  (click)=\"removeAt(i)\"\n                  [tabindex]=\"-1\"\n                >\n                  <mat-icon>close</mat-icon>\n                </button>\n              </ion-col>\n            </ion-row>\n          </ion-grid>\n        </ion-item>\n      }\n    </ion-list>\n  }\n</form>\n\n<ng-template #propertyRowSkeleton>\n  <ion-item lines=\"none\">\n    <ion-grid class=\"ion-no-padding\">\n      <ion-row class=\"ion-no-padding\">\n        <!-- property key -->\n        <ion-col size=\"6\" class=\"ion-no-padding\">\n          <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n            <input matInput hidden disabled />\n            <ion-skeleton-text [animated]=\"true\" style=\"width: 60%\"></ion-skeleton-text>\n            <ion-icon name=\"arrow-dropdown\" matSuffix></ion-icon>\n          </mat-form-field>\n        </ion-col>\n        <!-- value -->\n        <ion-col class=\"ion-no-padding\">\n          <mat-form-field [subscriptSizing]=\"subscriptSizing\">\n            <input matInput hidden disabled />\n            <ion-skeleton-text [animated]=\"true\" style=\"width: 60%\"></ion-skeleton-text>\n          </mat-form-field>\n        </ion-col>\n        <!-- buttons -->\n        <ion-col size=\"auto\">\n          <button type=\"button\" mat-icon-button color=\"light\" disabled>\n            <mat-icon>close</mat-icon>\n          </button>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </ion-item>\n</ng-template>\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  HostListener,\n  inject,\n  Inject,\n  InjectionToken,\n  Injector,\n  OnDestroy,\n  OnInit,\n  Optional,\n  ViewChild,\n} from '@angular/core';\nimport { AccountService } from '../services/account.service';\nimport { APP_LOCALES, LocaleConfig, LocalSettings, UsageMode } from '../services/model/settings.model';\nimport { Peer } from '../services/model/peer.model';\nimport { UntypedFormArray, UntypedFormBuilder, UntypedFormControl } from '@angular/forms';\nimport { AppForm } from '../form/form.class';\nimport { AppFormUtils, CanLeave } from '../form/form.utils';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ValidatorService } from '@e-is/ngx-material-table';\nimport { LocalSettingsValidatorService } from '../services/validator/local-settings.validator';\nimport { PlatformService } from '../services/platform.service';\nimport { NetworkService } from '../services/network.service';\nimport { isNilOrBlank, isNotNilOrBlank, removeDuplicatesFromArray, toBoolean } from '../../shared/functions';\nimport { LocalSettingsService } from '../services/local-settings.service';\nimport { FormFieldDefinition } from '../../shared/form/field.model';\nimport { merge } from 'rxjs';\nimport { AlertController, NavController } from '@ionic/angular';\nimport { Alerts } from '../../shared/alerts';\nimport { ISelectPeerModalOptions } from '../peer/select-peer.modal';\nimport { IMenuItem } from '../menu/menu.model';\n\nimport { AppPropertiesForm } from '../form/properties/properties.form';\nimport { UserProfileLabel } from '../services/model/person.model';\n\nimport { APP_SHOW_TOOLTIP } from '../../shared/constants';\n\nexport const APP_SETTINGS_MENU_ITEMS = new InjectionToken<IMenuItem[]>('settingsMenuItems');\n\n@Component({\n  selector: 'page-settings',\n  templateUrl: 'settings.page.html',\n  providers: [{ provide: ValidatorService, useExisting: LocalSettingsValidatorService }],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SettingsPage extends AppForm<LocalSettings> implements OnInit, OnDestroy, CanLeave {\n  private data: LocalSettings;\n\n  protected mobile: boolean;\n  protected isAdmin: boolean;\n  protected saving = false;\n  protected usageModes: UsageMode[] = ['FIELD', 'DESK'];\n  protected menuItems: IMenuItem[];\n  protected showOptionKeys = false;\n\n  protected propertyDefinitions: FormFieldDefinition[];\n\n  protected latLongFormats = ['DDMMSS', 'DDMM', 'DD'];\n\n  get accountInheritance(): boolean {\n    return this.form.controls['accountInheritance'].value;\n  }\n\n  get isLogin(): boolean {\n    return this.accountService.isLogin();\n  }\n\n  get propertiesFormArray(): UntypedFormArray {\n    return this.form.get('properties') as UntypedFormArray;\n  }\n\n  get darkMode(): boolean {\n    return this.form.controls['darkMode'].value;\n  }\n\n  set darkMode(value: boolean) {\n    this.form.controls['darkMode'].setValue(value);\n  }\n\n  @ViewChild('propertiesForm', { static: true }) propertiesForm: AppPropertiesForm;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    injector: Injector,\n    protected platform: PlatformService,\n    protected navController: NavController,\n    protected validatorService: LocalSettingsValidatorService,\n    protected alertCtrl: AlertController,\n    protected translate: TranslateService,\n    protected formBuilder: UntypedFormBuilder,\n    protected accountService: AccountService,\n    protected settings: LocalSettingsService,\n    protected cd: ChangeDetectorRef,\n    public network: NetworkService,\n    @Inject(APP_LOCALES) public locales: LocaleConfig[],\n    @Optional() @Inject(APP_SETTINGS_MENU_ITEMS) menuItems?: IMenuItem[]\n  ) {\n    super(injector, validatorService.getFormGroup());\n\n    this.menuItems = menuItems || [];\n    this.mobile = this.platform.mobile;\n\n    // By default, disable the form\n    this._enabled = false;\n  }\n\n  async ngOnInit() {\n    super.ngOnInit();\n\n    // Make sure account/settings are ready\n    await Promise.all([this.settings.ready(), this.accountService.ready()]);\n    this.isAdmin = this.accountService.isAdmin();\n\n    // Load options definitions\n    this.loadPropertyDefinitions();\n\n    // Load settings\n    await this.load();\n\n    this.registerSubscription(\n      merge(this.accountService.onLogin, this.accountService.onLogout).subscribe(() => {\n        this.setAccountInheritance(this.accountInheritance);\n\n        // Reload options definitions\n        this.loadPropertyDefinitions();\n      })\n    );\n  }\n\n  protected loadPropertyDefinitions() {\n    let definitions = [\n      // Add account field (BEFORE local settings, because of removeDuplicatesFromArray() - see bellow)\n      ...this.accountService.optionDefs.map(\n        (def) =>\n          <FormFieldDefinition>{\n            ...def,\n            minProfile: def?.minProfile || <UserProfileLabel>'GUEST',\n          }\n      ),\n      // Add local settings options\n      ...this.settings.optionDefs,\n    ].map((definition) => {\n      // Disabled items that should not be visible\n      if (!definition.disabled && definition.minProfile && !this.accountService.hasMinProfile(definition.minProfile)) {\n        return {\n          ...definition,\n          disabled: true,\n        };\n      }\n      return definition;\n    });\n\n    // Remove duplicated key\n    this.propertyDefinitions = removeDuplicatesFromArray(definitions, 'key');\n\n    if (this.loaded) this.markForCheck();\n  }\n\n  async load() {\n    this.markAsLoading();\n    console.debug('[settings] Loading settings...');\n\n    const data = this.settings.settings;\n\n    // Set defaults\n    data.accountInheritance = toBoolean(data.accountInheritance, true);\n    data.locale = data.locale || this.translate.currentLang || this.translate.defaultLang;\n    data.latLongFormat = data.latLongFormat || 'DDMMSS';\n    data.usageMode = data.usageMode || 'DESK';\n\n    // Set peer\n    if (isNilOrBlank(data.peerUrl)) {\n      await this.network.ready();\n      const peer = this.network.peer;\n      data.peerUrl = peer && peer.url;\n    }\n\n    // Remember data\n    await this.updateView(data);\n  }\n\n  async updateView(data: LocalSettings) {\n    if (!data) return; //skip\n    this.data = data;\n\n    const json = {\n      ...data,\n      properties: undefined,\n    };\n\n    this.form.patchValue(json, { emitEvent: true });\n    this.propertiesForm.setValue(data.properties);\n\n    this.markAsPristine();\n\n    this.enable({ emitEvent: false });\n\n    // Apply inheritance\n    this.setAccountInheritance(data.accountInheritance, { emitEvent: false });\n\n    this.markAsLoaded();\n    this.error = null;\n    this.markForCheck();\n  }\n\n  async save(event?: Event, options?: any): Promise<boolean> {\n    if (this.saving) return; // Skip\n\n    if (event) event.preventDefault();\n\n    if (!this.form.valid) {\n      await AppFormUtils.waitWhilePending(this.form);\n\n      if (this.form.invalid) {\n        AppFormUtils.logFormErrors(this.form);\n        this.form.markAllAsTouched();\n        return;\n      }\n    }\n\n    console.debug('[settings] Saving local settings...');\n\n    this.saving = true;\n    this.error = undefined;\n    this.markForCheck();\n\n    const data = await this.getValue();\n\n    // Check peer alive, before saving\n    const peerChanged = this.form.get('peerUrl').dirty;\n\n    // Clean page history, when peer changed\n    if (peerChanged) data.pageHistory = [];\n\n    try {\n      this.disable();\n\n      await this.settings.apply(data);\n      this.data = data;\n      this.markAsPristine();\n\n      // If peer changed\n      if (peerChanged) {\n        // Restart the network\n        this.network.peer = Peer.parseUrl(data.peerUrl);\n      }\n\n      return true;\n    } catch (err) {\n      console.error(err);\n      this.error = (err && err.message) || err;\n      return false;\n    } finally {\n      this.enable({ emitEvent: false });\n\n      // Apply inheritance\n      this.setAccountInheritance(data.accountInheritance, { emitEvent: false });\n\n      // Add a delay, because of option menu that is always opened after save!!\n      setTimeout(() => {\n        this.saving = false;\n        this.markForCheck();\n      }, 400);\n    }\n  }\n\n  setAccountInheritance(enable: boolean, opts?: { emitEvent?: boolean }) {\n    // Make sure to update the value in control\n    this.form.controls['accountInheritance'].setValue(enable, opts);\n    if (this.data.accountInheritance !== enable) {\n      this.form.controls['accountInheritance'].markAsDirty({ onlySelf: false });\n    }\n\n    if (enable) {\n      if (this.isLogin) {\n        // Force using account settings\n        const account = this.accountService.account;\n\n        // Copy values\n        if (account.settings) {\n          if (account.settings.locale) this.form.get('locale').setValue(account.settings.locale, opts);\n          if (account.settings.latLongFormat) this.form.get('latLongFormat').setValue(account.settings.latLongFormat, opts);\n        }\n        // Disable fields\n        this.form.get('locale').disable(opts);\n        this.form.get('latLongFormat').disable(opts);\n      } else {\n        // Enable fields\n        this.form.get('locale').enable(opts);\n        this.form.get('latLongFormat').enable(opts);\n      }\n    } else {\n      // Restore previous values\n      this.form.get('locale').setValue(this.data.locale, opts);\n      this.form.get('latLongFormat').setValue(this.data.latLongFormat, opts);\n\n      // Enable fields\n      this.form.get('locale').enable(opts);\n      this.form.get('latLongFormat').enable(opts);\n    }\n\n    // Mark for check, if need\n    if (!opts || opts.emitEvent) {\n      this.markForCheck();\n    }\n  }\n\n  async showSelectPeerModal(opts?: Partial<ISelectPeerModalOptions>) {\n    const selectedPeer = this._form.get('peerUrl').value;\n    const peer = await this.network.showSelectPeerModal({\n      showSetManuallyButton: false, // Make no sense here, because same as cancel (already inside the settings page)\n      selectedPeer: isNotNilOrBlank(selectedPeer) ? selectedPeer : null,\n      ...opts,\n    });\n    if (peer?.url) {\n      const control = this.form.get('peerUrl') as UntypedFormControl;\n      control.setValue(peer.url, { emitEvent: true, onlySelf: false });\n      control.markAsDirty({ onlySelf: false });\n      this.markAsDirty();\n    }\n  }\n\n  protected setForceOffline(value: boolean) {\n    this.network.setForceOffline(value);\n    this.form.get('peerUrl').markAsPending(); // Force revalidation\n    this.form.markAsDirty();\n    this.form.updateValueAndValidity();\n    this.form.markAsTouched();\n  }\n\n  async cancel(event?: Event) {\n    await this.load();\n  }\n\n  async close(_?: Event) {\n    if (this.saving) return;\n\n    // Back to home\n    return this.navController.navigateRoot('/'); // back to home\n  }\n\n  async clearCache(event?: Event) {\n    const confirm = await Alerts.askActionConfirmation(this.alertCtrl, this.translate, true, event);\n    if (confirm) {\n      await this.network.clearCache();\n      this.settings.removeOfflineFeatures();\n    }\n  }\n\n  async executeAction(event: Event, item: IMenuItem) {\n    if (!item) return;\n    if (event?.defaultPrevented) return;\n\n    if (item.path) {\n      await this.navController.navigateForward(item.path);\n    } else {\n      console.error('[settings] Unknown item type (no path)', item);\n    }\n  }\n\n  async getValue(): Promise<LocalSettings> {\n    const json = this.form.value;\n\n    // Serialize properties to map (from array)\n    json.properties = this.propertiesForm.getValueAsJson();\n\n    // Override properties from account\n    if (json.accountInheritance && this.isLogin) {\n      const account = this.accountService.account;\n      const userSettings = account && account.settings;\n      console.debug(`[settings] Applying account inheritance {locale: '${userSettings.locale}', latLongFormat: '${userSettings.latLongFormat}'}...`);\n      json.locale = userSettings.locale || json.locale;\n      json.latLongFormat = userSettings.latLongFormat || json.latLongFormat;\n    }\n\n    return json;\n  }\n\n  /* -- protected functions -- */\n\n  markAsLoading() {\n    super.markAsLoading();\n    this.propertiesForm.markAsLoading();\n  }\n\n  markAsLoaded(opts?: { emitEvent?: boolean }) {\n    super.markAsLoaded(opts);\n    this.propertiesForm.markAsLoaded(opts);\n  }\n\n  get loading(): boolean {\n    return super.loading || this.propertiesForm.loading;\n  }\n\n  get loaded(): boolean {\n    return super.loaded || this.propertiesForm.loaded;\n  }\n\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    super.enable(opts);\n    this.propertiesForm.enable(opts);\n  }\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    super.disable(opts);\n    this.propertiesForm.disable(opts);\n  }\n\n  markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    super.markAsPristine(opts);\n    this.propertiesForm.markAsPristine(opts);\n  }\n\n  @HostListener('window:beforeunload', ['$event'])\n  handleRefresh(event: BeforeUnloadEvent): void {\n    // Avoid to quit web browser page, without saving\n    if (!this.mobile && this.dirty) {\n      event.preventDefault();\n    }\n  }\n\n  protected openAccountPage() {\n    return this.navController.navigateForward('account');\n  }\n\n  protected async toggleDarkMode(enable?: boolean) {\n    const oldValue = this.form.get('darkMode').value;\n    enable = toBoolean(enable, !oldValue);\n    console.info('[settings] Changing darkMode=' + enable);\n    this.platform.toggleDarkTheme(enable);\n\n    if (oldValue !== enable) {\n      this.form.get('darkMode').setValue(enable, {\n        emitEvent: false,\n      });\n      // Disable auto dark theme\n      this.form.get('autoDarkMode').setValue(false, {\n        emitEvent: false,\n      });\n    }\n    await this.save();\n  }\n\n  protected toggleShowOptionKeys() {\n    this.showOptionKeys = !this.showOptionKeys;\n    this.markForCheck();\n  }\n\n  protected devToggleDebug() {\n    this.debug = !this.debug;\n    this.markForCheck();\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","@let hasValidate = !loading && (dirty || saving);\n<app-toolbar\n  [title]=\"'SETTINGS.TITLE' | translate\"\n  color=\"primary\"\n  [hasValidate]=\"hasValidate\"\n  [hasClose]=\"!hasValidate\"\n  (onValidate)=\"save($event)\"\n  (onClose)=\"close($event)\"\n>\n  <ion-buttons slot=\"end\">\n    <!-- options menu -->\n    <ion-button [matMenuTriggerFor]=\"optionsMenu\" [disabled]=\"loading || saving\">\n      <mat-icon slot=\"icon-only\">more_vert</mat-icon>\n    </ion-button>\n  </ion-buttons>\n</app-toolbar>\n\n<!-- Options menu -->\n<mat-menu #optionsMenu=\"matMenu\">\n  <!-- Clear cache -->\n  <button mat-menu-item [disabled]=\"saving\" (click)=\"clearCache($event)\">\n    <mat-icon><ion-icon name=\"trash-outline\"></ion-icon></mat-icon>\n    <ion-label translate>SETTINGS.BTN_CLEAR_CACHE</ion-label>\n  </button>\n\n  <!-- Reset -->\n  <button mat-menu-item [disabled]=\"saving || !dirty\" (click)=\"cancel($event)\">\n    <mat-icon><ion-icon name=\"refresh\"></ion-icon></mat-icon>\n    <mat-label translate>COMMON.BTN_RESET</mat-label>\n  </button>\n\n  <!-- additional items -->\n  @if (!loading) {\n    @for (item of menuItems; track item) {\n      @if (item.path) {\n        <a mat-menu-item class=\"{{ item.cssClass }} {{ item.color }}\" (click)=\"executeAction($event, item)\">\n          <mat-icon *ngIf=\"item.icon\"><ion-icon [name]=\"item.icon\"></ion-icon></mat-icon>\n          <mat-icon *ngIf=\"item.matIcon\">{{ item.matIcon }}</mat-icon>\n          <mat-label translate>{{ item.title }}</mat-label>\n        </a>\n      } @else if (!item.action) {\n        <!-- divider -->\n        <mat-divider class=\"{{ item.cssClass }} {{ item.color }}\">\n          <mat-label translate>{{ item.title }}</mat-label>\n        </mat-divider>\n      }\n    }\n  }\n\n  <!-- debug -->\n  @if (isAdmin) {\n    <mat-divider></mat-divider>\n\n    <button\n      mat-menu-item\n      #menuTrigger=\"matMenuTrigger\"\n      (mouseenter)=\"menuTrigger.openMenu()\"\n      [matMenuTriggerFor]=\"debugMenu\"\n    >\n      <mat-icon><ion-icon name=\"bug\"></ion-icon></mat-icon>\n      <ion-label translate>COMMON.DEBUG.BTN_DEBUG_DOTS</ion-label>\n    </button>\n\n    <mat-menu #debugMenu=\"matMenu\">\n      <!-- enable debug -->\n      <button mat-menu-item (click)=\"devToggleDebug()\">\n        <mat-icon>{{ debug ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n        <mat-label translate>COMMON.DEBUG.BTN_ENABLE_DEBUG</mat-label>\n      </button>\n\n      <!-- show option key-->\n      <button mat-menu-item (click)=\"toggleShowOptionKeys()\">\n        <mat-icon>{{ showOptionKeys ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n        <mat-label translate>SETTINGS.BTN_SHOW_OPTION_KEY</mat-label>\n      </button>\n    </mat-menu>\n  }\n</mat-menu>\n\n<ion-content>\n  <form [formGroup]=\"form\" novalidate (ngSubmit)=\"save($event)\" class=\"form-container\">\n    <ion-grid class=\"ion-no-padding\">\n      <ion-row>\n        <!-- left  margin -->\n        <ion-col size=\"0\" size-lg=\"1\" size-xl=\"2\">&nbsp;</ion-col>\n\n        <ion-col class=\"ion-padding\">\n          <!-- error -->\n          <ion-item *ngIf=\"errorSubject | async; let error\" lines=\"none\">\n            <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n            <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n          </ion-item>\n\n          <ion-list-header class=\"hidden-xs hidden-xxs\" translate>SETTINGS.DESCRIPTION</ion-list-header>\n\n          <ion-list [inset]=\"mobile\" [class.cdk-visually-hidden]=\"!isLogin\">\n            <ion-item lines=\"none\">\n              <!-- account inheritance (desktop) -->\n              @if (!mobile) {\n                <mat-form-field>\n                  <input matInput hidden formControlName=\"accountInheritance\" type=\"text\" />\n\n                  <!-- check box (if desktop) -->\n                  <mat-checkbox (change)=\"setAccountInheritance($event.checked)\" [checked]=\"accountInheritance\">\n                    <span translate>SETTINGS.INHERIT_FROM_ACCOUNT</span>\n                  </mat-checkbox>\n\n                  <mat-error *ngIf=\"form.controls.accountInheritance.hasError('required')\" translate>\n                    ERROR.FIELD_REQUIRED\n                  </mat-error>\n                </mat-form-field>\n              } @else {\n                <!-- account inheritance (if mobile) -->\n                <mat-form-field>\n                  <input matInput hidden formControlName=\"accountInheritance\" type=\"text\" />\n\n                  <!-- slide toggle  -->\n                  <ion-text translate>SETTINGS.INHERIT_FROM_ACCOUNT</ion-text>\n                  <mat-slide-toggle\n                    matSuffix\n                    (change)=\"setAccountInheritance($event.checked)\"\n                    [checked]=\"accountInheritance\"\n                  ></mat-slide-toggle>\n                  <mat-error *ngIf=\"form.controls.accountInheritance.hasError('required')\" translate>\n                    ERROR.FIELD_REQUIRED\n                  </mat-error>\n                </mat-form-field>\n              }\n            </ion-item>\n\n            <!-- help on account -->\n            @if (accountInheritance) {\n              <ion-item [button]=\"true\" lines=\"none\" (click)=\"openAccountPage()\">\n                @if (!mobile) {\n                  <ion-icon slot=\"start\" name=\"help-circle-outline\"></ion-icon>\n                }\n                <ion-label>\n                  <small [innerHTML]=\"'SETTINGS.INHERIT_FROM_ACCOUNT_HELP' | translate\"></small>\n                </ion-label>\n                <ion-text color=\"tertiary\" translate>SETTINGS.BTN_SHOW_ACCOUNT</ion-text>\n                <ion-icon slot=\"end\" color=\"tertiary\" name=\"chevron-forward\"></ion-icon>\n              </ion-item>\n            }\n          </ion-list>\n\n          <ion-list-header><h3 translate>SETTINGS.DISPLAY_DIVIDER</h3></ion-list-header>\n\n          <ion-list [inset]=\"mobile\">\n            <!-- locale -->\n            <ion-item lines=\"none\">\n              <mat-form-field>\n                <ion-icon matPrefix name=\"language\"></ion-icon>\n                <mat-label>{{ 'SETTINGS.LOCALE' | translate }}</mat-label>\n                <mat-select formControlName=\"locale\" required>\n                  <mat-option *ngFor=\"let item of locales\" [value]=\"item.key\">\n                    {{ item.value }}\n                  </mat-option>\n                </mat-select>\n                <mat-error *ngIf=\"form.controls.locale.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n              </mat-form-field>\n            </ion-item>\n\n            <!-- dark mode (if allow by the environment token) -->\n            @if (settings.allowDarkMode) {\n              <ion-item lines=\"none\">\n                <mat-form-field>\n                  <ion-icon matPrefix name=\"moon\"></ion-icon>\n\n                  <input matInput hidden formControlName=\"darkMode\" type=\"text\" />\n\n                  <!-- slide toggle  -->\n                  <ion-text translate>SETTINGS.BTN_DARK_MODE</ion-text>\n                  <mat-slide-toggle\n                    matSuffix\n                    (change)=\"toggleDarkMode($event.checked)\"\n                    [checked]=\"darkMode\"\n                  ></mat-slide-toggle>\n                </mat-form-field>\n              </ion-item>\n            }\n          </ion-list>\n\n          <!-- Network entry -->\n          <ion-list-header><h3 translate>SETTINGS.NETWORK_DIVIDER</h3></ion-list-header>\n\n          <ion-list [inset]=\"mobile\">\n            <!-- Peer address -->\n            <ion-item lines=\"none\">\n              <mat-form-field>\n                <ion-icon matPrefix name=\"cloud\"></ion-icon>\n\n                <mat-label>{{ 'SETTINGS.PEER_URL' | translate }}</mat-label>\n                <input matInput type=\"text\" formControlName=\"peerUrl\" required />\n\n                <button\n                  mat-icon-button\n                  type=\"button\"\n                  matSuffix\n                  (click)=\"showSelectPeerModal()\"\n                  tabindex=\"-1\"\n                  [title]=\"!showTooltip ? ('SETTINGS.BTN_CHANGE_PEER' | translate) : ''\"\n                  [matTooltip]=\"showTooltip ? ('SETTINGS.BTN_CHANGE_PEER' | translate) : ''\"\n                >\n                  <mat-icon>search</mat-icon>\n                </button>\n\n                <mat-error *ngIf=\"form.controls.peerUrl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n                <mat-error *ngIf=\"form.controls.peerUrl.hasError('peerAlive')\" translate>\n                  SETTINGS.ERROR.PEER_NOT_REACHABLE\n                </mat-error>\n                <mat-error *ngIf=\"form.controls.peerUrl.hasError('peerNotCompatible')\" translate>\n                  SETTINGS.ERROR.PEER_NOT_COMPATIBLE\n                </mat-error>\n              </mat-form-field>\n            </ion-item>\n\n            <!-- Offline mode (if mobile) -->\n            @if (mobile) {\n              <ion-item lines=\"none\">\n                <mat-form-field>\n                  <input matInput hidden formControlName=\"accountInheritance\" type=\"text\" />\n\n                  <!-- slide toggle  -->\n                  <ion-text translate>SETTINGS.OFFLINE_MODE</ion-text>\n                  <mat-slide-toggle\n                    matSuffix\n                    (change)=\"setForceOffline($event.checked)\"\n                    [checked]=\"network.offline\"\n                  ></mat-slide-toggle>\n                </mat-form-field>\n              </ion-item>\n            }\n          </ion-list>\n\n          <!-- Data entry -->\n          <ion-list-header>\n            <h3 translate>SETTINGS.DATA_ENTRY_DIVIDER</h3>\n          </ion-list-header>\n\n          <ion-list [inset]=\"mobile\">\n            <!-- Usage mode -->\n            <ion-item lines=\"none\">\n              <mat-form-field>\n                <ion-icon matPrefix name=\"id-card\"></ion-icon>\n                <mat-label>{{ 'SETTINGS.USAGE_MODE' | translate }}</mat-label>\n                <mat-select formControlName=\"usageMode\" required>\n                  <mat-option *ngFor=\"let item of usageModes\" [value]=\"item\">\n                    {{ 'SETTINGS.USAGE_MODES.' + item | translate }}\n                  </mat-option>\n                </mat-select>\n                <mat-error *ngIf=\"form.controls.usageMode.hasError('required')\" translate>\n                  ERROR.FIELD_REQUIRED\n                </mat-error>\n              </mat-form-field>\n            </ion-item>\n\n            <!-- lat/long format-->\n            <ion-item lines=\"none\">\n              <mat-form-field>\n                <ion-icon matPrefix name=\"locate\"></ion-icon>\n                <mat-label>{{ 'SETTINGS.LAT_LONG_FORMAT' | translate }}</mat-label>\n                <mat-select formControlName=\"latLongFormat\" required>\n                  <mat-option *ngFor=\"let item of latLongFormats\" [value]=\"item\">\n                    {{ 'COMMON.LAT_LONG.ENUM.' + item | uppercase | translate }}\n                  </mat-option>\n                </mat-select>\n                <mat-error *ngIf=\"form.controls.latLongFormat.hasError('required')\" translate>\n                  ERROR.FIELD_REQUIRED\n                </mat-error>\n              </mat-form-field>\n            </ion-item>\n          </ion-list>\n\n          <!-- fields options -->\n          <app-properties-form\n            #propertiesForm\n            formArrayName=\"properties\"\n            [definitions]=\"propertyDefinitions\"\n            [options]=\"{ allowEmptyArray: true }\"\n            [mobile]=\"mobile\"\n            [showHintKey]=\"showOptionKeys\"\n            addButtonText=\"COMMON.BTN_SHOW_MORE\"\n            addButtonTitle=\"SETTINGS.BTN_SHOW_MORE_HELP\"\n            [debug]=\"debug\"\n          ></app-properties-form>\n        </ion-col>\n\n        <!-- right margin -->\n        <ion-col size=\"0\" size-lg=\"1\" size-xl=\"2\">&nbsp;</ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <app-form-buttons-bar\n    (onCancel)=\"cancel()\"\n    (onSave)=\"save($event)\"\n    [disabled]=\"!form.dirty || saving\"\n  ></app-form-buttons-bar>\n</ion-footer>\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { FormButtonsBarComponent } from './form-buttons-bar.component';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild()],\n\n  declarations: [\n    // Components\n    FormButtonsBarComponent,\n  ],\n  exports: [\n    TranslateModule,\n\n    // Components\n    FormButtonsBarComponent,\n  ],\n})\nexport class AppFormButtonsBarModule {}\n","import { AppTable } from './table.class';\nimport { TableElement } from '@e-is/ngx-material-table';\nimport { AppFormUtils } from '../form/form.utils';\nimport { AsyncTableElement } from '@e-is/ngx-material-table/src/app/ngx-material-table/async/async-table-element';\nimport { EntityUtils, IEntity } from '../services/model/entity.model';\nimport { isNotNil } from '../../shared/functions';\nimport { SortDirection } from '@angular/material/sort';\n\nexport class AppTableUtils {\n  static waitIdle(table: AppTable<any, any, any>): Promise<any> {\n    if (!table || !table.dataSource) {\n      throw new Error('Invalid table. Missing table or table.dataSource');\n    }\n    return table.dataSource.waitIdle();\n  }\n\n  static logRowErrors(row: TableElement<any> | AsyncTableElement<any>, logPrefix?: string): void {\n    AppFormUtils.logFormErrors(row.validator, logPrefix);\n  }\n\n  static getEntityId<T extends IEntity<T, ID> = IEntity<any, any>, ID = any>(row: TableElement<T> | AsyncTableElement<T>): ID {\n    // When using validator: use the control (avoid to load the full form's value)\n    if (row.validator) return row.validator.get('id').value as ID;\n    return EntityUtils.getId(row.currentData);\n  }\n\n  static getEntityIds<T extends IEntity<T, ID> = IEntity<any, any>, ID = any>(rows: TableElement<T>[] | AsyncTableElement<T>[]): ID[] {\n    return (rows || [])\n      .map((row) => row.currentData)\n      .filter(isNotNil)\n      .map(EntityUtils.getId)\n      .filter(isNotNil);\n  }\n\n  static getEntities<T extends IEntity<T, ID> = IEntity<any, any>, ID = any>(rows: TableElement<T>[] | AsyncTableElement<T>[]): T[] {\n    return (rows || []).map((row) => row.currentData).filter(isNotNil);\n  }\n\n  static inverseDirection(direction: SortDirection): SortDirection {\n    return direction === 'asc' ? 'desc' : 'asc';\n  }\n}\n","import { TableDataSource, TableDataSourceConfig, TableElement, ValidatorService } from '@e-is/ngx-material-table';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { IEntity } from '../services/model/entity.model';\nimport { ErrorCodes } from '../services/errors';\nimport { catchError, debounceTime, filter, map, takeUntil } from 'rxjs/operators';\nimport { Directive, OnDestroy } from '@angular/core';\nimport { SortDirection } from '@angular/material/sort';\nimport { CollectionViewer } from '@angular/cdk/collections';\nimport { EntitiesServiceWatchOptions, FetchMoreFn, IEntitiesService, LoadResult } from '../../shared/services/entity-service.class';\nimport { firstFalsePromise, FirstOptions } from '../../shared/observables';\nimport { isEmptyArray, isNotEmptyArray, removeEnd, sleep } from '../../shared/functions';\nimport { AppTableUtils } from './table.utils';\nimport { environment } from '../../../environments/environment';\nimport { IEntitiesTableDataSource } from './table.model';\n\nexport interface EntitiesTableDataSourceConfig<\n  T extends IEntity<T, ID>,\n  ID = number,\n  WO extends EntitiesServiceWatchOptions = EntitiesServiceWatchOptions,\n  SO = any,\n> extends TableDataSourceConfig {\n  onRowCreated?: (row: TableElement<T>) => Promise<void> | void;\n  saveOnlyDirtyRows?: boolean; // False by default\n  saveBeforeDelete?: boolean; // False by default\n  readOnly?: boolean;\n\n  /**\n   * @deprecated\n   */\n  dataServiceOptions?: WO & SO; // Options passed to the dataService.watchAll() and dataService.saveAll()\n\n  watchAllOptions?: WO; // Options passed to the dataService.saveAll()\n  saveAllOptions?: SO; // Options passed to the dataService.saveAll()\n\n  [key: string]: any;\n}\n\n// @dynamic\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class EntitiesTableDataSource<\n    T extends IEntity<T, ID>,\n    F = any,\n    ID = number,\n    WO extends EntitiesServiceWatchOptions = EntitiesServiceWatchOptions,\n    SO = any,\n    V extends ValidatorService = ValidatorService,\n    C extends EntitiesTableDataSourceConfig<T, ID, WO, SO> = EntitiesTableDataSourceConfig<T, ID, WO, SO>,\n    R extends TableElement<T> = TableElement<T>,\n  >\n  extends TableDataSource<T, V, C, R>\n  implements IEntitiesTableDataSource<R>, OnDestroy\n{\n  private readonly _entityName: string;\n\n  protected _debug = false;\n  protected _creating = false;\n  protected _fetchMoreFn: FetchMoreFn<LoadResult<T>> = null;\n  protected _waitingNetworkResult: boolean;\n  protected _stopWatchSubject = new Subject<void>();\n\n  loadingSubject = new BehaviorSubject<boolean>(undefined);\n  savingSubject = new BehaviorSubject<boolean>(false);\n\n  get watchAllOptions(): WO {\n    return this.config.watchAllOptions;\n  }\n\n  set watchAllOptions(value: WO) {\n    this.config.watchAllOptions = value;\n  }\n\n  get saveAllOptions(): SO {\n    return this.config.saveAllOptions;\n  }\n\n  set saveAllOptions(value: SO) {\n    this.config.saveAllOptions = value;\n  }\n\n  get loaded(): boolean {\n    return this.loadingSubject.getValue() === false; // Should be false when undefined (initial state)\n  }\n\n  get loading(): boolean {\n    return this.loadingSubject.getValue() !== false; // Should be true when undefined (initial state)\n  }\n\n  get saving(): boolean {\n    return this.savingSubject.getValue();\n  }\n\n  /**\n   * Creates a new TableDataSource instance, that can be used as datasource of `@angular/cdk` data-table.\n   *\n   * @param dataService A service to load and save data\n   * @param dataType Type of data contained by the Table. If not specified, then `data` with at least one element must be specified.\n   * @param validatorService Service that create instances of the FormGroup used to validate row fields.\n   * @param options Additional options\n   */\n  constructor(\n    dataType: new () => T,\n    public readonly dataService: IEntitiesService<T, F, WO>,\n    validatorService?: V,\n    options?: C\n  ) {\n    super([], dataType, validatorService, {\n      keepOriginalDataAfterConfirm: false,\n      readOnly: false,\n      saveOnlyDirtyRows: false,\n      saveBeforeDelete: false, // For v1 compatibility\n      ...options,\n    });\n\n    this._entityName = removeEnd(new dataType().__typename || 'UnknownVO', 'VO');\n    this._debug = options?.suppressErrors === false && !environment.production;\n  }\n\n  ngOnDestroy() {\n    this.disconnect();\n  }\n\n  watchAll(offset: number, size: number, sortBy?: string, sortDirection?: SortDirection, filter?: Partial<F>): Observable<LoadResult<T>> {\n    this._stopWatchSubject.next();\n    this._fetchMoreFn = null;\n    this.markAsLoading();\n    this._waitingNetworkResult = (this.watchAllOptions?.fetchPolicy || this.dataService?.defaultFetchPolicy) === 'cache-and-network';\n\n    return this.dataService.watchAll(offset, size, sortBy, sortDirection, filter, this.watchAllOptions).pipe(\n      catchError((err) => this.handleError(err, 'ERROR.LOAD_DATA_ERROR')),\n      map((res: LoadResult<T>) => {\n        if (this.saving) {\n          console.info(`[entities-table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);\n        } else {\n          if (!this.config.suppressErrors && this.hasSomeDirtyRow()) {\n            console.warn(`[entities-table-datasource] Received ${this._entityName} data, while some row still dirty. Some data can be lost`);\n          }\n\n          this.updateDatasource((res.data || []) as T[]);\n          this._fetchMoreFn = res.fetchMore;\n        }\n\n        // Reset _waitingNetworkResult to false\n        this._waitingNetworkResult = false;\n\n        return res;\n      }),\n      // Stop this pipe next time we call watchAll()\n      takeUntil(this._stopWatchSubject)\n      // ⚠ Notice: Don't put any operator after takeUntil to avoid potential subscription leaks\n    );\n  }\n\n  protected updateDatasourceFromRows(rows: R[]) {\n    // Avoid to update dataSourceSubject, when not need\n    if (this.datasourceSubject.observed) {\n      if (!this.config.suppressErrors)\n        console.warn(\"[entities-table-datasource] Update datasource subject. Please prefer using 'rowsSubject' instead of 'datasourceSubject'\");\n      super.updateDatasourceFromRows(rows);\n    } else {\n      console.debug('[entities-table-datasource] Skipping datasourceSubject update (not used yet).');\n    }\n  }\n\n  async save(): Promise<boolean> {\n    if (this.config.readOnly) {\n      console.error('[entities-table-datasource] Enable to save, because config.readOnly=true');\n      return false;\n    }\n    // Saving twice (should never occur)\n    if (this.saving) {\n      console.warn(`[entities-table-datasource] Trying to save ${this._entityName} rows twice. Skip`);\n      return false;\n    }\n\n    this.markAsSaving();\n\n    const onlyDirtyRows = this.config.saveOnlyDirtyRows;\n\n    try {\n      if (this._debug) console.debug(`[entities-table-datasource] Saving ${this._entityName} rows... {onlyDirtyRows: ${onlyDirtyRows}}`);\n\n      // Get all rows\n      const rows = this.getRows();\n\n      // Finish editing all rows\n      const invalidRows = rows.filter((row) => row.editing && !row.confirmEditCreate());\n\n      // Cannot finish some rows: error\n      if (invalidRows.length) {\n        // log errors\n        if (this._debug)\n          invalidRows.forEach((row) => AppTableUtils.logRowErrors(row, `[entities-table-datasource] ${this._entityName} row #${row.id}`));\n        // Stop with an error\n        throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };\n      }\n\n      let data: T[];\n      let dataToSave: T[];\n\n      if (this.validatorService) {\n        dataToSave = [];\n        data = rows.map((row) => {\n          const currentData = new this.dataConstructor() as T;\n          currentData.fromObject(row.currentData);\n          // Filter to keep only dirty row\n          if (onlyDirtyRows && row.validator.dirty) dataToSave.push(currentData);\n          return currentData;\n        });\n        if (!onlyDirtyRows) dataToSave = data;\n      }\n      // Or use the current data without conversion (when no validator service used)\n      else {\n        data = rows.map((row) => row.currentData);\n        // save all data, as we don't have any dirty marker\n        dataToSave = data;\n      }\n\n      // If no data to save: exit\n      if (onlyDirtyRows && !dataToSave.length) {\n        if (this._debug) console.debug(`[entities-table-datasource] No ${this._entityName} data to save. Skip`);\n        return false;\n      }\n\n      if (this._debug) console.debug(`[entities-table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);\n      await this.dataService.saveAll(dataToSave, this.saveAllOptions);\n\n      if (this._debug) console.debug(`[entities-table-datasource] Saving ${this._entityName} data [OK]`);\n\n      // LP 23/03/2021: update datasource is necessary but can be changed to a refetch() on QueryRef (must be created and registered in GraphqlService.watchQuery)\n      this.updateDatasource(data);\n\n      return true;\n    } catch (error) {\n      if (this._debug) console.error(('[entities-table-datasource] Error while saving: ' + error && error.message) || error);\n      throw error;\n    } finally {\n      this.markAsSaved();\n    }\n  }\n\n  updateDatasource(data: T[], opts?: { emitEvent: boolean }) {\n    if (this._debug) console.debug(`[entities-table-datasource] Updating datasource with data:`, data);\n\n    super.updateDatasource(data, opts);\n\n    if (!opts || opts.emitEvent !== false) {\n      this.markAsLoaded();\n    }\n  }\n\n  connect(collectionViewer: CollectionViewer): Observable<R[] | ReadonlyArray<R>> {\n    // DEBUG\n    //console.debug(\"[entities-datasource] connect\");\n    return super.connect(collectionViewer);\n  }\n\n  /**\n   * Disconnects the data source, cleaning up any resources and subscriptions.\n   *\n   * @param {CollectionViewer} [collectionViewer] - Optional parameter representing the collection viewer to disconnect from.\n   * @return {void} - This method does not return a value.\n   */\n  disconnect(collectionViewer?: CollectionViewer) {\n    if (this._debug) console.debug('[entities-table-datasource] Disconnecting...');\n    super.disconnect(collectionViewer);\n    if (!this._stopWatchSubject.closed) {\n      this._stopWatchSubject.next();\n      this._stopWatchSubject.complete();\n      this._stopWatchSubject.unsubscribe();\n      this.loadingSubject.complete();\n      this.loadingSubject.unsubscribe();\n    }\n  }\n\n  /**\n   * Waits for the idle state based on the provided options.\n   *\n   * @param {number | { debounceTimeMs?: number } & FirstOptions} [opts] Options for controlling the wait behavior.\n   *   - If a number is provided, it is treated as the debounce time in milliseconds.\n   *   - If an object is provided, it can include the following properties:\n   *     - debounceTimeMs: The debounce time in milliseconds. Defaults to 100 if not specified.\n   *     - Additional options from `FirstOptions` interface.\n   * @return {Promise<any>} A Promise that resolves when the idle state is reached.\n   */\n  waitIdle(opts?: number | ({ debounceTimeMs?: number } & FirstOptions)): Promise<any> {\n    const debounceTimeMs = typeof opts === 'number' ? opts : opts?.debounceTimeMs || 100; /* in case was not started */\n    opts = typeof opts === 'number' ? undefined : opts;\n    return firstFalsePromise(\n      this.loadingSubject.asObservable().pipe(\n        // Skip loaded event, if waiting a result from network (e.g. when fetch policy is 'cache-and-network')\n        filter((loading) => loading || !this._waitingNetworkResult),\n        debounceTime(debounceTimeMs)\n      ),\n      opts\n    );\n  }\n\n  confirmCreate(row: R): boolean {\n    const confirmed = super.confirmCreate(row);\n    if (!confirmed) return false;\n    if (row.editing && row.validator) {\n      console.warn('[entities-table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');\n      row.validator.disable({ onlySelf: true, emitEvent: false });\n    }\n    return true;\n  }\n\n  confirmEdit(row: R): boolean {\n    const confirmed = super.confirmEdit(row);\n    if (!confirmed) return false;\n    if (row.validator?.enabled) {\n      console.warn('[entities-table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');\n      row.validator.disable({ onlySelf: true, emitEvent: false });\n    }\n    return true;\n  }\n\n  startEdit(row: R): boolean {\n    const editing = super.startEdit(row);\n    if (!editing) return false;\n    if (row.validator?.disabled) {\n      console.warn('[entities-table-datasource] Row still has {editing: false} after startEdit()! Force editing');\n      row.validator.enable({ onlySelf: true, emitEvent: false });\n    }\n    return true;\n  }\n\n  handleError(error: any, message: string): Observable<LoadResult<T>> {\n    const errorMsg = (error && error.message) || error;\n    console.error(`[entities-table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);\n    this.markAsLoaded();\n    throw new Error(message || errorMsg);\n  }\n\n  handleServiceError(error: any) {\n    const errorMsg = (error && error.message) || error;\n    console.error(`[entities-table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);\n    this.markAsLoaded();\n    throw error;\n  }\n\n  delete(id: number): boolean {\n    // If new row: not need to propagate to the dataService\n    if (id === -1) {\n      return super.delete(id);\n    }\n\n    const row = this.getRow(id);\n    if (!row) {\n      console.error(`[entities-table-datasource] Row to delete with id=${id} not found`);\n      return;\n    }\n\n    this.markAsLoading();\n\n    this.dataService\n      .deleteAll([row.currentData], this.saveAllOptions)\n      .catch((err) => this.handleServiceError(err))\n      .then(() => {\n        setTimeout(() => {\n          // make sure row has been deleted (because GrapQHl cache remove can failed)\n          const present = this.getRow(id) === row;\n          if (present) super.delete(id);\n\n          this.markAsLoaded();\n        }, 300);\n      });\n  }\n\n  async deleteAll(rows: R[]): Promise<any> {\n    this.markAsLoading();\n\n    const data = this.getDataFromRows(rows);\n\n    try {\n      // Call service deletion\n      await this.dataService.deleteAll(data, this.saveAllOptions);\n\n      // Wait propagation (e.g. update cache, then received update from dataService.watchAll())\n      await sleep(500);\n\n      // Workaround, to be sure all rows have been deleted\n      // Sometime, the service miss deletion, or GraphQl cache remove failed.\n      // In this case, apply missing deletion using the parent delete() function\n      const rowNotDeleted = this.getRows().filter((row) => rows.includes(row));\n      if (isNotEmptyArray(rowNotDeleted)) {\n        console.warn(\n          `[entities-table-datasource] Force deletion of ${rowNotDeleted.length} rows! Please check that data service update the cache, after deletion`\n        );\n        // Start at the end\n        for (const r of rowNotDeleted.sort((a, b) => (a.id > b.id ? -1 : 1))) {\n          super.delete(r.id);\n        }\n      }\n    } catch (err) {\n      // Handle service error\n      this.handleServiceError(err);\n    } finally {\n      this.markAsLoaded();\n    }\n  }\n\n  getRow(id: number): R {\n    return super.getRow(id);\n  }\n\n  getRows(): R[] {\n    return this.rowsSubject.getValue() || [];\n  }\n\n  hasSomeEditingRow(): boolean {\n    return this.getRows().some((row) => row.editing);\n  }\n\n  hasSomeDirtyRow(): boolean {\n    return this.getRows().some((row) => row.dirty);\n  }\n\n  async createNew(insertAt?: number, opts = { editing: true }): Promise<R | undefined> {\n    // Avoid multiple call (only one editing row is allowed)\n    if (this._creating && opts.editing) return;\n\n    this._creating = true;\n\n    try {\n      const row = await super.createNew(insertAt, opts);\n\n      if (!row) return undefined; // Stop here\n\n      // Call observers\n      if (this.config?.onRowCreated) {\n        try {\n          await this.config.onRowCreated(row);\n        } catch (err) {\n          // Log, then continue\n          console.error((err && err.message) || err, err);\n        }\n      }\n\n      return row;\n    } finally {\n      this._creating = false;\n    }\n  }\n\n  getData(): T[] {\n    const rows = this.getRows();\n    return this.getDataFromRows(rows);\n  }\n\n  get canFetchMore(): boolean {\n    return !!this._fetchMoreFn;\n  }\n\n  async fetchMore(opts?: { emitEvent: boolean }): Promise<boolean> {\n    if (!this._fetchMoreFn) return false; // Avoid multiple call\n    if (this.hasSomeDirtyRow()) {\n      console.warn(`Cannot fetch more ${this._entityName} because some row) still dirty`);\n      return;\n    }\n    console.debug(`Will fetching more row(s) still...`);\n\n    // Forget the fetchMore function, to avoid multiple call\n    const fetchMoreFn = this._fetchMoreFn;\n    this._fetchMoreFn = null;\n\n    // Fetch next page\n    const res: LoadResult<T> = await fetchMoreFn();\n\n    // Skip if empty (no more data)\n    if (isEmptyArray(res?.data)) return false;\n\n    // Update the data source\n    super.updateDatasource((this.currentData || []).concat(...res.data), opts);\n\n    // Remember fetchMore\n    this._fetchMoreFn = res.fetchMore;\n    return true;\n  }\n\n  /* -- protected method -- */\n\n  markAsLoading() {\n    if (this.loadingSubject.value !== true) {\n      this.loadingSubject.next(true);\n    }\n  }\n\n  markAsLoaded() {\n    if (this.loadingSubject.value !== false) {\n      this.loadingSubject.next(false);\n    }\n  }\n\n  markAsSaving() {\n    if (this.savingSubject.value !== true) {\n      this.savingSubject.next(true);\n    }\n  }\n\n  markAsSaved() {\n    if (this.savingSubject.value !== false) {\n      this.savingSubject.next(false);\n    }\n  }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ModalController, NavParams } from '@ionic/angular';\nimport { toBoolean } from '../../shared/functions';\n\nexport declare interface ColumnItem {\n  name?: string;\n  label: string;\n  visible: boolean;\n  canHide?: boolean;\n}\n\n@Component({\n  selector: 'table-select-columns',\n  templateUrl: './table-select-columns.component.html',\n})\nexport class TableSelectColumnsComponent implements OnInit {\n  @Input() columns: ColumnItem[];\n\n  @Input() canHideColumns = true;\n\n  constructor(\n    private navParams: NavParams,\n    private viewCtrl: ModalController\n  ) {}\n\n  ngOnInit() {\n    this.columns = this.columns || (this.navParams.data && this.navParams.data.columns) || [];\n\n    this.columns.forEach((c) => {\n      // If cannot hide columns, make sure all columns are set to visible\n      c.visible = (this.canHideColumns === false && true) /*always visible*/ || c.visible;\n      c.canHide = toBoolean(c.canHide, this.canHideColumns);\n    });\n  }\n\n  onRenderItems(event) {\n    const element = this.columns.splice(event.detail.from, 1)[0];\n    this.columns.splice(event.detail.to, 0, element);\n    event.detail.complete();\n  }\n\n  close() {\n    this.viewCtrl.dismiss(this.columns);\n  }\n\n  cancel() {\n    this.viewCtrl.dismiss();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"light\">\n    <ion-buttons slot=\"start\">\n      <ion-button (click)=\"cancel()\" visible-xs visible-sm visible-mobile>\n        <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n\n    <ion-title>\n      {{ 'COMMON.DISPLAYED_COLUMNS' | translate }}\n    </ion-title>\n\n    <ion-buttons slot=\"end\">\n      <ion-button (click)=\"close()\" visible-xs visible-sm visible-mobile>\n        <ion-icon slot=\"icon-only\" name=\"checkmark\"></ion-icon>\n      </ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <ion-list>\n    <!-- See doc: https://beta.ionicframework.com/docs/api/reorder/ -->\n\n    <ion-reorder-group disabled=\"false\" (ionItemReorder)=\"onRenderItems($event)\">\n      <ion-item *ngFor=\"let column of columns\">\n        <ion-label>{{ column.label | translate }}</ion-label>\n        <ion-toggle\n          slot=\"end\"\n          aria-label=\"\"\n          *ngIf=\"column.canHide\"\n          [checked]=\"column.visible\"\n          (ionChange)=\"column.visible = !column.visible\"\n        ></ion-toggle>\n        <ion-reorder slot=\"end\"></ion-reorder>\n      </ion-item>\n    </ion-reorder-group>\n  </ion-list>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <ion-toolbar>\n    <ion-row>\n      <ion-col></ion-col>\n      <ion-col size=\"auto\">\n        <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n\n        <ion-button fill=\"solid\" (click)=\"close()\" color=\"tertiary\">\n          <ion-label translate>COMMON.BTN_APPLY</ion-label>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { Subject, Subscription } from 'rxjs';\n\nexport const SETTINGS_DISPLAY_COLUMNS = 'displayColumns';\nexport const SETTINGS_SORTED_COLUMN = 'sortedColumn';\nexport const SETTINGS_FILTER = 'filter';\nexport const SETTINGS_PAGE_SIZE = 'pageSize';\nexport const SETTINGS_COMPACT_ROWS = 'compactRows';\nexport const DEFAULT_PAGE_SIZE = 20;\nexport const DEFAULT_PAGE_SIZE_OPTIONS = [20, 50, 100, 200, 500];\nexport const RESERVED_START_COLUMNS = ['select', 'id'];\nexport const RESERVED_END_COLUMNS = ['actions'];\nexport const DEFAULT_REQUIRED_COLUMNS = ['id'];\nexport const TABLE_SETTINGS_ENUM = {\n  FILTER_KEY: 'filter',\n  COMPACT_ROWS_KEY: 'compactRows',\n};\n\nexport class CellValueChangeListener {\n  subject: Subject<any>;\n  subscription: Subscription; // The row start editing subscription\n  formPath: string;\n  emitInitialValue: boolean;\n}\n\nexport interface IModalDetailOptions<T = any> {\n  // Data\n  isNew: boolean;\n  data: T;\n  disabled: boolean;\n\n  // Callback functions\n  onDelete?: (event: Event, data: T) => Promise<boolean>;\n}\n\nexport type SaveActionType = 'delete' | 'sort' | 'filter';\n\nexport interface IEntitiesTableDataSource<R> {\n  getRows(): R[];\n}\n","import { AfterViewInit, ChangeDetectorRef, Directive, EventEmitter, Injector, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\nimport { MatSort, MatSortable, SortDirection } from '@angular/material/sort';\n\nimport { BehaviorSubject, EMPTY, merge, Observable, of, Subject, Subscription } from 'rxjs';\nimport { catchError, debounceTime, distinctUntilChanged, filter, first, mergeMap, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport { TableElement } from '@e-is/ngx-material-table';\nimport { EntitiesTableDataSource } from './entities-table-datasource.class';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { EntityUtils, IEntity } from '../services/model/entity.model';\nimport { AlertController, ModalController, NavController, ToastController } from '@ionic/angular';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ColumnItem, TableSelectColumnsComponent } from './table-select-columns.component';\nimport { Location } from '@angular/common';\nimport { ErrorCodes } from '../services/errors';\nimport { AppFormUtils, CanSave, IAppForm, OnReady } from '../form/form.utils';\nimport { LocalSettingsService } from '../services/local-settings.service';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n  MatAutocompleteConfigHolder,\n  MatAutocompleteFieldAddOptions,\n  MatAutocompleteFieldConfig,\n} from '../../shared/material/autocomplete/material.autocomplete.config';\nimport { CompletableEvent, createPromiseEventEmitter, emitPromiseEvent } from '../../shared/events';\nimport {\n  changeCaseToUnderscore,\n  getPropertyByPath,\n  isEmptyArray,\n  isNil,\n  isNotEmptyArray,\n  isNotNil,\n  isNotNilOrBlank,\n  setPropertyByPath,\n  toBoolean,\n} from '../../shared/functions';\nimport { waitFor, waitForFalse, WaitForOptions, waitForTrue } from '../../shared/observables';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { Alerts } from '../../shared/alerts';\nimport { CdkColumnDef } from '@angular/cdk/table';\nimport { LoadResult } from '../../shared/services/entity-service.class';\nimport { FormErrorTranslateOptions, FormErrorTranslator, IFormPathTranslator } from '../../shared/validator/form-error-adapter.class';\nimport {\n  CellValueChangeListener,\n  DEFAULT_PAGE_SIZE,\n  DEFAULT_PAGE_SIZE_OPTIONS,\n  DEFAULT_REQUIRED_COLUMNS,\n  RESERVED_END_COLUMNS,\n  RESERVED_START_COLUMNS,\n  SaveActionType,\n  SETTINGS_DISPLAY_COLUMNS,\n  SETTINGS_PAGE_SIZE,\n  SETTINGS_SORTED_COLUMN,\n} from './table.model';\nimport { AppTableUtils } from './table.utils';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatTable } from '@angular/material/table';\nimport { getControlFromPath } from '../../shared/forms';\n\n// @dynamic\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class AppTable<T extends IEntity<T, ID>, F = any, ID = number>\n  implements OnInit, OnDestroy, AfterViewInit, IAppForm, CanSave, IFormPathTranslator\n{\n  private _initialized = false;\n  private _openingRow = false;\n  private _subscription = new Subscription();\n  private _dataSourceLoadingSubscription: Subscription;\n\n  private _cellValueChangesDefs: {\n    [key: string]: CellValueChangeListener;\n  } = {};\n\n  protected _enabled = true;\n  protected _totalRowCount: number | null = null;\n  protected _visibleRowCount: number | null = null;\n  protected _autocompleteConfigHolder: MatAutocompleteConfigHolder;\n  protected allowRowDetail = true;\n  protected readonly cd: ChangeDetectorRef;\n  protected route: ActivatedRoute;\n  protected router: Router;\n  protected navController: NavController;\n  protected location: Location;\n  protected settings: LocalSettingsService;\n  protected translate: TranslateService;\n  protected modalCtrl: ModalController;\n  protected alertCtrl: AlertController;\n  protected toastController: ToastController;\n  protected previouslyEditedRowId: number;\n  protected formErrorAdapter: FormErrorTranslator;\n  protected readonly destroySubject = new Subject<void>();\n\n  excludesColumns: string[] = [];\n  displayedColumns: string[];\n  errorTranslateOptions: FormErrorTranslateOptions;\n\n  readonly readySubject = new BehaviorSubject<boolean>(false);\n  readonly loadingSubject = new BehaviorSubject<boolean>(true);\n  readonly savingSubject = new BehaviorSubject<boolean>(false);\n  readonly touchedSubject = new BehaviorSubject<boolean>(false);\n  readonly dirtySubject = new BehaviorSubject<boolean>(false);\n  readonly errorSubject = new BehaviorSubject<string>(undefined);\n\n  get totalRowCount(): number | null {\n    return this._totalRowCount;\n  }\n\n  set totalRowCount(value: number | null) {\n    this._totalRowCount = value;\n  }\n\n  get visibleRowCount(): number | null {\n    return this._visibleRowCount;\n  }\n\n  set visibleRowCount(value: number | null) {\n    this._visibleRowCount = value;\n  }\n\n  get error(): string {\n    return this.errorSubject.value;\n  }\n\n  set error(error: string) {\n    this.setError(error);\n  }\n\n  /**\n   * @deprecated\n   */\n  get error$(): Observable<string> {\n    return this.errorSubject.asObservable();\n  }\n\n  selection = new SelectionModel<TableElement<T>>(true, []);\n  permanentSelection: SelectionModel<T> = null;\n  permanentSelectionChangedPrevented = false;\n  editedRow: TableElement<T> = undefined;\n  autocompleteFields: { [key: string]: MatAutocompleteFieldConfig };\n  readonly mobile: boolean;\n\n  // Table options\n  @Input() settingsId: string;\n  @Input() debug: boolean;\n  @Input() i18nColumnPrefix = 'COMMON.';\n  @Input() i18nColumnSuffix: string;\n  @Input() autoLoad = true;\n  @Input() readOnly: boolean;\n  @Input() inlineEdition: boolean;\n  @Input() focusFirstColumn = false;\n  @Input() confirmBeforeDelete = false;\n  @Input() confirmBeforeCancel = false;\n  @Input() undoableDeletion = false;\n  @Input() saveBeforeDelete: boolean;\n  @Input() keepEditedRowOnSave: boolean;\n  @Input() saveBeforeSort: boolean;\n  @Input() saveBeforeFilter: boolean;\n  @Input() propagateRowError = false;\n  @Input() permanentSelectionAllowed = false; // Allow keep selected rows over page change or sort change\n  @Input() openRowThrottleTime = 800; // Prevent double click - see issue sumaris-app#864\n\n  @Input() defaultSortBy: string;\n  @Input() defaultSortDirection: SortDirection;\n  @Input() defaultPageSize = DEFAULT_PAGE_SIZE;\n  @Input() defaultPageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS;\n\n  // Focus manager\n  @Input() focusColumn: string;\n\n  get firstUserColumn(): string {\n    return this.displayedColumns[RESERVED_START_COLUMNS.length];\n  }\n\n  get lastUserColumn(): string {\n    return this.displayedColumns[this.displayedColumns.length - RESERVED_END_COLUMNS.length - 1];\n  }\n\n  @Input() set dataSource(value: EntitiesTableDataSource<T, F, ID>) {\n    this.setDatasource(value);\n  }\n\n  get dataSource(): EntitiesTableDataSource<T, F, ID> {\n    return this._dataSource;\n  }\n\n  @Input() set filter(value: F) {\n    this.setFilter(value);\n  }\n\n  get filter(): F {\n    return this._filter;\n  }\n\n  get empty(): boolean {\n    return this.loading || this.totalRowCount === 0;\n  }\n\n  get selectedEntities(): T[] {\n    return this.permanentSelection?.selected || AppTableUtils.getEntities(this.selection.selected);\n  }\n\n  @Output() onRefresh = new EventEmitter<{ emitEvent?: boolean; skip?: boolean }>();\n  @Output() onClickRow = new EventEmitter<TableElement<T>>();\n  @Output() onOpenRow = new EventEmitter<TableElement<T>>();\n  @Output() onNewRow = new EventEmitter<any>();\n  @Output() onStartEditingRow = new EventEmitter<TableElement<T>>();\n  @Output() onConfirmEditCreateRow = new EventEmitter<TableElement<T>>();\n  @Output() onCancelOrDeleteRow = new EventEmitter<TableElement<T>>();\n  @Output() onBeforeDeleteRows = createPromiseEventEmitter<boolean, { rows: TableElement<T>[] }>();\n  @Output() onBeforeCancelRows = createPromiseEventEmitter<boolean, { rows: TableElement<T>[] }>();\n  @Output() onBeforeSave = createPromiseEventEmitter<{ confirmed: boolean; save: boolean }, { action: SaveActionType; valid: boolean }>();\n  @Output() onAfterDeletedRows = new EventEmitter<TableElement<T>[]>();\n  @Output() onSort = new EventEmitter<any>();\n  @Output() onDirty = new EventEmitter<boolean>();\n  @Output() onError = new EventEmitter<string>();\n\n  get dirty(): boolean {\n    return this.dirtySubject.value;\n  }\n\n  get valid(): boolean {\n    return this.editedRow && this.editedRow.editing ? this.editedRow.validator?.valid : true;\n  }\n\n  get invalid(): boolean {\n    return this.editedRow && this.editedRow.editing ? this.editedRow.validator?.invalid : false;\n  }\n\n  get pending(): boolean {\n    return this.editedRow && this.editedRow.editing ? this.editedRow.validator?.pending : false;\n  }\n\n  get touched(): boolean {\n    return this.touchedSubject.value;\n  }\n\n  get untouched(): boolean {\n    return !this.touchedSubject.value;\n  }\n\n  get loading(): boolean {\n    return this.loadingSubject.value;\n  }\n\n  get loaded(): boolean {\n    return !this.loadingSubject.value;\n  }\n\n  get saving(): boolean {\n    return this.savingSubject.value;\n  }\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (this.sort) this.sort.disabled = true;\n    this._enabled = false;\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (this.sort) this.sort.disabled = false;\n    this._enabled = true;\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  get enabled(): boolean {\n    return this._enabled;\n  }\n\n  // FIXME: need to hidden buttons (in HTML), etc. when disabled\n  @Input() set disabled(value: boolean) {\n    if (value !== !this._enabled) {\n      if (value) this.disable({ emitEvent: false });\n      else this.enable({ emitEvent: false });\n    }\n  }\n\n  get disabled(): boolean {\n    return !this._enabled;\n  }\n\n  markAsDirty(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (!this.dirtySubject.closed && this.dirtySubject.value !== true) {\n      this.dirtySubject.next(true);\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (!this.dirtySubject.closed && this.dirtySubject.value !== false) {\n      this.dirtySubject.next(false);\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    let needEmitEvent = false;\n    if (this.touchedSubject.value) {\n      this.touchedSubject.next(false);\n      needEmitEvent = true;\n    }\n    if (this.dirty || (this.editedRow && this.editedRow.id !== this.previouslyEditedRowId)) {\n      // Cancel the current editing row only if editing and if it was not previously saved\n      if (this.editedRow?.editing) {\n        // Cancel the current editing row only if editing and if it was not previously saved\n        if (this.editedRow.id === -1) {\n          this.dataSource.delete(-1);\n        } else {\n          this.dataSource.cancel(this.editedRow);\n        }\n\n        // Mark row as pristine\n        this.checkIfRowPristine(this.editedRow, { emitEvent: false });\n      }\n      this.editedRow = null;\n      needEmitEvent = true;\n    }\n    this.previouslyEditedRowId = undefined;\n    if (needEmitEvent && (!opts || opts.emitEvent !== false)) this.markForCheck();\n  }\n\n  /**\n   * @deprecated prefer to use markAllAsTouched()\n   * @param opts\n   */\n  markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    console.warn('TODO: Replace this call by markAllAsTouched() - because of changes in ngx-components >= 0.16.0');\n    if (this.editedRow?.editing) {\n      this.editedRow.validator?.markAllAsTouched();\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  markAllAsTouched(opts?: { emitEvent?: boolean }) {\n    if (!this.touchedSubject.closed && this.touchedSubject.value !== true) {\n      this.touchedSubject.next(true);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n    if (this.editedRow?.editing) {\n      this.editedRow.validator?.markAllAsTouched();\n    }\n  }\n\n  markAsSaving(opts?: { emitEvent?: boolean }) {\n    if (!this.savingSubject.closed && this.savingSubject.value !== true) {\n      this.focusColumn = undefined; // unselect focus column\n      this.savingSubject.next(true);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  markAsSaved(opts?: { emitEvent?: boolean }) {\n    if (!this.savingSubject.closed && this.savingSubject.value !== false) {\n      this.savingSubject.next(false);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  markAsLoading(opts?: { emitEvent?: boolean }) {\n    this.setLoading(true, opts);\n  }\n\n  markAsLoaded(opts?: { emitEvent?: boolean }) {\n    this.setLoading(false, opts);\n  }\n\n  markAsReady(opts?: { emitEvent?: boolean }) {\n    if (!this.readySubject.closed && this.readySubject.value !== true) {\n      this.readySubject.next(true);\n\n      // If subclasses implements OnReady\n      if (typeof this['ngOnReady'] === 'function') {\n        (this as any as OnReady).ngOnReady();\n      }\n    }\n  }\n\n  markAsNotReady(opts?: { emitEvent?: boolean }) {\n    if (!this.readySubject.closed && this.readySubject.value !== false) {\n      this.readySubject.next(false);\n    }\n  }\n\n  enableSort() {\n    if (this.sort) this.sort.disabled = false;\n  }\n\n  disableSort() {\n    if (this.sort) this.sort.disabled = true;\n  }\n\n  set pageSize(value: number) {\n    this.defaultPageSize = value;\n    if (this.paginator) {\n      this.paginator.pageSize = value;\n    }\n  }\n\n  get pageSize(): number {\n    return (this.paginator && this.paginator.pageSize) || this.defaultPageSize || DEFAULT_PAGE_SIZE;\n  }\n\n  get pageOffset(): number {\n    return (this.paginator && this.paginator.pageIndex * this.paginator.pageSize) || 0;\n  }\n\n  get sortActive(): string {\n    return this.sort && this.sort.active;\n  }\n\n  set sortActive(sortBy: string) {\n    if (this.sort) {\n      this.sort.active = sortBy;\n    } else {\n      this.defaultSortBy = sortBy;\n    }\n  }\n\n  get sortDirection(): SortDirection {\n    return (this.sort && this.sort.direction && (this.sort.direction === 'desc' ? 'desc' : 'asc')) || undefined;\n  }\n\n  set sortDirection(value: SortDirection) {\n    if (this.sort) {\n      this.sort.direction = value;\n    } else {\n      this.defaultSortDirection = value;\n    }\n  }\n\n  private _paginator: MatPaginator | null = null;\n\n  @Input() set paginator(value: MatPaginator) {\n    this._paginator = value;\n  }\n\n  get paginator(): MatPaginator {\n    return this._paginator || this.childPaginator;\n  }\n\n  get destroyed(): boolean {\n    return this.destroySubject?.closed !== false;\n  }\n\n  @ViewChild(MatTable, { static: false }) table: MatTable<T>;\n  @ViewChild(MatPaginator, { static: false }) childPaginator: MatPaginator;\n  @ViewChild(MatSort, { static: false }) sort: MatSort;\n\n  protected constructor(\n    injector: Injector,\n    protected columns: string[],\n    protected _dataSource?: EntitiesTableDataSource<T, F, ID>,\n    private _filter?: F\n  ) {\n    this.cd = injector.get(ChangeDetectorRef);\n    this.route = injector.get(ActivatedRoute);\n    this.router = injector.get(Router);\n    this.navController = injector.get(NavController);\n    this.location = injector.get(Location);\n    this.settings = injector.get(LocalSettingsService);\n    this.translate = injector.get(TranslateService);\n    this.modalCtrl = injector.get(ModalController);\n    this.alertCtrl = injector.get(AlertController);\n    this.toastController = injector.get(ToastController);\n    this.formErrorAdapter = injector.get(FormErrorTranslator);\n    this.mobile = this.settings.mobile;\n\n    // Autocomplete fields\n    this._autocompleteConfigHolder = new MatAutocompleteConfigHolder({\n      getUserAttributes: (a, b) => this.settings.getFieldDisplayAttributes(a, b),\n    });\n    this.autocompleteFields = this._autocompleteConfigHolder.fields;\n  }\n\n  ngOnInit() {\n    if (this._initialized) return; // Init only once\n    this._initialized = true;\n\n    // Set defaults\n    this.readOnly = toBoolean(this.readOnly, this.dataSource?.config.readOnly || false); // read/write by default\n    this.inlineEdition = !this.readOnly && toBoolean(this.inlineEdition, false); // force to false when readonly\n    this.saveBeforeDelete = toBoolean(this.saveBeforeDelete, !this.readOnly); // force to false when readonly\n    this.saveBeforeSort = toBoolean(this.saveBeforeSort, !this.readOnly); // force to false when readonly\n    this.saveBeforeFilter = toBoolean(this.saveBeforeFilter, !this.readOnly); // force to false when readonly\n    this.keepEditedRowOnSave = toBoolean(this.keepEditedRowOnSave, this.inlineEdition);\n    this.errorTranslateOptions = this.errorTranslateOptions || { separator: ', ', pathTranslator: this }; // Can be override in subclasses constructors\n\n    // Check ask user confirmation is possible\n    if (this.confirmBeforeDelete && !this.alertCtrl) throw Error(\"Missing 'alertCtrl' or 'injector' in component's constructor.\");\n\n    // Defined unique id for settings for the page\n    this.settingsId = this.settingsId || this.generateTableId();\n\n    this.displayedColumns = this.getDisplayColumns();\n\n    // Load the sorted columns, from settings\n    {\n      const sortedColumn = this.getSortedColumn();\n      this.defaultSortBy = sortedColumn.id;\n      this.defaultSortDirection = sortedColumn.start;\n    }\n\n    this.defaultPageSize = this.getPageSize();\n\n    // Propagate error to event emitter\n    this.registerSubscription(this.errorSubject.subscribe((value) => this.onError.emit(value)));\n\n    // Propagate dirty to event emitter\n    this.registerSubscription(this.dirtySubject.subscribe((value) => this.onDirty.emit(value)));\n\n    // Propagate row dirty state to table\n    this.registerSubscription(\n      this.onStartEditingRow\n        .pipe(\n          filter((row) => row?.validator && true),\n          mergeMap((row) =>\n            row.validator.valueChanges.pipe(\n              filter(() => row.validator.dirty),\n              first(),\n              // DEBUG\n              //tap(() => console.debug(\"Propagate row's dirty to table...\"))\n\n              // Stop if next another row, or destroying\n              takeUntil(this.onStartEditingRow),\n              takeUntil(this.destroySubject)\n            )\n          )\n        )\n        .subscribe(() => this.markAsDirty())\n    );\n\n    // Call datasource refresh, on each refresh events\n    this.registerSubscription(\n      this.onRefresh\n        .pipe(\n          startWith<any>(this.autoLoad ? {} : { skip: true }),\n          switchMap((opts) => {\n            this.markAsPristine();\n            this.selection.clear();\n            if (opts?.skip) {\n              return of(undefined);\n            }\n            if (!this._dataSource) {\n              if (this.debug) console.debug('[table] Skipping data load: no dataSource defined');\n              return of(undefined);\n            }\n            if (this.debug) console.debug('[table] Calling dataSource.watchAll()...');\n            return this._dataSource.watchAll(this.pageOffset, this.pageSize, this.sortActive, this.sortDirection, this._filter).pipe(\n              takeUntil(this.onRefresh),\n              catchError((err) => {\n                if (this.debug) console.error(err);\n                this.setError((err && err.message) || err);\n                return of(undefined); // Continue\n              }),\n              tap((res) => this.updateView(res as LoadResult<T> | undefined, opts))\n            );\n          })\n        )\n        .subscribe()\n    );\n\n    // Listen dataSource loading events\n    if (this._dataSource) this.listenDataSourceLoading(this._dataSource);\n\n    // Permanent selection behavior\n    if (this.permanentSelectionAllowed) this.initPermanentSelection();\n  }\n\n  ngAfterViewInit() {\n    // Detect when parent ngOnInit() not call\n    if (this.debug && !this.displayedColumns)\n      console.warn(`[table] Missing 'displayedColumns'. Did you call parent ngOnInit() in component ${this.constructor.name} ?`);\n\n    // Start listening sort and paginator events\n    // noinspection JSIgnoredPromiseFromCall\n    this.listenSortAndPaginationEvents();\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n\n    // Unsubscribe column value changes\n    Object.keys(this._cellValueChangesDefs).forEach((col) => this.stopCellValueChanges(col, true));\n    this._cellValueChangesDefs = {};\n\n    this.readySubject.unsubscribe();\n    this.loadingSubject.unsubscribe();\n    this.savingSubject.unsubscribe();\n    this.errorSubject.unsubscribe();\n    this.dirtySubject.unsubscribe();\n\n    this.onRefresh.unsubscribe();\n    this.onOpenRow.unsubscribe();\n    this.onNewRow.unsubscribe();\n    this.onStartEditingRow.unsubscribe();\n    this.onConfirmEditCreateRow.unsubscribe();\n    this.onCancelOrDeleteRow.unsubscribe();\n    this.onBeforeDeleteRows.unsubscribe();\n    this.onBeforeCancelRows.unsubscribe();\n    this.onBeforeSave.unsubscribe();\n    this.onAfterDeletedRows.unsubscribe();\n    this.onSort.unsubscribe();\n    this.onDirty.unsubscribe();\n    this.onError.unsubscribe();\n\n    this.destroySubject.next();\n    this.destroySubject.unsubscribe();\n  }\n\n  async updateView(\n    res: LoadResult<T> | undefined,\n    opts?: {\n      emitEvent?: boolean;\n    }\n  ): Promise<void> {\n    if (!res) return; // Skip (e.g error)\n    if (res && res.data) {\n      this.visibleRowCount = res.data.length;\n      this.totalRowCount = isNotNil(res.total)\n        ? res.total\n        : ((this.paginator && this.paginator.pageIndex * (this.paginator.pageSize || DEFAULT_PAGE_SIZE)) || 0) + this.visibleRowCount;\n      if (this.debug) console.debug(`[table] ${res.data.length} rows loaded`);\n    } else {\n      //if (this.debug) console.debug('[table] NO rows loaded');\n      this.totalRowCount = 0;\n      this.visibleRowCount = 0;\n    }\n\n    if (!opts || opts.emitEvent !== false) {\n      this.markAsUntouched({ emitEvent: false });\n      this.markAsPristine({ emitEvent: false });\n      this.markAsLoaded({ emitEvent: false });\n    }\n\n    this.markForCheck();\n  }\n\n  setDatasource(datasource: EntitiesTableDataSource<T, F, ID>) {\n    if (this._dataSource) throw new Error('[table] dataSource already set !');\n    if (datasource && this._dataSource !== datasource) {\n      this._dataSource = datasource;\n      if (this._initialized) this.listenDataSourceLoading(datasource);\n    }\n  }\n\n  resetDataSource() {\n    if (this._dataSourceLoadingSubscription) {\n      this._dataSourceLoadingSubscription.unsubscribe();\n      this.unregisterSubscription(this._dataSourceLoadingSubscription);\n    }\n    this._dataSource = null;\n  }\n\n  addColumnDef(column: CdkColumnDef) {\n    this.table.addColumnDef(column);\n  }\n\n  removeColumnDef(column: CdkColumnDef) {\n    this.table.removeColumnDef(column);\n  }\n\n  setFilter(filter: F, opts?: { emitEvent?: boolean; permanentSelectionChangedPrevented?: boolean }) {\n    opts = opts || { emitEvent: true };\n\n    // Prevent permanent selection change events\n    this.permanentSelectionChangedPrevented = opts.permanentSelectionChangedPrevented ?? this.permanentSelectionChangedPrevented;\n\n    if (this.saveBeforeFilter) {\n      // if a dirty table is to be saved before filter\n      if (this.dirty) {\n        // Save\n        this.saveBeforeAction('filter').then((saved) => {\n          // Apply filter only if user didn't cancel the save or the save is ok\n          if (saved) {\n            this.applyFilter(filter, opts);\n          }\n        });\n      } else {\n        // apply filter on non-dirty table\n        this.applyFilter(filter, opts);\n      }\n    } else {\n      // apply filter directly\n      this.applyFilter(filter, opts);\n    }\n  }\n\n  async confirmAndAdd(event?: Event, row?: TableElement<T>, opts?: { focusColumn?: string }): Promise<boolean> {\n    if (!this.confirmEditCreate(event, row)) {\n      // If pending: Wait end of validation, then loop\n      if (row.validator?.pending) {\n        return (\n          AppFormUtils.waitWhilePending(row.validator, { stop: this.destroySubject })\n            // Loop after validation completed\n            .then(() => this.confirmAndAdd(event, row, opts))\n        );\n      }\n\n      // Go back to focusColumn\n      if (isNotNilOrBlank(opts?.focusColumn)) {\n        this.focusColumn = opts.focusColumn;\n        this.markForCheck();\n      }\n\n      return false;\n    }\n\n    // Add row\n    return this.addRow(event, undefined /* insertAt: use default */, opts);\n  }\n\n  confirmAndBackward(event: Event | undefined, row?: TableElement<T>, opts?: { focusColumn?: string }): boolean | Promise<boolean> {\n    if (!this.inlineEdition) return false;\n    const previousRow = this.editedRow;\n    const focusColumn = opts?.focusColumn ?? this.lastUserColumn;\n\n    event?.stopPropagation();\n\n    // Deleting edited row, if empty and not dirty\n    if (previousRow) {\n      // Previous row was a nex row AND invalid: delete it\n      if (previousRow.id === -1 && previousRow.validator?.invalid && !previousRow.validator?.dirty) {\n        this.deleteNewRow(event, previousRow);\n\n        // Wait deletion is done, then edit previous row (by id, because of reloading)\n        this.waitIdle().then(() => this.editOrAddRowById(event, row.id, { focusColumn }));\n        return true;\n      }\n\n      // If cannot confirm previous row\n      else if (!this.confirmEditCreate(event, previousRow)) {\n        // If pending: Wait end of validation, then loop\n        if (previousRow.validator?.pending) {\n          return (\n            AppFormUtils.waitWhilePending(previousRow.validator, { stop: this.destroySubject })\n              // Wait end of validation and loop\n              .then(() => this.confirmAndBackward(event, row, { focusColumn }))\n          );\n        }\n\n        // Go back to first column\n        this.focusColumn = focusColumn;\n        this.markForCheck();\n\n        return false;\n      }\n    }\n\n    // Edit row, focusing at the end\n    this.editRow(event, row, { focusColumn });\n    return true;\n  }\n\n  confirmAndForward(event: Event | undefined, row?: TableElement<T>, opts?: { focusColumn?: string }): boolean | Promise<boolean> {\n    if (!this.inlineEdition) return false;\n    row = row || this.editedRow;\n    const focusColumn = opts?.focusColumn ?? this.firstUserColumn;\n\n    event?.stopPropagation();\n\n    // If not confirmed\n    if (!this.confirmEditCreate(event, row)) {\n      // If pending: Wait end of validation, then loop\n      if (row.validator?.pending) {\n        return (\n          AppFormUtils.waitWhilePending(row.validator, { stop: this.destroySubject })\n            // Wait end of validation and loop\n            .then(() => this.confirmAndForward(event, row, { focusColumn }))\n        );\n      }\n\n      // Go back to first column\n      this.focusColumn = focusColumn;\n      this.markForCheck();\n\n      return false;\n    }\n\n    // Edit next row\n    const nextRowId = row.id + 1;\n    this.editOrAddRowById(event, nextRowId, { focusColumn });\n\n    return true;\n  }\n\n  /**\n   * Confirm the creation of the given row, or if not specified the currently edited row\n   *\n   * @param event\n   * @param row\n   */\n  confirmEditCreate(event?: Event, row?: TableElement<T>): boolean {\n    row = row || this.editedRow;\n    if (!row || !row.editing) return true; // no row to confirm\n\n    // Confirmation edition or creation\n    // TODO: add await ?\n    const confirmed = row.confirmEditCreate();\n\n    if (confirmed) {\n      // If edit finished, forget edited row\n      if (row === this.editedRow) {\n        this.editedRow = undefined;\n      }\n\n      // Mark table as dirty (if row is dirty)\n      if (row.dirty) {\n        this.markAsDirty({ emitEvent: false /* because of resetError() */ });\n      }\n\n      // Clear error\n      this.resetError();\n\n      // Emit the confirm event\n      this.onConfirmEditCreateRow.next(row);\n\n      return true; // Continue\n    }\n\n    if (row.validator) {\n      // If pending: Wait end of validation, then loop\n      // TODO: remove when using async isValid() function\n      if (row.validator.pending) {\n        AppFormUtils.waitWhilePending(row.validator)\n          // Wait end of validation and loop\n          .then(() => this.confirmEditCreate(event, row));\n        return false;\n      }\n\n      // NOT confirmed = row has error\n      if (this.debug) {\n        console.warn('[table] Cannot confirm row, because invalid');\n        AppFormUtils.logFormErrors(row.validator, '[table] ');\n      }\n\n      // fix: mark all controls as touched to show errors\n      row.validator.markAllAsTouched();\n\n      // Compute row error, and propagate to table's error\n      if (this.propagateRowError) {\n        const error = this.getRowError(row);\n        this.setError(error);\n      }\n    }\n\n    // Not confirmed\n    return false;\n  }\n\n  cancelOrDelete(event: Event, row: TableElement<T>, opts?: { interactive?: boolean; keepEditing?: boolean }) {\n    // Delete new row\n    if (row.id === -1) {\n      this.deleteNewRow(event, row);\n    }\n    // Delete existing (but not editing) row\n    else if (!row.editing) {\n      this.deleteExistingRow(event, row, opts);\n    }\n    // Cancel existing (and editing) row\n    else {\n      this.cancelExistingRow(event, row, opts);\n    }\n  }\n\n  async addRow(event?: Event, insertAt?: number, opts?: { focusColumn?: string; editing?: boolean }): Promise<boolean> {\n    if (this.debug) console.debug('[table] Asking for new row...');\n    if (!this._enabled) return false;\n\n    // Use modal if inline edition is disabled\n    if (!this.inlineEdition) {\n      this.openNewRowDetail(event);\n      return false;\n    }\n\n    // Try to finish edited row first\n    if (!this.confirmEditCreate()) {\n      return false;\n    }\n\n    // Add new row\n    const row = await this.addRowToTable(insertAt, opts);\n    return !!row;\n  }\n\n  async save(opts?: { keepEditing?: boolean }): Promise<boolean> {\n    opts = {\n      keepEditing: this.keepEditedRowOnSave,\n      ...opts,\n    };\n    if (this.readOnly) {\n      throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };\n    }\n\n    this.resetError();\n\n    // Keep edited row id (should be done BEFORE confirmEditCreate() )\n    this.previouslyEditedRowId = opts.keepEditing\n      ? (this.editedRow?.editing ? this.editedRow.id : undefined) || this.singleSelectedRow?.id\n      : undefined;\n    const previouslyEditedRowId = this.previouslyEditedRowId;\n    const previouslyEditedData = opts.keepEditing\n      ? (isNotNil(previouslyEditedRowId) && this.editedRow?.currentData) || this.singleSelectedRow?.currentData\n      : undefined;\n\n    if (!this.confirmEditCreate()) {\n      throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };\n    }\n\n    // Mark as saving\n    this.markAsSaving();\n\n    try {\n      // Calling service save()\n      if (this.debug) console.debug('[table] Calling dataSource.save()...');\n      const isOK = await this._dataSource.save();\n\n      if (isOK) this.markAsPristine();\n\n      return isOK;\n    } catch (err) {\n      this.setError((err && err.message) || err);\n      throw err;\n    } finally {\n      this.markAsSaved();\n\n      // Restore previous row\n      if (isNotNil(previouslyEditedRowId)) {\n        await this.selectRowByIdOrData(previouslyEditedRowId, previouslyEditedData);\n      }\n    }\n  }\n\n  cancel(event?: Event, opts?: { interactive?: boolean }) {\n    // Check confirmation\n    if ((!opts || opts.interactive !== false) && this.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observed)) {\n      event?.stopPropagation();\n      this.canCancelRows().then((confirm) => {\n        // If confirmed, loop\n        if (confirm) this.cancel(null, { interactive: false });\n      });\n      return;\n    }\n\n    this.emitRefresh();\n  }\n\n  async duplicateRow(\n    event?: Event,\n    row?: TableElement<T>,\n    opts?: {\n      includedProperties?: string[];\n      excludedProperties?: string[];\n    }\n  ) {\n    event?.stopPropagation();\n\n    row = row || this.singleSelectedRow;\n    if (!row || !this.confirmEditCreate(event, row)) {\n      return false;\n    }\n\n    const newRow = await this.addRowToTable(row.id + 1);\n    if (!newRow) throw new Error('Cannot add new row to table');\n\n    const source = row.cloneData();\n    let target: any;\n\n    // Copy included properties only\n    if (isNotEmptyArray(opts?.includedProperties)) {\n      target = {};\n      // Clone (deep copy)\n      opts.includedProperties.forEach((path) => {\n        setPropertyByPath(target, path, getPropertyByPath(source, path));\n      });\n    }\n\n    // Copy all properties\n    else {\n      target = source;\n\n      // Clean id and updateDate\n      EntityUtils.cleanIdAndUpdateDate(target, undefined);\n    }\n\n    // Restore excluded properties (e.g. rankOrder, etc)\n    if (isNotEmptyArray(opts?.excludedProperties)) {\n      const newData = newRow.currentData;\n      opts.excludedProperties.forEach((path) => {\n        setPropertyByPath(target, path, getPropertyByPath(newData, path));\n      });\n    }\n\n    if (newRow.validator) {\n      newRow.validator.patchValue(target);\n      newRow.validator.markAsDirty();\n    } else {\n      if (newRow.currentData?.fromObject) {\n        newRow.currentData.fromObject(target);\n      } else {\n        newRow.currentData = target;\n      }\n      this.markAsDirty();\n    }\n\n    // select\n    this.clickRow(undefined, newRow);\n  }\n\n  /** Whether the number of selected elements matches the total number of rows. */\n  isAllSelected() {\n    // DEBUG\n    //console.debug('isAllSelected. lengths', this.selection.selected.length, this.totalRowCount);\n\n    return this.selection.selected.length === this.totalRowCount || this.selection.selected.length === this.visibleRowCount;\n  }\n\n  /** Selects all rows if they are not all selected; otherwise clear selection. */\n  async masterToggle() {\n    if (this.loading) return;\n    if (this.isAllSelected()) {\n      this.selection.clear();\n    } else {\n      const rows = this._dataSource.getRows();\n      this.selection.setSelection(...rows);\n    }\n  }\n\n  async deleteSelection(event: Event, opts?: { interactive?: boolean; messageKey?: string }): Promise<number> {\n    const deleteCount = await this.deleteRows(event, this.selection.selected, opts);\n    if (deleteCount > 0) this.selection.clear();\n    return deleteCount;\n  }\n\n  /**\n   *\n   * @param event\n   * @param row\n   * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)\n   *  And to force deletion even if table is busy\n   */\n  async deleteRow(event: Event | null, row: TableElement<T>, opts?: { interactive?: boolean }): Promise<boolean> {\n    const deleteCount = await this.deleteRows(event, [row], opts);\n    return deleteCount === 1;\n  }\n\n  /**\n   *\n   * @param event\n   * @param rows\n   * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)\n   *    And to force deletion even if table is busy\n   */\n  async deleteRows(event: Event | null, rows: TableElement<T>[], opts?: { interactive?: boolean; messageKey?: string }): Promise<number> {\n    if (this.readOnly) {\n      throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };\n    }\n    if (event?.defaultPrevented) return 0; // SKip\n    event?.preventDefault();\n    this.resetError();\n\n    if (!this._enabled || isEmptyArray(rows)) return 0; // Skip is disabled, or no rows to delete\n\n    if (this.loading && (!opts || opts.interactive !== false)) {\n      console.warn('[app-table] Skip deleteRows() because table is busy (loading). Use opts.interactive = false to force deletion');\n      return 0; // Skip if loading\n    }\n\n    // Make sure to keep newly created row\n    if (this.editedRow?.id === -1 && this.editedRow.editing && !rows.includes(this.editedRow)) {\n      const confirmed = this.confirmEditCreate();\n      if (!confirmed) return 0; // Cannot delete (e.g. edited row is invalid)\n    }\n\n    // Check if can delete\n    const canDelete = await this.canDeleteRows(rows, opts);\n    if (!canDelete) return 0; // Cannot delete\n\n    // Reverse row order (on a copy)\n    // This is a workaround, need because row.delete() has async execution\n    // and index cache is updated with a delay\n    let tempRows = rows.slice().sort((a, b) => (a.id > b.id ? -1 : 1));\n\n    const deletedRows: TableElement<T>[] = [];\n\n    // If data need to be saved first\n    if (this.saveBeforeDelete) {\n      // Exclude invalid rows (because of save() will fail, when exists some invalid rows)\n      tempRows = tempRows.filter((row) => {\n        // Delete the row :\n        // - if newly created row (id = -1),\n        // - or if invalid and not editing (= not cancellable)\n        if (row.id === -1 || (!row.editing && row.invalid) /*do not use !valid because if row is disabled, it will be always !valid */) {\n          if (this.debug) console.debug(`[table] Delete row #${row.id}`);\n          this.selection.deselect(row);\n          row.delete();\n          this.visibleRowCount--;\n          this.totalRowCount--;\n          deletedRows.push(row);\n          if (this.editedRow === row) this.editedRow = undefined;\n          return false; // Exclude from the list to delete using the service\n        }\n        // Cancel the row (and mark as pristine), when not valid but in edition\n        else if (row.editing && !row.valid) {\n          this.selection.deselect(row);\n          row.cancel();\n          // Mark row as pristine (if possible)\n          this.checkIfRowPristine(row, { emitEvent: false, onlySelf: true /*avoid propagation to table*/ });\n          return true; // Keep the row. the row will be deleted after the save\n        }\n\n        return true;\n      });\n\n      // Apply save, only if there is still some rows to delete\n      // WARN: If no more rows (e.g. because all has been cancelled) then continue anyway to clear editedRow and selection (issue IMAGINE-669)\n      if (deletedRows.length || tempRows.length) {\n        // Save data (e.g. when using memory service)\n        const saved = await this.saveBeforeAction('delete');\n        if (!saved) {\n          // Stop if save cancelled or save failed\n          return;\n        }\n      }\n    }\n\n    try {\n      // Apply deletion on datasource\n      // If no more rows to delete, continue anyway to clear editedRow and selection (issue IMAGINE-669)\n      if (tempRows.length) {\n        if (this.debug) console.debug(`[table] Delete ${tempRows.length} rows...`);\n        await this._dataSource.deleteAll(tempRows);\n      }\n\n      // DO not update manually, because watchALl().subscribe() will update this count\n      //this.totalRowCount -= deleteCount;\n      //this.visibleRowCount -= deleteCount;\n\n      // Deselect deleted rows\n      this.selection.deselect(...rows);\n\n      this.editedRow = undefined;\n      this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });\n      this.markForCheck();\n\n      this.onAfterDeletedRows.next(rows);\n\n      return rows.length;\n    } catch (err) {\n      this.setError((err && err.message) || err);\n      throw err;\n    }\n  }\n\n  async selectRowById(id: number): Promise<boolean> {\n    if (id === undefined) return false;\n    await this.waitIdle();\n    const row = this.dataSource.getRow(id);\n    if (!row) return false;\n    return this.clickRow(null, row);\n  }\n\n  /**\n   * Try to select row by data. Will use equals() to find same row's data\n   *\n   * @param data\n   */\n  async selectRowByData(data: T): Promise<boolean> {\n    if (data === undefined) return Promise.resolve(false);\n    await this.waitIdle();\n    const row = this.dataSource.getRows().find((row) => this.equals(row.currentData, data));\n    if (!row) return false;\n    return this.clickRow(null, row);\n  }\n\n  toggleSelectRow(event: Event | undefined, row: TableElement<T>) {\n    // /!\\ DO NOT prevent default, otherwise the checkbox will not be updated\n    //event?.preventDefault();\n    event?.stopPropagation();\n    this.selection.toggle(row);\n  }\n\n  clickRow(event: Event | undefined, row: TableElement<T>): boolean {\n    if (this.loading) {\n      // Wait while loading, and loop\n      if (this.debug) console.debug('[table] Waiting before apply clickRow() (datasource is busy)...');\n      this.waitIdle({ timeout: 2000 }).then(() => this.clickRow(event, row));\n      return false;\n    }\n\n    // DEBUG\n    //console.debug('[table] Detect click on row');\n\n    // Cancelled by event\n    if (event?.defaultPrevented) {\n      if (this.debug) console.debug('[table] clickRow event is defaultPrevented');\n      return false;\n    }\n\n    // Call onClickRow if observed\n    if (this.onClickRow.observed) {\n      this.onClickRow.next(row);\n      return true;\n    }\n\n    // Open the detail page (if not inline editing)\n    if (!this.inlineEdition) {\n      if (this._openingRow) return; // Prevent double click\n\n      if (event) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n\n      this._openingRow = true; // Prevent double click\n      this.markAsLoading();\n\n      this.openRow(row.currentData.id, row)\n        .catch((err) => console.error('Failed to open row', err)) // Continue\n        .then(() => {\n          this.markAsLoaded();\n\n          // Prevent double click (use an open throttle time)\n          if (this.openRowThrottleTime > 0) {\n            setTimeout(() => {\n              this._openingRow = false;\n            }, this.openRowThrottleTime);\n          } else {\n            this._openingRow = false;\n          }\n        });\n\n      return true;\n    }\n\n    // Start editing row\n    return this.editRow(event, row, { focusColumn: undefined /*force to use the click target*/ });\n  }\n\n  moveRow(id: number, direction: number) {\n    this.dataSource.move(id, direction);\n  }\n\n  ready(opts?: WaitForOptions): Promise<void> {\n    return waitForTrue(this.readySubject, { stop: this.destroySubject, ...opts });\n  }\n\n  waitIdle(opts?: WaitForOptions): Promise<void> {\n    if (!this.loadingSubject.value) return Promise.resolve();\n    return waitForFalse(this.loadingSubject, { stop: this.destroySubject, ...opts });\n  }\n\n  async openSelectColumnsModal(event?: Event): Promise<any> {\n    event?.preventDefault();\n\n    // Copy current columns (deep copy)\n    const columns = this.getCurrentColumns();\n\n    const hasTopModal = !!(await this.modalCtrl.getTop());\n    const modal = await this.modalCtrl.create({\n      component: TableSelectColumnsComponent,\n      componentProps: { columns },\n      cssClass: hasTopModal && 'stack-modal',\n    });\n\n    // Open the modal\n    await modal.present();\n\n    // On dismiss\n    const { data } = await modal.onDidDismiss();\n    if (!data) return; // CANCELLED\n\n    // Apply columns\n    const userColumns = (data || []).filter((c) => c.canHide === false || c.visible).map((c) => c.name) || [];\n    this.displayedColumns = RESERVED_START_COLUMNS.concat(userColumns).concat(RESERVED_END_COLUMNS);\n    this.markForCheck();\n\n    // Update user settings\n    await this.savePageSettings(userColumns, SETTINGS_DISPLAY_COLUMNS);\n  }\n\n  trackByFn(index: number, row: TableElement<T>): any {\n    return row.id;\n  }\n\n  doRefresh(event?: CompletableEvent, opts?: { emitEvent?: boolean }) {\n    this.emitRefresh(opts);\n\n    // When target wait for a complete (e.g. IonRefresher)\n    if (event?.target && event.target.complete) {\n      setTimeout(async () => {\n        await this.waitIdle();\n        event.target.complete();\n      });\n    }\n  }\n\n  getCurrentColumns(): ColumnItem[] {\n    const hiddenColumns = this.columns.slice(RESERVED_START_COLUMNS.length).filter((name) => this.displayedColumns.indexOf(name) === -1);\n    return this.displayedColumns\n      .concat(hiddenColumns)\n      .filter((name) => !RESERVED_START_COLUMNS.includes(name) && !RESERVED_END_COLUMNS.includes(name) && !this.excludesColumns.includes(name))\n      .map((name) => ({\n        name,\n        label: this.getI18nColumnName(name),\n        visible: this.displayedColumns.indexOf(name) !== -1,\n        canHide: this.getRequiredColumns().indexOf(name) === -1,\n      }));\n  }\n\n  escapeEditingRow(event?: Event, row?: TableElement<T>) {\n    row = row || this.editedRow;\n    if (!row || !row.editing) return;\n\n    // DEBUG\n    //console.debug('[app-table] Cancel the row (keydown.escape)');\n\n    if (event) {\n      // Avoid to cancel the editor\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    // If new row (no id)\n    if (row.id === -1) {\n      if (row.validator) {\n        // If pending: Wait end of validation, then loop\n        if (row.pending) {\n          AppFormUtils.waitWhilePending(row.validator).then(() => this.escapeEditingRow(event, row));\n          return;\n        }\n\n        // Row is invalid: delete the row\n        if (row.invalid) {\n          this.deleteNewRow(event, row);\n          return;\n        }\n      }\n    }\n    // If the row exists (has an id)\n    else {\n      // Call cancel function ,\n      // - if confirmation will be called before\n      // - or if row is pristine (not dirty)\n      if (this.confirmBeforeCancel || !row.dirty) {\n        this.cancelExistingRow(event, row, { keepEditing: false });\n        return;\n      }\n    }\n\n    // By default, try to confirm the row\n    this.confirmEditCreate(event, row);\n  }\n\n  translateFormPath(path: string): string {\n    // Can be overridden by subclasses, to resolve all field name\n\n    // Use columns key, has default name\n    const i18nColumnKey = this.getI18nColumnName(path);\n    return this.translate?.instant(i18nColumnKey) || i18nColumnKey;\n  }\n\n  /* -- protected method -- */\n\n  protected editRow(event: Event | undefined, row: TableElement<T>, opts?: { focusColumn?: string }): boolean {\n    if (!this._enabled || !this.inlineEdition) return false;\n    if (this.editedRow === row) return true; // Already the edited row\n    if (event?.defaultPrevented) return false;\n\n    const confirmed = this.confirmEditCreate();\n    if (!confirmed) return false;\n\n    if (!row.editing && !this.loading) {\n      this.focusColumn = opts?.focusColumn ?? this.focusColumn;\n      this._dataSource.startEdit(row);\n    }\n    this.editedRow = row;\n    this.onStartEditingRow.emit(row);\n    return true;\n  }\n\n  /**\n   * Try to select row, by row.id, or by data. WIll use EntityUtils.equals()\n   *\n   * @param id\n   * @param data\n   * @protected\n   */\n  protected async selectRowByIdOrData(id: number, data?: T): Promise<boolean> {\n    let done = false;\n    try {\n      // Select by row id (if NOT a new row)\n      if (isNotNil(id) || id !== -1) {\n        done = await this.selectRowById(id);\n        if (done) return true;\n        console.warn('[app-table] Save: Cannot reselect row by row.id: ', id);\n      }\n\n      // Try by data\n      if (data) {\n        done = await this.selectRowByData(data);\n        if (done) return true;\n        console.warn('[app-table] Save: Cannot reselect row by data: ', data);\n      }\n\n      return false;\n    } catch (err) {\n      // Log, but continue\n      console.error((err && err.message) || err);\n      return false;\n    }\n  }\n\n  /**\n   * return the selected row if unique in selection\n   */\n  protected get singleSelectedRow(): TableElement<T> {\n    return this.selection.selected?.length === 1 ? this.selection.selected[0] : undefined;\n  }\n\n  protected async canDeleteRows(rows: TableElement<T>[], opts?: { interactive?: boolean; messageKey?: string }): Promise<boolean> {\n    // Check using emitter\n    if (this.onBeforeDeleteRows.observed) {\n      try {\n        const canDelete = await emitPromiseEvent(this.onBeforeDeleteRows, 'canDelete', {\n          detail: { rows },\n        });\n        if (!canDelete) return false;\n      } catch (err) {\n        if (err === 'CANCELLED') return false; // User cancel\n        console.error('Error while checking if can delete rows', err);\n        throw err;\n      }\n    }\n\n    // Ask user confirmation\n    if (this.confirmBeforeDelete && (!opts || opts.interactive !== false)) {\n      return this.askDeleteConfirmation(null, rows, opts);\n    }\n    return true;\n  }\n\n  protected async canCancelRows(rows?: TableElement<T>[], opts?: { interactive?: boolean }): Promise<boolean> {\n    // Get dirty rows\n    rows = rows || this.dataSource.getRows().filter((row) => row.validator?.dirty);\n\n    if (isEmptyArray(rows)) return true; // No dirty: OK\n\n    // Check using emitter\n    if (this.onBeforeCancelRows.observed) {\n      try {\n        const isCancel = await emitPromiseEvent(this.onBeforeCancelRows, 'canCancel', {\n          detail: { rows },\n        });\n        if (!isCancel) return false;\n      } catch (err) {\n        if (err === 'CANCELLED') return false; // User cancel\n        console.error('Error while checking if can cancel rows', err);\n        throw err;\n      }\n    }\n\n    // Ask user confirmation\n    if (this.confirmBeforeCancel && (!opts || opts.interactive !== false)) {\n      return this.askCancelConfirmation(null, rows);\n    }\n    return true;\n  }\n\n  protected async saveBeforeAction(saveAction: SaveActionType): Promise<boolean> {\n    if (!this.dirty) {\n      // Continue without save\n      return true;\n    }\n\n    let save: boolean;\n    switch (saveAction) {\n      case 'delete':\n        save = this.saveBeforeDelete;\n        break;\n      case 'filter':\n        save = this.saveBeforeFilter;\n        break;\n      case 'sort':\n        save = this.saveBeforeSort;\n        break;\n      default:\n        save = true;\n    }\n\n    // Default behavior\n    let confirmed = true;\n\n    if (save) {\n      if (this.onBeforeSave.observed) {\n        // Ask confirmation\n        try {\n          const res = await emitPromiseEvent(this.onBeforeSave, 'beforeSave', {\n            detail: { action: saveAction, valid: this.valid },\n          });\n          confirmed = res.confirmed;\n          save = res.save;\n        } catch (err) {\n          if (err === 'CANCELLED') return false; // User cancel\n          console.error('Error while checking if can delete rows', err);\n          throw err;\n        }\n      }\n    }\n\n    if (confirmed) {\n      if (save) {\n        // User confirmed save\n        const saved = await this.save();\n        this.markAsDirty(); // Restore dirty flag\n        return saved;\n      }\n      return true; // No save but continue action\n    }\n\n    return false; // User cancel the action\n  }\n\n  /**\n   * Open a row detail view. By default, will to open row detail page.\n   * Can be overridden by subclasses, BUT prefer to subscribe on onOpenRow\n   *\n   * @param id\n   * @param row\n   * @protected\n   */\n  protected async openRow(id: ID, row: TableElement<T>): Promise<boolean> {\n    if (this.allowRowDetail) {\n      if (this.debug && this.dirty) {\n        console.warn('[table] Opening row details, but table has unsaved changes!');\n      }\n\n      if (this.onOpenRow.observed) {\n        // Clear selection (because next route can change the current table content)\n        this.selection.clear();\n        this.onOpenRow.emit(row);\n        return true;\n      }\n\n      // No ID defined: unable to open details\n      if (isNil(id)) {\n        console.warn('[table] Opening row details, but data has no id!');\n        return false;\n      }\n\n      // Clear selection (because next route can change the current table content)\n      this.selection.clear();\n\n      return this.navController.navigateForward(['.', id], {\n        relativeTo: this.route,\n        queryParams: {},\n      });\n    }\n    return false;\n  }\n\n  protected async openNewRowDetail(event?: any): Promise<boolean> {\n    if (!this.allowRowDetail) return false;\n\n    if (this.onNewRow.observed) {\n      this.onNewRow.emit(event);\n      return true;\n    }\n\n    // Clear selection (because next route can change the current table content)\n    this.selection.clear();\n\n    return this.navController.navigateForward(['.', 'new'], {\n      relativeTo: this.route,\n      queryParams: {},\n    });\n  }\n\n  // can be overridden to add more required columns\n  protected getRequiredColumns() {\n    return DEFAULT_REQUIRED_COLUMNS;\n  }\n\n  protected getUserColumns(): string[] {\n    return this.getPageSettings(SETTINGS_DISPLAY_COLUMNS);\n  }\n\n  protected getSortedColumn(): MatSortable {\n    const data = this.getPageSettings(SETTINGS_SORTED_COLUMN);\n    const parts = data && data.split(':');\n    if (parts && parts.length === 2 && this.columns.includes(parts[0])) {\n      return { id: parts[0], start: parts[1] === 'desc' ? 'desc' : 'asc', disableClear: false };\n    }\n    if (this.defaultSortBy) {\n      return { id: this.defaultSortBy, start: this.defaultSortDirection || 'asc', disableClear: false };\n    }\n    return { id: 'id', start: 'asc', disableClear: false };\n  }\n\n  protected getPageSize(): number {\n    const pageSize = this.getPageSettings<number>(SETTINGS_PAGE_SIZE);\n    return pageSize || this.defaultPageSize;\n  }\n\n  protected getDisplayColumns(): string[] {\n    let userColumns = this.getUserColumns();\n\n    // No user override\n    if (!userColumns) {\n      // Return default, without columns to hide\n      return this.columns.filter((column) => !this.excludesColumns.includes(column));\n    }\n\n    // Get fixed start columns\n    const fixedStartColumns = this.columns.filter((c) => RESERVED_START_COLUMNS.includes(c));\n\n    // Remove end columns\n    const fixedEndColumns = this.columns.filter((c) => RESERVED_END_COLUMNS.includes(c));\n\n    // Remove fixed columns from user columns\n    userColumns = userColumns.filter((c) => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && this.columns.includes(c));\n\n    // Add required columns if missing\n    userColumns.push(\n      ...this.getRequiredColumns().filter((c) => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && !userColumns.includes(c))\n    );\n\n    return (\n      fixedStartColumns\n        .concat(userColumns)\n        .concat(fixedEndColumns)\n        // Remove columns to hide\n        .filter((column) => !this.excludesColumns.includes(column))\n    );\n  }\n\n  /**\n   * Recompute display columns\n   *\n   * @protected\n   */\n  protected updateColumns() {\n    this.displayedColumns = this.getDisplayColumns();\n    if (!this.loading) this.markForCheck();\n  }\n\n  protected registerSubscription(sub: Subscription) {\n    this._subscription.add(sub);\n  }\n\n  protected unregisterSubscription(sub: Subscription) {\n    this._subscription.remove(sub);\n  }\n\n  protected registerAutocompleteField<E = any, EF = any>(\n    fieldName: string,\n    options?: MatAutocompleteFieldAddOptions<E, EF>\n  ): MatAutocompleteFieldConfig<E, EF> {\n    return this._autocompleteConfigHolder.add(fieldName, options);\n  }\n\n  protected getI18nColumnName(columnName: string) {\n    return (this.i18nColumnPrefix || '') + changeCaseToUnderscore(columnName).toUpperCase();\n  }\n\n  protected generateTableId() {\n    // noinspection JSNonASCIINames\n    const meta = this.constructor['ɵcmp'];\n    // Get a component unique name - See https://stackoverflow.com/questions/60114682/how-to-access-components-unique-encapsulation-id-in-angular-9\n    const componentId = (meta && (meta.selectors?.[0] || meta.id)) || this.constructor.name;\n    const id =\n      this.location\n        .path(true)\n        .replace(/[?].*$/g, '')\n        .replace(/\\/\\d+/g, '_id') +\n      '_' +\n      componentId;\n    //if (this.debug) console.debug('[table] id = ' + id);\n    return id;\n  }\n\n  protected async addRowToTable(\n    insertAt?: number,\n    opts?: { focusColumn?: string; editing?: boolean; emitEvent?: boolean }\n  ): Promise<TableElement<T> | undefined> {\n    // Try to finish edited row first\n    if (!this.confirmEditCreate()) {\n      console.warn('[table] Cannot add new row, because the previous edited row cannot be confirmed');\n      return undefined;\n    }\n\n    const editing = this.inlineEdition && opts?.editing !== false; // true by default, if inlineEdition\n\n    const row = await this._dataSource.createNew(insertAt, { editing });\n    if (!row) return undefined;\n\n    if (row.editing) {\n      // Update focused column\n      this.focusFirstColumn = true;\n      this.focusColumn = opts?.focusColumn || this.firstUserColumn;\n\n      // Emit start editing event\n      this.editedRow = row;\n      this.onStartEditingRow.emit(row);\n    }\n\n    this.totalRowCount++;\n    this.visibleRowCount++;\n\n    this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });\n\n    // Emit event\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n\n    return row;\n  }\n\n  protected registerCellValueChanges(name: string, formPath?: string, emitInitialValue?: boolean): Observable<any> {\n    formPath = formPath || name;\n    emitInitialValue = emitInitialValue || false;\n    let def = this._cellValueChangesDefs[name];\n    if (def && (def.formPath !== formPath || def.emitInitialValue !== emitInitialValue)) {\n      throw Error(\"Already register a cell value change for this name, with different 'formPath' or 'emitInitialValue'. Please use same arguments.\");\n    }\n\n    // Not exists: register new definition\n    if (!def) {\n      if (this.debug) console.debug(`[table] New listener {${name}} for value changes on path ${formPath}`);\n      def = {\n        subject: new Subject<any>(),\n        subscription: null,\n        formPath,\n        emitInitialValue,\n      };\n      this._cellValueChangesDefs[name] = def;\n\n      // Start the listener, when editing starts\n      this.registerSubscription(this.onStartEditingRow.subscribe((row) => this.startCellValueChanges(name, row)));\n    }\n\n    return def.subject;\n  }\n\n  protected setShowColumn(columnName: string, show: boolean, opts?: { emitEvent?: boolean }) {\n    if (!this.excludesColumns.includes(columnName) !== show) {\n      if (!show) {\n        this.excludesColumns.push(columnName);\n      } else {\n        const index = this.excludesColumns.findIndex((value) => value === columnName);\n        if (index >= 0) this.excludesColumns.splice(index, 1);\n      }\n\n      // Recompute display columns\n      if (this.displayedColumns && (!opts || opts.emitEvent !== false)) {\n        this.updateColumns();\n      }\n    }\n  }\n\n  protected getShowColumn(columnName: string): boolean {\n    return !this.excludesColumns.includes(columnName);\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected detectChanges() {\n    this.cd.detectChanges();\n  }\n\n  protected async askDeleteConfirmation(\n    event?: Event,\n    rows?: TableElement<T>[],\n    opts?: {\n      messageKey?: string;\n    }\n  ): Promise<boolean> {\n    if (isNotNilOrBlank(opts?.messageKey)) {\n      return Alerts.askConfirmation(opts.messageKey, this.alertCtrl, this.translate, event);\n    }\n\n    if (this.undoableDeletion) {\n      // Special message, for undoable deletion\n      return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.DELETE_ROW' : 'CONFIRM.DELETE_ROWS', this.alertCtrl, this.translate, event);\n    }\n    // Immediate deletion action\n    return Alerts.askActionConfirmation(this.alertCtrl, this.translate, true, event);\n  }\n\n  protected async askCancelConfirmation(event?: Event, rows?: TableElement<T>[]): Promise<boolean> {\n    return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.CANCEL_ROW' : 'CONFIRM.CANCEL_ROWS', this.alertCtrl, this.translate, event);\n  }\n\n  protected async askRestoreConfirmation(event?: Event): Promise<boolean> {\n    return Alerts.askActionConfirmation(this.alertCtrl, this.translate, false, event);\n  }\n\n  protected async showToast(opts: ShowToastOptions) {\n    if (!this.toastController) throw new Error(\"Missing toastController in component's constructor\");\n    return Toasts.show(this.toastController, this.translate, opts);\n  }\n\n  protected resetError(opts?: { emitEvent?: boolean }) {\n    this.setError(undefined, opts);\n  }\n\n  protected getRowError(row?: TableElement<T>, opts?: FormErrorTranslateOptions): string {\n    row = row || this.editedRow;\n    if (!row || !this.formErrorAdapter) return undefined;\n\n    return this.formErrorAdapter.translateFormErrors(row.validator, {\n      ...this.errorTranslateOptions,\n      ...opts,\n    });\n  }\n\n  protected setError(value: string, opts?: { emitEvent?: boolean }) {\n    if (this.errorSubject.value !== value) {\n      this.errorSubject.next(value);\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  /**\n   * Compare data equality (default by id, using EntityUtils.equals())\n   * Can be overridden to add additional properties to compare\n   *\n   * @param d1\n   * @param d2\n   * @protected\n   */\n  protected equals(d1: T, d2: T): boolean {\n    return EntityUtils.equals(d1, d2, 'id');\n  }\n\n  protected markRowAsDirty(row?: TableElement<T>, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    row = row || this.editedRow;\n    if (row) row.validator?.markAsDirty(opts);\n    this.markAsDirty(opts);\n  }\n\n  protected getPageSettings<T = any>(propertyName?: string): T {\n    return this.settings.getPageSettings(this.settingsId, propertyName);\n  }\n\n  protected async savePageSettings(value: any, propertyName?: string, opts?: { emitEvent?: boolean }) {\n    await this.settings.savePageSetting(this.settingsId, value, propertyName, opts);\n  }\n\n  protected emitRefresh(opts?: { emitEvent?: boolean }) {\n    // Emit onRefresh if not closed (can happen if component is destroyed to early)\n    if (!!this.onRefresh && !this.onRefresh.closed) {\n      this.onRefresh.emit(opts);\n    }\n  }\n\n  /**\n   * Initialize the permanent selection model\n   *\n   * @protected\n   */\n  protected initPermanentSelection() {\n    if (this.permanentSelection) throw new Error('initPermanentSelection() already called!');\n\n    this.permanentSelection = new SelectionModel<T>(true, []);\n\n    // Listen sort change\n    this.registerSubscription(\n      this.onSort.subscribe(() => (this.permanentSelectionChangedPrevented = true)) // prevent selection change on sort\n    );\n\n    // Listen datasource update\n    this.registerSubscription(\n      this.dataSource.rowsSubject\n        // restore the 'adding' selection (for example after a page or sort change)\n        .subscribe((rows) => {\n          this.permanentSelectionChangedPrevented = true;\n          try {\n            const permanentSelectionIds = (this.permanentSelection.selected || []).map(EntityUtils.getId);\n            this.selection.setSelection(...rows.filter((row) => permanentSelectionIds.includes(AppTableUtils.getEntityId(row))));\n            this.markForCheck();\n          } finally {\n            this.permanentSelectionChangedPrevented = false;\n          }\n        })\n    );\n\n    // Listen selection change\n    this.registerSubscription(\n      this.selection.changed.pipe(filter(() => !this.permanentSelectionChangedPrevented)).subscribe((selectionChange) => {\n        // add to selection\n        if (selectionChange.added.length) {\n          this.permanentSelection.setSelection(\n            ...(this.permanentSelection.selected || [])\n              // Add new elements\n              .concat(...AppTableUtils.getEntities(selectionChange.added).filter(EntityUtils.hasId))\n              // Avoid duplicated entities (Mantis #55351)\n              .filter(EntityUtils.arrayDistinctFilterFn)\n          );\n        }\n        // remove from selection\n        if (selectionChange.removed.length) {\n          const removedIds = AppTableUtils.getEntityIds(selectionChange.removed);\n          this.permanentSelection.setSelection(\n            ...(this.permanentSelection.selected || []).filter((entity) => EntityUtils.hasId(entity) && !removedIds.includes(entity.id))\n          );\n        }\n        this.markForCheck();\n      })\n    );\n  }\n\n  /* -- private method -- */\n\n  private async listenSortAndPaginationEvents() {\n    if (!this.table) {\n      // DEBUG only -- alert user that table not found in template\n      if (this.debug) {\n        setTimeout(\n          () =>\n            !this.table &&\n            console.warn(`[table] Missing <mat-table> in the HTML template (after waiting 500ms)! Component: ${this.constructor.name}`),\n          500\n        );\n      }\n\n      // Make sure to wait the table\n      await waitFor(() => !!this.table, { stop: this.destroySubject, stopError: false /*avoid error when destorying the table*/ });\n    }\n\n    this.registerSubscription(\n      merge(\n        // Listen sort events\n        (this.sort &&\n          this.sort.sortChange.pipe(\n            filter(() => !this.sort.disabled),\n            mergeMap(async () => this.saveBeforeAction('sort')),\n            filter((res) => res === true),\n            // Save sort in settings\n            tap(() => {\n              const value = [this.sort.active, this.sort.direction || 'asc'].join(':');\n              this.savePageSettings(value, SETTINGS_SORTED_COLUMN);\n            })\n          )) ||\n          EMPTY,\n\n        // Listen paginator events\n        (this.paginator &&\n          this.paginator.page.pipe(\n            mergeMap((_) => this.saveBeforeAction('sort')),\n            filter((saved) => saved === true),\n            // Save page size in settings\n            tap(() => this.savePageSettings(this.paginator.pageSize, SETTINGS_PAGE_SIZE))\n          )) ||\n          EMPTY\n      )\n        // Refresh on any sort or paginator events\n        .subscribe((value) => {\n          this.onSort.emit(value);\n          this.emitRefresh();\n        })\n    );\n\n    // If the user changes the sort order, reset back to the first page.\n    if (this.sort && this.paginator) {\n      this.registerSubscription(this.sort.sortChange.pipe(filter(() => !this.sort.disabled)).subscribe(() => (this.paginator.pageIndex = 0)));\n    }\n  }\n\n  private async editOrAddRowById(event: Event | undefined, id: number, opts?: { focusColumn?: string }) {\n    if (id < 0) return;\n    if (id >= this.visibleRowCount) {\n      this.addRow(event, undefined, { ...opts, editing: true });\n    } else {\n      const row = await this.dataSource.getRow(id);\n      this.editRow(event, row, opts);\n    }\n  }\n\n  private setLoading(value: boolean, opts?: { emitEvent?: boolean }) {\n    if (!this.loadingSubject.closed && this.loadingSubject.value !== value) {\n      this.loadingSubject.next(value);\n\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  private deleteNewRow(event: Event | undefined, row: TableElement<T>) {\n    // Make sure row will be cancelled, and NOT deleted\n    if (row.id !== -1) throw new Error('Row must have id = -1');\n    event?.stopPropagation();\n\n    this.selection.clear();\n    this.editedRow = undefined; // unselect row\n    this._dataSource.cancelOrDelete(row);\n    this.resetError();\n\n    this.onCancelOrDeleteRow.next(row);\n    this.totalRowCount--;\n    this.visibleRowCount--;\n  }\n\n  private deleteExistingRow(event: Event | null, row: TableElement<T>, opts?: { interactive?: boolean }) {\n    // Make sure row will be cancelled, and NOT deleted\n    if (row.id === -1) throw new Error('Row must have an id');\n\n    if (event?.defaultPrevented) return 0; // SKip\n    event?.preventDefault();\n\n    this.deleteRow(null, row, opts);\n  }\n\n  private cancelExistingRow(event: Event | undefined, row: TableElement<T>, opts?: { interactive?: boolean; keepEditing?: boolean }) {\n    // Make sure row will be cancelled, and NOT deleted\n    if (row.id === -1 || !row.editing) throw new Error('Row cannot be canceling, but only deleting');\n\n    const confirmed = !opts || opts.interactive !== false;\n\n    // Ask user confirmation, if cancel\n    if (!confirmed && row.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observed)) {\n      event?.stopPropagation();\n      this.canCancelRows([row], opts).then((confirm) => {\n        // If confirmed, loop\n        if (confirm) this.cancelExistingRow(event, row, { interactive: false });\n      });\n      return;\n    }\n\n    const keepEditing = row.editing && (!opts || opts.keepEditing !== false);\n    this.editedRow = undefined; // unselect row\n    this._dataSource.cancelOrDelete(row);\n    this.onCancelOrDeleteRow.next(row);\n\n    // Mark row as pristine\n    this.checkIfRowPristine(row);\n\n    // Restore editing state\n    if (keepEditing) {\n      this.editRow(undefined, row);\n    }\n  }\n\n  private async checkIfRowPristine(row: TableElement<T>, opts?: { emitEvent?: boolean; onlySelf?: boolean }) {\n    // Mark row as pristine\n    const markRowAsPristine = this.dataSource?.config.restoreOriginalDataOnCancel === true;\n    if (markRowAsPristine) {\n      row.validator?.markAsPristine();\n\n      // Check if table is now pristine\n      if (!opts || opts.onlySelf !== true) {\n        await this.checkIfPristine(opts);\n      }\n    }\n  }\n\n  private async checkIfPristine(opts?: { emitEvent?: boolean }) {\n    if (!this.dirty) return; // Already pristine\n\n    const rows = this._dataSource.getRows();\n    const pristine = (rows || []).findIndex((row) => row.dirty) === -1;\n    if (pristine) this.markAsPristine(opts);\n  }\n\n  private applyFilter(filter: F, opts: { emitEvent?: boolean }) {\n    if (this.debug) console.debug('[table] Applying filter', filter);\n    this._filter = filter;\n    if (opts && opts.emitEvent) {\n      if (this.paginator && this.paginator.pageIndex > 0) {\n        this.paginator.pageIndex = 0;\n      }\n      this.emitRefresh();\n    }\n  }\n\n  private listenDataSourceLoading(dataSource: EntitiesTableDataSource<T, F, ID>) {\n    if (!dataSource) throw new Error('[table] dataSource not set !');\n\n    // Cleaning previous subscription on datasource\n    if (isNotNil(this._dataSourceLoadingSubscription)) {\n      if (this.debug) console.debug('[table] Many call to listenDatasource(): Cleaning previous subscriptions...');\n      this._dataSourceLoadingSubscription.unsubscribe();\n      this.unregisterSubscription(this._dataSourceLoadingSubscription);\n    }\n\n    // Propage loading to table\n    this._dataSourceLoadingSubscription = this._dataSource.loadingSubject\n      .pipe(\n        filter(isNotNil), // filter out 'undefined'\n        distinctUntilChanged(),\n\n        // If changed to True: propagate as soon as possible\n        tap((loading) => loading && this.setLoading(true)),\n\n        // If changed to False: wait 250ms before propagate (to make sure the spinner has been displayed)\n        debounceTime(250),\n        tap((loading) => !loading && this.setLoading(false))\n      )\n      .subscribe();\n    this.registerSubscription(this._dataSourceLoadingSubscription);\n  }\n\n  private startCellValueChanges(name: string, row: TableElement<T>) {\n    const def = this._cellValueChangesDefs[name];\n    if (!def) {\n      console.warn(`[table] Listener with name {${name} not registered! Please call registerCellValueChanges() before`);\n      return;\n    }\n    // Stop previous subscription\n    if (def.subscription) {\n      def.subscription.unsubscribe();\n      def.subscription = null;\n    } else {\n      if (this.debug) console.debug(`[table] Start values changes on row path {${def.formPath}}`);\n    }\n\n    const control = getControlFromPath(row.validator, def.formPath);\n\n    // Emit the actual value\n    if (def.emitInitialValue !== false) {\n      def.subject.next(control?.value ?? null);\n    }\n\n    if (!control) {\n      if (this.debug) console.warn(`[table] Could not listen cell changes: no validator or invalid form path {${def.formPath}}`);\n    } else {\n      // Listen value changes, and redirect to event emitter\n      def.subscription = control.valueChanges\n        .pipe(\n          // don't emit if control is disabled\n          filter(() => control.enabled)\n        )\n        .subscribe((value) => def.subject.next(value));\n    }\n  }\n\n  private stopCellValueChanges(name: string, destroy?: boolean) {\n    const def = this._cellValueChangesDefs[name];\n    if (!def) return;\n    if (def.subscription) {\n      if (this.debug) console.debug('[table] Stop value changes on row path {' + def.formPath + '}');\n      def.subscription.unsubscribe();\n      def.subscription = null;\n    }\n    if (destroy && def.subject) {\n      def.subject.complete();\n      def.subject.unsubscribe();\n    }\n  }\n}\n","import { Directive, Injector, Input, OnInit } from '@angular/core';\nimport { ValidatorService } from '@e-is/ngx-material-table';\nimport { EntitiesTableDataSourceConfig, EntitiesTableDataSource } from './entities-table-datasource.class';\nimport { AppTable } from './table.class';\nimport { IEntity } from '../services/model/entity.model';\nimport { InMemoryEntitiesService } from '../../shared/services/memory-entity-service.class';\n\n// @dynamic\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class AppInMemoryTable<T extends IEntity<T, ID>, F = any, ID = number> extends AppTable<T, F, ID> implements OnInit {\n  @Input() canEdit = false;\n  @Input() canDelete = false;\n\n  set value(data: T[]) {\n    this.setValue(data);\n  }\n\n  get value(): T[] {\n    return this.memoryDataService.value;\n  }\n\n  protected constructor(\n    injector: Injector,\n    protected columns: string[],\n    protected dataType: new () => T,\n    protected memoryDataService: InMemoryEntitiesService<T, F, ID>,\n    protected validatorService: ValidatorService,\n    options?: EntitiesTableDataSourceConfig<T, ID>,\n    filter?: F\n  ) {\n    super(injector, columns, new EntitiesTableDataSource<T, F, ID>(dataType, memoryDataService, validatorService, options), filter);\n\n    this.autoLoad = false; // waiting value to be set\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n  }\n\n  setValue(value: T[], opts?: { emitEvent?: boolean }) {\n    // Reset previous error\n    if (this.error) {\n      this.setError(null);\n      this.markForCheck();\n    }\n    this.memoryDataService.value = value;\n    if (!opts || opts.emitEvent !== false) {\n      this.emitRefresh();\n    }\n  }\n\n  protected equals(t1: T, t2: T): boolean {\n    return this.memoryDataService.equals(t1, t2);\n  }\n}\n","import {\n  booleanAttribute,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  TemplateRef,\n  ViewChild,\n} from '@angular/core';\nimport { AsyncTableElement, TableElement } from '@e-is/ngx-material-table';\nimport { MatColumnDef, MatTable } from '@angular/material/table';\nimport { MatMenuTrigger } from '@angular/material/menu';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\n@Component({\n  selector: 'app-actions-column',\n  styleUrls: ['./actions-column.component.scss'],\n  templateUrl: './actions-column.component.html',\n})\nexport class ActionsColumnComponent<T extends TableElement<any> | AsyncTableElement<any>> implements OnInit, OnDestroy {\n  @ViewChild(MatColumnDef) columnDef: MatColumnDef;\n  @ViewChild(MatMenuTrigger) matMenuTrigger: MatMenuTrigger;\n\n  @Input() matColumnDef = 'actions';\n  @Input() style: 'table' | 'mat-table' = 'table';\n  @Input({ transform: booleanAttribute }) showPendingSpinner = true;\n  @Input({ transform: booleanAttribute }) stickyEnd = false;\n  @Input({ transform: booleanAttribute }) canCancel: boolean;\n  @Input({ transform: booleanAttribute }) canConfirm: boolean;\n  @Input({ transform: booleanAttribute }) canDelete: boolean;\n  @Input({ transform: booleanAttribute }) canBackward: boolean;\n  @Input({ transform: booleanAttribute }) canForward: boolean;\n  @Input({ transform: booleanAttribute }) canConfirmAndAdd: boolean;\n  @Input() dirtyIcon: boolean | string;\n  @Input() optionsTitle = 'COMMON.BTN_OPTIONS';\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  @Input('class') classList: string;\n  @Input() cellTemplateStart: TemplateRef<{ $implicit: T }>;\n  @Input() cellTemplate: TemplateRef<{ $implicit: T }>;\n\n  @Output() optionsClick = new EventEmitter<Event>();\n  @Output() cancelOrDeleteClick = new EventEmitter<{ event: Event; row: T }>();\n  @Output() confirmEditCreateClick = new EventEmitter<{ event: Event; row: T }>();\n  @Output() confirmAndAddClick = new EventEmitter<{ event: Event; row: T }>();\n  @Output() backward = new EventEmitter<{ event: Event; row: T }>();\n  @Output() forward = new EventEmitter<{ event: Event; row: T }>();\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    private table: MatTable<any>,\n    private cd: ChangeDetectorRef\n  ) {\n    // TODO auto configure using AppTable ? (need a forwardRef() in the table component\n    //@Optional() private appTable: AppTable<any>\n    if (!table) throw new Error(`[actions-column] this column component must be inside a MatTable component`);\n  }\n\n  ngOnInit(): void {\n    this.cd.detectChanges();\n    this.table.addColumnDef(this.columnDef);\n    this.canCancel = this.canCancel ?? this.cancelOrDeleteClick.observed;\n    this.canConfirm = this.canConfirm ?? this.confirmEditCreateClick.observed;\n    this.canDelete = this.canDelete ?? this.cancelOrDeleteClick.observed;\n    this.canConfirmAndAdd = this.canConfirmAndAdd ?? this.confirmAndAddClick.observed;\n    this.canBackward = this.canBackward ?? this.backward.observed;\n    this.canForward = this.canForward ?? this.forward.observed;\n    this.dirtyIcon = this.dirtyIcon === true ? 'star' : this.dirtyIcon === false ? null : (this.dirtyIcon ?? 'star');\n  }\n\n  ngOnDestroy() {\n    this.table.removeColumnDef(this.columnDef);\n    this.optionsClick.complete();\n    this.optionsClick.unsubscribe();\n    this.cancelOrDeleteClick.complete();\n    this.cancelOrDeleteClick.unsubscribe();\n    this.confirmAndAddClick.complete();\n    this.confirmAndAddClick.unsubscribe();\n    this.backward.complete();\n    this.backward.unsubscribe();\n    this.forward.complete();\n    this.forward.unsubscribe();\n  }\n}\n","<ng-container [matColumnDef]=\"matColumnDef\" [stickyEnd]=\"stickyEnd\">\n  @switch (style) {\n    <!-- mat-table style (e.g. used in sumaris activity calendar) -->\n    @case ('table') {\n      <!-- header cell -->\n      <th mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n        <button\n          mat-icon-button\n          *ngIf=\"optionsClick.observed\"\n          [title]=\"!showTooltip ? (optionsTitle | translate) : ''\"\n          [matTooltip]=\"showTooltip ? (optionsTitle | translate) : ''\"\n          (click)=\"optionsClick.emit($event)\"\n        >\n          <mat-icon>more_vert</mat-icon>\n        </button>\n        <ng-content select=\"[matHeader]\"></ng-content>\n      </th>\n\n      <!-- row cell -->\n      <td mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n        <ng-container *ngTemplateOutlet=\"cellTemplateStart; context: { $implicit: row }\"></ng-container>\n\n        @let editing = row.editing;\n        @let dirty = row.dirty;\n        @let valid = row.valid;\n        @let pending = row.pending;\n        @let invalid = !pending && !valid;\n        @if (editing) {\n          <!-- pending -->\n          @if (pending && showPendingSpinner) {\n            <ion-spinner name=\"dots\" class=\"center\"></ion-spinner>\n          }\n\n          <!-- Confirm button -->\n          @if (canConfirm && dirty && valid) {\n            <button\n              mat-icon-button\n              color=\"light\"\n              [title]=\"!showTooltip ? ('COMMON.BTN_APPLY' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('COMMON.BTN_APPLY' | translate) : ''\"\n              (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n            >\n              <mat-icon>checkmark</mat-icon>\n            </button>\n          }\n\n          <!-- new row -->\n          @if (row.id === -1) {\n            <!-- delete button -->\n            @if (canDelete && invalid) {\n              <button\n                mat-icon-button\n                color=\"light\"\n                [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n                [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n                (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n              >\n                <mat-icon>delete_outline</mat-icon>\n              </button>\n            }\n\n            <!-- add button -->\n            @if (!canForward && canConfirmAndAdd && valid) {\n              <button\n                mat-icon-button\n                color=\"light\"\n                [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n                [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n                (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n              >\n                <mat-icon>add</mat-icon>\n              </button>\n            }\n\n            <!-- existing row -->\n          } @else if (canCancel && dirty) {\n            <!-- cancel button -->\n            <button\n              mat-icon-button\n              color=\"light\"\n              [title]=\"!showTooltip ? ('COMMON.BTN_UNDO' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('COMMON.BTN_UNDO' | translate) : ''\"\n              (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n            >\n              <mat-icon>undo</mat-icon>\n            </button>\n          }\n        } @else if (dirtyIcon && dirty) {\n          <!-- dirty icon -->\n          <ion-icon [name]=\"dirtyIcon\" color=\"accent\" class=\"dirty-icon\" tabindex=\"-1\"></ion-icon>\n        }\n\n        <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n\n        <!-- navigation buttons (invisible - focusable only) -->\n        @if (canForward && editing && valid) {\n          <!-- forward button -->\n          <button class=\"mat-row-action-button-navigation\" (focus)=\"forward.emit({ event: $event, row: row })\"></button>\n        } @else if (canBackward && !editing) {\n          <!-- backward button -->\n          <button\n            class=\"mat-row-action-button-navigation\"\n            (focus)=\"backward.emit({ event: $event, row: row })\"\n          ></button>\n        }\n      </td>\n\n      <td mat-footer-cell *matFooterCellDef>\n        <ng-content select=\"[matFooter]\"></ng-content>\n      </td>\n    }\n\n    <!-- mat-table style (e.g. used in sumaris activity calendar) -->\n    @case ('mat-table') {\n      <mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n        <button\n          mat-icon-button\n          *ngIf=\"optionsClick.observed\"\n          [title]=\"!showTooltip ? (optionsTitle | translate) : ''\"\n          [matTooltip]=\"showTooltip ? (optionsTitle | translate) : ''\"\n          (click)=\"optionsClick.emit($event)\"\n        >\n          <mat-icon>more_vert</mat-icon>\n        </button>\n        <ng-content select=\"[matHeader]\"></ng-content>\n      </mat-header-cell>\n      <mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n        <ng-container *ngTemplateOutlet=\"cellTemplateStart; context: { $implicit: row }\"></ng-container>\n        @if (row.editing) {\n          <!-- pending -->\n          @if (row.validator?.pending) {\n            <ion-spinner name=\"dots\" class=\"center\"></ion-spinner>\n          }\n\n          <!-- Confirm button -->\n          @if (canConfirm && row.validator?.dirty && row.validator.valid) {\n            <button\n              mat-icon-button\n              color=\"light\"\n              [title]=\"!showTooltip ? ('COMMON.BTN_APPLY' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('COMMON.BTN_APPLY' | translate) : ''\"\n              (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n            >\n              <mat-icon>checkmark</mat-icon>\n            </button>\n          }\n\n          <!-- new row -->\n          @if (row.id === -1) {\n            <!-- delete button -->\n            <button\n              mat-icon-button\n              color=\"light\"\n              *ngIf=\"canDelete && row.validator?.invalid\"\n              [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n              (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n            >\n              <mat-icon>delete_outline</mat-icon>\n            </button>\n\n            <!-- add button -->\n            @if (!canForward && canConfirmAndAdd && row.validator?.valid) {\n              <button\n                mat-icon-button\n                color=\"light\"\n                [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n                [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n                (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n              >\n                <mat-icon>add</mat-icon>\n              </button>\n            }\n\n            <!-- next button (invisible - focusable only) -->\n            @if (canForward && row.validator?.valid) {\n              <button\n                class=\"mat-row-action-button-navigation\"\n                (focus)=\"forward.emit({ event: $event, row: row })\"\n              ></button>\n            }\n\n            <!-- existing row -->\n          } @else {\n            <!-- cancel button -->\n            @if (canCancel && row.validator?.dirty) {\n              <button\n                mat-icon-button\n                color=\"light\"\n                [title]=\"!showTooltip ? ('COMMON.BTN_UNDO' | translate) : ''\"\n                [matTooltip]=\"showTooltip ? ('COMMON.BTN_UNDO' | translate) : ''\"\n                (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n              >\n                <mat-icon>undo</mat-icon>\n              </button>\n            }\n\n            <!-- next button (invisible - focusable only) -->\n            @if (canForward && row.validator?.valid) {\n              <button\n                class=\"mat-row-action-button-navigation\"\n                (focus)=\"forward.emit({ event: $event, row: row })\"\n              ></button>\n            }\n          }\n        } @else {\n          <!-- dirty icon -->\n          @if (dirtyIcon && row.validator?.dirty) {\n            <ion-icon [name]=\"dirtyIcon\" color=\"accent\" class=\"dirty-icon\"></ion-icon>\n          }\n\n          <!-- backward button (invisible - focusable only) -->\n          @if (canBackward) {\n            <button\n              class=\"mat-row-action-button-navigation\"\n              (focus)=\"backward.emit({ event: $event, row: row })\"\n            ></button>\n          }\n        }\n\n        <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n      </mat-cell>\n\n      <mat-footer-cell *matFooterCellDef>\n        <ng-content select=\"[matFooter]\"></ng-content>\n      </mat-footer-cell>\n    }\n  }\n</ng-container>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { ThemePalette } from '@angular/material/core';\nimport { PredefinedColors } from '@ionic/core';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\nimport { FormFieldDefinition } from '../../../shared/form/field.model';\nimport { MatColumnDef, MatTable } from '@angular/material/table';\nimport { AsyncTableElement, TableElement } from '@e-is/ngx-material-table';\nimport { AppFloatLabelType } from '../../../shared/types';\n\n@Component({\n  selector: 'app-row-field',\n  styleUrls: ['./row-field.component.scss'],\n  templateUrl: './row-field.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppRowField implements OnInit, OnDestroy {\n  @ViewChild(MatColumnDef) columnDef: MatColumnDef;\n\n  @Input() name!: string;\n  @Input() definition: FormFieldDefinition;\n  @Input() definitionFn: (row: TableElement<any> | AsyncTableElement<any>) => FormFieldDefinition;\n  @Input() headerI18n: string;\n  @Input() sortable = false;\n  @Input() resizable = false;\n  @Input() required: boolean;\n  @Input() readonly = false;\n  @Input() sticky = false;\n  @Input() draggable = false;\n  @Input() disabled: boolean;\n  @Input() placeholder: string;\n  @Input() compact = false;\n  @Input() floatLabel: AppFloatLabelType = 'auto';\n  @Input() appearance: MatFormFieldAppearance;\n  @Input() tabindex: number;\n  @Input() autofocus: boolean;\n\n  @Input() clearable: boolean;\n  @Input() chipColor: ThemePalette | PredefinedColors = null;\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  @Input('class') classList: string;\n  @Input() debug = false;\n\n  protected logPrefix = '[row-field]';\n\n  constructor(\n    // protected translate: TranslateService,\n    protected cd: ChangeDetectorRef,\n    // protected injector: Injector,\n    public matTable: MatTable<any>\n  ) {\n    if (!matTable) {\n      throw new Error(`${this.logPrefix} this column component must be inside a MatTable`);\n    }\n  }\n\n  ngOnInit() {\n    this.cd.detectChanges();\n    this.matTable.addColumnDef(this.columnDef);\n  }\n\n  ngOnDestroy() {\n    this.matTable.removeColumnDef(this.columnDef);\n  }\n}\n","<ng-container [matColumnDef]=\"name\" [sticky]=\"sticky\">\n  <th mat-header-cell *matHeaderCellDef cdkDrag [cdkDragDisabled]=\"sticky || !draggable\" [resizable]=\"resizable\">\n    <!-- if sortable, wrap the header with a mat-sort-header -->\n    @if (sortable) {\n      <span mat-sort-header>\n        <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\n      </span>\n    } @else {\n      <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\n    }\n    <ng-template #headerTemplate>\n      <ion-label appAutoTitle>{{ headerI18n | translate }}</ion-label>\n      @if (required) {\n        <ion-label color=\"danger\" [innerHTML]=\"'&nbsp;*'\"></ion-label>\n      }\n    </ng-template>\n  </th>\n  <td mat-cell *matCellDef=\"let row\">\n    @if (!readonly && row.editing) {\n      <app-form-field\n        [definition]=\"definition || definitionFn(row)\"\n        [required]=\"required\"\n        [readonly]=\"readonly\"\n        [disabled]=\"disabled\"\n        [formControl]=\"row.validator | formGetControl: name\"\n        [placeholder]=\"placeholder\"\n        [compact]=\"compact\"\n        [floatLabel]=\"floatLabel\"\n        [appearance]=\"appearance\"\n        [tabindex]=\"tabindex\"\n        [autofocus]=\"autofocus\"\n        [clearable]=\"clearable\"\n        [chipColor]=\"chipColor\"\n        [class]=\"classList\"\n        [debug]=\"debug\"\n      ></app-form-field>\n    } @else {\n      <ion-label appAutoTitle>\n        {{ row.currentData | propertyGet: name | valueFormat: definition || definitionFn(row) }}\n      </ion-label>\n    }\n  </td>\n</ng-container>\n","import { AppInMemoryTable } from '../../table/memory-table.class';\nimport { ChangeDetectionStrategy, Component, Directive, inject, Inject, Injector, Input, OnInit, ViewChild } from '@angular/core';\nimport { RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../../table/table.model';\nimport { InMemoryEntitiesService } from '../../../shared/services/memory-entity-service.class';\nimport { Entity, EntityAsObjectOptions, EntityUtils } from '../../services/model/entity.model';\nimport { AppValidatorService } from '../../services/validator/base.validator.class';\nimport { AbstractControl, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { FormFieldDefinition, FormFieldDefinitionMap } from '../../../shared/form/field.model';\nimport { isNotNil, splitByProperty } from '../../../shared/functions';\nimport { Environment, ENVIRONMENT } from '../../../../environments/environment.class';\nimport { TableElement } from '@e-is/ngx-material-table';\nimport { EntityClass } from '../../services/model/entity.decorators';\nimport { EntityFilter } from '../../services/model/filter.model';\nimport { FilterFn, Property } from '../../../shared/types';\nimport { debounceTime, filter, tap } from 'rxjs/operators';\nimport { AppFormUtils } from '../form.utils';\nimport { MatExpansionPanel } from '@angular/material/expansion';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\n@EntityClass({ typename: 'PropertyEntity' })\nexport class PropertyEntity extends Entity<PropertyEntity, string> implements Property {\n  static fromObject: (source: any, opts?: any) => PropertyEntity;\n\n  definition: FormFieldDefinition = null;\n  value: any = null;\n\n  get key(): string {\n    return this.definition?.key || this.id;\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.id = source.definition?.key ?? source.key ?? source.id;\n    this.definition = source.definition;\n    this.value = source.value;\n  }\n\n  asObject(opts?: EntityAsObjectOptions): any {\n    const target = super.asObject(opts);\n    target.id = this.definition.key;\n    delete target.definition;\n    return target;\n  }\n}\n\nexport class PropertyEntityFilter extends EntityFilter<PropertyEntityFilter, PropertyEntity> {\n  static fromObject: (source, opts?: any) => PropertyEntityFilter;\n\n  searchText: string;\n  notDefaultOnly = false;\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.searchText = source.searchText;\n    this.notDefaultOnly = source.notDefaultOnly;\n  }\n\n  asObject(opts?: EntityAsObjectOptions): any {\n    return super.asObject(opts);\n  }\n\n  protected buildFilter(): FilterFn<PropertyEntity>[] {\n    const filterFns = super.buildFilter();\n\n    const searchTextFilter = EntityUtils.searchTextFilter('definition.translatedName', this.searchText);\n    if (searchTextFilter) filterFns.push(searchTextFilter);\n\n    if (this.notDefaultOnly) {\n      filterFns.push((data) => isNotNil(data.value) && data.definition.defaultValue !== data.value);\n    }\n\n    return filterFns;\n  }\n\n  protected isCriteriaNotEmpty(key: string, value: any): boolean {\n    if (key === 'notDefaultOnly') return value === true;\n    return super.isCriteriaNotEmpty(key, value);\n  }\n}\n\n@Directive()\nexport class PropertyEntityValidator extends AppValidatorService<PropertyEntity> {\n  constructor(protected formBuilder: UntypedFormBuilder) {\n    super(formBuilder, null);\n  }\n\n  getFormGroupConfig(data?: PropertyEntity): { [p: string]: any } {\n    return {\n      id: [data?.id ?? null],\n      definition: [data?.definition || null, Validators.required],\n      value: [data?.value ?? null],\n    };\n  }\n}\n\n@Component({\n  selector: 'app-properties-table',\n  templateUrl: 'properties.table.html',\n  styleUrls: ['properties.table.scss'],\n  providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppPropertiesTable extends AppInMemoryTable<PropertyEntity, PropertyEntityFilter, string> implements OnInit {\n  @Input() definitions: FormFieldDefinition[];\n  @Input() showToolbar = true;\n  @ViewChild(MatExpansionPanel, { static: true }) filterExpansionPanel: MatExpansionPanel;\n\n  definitionsMapByKey: FormFieldDefinitionMap = {};\n  filterForm: UntypedFormGroup;\n  filterCriteriaCount = 0;\n  filterPanelFloating = true;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected injector: Injector,\n    protected formBuilder: UntypedFormBuilder,\n    protected validatorService: PropertyEntityValidator,\n    @Inject(ENVIRONMENT) environment: Environment\n  ) {\n    super(\n      injector,\n      [...RESERVED_START_COLUMNS, 'definition', 'value', ...RESERVED_END_COLUMNS],\n      PropertyEntity,\n      new InMemoryEntitiesService(PropertyEntity, PropertyEntityFilter, {\n        sortByReplacement: { definition: 'definition.label' },\n      }),\n      validatorService\n    );\n\n    this.inlineEdition = true;\n    this.defaultSortBy = 'definition';\n    this.defaultSortDirection = 'asc';\n    this.debug = !environment?.production;\n\n    this.filterForm = formBuilder.group({\n      searchText: [],\n      notDefaultOnly: [null],\n    });\n\n    this.autoLoad = false;\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Fill definitions map\n    this.definitions = (this.definitions || []).map((def) => {\n      return {\n        ...def,\n        label: this.translate.instant(def.label),\n      };\n    });\n    this.definitionsMapByKey = splitByProperty(this.definitions, 'key');\n\n    this.registerCellValueChanges('definition').subscribe((definition) => {\n      if (isNotNil(definition) && this.editedRow?.id === -1) {\n        this.editedRow.validator.patchValue({ id: definition.key, value: definition.defaultValue });\n      }\n    });\n\n    this.registerCellValueChanges('value').subscribe(() => {\n      this.markAsDirty();\n    });\n\n    this.registerSubscription(\n      this.filterForm.valueChanges\n        .pipe(\n          debounceTime(250),\n          filter((_) => {\n            const valid = this.filterForm.valid;\n            if (!valid && this.debug) AppFormUtils.logFormErrors(this.filterForm);\n            return valid;\n          }),\n          // Update the filter\n          tap((json) => this.setFilter(json))\n        )\n        .subscribe()\n    );\n\n    this.resetFilter();\n\n    this.markAsReady();\n  }\n\n  get value(): PropertyEntity[] {\n    let values = super.value || [];\n\n    // remove unset options\n    values = values.filter((property) => isNotNil(property.value !== property.definition.defaultValue));\n\n    return values;\n  }\n\n  set value(data: PropertyEntity[]) {\n    super.value = data;\n  }\n\n  definitionByRow = (row: TableElement<PropertyEntity>): FormFieldDefinition => this.definitionsMapByKey[row.currentData.id];\n\n  setValue(value: PropertyEntity[], opts?: { emitEvent?: boolean }) {\n    // Build entities\n    const target: PropertyEntity[] = this.definitions.map((definition) => {\n      const property = (value || [])?.find((source) => source.key === definition.key);\n      const propertyValue = property?.value ?? definition.defaultValue;\n      // Convert to entity\n      return PropertyEntity.fromObject({\n        id: definition.key,\n        definition,\n        // get user value or default value\n        value: propertyValue,\n      });\n    });\n\n    super.setValue(target, opts);\n  }\n\n  clearControlValue(event: Event, formControl: AbstractControl): boolean {\n    if (event) event.stopPropagation(); // Avoid to enter input the field\n    formControl.setValue(null);\n    return false;\n  }\n\n  resetFilter(value?: any, opts?: { emitEvent: boolean }) {\n    const f = <PropertyEntityFilter>{ searchText: null, notDefaultOnly: false, ...value };\n    this.filterForm.reset(f, opts);\n    this.setFilter(f || null, opts);\n    this.filterCriteriaCount = 0;\n    if (this.filterExpansionPanel && this.filterPanelFloating) this.filterExpansionPanel.close();\n    this.resetError();\n  }\n\n  setFilter(filter: PropertyEntityFilter, opts?: { emitEvent?: boolean }) {\n    filter = this.dataSource.dataService.asFilter(filter);\n\n    // Update criteria count\n    const criteriaCount = filter.countNotEmptyCriteria();\n    if (criteriaCount !== this.filterCriteriaCount) {\n      this.filterCriteriaCount = criteriaCount;\n      this.markForCheck();\n    }\n\n    // Update the form content\n    if (this.filterForm && (!opts || opts.emitEvent !== false)) {\n      this.filterForm.patchValue(filter.asObject(), { emitEvent: false });\n    }\n\n    super.setFilter(filter as PropertyEntityFilter, opts);\n  }\n\n  get filterIsEmpty(): boolean {\n    return this.filterCriteriaCount === 0;\n  }\n\n  toggleFilterPanelFloating() {\n    this.filterPanelFloating = !this.filterPanelFloating;\n    this.markForCheck();\n  }\n\n  closeFilterPanel() {\n    if (this.filterExpansionPanel) this.filterExpansionPanel.close();\n    this.filterPanelFloating = true;\n  }\n\n  applyFilterAndClosePanel(event?: Event) {\n    const filter = this.filterForm.value;\n    this.setFilter(filter, { emitEvent: false });\n    this.emitRefresh();\n    if (this.filterPanelFloating) this.filterExpansionPanel?.close();\n  }\n\n  resetProperty(event: UIEvent, row: TableElement<PropertyEntity>) {\n    event?.preventDefault();\n    row.validator.patchValue({ value: row.currentData.definition.defaultValue });\n    this.confirmEditCreate();\n    this.markRowAsDirty();\n  }\n}\n","<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n  <!-- Refresh -->\n  <button\n    mat-icon-button\n    *ngIf=\"!mobile\"\n    [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n    [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n    (click)=\"emitRefresh()\"\n  >\n    <mat-icon>refresh</mat-icon>\n  </button>\n\n  <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n\n  <div class=\"toolbar-spacer\"></div>\n\n  <!-- Reset filter -->\n  <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n    <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n    <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n  </button>\n\n  <!-- Show filter -->\n  <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n    <mat-icon\n      [matBadge]=\"filterCriteriaCount\"\n      [matBadgeHidden]=\"filterIsEmpty\"\n      matBadgeColor=\"accent\"\n      matBadgeSize=\"small\"\n      matBadgePosition=\"above after\"\n      aria-hidden=\"false\"\n    >\n      filter_list_alt\n    </mat-icon>\n  </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n  <!-- search -->\n  <mat-expansion-panel\n    #filterExpansionPanel\n    class=\"filter-panel\"\n    [class.ion-no-padding]=\"mobile\"\n    [class.filter-panel-floating]=\"filterPanelFloating\"\n  >\n    <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <!-- search -->\n            <mat-form-field>\n              <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n              <input matInput formControlName=\"searchText\" />\n\n              <button\n                mat-icon-button\n                matSuffix\n                tabindex=\"-1\"\n                type=\"button\"\n                (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n                [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n              >\n                <mat-icon>close</mat-icon>\n              </button>\n            </mat-form-field>\n          </ion-col>\n\n          <ion-col>\n            <mat-boolean-field\n              [style]=\"'checkbox'\"\n              formControlName=\"notDefaultOnly\"\n              [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n              floatLabel=\"always\"\n            ></mat-boolean-field>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    </form>\n\n    <mat-action-row>\n      <!-- Counter  -->\n      <ion-label\n        [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n        [color]=\"empty && 'danger'\"\n        class=\"ion-padding\"\n      >\n        {{\n          (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n            | translate\n              : {\n                  count: (totalRowCount | numberFormat),\n                }\n        }}\n      </ion-label>\n\n      <div class=\"toolbar-spacer\"></div>\n\n      <button\n        mat-icon-button\n        color=\"accent\"\n        *ngIf=\"filterPanelFloating\"\n        (click)=\"toggleFilterPanelFloating()\"\n        class=\"hidden-xs hidden-sm hidden-md\"\n        [title]=\"!showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n      >\n        <mat-icon>\n          <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '&#xbb;' : '&#xab;' }}</span>\n        </mat-icon>\n      </button>\n\n      <!-- Close panel -->\n      <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n        <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n      </ion-button>\n\n      <!-- Search button -->\n      <ion-button\n        mat-button\n        [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n        [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n        (click)=\"applyFilterAndClosePanel($event)\"\n        [disabled]=\"loadingSubject | async\"\n      >\n        <ion-text translate>COMMON.BTN_APPLY</ion-text>\n      </ion-button>\n    </mat-action-row>\n  </mat-expansion-panel>\n\n  <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n    <ion-refresher-content></ion-refresher-content>\n  </ion-refresher>\n\n  <!-- table -->\n  <div class=\"table-container\">\n    <table\n      #table\n      mat-table\n      matSort\n      matSortDisableClear\n      [dataSource]=\"dataSource\"\n      [matSortActive]=\"defaultSortBy\"\n      [matSortDirection]=\"defaultSortDirection\"\n      [trackBy]=\"trackByFn\"\n      [style.--mat-row-height]=\"'52px'\"\n    >\n      <ng-container matColumnDef=\"select\">\n        <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n        <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n      </ng-container>\n\n      <!-- id column (hidden) -->\n      <ng-container matColumnDef=\"id\">\n        <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n        <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n          {{ row.currentData.id }}\n        </td>\n      </ng-container>\n\n      <!-- definition column -->\n      <ng-container matColumnDef=\"definition\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n          <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n          {{ row.currentData | propertyGet: 'definition.label' }}\n        </td>\n      </ng-container>\n\n      <!-- value column -->\n      <app-row-field\n        name=\"value\"\n        floatLabel=\"never\"\n        [definitionFn]=\"definitionByRow\"\n        [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n        [required]=\"true\"\n      ></app-row-field>\n\n      <!-- Actions buttons column -->\n      <app-actions-column\n        [stickyEnd]=\"true\"\n        [canCancel]=\"false\"\n        [canDelete]=\"false\"\n        [dirtyIcon]=\"false\"\n        [cellTemplate]=\"cellInjection\"\n      >\n        <!-- cell injection-->\n        <ng-template #cellInjection let-row>\n          <button\n            type=\"button\"\n            mat-icon-button\n            *ngIf=\"\n              !mobile &&\n              !disabled &&\n              (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n            \"\n            [class.visible-hover-row]=\"!mobile\"\n            [tabindex]=\"-1\"\n            [title]=\"!showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n            (click)=\"resetProperty($event, row)\"\n          >\n            <mat-icon>undo</mat-icon>\n          </button>\n        </ng-template>\n      </app-actions-column>\n\n      <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n      <tr\n        mat-row\n        *matRowDef=\"let row; columns: displayedColumns\"\n        [class.mat-row-selected]=\"row.editing\"\n        [class.mat-row-error]=\"row.validator?.invalid\"\n        [class.mat-row-dirty]=\"row.validator?.dirty\"\n        (click)=\"clickRow($event, row)\"\n        (keydown.escape)=\"escapeEditingRow($event)\"\n        [cdkTrapFocus]=\"row.validator?.invalid\"\n      ></tr>\n    </table>\n\n    <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n      <ion-item>\n        <ion-skeleton-text animated></ion-skeleton-text>\n      </ion-item>\n    </ng-container>\n\n    <ng-template #noResult>\n      <ion-item *ngIf=\"totalRowCount === 0\">\n        <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n      </ion-item>\n    </ng-template>\n  </div>\n</ion-content>\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform } from '@angular/core';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { AbstractSelectionModelPipe } from '../../shared/pipes/selection.pipes';\nimport { AppTable } from './table.class';\nimport { Observable, Subscription } from 'rxjs';\nimport { AppAsyncTable } from './async-table.class';\n\nexport type AppTableRowCountProperty = 'visibleRowCount' | 'totalRowCount';\n\n@Pipe({\n  name: 'abstract-table-selection',\n})\nexport abstract class AbstractTableSelectionPipe<R, O, T extends AppTable<any> | AppAsyncTable<any> = AppTable<any> | AppAsyncTable<any>>\n  extends AbstractSelectionModelPipe<any, R, O>\n  implements PipeTransform, OnDestroy\n{\n  private _onRowsChanges: Subscription;\n\n  protected constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n\n  transform(selectionOrTable: SelectionModel<any> | T, tableOrOpts?: T | O, opts?: O): R {\n    const _table: T = this.isTable(tableOrOpts) ? tableOrOpts : this.isTable(selectionOrTable) ? selectionOrTable : undefined;\n    const _selection: SelectionModel<any> = _table?.selection || (selectionOrTable as SelectionModel<any>);\n    const _opts: O = opts || (!this.isTable(tableOrOpts) && (tableOrOpts as O));\n    return super.transform(_selection, _table, _opts);\n  }\n\n  private isTable(obj: any): obj is T {\n    return obj && typeof obj === 'object' && 'dataSource' in obj && 'selection' in obj;\n  }\n\n  protected _subscribe(selection: SelectionModel<any>, table?: T, opts?: O): Subscription {\n    this._onRowsChanges = ((table as T)?.dataSource?.rowsSubject as Observable<any>)?.subscribe((_) => {\n      const result = this._transform(selection, table, opts);\n      if (result !== this._result) {\n        this._result = result;\n        this._ref.markForCheck();\n      }\n    });\n\n    return super._subscribe(selection, table);\n  }\n\n  protected _dispose() {\n    super._dispose();\n    this._onRowsChanges?.unsubscribe();\n    this._onRowsChanges = null;\n  }\n}\n\n@Pipe({\n  name: 'isAllSelected',\n  pure: false,\n})\nexport class IsAllSelectedPipe extends AbstractTableSelectionPipe<boolean, AppTableRowCountProperty> implements PipeTransform, OnDestroy {\n  constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n\n  protected _transform(\n    selection: SelectionModel<any>,\n    table: AppTable<any>,\n    countPropertyName: AppTableRowCountProperty = 'visibleRowCount'\n  ): boolean {\n    return selection.selected.length === table?.[countPropertyName];\n  }\n}\n\n@Pipe({\n  name: 'isNotAllSelected',\n  pure: false,\n})\nexport class IsNotAllSelectedPipe extends IsAllSelectedPipe implements PipeTransform, OnDestroy {\n  constructor(_ref: ChangeDetectorRef) {\n    super(_ref);\n  }\n\n  protected _transform(\n    selection: SelectionModel<any>,\n    table: AppTable<any>,\n    countPropertyName: AppTableRowCountProperty = 'visibleRowCount'\n  ): boolean {\n    return selection.hasValue() && selection.selected.length !== table?.[countPropertyName];\n  }\n}\n","// noinspection DuplicatedCode\n\nimport { AsyncTableDataSource, AsyncTableElement, TableDataSourceConfig, ValidatorService } from '@e-is/ngx-material-table';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { IEntity } from '../services/model/entity.model';\nimport { ErrorCodes } from '../services/errors';\nimport { catchError, debounceTime, filter, map, takeUntil } from 'rxjs/operators';\nimport { Directive, OnDestroy } from '@angular/core';\nimport { SortDirection } from '@angular/material/sort';\nimport { CollectionViewer } from '@angular/cdk/collections';\nimport { EntitiesServiceWatchOptions, FetchMoreFn, IEntitiesService, LoadResult } from '../../shared/services/entity-service.class';\nimport { firstFalsePromise, FirstOptions } from '../../shared/observables';\nimport { isEmptyArray, isNotEmptyArray, isNotNil, removeEnd, sleep } from '../../shared/functions';\nimport { AppTableUtils } from './table.utils';\nimport { environment } from '../../../environments/environment';\nimport { IEntitiesTableDataSource } from './table.model';\n\nexport interface EntitiesAsyncTableDataSourceConfig<\n  T extends IEntity<T, ID>,\n  ID = number,\n  WO extends EntitiesServiceWatchOptions = EntitiesServiceWatchOptions,\n  SO = any,\n> extends TableDataSourceConfig {\n  onRowCreated?: (row: AsyncTableElement<T>) => Promise<void> | void;\n  saveOnlyDirtyRows?: boolean;\n  readOnly?: boolean;\n\n  /**\n   * @deprecated\n   */\n  dataServiceOptions?: WO & SO; // Options passed to the dataService.watchAll() and dataService.saveAll()\n\n  watchAllOptions?: WO; // Options passed to the dataService.saveAll()\n  saveAllOptions?: SO; // Options passed to the dataService.saveAll()\n\n  [key: string]: any;\n}\n\n// @dynamic\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class EntitiesAsyncTableDataSource<\n    T extends IEntity<T, ID>,\n    F = any,\n    ID = number,\n    WO extends EntitiesServiceWatchOptions = EntitiesServiceWatchOptions,\n    SO = any,\n    V extends ValidatorService = ValidatorService,\n    C extends EntitiesAsyncTableDataSourceConfig<T, ID, WO, SO> = EntitiesAsyncTableDataSourceConfig<T, ID, WO, SO>,\n    R extends AsyncTableElement<T> = AsyncTableElement<T>,\n  >\n  extends AsyncTableDataSource<T, V, C, R>\n  implements IEntitiesTableDataSource<R>, OnDestroy\n{\n  private readonly _entityName: string;\n\n  protected _debug = false;\n  protected _creating = false;\n  protected _fetchMoreFn: FetchMoreFn<LoadResult<T>> = null;\n  protected _waitingNetworkResult: boolean;\n  protected _stopWatchSubject = new Subject<void>();\n\n  loadingSubject = new BehaviorSubject<boolean>(undefined);\n  savingSubject = new BehaviorSubject<boolean>(false);\n\n  get watchAllOptions(): WO {\n    return this.config.watchAllOptions;\n  }\n\n  set watchAllOptions(value: WO) {\n    this.config.watchAllOptions = value;\n  }\n\n  get saveAllOptions(): SO {\n    return this.config.saveAllOptions;\n  }\n\n  set saveAllOptions(value: SO) {\n    this.config.saveAllOptions = value;\n  }\n\n  get loaded(): boolean {\n    return this.loadingSubject.getValue() === false; // Should be false when undefined (initial state)\n  }\n\n  get loading(): boolean {\n    return this.loadingSubject.getValue() !== false; // Should be true when undefined (initial state)\n  }\n\n  get saving(): boolean {\n    return this.savingSubject.getValue();\n  }\n\n  /**\n   * Creates a new TableDataSource instance, that can be used as datasource of `@angular/cdk` data-table.\n   *\n   * @param dataService A service to load and save data\n   * @param dataType Type of data contained by the Table. If not specified, then `data` with at least one element must be specified.\n   * @param validatorService Service that create instances of the FormGroup used to validate row fields.\n   * @param options Additional options\n   */\n  constructor(\n    dataType: new () => T,\n    public readonly dataService: IEntitiesService<T, F, WO>,\n    validatorService?: V,\n    options?: C\n  ) {\n    super([], dataType, validatorService, {\n      keepOriginalDataAfterConfirm: false,\n      readOnly: false,\n      saveOnlyDirtyRows: false,\n      ...options,\n    });\n\n    this._entityName = removeEnd(new dataType().__typename || 'UnknownVO', 'VO');\n    this._debug = options?.suppressErrors === false && !environment.production;\n  }\n\n  ngOnDestroy() {\n    this.disconnect();\n  }\n\n  watchAll(offset: number, size: number, sortBy?: string, sortDirection?: SortDirection, filter?: Partial<F>): Observable<LoadResult<T>> {\n    this._stopWatchSubject.next();\n    this._fetchMoreFn = null;\n    this.markAsLoading();\n    this._waitingNetworkResult = (this.watchAllOptions?.fetchPolicy || this.dataService?.defaultFetchPolicy) === 'cache-and-network';\n\n    return this.dataService.watchAll(offset, size, sortBy, sortDirection, filter, this.watchAllOptions).pipe(\n      catchError((err) => this.handleError(err, 'ERROR.LOAD_DATA_ERROR')),\n      map((res: LoadResult<T>) => {\n        if (this.saving) {\n          console.info(`[entities-table-datasource] Received ${this._entityName} data (from service), but still saving: skip`);\n        } else {\n          if (!this.config.suppressErrors && this.hasSomeDirtyRow()) {\n            console.warn(`[entities-table-datasource] Received ${this._entityName} data, while some row still dirty. Some data can be lost`);\n          }\n\n          this.updateDatasource((res.data || []) as T[]);\n          this._fetchMoreFn = res.fetchMore;\n        }\n\n        // Reset _waitingNetworkResult to false\n        this._waitingNetworkResult = false;\n\n        return res;\n      }),\n      // Stop this pipe next time we call watchAll()\n      takeUntil(this._stopWatchSubject)\n      // ⚠ Notice: Don't put any operator after takeUntil to avoid potential subscription leaks\n    );\n  }\n\n  protected updateDatasourceFromRows(rows: R[]) {\n    // Avoid to update dataSourceSubject, when not need\n    if (this.datasourceSubject.observed) {\n      if (!this.config.suppressErrors)\n        console.warn(\"[entities-table-datasource] Update datasource subject. Please prefer using 'rowsSubject' instead of 'datasourceSubject'\");\n      super.updateDatasourceFromRows(rows);\n    } else {\n      console.debug('[entities-table-datasource] Skipping datasourceSubject update (not used yet).');\n    }\n  }\n\n  async save(): Promise<boolean> {\n    if (this.config.readOnly) {\n      console.error('[entities-table-datasource] Enable to save, because config.readOnly=true');\n      return false;\n    }\n    // Saving twice (should never occur)\n    if (this.saving) {\n      console.warn(`[entities-table-datasource] Trying to save ${this._entityName} rows twice. Skip`);\n      return false;\n    }\n\n    this.markAsSaving();\n\n    const onlyDirtyRows = this.config.saveOnlyDirtyRows;\n\n    try {\n      if (this._debug) console.debug(`[entities-table-datasource] Saving ${this._entityName} rows... {onlyDirtyRows: ${onlyDirtyRows}}`);\n\n      // Get all rows\n      const rows = this.getRows();\n\n      // Finish editing all rows\n      const invalidRows: AsyncTableElement<T>[] = (\n        await Promise.all(this.getEditingRows().map((row) => row.confirmEditCreate().then((confirmed) => (confirmed === false ? row : null))))\n      ).filter(isNotNil);\n\n      // Cannot finish some rows: error\n      if (invalidRows.length) {\n        // log errors\n        if (this._debug)\n          invalidRows.forEach((row) => AppTableUtils.logRowErrors(row, `[entities-table-datasource] ${this._entityName} row #${row.id}`));\n        // Stop with an error\n        throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };\n      }\n\n      let data: T[];\n      let dataToSave: T[];\n\n      if (this.validatorService) {\n        dataToSave = [];\n        data = rows.map((row) => {\n          const currentData = new this.dataConstructor() as T;\n          currentData.fromObject(row.currentData);\n          // Filter to keep only dirty row\n          if (onlyDirtyRows && row.validator.dirty) dataToSave.push(currentData);\n          return currentData;\n        });\n        if (!onlyDirtyRows) dataToSave = data;\n      }\n      // Or use the current data without conversion (when no validator service used)\n      else {\n        data = rows.map((row) => row.currentData);\n        // save all data, as we don't have any dirty marker\n        dataToSave = data;\n      }\n\n      // If no data to save: exit\n      if (onlyDirtyRows && !dataToSave.length) {\n        if (this._debug) console.debug(`[entities-table-datasource] No ${this._entityName} data to save. Skip`);\n        return false;\n      }\n\n      if (this._debug) console.debug(`[entities-table-datasource] Asking service to save this ${this._entityName} data:`, dataToSave);\n      await this.dataService.saveAll(dataToSave, this.saveAllOptions);\n\n      if (this._debug) console.debug(`[entities-table-datasource] Saving ${this._entityName} data [OK]`);\n\n      // LP 23/03/2021: update datasource is necessary but can be changed to a refetch() on QueryRef (must be created and registered in GraphqlService.watchQuery)\n      this.updateDatasource(data);\n\n      return true;\n    } catch (error) {\n      if (this._debug) console.error(('[entities-table-datasource] Error while saving: ' + error && error.message) || error);\n      throw error;\n    } finally {\n      this.markAsSaved();\n    }\n  }\n\n  updateDatasource(data: T[], opts?: { emitEvent: boolean }) {\n    if (this._debug) console.debug(`[entities-table-datasource] Updating datasource with data:`, data);\n\n    super.updateDatasource(data, opts);\n\n    if (!opts || opts.emitEvent !== false) {\n      this.markAsLoaded();\n    }\n  }\n\n  connect(collectionViewer: CollectionViewer): Observable<R[] | ReadonlyArray<R>> {\n    // DEBUG\n    //console.debug(\"[entities-datasource] connect\");\n    return super.connect(collectionViewer);\n  }\n\n  /**\n   * Disconnects the data source, cleaning up any resources and subscriptions.\n   *\n   * @param {CollectionViewer} [collectionViewer] - Optional parameter representing the collection viewer to disconnect from.\n   * @return {void} - This method does not return a value.\n   */\n  disconnect(collectionViewer?: CollectionViewer) {\n    if (this._debug) console.debug('[entities-table-datasource] Disconnecting...');\n    super.disconnect(collectionViewer);\n    if (!this._stopWatchSubject.closed) {\n      this._stopWatchSubject.next();\n      this._stopWatchSubject.complete();\n      this._stopWatchSubject.unsubscribe();\n      this.loadingSubject.complete();\n      this.loadingSubject.unsubscribe();\n    }\n  }\n\n  /**\n   * Waits for the idle state based on the provided options.\n   *\n   * @param {number | { debounceTimeMs?: number } & FirstOptions} [opts] Options for controlling the wait behavior.\n   *   - If a number is provided, it is treated as the debounce time in milliseconds.\n   *   - If an object is provided, it can include the following properties:\n   *     - debounceTimeMs: The debounce time in milliseconds. Defaults to 100 if not specified.\n   *     - Additional options from `FirstOptions` interface.\n   * @return {Promise<any>} A Promise that resolves when the idle state is reached.\n   */\n  waitIdle(opts?: number | ({ debounceTimeMs?: number } & FirstOptions)): Promise<any> {\n    const debounceTimeMs = typeof opts === 'number' ? opts : opts?.debounceTimeMs || 100; /* in case was not started */\n    opts = typeof opts === 'number' ? undefined : opts;\n    return firstFalsePromise(\n      this.loadingSubject.asObservable().pipe(\n        // Skip loaded event, if waiting a result from network (e.g. when fetch policy is 'cache-and-network')\n        filter((loading) => loading || !this._waitingNetworkResult),\n        debounceTime(debounceTimeMs)\n      ),\n      opts\n    );\n  }\n\n  async confirmCreate(row: R): Promise<boolean> {\n    const confirmed = await super.confirmCreate(row);\n    if (!confirmed) return false;\n    if (row.editing && row.validator) {\n      console.warn('[entities-table-datasource] Row still has {editing: true} after confirmCreate()! Force editing to false');\n      row.validator.disable({ onlySelf: true, emitEvent: false });\n    }\n    return true;\n  }\n\n  async confirmEdit(row: R): Promise<boolean> {\n    const confirmed = await super.confirmEdit(row);\n    if (!confirmed) return false;\n    if (row.validator?.enabled) {\n      console.warn('[entities-table-datasource] Row still has {editing: true} after confirmEdit()! Force editing to false');\n      row.validator.disable({ onlySelf: true, emitEvent: false });\n    }\n    return true;\n  }\n\n  async startEdit(row: R): Promise<boolean> {\n    const editing = await super.startEdit(row);\n    if (!editing) return false;\n    if (row.validator?.disabled) {\n      console.warn('[entities-table-datasource] Row still has {editing: false} after startEdit()! Force editing');\n      row.validator.enable({ onlySelf: true, emitEvent: false });\n    }\n    return true;\n  }\n\n  handleError(error: any, message: string): Observable<LoadResult<T>> {\n    const errorMsg = (error && error.message) || error;\n    console.error(`[entities-table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);\n    this.markAsLoaded();\n    throw new Error(message || errorMsg);\n  }\n\n  handleServiceError(error: any) {\n    const errorMsg = (error && error.message) || error;\n    console.error(`[entities-table-datasource] Service ${this._entityName} sent error: ${errorMsg}`, error);\n    this.markAsLoaded();\n    throw error;\n  }\n\n  async delete(id: number): Promise<boolean> {\n    // If new row: not need to propagate to the dataService\n    if (id === -1) {\n      return super.delete(id);\n    }\n\n    const row = this.getRow(id);\n    if (!row) {\n      console.error(`[entities-table-datasource] Row to delete with id=${id} not found`);\n      return;\n    }\n\n    this.markAsLoading();\n\n    try {\n      await this.dataService.deleteAll([row.currentData], this.saveAllOptions);\n\n      // Wait cache update, then table update\n      await sleep(300);\n\n      // make sure row has been deleted (because GraphQl cache remove can fail)\n      const present = this.getRow(id) === row;\n      if (present) await super.delete(id);\n      this.markAsLoaded();\n    } catch (err) {\n      this.handleServiceError(err);\n    }\n  }\n\n  async deleteAll(rows: R[]): Promise<any> {\n    this.markAsLoading();\n\n    const data = this.getDataFromRows(rows);\n\n    try {\n      // Call service deletion\n      await this.dataService.deleteAll(data, this.saveAllOptions);\n\n      // Wait propagation (e.g. update cache, then received update from dataService.watchAll())\n      await sleep(500);\n\n      // Workaround, to be sure all rows have been deleted\n      // Sometime, the service miss deletion, or GraphQl cache remove failed.\n      // In this case, apply missing deletion using the parent delete() function\n      const rowNotDeleted = this.getRows().filter((row) => rows.includes(row));\n      if (isNotEmptyArray(rowNotDeleted)) {\n        console.warn(\n          `[entities-table-datasource] Force deletion of ${rowNotDeleted.length} rows! Please check that data service update the cache, after deletion`\n        );\n        // Start at the end\n        for (const r of rowNotDeleted.sort((a, b) => (a.id > b.id ? -1 : 1))) {\n          await super.delete(r.id);\n        }\n      }\n    } catch (err) {\n      // Handle service error\n      this.handleServiceError(err);\n    } finally {\n      this.markAsLoaded();\n    }\n  }\n\n  getRow(id: number): R {\n    return super.getRow(id);\n  }\n\n  getRows(): R[] {\n    return this.rowsSubject.getValue() || [];\n  }\n\n  getEditingRows(): R[] {\n    return this.getRows().filter((row) => row.editing);\n  }\n\n  getSingleEditingRow(): R {\n    const rows = this.getEditingRows();\n    return rows.length === 1 ? rows[0] : undefined;\n  }\n\n  hasSomeEditingRow(): boolean {\n    return this.getRows().some((row) => row.editing);\n  }\n\n  hasSomeDirtyRow(): boolean {\n    return this.getRows().some((row) => row.dirty);\n  }\n\n  async createNew(insertAt?: number, opts = { editing: true }): Promise<R | undefined> {\n    // Avoid multiple call (only one editing row is allowed)\n    if (this._creating && opts.editing) return;\n\n    this._creating = true;\n\n    try {\n      const row = await super.createNew(insertAt, opts);\n\n      if (!row) return undefined; // Stop here\n\n      // Call observers\n      if (this.config?.onRowCreated) {\n        try {\n          await this.config.onRowCreated(row);\n        } catch (err) {\n          // Log, then continue\n          console.error((err && err.message) || err, err);\n        }\n      }\n\n      return row;\n    } finally {\n      this._creating = false;\n    }\n  }\n\n  getData(): T[] {\n    const rows = this.getRows();\n    return this.getDataFromRows(rows);\n  }\n\n  get canFetchMore(): boolean {\n    return !!this._fetchMoreFn;\n  }\n\n  async fetchMore(opts?: { emitEvent: boolean }): Promise<boolean> {\n    if (!this._fetchMoreFn) return false; // Avoid multiple call\n    if (this.hasSomeDirtyRow()) {\n      console.warn(`Cannot fetch more ${this._entityName} because some row) still dirty`);\n      return;\n    }\n    console.debug(`Will fetching more row(s) still...`);\n\n    // Forget the fetchMore function, to avoid multiple call\n    const fetchMoreFn = this._fetchMoreFn;\n    this._fetchMoreFn = null;\n\n    // Fetch next page\n    const res: LoadResult<T> = await fetchMoreFn();\n\n    // Skip if empty (no more data)\n    if (isEmptyArray(res?.data)) return false;\n\n    // Update the data source\n    super.updateDatasource((this.currentData || []).concat(...res.data), opts);\n\n    // Remember fetchMore\n    this._fetchMoreFn = res.fetchMore;\n    return true;\n  }\n\n  /* -- protected method -- */\n\n  markAsLoading() {\n    if (this.loadingSubject.value !== true) {\n      this.loadingSubject.next(true);\n    }\n  }\n\n  markAsLoaded() {\n    if (this.loadingSubject.value !== false) {\n      this.loadingSubject.next(false);\n    }\n  }\n\n  markAsSaving() {\n    if (this.savingSubject.value !== true) {\n      this.savingSubject.next(true);\n    }\n  }\n\n  markAsSaved() {\n    if (this.savingSubject.value !== false) {\n      this.savingSubject.next(false);\n    }\n  }\n}\n","import { AfterViewInit, ChangeDetectorRef, Directive, EventEmitter, Injector, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, MatSortable, SortDirection } from '@angular/material/sort';\nimport { MatTable } from '@angular/material/table';\nimport { BehaviorSubject, EMPTY, merge, Observable, of, Subject, Subscription } from 'rxjs';\nimport { catchError, debounceTime, distinctUntilChanged, filter, first, mergeMap, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { EntityUtils, IEntity } from '../services/model/entity.model';\nimport { AlertController, ModalController, NavController, ToastController } from '@ionic/angular';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ColumnItem, TableSelectColumnsComponent } from './table-select-columns.component';\nimport { Location } from '@angular/common';\nimport { ErrorCodes } from '../services/errors';\nimport { AppFormUtils, CanSave, IAppForm, OnReady } from '../form/form.utils';\nimport { LocalSettingsService } from '../services/local-settings.service';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n  MatAutocompleteConfigHolder,\n  MatAutocompleteFieldAddOptions,\n  MatAutocompleteFieldConfig,\n} from '../../shared/material/autocomplete/material.autocomplete.config';\nimport { CompletableEvent, createPromiseEventEmitter, emitPromiseEvent } from '../../shared/events';\nimport {\n  changeCaseToUnderscore,\n  getPropertyByPath,\n  isEmptyArray,\n  isNil,\n  isNotEmptyArray,\n  isNotNil,\n  isNotNilOrBlank,\n  setPropertyByPath,\n  toBoolean,\n} from '../../shared/functions';\nimport { waitFor, waitForFalse, WaitForOptions, waitForTrue } from '../../shared/observables';\nimport { ShowToastOptions, Toasts } from '../../shared/toast/toasts';\nimport { Alerts } from '../../shared/alerts';\nimport { CdkColumnDef } from '@angular/cdk/table';\nimport { LoadResult } from '../../shared/services/entity-service.class';\nimport { FormErrorTranslateOptions, FormErrorTranslator, IFormPathTranslator } from '../../shared/validator/form-error-adapter.class';\nimport {\n  CellValueChangeListener,\n  DEFAULT_PAGE_SIZE,\n  DEFAULT_PAGE_SIZE_OPTIONS,\n  DEFAULT_REQUIRED_COLUMNS,\n  RESERVED_END_COLUMNS,\n  RESERVED_START_COLUMNS,\n  SaveActionType,\n  SETTINGS_DISPLAY_COLUMNS,\n  SETTINGS_PAGE_SIZE,\n  SETTINGS_SORTED_COLUMN,\n} from './table.model';\nimport { AsyncTableElement } from '@e-is/ngx-material-table';\nimport { EntitiesAsyncTableDataSource } from './entities-async-table-datasource.class';\nimport { AppTableUtils } from './table.utils';\n\n// @dynamic\n// noinspection DuplicatedCode\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class AppAsyncTable<T extends IEntity<T, ID>, F = any, ID = number>\n  implements OnInit, OnDestroy, AfterViewInit, IAppForm, CanSave, IFormPathTranslator\n{\n  private _initialized = false;\n  private _openingRow = false;\n  private _subscription = new Subscription();\n  private _dataSourceLoadingSubscription: Subscription;\n  private _totalRowCount: number | null = null;\n  private _visibleRowCount: number | null = null;\n\n  private _cellValueChangesDefs: {\n    [key: string]: CellValueChangeListener;\n  } = {};\n\n  protected _enabled = true;\n  protected _autocompleteConfigHolder: MatAutocompleteConfigHolder;\n  protected allowRowDetail = true;\n  protected readonly cd: ChangeDetectorRef;\n  protected route: ActivatedRoute;\n  protected router: Router;\n  protected navController: NavController;\n  protected location: Location;\n  protected settings: LocalSettingsService;\n  protected translate: TranslateService;\n  protected modalCtrl: ModalController;\n  protected alertCtrl: AlertController;\n  protected toastController: ToastController;\n  protected previouslyEditedRowId: number;\n  protected formErrorAdapter: FormErrorTranslator;\n  protected readonly destroySubject = new Subject<void>();\n  protected logPrefix = '[table]';\n\n  excludesColumns: string[] = [];\n  displayedColumns: string[];\n  errorTranslateOptions: FormErrorTranslateOptions;\n\n  readonly readySubject = new BehaviorSubject<boolean>(false);\n  readonly loadingSubject = new BehaviorSubject<boolean>(true);\n  readonly savingSubject = new BehaviorSubject<boolean>(false);\n  readonly touchedSubject = new BehaviorSubject<boolean>(false);\n  readonly dirtySubject = new BehaviorSubject<boolean>(false);\n  readonly errorSubject = new BehaviorSubject<string>(undefined);\n\n  get totalRowCount(): number | null {\n    return this._totalRowCount;\n  }\n\n  set totalRowCount(value: number | null) {\n    this._totalRowCount = value;\n  }\n\n  get visibleRowCount(): number | null {\n    return this._visibleRowCount;\n  }\n\n  set visibleRowCount(value: number | null) {\n    this._visibleRowCount = value;\n  }\n\n  get error(): string {\n    return this.errorSubject.value;\n  }\n\n  set error(error: string) {\n    this.setError(error);\n  }\n\n  selection = new SelectionModel<AsyncTableElement<T>>(true, []);\n  permanentSelection: SelectionModel<T> = null;\n  permanentSelectionChangedPrevented = false;\n  autocompleteFields: { [key: string]: MatAutocompleteFieldConfig };\n  readonly mobile: boolean;\n\n  // Table options\n  @Input() settingsId: string;\n  @Input() debug: boolean;\n  @Input() i18nColumnPrefix = 'COMMON.';\n  @Input() i18nColumnSuffix: string;\n  @Input() autoLoad = true;\n  @Input() readOnly: boolean;\n  @Input() inlineEdition: boolean;\n  @Input() focusFirstColumn = false;\n  @Input() confirmBeforeDelete = false;\n  @Input() confirmBeforeCancel = false;\n  @Input() undoableDeletion = false;\n  @Input() saveBeforeDelete: boolean;\n  @Input() keepEditedRowOnSave: boolean;\n  @Input() saveBeforeSort: boolean;\n  @Input() saveBeforeFilter: boolean;\n  @Input() propagateRowError = false;\n  @Input() permanentSelectionAllowed = false; // Allow keep selected rows over page change or sort change\n  @Input() openRowThrottleTime = 800; // Prevent double click - see issue sumaris-app#864\n\n  @Input() defaultSortBy: string;\n  @Input() defaultSortDirection: SortDirection;\n  @Input() defaultPageSize = DEFAULT_PAGE_SIZE;\n  @Input() defaultPageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS;\n\n  // Focus manager\n  @Input() focusColumn: string;\n\n  get reservedStartColumns(): string[] {\n    return RESERVED_START_COLUMNS;\n  }\n\n  get reservedEndColumns(): string[] {\n    return RESERVED_END_COLUMNS;\n  }\n\n  get firstUserColumn(): string {\n    return this.displayedColumns[this.reservedStartColumns.length];\n  }\n\n  get lastUserColumn(): string {\n    return this.displayedColumns[this.displayedColumns.length - this.reservedEndColumns.length - 1];\n  }\n\n  @Input() set dataSource(value: EntitiesAsyncTableDataSource<T, F, ID>) {\n    this.setDatasource(value);\n  }\n\n  get dataSource(): EntitiesAsyncTableDataSource<T, F, ID> {\n    return this._dataSource;\n  }\n\n  @Input() set filter(value: F) {\n    this.setFilter(value);\n  }\n\n  get filter(): F {\n    return this._filter;\n  }\n\n  get empty(): boolean {\n    return this.loading || this.totalRowCount === 0;\n  }\n\n  get selectedEntities(): T[] {\n    return this.permanentSelection?.selected || AppTableUtils.getEntities(this.selection.selected);\n  }\n\n  @Output() onRefresh = new EventEmitter<{ emitEvent?: boolean; skip?: boolean }>();\n  @Output() onClickRow = new EventEmitter<AsyncTableElement<T>>();\n  @Output() onOpenRow = new EventEmitter<AsyncTableElement<T>>();\n  @Output() onNewRow = new EventEmitter<any>();\n  @Output() onStartEditingRow = new EventEmitter<AsyncTableElement<T>>();\n  @Output() onConfirmEditCreateRow = new EventEmitter<AsyncTableElement<T>>();\n  @Output() onCancelOrDeleteRow = new EventEmitter<AsyncTableElement<T>>();\n  @Output() onBeforeDeleteRows = createPromiseEventEmitter<boolean, { rows: AsyncTableElement<T>[] }>();\n  @Output() onBeforeCancelRows = createPromiseEventEmitter<boolean, { rows: AsyncTableElement<T>[] }>();\n  @Output() onBeforeSave = createPromiseEventEmitter<{ confirmed: boolean; save: boolean }, { action: SaveActionType; valid: boolean }>();\n  @Output() onAfterDeletedRows = new EventEmitter<AsyncTableElement<T>[]>();\n  @Output() onSort = new EventEmitter<any>();\n  @Output() onDirty = new EventEmitter<boolean>();\n  @Output() onError = new EventEmitter<string>();\n\n  get dirty(): boolean {\n    return this.dirtySubject.value;\n  }\n\n  get valid(): boolean {\n    return this.dataSource.getEditingRows().every((row) => (row.editing ? row.valid : true));\n  }\n\n  get invalid(): boolean {\n    return this.dataSource.getEditingRows().some((row) => (row.editing ? row.invalid : false));\n  }\n\n  get pending(): boolean {\n    return this.dataSource.getEditingRows().some((row) => (row.editing ? row.pending : false));\n  }\n\n  get touched(): boolean {\n    return this.touchedSubject.value;\n  }\n\n  get untouched(): boolean {\n    return !this.touchedSubject.value;\n  }\n\n  get loading(): boolean {\n    return this.loadingSubject.value;\n  }\n\n  get loaded(): boolean {\n    return !this.loadingSubject.value;\n  }\n\n  get saving(): boolean {\n    return this.savingSubject.value;\n  }\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (this.sort) this.sort.disabled = true;\n    this._enabled = false;\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (this.sort) this.sort.disabled = false;\n    this._enabled = true;\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  get enabled(): boolean {\n    return this._enabled;\n  }\n\n  // FIXME: need to hidden buttons (in HTML), etc. when disabled\n  @Input() set disabled(value: boolean) {\n    if (value !== !this._enabled) {\n      if (value) this.disable({ emitEvent: false });\n      else this.enable({ emitEvent: false });\n    }\n  }\n\n  get disabled(): boolean {\n    return !this._enabled;\n  }\n\n  markAsDirty(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (!this.dirtySubject.closed && this.dirtySubject.value !== true) {\n      this.dirtySubject.next(true);\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (!this.dirtySubject.closed && this.dirtySubject.value !== false) {\n      this.dirtySubject.next(false);\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  async markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    let needEmitEvent = false;\n    if (this.touchedSubject.value) {\n      this.touchedSubject.next(false);\n      needEmitEvent = true;\n    }\n    if (this.dirty) {\n      for (const row of this.dataSource.getEditingRows()) {\n        // Cancel the current editing row only if editing and if it was not previously saved\n        if (row.id === -1) {\n          await this.dataSource.delete(-1);\n        } else if (row.editing) {\n          await this.dataSource.cancel(row);\n        }\n\n        // Check if row as pristine\n        await this.checkIfRowPristine(row, { onlySelf: true /* avoid propagation to table - done just after */ });\n      }\n\n      // Check if the table is pristine\n      await this.checkIfPristine({ emitEvent: false /*will be done just after*/ });\n\n      needEmitEvent = true;\n    }\n    this.previouslyEditedRowId = undefined;\n    if (needEmitEvent && (!opts || opts.emitEvent !== false)) this.markForCheck();\n  }\n\n  /**\n   * @deprecated prefer to use markAllAsTouched()\n   * @param opts\n   */\n  markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    console.warn('TODO: Replace this call by markAllAsTouched() - because of changes in ngx-components >= 0.16.0');\n    if (this.dataSource.hasSomeEditingRow()) {\n      this.dataSource.getEditingRows().forEach((row) => row.validator?.markAllAsTouched());\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  markAllAsTouched(opts?: { emitEvent?: boolean }) {\n    if (!this.touchedSubject.closed && this.touchedSubject.value !== true) {\n      this.touchedSubject.next(true);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n    this.dataSource.getEditingRows().forEach((row) => row.validator?.markAllAsTouched());\n  }\n\n  markAsSaving(opts?: { emitEvent?: boolean }) {\n    if (!this.savingSubject.closed && this.savingSubject.value !== true) {\n      this.focusColumn = undefined; // unselect focus column\n      this.savingSubject.next(true);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  markAsSaved(opts?: { emitEvent?: boolean }) {\n    if (!this.savingSubject.closed && this.savingSubject.value !== false) {\n      this.savingSubject.next(false);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  markAsLoading(opts?: { emitEvent?: boolean }) {\n    this.setLoading(true, opts);\n  }\n\n  markAsLoaded(opts?: { emitEvent?: boolean }) {\n    this.setLoading(false, opts);\n  }\n\n  markAsReady(opts?: { emitEvent?: boolean }) {\n    if (!this.readySubject.closed && this.readySubject.value !== true) {\n      this.readySubject.next(true);\n\n      // If subclasses implements OnReady\n      if (typeof this['ngOnReady'] === 'function') {\n        (this as any as OnReady).ngOnReady();\n      }\n    }\n  }\n\n  markAsNotReady(opts?: { emitEvent?: boolean }) {\n    if (!this.readySubject.closed && this.readySubject.value !== false) {\n      this.readySubject.next(false);\n    }\n  }\n\n  enableSort() {\n    if (this.sort) this.sort.disabled = false;\n  }\n\n  disableSort() {\n    if (this.sort) this.sort.disabled = true;\n  }\n\n  set pageSize(value: number) {\n    this.defaultPageSize = value;\n    if (this.paginator) {\n      this.paginator.pageSize = value;\n    }\n  }\n\n  get pageSize(): number {\n    return (this.paginator && this.paginator.pageSize) || this.defaultPageSize || DEFAULT_PAGE_SIZE;\n  }\n\n  get pageOffset(): number {\n    return (this.paginator && this.paginator.pageIndex * this.paginator.pageSize) || 0;\n  }\n\n  get sortActive(): string {\n    return this.sort && this.sort.active;\n  }\n\n  set sortActive(sortBy: string) {\n    if (this.sort) {\n      this.sort.active = sortBy;\n    } else {\n      this.defaultSortBy = sortBy;\n    }\n  }\n\n  get sortDirection(): SortDirection {\n    return (this.sort && this.sort.direction && (this.sort.direction === 'desc' ? 'desc' : 'asc')) || undefined;\n  }\n\n  set sortDirection(value: SortDirection) {\n    if (this.sort) {\n      this.sort.direction = value;\n    } else {\n      this.defaultSortDirection = value;\n    }\n  }\n\n  private _paginator: MatPaginator | null = null;\n\n  @Input() set paginator(value: MatPaginator) {\n    this._paginator = value;\n  }\n\n  get paginator(): MatPaginator {\n    return this._paginator || this.childPaginator;\n  }\n\n  get destroyed(): boolean {\n    return this.destroySubject?.closed !== false;\n  }\n\n  @ViewChild(MatTable, { static: false }) table: MatTable<T>;\n  @ViewChild(MatPaginator, { static: false }) childPaginator: MatPaginator;\n  @ViewChild(MatSort, { static: false }) sort: MatSort;\n\n  protected constructor(\n    injector: Injector,\n    protected columns: string[],\n    protected _dataSource?: EntitiesAsyncTableDataSource<T, F, ID>,\n    private _filter?: F\n  ) {\n    this.cd = injector.get(ChangeDetectorRef);\n    this.route = injector.get(ActivatedRoute);\n    this.router = injector.get(Router);\n    this.navController = injector.get(NavController);\n    this.location = injector.get(Location);\n    this.settings = injector.get(LocalSettingsService);\n    this.translate = injector.get(TranslateService);\n    this.modalCtrl = injector.get(ModalController);\n    this.alertCtrl = injector.get(AlertController);\n    this.toastController = injector.get(ToastController);\n    this.formErrorAdapter = injector.get(FormErrorTranslator);\n    this.mobile = this.settings.mobile;\n\n    // Autocomplete fields\n    this._autocompleteConfigHolder = new MatAutocompleteConfigHolder({\n      getUserAttributes: (a, b) => this.settings.getFieldDisplayAttributes(a, b),\n    });\n    this.autocompleteFields = this._autocompleteConfigHolder.fields;\n  }\n\n  ngOnInit() {\n    if (this._initialized) return; // Init only once\n    this._initialized = true;\n\n    // Set defaults\n    this.readOnly = toBoolean(this.readOnly, this.dataSource?.config.readOnly || false); // read/write by default\n    this.inlineEdition = !this.readOnly && toBoolean(this.inlineEdition, false); // force to false when readonly\n    this.saveBeforeDelete = toBoolean(this.saveBeforeDelete, !this.readOnly); // force to false when readonly\n    this.saveBeforeSort = toBoolean(this.saveBeforeSort, !this.readOnly); // force to false when readonly\n    this.saveBeforeFilter = toBoolean(this.saveBeforeFilter, !this.readOnly); // force to false when readonly\n    this.keepEditedRowOnSave = toBoolean(this.keepEditedRowOnSave, this.inlineEdition);\n    this.errorTranslateOptions = this.errorTranslateOptions || { separator: ', ', pathTranslator: this }; // Can be override in subclasses constructors\n\n    // Check ask user confirmation is possible\n    if (this.confirmBeforeDelete && !this.alertCtrl) throw Error(\"Missing 'alertCtrl' or 'injector' in component's constructor.\");\n\n    // Defined unique id for settings for the page\n    this.settingsId = this.settingsId || this.generateTableId();\n\n    this.displayedColumns = this.getDisplayColumns();\n\n    // Load the sorted columns, from settings\n    {\n      const sortedColumn = this.getSortedColumn();\n      this.defaultSortBy = sortedColumn.id;\n      this.defaultSortDirection = sortedColumn.start;\n    }\n\n    this.defaultPageSize = this.getPageSize();\n\n    // Propagate error to event emitter\n    this.registerSubscription(this.errorSubject.subscribe((value) => this.onError.emit(value)));\n\n    // Propagate dirty to event emitter\n    this.registerSubscription(this.dirtySubject.subscribe((value) => this.onDirty.emit(value)));\n\n    // Propagate row dirty state to table\n    this.registerSubscription(\n      this.onStartEditingRow\n        .pipe(\n          filter((row) => row?.validator && true),\n          mergeMap((row) =>\n            row.validator.valueChanges.pipe(\n              filter(() => row.validator.dirty),\n              first(),\n              // DEBUG\n              // tap(() => console.debug(`${this.logPrefix} Propagate row's dirty to table...`))\n\n              // Stop if next another row, or destroying\n              takeUntil(this.onStartEditingRow),\n              takeUntil(this.destroySubject)\n            )\n          )\n        )\n        .subscribe(() => this.markAsDirty())\n    );\n\n    // Call datasource refresh, on each refresh events\n    this.registerSubscription(\n      this.onRefresh\n        .pipe(\n          startWith<any>(this.autoLoad ? {} : { skip: true }),\n          switchMap((opts) => {\n            this.markAsPristine();\n            this.selection.clear();\n            if (opts?.skip) {\n              return of(undefined);\n            }\n            if (!this._dataSource) {\n              if (this.debug) console.debug(`${this.logPrefix} Skipping data load: no dataSource defined`);\n              return of(undefined);\n            }\n            if (this.debug) console.debug(`${this.logPrefix} Calling dataSource.watchAll()...`);\n            return this._dataSource.watchAll(this.pageOffset, this.pageSize, this.sortActive, this.sortDirection, this._filter).pipe(\n              takeUntil(this.onRefresh),\n              catchError((err) => {\n                if (this.debug) console.error(this.logPrefix, err);\n                this.setError((err && err.message) || err);\n                return of(undefined); // Continue\n              }),\n              tap((res) => this.updateView(res as LoadResult<T> | undefined, opts))\n            );\n          })\n        )\n        .subscribe()\n    );\n\n    // Listen dataSource loading events\n    if (this._dataSource) this.listenDatasourceLoading(this._dataSource);\n\n    // Permanent selection behavior\n    if (this.permanentSelectionAllowed) this.initPermanentSelection();\n  }\n\n  ngAfterViewInit() {\n    // Detect when parent ngOnInit() not call\n    if (this.debug && !this.displayedColumns)\n      console.warn(`${this.logPrefix} Missing 'displayedColumns'. Did you call parent ngOnInit() in component ${this.constructor.name} ?`);\n\n    // Start listening sort and paginator events\n    // noinspection JSIgnoredPromiseFromCall\n    this.listenSortAndPaginationEvents();\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n\n    // Unsubscribe column value changes\n    Object.keys(this._cellValueChangesDefs).forEach((col) => this.stopCellValueChanges(col, true));\n    this._cellValueChangesDefs = {};\n\n    this.readySubject.unsubscribe();\n    this.loadingSubject.unsubscribe();\n    this.savingSubject.unsubscribe();\n    this.errorSubject.unsubscribe();\n    this.dirtySubject.unsubscribe();\n\n    this.onRefresh.unsubscribe();\n    this.onOpenRow.unsubscribe();\n    this.onNewRow.unsubscribe();\n    this.onStartEditingRow.unsubscribe();\n    this.onConfirmEditCreateRow.unsubscribe();\n    this.onCancelOrDeleteRow.unsubscribe();\n    this.onBeforeDeleteRows.unsubscribe();\n    this.onBeforeCancelRows.unsubscribe();\n    this.onBeforeSave.unsubscribe();\n    this.onAfterDeletedRows.unsubscribe();\n    this.onSort.unsubscribe();\n    this.onDirty.unsubscribe();\n    this.onError.unsubscribe();\n\n    this.destroySubject.next();\n    this.destroySubject.unsubscribe();\n  }\n\n  async updateView(\n    res: LoadResult<T> | undefined,\n    opts?: {\n      emitEvent?: boolean;\n    }\n  ): Promise<void> {\n    if (!res) return; // Skip (e.g error)\n    if (res && res.data) {\n      this.visibleRowCount = res.data.length;\n      this.totalRowCount = isNotNil(res.total)\n        ? res.total\n        : ((this.paginator && this.paginator.pageIndex * (this.paginator.pageSize || DEFAULT_PAGE_SIZE)) || 0) + this.visibleRowCount;\n      if (this.debug) console.debug(`${this.logPrefix} ${res.data.length} rows loaded`);\n    } else {\n      // if (this.debug) console.debug(`${this.logPrefix} NO rows loaded`);\n      this.totalRowCount = 0;\n      this.visibleRowCount = 0;\n    }\n\n    if (!opts || opts.emitEvent !== false) {\n      await this.markAsUntouched({ emitEvent: false });\n      this.markAsPristine({ emitEvent: false });\n      this.markAsLoaded({ emitEvent: false });\n    }\n\n    this.markForCheck();\n  }\n\n  setDatasource(datasource: EntitiesAsyncTableDataSource<T, F, ID>) {\n    if (this._dataSource) throw new Error(`${this.logPrefix} dataSource already set !`);\n    if (datasource && this._dataSource !== datasource) {\n      this._dataSource = datasource;\n      if (this._initialized) this.listenDatasourceLoading(datasource);\n    }\n  }\n\n  resetDataSource() {\n    if (this._dataSourceLoadingSubscription) {\n      this._dataSourceLoadingSubscription.unsubscribe();\n      this._subscription.remove(this._dataSourceLoadingSubscription);\n    }\n    this._dataSource = null;\n  }\n\n  addColumnDef(column: CdkColumnDef) {\n    this.table.addColumnDef(column);\n  }\n\n  removeColumnDef(column: CdkColumnDef) {\n    this.table.removeColumnDef(column);\n  }\n\n  async setFilter(filter: F, opts?: { emitEvent?: boolean; permanentSelectionChangedPrevented?: boolean }) {\n    opts = opts || { emitEvent: true };\n\n    // Prevent permanent selection change events\n    this.permanentSelectionChangedPrevented = toBoolean(opts.permanentSelectionChangedPrevented, this.permanentSelectionChangedPrevented);\n\n    if (this.saveBeforeFilter) {\n      // if a dirty table is to be saved before filter\n      if (this.dirty) {\n        // Save\n        if (await this.saveBeforeAction('filter')) {\n          // Apply filter only if user didn't cancel the save or the save is ok\n          this.applyFilter(filter, opts);\n        }\n      } else {\n        // apply filter on non-dirty table\n        this.applyFilter(filter, opts);\n      }\n    } else {\n      // apply filter directly\n      this.applyFilter(filter, opts);\n    }\n  }\n\n  async confirmAndAdd(event?: Event, row?: AsyncTableElement<T>, opts?: { focusColumn?: string }): Promise<boolean> {\n    if (!(await this.confirmEditCreate(event, row))) {\n      // Go back to focusColumn\n      if (opts?.focusColumn) {\n        this.focusColumn = opts?.focusColumn;\n        this.markForCheck();\n      }\n\n      return false;\n    }\n\n    // Add row\n    return this.addRow(event, undefined /* insertAt: use default */, opts);\n  }\n\n  /**\n   * Same as confirmAndUp(), but using the next focused row. Should be call by the action column components\n   * @param event\n   * @param row\n   * @param opts\n   */\n  async confirmAndBackward(event?: Event, row?: AsyncTableElement<T>, opts?: { focusColumn?: string } & WaitForOptions): Promise<boolean> {\n    const focusColumn = opts?.focusColumn ?? this.lastUserColumn;\n    // Deleting edited row, if empty and not dirty\n    if (this.dataSource.hasSomeEditingRow()) {\n      for (const editingRow of this.dataSource.getEditingRows().filter((row) => row.id === -1 && row.invalid && !row.dirty)) {\n        await this.deleteNewRow(event, editingRow);\n      }\n\n      // Wait deletion is done, then edit previous row (by id, because of reloading)\n      await this.waitIdle(opts);\n      await this.editOrAddRowById(event, row.id, { focusColumn });\n      return true;\n    }\n\n    // Edit row, focusing at the end\n    await this.editRow(event, row, { focusColumn });\n    return true;\n  }\n\n  async confirmAndForward(event: Event | undefined, row?: AsyncTableElement<T>, opts?: { focusColumn?: string }): Promise<boolean> {\n    if (!this.inlineEdition) return false;\n    const focusColumn = opts?.focusColumn ?? this.firstUserColumn;\n\n    const confirmed = await this.confirmEditCreate(event, row);\n\n    // If not confirmed\n    if (!confirmed) {\n      // Go back to first column\n      this.focusColumn = focusColumn;\n      this.markForCheck();\n\n      return false;\n    }\n\n    // Edit next row\n    await this.editOrAddRowById(event, row.id + 1, { focusColumn });\n    return true;\n  }\n\n  /**\n   * Confirms the current row and moves the focus to the upper row.\n   * Typical usage is inside a <input type=\"number\">, with `(keyup.arrowUp)=\"confirmAndUp(event, row, {focusColumn: columnName})\"`\n   * Same as confirmAndBackward, but on the current row.\n   *\n   *\n   * @param {Event} [event] - The event associated with the confirmation and update action.\n   * @param {AsyncTableElement} [row] - The current row object.\n   * @param {Object} [opts] - Options.\n   * @param {string} [opts.focusColumn] - The column to focus on the upper row; defaults to the current focus column\n   * @return {Promise<boolean>} A promise that resolves to a boolean indicating the success of the navigation.\n   */\n  async confirmAndUp(event?: Event, row?: AsyncTableElement<T>, opts?: { focusColumn?: string } & WaitForOptions): Promise<boolean> {\n    const focusColumn = opts?.focusColumn ?? this.focusColumn;\n    // Deleting edited row, if empty and not dirty\n    if (this.dataSource.hasSomeEditingRow()) {\n      for (const editingRow of this.dataSource.getEditingRows().filter((row) => row.id === -1 && row.invalid && !row.dirty)) {\n        await this.deleteNewRow(event, editingRow);\n      }\n\n      // Wait deletion is done, then edit previous row (by id, because of reloading)\n      await this.waitIdle(opts);\n      await this.editOrAddRowById(event, row.id - 1, { focusColumn });\n      return true;\n    }\n\n    // Edit row, focusing at the end\n    await this.editRow(event, row, { focusColumn });\n    return true;\n  }\n\n  /**\n   * Confirm the creation of the given row, or if not specified the currently edited row\n   *\n   * @param event\n   * @param row\n   */\n  async confirmEditCreate(event?: Event, row?: AsyncTableElement<T>): Promise<boolean> {\n    row = row || this.dataSource.getSingleEditingRow();\n    if (!row || !row.editing) return true; // no row to confirm\n\n    // Stop event\n    event?.stopPropagation();\n\n    // Confirmation edition or creation\n    const confirmed = await row.confirmEditCreate();\n\n    if (confirmed) {\n      // Mark table as dirty (if row is dirty)\n      if (row.dirty) {\n        this.markAsDirty({ emitEvent: false /* because of resetError() */ });\n      }\n\n      // Clear error\n      this.resetError();\n\n      // Emit the confirm event\n      this.onConfirmEditCreateRow.next(row);\n\n      return true; // Continue\n    }\n\n    if (row.validator) {\n      // NOT confirmed = row has error\n      if (this.debug) {\n        console.warn(`${this.logPrefix} Cannot confirm row, because invalid`);\n        AppFormUtils.logFormErrors(row.validator, this.logPrefix);\n      }\n\n      // fix: mark all controls as touched to show errors\n      row.validator.markAllAsTouched();\n\n      // Compute row error, and propagate to table's error\n      if (this.propagateRowError) {\n        const error = this.getRowError(row);\n        this.setError(error);\n      }\n    }\n\n    // Not confirmed\n    return false;\n  }\n\n  async cancelOrDelete(event: Event, row: AsyncTableElement<T>, opts?: { interactive?: boolean; keepEditing?: boolean }) {\n    // Delete new row\n    if (row.id === -1) {\n      await this.deleteNewRow(event, row);\n    }\n    // Delete existing (but not editing) row\n    else if (!row.editing) {\n      await this.deleteExistingRow(event, row, opts);\n    }\n    // Cancel existing (and editing) row\n    else {\n      await this.cancelExistingRow(event, row, opts);\n    }\n  }\n\n  async addRow(event?: Event, insertAt?: number, opts?: { focusColumn?: string; editing?: boolean }): Promise<boolean> {\n    if (this.debug) console.debug(`${this.logPrefix} Asking for new row...`);\n    if (!this._enabled) return false;\n\n    // Use modal if inline edition is disabled\n    if (!this.inlineEdition) {\n      await this.openNewRowDetail(event);\n      return false;\n    }\n\n    // Try to finish edited row first\n    if (!(await this.confirmEditCreate())) {\n      return false;\n    }\n\n    // Add new row\n    const row = await this.addRowToTable(insertAt, opts);\n    return !!row;\n  }\n\n  async save(opts?: { keepEditing?: boolean }): Promise<boolean> {\n    opts = {\n      keepEditing: this.keepEditedRowOnSave,\n      ...opts,\n    };\n    if (this.readOnly) {\n      throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };\n    }\n\n    this.resetError();\n\n    // Keep edited row id (should be done BEFORE confirmEditCreate() )\n    const editedRow = this.dataSource.getSingleEditingRow();\n    this.previouslyEditedRowId = opts.keepEditing ? (editedRow?.editing ? editedRow.id : undefined) || this.singleSelectedRow?.id : undefined;\n    const previouslyEditedRowId = this.previouslyEditedRowId;\n    const previouslyEditedData = opts.keepEditing\n      ? (isNotNil(previouslyEditedRowId) && editedRow?.currentData) || this.singleSelectedRow?.currentData\n      : undefined;\n\n    if (!(await this.confirmEditCreate())) {\n      throw { code: ErrorCodes.TABLE_INVALID_ROW_ERROR, message: 'ERROR.TABLE_INVALID_ROW_ERROR' };\n    }\n\n    // Mark as saving\n    this.markAsSaving();\n\n    try {\n      // Calling service save()\n      if (this.debug) console.debug(`${this.logPrefix} Calling dataSource.save()...`);\n      const isOK = await this._dataSource.save();\n\n      if (isOK) this.markAsPristine();\n\n      return isOK;\n    } catch (err) {\n      this.setError((err && err.message) || err);\n      throw err;\n    } finally {\n      this.markAsSaved();\n\n      // Restore previous row\n      if (isNotNil(previouslyEditedRowId)) {\n        await this.selectRowByIdOrData(previouslyEditedRowId, previouslyEditedData);\n      }\n    }\n  }\n\n  async cancel(event?: Event, opts?: { interactive?: boolean }) {\n    // Check confirmation\n    if ((!opts || opts.interactive !== false) && this.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observed)) {\n      event?.stopPropagation();\n      if (!(await this.canCancelRows())) {\n        return;\n      }\n    }\n\n    this.emitRefresh();\n  }\n\n  async duplicateRow(\n    event?: Event,\n    row?: AsyncTableElement<T>,\n    opts?: {\n      includedProperties?: string[];\n      excludedProperties?: string[];\n    }\n  ) {\n    event?.stopPropagation();\n\n    row = row || this.singleSelectedRow;\n    if (!row || !(await this.confirmEditCreate(event, row))) {\n      return false;\n    }\n\n    const newRow = await this.addRowToTable(row.id + 1);\n    if (!newRow) throw new Error('Cannot add new row to table');\n\n    const source = row.cloneData();\n    let target: any;\n\n    // Copy included properties only\n    if (isNotEmptyArray(opts?.includedProperties)) {\n      target = {};\n      // Clone (deep copy)\n      opts.includedProperties.forEach((path) => {\n        setPropertyByPath(target, path, getPropertyByPath(source, path));\n      });\n    }\n\n    // Copy all properties\n    else {\n      target = source;\n\n      // Clean id and updateDate\n      EntityUtils.cleanIdAndUpdateDate(target, undefined);\n    }\n\n    // Restore excluded properties (e.g. rankOrder, etc)\n    if (isNotEmptyArray(opts?.excludedProperties)) {\n      const newData = newRow.currentData;\n      opts.excludedProperties.forEach((path) => {\n        setPropertyByPath(target, path, getPropertyByPath(newData, path));\n      });\n    }\n\n    if (newRow.validator) {\n      newRow.validator.patchValue(target);\n      newRow.validator.markAsDirty();\n    } else {\n      if (newRow.currentData?.fromObject) {\n        newRow.currentData.fromObject(target);\n      } else {\n        newRow.currentData = target;\n      }\n      this.markAsDirty();\n    }\n\n    // select\n    await this.clickRow(undefined, newRow);\n  }\n\n  /** Whether the number of selected elements matches the total number of rows. */\n  isAllSelected() {\n    // DEBUG\n    //console.debug('isAllSelected. lengths', this.selection.selected.length, this.totalRowCount);\n\n    return this.selection.selected.length === this.totalRowCount || this.selection.selected.length === this.visibleRowCount;\n  }\n\n  /** Selects all rows if they are not all selected; otherwise clear selection. */\n  async masterToggle() {\n    if (this.loading) return;\n    if (this.isAllSelected()) {\n      this.selection.clear();\n    } else {\n      const rows = this._dataSource.getRows();\n      this.selection.setSelection(...rows);\n    }\n  }\n\n  async deleteSelection(event: Event, opts?: { interactive?: boolean; messageKey?: string }): Promise<number> {\n    const deleteCount = await this.deleteRows(event, this.selection.selected, opts);\n    if (deleteCount > 0) this.selection.clear();\n    return deleteCount;\n  }\n\n  /**\n   *\n   * @param event\n   * @param row\n   * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)\n   *  And to force deletion even if table is busy\n   */\n  async deleteRow(event: Event | null, row: AsyncTableElement<T>, opts?: { interactive?: boolean }): Promise<boolean> {\n    const deleteCount = await this.deleteRows(event, [row], opts);\n    return deleteCount === 1;\n  }\n\n  /**\n   *\n   * @param event\n   * @param rows\n   * @param opts Use interactive=false to avoid user interaction (e.g. user confirmation)\n   *    And to force deletion even if table is busy\n   */\n  async deleteRows(event: Event | null, rows: AsyncTableElement<T>[], opts?: { interactive?: boolean; messageKey?: string }): Promise<number> {\n    if (this.readOnly) {\n      throw { code: ErrorCodes.TABLE_READ_ONLY, message: 'ERROR.TABLE_READ_ONLY' };\n    }\n    if (event?.defaultPrevented) return 0; // SKip\n    event?.preventDefault();\n    this.resetError();\n\n    if (!this._enabled || isEmptyArray(rows)) return 0; // Skip is disabled, or no rows to delete\n\n    if (this.loading && (!opts || opts.interactive !== false)) {\n      console.warn(`${this.logPrefix} Skip deleteRows() because table is busy (loading). Use opts.interactive = false to force deletion`);\n      return 0; // Skip if loading\n    }\n\n    // Make sure to keep newly created row\n    const editedRow = this.dataSource.getSingleEditingRow();\n    if (editedRow?.id === -1 && editedRow.editing && !rows.includes(editedRow)) {\n      const confirmed = await this.confirmEditCreate();\n      if (!confirmed) return 0; // Cannot delete (e.g. edited row is invalid)\n    }\n\n    // Check if can delete\n    const canDelete = await this.canDeleteRows(rows, opts);\n    if (!canDelete) return 0; // Cannot delete\n\n    // Reverse row order (on a copy)\n    // This is a workaround, need because row.delete() has async execution\n    // and index cache is updated with a delay\n    let tempRows = rows.slice().sort((a, b) => (a.id > b.id ? -1 : 1));\n\n    const deletedRows: AsyncTableElement<T>[] = [];\n\n    // If data need to be saved first\n    if (this.saveBeforeDelete) {\n      // Exclude invalid rows (because of save() will fail, when exists some invalid rows)\n      tempRows = tempRows.filter((row) => {\n        // Delete the row :\n        // - if newly created row (id = -1),\n        // - or if invalid and not editing (= not cancellable)\n        if (row.id === -1 || (!row.editing && row.invalid) /*do not use !valid because if row is disabled, it will be always !valid */) {\n          if (this.debug) console.debug(`${this.logPrefix} Delete row #${row.id}`);\n          this.selection.deselect(row);\n          row.delete();\n          this.visibleRowCount--;\n          this.totalRowCount--;\n          deletedRows.push(row);\n          return false; // Exclude from the list to delete using the service\n        }\n        // Cancel the row (and mark as pristine), when not valid but in edition\n        else if (row.editing && !row.valid) {\n          this.selection.deselect(row);\n          row.cancel();\n          // Mark row as pristine (if possible)\n          this.checkIfRowPristine(row, { emitEvent: false, onlySelf: true /*avoid propagation to table*/ });\n          return true; // Keep the row. the row will be deleted after the save\n        }\n\n        return true;\n      });\n\n      // Apply save, only if there is still some rows to delete\n      // WARN: If no more rows (e.g. because all has been cancelled) then continue anyway to clear editedRow and selection (issue IMAGINE-669)\n      if (deletedRows.length || tempRows.length) {\n        // Save data (e.g. when using memory service)\n        const saved = await this.saveBeforeAction('delete');\n        if (!saved) {\n          // Stop if save cancelled or save failed\n          return;\n        }\n      }\n    }\n\n    try {\n      // Apply deletion on datasource\n      // If no more rows to delete, continue anyway to clear editedRow and selection (issue IMAGINE-669)\n      if (tempRows.length) {\n        if (this.debug) console.debug(`${this.logPrefix} Delete ${tempRows.length} rows...`);\n        await this._dataSource.deleteAll(tempRows);\n      }\n\n      // DO not update manually, because watchALl().subscribe() will update this count\n      //this.totalRowCount -= deleteCount;\n      //this.visibleRowCount -= deleteCount;\n\n      // Deselect deleted rows\n      this.selection.deselect(...rows);\n\n      this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });\n      this.markForCheck();\n\n      this.onAfterDeletedRows.next(rows);\n\n      return rows.length;\n    } catch (err) {\n      this.setError((err && err.message) || err);\n      throw err;\n    }\n  }\n\n  async selectRowById(id: number): Promise<boolean> {\n    if (id === undefined) return false;\n    await this.waitIdle();\n    const row = this.dataSource.getRow(id);\n    if (!row) return false;\n    return this.clickRow(null, row);\n  }\n\n  /**\n   * Try to select row by data. Will use equals() to find same row's data\n   *\n   * @param data\n   */\n  async selectRowByData(data: T): Promise<boolean> {\n    if (data === undefined) return Promise.resolve(false);\n    await this.waitIdle();\n    const row = this.dataSource.getRows().find((row) => this.equals(row.currentData, data));\n    if (!row) return false;\n    return this.clickRow(null, row);\n  }\n\n  toggleSelectRow(event: Event | undefined, row: AsyncTableElement<T>) {\n    // /!\\ DO NOT prevent default, otherwise the checkbox will not be updated\n    //event?.preventDefault();\n    event?.stopPropagation();\n    this.selection.toggle(row);\n  }\n\n  async clickRow(event: Event | undefined, row: AsyncTableElement<T>): Promise<boolean> {\n    if (this.loading) {\n      // Wait while loading, and loop\n      if (this.debug) console.debug(`${this.logPrefix} Waiting before apply clickRow() (datasource is busy)...`);\n      await this.waitIdle({ timeout: 2000 });\n    }\n\n    // DEBUG\n    // console.debug(`${this.logPrefix} Detect click on row`);\n\n    // Cancelled by event\n    if (event?.defaultPrevented) {\n      if (this.debug) console.debug(`${this.logPrefix} clickRow event is defaultPrevented`);\n      return false;\n    }\n\n    // Call onClickRow if observed\n    if (this.onClickRow.observed) {\n      this.onClickRow.next(row);\n      return true;\n    }\n\n    // Open the detail page (if not inline editing)\n    if (!this.inlineEdition) {\n      if (this._openingRow) return; // Prevent double click\n\n      if (event) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n\n      this._openingRow = true; // Prevent double click\n      this.markAsLoading();\n\n      this.openRow(row.currentData.id, row)\n        .catch((err) => console.error(`${this.logPrefix} Failed to open row`, err)) // Continue\n        .then(() => {\n          this.markAsLoaded();\n\n          // Prevent double click (use an open throttle time)\n          if (this.openRowThrottleTime > 0) {\n            setTimeout(() => {\n              this._openingRow = false;\n            }, this.openRowThrottleTime);\n          } else {\n            this._openingRow = false;\n          }\n        });\n\n      return true;\n    }\n\n    // Start editing row\n    return this.editRow(event, row, { focusColumn: undefined /*force to use the click target*/ });\n  }\n\n  async moveRow(id: number, direction: number) {\n    await this.dataSource.move(id, direction);\n  }\n\n  ready(opts?: WaitForOptions): Promise<void> {\n    return waitForTrue(this.readySubject, { stop: this.destroySubject, ...opts });\n  }\n\n  waitIdle(opts?: WaitForOptions): Promise<void> {\n    if (!this.loadingSubject.value) return Promise.resolve();\n    return waitForFalse(this.loadingSubject, { stop: this.destroySubject, ...opts });\n  }\n\n  async openSelectColumnsModal(event?: Event): Promise<any> {\n    event?.preventDefault();\n\n    // Copy current columns (deep copy)\n    const columns = this.getCurrentColumns();\n\n    const hasTopModal = !!(await this.modalCtrl.getTop());\n    const modal = await this.modalCtrl.create({\n      component: TableSelectColumnsComponent,\n      componentProps: { columns },\n      cssClass: hasTopModal && 'stack-modal',\n    });\n\n    // Open the modal\n    await modal.present();\n\n    // On dismiss\n    const { data } = await modal.onDidDismiss();\n    if (!data) return; // CANCELLED\n\n    // Apply columns\n    const userColumns = (data || []).filter((c) => c.canHide === false || c.visible).map((c) => c.name) || [];\n    this.displayedColumns = this.reservedStartColumns.concat(userColumns).concat(this.reservedEndColumns);\n    this.markForCheck();\n\n    // Update user settings\n    await this.savePageSettings(userColumns, SETTINGS_DISPLAY_COLUMNS);\n  }\n\n  trackByFn(index: number, row: AsyncTableElement<T>): any {\n    return row.id;\n  }\n\n  doRefresh(event?: CompletableEvent, opts?: { emitEvent?: boolean }) {\n    this.emitRefresh(opts);\n\n    // When target wait for a complete (e.g. IonRefresher)\n    if (event?.target && event.target.complete) {\n      setTimeout(async () => {\n        await this.waitIdle();\n        event.target.complete();\n      });\n    }\n  }\n\n  getCurrentColumns(): ColumnItem[] {\n    const hiddenColumns = this.columns.slice(this.reservedStartColumns.length).filter((name) => this.displayedColumns.indexOf(name) === -1);\n    return this.displayedColumns\n      .concat(hiddenColumns)\n      .filter((name) => !this.reservedStartColumns.includes(name) && !this.reservedEndColumns.includes(name) && !this.excludesColumns.includes(name))\n      .map((name) => ({\n        name,\n        label: this.getI18nColumnName(name),\n        visible: this.displayedColumns.indexOf(name) !== -1,\n        canHide: this.getRequiredColumns().indexOf(name) === -1,\n      }));\n  }\n\n  async escapeEditingRow(event?: Event, row?: AsyncTableElement<T>) {\n    row = row || this.dataSource.getSingleEditingRow();\n    if (!row || !row.editing) return;\n\n    // DEBUG\n    // console.debug(`${this.logPrefix} Cancel the row (keydown.escape)`);\n\n    if (event) {\n      // Avoid to cancel the editor\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    // If new row (no id)\n    if (row.id === -1) {\n      if (row.validator) {\n        // If pending: Wait end of validation, then loop\n        if (row.pending) {\n          await AppFormUtils.waitWhilePending(row.validator);\n        }\n\n        // Row is invalid: delete the row\n        if (row.invalid) {\n          await this.deleteNewRow(event, row);\n          return;\n        }\n      }\n    }\n    // If the row exists (has an id)\n    else {\n      // Call cancel function ,\n      // - if confirmation will be called before\n      // - or if row is pristine (not dirty)\n      if (this.confirmBeforeCancel || !row.dirty) {\n        await this.cancelExistingRow(event, row, { keepEditing: false });\n        return;\n      }\n    }\n\n    // By default, try to confirm the row\n    await this.confirmEditCreate(event, row);\n  }\n\n  translateFormPath(path: string): string {\n    // Can be overridden by subclasses, to resolve all field name\n\n    // Use columns key, has default name\n    const i18nColumnKey = this.getI18nColumnName(path);\n    return this.translate?.instant(i18nColumnKey) || i18nColumnKey;\n  }\n\n  /* -- protected method -- */\n\n  protected async editRow(event: Event | undefined, row: AsyncTableElement<T>, opts?: { focusColumn?: string }): Promise<boolean> {\n    if (!this._enabled || !this.inlineEdition) return false;\n    if (this.dataSource.getEditingRows().includes(row)) return true; // Already the edited row\n    if (event?.defaultPrevented) return false;\n\n    if (!(await this.confirmEditCreate())) {\n      return false;\n    }\n\n    if (!row.editing && !this.loading) {\n      this.focusColumn = opts?.focusColumn ?? this.focusColumn;\n      await this._dataSource.startEdit(row);\n    }\n    this.onStartEditingRow.emit(row);\n    return true;\n  }\n\n  /**\n   * Try to select row, by row.id, or by data. WIll use EntityUtils.equals()\n   *\n   * @param id\n   * @param data\n   * @protected\n   */\n  protected async selectRowByIdOrData(id: number, data?: T): Promise<boolean> {\n    let done = false;\n    try {\n      // Select by row id (if NOT a new row)\n      if (isNotNil(id) || id !== -1) {\n        done = await this.selectRowById(id);\n        if (done) return true;\n        console.warn(`${this.logPrefix} Save: Cannot reselect row by row.id: `, id);\n      }\n\n      // Try by data\n      if (data) {\n        done = await this.selectRowByData(data);\n        if (done) return true;\n        console.warn(`${this.logPrefix} Save: Cannot reselect row by data: `, data);\n      }\n\n      return false;\n    } catch (err) {\n      // Log, but continue\n      console.error(`${this.logPrefix} Save error: `, (err && err.message) || err);\n      return false;\n    }\n  }\n\n  /**\n   * return the selected row if unique in selection\n   */\n  protected get singleSelectedRow(): AsyncTableElement<T> {\n    return this.selection.selected?.length === 1 ? this.selection.selected[0] : undefined;\n  }\n\n  protected async canDeleteRows(rows: AsyncTableElement<T>[], opts?: { interactive?: boolean; messageKey?: string }): Promise<boolean> {\n    // Check using emitter\n    if (this.onBeforeDeleteRows.observed) {\n      try {\n        const canDelete = await emitPromiseEvent(this.onBeforeDeleteRows, 'canDelete', {\n          detail: { rows },\n        });\n        if (!canDelete) return false;\n      } catch (err) {\n        if (err === 'CANCELLED') return false; // User cancel\n        console.error(`${this.logPrefix} Error while checking if can delete rows`, err);\n        throw err;\n      }\n    }\n\n    // Ask user confirmation\n    if (this.confirmBeforeDelete && (!opts || opts.interactive !== false)) {\n      return this.askDeleteConfirmation(null, rows, opts);\n    }\n    return true;\n  }\n\n  protected async canCancelRows(rows?: AsyncTableElement<T>[], opts?: { interactive?: boolean }): Promise<boolean> {\n    // Get dirty rows\n    rows = rows || this.dataSource.getRows().filter((row) => row.validator?.dirty);\n\n    if (isEmptyArray(rows)) return true; // No dirty: OK\n\n    // Check using emitter\n    if (this.onBeforeCancelRows.observed) {\n      try {\n        const isCancel = await emitPromiseEvent(this.onBeforeCancelRows, 'canCancel', {\n          detail: { rows },\n        });\n        if (!isCancel) return false;\n      } catch (err) {\n        if (err === 'CANCELLED') return false; // User cancel\n        console.error(`${this.logPrefix} Error while checking if can cancel rows`, err);\n        throw err;\n      }\n    }\n\n    // Ask user confirmation\n    if (this.confirmBeforeCancel && (!opts || opts.interactive !== false)) {\n      return this.askCancelConfirmation(null, rows);\n    }\n    return true;\n  }\n\n  protected async saveBeforeAction(saveAction: SaveActionType): Promise<boolean> {\n    if (!this.dirty) {\n      // Continue without save\n      return true;\n    }\n\n    let save: boolean;\n    switch (saveAction) {\n      case 'delete':\n        save = this.saveBeforeDelete;\n        break;\n      case 'filter':\n        save = this.saveBeforeFilter;\n        break;\n      case 'sort':\n        save = this.saveBeforeSort;\n        break;\n      default:\n        save = true;\n    }\n\n    // Default behavior\n    let confirmed = true;\n\n    if (save) {\n      if (this.onBeforeSave.observed) {\n        // Ask confirmation\n        try {\n          const res = await emitPromiseEvent(this.onBeforeSave, 'beforeSave', {\n            detail: { action: saveAction, valid: this.valid },\n          });\n          confirmed = res.confirmed;\n          save = res.save;\n        } catch (err) {\n          if (err === 'CANCELLED') return false; // User cancel\n          console.error(`${this.logPrefix} Error while checking if can delete rows`, err);\n          throw err;\n        }\n      }\n    }\n\n    if (confirmed) {\n      if (save) {\n        // User confirmed save\n        const saved = await this.save();\n        this.markAsDirty(); // Restore dirty flag\n        return saved;\n      }\n      return true; // No save but continue action\n    }\n\n    return false; // User cancel the action\n  }\n\n  /**\n   * Open a row detail view. By default, will to open row detail page.\n   * Can be overridden by subclasses, BUT prefer to subscribe on onOpenRow\n   *\n   * @param id\n   * @param row\n   * @protected\n   */\n  protected async openRow(id: ID, row: AsyncTableElement<T>): Promise<boolean> {\n    if (this.allowRowDetail) {\n      if (this.debug && this.dirty) {\n        console.warn(`${this.logPrefix} Opening row details, but table has unsaved changes!`);\n      }\n\n      if (this.onOpenRow.observed) {\n        // Clear selection (because next route can change the current table content)\n        this.selection.clear();\n        this.onOpenRow.emit(row);\n        return true;\n      }\n\n      // No ID defined: unable to open details\n      if (isNil(id)) {\n        console.warn(`${this.logPrefix} Opening row details, but data has no id!`);\n        return false;\n      }\n\n      // Clear selection (because next route can change the current table content)\n      this.selection.clear();\n\n      return this.navController.navigateForward(['.', id], {\n        relativeTo: this.route,\n        queryParams: {},\n      });\n    }\n    return false;\n  }\n\n  protected async openNewRowDetail(event?: any): Promise<boolean> {\n    if (!this.allowRowDetail) return false;\n\n    if (this.onNewRow.observed) {\n      this.onNewRow.emit(event);\n      return true;\n    }\n\n    // Clear selection (because next route can change the current table content)\n    this.selection.clear();\n\n    return this.navController.navigateForward(['.', 'new'], {\n      relativeTo: this.route,\n    });\n  }\n\n  // can be overridden to add more required columns\n  protected getRequiredColumns() {\n    return DEFAULT_REQUIRED_COLUMNS;\n  }\n\n  protected getUserColumns(): string[] {\n    return this.getPageSettings(SETTINGS_DISPLAY_COLUMNS);\n  }\n\n  protected getSortedColumn(): MatSortable {\n    const data = this.getPageSettings(SETTINGS_SORTED_COLUMN);\n    const parts = data && data.split(':');\n    if (parts && parts.length === 2 && this.columns.includes(parts[0])) {\n      return { id: parts[0], start: parts[1] === 'desc' ? 'desc' : 'asc', disableClear: false };\n    }\n    if (this.defaultSortBy) {\n      return { id: this.defaultSortBy, start: this.defaultSortDirection || 'asc', disableClear: false };\n    }\n    return { id: 'id', start: 'asc', disableClear: false };\n  }\n\n  protected getPageSize(): number {\n    const pageSize = this.getPageSettings<number>(SETTINGS_PAGE_SIZE);\n    return pageSize || this.defaultPageSize;\n  }\n\n  protected getDisplayColumns(): string[] {\n    let userColumns = this.getUserColumns();\n\n    // No user override\n    if (!userColumns) {\n      // Return default, without columns to hide\n      return this.columns.filter((column) => !this.excludesColumns.includes(column));\n    }\n\n    // Get fixed start columns\n    const fixedStartColumns = this.columns.filter((c) => this.reservedStartColumns.includes(c));\n\n    // Remove end columns\n    const fixedEndColumns = this.columns.filter((c) => this.reservedEndColumns.includes(c));\n\n    // Remove fixed columns from user columns\n    userColumns = userColumns.filter((c) => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && this.columns.includes(c));\n\n    // Add required columns if missing\n    userColumns.push(\n      ...this.getRequiredColumns().filter((c) => !fixedStartColumns.includes(c) && !fixedEndColumns.includes(c) && !userColumns.includes(c))\n    );\n\n    return (\n      fixedStartColumns\n        .concat(userColumns)\n        .concat(fixedEndColumns)\n        // Remove columns to hide\n        .filter((column) => !this.excludesColumns.includes(column))\n    );\n  }\n\n  /**\n   * Recompute display columns\n   *\n   * @protected\n   */\n  protected updateColumns() {\n    this.displayedColumns = this.getDisplayColumns();\n    if (!this.loading) this.markForCheck();\n  }\n\n  protected registerSubscription(sub: Subscription) {\n    this._subscription.add(sub);\n  }\n\n  protected unregisterSubscription(sub: Subscription) {\n    this._subscription.remove(sub);\n  }\n\n  protected registerAutocompleteField<E = any, EF = any>(\n    fieldName: string,\n    options?: MatAutocompleteFieldAddOptions<E, EF>\n  ): MatAutocompleteFieldConfig<E, EF> {\n    return this._autocompleteConfigHolder.add(fieldName, options);\n  }\n\n  protected getI18nColumnName(columnName: string) {\n    return (this.i18nColumnPrefix || '') + changeCaseToUnderscore(columnName).toUpperCase();\n  }\n\n  protected generateTableId() {\n    // noinspection JSNonASCIINames\n    const meta = this.constructor['ɵcmp'];\n    // Get a component unique name - See https://stackoverflow.com/questions/60114682/how-to-access-components-unique-encapsulation-id-in-angular-9\n    const componentId = (meta && (meta.selectors?.[0] || meta.id)) || this.constructor.name;\n    const id =\n      this.location\n        .path(true)\n        .replace(/[?].*$/g, '')\n        .replace(/\\/\\d+/g, '_id') +\n      '_' +\n      componentId;\n    // if (this.debug) console.debug(`${this.logPrefix} id = ` + id);\n    return id;\n  }\n\n  protected async addRowToTable(\n    insertAt?: number,\n    opts?: { focusColumn?: string; editing?: boolean; emitEvent?: boolean }\n  ): Promise<AsyncTableElement<T> | undefined> {\n    // Try to finish edited row first\n    if (!(await this.confirmEditCreate())) {\n      console.warn(`${this.logPrefix} Cannot add new row, because the previous edited row cannot be confirmed`);\n      return undefined;\n    }\n\n    const editing = this.inlineEdition && (!opts || opts.editing !== false); // true by default, if inlineEdition\n\n    const row = await this._dataSource.createNew(insertAt, { editing });\n    if (!row) return undefined;\n\n    if (row.editing) {\n      // Update focused column\n      this.focusFirstColumn = true;\n      this.focusColumn = opts?.focusColumn || this.firstUserColumn;\n\n      // Emit start editing event\n      this.onStartEditingRow.emit(row);\n    }\n\n    this.totalRowCount++;\n    this.visibleRowCount++;\n\n    this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });\n\n    // Emit event\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n\n    return row;\n  }\n\n  protected registerCellValueChanges(name: string, formPath?: string, emitInitialValue?: boolean): Observable<any> {\n    formPath = formPath || name;\n    emitInitialValue = emitInitialValue || false;\n    let def = this._cellValueChangesDefs[name];\n    if (def && (def.formPath !== formPath || def.emitInitialValue !== emitInitialValue)) {\n      throw Error(\"Already register a cell value change for this name, with different 'formPath' or 'emitInitialValue'. Please use same arguments.\");\n    }\n\n    // Not exists: register new definition\n    if (!def) {\n      if (this.debug) console.debug(`${this.logPrefix} New listener {${name}} for value changes on path ${formPath}`);\n      def = {\n        subject: new Subject<any>(),\n        subscription: null,\n        formPath,\n        emitInitialValue,\n      };\n      this._cellValueChangesDefs[name] = def;\n\n      // Start the listener, when editing starts\n      this.registerSubscription(this.onStartEditingRow.subscribe((row) => this.startCellValueChanges(name, row)));\n    }\n\n    return def.subject;\n  }\n\n  protected setShowColumn(columnName: string, show: boolean, opts?: { emitEvent?: boolean }) {\n    if (!this.excludesColumns.includes(columnName) !== show) {\n      if (!show) {\n        this.excludesColumns.push(columnName);\n      } else {\n        const index = this.excludesColumns.findIndex((value) => value === columnName);\n        if (index >= 0) this.excludesColumns.splice(index, 1);\n      }\n\n      // Recompute display columns\n      if (this.displayedColumns && (!opts || opts.emitEvent !== false)) {\n        this.updateColumns();\n      }\n    }\n  }\n\n  protected getShowColumn(columnName: string): boolean {\n    return !this.excludesColumns.includes(columnName);\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected detectChanges() {\n    this.cd.detectChanges();\n  }\n\n  protected async askDeleteConfirmation(\n    event?: Event,\n    rows?: AsyncTableElement<T>[],\n    opts?: {\n      messageKey?: string;\n    }\n  ): Promise<boolean> {\n    if (isNotNilOrBlank(opts?.messageKey)) {\n      return Alerts.askConfirmation(opts.messageKey, this.alertCtrl, this.translate, event);\n    }\n\n    if (this.undoableDeletion) {\n      // Special message, for undoable deletion\n      return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.DELETE_ROW' : 'CONFIRM.DELETE_ROWS', this.alertCtrl, this.translate, event);\n    }\n\n    // Immediate deletion action\n    return Alerts.askActionConfirmation(this.alertCtrl, this.translate, true, event);\n  }\n\n  protected async askCancelConfirmation(event?: Event, rows?: AsyncTableElement<T>[]): Promise<boolean> {\n    return Alerts.askConfirmation(rows?.length === 1 ? 'CONFIRM.CANCEL_ROW' : 'CONFIRM.CANCEL_ROWS', this.alertCtrl, this.translate, event);\n  }\n\n  protected async askRestoreConfirmation(event?: Event): Promise<boolean> {\n    return Alerts.askActionConfirmation(this.alertCtrl, this.translate, false, event);\n  }\n\n  protected async showToast(opts: ShowToastOptions) {\n    if (!this.toastController) throw new Error(\"Missing toastController in component's constructor\");\n    return Toasts.show(this.toastController, this.translate, opts);\n  }\n\n  protected resetError(opts?: { emitEvent?: boolean }) {\n    this.setError(undefined, opts);\n  }\n\n  protected getRowError(row?: AsyncTableElement<T>, opts?: FormErrorTranslateOptions): string {\n    row = row || this.dataSource.getSingleEditingRow();\n    if (!row || !this.formErrorAdapter) return undefined;\n\n    return this.formErrorAdapter.translateFormErrors(row.validator, {\n      ...this.errorTranslateOptions,\n      ...opts,\n    });\n  }\n\n  protected setError(value: string, opts?: { emitEvent?: boolean }) {\n    if (this.errorSubject.value !== value) {\n      this.errorSubject.next(value);\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  /**\n   * Compare data equality (default by id, using EntityUtils.equals())\n   * Can be overridden to add additional properties to compare\n   *\n   * @param d1\n   * @param d2\n   * @protected\n   */\n  protected equals(d1: T, d2: T): boolean {\n    return EntityUtils.equals(d1, d2, 'id');\n  }\n\n  protected markRowAsDirty(row?: AsyncTableElement<T>, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    row = row || this.dataSource.getSingleEditingRow();\n    if (row) row.validator?.markAsDirty(opts);\n    this.markAsDirty(opts);\n  }\n\n  protected getPageSettings<T = any>(propertyName?: string): T {\n    return this.settings.getPageSettings(this.settingsId, propertyName);\n  }\n\n  protected async savePageSettings(value: any, propertyName?: string, opts?: { emitEvent?: boolean }) {\n    await this.settings.savePageSetting(this.settingsId, value, propertyName, opts);\n  }\n\n  protected emitRefresh(opts?: { emitEvent?: boolean }) {\n    // Emit onRefresh if not closed (can happen if component is destroyed to early)\n    if (this.onRefresh && !this.onRefresh.closed) {\n      this.onRefresh.emit(opts);\n    }\n  }\n\n  /**\n   * Initialize the permanent selection model\n   *\n   * @protected\n   */\n  protected initPermanentSelection() {\n    if (this.permanentSelection) throw new Error('initPermanentSelection() already called!');\n\n    this.permanentSelection = new SelectionModel<T>(true, []);\n\n    // Listen sort change\n    this.registerSubscription(\n      this.onSort.subscribe(() => (this.permanentSelectionChangedPrevented = true)) // prevent selection change on sort\n    );\n\n    // Listen datasource update\n    this.registerSubscription(\n      this.dataSource.rowsSubject\n        // restore the 'adding' selection (for example after a page or sort change)\n        .subscribe((rows) => {\n          this.permanentSelectionChangedPrevented = true;\n          try {\n            const permanentSelectionIds = (this.permanentSelection.selected || []).map(EntityUtils.getId);\n            this.selection.setSelection(...rows.filter((row) => permanentSelectionIds.includes(AppTableUtils.getEntityId(row))));\n            this.markForCheck();\n          } finally {\n            this.permanentSelectionChangedPrevented = false;\n          }\n        })\n    );\n\n    // Listen selection change\n    this.registerSubscription(\n      this.selection.changed.pipe(filter(() => !this.permanentSelectionChangedPrevented)).subscribe((selectionChange) => {\n        // add to selection\n        if (selectionChange.added.length) {\n          this.permanentSelection.setSelection(\n            ...(this.permanentSelection.selected || [])\n              // Add new elements\n              .concat(...AppTableUtils.getEntities(selectionChange.added).filter(EntityUtils.hasId))\n              // Avoid duplicated entities (Mantis #55351)\n              .filter(EntityUtils.arrayDistinctFilterFn)\n          );\n        }\n        // remove from selection\n        if (selectionChange.removed.length) {\n          const removedIds = AppTableUtils.getEntityIds(selectionChange.removed);\n          this.permanentSelection.setSelection(\n            ...(this.permanentSelection.selected || []).filter((entity) => EntityUtils.hasId(entity) && !removedIds.includes(entity.id))\n          );\n        }\n        this.markForCheck();\n      })\n    );\n  }\n\n  /* -- private method -- */\n\n  private async listenSortAndPaginationEvents() {\n    if (!this.table) {\n      // DEBUG only -- alert user that table not found in template\n      if (this.debug) {\n        setTimeout(\n          () =>\n            !this.table &&\n            console.warn(`${this.logPrefix} Missing <mat-table> in the HTML template (after waiting 500ms)! Component: ${this.constructor.name}`),\n          500\n        );\n      }\n\n      // Make sure to wait the table\n      await waitFor(() => !!this.table, { stop: this.destroySubject, stopError: false /*avoid error when destorying the table*/ });\n    }\n\n    this.registerSubscription(\n      merge(\n        // Listen sort events\n        (this.sort &&\n          this.sort.sortChange.pipe(\n            filter(() => !this.sort.disabled),\n            mergeMap(async () => this.saveBeforeAction('sort')),\n            filter((res) => res === true),\n            // Save sort in settings\n            tap(() => {\n              const value = [this.sort.active, this.sort.direction || 'asc'].join(':');\n              this.savePageSettings(value, SETTINGS_SORTED_COLUMN);\n            })\n          )) ||\n          EMPTY,\n\n        // Listen paginator events\n        (this.paginator &&\n          this.paginator.page.pipe(\n            mergeMap((_) => this.saveBeforeAction('sort')),\n            filter((saved) => saved === true),\n            // Save page size in settings\n            tap(() => this.savePageSettings(this.paginator.pageSize, SETTINGS_PAGE_SIZE))\n          )) ||\n          EMPTY\n      )\n        // Refresh on any sort or paginator events\n        .subscribe((value) => {\n          this.onSort.emit(value);\n          this.emitRefresh();\n        })\n    );\n\n    // If the user changes the sort order, reset back to the first page.\n    if (this.sort && this.paginator) {\n      this.registerSubscription(this.sort.sortChange.pipe(filter(() => !this.sort.disabled)).subscribe(() => (this.paginator.pageIndex = 0)));\n    }\n  }\n\n  private async editOrAddRowById(event: Event | undefined, id: number, opts?: { focusColumn?: string }) {\n    if (id < 0) return;\n    if (id >= this.visibleRowCount) {\n      await this.addRow(event, undefined, { ...opts, editing: true });\n    } else {\n      const row = this.dataSource.getRow(id);\n      await this.editRow(event, row, opts);\n    }\n  }\n\n  private setLoading(value: boolean, opts?: { emitEvent?: boolean }) {\n    if (!this.loadingSubject.closed && this.loadingSubject.value !== value) {\n      this.loadingSubject.next(value);\n\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  private async deleteNewRow(event: Event | undefined, row: AsyncTableElement<T>) {\n    // Make sure row will be cancelled, and NOT deleted\n    if (row.id !== -1) throw new Error('Row must have id = -1');\n    event?.stopPropagation();\n\n    this.selection.clear();\n    await this._dataSource.cancelOrDelete(row);\n    this.resetError();\n\n    this.onCancelOrDeleteRow.next(row);\n    this.totalRowCount--;\n    this.visibleRowCount--;\n  }\n\n  private async deleteExistingRow(event: Event | null, row: AsyncTableElement<T>, opts?: { interactive?: boolean }) {\n    // Make sure row will be cancelled, and NOT deleted\n    if (row.id === -1) throw new Error('Row must have an id');\n\n    if (event?.defaultPrevented) return 0; // SKip\n    event?.preventDefault();\n\n    await this.deleteRow(null, row, opts);\n  }\n\n  private async cancelExistingRow(event: Event | undefined, row: AsyncTableElement<T>, opts?: { interactive?: boolean; keepEditing?: boolean }) {\n    // Make sure row will be cancelled, and NOT deleted\n    if (row.id === -1 || !row.editing) throw new Error('Row cannot be canceling, but only deleting');\n\n    const confirmed = !opts || opts.interactive !== false;\n\n    // Ask user confirmation, if cancel\n    if (!confirmed && row.dirty && (this.confirmBeforeCancel || this.onBeforeCancelRows.observed)) {\n      event?.stopPropagation();\n      if (!(await this.canCancelRows([row], opts))) {\n        return;\n      }\n    }\n\n    const keepEditing = row.editing && (!opts || opts.keepEditing !== false);\n    await this._dataSource.cancelOrDelete(row);\n    this.onCancelOrDeleteRow.next(row);\n\n    // Mark row as pristine\n    await this.checkIfRowPristine(row);\n\n    // Restore editing state\n    if (keepEditing) {\n      await this.editRow(undefined, row);\n    }\n  }\n\n  private async checkIfRowPristine(row: AsyncTableElement<T>, opts?: { emitEvent?: boolean; onlySelf?: boolean }) {\n    // Mark row as pristine\n    const markRowAsPristine = this.dataSource?.config.restoreOriginalDataOnCancel === true;\n    if (markRowAsPristine) {\n      row.validator?.markAsPristine();\n\n      // Check if table is now pristine\n      if (!opts || opts.onlySelf !== true) {\n        await this.checkIfPristine(opts);\n      }\n    }\n  }\n\n  private async checkIfPristine(opts?: { emitEvent?: boolean }) {\n    if (!this.dirty) return; // Already pristine\n\n    const rows = this._dataSource.getRows();\n    const pristine = (rows || []).findIndex((row) => row.dirty) === -1;\n    if (pristine) this.markAsPristine(opts);\n  }\n\n  private applyFilter(filter: F, opts: { emitEvent?: boolean }) {\n    if (this.debug) console.debug(`${this.logPrefix} Applying filter`, filter);\n    this._filter = filter;\n    if (opts && opts.emitEvent) {\n      if (this.paginator && this.paginator.pageIndex > 0) {\n        this.paginator.pageIndex = 0;\n      }\n      this.emitRefresh();\n    }\n  }\n\n  private listenDatasourceLoading(dataSource: EntitiesAsyncTableDataSource<T, F, ID>) {\n    if (!dataSource) throw new Error(`${this.logPrefix} dataSource not set !`);\n\n    // Cleaning previous subscription on datasource\n    if (isNotNil(this._dataSourceLoadingSubscription)) {\n      if (this.debug) console.debug(`${this.logPrefix} Many call to listenDatasource(): Cleaning previous subscriptions...`);\n      this._dataSourceLoadingSubscription.unsubscribe();\n      this.unregisterSubscription(this._dataSourceLoadingSubscription);\n    }\n\n    // Propage loading to table\n    this._dataSourceLoadingSubscription = this._dataSource.loadingSubject\n      .pipe(\n        filter(isNotNil), // filter out 'undefined'\n        distinctUntilChanged(),\n\n        // If changed to True: propagate as soon as possible\n        tap((loading) => loading && this.setLoading(true)),\n\n        // If changed to False: wait 250ms before propagate (to make sure the spinner has been displayed)\n        debounceTime(250),\n        tap((loading) => !loading && this.setLoading(false))\n      )\n      .subscribe();\n    this.registerSubscription(this._dataSourceLoadingSubscription);\n  }\n\n  private startCellValueChanges(name: string, row: AsyncTableElement<T>) {\n    const def = this._cellValueChangesDefs[name];\n    if (!def) {\n      console.warn(`${this.logPrefix} Listener with name {` + name + '} not registered! Please call registerCellValueChanges() before;');\n      return;\n    }\n    // Stop previous subscription\n    if (def.subscription) {\n      def.subscription.unsubscribe();\n      def.subscription = null;\n    } else {\n      if (this.debug) console.debug(`${this.logPrefix} Start values changes on row path {${def.formPath}}`);\n    }\n\n    // Listen value changes, and redirect to event emitter\n    const control = row.validator && AppFormUtils.getControlFromPath(row.validator, def.formPath);\n    if (!control) {\n      console.warn(`${this.logPrefix} Could not listen cell changes: no validator or invalid form path {${def.formPath}}`);\n    } else {\n      def.subscription = control.valueChanges\n        .pipe(\n          // don't emit if control is disabled\n          filter(() => control.enabled)\n        )\n        .subscribe((value) => def.subject.next(value));\n\n      // Emit the actual value\n      if (def.emitInitialValue !== false) {\n        def.subject.next(control.value);\n      }\n    }\n  }\n\n  private stopCellValueChanges(name: string, destroy?: boolean) {\n    const def = this._cellValueChangesDefs[name];\n    if (!def) return;\n    if (def.subscription) {\n      if (this.debug) console.debug(`${this.logPrefix} Stop value changes on row path {` + def.formPath + '}');\n      def.subscription.unsubscribe();\n      def.subscription = null;\n    }\n    if (destroy && def.subject) {\n      def.subject.complete();\n      def.subject.unsubscribe();\n    }\n  }\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n  TemplateRef,\n  ViewChild,\n} from '@angular/core';\nimport { AsyncTableElement, TableElement } from '@e-is/ngx-material-table';\nimport { MatColumnDef, MatTable } from '@angular/material/table';\nimport { MatMenuTrigger } from '@angular/material/menu';\nimport { AppTable } from '../table.class';\nimport { AppAsyncTable } from '../async-table.class';\nimport { Subject, Subscription } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\n@Component({\n  selector: 'app-nav-actions-column',\n  styleUrls: ['./actions-column.component.scss'],\n  templateUrl: './nav-actions-column.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NavActionsColumnComponent<T extends TableElement<any> | AsyncTableElement<any> = TableElement<any>> implements OnInit, OnDestroy {\n  _subscription = new Subscription();\n  _forwardEventSubject = new Subject<{ event: Event; row: T }>();\n  _backwardEventSubject = new Subject<{ event: Event; row: T }>();\n\n  @ViewChild(MatColumnDef) columnDef: MatColumnDef;\n  @ViewChild(MatMenuTrigger) matMenuTrigger: MatMenuTrigger;\n\n  @Input() appTable: AppTable<any> | AppAsyncTable<any>;\n  @Input() matColumnDef = 'actions';\n  @Input() style: 'table' | 'mat-table' = 'table';\n  @Input({ transform: booleanAttribute }) stickyEnd = false;\n  @Input({ transform: booleanAttribute }) showPending: boolean;\n  @Input() dirtyIcon: boolean | string;\n  @Input() optionsTitle = 'COMMON.BTN_OPTIONS';\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  @Input('class') classList: string;\n  @Input() cellTemplate: TemplateRef<{ $implicit: T }>;\n  @Input() throttleTime = 250;\n\n  @Output() optionsClick = new EventEmitter<Event>();\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    private matTable: MatTable<any>,\n    private cd: ChangeDetectorRef,\n    @Optional() appTable: AppTable<any>,\n    @Optional() appAsyncTable: AppAsyncTable<any>\n  ) {\n    if (!matTable) throw new Error(`[actions-column] this column component must be inside a MatTable component`);\n    this.appTable = appTable ?? appAsyncTable;\n    this._subscription = new Subscription();\n  }\n\n  ngOnInit(): void {\n    // Default values\n    this.showPending = this.showPending ?? true;\n    this.dirtyIcon = this.dirtyIcon === true ? 'star' : this.dirtyIcon === false ? null : (this.dirtyIcon ?? 'star');\n\n    this.cd.detectChanges();\n    this.matTable.addColumnDef(this.columnDef);\n\n    if (!this.appTable)\n      throw new Error(`[nav-actions-column] No AppTable or AppAsyncTable found. Please define a provider or set input '[appTable]'`);\n\n    this._subscription.add(\n      this._forwardEventSubject\n        .pipe(\n          throttleTime(this.throttleTime) // Avoid too many event, when leaving Tab key pressed\n        )\n        .subscribe(({ event, row }) => this.appTable.confirmAndForward(event, row as any))\n    );\n\n    this._subscription.add(\n      this._backwardEventSubject\n        .pipe(\n          throttleTime(this.throttleTime) // Avoid too many event, when leaving Back-Tab key pressed\n        )\n        .subscribe(({ event, row }) => this.appTable.confirmAndBackward(event, row as any))\n    );\n  }\n\n  ngOnDestroy() {\n    this.matTable.removeColumnDef(this.columnDef);\n    this.optionsClick.complete();\n    this.optionsClick.unsubscribe();\n    this._subscription.unsubscribe();\n  }\n\n  protected cancelOrDelete(event: Event, row: T) {\n    this.appTable.cancelOrDelete(event, row as any);\n  }\n\n  protected confirmAndForward(event: Event, row: T) {\n    this._forwardEventSubject.next({ event, row });\n  }\n\n  protected confirmAndBackward(event: Event, row: T) {\n    this._backwardEventSubject.next({ event, row });\n  }\n}\n","<ng-container [matColumnDef]=\"matColumnDef\" [stickyEnd]=\"stickyEnd\" [ngSwitch]=\"style\">\n  <ng-container *ngSwitchCase=\"'table'\">\n    <th mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n      <button\n        mat-icon-button\n        *ngIf=\"optionsClick.observed\"\n        [title]=\"!showTooltip ? (optionsTitle | translate) : ''\"\n        [matTooltip]=\"showTooltip ? (optionsTitle | translate) : ''\"\n        (click)=\"optionsClick.emit($event)\"\n      >\n        <mat-icon>more_vert</mat-icon>\n      </button>\n      <ng-content select=\"[matHeader]\"></ng-content>\n    </th>\n    <td mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n      @if (row.editing) {\n        <!-- pending -->\n        @if (row.validator?.pending) {\n          <ion-spinner [class.cdk-visually-hidden]=\"!showPending\" name=\"dots\" class=\"center\"></ion-spinner>\n        }\n\n        <!-- invalid new row -->\n        @if (row.id === -1 && row.validator?.invalid) {\n          <!-- delete button -->\n          <button\n            mat-icon-button\n            color=\"light\"\n            [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n            (click)=\"cancelOrDelete($event, row)\"\n          >\n            <mat-icon>delete_outline</mat-icon>\n          </button>\n\n          <!-- valid row or invalid existing row -->\n        } @else {\n          <!-- forward button (invisible - focusable only) -->\n          <button class=\"mat-row-action-button-navigation\" (focus)=\"confirmAndForward($event, row)\"></button>\n        }\n\n        <!-- NOT editing row -->\n      } @else {\n        <!-- dirty icon -->\n        @if (dirtyIcon && row.validator?.dirty) {\n          <ion-icon [name]=\"dirtyIcon\" color=\"accent\" class=\"dirty-icon\" tabindex=\"-1\"></ion-icon>\n        }\n\n        <!-- backward button (invisible - focusable only) -->\n        <button\n          mat-icon-button\n          class=\"mat-row-action-button-navigation\"\n          (focus)=\"confirmAndBackward($event, row)\"\n        ></button>\n      }\n\n      <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n    </td>\n\n    <td mat-footer-cell *matFooterCellDef>\n      <ng-content select=\"[matFooter]\"></ng-content>\n    </td>\n  </ng-container>\n\n  <ng-container *ngSwitchCase=\"'mat-table'\">\n    <mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n      <button\n        mat-icon-button\n        *ngIf=\"optionsClick.observed\"\n        [title]=\"showTooltip ? (optionsTitle | translate) : ''\"\n        [matTooltip]=\"showTooltip ? (optionsTitle | translate) : ''\"\n        (click)=\"optionsClick.emit($event)\"\n      >\n        <mat-icon>more_vert</mat-icon>\n      </button>\n      <ng-content select=\"[matHeader]\"></ng-content>\n    </mat-header-cell>\n    <mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n      @if (row.editing) {\n        <!-- pending -->\n        @if (row.validator?.pending) {\n          <ion-spinner [class.cdk-visually-hidden]=\"!showPending\" name=\"dots\" class=\"center\"></ion-spinner>\n        }\n\n        <!-- invalid new row -->\n        @if (row.id === -1 && row.validator?.invalid) {\n          <!-- delete button -->\n          <button\n            mat-icon-button\n            color=\"light\"\n            [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n            (click)=\"cancelOrDelete($event, row)\"\n          >\n            <mat-icon>delete_outline</mat-icon>\n          </button>\n        } @else {\n          <!-- forward button (invisible - focusable only) -->\n          <button class=\"mat-row-action-button-navigation\" (focus)=\"confirmAndForward($event, row)\"></button>\n        }\n\n        <!-- not editing row -->\n      } @else {\n        <!-- dirty icon -->\n        @if (dirtyIcon && row.validator?.dirty) {\n          <ion-icon [name]=\"dirtyIcon\" color=\"accent\" class=\"dirty-icon\"></ion-icon>\n        }\n\n        <!-- backward button (invisible - focusable only) -->\n        <button\n          mat-icon-button\n          class=\"mat-row-action-button-navigation\"\n          (focus)=\"confirmAndBackward($event, row)\"\n        ></button>\n      }\n\n      <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n    </mat-cell>\n\n    <mat-footer-cell *matFooterCellDef>\n      <ng-content select=\"[matFooter]\"></ng-content>\n    </mat-footer-cell>\n  </ng-container>\n</ng-container>\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { TableSelectColumnsComponent } from './table-select-columns.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IsAllSelectedPipe, IsNotAllSelectedPipe } from './table.pipes';\nimport { AppRowField } from './column/row-field.component';\nimport { ResizableModule } from '../../shared/directives/resizable/resizable.module';\nimport { ActionsColumnComponent } from './column/actions-column.component';\nimport { NavActionsColumnComponent } from './column/nav-actions-column.component';\n\nconst components = [\n  // Components\n  TableSelectColumnsComponent,\n  ActionsColumnComponent,\n  NavActionsColumnComponent,\n  AppRowField,\n  // Pipes\n  IsAllSelectedPipe,\n  IsNotAllSelectedPipe,\n];\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild(), ResizableModule],\n\n  declarations: components,\n  exports: [TranslateModule, ...components],\n})\nexport class AppTableModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { AppPropertiesForm } from './properties.form';\nimport { TranslateDirective, TranslateModule, TranslatePipe } from '@ngx-translate/core';\nimport { AppPropertiesTable } from './properties.table';\nimport { AppTableModule } from '../../table/table.module';\nimport { IonicModule } from '@ionic/angular';\nimport { MatDivider } from '@angular/material/divider';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatMenu, MatMenuContent, MatMenuItem } from '@angular/material/menu';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatToolbar } from '@angular/material/toolbar';\nimport { NgIf } from '@angular/common';\n\n@NgModule({\n  imports: [\n    SharedModule,\n    TranslateModule.forChild(),\n    AppTableModule,\n    IonicModule,\n    MatDivider,\n    MatIcon,\n    MatMenu,\n    MatMenuContent,\n    MatMenuItem,\n    TranslateDirective,\n    IonicModule,\n    MatIcon,\n    MatIconButton,\n    MatToolbar,\n    NgIf,\n    TranslatePipe,\n  ],\n\n  declarations: [\n    // Other components\n    AppPropertiesForm,\n    AppPropertiesTable,\n  ],\n  exports: [\n    TranslateModule,\n\n    // Components\n    AppPropertiesForm,\n    AppPropertiesTable,\n  ],\n})\nexport class AppPropertiesFormModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { SettingsPage } from './settings.page';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppFormButtonsBarModule } from '../form/buttons/form-buttons-bar.module';\nimport { AppPropertiesFormModule } from '../form/properties/properties.module';\nimport { RxPush } from '@rx-angular/template/push';\n\n@NgModule({\n  imports: [SharedModule, AppFormButtonsBarModule, TranslateModule.forChild(), AppPropertiesFormModule, RxPush],\n\n  declarations: [SettingsPage],\n  exports: [TranslateModule, SettingsPage],\n})\nexport class AppSettingsPageModule {}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter,\n  inject, Injector, Input, OnInit, Optional, Output } from '@angular/core';\nimport { AbstractControl, FormGroupDirective, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { referentialToString } from '../../services/model/referential.model';\nimport { isNil } from '../../../shared/functions';\nimport { DateAdapter } from '@angular/material/core';\nimport { Moment } from 'moment';\nimport { LocalSettingsService } from '../../services/local-settings.service';\nimport { AppForm } from '../form.class';\nimport { AppFormUtils } from '../form.utils';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { Observable } from 'rxjs';\nimport { Color } from '@ionic/core';\nimport { FormArrayHelper, FormArrayHelperOptions } from '../array/form-array';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\nexport declare interface ItemButton<T = any> {\n  title?: string;\n  click: (event: Event, item: T, index: number) => void;\n  icon: string;\n  color?: Color;\n  disabled?: Observable<boolean>;\n}\n\nexport type AppListFormOptions<T> = FormArrayHelperOptions & {\n  allowMultipleSelection?: boolean;\n  buttons?: ItemButton<T>[];\n};\n\n@Component({\n  selector: 'app-list-form',\n  templateUrl: 'list.form.html',\n  styleUrls: ['./list.form.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppListForm<T = any> extends AppForm<T[]> implements OnInit {\n  helper: FormArrayHelper<T>;\n  selection = new SelectionModel<T>(true, []);\n\n  @Input() formArrayName: string;\n  @Input() formArray: UntypedFormArray;\n  @Input() options: AppListFormOptions<T>;\n\n  @Input('displayWith') displayWithFn: (item: any) => string = referentialToString;\n  @Input('equals') equalsFn: (v1: T, v2: T) => boolean;\n  @Input('isEmpty') isEmptyFn: (item: T) => boolean;\n\n  @Output() onNewItem = new EventEmitter<Event>();\n  @Output() selectionChanges = new EventEmitter<T[]>(true);\n\n  set value(data: T[]) {\n    this.setValue(data);\n  }\n\n  get value(): T[] {\n    return this.formArray.value as T[];\n  }\n\n  get itemControls(): UntypedFormGroup[] {\n    return this.formArray && (this.formArray.controls as UntypedFormGroup[]);\n  }\n\n  get length(): number {\n    return this.helper ? this.helper.size() : 0;\n  }\n\n  get empty(): boolean {\n    return this.length === 0;\n  }\n\n  get touched(): boolean {\n    return this.formArray && (this.formArray.touched || (this.formArray.controls || []).findIndex((c) => c.touched) !== -1);\n  }\n\n  get untouched(): boolean {\n    return !this.formArray || this.formArray.untouched || (this.formArray.controls || []).findIndex((c) => c.touched) === -1;\n  }\n\n  get dirty(): boolean {\n    return this.formArray && this.formArray.dirty;\n  }\n\n  get invalid(): boolean {\n    return !this.formArray || this.formArray.invalid;\n  }\n\n  get valid(): boolean {\n    return this.formArray && this.formArray.valid;\n  }\n\n  get pending(): boolean {\n    return !this.formArray || this.formArray.pending;\n  }\n\n  markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    AppFormUtils.markAsTouched(this.formArray, opts);\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  markAllAsTouched(opts?: { emitEvent?: boolean }) {\n    AppFormUtils.markAllAsTouched(this.formArray, opts);\n    if (!opts || opts.emitEvent !== false) this.markForCheck();\n  }\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected injector: Injector,\n    protected formBuilder: UntypedFormBuilder,\n    protected dateAdapter: DateAdapter<Moment>,\n    protected settings: LocalSettingsService,\n    protected cd: ChangeDetectorRef,\n    @Optional() private formGroupDir: FormGroupDirective\n  ) {\n    super(injector, null);\n\n    //this.debug = !environment.production;\n  }\n\n  ngOnInit() {\n    this.options = {\n      allowEmptyArray: true,\n      allowMultipleSelection: true,\n      buttons: [],\n      ...this.options,\n    };\n\n    // Retrieve the form\n    const form =\n      (this.formArray && (this.formArray.parent as UntypedFormGroup)) || (this.formGroupDir && this.formGroupDir.form) || this.formBuilder.group({});\n    this.setForm(form);\n\n    this.formArray = this.formArray || (this.formArrayName && (form.get(this.formArrayName) as UntypedFormArray));\n    this.formArrayName =\n      this.formArrayName || (this.formArray && Object.keys(form.controls).find((key) => form.get(key) === this.formArray)) || 'properties';\n    if (!this.formArray) {\n      console.warn(`Missing array control '${this.formArrayName}'. Will create it!`);\n      this.formArray = this.formBuilder.array([]);\n      this.form.addControl(this.formArrayName, this.formArray);\n    }\n\n    this.equalsFn = this.equalsFn || ((v1: any, v2: any) => (isNil(v1) && isNil(v2)) || v1 === v2);\n    this.isEmptyFn = this.isEmptyFn || ((item: T) => isNil(item));\n    this.helper = new FormArrayHelper<T>(this.formArray, (value) => this.createControl(value), this.equalsFn, this.isEmptyFn, this.options);\n\n    super.ngOnInit();\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n\n    this.onNewItem.complete();\n    this.onNewItem.unsubscribe();\n    this.selectionChanges.complete();\n    this.selectionChanges.unsubscribe();\n  }\n\n  setValue(data: T[] | any) {\n    data = data || [];\n\n    if (this.helper) {\n      this.helper.resize(data.length);\n      this.helper.formArray.patchValue(data, { emitEvent: false });\n    } else {\n      console.warn('TODO: cannot applied setValue() on fromArray, because formArrayHelper not exists yet !');\n    }\n\n    this.selection.clear();\n    this.markAsPristine();\n    this.markAsLoaded();\n  }\n\n  /** Whether the number of selected elements matches the total number of rows. */\n  isAllSelected() {\n    return this.selection.selected.length === this.length;\n  }\n\n  async masterToggle(opts?: { emitEvent?: boolean }) {\n    if (this.loading) return;\n    if (this.isAllSelected()) {\n      this.selection.clear();\n    } else {\n      const items = this.value;\n      items.forEach((item) => this.selection.select(item));\n    }\n\n    if (!opts || opts.emitEvent !== false) {\n      this.selectionChanges.emit(this.selection.selected);\n    }\n  }\n\n  async onItemClick(event: MouseEvent, item: T, opts?: { emitEvent?: boolean }) {\n    if (!item || event.defaultPrevented || !this.selectionChanges.observed) return;\n\n    // Multiple selection (if ctrl+click)\n    if (event.ctrlKey && this.options.allowMultipleSelection) {\n      this.selection.toggle(item);\n    } else {\n      // Unselect all\n\n      // Select the item (or reselect)\n      if (!this.selection.isSelected(item) || (this.options.allowMultipleSelection && this.selection.selected.length > 1)) {\n        this.selection.clear();\n        this.selection.select(item);\n      }\n      // Unselect all\n      else {\n        this.selection.clear();\n      }\n    }\n\n    if (!opts || opts.emitEvent !== false) {\n      this.selectionChanges.emit(this.selection.selected);\n    }\n  }\n\n  async onItemButtonClick(button: ItemButton, event: MouseEvent, item: T, index: number) {\n    if (button.click) button.click(event, item, index);\n    await this.onItemClick(event, item);\n  }\n\n  hasSelection(): boolean {\n    return this.selection.hasValue();\n  }\n\n  onNewClick(event) {\n    this.onNewItem.emit(event);\n  }\n\n  add(value: T, opts?: { emitEvent?: boolean }) {\n    const done = this.helper.add(value, { emitEvent: true });\n    if (done) {\n      if (!this.options.allowMultipleSelection) {\n        this.selection.clear();\n      }\n      this.selection.toggle(value);\n      this.markForCheck();\n\n      if (!opts || opts.emitEvent !== false) {\n        this.selectionChanges.emit(this.selection.selected);\n      }\n    }\n  }\n\n  removeAt(index: number) {\n    const item = this.helper.at(index).value;\n    if (this.selection.isSelected(item)) {\n      this.selection.deselect(item);\n    }\n    this.helper.removeAt(index);\n  }\n\n  displayWith(value: T): string {\n    return this.displayWithFn ? this.displayWithFn(value) : (value as any);\n  }\n\n  /* -- protected methods -- */\n\n  protected createControl(data?: any): AbstractControl {\n    return this.formBuilder.control(data || null, Validators.required);\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<ng-container *ngIf=\"!loading; else listSkeleton\">\n  <!-- List -->\n  <ion-list class=\"ion-no-padding\">\n    <ng-container *ngFor=\"let itemControl of itemControls; index as i; last as last\">\n      <ion-item\n        *ngIf=\"itemControl.value; let item\"\n        [class.disabled]=\"disabled\"\n        tappable\n        (click)=\"onItemClick($event, item)\"\n        [color]=\"selection.isSelected(item) ? 'secondary100' : undefined\"\n        [button]=\"selectionChanges.observers | isNotEmptyArray\"\n      >\n        <ion-label>{{ displayWith(item) }}</ion-label>\n\n        <!-- buttons -->\n        <ion-buttons slot=\"end\" *ngIf=\"enabled\" class=\"action-buttons\">\n          <ion-button fill=\"clear\" (click)=\"removeAt(i)\">\n            <ion-icon slot=\"icon-only\" name=\"trash\"></ion-icon>\n          </ion-button>\n\n          <ion-button\n            *ngFor=\"let button of options.buttons\"\n            fill=\"clear\"\n            [color]=\"button.color\"\n            [class.cdk-visually-hidden]=\"button.disabled | async\"\n            (click)=\"onItemButtonClick(button, $event, item, i)\"\n            [title]=\"!showTooltip ? (button.title || '' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? (button.title || '' | translate) : ''\"\n          >\n            <ion-icon slot=\"icon-only\" [name]=\"button.icon\"></ion-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-item>\n    </ng-container>\n  </ion-list>\n\n  <!-- Add button -->\n  <ion-button\n    color=\"tertiary\"\n    fill=\"clear\"\n    *ngIf=\"enabled && onNewItem.observed; else emptyText\"\n    [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n    [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n    (click)=\"onNewClick($event)\"\n  >\n    <ion-icon slot=\"start\" name=\"add\"></ion-icon>\n    <ion-label translate>COMMON.BTN_ADD</ion-label>\n  </ion-button>\n\n  <!-- Empty (if readonly) -->\n  <ng-template #emptyText>\n    <ion-text *ngIf=\"!length\" color=\"medium\"><i translate>COMMON.EMPTY_OPTION</i></ion-text>\n  </ng-template>\n</ng-container>\n\n<ng-template #listSkeleton>\n  <ion-list>\n    <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n    <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n    <ng-container *ngTemplateOutlet=\"itemSkeleton\"></ng-container>\n  </ion-list>\n</ng-template>\n\n<ng-template #itemSkeleton>\n  <ion-item>\n    <ion-label>\n      <ion-skeleton-text animated style=\"width: 60%\"></ion-skeleton-text>\n    </ion-label>\n  </ion-item>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { AppListForm } from './list.form';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild()],\n\n  declarations: [\n    // Other components\n    AppListForm,\n  ],\n  exports: [\n    TranslateModule,\n\n    // Components\n    AppListForm,\n  ],\n})\nexport class AppListFormModule {}\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { Entity } from '../../services/model/entity.model';\n// import fade in animation\nimport { fadeInAnimation } from '../../../shared/material/material.animations';\nimport { Moment } from 'moment';\n\n@Component({\n  selector: 'app-entity-metadata',\n  templateUrl: './entity-metadata.component.html',\n  styleUrls: ['./entity-metadata.component.scss'],\n  animations: [fadeInAnimation],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EntityMetadataComponent {\n  @Input() value: Entity<any> & { creationDate?: Date | Moment; recorderDepartment?: any; recorderPerson?: any };\n\n  @Input() showRecorder = true;\n}\n","@if (value?.id) {\n  <ion-card @fadeInAnimation>\n    <!-- recorder -->\n    @if (showRecorder && (value.recorderDepartment || value.recorderPerson)) {\n      <ion-item color=\"transparent\">\n        <!-- recorder avatar -->\n        @if (value.recorderPerson; as recorderPerson) {\n          <ion-avatar slot=\"start\">\n            @if (recorderPerson.avatar; as avatarUrl) {\n              <ion-img [src]=\"avatarUrl\"/>\n            } @else if (recorderPerson?.id | isNotNil) {\n              <svg width=\"38\" height=\"38\" [data-jdenticon-value]=\"recorderPerson.id\"></svg>\n            }\n          </ion-avatar>\n        }\n\n        <!-- recorder name -->\n        <ion-label>\n          <ion-card-subtitle translate>COMMON.RECORDER</ion-card-subtitle>\n          @if (value.recorderPerson; as recorderPerson) {\n            <ion-card-title class=\"ion-text-nowrap\">\n              {{ recorderPerson | personToString }}\n            </ion-card-title>\n            @if (value.recorderDepartment) {\n              <ion-card-subtitle>{{ value.recorderDepartment.label || value.recorderDepartment.name }}</ion-card-subtitle>\n            }\n          } @else if (value.recorderDepartment) {\n            <ion-card-title>{{ value.recorderDepartment.label || value.recorderDepartment.name }}</ion-card-title>\n          }\n\n\n        </ion-label>\n\n        <ng-content select=\"[recorderSuffix]\"></ng-content>\n      </ion-item>\n    }\n\n    <ng-content select=\"[afterRecorder]\"></ng-content>\n\n    <ion-card-content>\n      <ion-label class=\"ion-text-wrap status\">\n        <!-- creation date -->\n        @if (value.creationDate) {\n          <ion-text>\n            <ion-icon name=\"calendar\"></ion-icon>\n            &nbsp;\n            <span translate>COMMON.CREATED_ON</span>\n            <span>\n            &nbsp;\n            <b>{{ value.creationDate | dateFormat: {time: true} }}</b>\n          </span>\n          </ion-text>\n        }\n\n        <!-- update date -->\n        @if (value.updateDate != value.creationDate && value.updateDate; as updateDate) {\n          <ion-text>\n            @if (value.creationDate) {\n              <br/>\n            }\n            <ion-label>\n              <ion-icon name=\"time-outline\"></ion-icon>\n              &nbsp;\n              <span translate>COMMON.UPDATED_ON</span>\n              <span>&nbsp;{{ updateDate | dateFormat: {time: true, seconds: true} }}</span>\n            </ion-label>\n          </ion-text>\n        }\n      </ion-label>\n\n      <ng-content></ng-content>\n    </ion-card-content>\n  </ion-card>\n}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { EntityMetadataComponent } from './entity-metadata.component';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { NgxJdenticonModule } from 'ngx-jdenticon';\nimport {CorePipesModule} from \"../../services/pipes/pipes.module\";\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild(), NgxJdenticonModule, CorePipesModule],\n\n  declarations: [\n    // Other components\n    EntityMetadataComponent,\n  ],\n  exports: [\n    TranslateModule,\n    // Components\n    EntityMetadataComponent,\n  ],\n})\nexport class AppEntityFormModule {}\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { AppPropertiesFormModule } from './properties/properties.module';\nimport { AppListFormModule } from './list/list.module';\nimport { AppTextPopoverModule } from './text-popover/text-popover.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AppEntityFormModule } from './entity/entity.module';\nimport { AppFormButtonsBarModule } from './buttons/form-buttons-bar.module';\nimport { AppUsernameFormModule } from './username/username.module';\nimport { AppTextFormModule } from './text/text-form.module';\n\n@NgModule({\n  imports: [\n    SharedModule,\n    TranslateModule.forChild(),\n\n    // Sub modules\n    AppEntityFormModule,\n    AppListFormModule,\n    AppPropertiesFormModule,\n    AppTextFormModule,\n    AppTextPopoverModule,\n    AppFormButtonsBarModule,\n    AppUsernameFormModule,\n  ],\n\n  declarations: [],\n\n  exports: [\n    TranslateModule,\n\n    // Sub modules\n    AppEntityFormModule,\n    AppListFormModule,\n    AppPropertiesFormModule,\n    AppTextFormModule,\n    AppTextPopoverModule,\n    AppFormButtonsBarModule,\n  ],\n})\nexport class AppFormModule {}\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core';\nimport { slideUpDownAnimation } from '../../shared/material/material.animations';\n\n@Component({\n  selector: 'app-update-offline-mode-card',\n  templateUrl: 'update-offline-mode-card.component.html',\n  styleUrls: ['./update-offline-mode-card.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  animations: [slideUpDownAnimation],\n})\nexport class AppUpdateOfflineModeCard implements OnDestroy {\n  @Input() progressionMessage: string;\n  @Input() progressionValue: number;\n  @Output() onUpdateClick = new EventEmitter<Event>();\n\n  constructor() {}\n\n  ngOnDestroy() {\n    this.onUpdateClick.complete();\n  }\n\n  /* -- private method  -- */\n}\n","<!-- Update offline feature card-->\n<ion-card color=\"accent\" class=\"main ion-no-margin\" @slideUpDownAnimation>\n  <ion-card-content class=\"ion-no-padding\">\n    <ion-grid>\n      <ion-row *ngIf=\"!progressionValue; else progression\">\n        <ion-col>\n          <ion-text class=\"ion-text-wrap\">\n            <h4>\n              <b [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE' | translate\"></b>\n            </h4>\n            <h3>\n              <small [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE_HELP' | translate\"></small>\n            </h3>\n          </ion-text>\n        </ion-col>\n\n        <!-- Update button -->\n        <ion-col size=\"auto\">\n          <ion-button color=\"tertiary\" class=\"ion-float-end\" (click)=\"onUpdateClick.emit($event)\">\n            <span translate>NETWORK.BTN_UPDATE</span>\n          </ion-button>\n        </ion-col>\n      </ion-row>\n\n      <ng-template #progression>\n        <ion-row>\n          <ion-col>\n            <ion-text class=\"ion-text-wrap\" [innerHTML]=\"progressionMessage\"></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <ion-progress-bar [value]=\"progressionValue / 100\"></ion-progress-bar>\n          </ion-col>\n        </ion-row>\n      </ng-template>\n    </ion-grid>\n  </ion-card-content>\n</ion-card>\n","import { NgModule } from '@angular/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { AppUpdateOfflineModeCard } from './update-offline-mode-card.component';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild()],\n\n  declarations: [\n    // Network\n    AppUpdateOfflineModeCard,\n  ],\n  exports: [\n    TranslateModule,\n\n    // Components\n    AppUpdateOfflineModeCard,\n  ],\n})\nexport class AppUpdateOfflineModeCardModule {}\n","import { Injectable } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms';\nimport { AppValidatorService } from './base.validator.class';\n\nimport { UserToken } from '../model/token.model';\nimport { isEmptyArray, isNotNilOrBlank, toNumber } from '../../../shared/functions';\n\n@Injectable({ providedIn: 'root' })\nexport class UserTokenValidatorService extends AppValidatorService<UserToken> {\n  constructor(formBuilder: UntypedFormBuilder) {\n    super(formBuilder);\n  }\n\n  getFormGroup(data?: UserToken): UntypedFormGroup {\n    return this.formBuilder.group({\n      id: [toNumber(data?.id, null)],\n      pubkey: [data?.pubkey || null, Validators.required],\n      token: [data?.token || null],\n      name: [data?.name || null, Validators.compose([Validators.required, Validators.maxLength(100)])],\n      flags: [data?.flags || null],\n      scopes: [data?.scopes || null, UserTokenValidatorService.notEmptyArray],\n      expirationDate: [data?.expirationDate || null],\n      lastUsedDate: [data?.lastUsedDate || null],\n      creationDate: [data?.creationDate || null],\n      updateDate: [data?.updateDate || null],\n    });\n  }\n\n  updateFormGroup(formGroup: UntypedFormGroup, existingNames: string[]) {\n    formGroup.controls.name.validator = Validators.compose([\n      Validators.required,\n      Validators.maxLength(100),\n      UserTokenValidatorService.notAlreadyExists(existingNames),\n    ]);\n  }\n\n  static notAlreadyExists(existingNames: string[]): ValidatorFn {\n    return (control) => {\n      const value = control.value;\n      if (isNotNilOrBlank(value) && existingNames?.includes(value)) {\n        return { notAlreadyExists: true };\n      }\n      return null;\n    };\n  }\n\n  static notEmptyArray(control: UntypedFormControl): ValidationErrors | null {\n    const value = control.value;\n    if (isEmptyArray(value)) {\n      return { notEmptyArray: true };\n    }\n    return null;\n  }\n}\n","import {Directive, EnvironmentInjector, inject, Input, OnDestroy, OnInit, runInInjectionContext} from '@angular/core';\nimport {BehaviorSubject, Subject, Subscription} from 'rxjs';\nimport {AppFormProvider, AppFormUtils, IAppForm, IAppFormGetter, OnReady} from './form.utils';\nimport {waitForFalse, WaitForOptions, waitForTrue} from '../../shared/observables';\nimport {AppTable} from '../table/table.class';\nimport {AppForm} from './form.class';\nimport {AppEditor} from './entity/editor.class';\nimport {AbstractControl, FormGroup} from '@angular/forms';\nimport {AppAsyncTable} from '../table/async-table.class';\n\nexport interface IAppFormContainer<T = any> extends IAppForm<T> {\n  children: IAppForm[];\n  tables: AppTable<any>[];\n  asyncTables: AppAsyncTable<any>[];\n  forms: AppForm<any>[];\n  editors: AppEditor<any>[];\n\n  addForm(path: string, form?: IAppForm | IAppFormGetter): void;\n  addForms(forms: (IAppForm | IAppFormGetter)[]): void;\n  removeForm(form: string | IAppForm | IAppFormGetter): IAppForm | IAppFormGetter;\n}\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class AppFormContainer<T = any> implements IAppFormContainer<T>, OnInit, OnDestroy {\n  private _children: IAppForm[];\n  private _childrenPath: string[];\n  private _subscription = new Subscription();\n  private _environmentInjector = inject(EnvironmentInjector);\n  protected _logPrefix = '[form-container] ';\n  protected _enabled = false;\n\n  protected readonly destroySubject = new Subject<void>();\n\n  // TODO use RxState instead ?\n  readonly enabledSubject = new BehaviorSubject<boolean>(false);\n  readonly readySubject = new BehaviorSubject<boolean>(false);\n  readonly loadingSubject = new BehaviorSubject<boolean>(true);\n  readonly dirtySubject = new BehaviorSubject<boolean>(false);\n  readonly touchedSubject = new BehaviorSubject<boolean>(false);\n  readonly errorSubject = new BehaviorSubject<string>(undefined);\n\n  get children(): IAppForm[] {\n    return this._children;\n  }\n\n  get tables(): AppTable<any>[] {\n    return this._children && (this._children.filter((c) => c instanceof AppTable) as AppTable<any>[]);\n  }\n\n  get asyncTables(): AppAsyncTable<any>[] {\n    return this._children && (this._children.filter((c) => c instanceof AppAsyncTable) as AppAsyncTable<any>[]);\n  }\n\n  get forms(): AppForm<any>[] {\n    return this._children && (this._children.filter((c) => c instanceof AppForm) as AppForm<any>[]);\n  }\n\n  get editors(): AppEditor<any>[] {\n    return this._children && (this._children.filter((c) => c instanceof AppEditor) as AppEditor[]);\n  }\n\n  get error(): string {\n    return this.errorSubject.value;\n  }\n\n  set error(error: string) {\n    this.setError(error);\n  }\n\n  get loading(): boolean {\n    return this.loadingSubject.value || (this._children && this._children.findIndex((c) => c.enabled && c.loading) !== -1) || false;\n  }\n\n  get loaded(): boolean {\n    return (!this.loadingSubject.value && (!this._children || this._children.findIndex((c) => c.enabled && c.loading) === -1)) || false;\n  }\n\n  get dirty(): boolean {\n    return this.dirtySubject.value || (this._children && this._children.findIndex((c) => c.enabled && c.dirty) !== -1) || false;\n  }\n\n  get valid(): boolean {\n    // Important: Should be not invalid AND not pending, so use '!valid' (DO NOT use 'invalid')\n    return !this._children || this._children.findIndex((c) => c.enabled && !c.valid) === -1;\n  }\n\n  get invalid(): boolean {\n    return (this._children && this._children.findIndex((c) => c.enabled && c.invalid) !== -1) || false;\n  }\n\n  get pending(): boolean {\n    return (this._children && this._children.findIndex((c) => c.enabled && c.pending) !== -1) || false;\n  }\n\n  get empty(): boolean {\n    return !this._enabled;\n  }\n\n  get touched(): boolean {\n    return this.touchedSubject.value || (this._children && this._children.findIndex((c) => c.enabled && c.touched) !== -1) || false;\n  }\n\n  get untouched(): boolean {\n    return (!this.touchedSubject.value && (!this._children || this._children.findIndex((c) => c.enabled && c.touched) === -1)) || false;\n  }\n\n  get enabled(): boolean {\n    return this._enabled;\n  }\n\n  get disabled(): boolean {\n    return !this._enabled;\n  }\n\n  get destroyed(): boolean {\n    return this.destroySubject?.closed !== false;\n  }\n\n  @Input() debug = false;\n\n  protected constructor() {}\n\n  ngOnInit() {\n    // Can be override by sub classes\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n\n    this.readySubject.unsubscribe();\n    this.loadingSubject.unsubscribe();\n    this.touchedSubject.unsubscribe();\n    this.errorSubject.unsubscribe();\n\n    this.destroySubject.next();\n    this.destroySubject.unsubscribe();\n  }\n\n  addForm(path: string, form?: FormGroup | IAppForm | IAppFormGetter) {\n    if (!form) throw new Error('Trying to register an undefined child form');\n    this._children = this._children || [];\n    this._childrenPath = this._childrenPath || [];\n\n    // Form getter\n    if (typeof form === 'function') {\n      this._children.push(new AppFormProvider(form));\n      this._childrenPath.push(path ?? null);\n    }\n\n    // Form group\n    else if (form instanceof FormGroup) {\n      if (!path || !this._childrenPath.includes(path)) {\n        runInInjectionContext(this._environmentInjector, () => {\n          this._children.push(new AppForm(null, form));\n        })\n        this._childrenPath.push(path ?? null);\n      } else {\n        throw new Error('Trying to register an already registered child form');\n      }\n    }\n\n    // IAppForm\n    else {\n      if (!this._children.includes(form as IAppForm) && (!path || !this._childrenPath.includes(path))) {\n        this._children.push(form as IAppForm);\n        this._childrenPath.push(path ?? null);\n      } else {\n        throw new Error('Trying to register an already registered child form');\n      }\n    }\n  }\n\n  addForms(forms: (IAppForm | FormGroup | IAppFormGetter)[]) {\n    (forms || []).forEach((form) => this.addForm(null, form));\n  }\n\n  removeForm(form: string | IAppForm | FormGroup | IAppFormGetter): IAppForm | IAppFormGetter {\n    if (!form) throw new Error('Trying to remove an undefined child form');\n    const index =\n      typeof form == 'string'\n        ? (this._childrenPath || []).findIndex((c) => c === form)\n        : (form instanceof FormGroup)\n          ? (this._children || []).findIndex((c) => c['form'] === form)\n          : (this._children || []).findIndex((c) => c === form);\n    if (index !== -1) {\n      this._childrenPath.splice(index, 1);\n      return this._children.splice(index, 1)?.[0];\n    }\n    return undefined;\n  }\n\n  disable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this._enabled = false;\n    this._children?.forEach((c) => c.disable(opts));\n\n    // Emit event\n    if (!opts || opts.emitEvent !== false) {\n      if (this.enabledSubject.value !== false) {\n        this.enabledSubject.next(false);\n      }\n      if (!this.loading) this.markForCheck();\n    }\n  }\n\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this._enabled = true;\n    this._children?.forEach((c) => c.enable(opts));\n\n    // Emit event\n    if (!opts || opts.emitEvent !== false) {\n      if (this.enabledSubject.value !== true) {\n        this.enabledSubject.next(true);\n      }\n      if (!this.loading) this.markForCheck();\n    }\n  }\n\n  markAsPristine(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this.error = null;\n    if (this.dirtySubject.value !== false) {\n      this.dirtySubject.next(false);\n    }\n    this._children?.forEach((c) => c.markAsPristine(opts));\n    if (!this.loading && (!opts || opts.emitEvent !== false)) this.markForCheck();\n  }\n\n  markAsUntouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (this.touchedSubject.value !== false) {\n      this.touchedSubject.next(false);\n    }\n    this._children?.forEach((c) => c.markAsUntouched());\n    if (!this.loading && (!opts || opts.emitEvent !== false)) this.markForCheck();\n  }\n\n  /**\n   * @deprecated prefer to use markAllAsTouched()\n   * @param opts\n   */\n  markAsTouched(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (!this.touchedSubject.value !== true) {\n      this.touchedSubject.next(true);\n    }\n    this._children?.forEach((c) => c.markAsTouched(opts));\n    if (!this.loading && (!opts || opts.emitEvent !== false)) this.markForCheck();\n  }\n\n  markAllAsTouched(opts?: { emitEvent?: boolean }) {\n    if (this.touchedSubject.value !== true) {\n      this.touchedSubject.next(true);\n    }\n    this._children?.forEach((c) => c.markAllAsTouched(opts));\n    if (!this.loading && (!opts || opts.emitEvent !== false)) this.markForCheck();\n  }\n\n  markAsDirty(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (this.dirtySubject.value !== true) {\n      this.dirtySubject.next(true);\n      if (!this.loading && (!opts || opts.emitEvent !== false)) this.markForCheck();\n    }\n  }\n\n  markAsLoading(opts?: { emitEvent?: boolean }) {\n    if (!this.loadingSubject.closed && this.loadingSubject.value !== true) {\n      this.loadingSubject.next(true);\n\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  markAsLoaded(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (!this.loadingSubject.closed && this.loadingSubject.value !== false) {\n      this.loadingSubject.next(false);\n      if (!opts || opts.onlySelf !== true) {\n        // Emit to children forms and editors\n        // note: tables should be changed by parent\n        this.forms?.forEach((f) => f.markAsLoaded(opts));\n        this.editors?.forEach((e) => e.markAsLoaded(opts));\n      }\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  markAsReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this._children?.forEach((c) => c.markAsReady(opts));\n    if (!this.readySubject.closed && this.readySubject.value !== true) {\n      this.readySubject.next(true);\n\n      // If subclasses implements OnReady\n      if (typeof this['ngOnReady'] === 'function') {\n        (this as any as OnReady).ngOnReady();\n      }\n    }\n  }\n\n  markAsNotReady(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    this._children?.forEach((c) => c.markAsNotReady(opts));\n    if (!this.readySubject.closed && this.readySubject.value !== false) {\n      this.readySubject.next(false);\n    }\n  }\n\n  /**\n   * Wait form is ready\n   *\n   * @param opts\n   */\n  ready(opts?: WaitForOptions): Promise<void> {\n    if (this.readySubject.value) return Promise.resolve();\n    return waitForTrue(this.readySubject, { stop: this.destroySubject, ...opts });\n  }\n\n  /**\n   * Wait form is not busy (=loaded)\n   *\n   * @param opts\n   */\n  waitIdle(opts?: WaitForOptions): Promise<void> {\n    if (!this.loadingSubject.value) return Promise.resolve();\n    return waitForFalse(this.loadingSubject, { stop: this.destroySubject, ...opts });\n  }\n\n  logFormErrors(prefix?: string) {\n    if (this.debug) console.debug('[editor] Editor not valid. Checking where (forms, tables)...');\n    this._children?.forEach((c, index) => {\n      const path = this._childrenPath[index];\n      this.logChildrenErrors(c, prefix, path);\n    });\n  }\n\n  /* -- protected methods -- */\n\n  protected registerSubscription(sub: Subscription) {\n    this._subscription.add(sub);\n  }\n\n  protected unregisterSubscription(sub: Subscription): void {\n    this._subscription.remove(sub);\n  }\n\n  protected setError(value: string, opts?: { emitEvent?: boolean }) {\n    // Compare using '!=' to detect null and undefined as same value\n    if (this.errorSubject.value != value) {\n      this.errorSubject.next(value);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  protected resetError(opts?: { emitEvent?: boolean }) {\n    this.setError(undefined, opts);\n  }\n\n  protected markForCheck() {\n    // Should be overwritten by subclasses\n    if (this.debug) console.warn('markForCheck() has been called, but is not overwritten by component ' + this.constructor.name);\n  }\n\n  protected logChildrenErrors(c: IAppForm | AbstractControl, prefix?: string, path?: string) {\n    prefix = prefix || this._logPrefix;\n    // If editor\n    if (c instanceof AppEditor) {\n      if (!c.empty && !c.valid) {\n        if (c.pending) {\n          const path = c.constructor.name.toLowerCase();\n          console.warn(`${prefix} -> ${path}: waiting while pending...`);\n          AppFormUtils.waitWhilePending(c, { timeout: 1000 }).then(() => c.logFormErrors(prefix));\n        } else {\n          c.logFormErrors(prefix);\n        }\n      }\n    }\n    // Angular form control\n    else if (c instanceof AbstractControl) {\n      AppFormUtils.logFormErrors(c, prefix, path);\n    }\n    // If form provider: get delegate\n    else if (c instanceof AppFormProvider) {\n      if (!c.empty && !c.valid) {\n        c.waitDelegate({ timeout: 1000 }).then((delegate) => this.logChildrenErrors(delegate, prefix, path));\n      }\n    }\n    // If table\n    else if (c instanceof AppTable) {\n      if (c.invalid && c.editedRow && c.editedRow.validator) {\n        const path = c.constructor.name.toLowerCase();\n        AppFormUtils.logFormErrors(c.editedRow.validator, prefix, path);\n      }\n    } else if (c instanceof AppAsyncTable) {\n      if (c.invalid && c.dataSource?.hasSomeEditingRow()) {\n        const path = c.constructor.name.toLowerCase();\n        c.dataSource.getEditingRows().forEach((editedRow) => {\n          AppFormUtils.logFormErrors(editedRow.validator, prefix, path);\n        });\n      }\n    }\n    // If form\n    else if (c instanceof AppForm) {\n      if (!c.empty && !c.valid) {\n        if (c.pending) {\n          const path = c.constructor.name.toLowerCase();\n          console.warn(`${prefix} -> ${path}: waiting while pending...`);\n          AppFormUtils.waitWhilePending(c, { timeout: 1000 }).then(() => this.logChildrenErrors(c.form, prefix, path));\n        } else {\n          AppFormUtils.logFormErrors(c.form, prefix);\n        }\n      }\n    } else {\n      console.warn(`${prefix} Unknown children sub-form: `, c);\n    }\n  }\n}\n","import {AfterViewInit, Directive, OnDestroy, OnInit, Optional, ViewChild} from '@angular/core';\nimport {ActivatedRoute, Params, Router} from '@angular/router';\nimport {AlertController, IonContent, NavController, ToastController} from '@ionic/angular';\nimport {TranslateService} from '@ngx-translate/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {AppTable} from '../../table/table.class';\nimport {AppForm} from '../form.class';\nimport {FormButtonsBarToken} from '../buttons/form-buttons-bar.component';\nimport {AppFormUtils, CanLeave, CanSave, IAppForm, IAppFormGetter} from '../form.utils';\nimport {ShowToastOptions, Toasts} from '../../../shared/toast/toasts';\nimport {ToolbarToken} from '../../../shared/toolbar/toolbar';\nimport {toNumber} from '../../../shared/functions';\nimport {throttleTime} from 'rxjs/operators';\nimport {AppFormContainer, IAppFormContainer} from '../form-container.class';\nimport {FormGroup} from '@angular/forms';\n\nexport interface IAppEditor<T> extends IAppFormContainer<T>, CanSave, CanLeave {\n  save(event?: Event, options?: any): Promise<boolean>;\n  cancel(event?: Event): Promise<void>;\n}\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class AppEditor<T = any, ID = number, O = any>\n  extends AppFormContainer<T>\n  implements IAppEditor<T>, OnInit, OnDestroy, AfterViewInit\n{\n  protected toastController: ToastController;\n\n  readonly savingSubject = new BehaviorSubject<boolean>(false);\n\n  submitted = false;\n  queryParams: Params;\n  i18nContext: {\n    prefix: string;\n    suffix: string;\n  };\n\n  get saving(): boolean {\n    return this.savingSubject.value || this.editors?.some((e) => e.saving);\n  }\n\n  @ViewChild(ToolbarToken) toolbar: ToolbarToken | null = null;\n  @ViewChild(FormButtonsBarToken, { static: true }) formButtonsBar: FormButtonsBarToken | null = null;\n  @ViewChild(IonContent, { static: true }) content: IonContent;\n\n  abstract get isNewData(): boolean;\n\n  protected constructor(\n    @Optional() protected route: ActivatedRoute, // Modal editor give 'null'\n    protected router: Router,\n    protected navController: NavController,\n    protected alertCtrl: AlertController,\n    protected translate: TranslateService\n  ) {\n    super();\n    this._logPrefix = '[editor] ';\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    if (this.formButtonsBar) {\n      this.registerSubscription(\n        this.formButtonsBar.onBack\n          .pipe(throttleTime(200)) // Avoid to be called twice\n          .subscribe((event) => this.goBack(event))\n      );\n    }\n  }\n\n  // eslint-disable-next-line @angular-eslint/no-empty-lifecycle-method\n  ngAfterViewInit() {\n    // Can be overridden by subclasses\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n    this.savingSubject.unsubscribe();\n  }\n\n  /**\n   * @deprecated Use addForm(path, form)\n   * @param form\n   */\n  addChildForm(form: IAppForm | FormGroup | IAppFormGetter) {\n    this.addForm(null, form);\n  }\n\n  /**\n   * @deprecated Use addForms()\n   * @param forms\n   */\n  addChildForms(forms: (IAppForm | FormGroup | IAppFormGetter)[]) {\n    this.addForms(forms);\n  }\n\n  /**\n   * @deprecated Use removeForm()\n   * @param form\n   */\n  removeChildForm(form: IAppForm | FormGroup | IAppFormGetter): IAppForm | IAppFormGetter {\n    return this.removeForm(form);\n  }\n\n  markAsSaving(opts?: { emitEvent?: boolean }) {\n    if (this.savingSubject.value !== true) {\n      this.savingSubject.next(true);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  markAsSaved(opts?: { emitEvent?: boolean }) {\n    if (!this.savingSubject.closed && this.savingSubject.value !== false) {\n      this.savingSubject.next(false);\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  async cancel(event?: Event): Promise<void> {\n    if (this.isNewData) {\n      await this.unload(); // async reset\n    } else if (this.dirty) {\n      await this.reload(); // async reload\n    }\n  }\n\n  /**\n   * Unload the page (remove all data). Useful when reusing angular cache a cancelled page\n   *\n   * @param opts\n   */\n  async unload(opts?: { emitEvent?: boolean }): Promise<void> {\n    console.debug(this._logPrefix + 'Unloading data...');\n    this.markAsLoading();\n    this.children?.forEach((f) => {\n      if (f instanceof AppForm) {\n        // Fix error when 'null' is pass (default value = {} was not applied)\n        f.reset(undefined, opts);\n      } else if (f instanceof AppTable) {\n        f.dataSource.disconnect();\n      } else if (f instanceof AppEditor) {\n        f.unload(opts);\n      }\n    });\n\n    this.markAsPristine(opts);\n    this.markAsSaved(opts);\n  }\n\n  async reloadWithConfirmation(confirm?: boolean) {\n    const needConfirm = this.dirty;\n    // if not confirm yet: ask confirmation\n    if (!confirm && needConfirm) {\n      const translations = this.translate.instant([\n        'COMMON.BTN_ABORT_CHANGES',\n        'COMMON.BTN_CANCEL',\n        'CONFIRM.CANCEL_CHANGES',\n        'CONFIRM.ALERT_HEADER',\n      ]);\n      const alert = await this.alertCtrl.create({\n        header: translations['CONFIRM.ALERT_HEADER'],\n        message: translations['CONFIRM.CANCEL_CHANGES'],\n        buttons: [\n          {\n            text: translations['COMMON.BTN_ABORT_CHANGES'],\n            cssClass: 'secondary',\n            handler: () => {\n              confirm = true; // update upper value\n            },\n          },\n          {\n            text: translations['COMMON.BTN_CANCEL'],\n            role: 'cancel',\n            handler: () => {},\n          },\n        ],\n      });\n      await alert.present();\n      await alert.onDidDismiss();\n    }\n\n    // If confirm: execute the reload\n    if (confirm || !needConfirm) {\n      this.scrollToTop();\n      this.disable();\n      return await this.reload();\n    }\n  }\n\n  async goBack(event?: Event): Promise<void | boolean> {\n    // Go back\n    if (this.toolbar?.canGoBack) {\n      return this.toolbar.goBack();\n    } else {\n      // Back to home\n      return this.navController.navigateBack('/');\n    }\n  }\n\n  abstract load(id?: ID, options?: O): Promise<void>;\n\n  abstract save(event?: Event, options?: any): Promise<boolean>;\n\n  abstract reload(): Promise<void>;\n\n  /* -- protected methods -- */\n\n  protected async scrollToTop(duration?: number) {\n    duration = toNumber(duration, 500);\n\n    if (!this.content) {\n      console.warn(`[tab-editor] Cannot scroll to top. (no 'ion-content' tag found ${this.constructor.name}`);\n\n      // TODO: FIXME (not working as the page is not the window)\n      const scrollToTop = window.setInterval(() => {\n        const pos = window.scrollY;\n        if (pos > 0) {\n          window.scrollTo(0, pos - 20); // how far to scroll on each step\n        } else {\n          window.clearInterval(scrollToTop);\n        }\n      }, 16);\n      return;\n    }\n\n    return this.content.scrollToTop(duration);\n  }\n\n  protected async saveIfDirtyAndConfirm(\n    event?: Event,\n    opts?: {\n      emitEvent?: boolean;\n      confirmed?: boolean;\n      [key: string]: any;\n    }\n  ): Promise<boolean> {\n    if (!this.dirty) return true;\n\n    let confirmed = opts?.confirmed || false;\n    if (!confirmed) {\n      let cancel = false;\n      const translations = this.translate.instant([\n        'COMMON.BTN_SAVE',\n        'COMMON.BTN_CANCEL',\n        'COMMON.BTN_ABORT_CHANGES',\n        'CONFIRM.SAVE',\n        'CONFIRM.ALERT_HEADER',\n      ]);\n      const alert = await this.alertCtrl.create({\n        header: translations['CONFIRM.ALERT_HEADER'],\n        message: translations['CONFIRM.SAVE'],\n        buttons: [\n          {\n            text: translations['COMMON.BTN_CANCEL'],\n            role: 'cancel',\n            cssClass: 'secondary',\n            handler: () => {\n              cancel = true;\n            },\n          },\n          {\n            text: translations['COMMON.BTN_ABORT_CHANGES'],\n            cssClass: 'secondary',\n            handler: () => {},\n          },\n          {\n            text: translations['COMMON.BTN_SAVE'],\n            handler: () => {\n              confirmed = true; // update upper value\n            },\n          },\n        ],\n      });\n      await alert.present();\n      await alert.onDidDismiss();\n\n      if (!confirmed) {\n        return !cancel;\n      }\n    }\n\n    return await this.save(event, opts);\n  }\n\n  protected async saveDirtyChildren(): Promise<boolean> {\n    // Save all dirty tables\n    const dirtyChildren = (this.children || []).filter((c) => c.dirty).filter(AppFormUtils.canSave);\n    const results = await Promise.all(dirtyChildren.map((c) => c.save()));\n    return !results.some((saved) => saved !== true);\n  }\n\n  protected async showToast(opts: ShowToastOptions) {\n    if (!this.toastController) throw new Error(\"Missing toastController in component's constructor\");\n    await Toasts.show(this.toastController, this.translate, opts);\n  }\n}\n","import { Directive, EventEmitter, Input, OnDestroy, OnInit, Optional, Output, ViewChild } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { MatTabChangeEvent, MatTabGroup } from '@angular/material/tabs';\nimport { AlertController, NavController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { HammerSwipeEvent } from '../../../shared/gesture/hammer.utils';\nimport { isNotNil, toNumber } from '../../../shared/functions';\nimport { AppEditor, IAppEditor } from './editor.class';\n\nexport interface IAppTabEditor<T = any> extends IAppEditor<T> {\n  selectedTabIndex: number;\n  setSelectedTabIndex(value: number, opts?: { emitEvent?: boolean; realignInkBar?: boolean }): void;\n  unload(opts?: { emitEvent?: boolean }): Promise<void>;\n  realignInkBar(): void;\n}\n\nexport class AppTabEditorOptions {\n  /**\n   * Number of tab. 1 by default\n   */\n  tabCount?: number;\n\n  /**\n   * '200ms' by default\n   */\n  tabGroupAnimationDuration?: string;\n\n  /**\n   * Should enable swipe between tab, on touch screen\n   */\n  enableSwipe?: boolean; // true by default\n}\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class AppTabEditor<T = any, ID = number, O = any> extends AppEditor<T, ID, O> implements IAppTabEditor<T>, OnInit, OnDestroy {\n  protected _selectedTabIndex = 0;\n\n  // Editor options\n  protected tabCount: number;\n  protected enableSwipe: boolean;\n  protected tabGroupAnimationDuration: string;\n\n  @Input() queryTabIndexParamName: string;\n\n  @Input() set selectedTabIndex(value: number) {\n    this.setSelectedTabIndex(value);\n  }\n  get selectedTabIndex(): number {\n    return this._selectedTabIndex;\n  }\n\n  @Output() readonly selectedTabIndexChange = new EventEmitter<number>();\n\n  @ViewChild('tabGroup', { static: true }) tabGroup: MatTabGroup;\n\n  protected constructor(\n    @Optional() route: ActivatedRoute, // Modal editor give 'null'\n    router: Router,\n    navController: NavController,\n    alertCtrl: AlertController,\n    translate: TranslateService,\n    @Optional() options?: AppTabEditorOptions\n  ) {\n    super(route, router, navController, alertCtrl, translate);\n    options = {\n      tabCount: 1,\n      enableSwipe: true,\n      tabGroupAnimationDuration: '200ms',\n      ...options,\n    };\n    this.tabCount = options.tabCount;\n    this.enableSwipe = options.enableSwipe;\n    this.tabGroupAnimationDuration = options.tabGroupAnimationDuration;\n    this.queryTabIndexParamName = 'tab';\n    this._logPrefix = '[tab-editor] ';\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Read the selected tab index, from path query params\n    if (this.tabGroup && this.route && this.queryTabIndexParamName) {\n      this.registerSubscription(\n        this.route.queryParams.subscribe((queryParams) => {\n          this.queryParams = { ...queryParams };\n\n          // Parse tab param\n          if (this.tabCount > 1 && this.queryTabIndexParamName) {\n            const tabIndex = toNumber(queryParams[this.queryTabIndexParamName], 0);\n            this.queryParams[this.queryTabIndexParamName] = tabIndex !== 0 ? tabIndex : undefined;\n            if (this.selectedTabIndex !== tabIndex) {\n              this.selectedTabIndex = tabIndex;\n            }\n          }\n\n          // Realign tab, after a delay because the tab can be disabled when component is created\n          setTimeout(() => this.tabGroup.realignInkBar(), 500);\n        })\n      );\n    }\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n    this.selectedTabIndexChange.complete();\n  }\n\n  setSelectedTabIndex(value: number, opts?: { emitEvent?: boolean; realignInkBar?: boolean }) {\n    // Fix value\n    if (value < 0) {\n      value = 0;\n    } else if (value > this.tabCount - 1) {\n      console.warn(`[tab-editor] Invalid tab index ${value}. Max value is ${this.tabCount - 1}`);\n      value = this._selectedTabIndex;\n    }\n\n    this._selectedTabIndex = value;\n    this.selectedTabIndexChange.next(value);\n\n    if (this.tabGroup && (!opts || opts.realignInkBar !== false)) {\n      this.tabGroup.selectedIndex = value;\n      this.markForCheck();\n      // Wait tab change in UI, before realign ink tab\n      setTimeout(() => this.tabGroup.realignInkBar(), 200);\n    } else if (!opts || opts.emitEvent !== false) {\n      this.markForCheck();\n    }\n  }\n\n  realignInkBar() {\n    this.tabGroup?.realignInkBar();\n  }\n\n  onTabChange(event: MatTabChangeEvent, queryTabIndexParamName?: string): boolean {\n    queryTabIndexParamName = queryTabIndexParamName || this.queryTabIndexParamName;\n\n    if (!queryTabIndexParamName || !this.route) return true; // Skip if tab query param not set, or no route\n\n    if (this.debug) console.debug(this._logPrefix + 'onTabChange()', event);\n\n    if (!this.queryParams || +this.queryParams[queryTabIndexParamName] !== event.index) {\n      this.queryParams = this.queryParams || {};\n      this.queryParams[queryTabIndexParamName] = event.index !== 0 ? event.index : undefined;\n\n      if (queryTabIndexParamName === 'tab' && isNotNil(this.queryParams['subtab'])) {\n        delete this.queryParams.subtab; // clean subtab\n      }\n      this.updateRoute();\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Action triggered when user swipes\n   */\n  onSwipeTab(event: HammerSwipeEvent | Event): boolean {\n    // DEBUG\n    // if (this.debug) console.debug(\"[tab-page] onSwipeTab()\");\n\n    // Skip, if not a valid swipe event\n    if (\n      !this.enableSwipe ||\n      !event?.type ||\n      event.defaultPrevented ||\n      (event['srcEvent']?.defaultPrevented) ||\n      event['pointerType'] !== 'touch'\n    ) {\n      return false;\n    }\n\n    // DEBUG\n    //if (this.debug)\n    //console.debug(\"[tab-page] Detected swipe: \" + event.type, event);\n\n    let selectTabIndex = this.selectedTabIndex;\n    switch (event.type) {\n      // Open next tab\n      case 'swipeleft':\n        selectTabIndex = selectTabIndex >= this.tabCount - 1 ? 0 : selectTabIndex + 1;\n        break;\n\n      // Open previous tab\n      case 'swiperight':\n        selectTabIndex = selectTabIndex <= 0 ? this.tabCount : selectTabIndex - 1;\n        break;\n\n      // Other case\n      default:\n        console.error('[tab-page] Unknown swipe action: ' + event.type);\n        return false;\n    }\n\n    setTimeout(() => {\n      this.selectedTabIndex = selectTabIndex;\n      this.markForCheck();\n    });\n\n    return true;\n  }\n\n  onSubTabChange(event: MatTabChangeEvent) {\n    this.onTabChange(event, 'subtab');\n  }\n\n  async unload(opts?: { emitEvent?: boolean }): Promise<void> {\n    this.selectedTabIndex = 0;\n    await super.unload(opts);\n  }\n\n  /* -- protected functions -- */\n\n  protected abstract getFirstInvalidTabIndex(): number;\n\n  protected async updateRoute(): Promise<boolean> {\n    if (!this.route) return false; // Skip if no route (e.g. in modal)\n    return this.router.navigate(['.'], {\n      relativeTo: this.route,\n      queryParams: this.queryParams,\n      state: { animated: false },\n    });\n  }\n}\n","import { AfterViewInit, ChangeDetectorRef, Directive, Injector, Input, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AlertController, ModalController, NavController } from '@ionic/angular';\n\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { LocalSettingsService } from '../../services/local-settings.service';\nimport { Entity } from '../../services/model/entity.model';\nimport { UsageMode } from '../../services/model/settings.model';\nimport { FormGroup } from '@angular/forms';\nimport { AppTabEditor, AppTabEditorOptions } from './tab-editor.class';\nimport { AppFormUtils } from '../form.utils';\nimport { Alerts } from '../../../shared/alerts';\nimport { AppErrorWithDetails, ErrorCodes } from '../../services/errors';\nimport { isNil, isNotNil, isNotNilOrBlank } from '../../../shared/functions';\nimport { DateFormatService } from '../../../shared/pipes/date-format.pipe';\nimport { waitForFalse, WaitForOptions } from '../../../shared/observables';\nimport { FormErrorTranslator } from '../../../shared/validator/form-error-adapter.class';\nimport { debounceTime } from 'rxjs/operators';\n\nexport interface IEntityEditorModalOptions<T extends Entity<T, ID> = Entity<any, any>, ID = number> {\n  // Data\n  isNew: boolean;\n  data: T;\n  disabled: boolean;\n\n  onAfterModalInit?: <M extends AppEntityEditorModal<T, ID>>(modal: M) => void | Promise<void>;\n  onDelete?: (event: Event, data: T) => Promise<boolean>;\n\n  usageMode: UsageMode;\n  mobile: boolean;\n  i18nSuffix?: string;\n}\n\nexport class AppEntityEditorModalOptions extends AppTabEditorOptions {\n  i18nPrefix?: string;\n}\n\n// @dynamic\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class AppEntityEditorModal<T extends Entity<T, ID>, ID = number, O extends AppEntityEditorModalOptions = AppEntityEditorModalOptions>\n  extends AppTabEditor<T, ID>\n  implements OnInit, OnDestroy, AfterViewInit, IEntityEditorModalOptions<T, ID>\n{\n  protected _logPrefix: string = '';\n  protected _isNew: boolean;\n\n  protected readonly dateFormat: DateFormatService;\n  protected readonly cd: ChangeDetectorRef;\n  protected readonly settings: LocalSettingsService;\n  protected readonly modalCtrl: ModalController;\n  protected errorTranslator: FormErrorTranslator;\n\n  readonly savingSubject = new BehaviorSubject<boolean>(false);\n\n  readonly titleSubject = new BehaviorSubject<string>(undefined);\n\n  @Input() data: T;\n  @Input() mobile: boolean;\n  @Input() usageMode: UsageMode;\n  @Input() onAfterModalInit: <M extends AppEntityEditorModal<T, ID>>(modal: M) => void | Promise<void>;\n  @Input() onDelete: (event: Event, data: T) => Promise<boolean>;\n  @Input() i18nSuffix: string = null;\n\n  /**\n   * @deprecated\n   */\n  protected get $title(): Subject<string> {\n    return this.titleSubject;\n  }\n\n  @Input() set isNew(value: boolean) {\n    this._isNew = value;\n  }\n\n  get isNew(): boolean {\n    return isNotNil(this._isNew) ? this._isNew : isNil(this.data?.id);\n  }\n\n  /**\n   * @deprecated use isNew instead\n   */\n  get isNewData(): boolean {\n    return this.isNew;\n  }\n  /**\n   * @deprecated use isNew instead\n   */\n  @Input() set isNewData(value: boolean) {\n    this.isNew = value;\n  }\n\n  @Input() set disabled(value: boolean) {\n    this._enabled = !value;\n  }\n\n  get disabled(): boolean {\n    return !this._enabled;\n  }\n\n  get isOnFieldMode(): boolean {\n    return this.settings.isOnFieldMode(this.usageMode);\n  }\n\n  protected constructor(\n    injector: Injector,\n    protected dataType: new () => T,\n    @Optional() options?: O\n  ) {\n    super(null, injector.get(Router), injector.get(NavController), injector.get(AlertController), injector.get(TranslateService), options);\n    options = <O>{\n      // Default options\n      i18nPrefix: '',\n\n      // Override defaults\n      ...options,\n    };\n\n    this.queryTabIndexParamName = undefined; // Important: avoid query parameter changed\n    this.settings = injector.get(LocalSettingsService);\n    this.errorTranslator = injector.get(FormErrorTranslator);\n    this.cd = injector.get(ChangeDetectorRef);\n    this.dateFormat = injector.get(DateFormatService);\n    this.modalCtrl = injector.get(ModalController);\n    this.i18nContext = {\n      prefix: options.i18nPrefix,\n      suffix: this.i18nSuffix || '',\n    };\n\n    // FOR DEV ONLY ----\n    //this.debug = !environment.production;\n  }\n\n  ngOnInit() {\n    // Default values\n    this.mobile = isNotNil(this.mobile) ? this.mobile : this.settings.mobile;\n    this.usageMode = this.usageMode || this.settings.usageMode;\n\n    super.ngOnInit();\n\n    // Register forms\n    this.registerForms();\n\n    // Disable\n    if (this.disabled) this.disable();\n\n    if (this.isNew) {\n      // Update the title.\n      this.updateTitle();\n    } else {\n      // Update title each time value changes\n      this.registerSubscription(this.form.valueChanges.pipe(debounceTime(250)).subscribe((json) => this.updateTitle(json)));\n    }\n  }\n\n  ngAfterViewInit() {\n    super.ngAfterViewInit();\n\n    if (this.onAfterModalInit) {\n      Promise.resolve(this.onAfterModalInit(this)).then(() => this.load());\n    } else {\n      // Use a timeout to avoid error 'NG0100: ExpressionChangedAfterItHasBeenCheckedError'\n      setTimeout(() => this.load());\n    }\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n    this.titleSubject.complete();\n    this.titleSubject.unsubscribe();\n  }\n\n  waitIdle(opts?: WaitForOptions): Promise<void> {\n    // Wait end of saving\n    if (this.saving) return waitForFalse(this.savingSubject);\n\n    return super.waitIdle(opts);\n  }\n\n  async load() {\n    this.markAsReady();\n    this.markAsLoading();\n\n    try {\n      await this.updateView(this.data);\n    } catch (err) {\n      if (err === 'CANCELLED') return;\n      this.setError(err);\n      this.selectedTabIndex = 0;\n    } finally {\n      this.markAsLoaded();\n    }\n  }\n\n  reload(): Promise<void> {\n    if (this.dirty) {\n      return this.load();\n    }\n  }\n\n  unload(opts?: { emitEvent?: boolean }): Promise<void> {\n    throw new Error('No implemented on modal');\n  }\n\n  async updateView(\n    data: T,\n    opts?: {\n      emitEvent?: boolean;\n      openTabIndex?: number;\n    }\n  ): Promise<void> {\n    this.resetError();\n\n    if (!data) throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };\n\n    this.data = data;\n\n    await this.setValue(data);\n\n    if (!opts || opts.emitEvent !== false) {\n      this.markAsPristine();\n      this.markAsUntouched();\n      this.updateViewState(data);\n\n      // Update the title.\n      this.updateTitle(data);\n    }\n  }\n\n  /**\n   * Enable or disable state\n   */\n  updateViewState(data: T, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (this.isNew || this.enabled) {\n      this.enable(opts);\n    } else {\n      this.disable(opts);\n\n      // Allow to sort table\n      this.tables?.forEach((t) => t.enableSort());\n      this.asyncTables?.forEach((t) => t.enableSort());\n    }\n  }\n\n  async saveAndClose(event?: Event | Event): Promise<boolean> {\n    const data = await this.saveAndGetDataIfValid();\n    if (data) {\n      this.modalCtrl.dismiss(data);\n      return true;\n    }\n    return false;\n  }\n\n  async close(event: Event | Event): Promise<void> {\n    if (this.dirty) {\n      const saveBeforeLeave = await Alerts.askSaveBeforeLeave(this.alertCtrl, this.translate, event);\n\n      // User cancelled\n      if (isNil(saveBeforeLeave) || (event && event.defaultPrevented)) {\n        return;\n      }\n\n      // Is user confirm: close normally\n      if (saveBeforeLeave === true) {\n        await this.saveAndClose(event);\n        return;\n      }\n    }\n\n    await this.modalCtrl.dismiss();\n  }\n\n  /**\n   * Save the editor, by calling the dataService.save().\n   * Ensure that editor if valid. If not, display an error\n   *\n   * @param event\n   * @param opts\n   */\n  async save(event?: Event | Event, opts?: any): Promise<boolean> {\n    if (this.loading || this.saving || this.disabled) {\n      console.debug(this._logPrefix + 'Skip save: modal is busy (loading or saving)');\n      return false;\n    }\n    if (!this.dirty) {\n      console.debug(this._logPrefix + 'Skip save: modal not dirty');\n      return true;\n    }\n\n    // Wait end of async validation\n    await this.waitWhilePending();\n\n    // If invalid\n    if (this.invalid) {\n      this.logFormErrors();\n      this.setError('COMMON.FORM.HAS_ERROR');\n      this.openFirstInvalidTab();\n      this.scrollToTop();\n      this.markAllAsTouched();\n\n      this.submitted = true;\n      return false;\n    }\n\n    this.markAsSaving();\n    this.resetError();\n\n    if (this.debug) console.debug(this._logPrefix + 'Saving data...');\n\n    try {\n      // Save all dirty children\n      const saved = await this.saveDirtyChildren();\n      if (!saved) return false;\n\n      // Fill data\n      this.data = await this.getValue();\n\n      // Mark as submitted\n      this.submitted = true;\n\n      return true;\n    } catch (err) {\n      this.submitted = true;\n      this.selectedTabIndex = 0; // Can by override by subclasses, using setError()\n      this.setError(err);\n      this.scrollToTop(); // Scroll to top (to show error)\n      this.markAsDirty();\n      this.enable();\n\n      return false;\n    } finally {\n      this.markAsSaved();\n    }\n  }\n\n  /**\n   * Save data (if dirty and valid), and return it. Otherwise, return nil value.\n   */\n  async saveAndGetDataIfValid(): Promise<T | undefined> {\n    // Form is not valid\n    if (!this.valid) {\n      // Make sure validation is finished\n      await AppFormUtils.waitWhilePending(this);\n\n      // If invalid: Open the first tab in error\n      if (this.invalid) {\n        this.openFirstInvalidTab();\n        return undefined;\n      }\n\n      // Continue (valid)\n    }\n\n    // Form is valid, but not saved\n    if (this.dirty) {\n      const saved = await this.save(new Event('save'));\n      if (!saved) return undefined;\n    }\n\n    // Valid and saved data\n    return this.data;\n  }\n\n  async delete(event?: Event | Event) {\n    if (this.loading || this.saving) return false;\n\n    this.markAsSaving();\n    this.resetError();\n    try {\n      // Delegate deletion to modal caller\n      if (this.onDelete) {\n        const result = await this.onDelete(event, this.data);\n\n        // User cancelled\n        if (isNil(result) || (event && event.defaultPrevented)) return;\n\n        if (result) {\n          await this.modalCtrl.dismiss(this.data, 'delete');\n        }\n      }\n\n      // Or dismiss, with the role 'delete'\n      else {\n        if (this.isNew) {\n          console.error(this._logPrefix + 'Trying to delete a new data. Make no sense!');\n        }\n\n        await this.modalCtrl.dismiss(this.data, 'delete');\n      }\n    } catch (err) {\n      this.submitted = true;\n      this.setError(err);\n      this.selectedTabIndex = 0;\n      this.markAsSaved();\n      if (this.enabled) this.enable();\n      return false;\n    }\n  }\n\n  resetError(opts?: { emitEvent?: boolean }) {\n    if (isNotNilOrBlank(this.error)) {\n      this.error = null;\n      if (!opts || opts.emitEvent !== false) this.markForCheck();\n    }\n  }\n\n  setError(err: string | AppErrorWithDetails, opts?: { emitEvent?: boolean; detailsCssClass?: string }) {\n    if (!err) {\n      super.setError(undefined, opts);\n    } else if (typeof err === 'string') {\n      console.error('[entity-editor] Error: ' + (err || ''));\n      super.setError(err as string, opts);\n    } else {\n      console.error('[entity-editor] Error: ' + err.message || '', err);\n      let userMessage = (err.message && this.translate.instant(err.message)) || err;\n\n      // Add details error (if any) under the main message\n      const detailMessage = !err.details || typeof err.details === 'string' ? (err.details as string) : err.details.message;\n      if (isNotNilOrBlank(detailMessage)) {\n        const cssClass = opts?.detailsCssClass || 'error-details';\n        userMessage += `<br/><small class=\"${cssClass}\" title=\"${detailMessage}\">`;\n        userMessage += detailMessage.length < 70 ? detailMessage : detailMessage.substring(0, 67) + '...';\n        userMessage += '</small>';\n      }\n      super.setError(userMessage, opts);\n    }\n  }\n\n  /* -- abstract methods (to override) -- */\n\n  abstract setValue(data: T): Promise<void> | void;\n\n  protected abstract registerForms(): void;\n\n  protected abstract computeTitle(data: T): Promise<string>;\n\n  protected abstract get form(): FormGroup;\n\n  protected abstract getFirstInvalidTabIndex(): number;\n\n  /* -- protected methods -- */\n\n  protected waitWhilePending(opts?: WaitForOptions): Promise<void> {\n    return AppFormUtils.waitWhilePending(this, opts);\n  }\n\n  protected async getValue(): Promise<T> {\n    const json = await this.getJsonValueToSave();\n\n    const res = new this.dataType();\n    res.fromObject(json);\n\n    return res;\n  }\n\n  protected getJsonValueToSave(): Promise<any> {\n    return Promise.resolve(this.form.value);\n  }\n\n  /**\n   * Compute the title\n   *\n   * @param data\n   */\n  protected async updateTitle(data?: T) {\n    data = data || this.data;\n    const title = await this.computeTitle(data);\n    this.titleSubject.next(title);\n  }\n\n  protected async scrollToTop(duration?: number) {\n    if (this.content) {\n      return this.content.scrollToTop(duration);\n    }\n  }\n\n  protected markForCheck() {\n    this.cd?.markForCheck();\n  }\n\n  /* -- private functions -- */\n\n  /**\n   * Open the first tab that is invalid\n   */\n  private openFirstInvalidTab() {\n    const invalidTabIndex = this.getFirstInvalidTabIndex();\n    if (invalidTabIndex !== -1 && this.selectedTabIndex !== invalidTabIndex) {\n      this.selectedTabIndex = invalidTabIndex;\n      this.markForCheck();\n    }\n  }\n}\n","import { TokenScope, UserToken } from '../services/model/token.model';\nimport { ChangeDetectorRef, Component, inject, Injector, Input, OnInit } from '@angular/core';\nimport { UserTokenValidatorService } from '../services/validator/user-token.validator';\nimport { MatAutocompleteFieldConfig } from '../../shared/material/autocomplete/material.autocomplete.config';\nimport { AppForm } from '../form/form.class';\nimport { AccountService } from '../services/account.service';\nimport { PlatformService } from '../services/platform.service';\nimport { isNilOrBlank, isNotNilOrBlank } from '../../shared/functions';\n\nimport { APP_SHOW_TOOLTIP } from '../../shared/constants';\n\n@Component({\n  selector: 'app-new-token-form',\n  templateUrl: './new-token.form.html',\n})\nexport class NewTokenForm extends AppForm<UserToken> implements OnInit {\n  protected tokenConfig: MatAutocompleteFieldConfig;\n  @Input() showScopes: boolean;\n  @Input() tokenScopes: TokenScope[];\n  @Input() existingNames: string[];\n  @Input() mobile: boolean;\n\n  private readonly platform: PlatformService;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    injector: Injector,\n    protected validator: UserTokenValidatorService,\n    protected accountService: AccountService,\n    protected cd: ChangeDetectorRef\n  ) {\n    super(injector, validator.getFormGroup());\n    this.platform = injector.get(PlatformService);\n  }\n\n  get valid(): boolean {\n    return super.valid && isNotNilOrBlank(this.value?.token);\n  }\n\n  get invalid(): boolean {\n    return super.invalid || isNilOrBlank(this.value?.token);\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    this.tokenConfig = {\n      items: this.tokenScopes.slice().map((value) => {\n        value.name = this.translate.instant(value.name);\n        return value;\n      }),\n      attributes: ['name'],\n    };\n\n    this.validator.updateFormGroup(this.form, this.existingNames);\n  }\n\n  async generate(event: UIEvent) {\n    event?.stopPropagation();\n\n    try {\n      const token = await this.accountService.generateToken(this.getFlags(this.value.scopes));\n      if (!token) {\n        this.setError('No token generated !');\n      }\n\n      this.form.patchValue({ token });\n\n      this.markForCheck();\n    } catch (e) {\n      this.setError(e);\n    }\n  }\n\n  async copy(event: UIEvent) {\n    event?.stopPropagation();\n    await this.platform.copyToClipboard(this.value.token, {\n      message: 'ACCOUNT.TOKENS.CREATE.COPIED',\n    });\n  }\n\n  async getValue(): Promise<UserToken> {\n    const value = await super.getValue();\n\n    // Set flags from scopes\n    value.flags = this.getFlags(value.scopes);\n\n    return value;\n  }\n\n  protected getFlags(scopes: TokenScope[]): number {\n    let flags = 0;\n    scopes.forEach((scope) => {\n      flags += scope.flag;\n    });\n    return flags;\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<form class=\"form-container\" [formGroup]=\"form\">\n  <ion-grid class=\"ion-no-padding\">\n    <ion-row>\n      <ion-col>\n        <mat-form-field>\n          <mat-label>{{ 'ACCOUNT.TOKENS.CREATE.NAME' | translate }}</mat-label>\n          <input\n            matInput\n            [appAutofocus]=\"true\"\n            [autofocusDelay]=\"500\"\n            formControlName=\"name\"\n            autocomplete=\"off\"\n            required\n            [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n          />\n          <mat-error *ngIf=\"form.controls.name.hasError('required') && form.controls.name.touched\" translate>\n            ERROR.FIELD_REQUIRED\n          </mat-error>\n          <mat-error *ngIf=\"form.controls.name.hasError('notAlreadyExists') && form.controls.name.touched\" translate>\n            ACCOUNT.TOKENS.CREATE.NAME_ALREADY_EXISTS\n          </mat-error>\n        </mat-form-field>\n      </ion-col>\n    </ion-row>\n    @if (showScopes) {\n      <ion-row>\n        <ion-col>\n          <mat-chips-field\n            formControlName=\"scopes\"\n            appearance=\"fill\"\n            chipColor=\"primary\"\n            [placeholder]=\"'ACCOUNT.TOKENS.CREATE.SCOPES' | translate\"\n            [config]=\"tokenConfig\"\n            [mobile]=\"mobile\"\n            [debug]=\"false\"\n            [required]=\"true\"\n            [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n          >\n            <mat-error *ngIf=\"form.controls.name.hasError('notEmptyArray') && form.controls.name.touched\" translate>\n              ERROR.FIELD_REQUIRED\n            </mat-error>\n          </mat-chips-field>\n        </ion-col>\n      </ion-row>\n    }\n    <ion-row>\n      <ion-col>\n        <mat-date-field\n          formControlName=\"expirationDate\"\n          [placeholder]=\"'ACCOUNT.TOKENS.CREATE.EXPIRATION_DATE' | translate\"\n          [mobile]=\"mobile\"\n          [required]=\"true\"\n          [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n        ></mat-date-field>\n      </ion-col>\n    </ion-row>\n    <ion-row>\n      <ion-col>\n        <ion-button\n          *ngIf=\"form | formGetValue: 'token' | isNilOrBlank; else showToken\"\n          [title]=\"!showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate) : ''\"\n          (click)=\"generate($event)\"\n          [disabled]=\"form.invalid\"\n        >\n          {{ 'ACCOUNT.TOKENS.CREATE.BTN_GENERATE' | translate }}\n        </ion-button>\n        <ng-template #showToken>\n          <p><b translate>ACCOUNT.TOKENS.CREATE.COPY_HELP</b></p>\n          <mat-form-field subscriptSizing=\"dynamic\">\n            <textarea\n              matInput\n              formControlName=\"token\"\n              readonly\n              style=\"height: auto; background-color: lightgray\"\n              rows=\"8\"\n            ></textarea>\n            <button\n              matSuffix\n              mat-icon-button\n              [title]=\"!showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate) : ''\"\n              (click)=\"copy($event)\"\n            >\n              <mat-icon>content_copy</mat-icon>\n            </button>\n          </mat-form-field>\n        </ng-template>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n</form>\n","import { AppEntityEditorModal, IEntityEditorModalOptions } from '../form/entity/entity-editor-modal.class';\nimport { TokenScope, UserToken } from '../services/model/token.model';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { Component, Injector, Input, OnInit, ViewChild } from '@angular/core';\nimport { AccountService } from '../services/account.service';\nimport { now } from 'moment';\nimport { fromUnixMsTimestamp } from '../../shared/dates';\nimport { NewTokenForm } from './new-token.form';\n\nexport interface INewTokenOptions extends IEntityEditorModalOptions<UserToken> {\n  showScopes: boolean;\n  tokenScopes: TokenScope[];\n  existingNames: string[];\n}\n\n@Component({\n  selector: 'app-new-token-modal',\n  templateUrl: './new-token.modal.html',\n})\nexport class NewTokenModal extends AppEntityEditorModal<UserToken> implements OnInit, INewTokenOptions {\n  @Input() showScopes: boolean;\n  @Input() tokenScopes: TokenScope[];\n  @Input() existingNames: string[];\n  @ViewChild(NewTokenForm, { static: true }) newTokenForm: NewTokenForm;\n\n  constructor(\n    injector: Injector,\n    protected accountService: AccountService\n  ) {\n    super(injector, UserToken, { tabCount: 1 });\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    this.enable();\n  }\n\n  protected computeTitle(data: UserToken): Promise<string> {\n    return this.translate.instant('ACCOUNT.TOKENS.CREATE.TITLE');\n  }\n\n  protected get form(): UntypedFormGroup {\n    return this.newTokenForm.form;\n  }\n\n  protected getFirstInvalidTabIndex(): number {\n    return 0;\n  }\n\n  protected registerForms() {\n    this.addForm(null, this.newTokenForm);\n  }\n\n  setValue(data: UserToken): Promise<void> | void {\n    // Affect pubkey from current account\n    data.pubkey = this.accountService.account.pubkey;\n\n    // Default expiration date\n    data.expirationDate = fromUnixMsTimestamp(now()).add(1, 'month');\n\n    this.newTokenForm.setValue(data);\n  }\n\n  protected async getValue(): Promise<UserToken> {\n    return this.newTokenForm.getValue();\n  }\n}\n","<app-modal-toolbar\n  modalName=\"NewTokenModal\"\n  [title]=\"titleSubject | async\"\n  [color]=\"'secondary'\"\n  [showSpinner]=\"loading\"\n  [canValidate]=\"!loading && valid\"\n  (cancel)=\"close($event)\"\n  (validate)=\"saveAndClose($event)\"\n></app-modal-toolbar>\n\n<ion-content class=\"ion-padding\">\n  <!-- error -->\n  <ion-item *ngIf=\"error\" lines=\"none\">\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n\n  <p><b translate>ACCOUNT.TOKENS.CREATE.DESCRIPTION</b></p>\n\n  <app-new-token-form\n    [showScopes]=\"showScopes\"\n    [tokenScopes]=\"tokenScopes\"\n    [existingNames]=\"existingNames\"\n    [mobile]=\"mobile\"\n  ></app-new-token-form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <ion-toolbar>\n    <ion-row class=\"ion-no-padding\" nowrap>\n      <ion-col>\n        <ng-content></ng-content>\n      </ion-col>\n\n      <ion-col size=\"auto\">\n        <ion-button fill=\"clear\" color=\"dark\" (click)=\"close($event)\">\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n\n        <ion-button\n          [fill]=\"invalid ? 'clear' : 'solid'\"\n          [disabled]=\"disabled || loading || invalid\"\n          (click)=\"saveAndClose($event)\"\n          (keyup.enter)=\"saveAndClose($event)\"\n          color=\"tertiary\"\n        >\n          <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { ChangeDetectionStrategy, Component, inject, Inject, Injector, Input, OnInit, Optional } from '@angular/core';\nimport { ValidatorService } from '@e-is/ngx-material-table';\nimport { UserTokenValidatorService } from '../services/validator/user-token.validator';\nimport { TokenScope, UserToken } from '../services/model/token.model';\nimport { AppInMemoryTable } from '../table/memory-table.class';\nimport { RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../table/table.model';\nimport { InMemoryEntitiesService } from '../../shared/services/memory-entity-service.class';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { APP_USER_TOKEN_SCOPES } from '../services/account.service';\nimport { INewTokenOptions, NewTokenModal } from './new-token.modal';\nimport { ConfigService } from '../services/config.service';\nimport { Configuration } from '../services/model/config.model';\nimport { CORE_CONFIG_OPTIONS } from '../services/config/core.config';\nimport { isNotEmptyArray, isNotNilOrBlank } from '../../shared/functions';\n\nimport { APP_SHOW_TOOLTIP } from '../../shared/constants';\n\n@Component({\n  selector: 'app-user-token-table',\n  templateUrl: 'token.table.html',\n  styleUrls: ['token.table.scss'],\n  providers: [{ provide: ValidatorService, useClass: UserTokenValidatorService }],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UserTokenTable extends AppInMemoryTable<UserToken> implements OnInit {\n  @Input() useSticky = false;\n\n  protected showScopes = false;\n  protected defaultScope: string;\n  protected tokenScopes: TokenScope[];\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    injector: Injector,\n    validatorService: ValidatorService,\n    protected configService: ConfigService,\n    @Inject(ENVIRONMENT) environment: Environment,\n    @Optional() @Inject(APP_USER_TOKEN_SCOPES) tokenScopes: TokenScope[]\n  ) {\n    super(\n      injector,\n      [...RESERVED_START_COLUMNS, 'name', 'scopes', 'lastUsedDate', 'expirationDate', 'creationDate', ...RESERVED_END_COLUMNS],\n      UserToken,\n      new InMemoryEntitiesService(UserToken, undefined, {\n        filterFnFactory: () => () => true,\n        equals: UserToken.equals,\n      }),\n      validatorService\n    );\n\n    this.tokenScopes = tokenScopes ?? [];\n    this.inlineEdition = false;\n    this.allowRowDetail = false;\n    this.defaultSortBy = 'creationDate';\n    this.defaultSortDirection = 'asc';\n    this.i18nColumnPrefix = 'ACCOUNT.TOKENS.TABLE.';\n    this.debug = !environment?.production;\n\n    if (!tokenScopes) {\n      console.warn('No TokenScopes provided. Please provide the token APP_USER_TOKEN_SCOPES with valid TokenScope array');\n    }\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    this.registerSubscription(this.configService.config.subscribe((config) => this.onConfigLoaded(config)));\n\n    this.markAsReady();\n  }\n\n  get value(): UserToken[] {\n    return super.value || [];\n  }\n\n  set value(data: UserToken[]) {\n    super.value = data;\n  }\n\n  setValue(value: UserToken[], opts?: { emitEvent?: boolean }) {\n    // Set scopes from flags\n    value?.forEach((userToken) => {\n      const scopes: TokenScope[] = [];\n      if (userToken.flags) {\n        this.tokenScopes.forEach((scope) => {\n          // eslint-disable-next-line no-bitwise\n          if (userToken.flags & scope.flag) {\n            scopes.push(scope);\n          }\n        });\n      }\n      userToken.scopes = scopes;\n    });\n\n    super.setValue(value, opts);\n  }\n\n  async addToken(event: UIEvent) {\n    if (event?.defaultPrevented) return; // Avoid multiple call\n\n    event?.preventDefault();\n    event?.stopPropagation();\n    const newToken = new UserToken();\n    if (isNotNilOrBlank(this.defaultScope) && isNotEmptyArray(this.tokenScopes)) {\n      const scope = this.tokenScopes.find((scope) => scope.id === this.defaultScope);\n      if (!scope) {\n        console.warn(\"[token-table] Cannot found the default scope '${this.defaultScope}' in values of APP_USER_TOKEN_SCOPES!\");\n      }\n      newToken.scopes = scope ? [scope] : [];\n    }\n\n    const modal = await this.modalCtrl.create({\n      component: NewTokenModal,\n      componentProps: <INewTokenOptions>{\n        mobile: this.mobile,\n        isNew: true,\n        data: newToken,\n        showScopes: this.showScopes,\n        tokenScopes: this.tokenScopes || [],\n        existingNames: this.value?.map((v) => v.name),\n      },\n      backdropDismiss: false,\n    });\n\n    await modal.present();\n    const { data } = await modal.onDidDismiss();\n\n    if (data?.name) {\n      // Add this token in the list\n      const row = await this.addRowToTable(undefined, { editing: false });\n      row.validator.patchValue(data);\n\n      this.markAsDirty({ emitEvent: false });\n      this.markForCheck();\n    }\n  }\n\n  // async revocate(event: UIEvent) {\n  //   if (this.selection.isEmpty()) return;\n  //\n  //   const confirmed = await Alerts.askConfirmation(this.i18nColumnPrefix + 'CONFIRM.REVOCATE', this.alertCtrl, this.translate);\n  //   if (!confirmed) return;\n  //\n  //   const now = moment();\n  //   this.selection.selected.forEach(row => {\n  //     row.validator.patchValue({revocationDate: now}, {emitEvent:true});\n  //     // row.validator.updateValueAndValidity();\n  //   });\n  //\n  //   this.markForCheck();\n  //   // this.markAsDirty();\n  // }\n\n  display(scopes: TokenScope[]) {\n    return scopes?.map((value) => this.translate.instant(value.name)).join(', ');\n  }\n\n  protected onConfigLoaded(config: Configuration) {\n    this.showScopes = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.AUTH_API_TOKEN_SCOPE_ENABLED);\n    this.setShowColumn('scopes', this.showScopes);\n    this.defaultScope = config.getProperty(CORE_CONFIG_OPTIONS.DEFAULT_AUTH_API_TOKEN_SCOPE);\n  }\n}\n","<mat-toolbar>\n  <!-- Refresh -->\n  <button\n    mat-icon-button\n    *ngIf=\"!mobile\"\n    [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n    [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n    (click)=\"emitRefresh()\"\n  >\n    <mat-icon>refresh</mat-icon>\n  </button>\n\n  <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n\n  <div class=\"toolbar-spacer\"></div>\n\n  @if (selection | isEmptySelection) {\n    <button\n      mat-icon-button\n      *ngIf=\"canEdit && !mobile\"\n      [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n      [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n      (click)=\"addToken($event)\"\n    >\n      <mat-icon>add</mat-icon>\n    </button>\n  } @else {\n    <button\n      mat-icon-button\n      [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n      [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n      (click)=\"deleteSelection($event)\"\n    >\n      <mat-icon>delete_outline</mat-icon>\n    </button>\n  }\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n  <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n    <ion-refresher-content></ion-refresher-content>\n  </ion-refresher>\n\n  <!-- table -->\n  <div class=\"table-container\">\n    <table\n      #table\n      mat-table\n      matSort\n      matSortDisableClear\n      [dataSource]=\"dataSource\"\n      [matSortActive]=\"defaultSortBy\"\n      [matSortDirection]=\"defaultSortDirection\"\n      [trackBy]=\"trackByFn\"\n    >\n      <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n        <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n          <mat-checkbox\n            (change)=\"$event ? masterToggle() : null\"\n            [checked]=\"this | isAllSelected\"\n            [indeterminate]=\"this | isNotAllSelected\"\n          ></mat-checkbox>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n          <mat-checkbox\n            (click)=\"$event.stopPropagation()\"\n            (change)=\"$event ? selection.toggle(row) : null\"\n            [checked]=\"selection | isSelected: row\"\n          ></mat-checkbox>\n        </td>\n      </ng-container>\n\n      <!-- Id Column -->\n      <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"cdk-visually-hidden\">\n          <ion-label>#</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"cdk-visually-hidden\">{{ row.currentData.id }}</td>\n      </ng-container>\n\n      <!-- name column -->\n      <ng-container matColumnDef=\"name\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\">\n          {{ (row.currentData | propertyGet: 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n        </td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"scopes\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\">\n          {{ display(row.currentData | propertyGet: 'scopes') }}\n        </td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"creationDate\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n          <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n          {{ row.currentData | propertyGet: 'creationDate' | dateFormat: { time: true } }}\n        </td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"expirationDate\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n          <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n          {{ row.currentData | propertyGet: 'expirationDate' | dateFormat: { time: true } }}\n        </td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"lastUsedDate\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n          <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n          {{ row.currentData | propertyGet: 'lastUsedDate' | dateFormat: { time: true } }}\n        </td>\n      </ng-container>\n\n      <!-- Actions buttons column -->\n      <app-actions-column\n        [stickyEnd]=\"useSticky\"\n        (optionsClick)=\"openSelectColumnsModal($event)\"\n        (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n        (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n        (backward)=\"confirmAndBackward($event.event, $event.row)\"\n        (forward)=\"confirmAndForward($event.event, $event.row)\"\n        [canCancel]=\"false\"\n      ></app-actions-column>\n\n      <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n      <tr\n        mat-row\n        *matRowDef=\"let row; columns: displayedColumns\"\n        [class.mat-row-selected]=\"row.editing\"\n        [class.mat-row-error]=\"row.validator?.invalid\"\n        [class.mat-row-dirty]=\"row.validator?.dirty\"\n        (click)=\"clickRow($event, row)\"\n        (keydown.escape)=\"escapeEditingRow($event)\"\n        [cdkTrapFocus]=\"row.validator?.invalid\"\n      ></tr>\n    </table>\n\n    <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n      <ion-item>\n        <ion-skeleton-text animated></ion-skeleton-text>\n      </ion-item>\n    </ng-container>\n\n    <ng-template #noResult>\n      <ion-item *ngIf=\"totalRowCount === 0\">\n        <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n      </ion-item>\n    </ng-template>\n  </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n  <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n    <ion-icon name=\"add\"></ion-icon>\n  </ion-fab-button>\n</ion-fab>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Inject, Injector, OnDestroy, OnInit,\n  Optional, ViewChild } from '@angular/core';\nimport { combineLatest, Subscription } from 'rxjs';\nimport { AccountService } from '../services/account.service';\nimport { Account } from '../services/model/account.model';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { AccountValidatorService } from '../services/validator/account.validator';\nimport { AppForm } from '../form/form.class';\nimport { AppFormUtils, CanLeave } from '../form/form.utils';\nimport { FormFieldDefinition } from '../../shared/form/field.model';\nimport { LAT_LONG_PATTERNS } from '../../shared/material/latlong/latlong.utils';\nimport { StatusIds } from '../services/model/model.enum';\nimport { APP_LOCALES, LocaleConfig, LocalSettings } from '../services/model/settings.model';\nimport { NetworkService } from '../services/network.service';\nimport { filter, map } from 'rxjs/operators';\nimport { MatTabGroup } from '@angular/material/tabs';\nimport { ConfigService } from '../services/config.service';\nimport { CORE_CONFIG_OPTIONS } from '../services/config/core.config';\nimport { AppPropertiesTable, PropertyEntity } from '../form/properties/properties.table';\nimport { PropertyMap } from '../../shared/types';\nimport { firstArrayValue, isNotEmptyArray, isNotNil } from '../../shared/functions';\nimport { UserTokenTable } from './token.table';\nimport { NavController } from '@ionic/angular';\nimport { Configuration } from '../services/model/config.model';\n\nimport { AuthTokenType } from '../services/network.types';\nimport { ImageService } from '../../shared/image/image.service';\nimport { ENVIRONMENT, Environment } from '../../../environments/environment.class';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { PersonUtils } from '../services/model/person.model';\n\n@Component({\n  selector: 'app-account-page',\n  templateUrl: 'account.page.html',\n  styleUrls: ['./account.page.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountPage extends AppForm<Account> implements OnInit, OnDestroy, CanLeave {\n  @ViewChild('tabGroup', { static: true }) tabGroup: MatTabGroup;\n  @ViewChild('propertiesTable', { static: true }) propertiesTable: AppPropertiesTable;\n  @ViewChild('tokensTable', { static: true }) tokensTable: UserTokenTable;\n\n  protected selectedTabIndex = 0;\n  protected isLogin: boolean;\n  protected changesSubscription: Subscription;\n  protected networkSubscription: Subscription;\n  protected email = {\n    confirmed: false,\n    notConfirmed: false,\n    sending: false,\n    error: undefined,\n  };\n  protected additionalFields: FormFieldDefinition[];\n  protected optionDefinitions: FormFieldDefinition[];\n\n  get settingsForm(): UntypedFormGroup {\n    return this.form.get('settings') as UntypedFormGroup;\n  }\n\n  // settingsContentForm: UntypedFormGroup;\n  protected locales: LocaleConfig[];\n  protected latLongFormats = LAT_LONG_PATTERNS;\n  protected saving = false;\n  protected submitted = false;\n  protected accountReadOnly = false;\n  protected readonly defaultAvatarImage = PersonUtils.DEFAULT_AVATAR_IMAGE;\n  protected readonly mobile: boolean;\n\n  get valid(): boolean {\n    return super.valid && (this.propertiesTable?.valid || true);\n  }\n\n  get invalid(): boolean {\n    return super.invalid && (this.propertiesTable ? this.propertiesTable.invalid : false);\n  }\n\n  get dirty(): boolean {\n    return super.dirty || this.propertiesTable?.dirty || false;\n  }\n\n  protected showLatLonFormat = true;\n  protected canChangePassword = false;\n  protected showSecurityDetails = false;\n  protected showTechnicalDetails = true;\n  protected showApiTokens = false;\n  protected showAvatar = false;\n  protected avatarMaxSize: number;\n\n  constructor(\n    injector: Injector,\n    public formBuilder: UntypedFormBuilder,\n    public accountService: AccountService,\n    public network: NetworkService,\n    protected navController: NavController,\n    protected validatorService: AccountValidatorService,\n    protected configService: ConfigService,\n    protected cd: ChangeDetectorRef,\n    protected imageService: ImageService,\n    @Inject(ENVIRONMENT) environment: Environment,\n    @Inject(APP_LOCALES) locales: LocaleConfig[],\n    @Optional() @Inject(APP_BASE_HREF) protected appBaseHref: string,\n  ) {\n    super(injector, validatorService.getFormGroup(accountService.account, { withSettings: true }));\n\n    this.locales = locales;\n    this.mobile = this.settings.mobile;\n    this.debug = !environment.production;\n\n    // By default, disable the form\n    this.disable();\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Get user options\n    this.optionDefinitions = (this.accountService.optionDefs || []).filter(\n      (definition) => !definition.disabled && (!definition.minProfile || this.accountService.hasMinProfile(definition.minProfile))\n    );\n\n    // Observed some events\n    this.registerSubscription(this.accountService.onLogin.pipe(filter(() => !this.saving)).subscribe((account) => this.onLogin(account)));\n    this.registerSubscription(this.accountService.onLogout.subscribe(() => this.onLogout()));\n    this.registerSubscription(\n      this.onCancel.subscribe(() => {\n        this.setValue(this.accountService.account);\n        this.markAsPristine();\n      })\n    );\n\n    this.registerSubscription(\n      this.accountService.additionalFields$.subscribe((additionalFields) => {\n        this.additionalFields = additionalFields.filter((field) => field.extra?.account);\n        if (this.accountService.isLogin()) {\n          this.onLogin(this.accountService.account);\n        } else {\n          this.markAsLoaded();\n        }\n      })\n    );\n\n    this.registerSubscription(this.configService.config.subscribe((config) => this.onConfigLoaded(config)));\n\n    // Realign tab, after a delay because the tab can be disabled when component is created\n    setTimeout(() => this.tabGroup.realignInkBar(), 500);\n  }\n\n  async onChangeAvatar(event: Event) {\n    if (!this.showAvatar || event.defaultPrevented || this.disabled) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    try {\n      const images = await this.imageService.add(event, { multiple: false,\n        autoHideDropArea: true,\n        style: 'camera', // Force to use the camera (if Capacitor is enabled)\n        width: this.avatarMaxSize,\n        height: this.avatarMaxSize,\n      });\n      const img = firstArrayValue(images);\n      if (!img?.dataUrl) return;\n      const control = this.form.get('avatar');\n      if (control) {\n        control.setValue(img.dataUrl);\n        control.markAsDirty();\n      } else {\n        // Fallback if control missing: patch value and mark form dirty\n        this.form.patchValue({ avatar: img.dataUrl });\n        this.form.markAsDirty();\n      }\n      this.markForCheck();\n    } catch (err) {\n      console.error('[account] Error while changing avatar:', err?.message || err);\n    }\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n    this.stopListenChanges();\n    this.networkSubscription?.unsubscribe();\n  }\n\n  onLogin(account: Account) {\n    console.debug('[account] Logged account: ', account);\n    this.isLogin = true;\n\n    this.setValue(account);\n\n    this.email.confirmed = account && account.email && account.statusId !== StatusIds.TEMPORARY;\n    this.email.notConfirmed = account && account.email && (!account.statusId || account.statusId === StatusIds.TEMPORARY);\n\n    this.networkSubscription?.unsubscribe();\n    this.networkSubscription = combineLatest([\n      this.configService.config,\n      this.network.onNetworkStatusChanges.pipe(map((connectionType) => connectionType !== 'none')),\n    ]).subscribe(([config, online]) => {\n      this.onConfigLoaded(config);\n\n      if (online) {\n        this.enable();\n        this.markAsPristine();\n        this.startListenChanges();\n      } else {\n        this.disable();\n        this.markAsPristine();\n        this.stopListenChanges();\n      }\n      this.markAsLoaded();\n    });\n\n    this.markForCheck();\n  }\n\n  onLogout() {\n    this.isLogin = false;\n    this.email.confirmed = false;\n    this.email.notConfirmed = false;\n    this.email.sending = false;\n    this.email.error = undefined;\n    this.form.reset();\n    this.disable();\n\n    this.networkSubscription?.unsubscribe();\n\n    this.stopListenChanges();\n\n    // Back to home\n    this.navController.navigateRoot('/');\n  }\n\n  async setValue(data: Account, opts?: { emitEvent?: boolean; onlySelf?: boolean }): Promise<void> {\n    super.setValue(data, opts);\n\n    // Set options\n    const { properties } = data?.settings?.asLocalSettings({ definitions: this.optionDefinitions }) || {};\n    const propertiesEntities: PropertyEntity[] = this.optionDefinitions\n      .map((definition) => {\n        const value = properties?.[definition.key];\n        return isNotNil(value) ? PropertyEntity.fromObject({ definition, value }) : null;\n      })\n      .filter(isNotNil);\n\n    if (this.propertiesTable) {\n      await this.propertiesTable.ready();\n      this.propertiesTable.value = propertiesEntities;\n    }\n\n    if (this.tokensTable) {\n      await this.tokensTable.ready();\n      this.tokensTable.value = data.tokens;\n    }\n  }\n\n  async refresh(_?: Event) {\n    this.disable();\n    this.markAsLoading();\n\n    return this.accountService.reload();\n  }\n\n  startListenChanges() {\n    if (this.changesSubscription) return; // already started\n    this.changesSubscription = this.accountService.listenChanges();\n  }\n\n  stopListenChanges() {\n    if (!this.changesSubscription) return;\n    this.changesSubscription.unsubscribe();\n    this.changesSubscription = undefined;\n  }\n\n  async sendConfirmationEmail(event: MouseEvent) {\n    const json = this.form.value;\n    json.email = this.form.controls['email'].value;\n    if (!json.email || !this.email.notConfirmed) {\n      event.preventDefault();\n      return false;\n    }\n\n    this.email.sending = true;\n    console.debug('[account] Sending confirmation email...');\n    try {\n      await this.accountService.sendConfirmationEmail(json.email, (json.settings && json.settings.locale) || this.translate.currentLang);\n      console.debug('[account] Confirmation email sent.');\n      this.email.sending = false;\n    } catch (err) {\n      this.email.sending = false;\n      this.email.error = (err && err.message) || err;\n    }\n  }\n\n  async save(event?: Event): Promise<boolean> {\n    if (this.saving) return false; // Already saving: skip\n\n    if (!this.form.valid) {\n      await AppFormUtils.waitWhilePending(this.form);\n\n      if (this.form.invalid) {\n        AppFormUtils.logFormErrors(this.form);\n        this.form.markAllAsTouched();\n        return false;\n      }\n    }\n\n    this.submitted = true;\n    this.error = undefined;\n    this.markAsSaving();\n\n    try {\n      const data = Account.fromObject({\n        ...this.accountService.account.asObject(),\n        ...this.form.value,\n      });\n\n      if (isNotEmptyArray(this.optionDefinitions) && this.propertiesTable) {\n        // Merge properties\n        await this.propertiesTable.save();\n        const propertyEntities = this.propertiesTable.value || [];\n        const properties: PropertyMap = propertyEntities.reduce((res, item) => {\n          res[item.id] = item.value;\n          return res;\n        }, {});\n        const newProperties = { ...data.settings.content['properties'], ...properties };\n        data.settings.merge(<LocalSettings>{ properties: newProperties }, ['properties']);\n      } else if (data.settings.content['properties']) {\n        // Clean properties\n        delete data.settings.content['properties'];\n      }\n\n      if (this.tokensTable) {\n        await this.tokensTable.save();\n        data.tokens = this.tokensTable.value;\n      }\n\n      console.debug('[account] Saving account...', data);\n\n      try {\n        this.disable();\n\n        await this.accountService.save(data);\n\n        // Reload\n        setTimeout(() => this.onLogin(this.accountService.account), 100);\n\n        this.markAsPristine();\n        return true;\n      } catch (err) {\n        console.error(err);\n        this.error = (err && err.message) || err;\n        return false;\n      } finally {\n\n        this.enable();\n      }\n    }finally {\n      this.markAsSaved();\n    }\n  }\n\n  enable(opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    super.enable(opts);\n\n    // Some fields are always disable\n    this.form.controls.email.disable();\n    this.form.controls.mainProfile.disable();\n    this.form.controls.pubkey.disable();\n\n    // Disable account fields if readonly by configuration\n    const disabled = this.accountReadOnly;\n    if (disabled) {\n      this.form.controls.lastName.disable();\n      this.form.controls.firstName.disable();\n    }\n\n    // Always disable some additional fields\n    this.additionalFields.forEach((field) => {\n      const control = this.form.controls[field.key];\n      if (!control) return; // Skip\n\n      const fieldDisabled = disabled || field.extra?.account?.disabled || false;\n      if (fieldDisabled && control.enabled) {\n        control.disable();\n      }\n      const required = field.extra?.account?.required ?? false;\n      if (!field.required && required) {\n        control.setValidators(control.validator ? Validators.compose([control.validator, Validators.required]) : Validators.required);\n      }\n    });\n    this.markForCheck();\n  }\n\n  async cancel() {\n    await super.cancel();\n  }\n\n  async close(_?: Event) {\n    if (this.saving) return;\n\n    // Back to home\n    return this.navController.navigateRoot('/'); // back to home\n  }\n\n  @HostListener('window:beforeunload', ['$event'])\n  handleRefresh(event: BeforeUnloadEvent): void {\n    // Avoid to quit web browser page, without saving\n    if (!this.mobile && this.dirty) {\n      event.preventDefault(); // Avoid to quit without saving\n    }\n  }\n\n  protected onConfigLoaded(config: Configuration) {\n    console.debug('[account] Config loaded: ', config);\n    this.accountReadOnly = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.ACCOUNT_READONLY);\n    this.showLatLonFormat =\n      config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.ACCOUNT_LAT_LONG_FORMAT_ENABLE) &&\n      // For compatibility with deprecated key\n      config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.DEFAULT_LAT_LONG_FORMAT_ENABLED);\n    this.showAvatar = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.ACCOUNT_AVATAR_ENABLE);\n    this.avatarMaxSize = config.getPropertyAsInt(CORE_CONFIG_OPTIONS.ACCOUNT_AVATAR_MAX_SIZE);\n\n    const authTokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE) as AuthTokenType;\n    this.canChangePassword = authTokenType === 'token';\n    this.showSecurityDetails = this.canChangePassword;\n    this.showApiTokens = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.AUTH_API_TOKEN_ENABLED);\n    this.markForCheck();\n  }\n\n  protected openChangePasswordPage() {\n    return this.navController.navigateForward('account/password');\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected markAsSaving() {\n    this.saving = true;\n  }\n\n  protected markAsSaved() {\n    this.saving = false;\n  }\n\n}\n","<app-toolbar\n  [title]=\"'ACCOUNT.TITLE' | translate\"\n  color=\"primary\"\n  [hasValidate]=\"dirty && !saving\"\n  [hasClose]=\"!dirty && !saving\"\n  (onValidate)=\"save()\"\n  (onClose)=\"close($event)\"\n>\n  <ion-buttons slot=\"end\">\n    @if (loading || saving) {\n      <!-- loader -->\n      <ion-spinner></ion-spinner>\n    } @else if (network.online) {\n      <!-- refresh button (if online) -->\n      <ion-button [matTooltip]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"refresh($event)\">\n        <mat-icon slot=\"icon-only\">refresh</mat-icon>\n      </ion-button>\n    }\n  </ion-buttons>\n</app-toolbar>\n\n<ion-content>\n  <!-- Install (and upgrade) card -->\n  <app-install-upgrade-card [isLogin]=\"isLogin\" [showInstallButton]=\"true\"></app-install-upgrade-card>\n\n  <!-- error -->\n  @if (mobile && (errorSubject | async); as error) {\n    <ion-item lines=\"none\">\n      <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n      <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n    </ion-item>\n  }\n\n  <form [formGroup]=\"form\" novalidate class=\"form-container\">\n    <mat-tab-group\n      #tabGroup\n      [(selectedIndex)]=\"selectedTabIndex\"\n      class=\"mat-mdc-tab-disabled-hidden\"\n      [mat-stretch-tabs]=\"mobile\"\n      dynamicHeight\n    >\n      <!-- TAB: user details -->\n      <mat-tab [label]=\"'ACCOUNT.USER_DETAILS.TITLE' | translate\" class=\"ion-padding\">\n        <ng-template mat-tab-label>\n          <mat-icon>\n            <ion-icon matPrefix slot=\"start\" name=\"person-circle\"></ion-icon>\n          </mat-icon>\n          <ion-label>{{ 'ACCOUNT.USER_DETAILS.TITLE' | translate }}</ion-label>\n          <ion-icon slot=\"end\" name=\"alert-circle\" color=\"danger\" *ngIf=\"submitted && form.invalid\"></ion-icon>\n        </ng-template>\n        <ion-grid class=\"ion-no-padding\">\n          <ion-row>\n            <!-- left  margin -->\n            <ion-col size=\"0\" size-lg=\"1\" size-xl=\"2\">&nbsp;</ion-col>\n\n            <ion-col class=\"ion-padding\">\n              <!-- Avatar block -->\n              @if (showAvatar) {\n                @let accountAvatar = form?.controls?.avatar?.value || form?.value?.avatar || accountService?.account?.avatar || defaultAvatarImage;\n                @let isDefaultAvatar = accountAvatar?.endsWith(defaultAvatarImage);\n                <ion-item lines=\"none\" class=\"ion-margin-bottom\" style=\"--inner-padding-end: 0\">\n                  <ion-button slot=\"start\" fill=\"clear\"\n                              class=\"user-avatar\"\n                              [style.background-image]=\"'url(' + (accountAvatar || defaultAvatarImage) + ')'\"\n                              (click)=\"onChangeAvatar($event)\"\n                              [disabled]=\"disabled\"\n                              [matTooltip]=\"'IMAGE.BTN_CAMERA_SOURCE' | translate\"\n                  >\n                    @if (!accountReadOnly && enabled) {\n                      <ion-icon [class.visible-hover]=\"!isDefaultAvatar\" name=\"camera\" slot=\"icon-only\"></ion-icon>\n                    }\n                  </ion-button>\n                </ion-item>\n              }\n\n              <ion-list-header><p [innerHTML]=\"'ACCOUNT.USER_DETAILS.DESCRIPTION' | translate\"></p></ion-list-header>\n\n              <ion-list [inset]=\"mobile\">\n                <!-- Email -->\n                <ion-item lines=\"none\">\n                  <mat-form-field>\n                    <mat-label>{{ 'USER.EMAIL' | translate }}</mat-label>\n                    <input matInput formControlName=\"email\" autocomplete=\"section-red email\" />\n                    <mat-error *ngIf=\"form.controls.email.hasError('required') && form.controls.email.dirty\" translate>\n                      ERROR.FIELD_REQUIRED\n                    </mat-error>\n                    <mat-error *ngIf=\"form.controls.email.hasError('email') && form.controls.email.dirty\">\n                      <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n                    </mat-error>\n                  </mat-form-field>\n                </ion-item>\n\n                @if (email?.notConfirmed) {\n                  <ion-item lines=\"none\">\n                    <ion-grid class=\"ion-no-padding ion-padding-bottom\">\n                      <ion-row>\n                        <ion-col color=\"danger\">\n                          <ion-icon slot=\"start\" color=\"danger\" name=\"alert-circle\"></ion-icon>\n                          <ion-text [innerHTML]=\"'ACCOUNT.EMAIL_NOT_CONFIRMED_LABEL' | translate\"></ion-text>\n                        </ion-col>\n                      </ion-row>\n\n                      <ion-row style=\"height: 51px\">\n                        <ion-col style=\"text-align: right\">\n                          <ion-text>\n                            <small [innerHTML]=\"'ACCOUNT.EMAIL_NOT_RECEIVED_QUESTION' | translate\"></small>\n                          </ion-text>\n                        </ion-col>\n                        <ion-col size=\"auto\">\n                          @if (!email.sending) {\n                            <ion-button fill=\"solid\" color=\"secondary\" (click)=\"sendConfirmationEmail($event)\">\n                              {{ 'ACCOUNT.BTN_RESEND' | translate }}\n                            </ion-button>\n                          } @else {\n                            <ion-spinner class=\"ion-no-padding\"></ion-spinner>\n                          }\n                        </ion-col>\n                      </ion-row>\n\n                      <ion-row *ngIf=\"email.error && !email.sending\">\n                        <ion-col>\n                          <span *ngIf=\"email.error && !email.sending\" [innerHTML]=\"email.error | translate\"></span>\n                        </ion-col>\n                      </ion-row>\n                    </ion-grid>\n                  </ion-item>\n                }\n                <!-- Last name -->\n                <ion-item lines=\"none\">\n                  <mat-form-field>\n                    <mat-label>{{ 'USER.LAST_NAME' | translate }}</mat-label>\n                    <input\n                      matInput\n                      [appAutofocus]=\"true\"\n                      [autofocusDelay]=\"500\"\n                      formControlName=\"lastName\"\n                      autocomplete=\"section-blue family-name\"\n                      required\n                    />\n                    <mat-error\n                      *ngIf=\"form.controls.lastName.hasError('required') && form.controls.lastName.dirty\"\n                      translate\n                    >\n                      ERROR.FIELD_REQUIRED\n                    </mat-error>\n                    <mat-error *ngIf=\"form.controls.lastName.hasError('minlength') && form.controls.lastName.dirty\">\n                      <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n                    </mat-error>\n                  </mat-form-field>\n                </ion-item>\n\n                <!-- First name -->\n                <ion-item lines=\"none\">\n                  <mat-form-field>\n                    <mat-label>{{ 'USER.FIRST_NAME' | translate }}</mat-label>\n                    <input matInput formControlName=\"firstName\" autocomplete=\"section-blue given-name\" required />\n                    <mat-error\n                      *ngIf=\"form.controls.firstName.hasError('required') && form.controls.firstName.dirty\"\n                      translate\n                    >\n                      ERROR.FIELD_REQUIRED\n                    </mat-error>\n                    <mat-error *ngIf=\"form.controls.firstName.hasError('minlength') && form.controls.firstName.dirty\">\n                      <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n                    </mat-error>\n                  </mat-form-field>\n                </ion-item>\n\n                <!-- Additional fields -->\n                @for (definition of additionalFields; track definition.key) {\n                  <ion-item lines=\"none\">\n                    <app-form-field\n                      [definition]=\"definition\"\n                      [formControlName]=\"definition.key\"\n                      [required]=\"\n                        (definition.extra && definition.extra.account && definition.extra.account.required) || false\n                      \"\n                    ></app-form-field>\n                  </ion-item>\n                }\n              </ion-list>\n\n              <!-- Security -->\n              @if (showSecurityDetails) {\n                <ion-list-header><h3 translate>ACCOUNT.SECURITY.TITLE</h3></ion-list-header>\n\n                <ion-list [inset]=\"mobile\">\n                  <ion-item\n                    [button]=\"mobile\"\n                    routerDirection=\"forward\"\n                    lines=\"none\"\n                    (click)=\"openChangePasswordPage()\"\n                    [disabled]=\"disabled\"\n                  >\n                    @if (!mobile) {\n                      <ion-icon slot=\"start\" name=\"keypad\"></ion-icon>\n                      <ion-label>{{ 'ACCOUNT.SECURITY.PASSWORD' | translate }}</ion-label>\n                    }\n                    <ion-text color=\"tertiary\">{{ 'ACCOUNT.SECURITY.BTN_CHANGE_PASSWORD' | translate }}</ion-text>\n                    @if (!mobile) {\n                      <ion-icon slot=\"end\" color=\"tertiary\" name=\"chevron-forward\"></ion-icon>\n                    }\n                  </ion-item>\n                </ion-list>\n              }\n\n              <!-- Technical details -->\n              @if (showTechnicalDetails) {\n                <ion-list-header><h3 translate>ACCOUNT.USER_DETAILS.TECHNICAL_DIVIDER</h3></ion-list-header>\n\n                <ion-list [inset]=\"mobile\">\n                  <!-- profile -->\n                  <ion-item lines=\"none\">\n                    <mat-form-field>\n                      <mat-label>{{ 'ACCOUNT.USER_DETAILS.PROFILE' | translate }}</mat-label>\n                      <input matInput hidden readonly=\"true\" formControlName=\"mainProfile\" required />\n                      <span>{{ 'USER.PROFILE_ENUM.' + form.controls.mainProfile.value | translate }}</span>\n                      <mat-error\n                        *ngIf=\"form.controls.firstName.hasError('mainProfile') && form.controls.mainProfile.dirty\"\n                        translate\n                      >\n                        ERROR.FIELD_REQUIRED\n                      </mat-error>\n                    </mat-form-field>\n                  </ion-item>\n\n                  <!-- pubkey -->\n                  <ion-item lines=\"none\">\n                    <mat-form-field>\n                      <mat-label>{{ 'ACCOUNT.USER_DETAILS.PUBKEY' | translate }}</mat-label>\n                      <input matInput readonly=\"true\" formControlName=\"pubkey\" required />\n                      <mat-error\n                        *ngIf=\"form.controls.firstName.hasError('pubkey') && form.controls.firstName.dirty\"\n                        translate\n                      >\n                        ERROR.FIELD_REQUIRED\n                      </mat-error>\n                      <mat-error *ngIf=\"form.controls.firstName.hasError('pubkey') && form.controls.firstName.dirty\">\n                        <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n                      </mat-error>\n                    </mat-form-field>\n                  </ion-item>\n                </ion-list>\n              }\n            </ion-col>\n\n            <!-- right margin -->\n            <ion-col size=\"0\" size-lg=\"1\" size-xl=\"2\">&nbsp;</ion-col>\n          </ion-row>\n        </ion-grid>\n      </mat-tab>\n\n      <!-- TAB: settings -->\n      <mat-tab [label]=\"'ACCOUNT.SETTINGS.TITLE' | translate\" formGroupName=\"settings\">\n        <ng-template mat-tab-label>\n          <mat-icon>\n            <ion-icon matPrefix slot=\"start\" name=\"settings\"></ion-icon>\n          </mat-icon>\n          <ion-label translate>ACCOUNT.SETTINGS.TITLE</ion-label>\n        </ng-template>\n\n        <div class=\"ion-padding\">\n          <p [innerHTML]=\"'ACCOUNT.SETTINGS.DESCRIPTION' | translate\"></p>\n\n          <mat-form-field>\n            <mat-label>{{ 'ACCOUNT.SETTINGS.LOCALE' | translate }}</mat-label>\n            <mat-select formControlName=\"locale\" required>\n              <mat-option *ngFor=\"let item of locales\" [value]=\"item.key\">\n                {{ item.value }}\n              </mat-option>\n            </mat-select>\n            <mat-error\n              *ngIf=\"settingsForm?.controls.locale.hasError('required') && settingsForm?.controls.locale.dirty\"\n              translate\n            >\n              ERROR.FIELD_REQUIRED\n            </mat-error>\n          </mat-form-field>\n\n          <!-- lat/long format-->\n          @if (showLatLonFormat) {\n            @let control = settingsForm | formGetControl: 'latLongFormat';\n            <mat-form-field>\n              <mat-label>{{ 'ACCOUNT.SETTINGS.LAT_LONG_FORMAT' | translate }}</mat-label>\n              <mat-select [formControl]=\"control\" required>\n                @for (item of latLongFormats; track item) {\n                  <mat-option [value]=\"item\">\n                    {{ 'COMMON.LAT_LONG.ENUM.' + item | uppercase | translate }}\n                  </mat-option>\n                }\n              </mat-select>\n              @if (control.dirty && control.hasError('required')) {\n                <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n              }\n            </mat-form-field>\n          }\n        </div>\n\n        <!-- Options table -->\n        <div class=\"options-table\" [class.cdk-visually-hidden]=\"optionDefinitions | isEmptyArray\">\n          <app-properties-table\n            #propertiesTable\n            i18nColumnPrefix=\"ACCOUNT.SETTINGS.OPTIONS.\"\n            [definitions]=\"optionDefinitions\"\n            [disabled]=\"disabled\"\n            [canEdit]=\"true\"\n            [debug]=\"debug\"\n            (onDirty)=\"$event ? markAsDirty() : undefined\"\n          ></app-properties-table>\n        </div>\n      </mat-tab>\n\n      <!-- TAB: tokens -->\n      <mat-tab [label]=\"'ACCOUNT.TOKENS.TITLE' | translate\" formGroupName=\"tokens\" [disabled]=\"!showApiTokens\">\n        <ng-template mat-tab-label>\n          <mat-icon>\n            <ion-icon matPrefix slot=\"start\" name=\"ticket\"></ion-icon>\n          </mat-icon>\n          <ion-label translate>ACCOUNT.TOKENS.TITLE</ion-label>\n        </ng-template>\n\n        <div class=\"ion-padding\">\n          <p [innerHTML]=\"'ACCOUNT.TOKENS.DESCRIPTION' | translate\"></p>\n        </div>\n        <!-- Tokens table -->\n        <div class=\"tokens-table\">\n          <app-user-token-table\n            #tokensTable\n            [disabled]=\"disabled\"\n            [canEdit]=\"true\"\n            [debug]=\"debug\"\n            (onDirty)=\"$event ? markAsDirty() : undefined\"\n          ></app-user-token-table>\n        </div>\n      </mat-tab>\n    </mat-tab-group>\n  </form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n  <app-form-buttons-bar (onCancel)=\"cancel()\" (onSave)=\"save()\" [disabled]=\"!form.dirty || !valid || saving\">\n    <!-- error -->\n    <ion-item *ngIf=\"error && !mobile\" lines=\"none\">\n      <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n      <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n    </ion-item>\n  </app-form-buttons-bar>\n</ion-footer>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Injector, Input, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormControl, Validators } from '@angular/forms';\nimport { AppForm } from '../../form/form.class';\nimport { SharedValidators } from '../../../shared/validator/validators';\nimport { AuthData } from '../../services/account.service';\n\n@Component({\n  selector: 'app-change-password-form',\n  templateUrl: 'change-password.form.html',\n  styleUrls: ['./change-password.form.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ChangePasswordForm extends AppForm<AuthData> implements OnInit {\n  protected showPwd = false;\n  protected showConfirmPwd = false;\n\n  @Input() usernamePlaceholder: string;\n  @Input() emailValidator = false;\n\n  @Input() set username(value: string) {\n    this.form.get('username').setValue(value);\n  }\n\n  get username(): string {\n    return this.form.get('username').value;\n  }\n\n  constructor(\n    injector: Injector,\n    formBuilder: UntypedFormBuilder,\n    private cd: ChangeDetectorRef\n  ) {\n    super(\n      injector,\n      formBuilder.group({\n        username: new UntypedFormControl(null, Validators.required),\n        password: new UntypedFormControl(null, Validators.compose([Validators.required, Validators.minLength(8)])),\n        confirmPassword: new UntypedFormControl(null, Validators.compose([Validators.required, SharedValidators.equals('password')])),\n      })\n    );\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Add/remove email validator\n    const usernNameControl = this.form.get('username');\n    if (this.emailValidator && !usernNameControl.hasValidator(Validators.email)) {\n      usernNameControl.addValidators(Validators.email);\n    } else if (!this.emailValidator && usernNameControl.hasValidator(Validators.email)) {\n      usernNameControl.removeValidators(Validators.email);\n    }\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<form [formGroup]=\"form\" class=\"form-container\">\n  <!-- Username -->\n  @let formControl = form | formGetControl: 'username';\n  <mat-form-field>\n    <mat-label>{{ usernamePlaceholder | translate }}</mat-label>\n    <input matInput formControlName=\"username\" readonly />\n\n    <!-- error -->\n    <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n      @switch (errorKey) {\n        @case ('required') {\n          <span translate>ERROR.FIELD_REQUIRED</span>\n        }\n        @case ('email') {\n          <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n        }\n      }\n    </mat-error>\n  </mat-form-field>\n\n  <!-- Password -->\n  <mat-form-field>\n    <mat-label>{{ 'REGISTER.STEP_PASSWORD' | translate }}</mat-label>\n    <input\n      matInput\n      formControlName=\"password\"\n      autocomplete=\"section-red new-password\"\n      [type]=\"showPwd ? 'text' : 'password'\"\n      required\n    />\n    <button matSuffix mat-icon-button type=\"button\" (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n      <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n    </button>\n    <mat-error *ngIf=\"form.controls.password.hasError('required') && form.controls.password.touched\">\n      {{ 'ERROR.FIELD_REQUIRED' | translate }}\n    </mat-error>\n    <mat-error *ngIf=\"form.controls.password.hasError('minlength') && form.controls.password.touched\">\n      <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: form.controls.password.errors.minlength }}</span>\n    </mat-error>\n  </mat-form-field>\n\n  <!-- Confirm password -->\n  <mat-form-field>\n    <mat-label>{{ 'REGISTER.CONFIRM_PASSWORD' | translate }}</mat-label>\n    <input\n      matInput\n      formControlName=\"confirmPassword\"\n      autocomplete=\"section-red new-password\"\n      [type]=\"showConfirmPwd ? 'text' : 'password'\"\n      required\n    />\n    <button mat-icon-button matSuffix (click)=\"showConfirmPwd = !showConfirmPwd\" tabindex=\"-1\">\n      <mat-icon>{{ showConfirmPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n    </button>\n    <mat-error *ngIf=\"form.controls.confirmPassword.hasError('required') && form.controls.confirmPassword.touched\">\n      {{ 'ERROR.FIELD_REQUIRED' | translate }}\n    </mat-error>\n    <mat-error *ngIf=\"form.controls.confirmPassword.hasError('equals') && form.controls.confirmPassword.touched\">\n      <span>{{ 'REGISTER.ERROR.NOT_SAME_PASSWORD' | translate }}</span>\n    </mat-error>\n  </mat-form-field>\n</form>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { AccountService, AuthData } from '../../services/account.service';\nimport { ChangePasswordForm } from './change-password.form';\nimport { ActivatedRoute } from '@angular/router';\nimport { getRandomImageWithCredit } from '../../home/home';\nimport { ConfigService } from '../../services/config.service';\nimport { NavController, ToastController } from '@ionic/angular';\nimport { Configuration } from '../../services/model/config.model';\nimport { isNotEmptyArray, isNotNilOrBlank, nullIfNilOrBlank } from '../../../shared/functions';\nimport { CORE_CONFIG_OPTIONS } from '../../services/config/core.config';\nimport { AppFormContainer } from '../../form/form-container.class';\nimport { environment } from '../../../../environments/environment';\nimport { AuthTokenType } from '../../services/network.types';\nimport { ShowToastOptions, Toasts } from '../../../shared/toast/toasts';\nimport { TranslateService } from '@ngx-translate/core';\nimport { slideUpDownAnimation } from '../../../shared/material/material.animations';\nimport { filter } from 'rxjs/operators';\n\n@Component({\n  selector: 'app-change-password-page',\n  templateUrl: './change-password.page.html',\n  styleUrls: ['./change-password.page.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  animations: [slideUpDownAnimation],\n})\nexport class AppChangePasswordPage extends AppFormContainer implements OnInit, OnDestroy {\n  protected token: string;\n  protected username: string;\n  protected contentStyle = {};\n  protected sending = false;\n  protected isLogin = false;\n\n  protected usernamePlaceholder: string;\n  protected emailValidator = false;\n\n  @ViewChild('form', { static: true }) private form: ChangePasswordForm;\n\n  constructor(\n    protected configService: ConfigService,\n    protected accountService: AccountService,\n    protected toastController: ToastController,\n    protected translate: TranslateService,\n    protected navController: NavController,\n    protected activatedRoute: ActivatedRoute,\n    protected cd: ChangeDetectorRef\n  ) {\n    super();\n    this.debug = !environment.production;\n\n    // Get username  + token (from the route)\n    this.username =\n      nullIfNilOrBlank(this.activatedRoute.snapshot.params['email']) || nullIfNilOrBlank(this.activatedRoute.snapshot.params['username']);\n    if (isNotNilOrBlank(this.username)) {\n      this.token =\n        nullIfNilOrBlank(this.activatedRoute.snapshot.params['token']) || nullIfNilOrBlank(this.activatedRoute.snapshot.queryParams['token']);\n    }\n    console.debug(`[password] username: ${this.username}, token: ${this.token}`);\n  }\n\n  async ngOnInit() {\n    super.ngOnInit();\n\n    // Wait account service to be ready\n    await this.accountService.ready();\n\n    this.isLogin = this.accountService.isLogin();\n    if (this.isLogin) {\n      this.username = this.username || this.accountService.account.email;\n      this.markForCheck();\n    }\n    this.form.username = this.username;\n\n    this.addForms([this.form]);\n\n    this.registerSubscription(this.configService.config.subscribe((config) => this.onConfigReady(config)));\n\n    // Reset error when form changes\n    this.registerSubscription(this.form.form.valueChanges.pipe(filter(() => !this.sending)).subscribe(() => (this.form.error = null)));\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n  }\n\n  async onConfigReady(config: Configuration) {\n    console.debug('[password] Config loaded', config);\n    if (isNotEmptyArray(config?.backgroundImages)) {\n      const { image } = getRandomImageWithCredit(config.backgroundImages);\n      this.contentStyle = { '--ion-background-color': 'transparent', 'background-image': `url(${image})` };\n    } else {\n      const primaryColor = config.getProperty(CORE_CONFIG_OPTIONS.COLOR_PRIMARY) || 'var(--ion-color-primary)';\n      this.contentStyle = { '--ion-background-color': primaryColor + ' !important' };\n    }\n\n    const tokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE) as AuthTokenType;\n    if (tokenType === 'token') {\n      this.usernamePlaceholder = 'USER.EMAIL';\n      this.emailValidator = true;\n    } else {\n      this.usernamePlaceholder = 'USER.USERNAME';\n      this.emailValidator = false;\n    }\n\n    this.markAsLoaded();\n    this.enable();\n  }\n\n  async doSubmit(event?: Event) {\n    if (event?.defaultPrevented) return;\n\n    if (this.form.disabled || this.sending) return; // Skip\n\n    this.sending = true;\n    const { username, password } = this.form.value;\n\n    this.form.error = null;\n    this.form.disable();\n\n    try {\n      const authData: AuthData = { username, password };\n\n      // Token exists : send confirmation\n      if (isNotNilOrBlank(this.token)) {\n        // Update pubkey, using the token\n        const done = await this.accountService.resetPubkey(authData, this.token);\n        if (done) {\n          await this.navController.navigateRoot('/');\n\n          await this.showToast({ message: 'AUTH.CONFIRM.PASSWORD_CHANGED', type: 'info' });\n        }\n      } else {\n        // Update pubkey on the current account\n        const done = await this.accountService.updatePubkey(authData);\n\n        if (done) {\n          await this.navController.navigateRoot('/account');\n\n          await this.showToast({ message: 'AUTH.CONFIRM.PASSWORD_CHANGED', type: 'info' });\n        }\n      }\n    } catch (err) {\n      console.error('[password] Error while changing password', err);\n      this.form.error = (err && err.message) || err;\n      this.form.enable();\n    } finally {\n      this.sending = false;\n      this.markForCheck();\n    }\n  }\n\n  protected async showToast(opts: ShowToastOptions) {\n    await Toasts.show(this.toastController, this.translate, opts);\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<app-toolbar\n  [title]=\"'AUTH.RESET_PASSWORD.TITLE' | translate\"\n  color=\"primary\"\n  [canGoBack]=\"isLogin\"\n  defaultBackHref=\"/account\"\n></app-toolbar>\n<ion-content class=\"bg-image-cover center ion-padding\" [ngStyle]=\"contentStyle\">\n  <ion-card class=\"ion-margin-top\">\n    <ion-card-content>\n      <!-- error -->\n      <ion-item\n        *ngIf=\"form.errorSubject | async; let error\"\n        color=\"light\"\n        lines=\"none\"\n        class=\"ion-margin-bottom\"\n        @slideUpDownAnimation\n      >\n        <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n        <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n      </ion-item>\n\n      <app-change-password-form\n        #form\n        [usernamePlaceholder]=\"usernamePlaceholder\"\n        [emailValidator]=\"emailValidator\"\n        (onSubmit)=\"doSubmit()\"\n        [debug]=\"debug\"\n      ></app-change-password-form>\n    </ion-card-content>\n\n    @if (loadingSubject | push) {\n      <ion-spinner></ion-spinner>\n    } @else {\n      <ion-footer>\n        <ion-button expand=\"full\" color=\"tertiary\" (click)=\"doSubmit()\" [disabled]=\"sending\">\n          <ion-label>{{ 'COMMON.BTN_VALIDATE' | translate }}</ion-label>\n        </ion-button>\n      </ion-footer>\n    }\n  </ion-card>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ChangePasswordForm } from './change-password.form';\nimport { AppChangePasswordPage } from './change-password.page';\n\n@NgModule({\n  imports: [SharedModule, RouterModule, TranslateModule.forChild()],\n\n  declarations: [ChangePasswordForm, AppChangePasswordPage],\n  exports: [TranslateModule, ChangePasswordForm, AppChangePasswordPage],\n})\nexport class AppChangePasswordModule {}\n","import { NgModule } from '@angular/core';\nimport { AccountPage } from './account.page';\nimport { SharedModule } from '../../shared/shared.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\nimport { AppFormButtonsBarModule } from '../form/buttons/form-buttons-bar.module';\nimport { AppPropertiesFormModule } from '../form/properties/properties.module';\nimport { AppTableModule } from '../table/table.module';\nimport { UserTokenTable } from './token.table';\nimport { NewTokenModal } from './new-token.modal';\nimport { AppChangePasswordModule } from './password/change-password.module';\nimport { NewTokenForm } from './new-token.form';\nimport { AppInstallUpgradeCardModule } from '../install/install-upgrade-card.module';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    SharedModule,\n    TranslateModule.forChild(),\n\n    // App modules\n    AppFormButtonsBarModule,\n    AppPropertiesFormModule,\n    AppTableModule,\n\n    // Sub modules\n    AppChangePasswordModule,\n    AppInstallUpgradeCardModule,\n  ],\n  declarations: [AccountPage, UserTokenTable, NewTokenForm, NewTokenModal],\n  exports: [\n    TranslateModule,\n    // Components\n    AccountPage,\n    UserTokenTable,\n    NewTokenForm,\n    NewTokenModal,\n\n    // Sub modules\n    AppChangePasswordModule,\n  ],\n})\nexport class AppAccountModule {}\n","import { ModuleWithProviders, NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\nimport { SharedModule } from \"../shared/shared.module\";\nimport { IonicStorageModule } from \"@ionic/storage-angular\";\nimport { AppGraphQLModule } from \"./graphql/graphql.module\";\nimport { provideHttpClient, withInterceptorsFromDi } from \"@angular/common/http\";\nimport { CacheModule } from \"ionic-cache\";\nimport { PlatformService } from \"./services/platform.service\";\nimport { AppMenuModule } from \"./menu/menu.module\";\nimport { AppIconModule } from \"./icon/icon.module\";\nimport { AppIconSelectorModule } from \"./icon/icon-selector.module\";\nimport { AppSelectPeerModule } from \"./peer/select-peer.module\";\nimport { AppInstallUpgradeCardModule } from \"./install/install-upgrade-card.module\";\nimport { AppRegisterModule } from \"./register/register.module\";\nimport { AppAuthModule } from \"./auth/auth.module\";\nimport { AppHomePageModule } from \"./home/home.module\";\nimport { AppAboutModalModule } from \"./about/about.module\";\nimport { AppSettingsPageModule } from \"./settings/settings.module\";\nimport { AppFormModule } from \"./form/form.module\";\nimport { AppTableModule } from \"./table/table.module\";\nimport { AppUpdateOfflineModeCardModule } from \"./offline/update-offline-mode-card.module\";\nimport { AppAccountModule } from \"./account/account.module\";\nimport { CorePipesModule } from \"./services/pipes/pipes.module\";\nimport { AppChangePasswordModule } from \"./account/password/change-password.module\";\n\n@NgModule({\n  imports: [\n    SharedModule,\n    RouterModule,\n    CacheModule,\n    IonicStorageModule,\n\n    // Sub modules\n    AppGraphQLModule,\n    AppMenuModule,\n    AppIconModule,\n    AppAccountModule,\n    AppRegisterModule,\n    AppAuthModule,\n    AppHomePageModule,\n    AppAboutModalModule,\n    AppSettingsPageModule,\n    AppSelectPeerModule,\n    AppFormModule,\n    AppTableModule,\n    AppInstallUpgradeCardModule,\n    AppUpdateOfflineModeCardModule,\n    CorePipesModule\n  ],\n  providers: [provideHttpClient(withInterceptorsFromDi())],\n  exports: [\n        SharedModule,\n        RouterModule,\n        // Sub modules\n        AppGraphQLModule,\n        AppMenuModule,\n        AppRegisterModule,\n        AppChangePasswordModule,\n        AppAuthModule,\n        AppHomePageModule,\n        AppAboutModalModule,\n        AppSettingsPageModule,\n        AppIconModule,\n        AppIconSelectorModule,\n        AppSelectPeerModule,\n        AppFormModule,\n        AppTableModule,\n        AppInstallUpgradeCardModule,\n        AppUpdateOfflineModeCardModule,\n        CorePipesModule,\n    ]\n})\nexport class CoreModule {\n  static forRoot(): ModuleWithProviders<CoreModule> {\n    console.info('[core] Creating module (root)');\n    return {\n      ngModule: CoreModule,\n      providers: [PlatformService],\n    };\n  }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { ModalController } from '@ionic/angular';\nimport { AccountService } from './account.service';\nimport { ENVIRONMENT } from '../../../environments/environment.class';\nimport { AppAuthModal } from '../auth/auth.modal';\n\n@Injectable({ providedIn: 'root' })\nexport class AuthGuardService implements CanActivate {\n  private readonly _debug: boolean;\n\n  constructor(\n    private accountService: AccountService,\n    private modalCtrl: ModalController,\n    private router: Router,\n    @Inject(ENVIRONMENT) protected environment\n  ) {\n    this._debug = !environment.production;\n  }\n\n  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean | UrlTree> | boolean | UrlTree {\n    // If account not started: loop after started\n    if (!this.accountService.started) {\n      return (\n        this.accountService\n          .ready()\n          // Iterate\n          .then(() => this.canActivate(next, state) as Promise<boolean | UrlTree>)\n      );\n    }\n\n    // Force login\n    if (!this.accountService.isLogin()) {\n      if (this._debug) console.debug('[auth-guard] Need authentication for page /' + next.url.join('/'));\n      return this.login(next).then((res) => {\n        if (!res) {\n          if (this._debug) console.debug('[auth-guard] Authentication cancelled. Could not access to /' + next.url.join('/'));\n          return this.router.parseUrl(this.environment.defaultRoute || '/');\n        }\n        // Iterate\n        return this.canActivate(next, state) as Promise<boolean | UrlTree>;\n      });\n    }\n\n    if (next.data && next.data.profile && !this.accountService.hasMinProfile(next.data.profile)) {\n      if (this._debug)\n        console.debug('[auth-guard] Not authorized access to /' + next.url.join('/') + '. Missing required profile: ' + next.data.profile);\n      return false;\n    }\n    if (this._debug) console.debug('[auth-guard] Authorized access to /' + next.url.join('/'));\n    return true;\n  }\n\n  async login(next?: ActivatedRouteSnapshot): Promise<boolean> {\n    return this.modalCtrl.create({ component: AppAuthModal, componentProps: { next } }).then(\n      (modal) =>\n        new Promise<boolean>((resolve) => {\n          modal.onDidDismiss().then(() => {\n            if (this.accountService.isLogin()) {\n              resolve(true);\n              return;\n            }\n            resolve(false);\n          });\n          modal.present();\n        })\n    );\n  }\n}\n","import {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Directive,\n  EventEmitter,\n  Injector,\n  OnDestroy,\n  OnInit,\n  Optional\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AlertController, IonRouterOutlet, NavController, ToastController } from '@ionic/angular';\n\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Observable, of, Subject, Subscription } from 'rxjs';\nimport { isMoment } from 'moment';\nimport { AddToPageHistoryOptions, LocalSettingsService } from '../../services/local-settings.service';\nimport { debounceTime, filter, map, mergeMap } from 'rxjs/operators';\nimport { Entity } from '../../services/model/entity.model';\nimport { UsageMode } from '../../services/model/settings.model';\nimport { FormGroup } from '@angular/forms';\nimport { AppTabEditor, AppTabEditorOptions, IAppTabEditor } from './tab-editor.class';\nimport { AppFormUtils } from '../form.utils';\nimport { Alerts } from '../../../shared/alerts';\nimport { AppErrorWithDetails, ErrorCodes, ServerErrorCodes } from '../../services/errors';\nimport {\n  equals,\n  isInt,\n  isNil,\n  isNilOrBlank,\n  isNotEmptyArray,\n  isNotNil,\n  isNotNilOrBlank,\n  toBoolean,\n  toNumber\n} from '../../../shared/functions';\nimport {\n  EntityServiceDeleteOptions,\n  EntityServiceLoadOptions,\n  EntityServiceSaveOptions,\n  IEntityService,\n} from '../../../shared/services/entity-service.class';\nimport { DateFormatService } from '../../../shared/pipes/date-format.pipe';\nimport { Environment, ENVIRONMENT } from '../../../../environments/environment.class';\nimport { HistoryPageReference } from '../../services/model/history.model';\nimport { firstFalse, firstNotNilPromise, waitForFalse, WaitForOptions } from '../../../shared/observables';\nimport { FormErrorTranslator } from '../../../shared/validator/form-error-adapter.class';\nimport { isStartableService } from '../../../shared/services/startable-service.class';\n\nexport interface IAppEntityEditor<T> extends IAppTabEditor<T> {\n  usageMode: UsageMode;\n  isNewData: boolean;\n}\n\nexport class AppEditorOptions extends AppTabEditorOptions {\n  autoLoad?: boolean;\n  autoLoadDelay?: number;\n  pathIdAttribute?: string;\n  enableListenChanges?: boolean;\n  listenIntervalInSeconds?: number;\n\n  /**\n   * Change page route (window URL) when saving for the first time\n   */\n  autoUpdateRoute?: boolean; // Default to true\n\n  /**\n   * Open the next tab, after saving for the first time\n   */\n  autoOpenNextTab?: boolean; // Default to true\n\n  i18nPrefix?: string;\n}\n\n// @dynamic\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport abstract class AppEntityEditor<\n    T extends Entity<T, ID>,\n    S extends IEntityService<T, ID> = IEntityService<T, any>,\n    ID = number,\n    LO extends EntityServiceLoadOptions = EntityServiceLoadOptions,\n    SO extends EntityServiceSaveOptions = EntityServiceSaveOptions,\n    DO extends EntityServiceDeleteOptions = EntityServiceDeleteOptions,\n  >\n  extends AppTabEditor<T, ID, LO>\n  implements OnInit, OnDestroy, AfterViewInit, IAppEntityEditor<T>\n{\n  data: T;\n  previousDataId: ID;\n\n  defaultBackHref: string;\n  historyIcon: { icon?: string; matIcon?: string };\n\n  readonly titleSubject = new BehaviorSubject<string>(undefined);\n  readonly onUpdateView = new EventEmitter<T>();\n\n  /**\n   *  @deprecated\n   */\n  protected get $title(): Subject<string> {\n    return this.titleSubject;\n  }\n\n  protected readonly cd: ChangeDetectorRef;\n  protected readonly dateFormat: DateFormatService;\n  protected readonly settings: LocalSettingsService;\n  protected readonly environment: Environment;\n  protected readonly routerOutlet: IonRouterOutlet;\n  protected errorTranslator: FormErrorTranslator;\n\n  private _usageMode: UsageMode;\n  private readonly _enableListenChanges: boolean;\n  private readonly _listenIntervalInSeconds: number;\n  private readonly _pathIdAttribute: string;\n  private readonly _autoLoad: boolean;\n  private readonly _autoLoadDelay: number;\n  private _autoUpdateRoute: boolean;\n  private _autoOpenNextTab: boolean;\n  private _listenChangesSubscription: Subscription;\n\n  get usageMode(): UsageMode {\n    return this._usageMode;\n  }\n\n  set usageMode(value: UsageMode) {\n    if (this._usageMode !== value) {\n      this._usageMode = value;\n      this.markForCheck();\n    }\n  }\n\n  get isOnFieldMode(): boolean {\n    return this.settings.isOnFieldMode(this._usageMode);\n  }\n\n  get isNewData(): boolean {\n    return isNil(this.data?.id);\n  }\n\n  get service(): S {\n    return this.dataService;\n  }\n\n  get autoOpenNextTab(): boolean {\n    return this._autoOpenNextTab;\n  }\n\n  set autoOpenNextTab(value: boolean) {\n    this._autoOpenNextTab = value;\n  }\n\n  get autoUpdateRoute(): boolean {\n    return this._autoUpdateRoute;\n  }\n\n  set autoUpdateRoute(value: boolean) {\n    this._autoUpdateRoute = value;\n  }\n\n  protected get pathIdAttribute(): string {\n    return this._pathIdAttribute;\n  }\n\n  protected constructor(\n    injector: Injector,\n    protected dataType: new () => T,\n    protected dataService?: S,\n    @Optional() options?: AppEditorOptions\n  ) {\n    super(\n      injector.get(ActivatedRoute),\n      injector.get(Router),\n      injector.get(NavController),\n      injector.get(AlertController),\n      injector.get(TranslateService),\n      options\n    );\n    this.environment = injector.get(ENVIRONMENT);\n    options = <AppEditorOptions>{\n      // Default options\n      enableListenChanges: this.environment.entityEditor?.enableListenChanges || false, // False  by default\n      listenIntervalInSeconds: toNumber(this.environment.entityEditor?.listenIntervalInSeconds, 0), // no timer by default\n      pathIdAttribute: 'id',\n      autoLoad: true,\n      autoUpdateRoute: true,\n      i18nPrefix: '',\n\n      // Following options are override inside ngOnInit()\n      // autoOpenNextTab: ...,\n\n      // Override defaults\n      ...options,\n    };\n\n    this.cd = injector.get(ChangeDetectorRef);\n    this.settings = injector.get(LocalSettingsService);\n    this.errorTranslator = injector.get(FormErrorTranslator);\n    this.routerOutlet = injector.get(IonRouterOutlet);\n    this.dateFormat = injector.get(DateFormatService);\n    this.toastController = injector.get(ToastController);\n    this._enableListenChanges = options.enableListenChanges;\n    this._listenIntervalInSeconds = options.listenIntervalInSeconds;\n    this._pathIdAttribute = options.pathIdAttribute;\n    this._autoLoad = options.autoLoad;\n    this._autoLoadDelay = options.autoLoadDelay;\n    this._autoUpdateRoute = options.autoUpdateRoute;\n    this._autoOpenNextTab = options.autoOpenNextTab;\n    this.i18nContext = {\n      prefix: options.i18nPrefix,\n      suffix: '',\n    };\n\n    // FOR DEV ONLY ----\n    //this.debug = !environment.production;\n    this._logPrefix = '[entity-editor] ';\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Defaults\n    this._autoOpenNextTab = toBoolean(this._autoOpenNextTab, !this.isOnFieldMode);\n    this.historyIcon = this.historyIcon || { icon: 'list' };\n\n    // Register forms\n    this.registerForms();\n\n    // Disable page, during load\n    this.disable();\n  }\n\n  ngAfterViewInit() {\n    super.ngAfterViewInit();\n\n    // Load data\n    if (this._autoLoad) {\n      setTimeout(() => this.loadFromRoute(), this._autoLoadDelay);\n    }\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n    this.titleSubject.complete();\n    this.titleSubject.unsubscribe();\n    this.onUpdateView.complete();\n    this.onUpdateView.unsubscribe();\n  }\n\n  waitIdle(opts?: WaitForOptions): Promise<void> {\n    // Wait end of saving\n    if (this.saving) return waitForFalse(this.savingSubject, { stop: this.destroySubject });\n\n    return super.waitIdle(opts);\n  }\n\n  /**\n   * Load data from id, using the dataService\n   *\n   * @param id\n   * @param opts\n   */\n  async load(\n    id?: ID,\n    opts?: LO & {\n      emitEvent?: boolean;\n      openTabIndex?: number;\n      updateRoute?: boolean;\n      [key: string]: any;\n    }\n  ) {\n    if (!this.dataService) throw new Error(\"Cannot load data: missing 'dataService'!\");\n\n    this.resetError();\n\n    // New data\n    if (isNil(id)) {\n      try {\n        // Create using default values\n        const data = new this.dataType();\n        this._usageMode = this.computeUsageMode(data);\n        await this.onNewEntity(data, opts);\n        await this.updateView(data, {\n          openTabIndex: 0,\n          ...opts,\n        });\n      } catch (err) {\n        this.setError(err, { emitEvent: false });\n        this.selectedTabIndex = 0;\n      } finally {\n        this.markAsLoaded();\n      }\n    }\n\n    // Load existing data\n    else {\n      try {\n        const data = await this.dataService.load(id, opts);\n        if (!data) throw { code: ErrorCodes.DATA_NOT_FOUND_ERROR, message: 'ERROR.DATA_NO_FOUND' };\n        this._usageMode = this.computeUsageMode(data);\n        await this.onEntityLoaded(data, opts);\n        await this.updateView(data, opts);\n        this.startListenChanges();\n      } catch (err) {\n        this.setError(err);\n        this.selectedTabIndex = 0;\n      } finally {\n        this.markAsLoaded();\n      }\n    }\n  }\n\n  canUserWrite(data: T, opts?: any): boolean {\n    return this.dataService.canUserWrite(data, opts);\n  }\n\n  startListenChanges() {\n    // Skip if disabled, or already listening\n    if (this._listenChangesSubscription || !this._enableListenChanges) return;\n    // Skip if new (nothing to listen)\n    if (this.isNewData) return;\n\n    // Listen for changes on server\n    const subscription = this.listenChanges(this.data.id, {\n      interval: this._listenIntervalInSeconds,\n    })\n      ?.pipe(\n        filter(isNotNil),\n        mergeMap((data) =>\n          this.saving\n            ? // If saving, wait end, to avoid to detect self changes\n              firstFalse(this.savingSubject).pipe(\n                map(() => data),\n                debounceTime(500)\n              )\n            : of(data)\n        )\n      )\n      .subscribe((data: T) => {\n        const isNewer = isMoment(data.updateDate) && (!this.data.updateDate || data.updateDate.isAfter(this.data.updateDate));\n        if (!isNewer) return; // Skip\n\n        // Editor has no changes: reload\n        if (!this.dirty) {\n          if (this.debug) console.debug(`[data-editor] Changes detected on server, at {${data.updateDate}}: reloading page...`);\n          this.reload();\n        }\n        // Cannot reload: alert the user\n        else {\n          if (this.debug) console.debug(`[data-editor] Changes detected on server, at {${data.updateDate}}, but page is dirty: skip reloading.`);\n          this.showToast({ message: 'ERROR.DATA_UPDATE_DATE_CHANGED', type: 'warning', showCloseButton: true });\n        }\n      });\n\n    // Register subscription\n    if (subscription) {\n      this._listenChangesSubscription = subscription;\n      this.registerSubscription(this._listenChangesSubscription);\n      subscription.add(() => {\n        this.unregisterSubscription(subscription);\n        this._listenChangesSubscription = null;\n      });\n    }\n  }\n\n  stopListenChanges() {\n    this._listenChangesSubscription?.unsubscribe();\n  }\n\n  async ready(opts?: WaitForOptions): Promise<void> {\n    await super.ready(opts);\n\n    // Wait service to be ready\n    if (isStartableService(this.dataService)) {\n      await this.dataService.ready();\n    }\n  }\n\n  async updateView(\n    data: T | null,\n    opts?: {\n      emitEvent?: boolean;\n      openTabIndex?: number;\n      updateRoute?: boolean;\n    }\n  ): Promise<void> {\n    const idChanged =\n      isNotNil(data.id) &&\n      this.previousDataId !== undefined && // Ignore if first loading (=undefined)\n      this.previousDataId !== data.id;\n\n    opts = {\n      updateRoute: this._autoUpdateRoute && idChanged && !this.loading,\n      ...opts,\n    };\n\n    this.data = data;\n    this.previousDataId = data.id ?? null;\n\n    await this.ready();\n    await this.setValue(data);\n\n    if (!opts || opts.emitEvent !== false) {\n      this.markAsPristine();\n      this.markAsUntouched();\n      this.updateViewState(data);\n\n      // Need to update route\n      if (opts.updateRoute === true) {\n        this.updateTabAndRoute(data, opts)\n          // Update the title - should be executed AFTER updateRoute because of path change - fix #185\n          .then(() => this.updateTitle(data));\n      } else {\n        // Update the next tab\n        this.updateTabIndex(opts.openTabIndex);\n\n        // Update the title.\n        this.updateTitle(data);\n      }\n\n      this.onUpdateView.emit(data);\n    }\n  }\n\n  /**\n   * Enable or disable state\n   */\n  updateViewState(data: T, opts?: { onlySelf?: boolean; emitEvent?: boolean }) {\n    if (this.isNewData || this.canUserWrite(data)) {\n      this.enable(opts);\n    } else {\n      this.disable(opts);\n\n      // Allow to sort tables\n      this.tables?.forEach((t) => t.enableSort());\n      this.asyncTables?.forEach((t) => t.enableSort());\n    }\n  }\n\n  /**\n   * Update the route location, and open the next tab\n   */\n  async updateTabAndRoute(\n    data: T,\n    opts?: {\n      openTabIndex?: number;\n    }\n  ): Promise<void> {\n    const queryParams = { ...this.queryParams };\n\n    // Open the next tab\n    this.updateTabIndex(opts && opts.openTabIndex);\n\n    if (!this.queryTabIndexParamName || !this.route) return; // Skip route update\n\n    // Update route location\n    queryParams[this.queryTabIndexParamName] = this.selectedTabIndex !== 0 ? this.selectedTabIndex : undefined;\n    await this.updateRoute(data, queryParams);\n  }\n\n  /**\n   * Update the route location, and open the next tab\n   */\n  updateTabIndex(tabIndex?: number) {\n    if (isNotNil(tabIndex) && tabIndex >= 0 && tabIndex !== this.selectedTabIndex) {\n      this.selectedTabIndex = tabIndex;\n      this.markForCheck();\n    }\n  }\n\n  async saveAndClose(event: Event, options?: SO): Promise<boolean> {\n    const saved = await this.save(event, options);\n    if (saved) {\n      await this.close(event);\n    }\n    return saved;\n  }\n\n  async close(event: Event) {\n    if (event) {\n      if (event.defaultPrevented) return;\n      event.preventDefault();\n      event.stopPropagation();\n    }\n\n    return this.goBack();\n  }\n\n  /**\n   * Save the editor, by calling the dataService.save().\n   * Ensure that editor if valid. If not, display an error\n   *\n   * @param event\n   * @param opts\n   */\n  async save(event?: Event, opts?: SO & { openTabIndex?: number }): Promise<boolean> {\n    if (this.loading || this.saving) {\n      console.debug('[data-editor] Skip save: editor is busy (loading or saving)');\n      return false;\n    }\n    if (!this.dirty && !this.isNewData) {\n      console.debug('[data-editor] Skip save: editor not dirty');\n      return true;\n    }\n\n    // Wait end of async validation\n    await this.waitWhilePending();\n\n    // If invalid\n    if (this.invalid) {\n      this.logFormErrors();\n      this.openFirstInvalidTab();\n      this.scrollToTop();\n      this.markAllAsTouched();\n\n      this.submitted = true;\n      return false;\n    }\n\n    this.markAsSaving();\n    this.resetError();\n\n    if (this.debug) console.debug('[data-editor] Saving data...');\n\n    try {\n      // Compute next tab index (if enable)\n      const nextTabIndex = this._autoOpenNextTab && isNil(this.previousDataId) && this.computeNextTabIndex();\n\n      // Save all dirty tables\n      const saved = await this.saveDirtyChildren();\n      if (!saved) return false;\n\n      // Get data\n      const data = await this.getValue();\n\n      this.disable();\n\n      // Save form\n      const updatedData = await this.dataService.save(data, opts);\n\n      await this.onEntitySaved(updatedData, opts);\n\n      // Update the view (e.g metadata)\n      await this.updateView(updatedData, {\n        // Open next tab only if user has not changed it\n        openTabIndex: nextTabIndex > this._selectedTabIndex ? nextTabIndex : undefined,\n        ...opts,\n      });\n\n      // Subscribe to remote changes\n      if (!this._listenChangesSubscription) this.startListenChanges();\n\n      this.submitted = false;\n\n      return true;\n    } catch (err) {\n      this.submitted = true;\n      this.selectedTabIndex = 0; // Can be override by subclasses, using setError()\n      this.setError(err);\n      this.scrollToTop(); // Scroll to top (to show error)\n      this.markAsDirty();\n      this.enable();\n\n      // Concurrent change on pod\n      if (err.code === ServerErrorCodes.BAD_UPDATE_DATE && isNotNil(this.data.id)) {\n        // Call a data reload (in background), to update the GraphQL cache, and allow to cancel changes\n        this.dataService.load(this.data.id, { fetchPolicy: 'network-only' }).then(() => {\n          console.debug('[data-editor] Data cache reloaded. User can reload page');\n        });\n      }\n\n      return false;\n    } finally {\n      this.markAsSaved();\n    }\n  }\n\n  protected async saveIfDirtyAndConfirm(event?: Event, opts?: SO & {\n    emitEvent?: boolean;\n    confirmed?: boolean;\n    openTabIndex?: number;\n  }): Promise<boolean> {\n    return super.saveIfDirtyAndConfirm(event, opts);\n  }\n\n  /**\n   * Save data (if dirty and valid), and return it. Otherwise, return nil value.\n   */\n  async saveAndGetDataIfValid(): Promise<T | undefined> {\n    // Form is not valid\n    if (!this.valid) {\n      // Make sure validation is finished\n      await AppFormUtils.waitWhilePending(this);\n\n      // If invalid: Open the first tab in error\n      if (this.invalid) {\n        this.openFirstInvalidTab();\n        return undefined;\n      }\n\n      // Continue (valid)\n    }\n\n    // Form is valid, but not saved\n    if (this.dirty) {\n      const saved = await this.save(new Event('save'));\n      if (!saved) return undefined;\n    }\n\n    // Valid and saved data\n    return this.data;\n  }\n\n  async delete(event?: Event, opts?: DO): Promise<boolean> {\n    if (this.loading || this.saving) return false;\n\n    // Ask user confirmation\n    const confirmation = await Alerts.askDeleteConfirmation(this.alertCtrl, this.translate);\n    if (!confirmation) return;\n\n    console.debug('[data-editor] Asking to delete...');\n\n    this.markAsSaving();\n    this.resetError();\n\n    try {\n      // Get data\n      const data = await this.getValue();\n      const isNew = this.isNewData;\n\n      this.disable();\n\n      if (!isNew) {\n        await this.dataService.delete(data, opts);\n      }\n\n      await this.onEntityDeleted(data, opts);\n\n      // Remove page history\n      this.removePageHistory();\n    } catch (err) {\n      this.submitted = true;\n      this.selectedTabIndex = 0;\n      this.setError(err);\n      this.markAsSaved();\n      this.enable();\n      return false;\n    }\n\n    // Wait, then go back (wait is need in order to update back href is need)\n    await setTimeout(() => this.goBack(), 500);\n\n    return true;\n  }\n\n  async reload() {\n    this.markAsLoading();\n    const route = this.route.snapshot;\n    await this.load(this.data?.id, <LO>{\n      ...route.params,\n      fetchPolicy: 'network-only',\n    });\n  }\n\n  async unload(opts?: { emitEvent?: boolean }): Promise<void> {\n\n    await super.unload(opts);\n\n    // Reset the form (only if need - generally already done, by the children forms)\n    if (this.form && !this.form.pristine) {\n      this.form.reset(undefined, opts);\n      this.form.markAsPristine(opts);\n    }\n\n    // Stop listening changes\n    this.stopListenChanges();\n\n    // Forget the data\n    this.data = null;\n\n    // TODO: find a way to remove current page from the navigation history\n  }\n\n  async goBack(event?: Event): Promise<void | boolean> {\n    // Go back\n    if (this.toolbar?.canGoBack) {\n      return this.toolbar.goBack();\n    } else if (this.defaultBackHref) {\n      return this.navController.navigateBack(this.defaultBackHref);\n    } else {\n      // Back to home\n      return this.navController.navigateBack('/');\n    }\n  }\n\n  resetError(opts?: { emitEvent?: boolean }) {\n    super.resetError(opts);\n  }\n\n  setError(err: string | AppErrorWithDetails, opts?: { emitEvent?: boolean; detailsCssClass?: string }) {\n    if (!err) {\n      super.setError(undefined, opts);\n    } else if (typeof err === 'string') {\n      console.error('[entity-editor] Error: ' + (err || ''));\n      super.setError(err as string, opts);\n    } else {\n      console.error('[entity-editor] Error: ' + err.message || '', err);\n      let userMessage = (err.message && this.translate.instant(err.message)) || err;\n\n      // Add details error (if any) under the main message\n      const detailMessage = !err.details || typeof err.details === 'string' ? (err.details as string) : err.details.message;\n      if (isNotNilOrBlank(detailMessage)) {\n        const cssClass = opts?.detailsCssClass || 'error-details';\n        userMessage += `<br/><small class=\"${cssClass}\" title=\"${detailMessage}\">`;\n        userMessage += detailMessage.length < 70 ? detailMessage : detailMessage.substring(0, 67) + '...';\n        userMessage += '</small>';\n      }\n      super.setError(userMessage, opts);\n    }\n  }\n\n  /**\n   * Load data from the snapshot route\n   *\n   * @protected\n   */\n  protected loadFromRoute(): Promise<void> {\n    const route = this.route.snapshot;\n    if (!route || isNilOrBlank(this._pathIdAttribute)) {\n      throw new Error(\"Unable to load from route: missing 'route' or 'options.pathIdAttribute'.\");\n    }\n    let id = route.params[this._pathIdAttribute];\n    if (isNil(id) || id === 'new') {\n      return this.load(undefined, route.params as LO);\n    } else {\n      // Convert as number, if need\n      if (isInt(id)) {\n        id = parseInt(id);\n      }\n      return this.load(id, route.params as LO);\n    }\n  }\n\n  /**\n   * Return undefined to keep same tab\n   *\n   * @protected\n   */\n  protected computeNextTabIndex(): number | undefined {\n    const nextTabIndex = this.selectedTabIndex + 1;\n    return nextTabIndex < this.tabCount ? nextTabIndex : undefined;\n  }\n\n  protected async onBeforeEntityLoad(): Promise<void> {\n    // can be overwritten by subclasses\n  }\n\n  protected async onNewEntity(data: T, options?: LO): Promise<void> {\n    // can be overwritten by subclasses\n  }\n\n  protected async onEntityLoaded(data: T, options?: LO): Promise<void> {\n    // can be overwritten by subclasses\n  }\n\n  protected async onEntitySaved(data: T, options?: SO): Promise<void> {\n    // can be overwritten by subclasses\n  }\n\n  protected async onEntityDeleted(data: T, options?: DO): Promise<void> {\n    // can be overwritten by subclasses\n  }\n\n  protected computeUsageMode(data: T): UsageMode {\n    // can be overwritten by subclasses\n    // Using local settings default value\n    return this.settings.usageMode;\n  }\n\n  protected waitWhilePending(opts?: WaitForOptions): Promise<void> {\n    return AppFormUtils.waitWhilePending(this, opts);\n  }\n\n  async getValue(): Promise<T> {\n    const json = await this.getJsonValueToSave();\n\n    const res = new this.dataType();\n    res.fromObject(json);\n\n    return res;\n  }\n\n  protected getJsonValueToSave(): Promise<any> {\n    return Promise.resolve(this.form.value);\n  }\n\n  /**\n   * Compute the title\n   *\n   * @param data\n   */\n  protected async updateTitle(data?: T) {\n    data = data || this.data;\n    const title = await this.computeTitle(data);\n    this.titleSubject.next(title);\n\n    // If NOT data, then add to page history\n    if (!this.isNewData) {\n      const page = await this.computePageHistory(title);\n      if (page) return this.addToPageHistory(page);\n    }\n  }\n\n  protected async addToPageHistory(page: HistoryPageReference, opts?: AddToPageHistoryOptions) {\n    if (!page) return; // Skip\n\n    return this.settings.addToPageHistory(page, {\n      removePathQueryParams: true,\n      removeTitleSmallTag: true,\n      emitEvent: false,\n      ...opts,\n    });\n  }\n\n  protected async computePageHistory(title: string): Promise<HistoryPageReference> {\n    if (this.debug) console.debug('[entity-editor] Computing page history, using url: ' + this.router.url);\n    return {\n      title,\n      path: this.router.url,\n    };\n  }\n\n  protected async removePageHistory(opts?: { emitEvent?: boolean }) {\n    return this.settings.removePageHistory(this.router.url, opts);\n  }\n\n  protected computePageUrl(id: ID | 'new'): string | any[] {\n    const parentUrl = this.getParentPageUrl();\n    return parentUrl && `${parentUrl}/${id}`;\n  }\n\n  protected getParentPageUrl(withQueryParams?: boolean) {\n    let parentUrl = this.defaultBackHref;\n\n    // Remove query params\n    if (withQueryParams !== true && parentUrl && parentUrl.indexOf('?') !== -1) {\n      parentUrl = parentUrl.substring(0, parentUrl.indexOf('?'));\n    }\n\n    return parentUrl;\n  }\n\n  protected listenChanges(id: ID, opts?: any): Observable<T | undefined> {\n    return this.dataService.listenChanges(this.data.id, {\n      // Make sure to skip cache, because NOT the full graph will be fetched by subscription\n      // When a changes occur, we call reload() to force refetching the full graph\n      fetchPolicy: 'no-cache',\n      ...opts,\n    });\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  /**\n   * Update the route, without reloading the component\n   *\n   * @param data\n   * @param queryParams\n   * @protected\n   */\n  protected async updateRoute(data?: T, queryParams?: any): Promise<boolean> {\n    data = data || this.data;\n    if (!data || !this.route) return false;\n\n    const currId = this.route.snapshot.paramMap.get(this.pathIdAttribute);\n    const futureId = isNotNil(data.id) ? data.id.toString() : 'new';\n    if (queryParams) {\n      this.queryParams = {\n        ...this.queryParams,\n        ...queryParams,\n      };\n    }\n    if (currId === futureId) {\n      // Update queryParam only (not the path)\n      // /!\\ We should get query Params from the updated route, and not from snapshot that can be outdated\n      const actualQueryParams = await firstNotNilPromise(this.route.queryParams);\n      if (!equals(actualQueryParams, this.queryParams)) {\n        if (this.debug) console.debug(`${this._logPrefix}Updating route using queryParams: `, this.queryParams);\n        return await this.router.navigate(['.'], {\n          relativeTo: this.route,\n          replaceUrl: false,\n          queryParams: this.queryParams,\n          state: { animated: false },\n        });\n      }\n    } else {\n      const path = this.computePageUrl(isNotNil(data.id) ? data.id : 'new');\n      const commands: any[] = path && typeof path === 'string' ? path.split('/').slice(1) : (path as any[]);\n      if (isNotEmptyArray(commands)) {\n        // Current route was '/new' => change to '/new?id=:id' (to allow CustomReuseStrategy to detect that route can be reused)\n        if (currId === 'new' && this.queryParams[this.pathIdAttribute] !== futureId) {\n          if (this.debug) console.debug(`${this._logPrefix}Updating route /new into /:id, using queryParams: `, queryParams);\n          this.queryParams[this.pathIdAttribute] = futureId;\n          const res = await this.router.navigate(['.'], {\n            relativeTo: this.route,\n            replaceUrl: true,\n            queryParams: this.queryParams,\n            state: { animated: false },\n          });\n          if (!res) return false;\n        }\n\n        if (this.debug) console.debug(`${this._logPrefix}Updating route to: ` + path);\n        return await this.router.navigate(commands, {\n          replaceUrl: true,\n          queryParams: this.queryParams,\n          state: { animated: false },\n        });\n      }\n      return Promise.reject('Missing page URL');\n    }\n  }\n\n  /* -- private functions -- */\n\n  /**\n   * Open the first tab that is invalid\n   */\n  private openFirstInvalidTab() {\n    const invalidTabIndex = this.getFirstInvalidTabIndex();\n    if (invalidTabIndex !== -1 && this.selectedTabIndex !== invalidTabIndex) {\n      this.selectedTabIndex = invalidTabIndex;\n      this.markForCheck();\n    }\n  }\n\n  /* -- protected abstract methods (to override) -- */\n\n  protected abstract computeTitle(data: T): Promise<string>;\n\n  protected abstract get form(): FormGroup;\n\n  protected abstract getFirstInvalidTabIndex(): number;\n\n  protected abstract registerForms(): void;\n\n  abstract setValue(data: T, opts?: { onlySelf?: boolean; emitEvent?: boolean }): Promise<void> | void;\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CoreModule } from '../../core/core.module';\nimport { SharedModule } from '../../shared/shared.module';\nimport { MessageModal } from './message.modal';\nimport { MessageForm } from './message.form';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { SharedDebugModule } from '../../shared/debug/debug.module';\nimport { TranslateModule } from '@ngx-translate/core';\n\n@NgModule({\n  imports: [CommonModule, CoreModule, SharedModule, MatChipsModule, SharedDebugModule, TranslateModule.forChild()],\n  declarations: [MessageModal, MessageForm],\n  exports: [TranslateModule, MessageModal, MessageForm],\n})\nexport class MessageModule {}\n","import { EntityClass } from '../../../core/services/model/entity.decorators';\nimport { Entity } from '../../../core/services/model/entity.model';\n\n// @dynamic\n@EntityClass({ typename: 'JobProgressionVO' })\nexport class JobProgression extends Entity<JobProgression> {\n  static fromObject: (source: any, opts?: any) => JobProgression;\n\n  name: string;\n  message: string;\n  current: number;\n  total: number;\n\n  constructor(id?: number) {\n    super(JobProgression.TYPENAME);\n    this.id = id;\n  }\n\n  fromObject(source: any) {\n    super.fromObject(source);\n    this.name = source.name;\n    this.message = source.message;\n    this.current = source.current;\n    this.total = source.total;\n  }\n}\n","import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { JobProgression } from './job-progression.model';\nimport { BaseGraphqlService } from '../../../core/services/base-graphql-service.class';\nimport { GraphqlService } from '../../../core/graphql/graphql.service';\nimport { Environment, ENVIRONMENT } from '../../../../environments/environment.class';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { FetchPolicy, gql } from '@apollo/client/core';\nimport { isNil, removeDuplicatesFromArray, toNumber } from '../../../shared/functions';\nimport { map } from 'rxjs/operators';\nimport { SocialErrorCodes } from '../../social.errors';\n\nexport const APP_JOB_PROGRESSION_SERVICE = new InjectionToken<IJobProgressionService>('JobProgressionService');\n\nexport interface IJobProgressionService {\n  watchAll(): Observable<JobProgression[]>;\n  addJob(id: number, job?: JobProgression);\n  removeJob(id: number);\n  listenChanges(id: number, options?: { interval?: number; fetchPolicy?: FetchPolicy }): Observable<JobProgression>;\n}\n\nconst JobProgressionSubscription = {\n  listenChanges: gql`\n    subscription UpdateJobProgression($id: Int!, $interval: Int) {\n      data: updateJobProgression(id: $id, interval: $interval) {\n        id\n        name\n        message\n        current\n        total\n      }\n    }\n  `,\n};\n\n@Injectable()\nexport class JobProgressionService extends BaseGraphqlService<JobProgression> implements IJobProgressionService {\n  private jobsSubject = new BehaviorSubject<JobProgression[]>([]);\n\n  constructor(\n    protected graphql: GraphqlService,\n    @Optional() @Inject(ENVIRONMENT) protected environment: Environment\n  ) {\n    super(graphql, environment);\n    this._logPrefix = '[job-progression-service] ';\n    // For DEV only\n    this._debug = environment && !environment.production;\n  }\n\n  watchAll(): Observable<JobProgression[]> {\n    return this.jobsSubject.asObservable();\n  }\n\n  addJob(id: number, job?: JobProgression) {\n    if (isNil(id)) throw new Error('Missing required argument \\'id\\'');\n    const exists = this.jobsSubject.value.some((j) => j.id === id);\n    if (!exists) {\n      job = job || new JobProgression(id);\n      this.jobsSubject.next(removeDuplicatesFromArray([...this.jobsSubject.value, job], 'id'));\n    }\n  }\n\n  removeJob(id: number) {\n    if (isNil(id)) throw new Error('Missing required argument \\'id\\'');\n    const jobs = this.jobsSubject.value || [];\n    const index = jobs.findIndex((j) => j.id === id);\n    if (index !== -1) {\n      jobs.splice(index, 1);\n      this.jobsSubject.next(jobs);\n    }\n  }\n\n  listenChanges(\n    id: number,\n    options?: {\n      interval?: number;\n      fetchPolicy?: FetchPolicy;\n    }\n  ): Observable<JobProgression> {\n    if (isNil(id)) throw new Error(`${this._logPrefix}Missing argument 'id'`);\n    if (this._debug) console.debug(`${this._logPrefix}[WS] Listening changes for job progression {${id}}...`);\n\n    return this.graphql\n      .subscribe<{ data: any }>({\n        query: JobProgressionSubscription.listenChanges,\n        fetchPolicy: options?.fetchPolicy,\n        variables: { id, interval: toNumber(options?.interval, 10) },\n        error: { code: SocialErrorCodes.SUBSCRIBE_JOB_PROGRESSION_ERROR, message: 'SOCIAL.ERROR.SUBSCRIBE_JOB_PROGRESSION_ERROR' },\n      })\n      .pipe(\n        map(({ data }) => {\n          const progression = data && JobProgression.fromObject(data);\n          if (progression && this._debug) console.debug(`${this._logPrefix}Job progression ${id} updated on server`, progression);\n          return progression;\n        })\n      );\n  }\n}\n","import { ChangeDetectionStrategy, Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { JobProgression } from './job-progression.model';\nimport { RxState } from '@rx-angular/state';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nexport interface JobProgressionState {\n  name: string;\n  message: string;\n  value: number;\n  type: 'determinate' | 'indeterminate';\n}\n\n@Component({\n  selector: 'app-job-progression-component',\n  templateUrl: './job-progression.component.html',\n  styleUrls: ['./job-progression.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class JobProgressionComponent extends RxState<JobProgressionState> implements OnInit, OnDestroy {\n  @Input() showName = true;\n  @Input() jobProgression$: Observable<JobProgression>;\n\n  name$ = this.select('name');\n  message$ = this.select('message');\n  value$ = this.select('value');\n  type$ = this.select('type');\n\n  constructor() {\n    super();\n  }\n\n  ngOnInit() {\n    this.connect('name', this.jobProgression$.pipe(map((value) => value.name)));\n    this.connect('message', this.jobProgression$.pipe(map((value) => value.message)));\n    this.connect('value', this.jobProgression$.pipe(map((value) => (value.total > 0 ? value.current / value.total : undefined))));\n    this.connect('type', this.jobProgression$.pipe(map((value) => (value.total > 0 ? 'determinate' : 'indeterminate'))));\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n  }\n}\n","<ion-item class=\"ion-item-job-progression\">\n  <ion-grid class=\"ion-no-margin\">\n    <ion-row *ngIf=\"showName\" class=\"name\">\n      <ion-col>\n        {{ name$ | push }}\n      </ion-col>\n    </ion-row>\n    <ion-row class=\"message\">\n      <ion-col>\n        {{ message$ | push }}\n      </ion-col>\n    </ion-row>\n    <ion-row class=\"progress-bar\">\n      <ion-col>\n        <ion-progress-bar [value]=\"value$ | push\" [type]=\"type$ | push\"></ion-progress-bar>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n</ion-item>\n","import { ChangeDetectionStrategy, Component, inject, Input } from '@angular/core';\nimport { JobProgression } from './job-progression.model';\nimport { IUserEventAction } from '../../user-event/user-event.model';\nimport { PopoverController } from '@ionic/angular';\nimport { Observable } from 'rxjs';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\nexport interface JobProgressionListOptions {\n  titleI18n?: string;\n  headerActions?: IUserEventAction[];\n}\n\n@Component({\n  selector: 'app-job-progression-list',\n  templateUrl: './job-progression.list.html',\n  styleUrls: ['./job-progression.list.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class JobProgressionList implements JobProgressionListOptions {\n  @Input() titleI18n: string;\n  @Input() headerActions: IUserEventAction[];\n  @Input() jobProgressions: Observable<Observable<JobProgression>[]>;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(protected popoverController: PopoverController) {}\n\n  async executeAction(event: Event, action: IUserEventAction) {\n    if (event?.defaultPrevented) return; // Skip if prevented\n\n    // Disable default action (.e.g avoid to call click() function)\n    if (event) event.preventDefault();\n\n    // Execute then close popover\n    this.popoverController.dismiss();\n    try {\n      const res = action.executeAction(undefined);\n      if (res instanceof Promise) await res;\n    } catch (err) {\n      console.error(err);\n    }\n  }\n}\n","<ion-list class=\"ion-list-popover\">\n  <ion-row class=\"ion-list-header column\">\n    <ion-col>\n      <ion-label>{{ titleI18n | translate }}</ion-label>\n    </ion-col>\n    <ion-col size=\"auto\" class=\"header-action\">\n      @for (action of headerActions; track $index) {\n        <ion-text>\n          <a\n            (click)=\"executeAction($event, action)\"\n            [title]=\"!showTooltip ? (action.title || action.name | translate) : ''\"\n            [matTooltip]=\"showTooltip ? (action.title || action.name | translate) : ''\"\n          >\n            {{ action.name | translate }}\n          </a>\n        </ion-text>\n      }\n    </ion-col>\n  </ion-row>\n\n  @if (jobProgressions | async | isEmptyArray) {\n    <ion-item>\n      {{ 'SOCIAL.JOB.PROGRESSION.EMPTY' | translate }}\n    </ion-item>\n  }\n  @for (jobProgression$ of jobProgressions | push; track $index) {\n    <app-job-progression-component [jobProgression$]=\"jobProgression$\"></app-job-progression-component>\n  }\n</ion-list>\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Optional,\n  Output,\n} from '@angular/core';\nimport { ThemePalette } from '@angular/material/core';\nimport { APP_JOB_PROGRESSION_SERVICE, IJobProgressionService } from './job-progression.service';\nimport { JobProgression } from './job-progression.model';\nimport { BehaviorSubject, delay, of, Subscription, switchMap } from 'rxjs';\nimport { arraySize, isNil, remove, toBoolean, toNumber } from '../../../shared/functions';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { PopoverController } from '@ionic/angular';\nimport { JobProgressionList, JobProgressionListOptions } from './job-progression.list';\nimport { IUserEventAction } from '../../user-event/user-event.model';\nimport { ProgressSpinnerMode } from '@angular/material/progress-spinner';\nimport { RxState } from '@rx-angular/state';\nimport { ObjectMap } from '../../../shared/types';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\nexport interface JobProgressionOptions {\n  autoHide: boolean;\n  autoHideDelay: number;\n  autoRemove: boolean;\n  autoRemoveDelay: number;\n}\n\nexport interface JobProgressionIconState {\n  visible: boolean;\n  mode: ProgressSpinnerMode;\n  value: number;\n  jobProgressions: BehaviorSubject<JobProgression>[];\n  jobCount: number;\n}\n\n@Component({\n  selector: 'app-job-progression-icon',\n  templateUrl: './job-progression.icon.html',\n  styleUrls: ['./job-progression.icon.scss'],\n  // providers: [RxState],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class JobProgressionIcon extends RxState<JobProgressionIconState> implements OnInit, OnDestroy {\n  private _listPopover: HTMLIonPopoverElement;\n  private _subscriptions = new Subscription();\n  private _subscriptionsById: ObjectMap<Subscription> = {};\n  private _logPrefix = '[job-progression] ';\n\n  protected disabled = true;\n  protected color: ThemePalette = 'accent';\n  protected jobProgressions$ = this.select('jobProgressions');\n  protected jobCount$ = this.select('jobCount');\n  protected visible$ = this.select('visible');\n  protected mode$ = this.select('mode');\n  protected value$ = this.select('value');\n\n  protected autoHideDelay: number;\n  protected autoRemove: boolean;\n  protected autoRemoveDelay: number;\n\n  @Input() debug = false;\n  @Input() titleI18n = 'SOCIAL.JOB.PROGRESSION.TITLE';\n  @Input() options: JobProgressionOptions;\n  @Input() autoHide: boolean;\n  @Input() headerActions: IUserEventAction[];\n\n  @Output() jobFinished = new EventEmitter<number>();\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    @Optional() @Inject(APP_JOB_PROGRESSION_SERVICE) protected jobProgressionService: IJobProgressionService,\n    protected popoverController: PopoverController,\n    protected cd: ChangeDetectorRef\n  ) {\n    super();\n  }\n\n  get jobProgressions(): BehaviorSubject<JobProgression>[] {\n    return this.get('jobProgressions');\n  }\n\n  ngOnInit() {\n    if (isNil(this.jobProgressionService)) {\n      console.warn(`${this._logPrefix}No service injected`);\n    }\n    // parse options\n    this.autoHide = toBoolean(this.autoHide, this.options?.autoHide || false);\n    this.set({ visible: !this.autoHide, mode: 'determinate', value: 0 });\n    this.autoHideDelay = toNumber(this.options?.autoHideDelay, 1000);\n    this.autoRemove = toBoolean(this.options?.autoRemove, true);\n    this.autoRemoveDelay = toNumber(this.options?.autoRemoveDelay, 1000);\n\n    if (this.jobProgressionService) {\n      this.connect('jobProgressions', this.jobProgressionService.watchAll(), (state, items) => {\n        const existingJobIds = state.jobProgressions?.map((job) => job.value.id) || [];\n        const result = (items || []).map((item) => {\n          remove(existingJobIds, (id) => id === item.id);\n          // Add job to listen\n          return this.startListenJob(item.id, item);\n        });\n        // Remove old jobs\n        if (existingJobIds.length > 0) {\n          existingJobIds.forEach((id) => this.stopListenJob(id, { emitEvent: false }));\n        }\n        return result;\n      });\n    }\n\n    this.connect('jobCount', this.jobProgressions$.pipe(map((jobs) => jobs?.length || 0)));\n\n    this.connect(\n      'visible',\n      this.jobCount$.pipe(\n        map((jobCount) => jobCount > 0),\n        switchMap((hasJob) =>\n          hasJob\n            ? of(true)\n            : of(false).pipe(\n                filter(() => this.autoHide),\n                delay(this.autoHideDelay),\n                tap(() => {\n                  if (this._listPopover) this._listPopover.dismiss();\n                })\n              )\n        )\n      )\n    );\n  }\n\n  ngOnDestroy(): void {\n    if (this.debug) console.debug(`${this._logPrefix}Destroying`);\n    super.ngOnDestroy();\n    this._subscriptions.unsubscribe();\n  }\n\n  protected startListenJob(id: number, job?: JobProgression) {\n    if (isNil(this.jobProgressionService)) {\n      console.warn(`${this._logPrefix}No service injected. Can't add a job`);\n      return;\n    }\n    if (isNil(id)) {\n      console.error(`${this._logPrefix}Missing required argument 'id'. Cannot listen changes !`);\n      return;\n    }\n    let result = this.getProgression(id);\n    if (result) {\n      //console.warn(`${this._logPrefix}Job (id=${id}) already present`);\n      return result;\n    }\n    if (this.debug) {\n      console.debug(`${this._logPrefix}Add job id=${id}`);\n    }\n    // Adding empty job progression\n    result = new BehaviorSubject(job || new JobProgression(id));\n\n    this.disabled = false;\n\n    const sub = this.jobProgressionService\n      .listenChanges(id)\n      .pipe(\n        filter((progression) => {\n          if (id !== progression.id) {\n            console.error(`${this._logPrefix}Job progression (id=${progression.id}) doesn't match expected job (id=${id})`);\n            return false;\n          }\n          return true;\n        }),\n        map((progression) => {\n          // update current\n          result.next(progression);\n          if (this.debug) {\n            console.debug(`${this._logPrefix}Progression updated id=${id}`, progression);\n          }\n          return progression;\n        })\n      )\n      .subscribe((progression) => {\n        // update value\n        this.updateValue();\n\n        // job finished\n        if (progression.total > 0 && progression.current === progression.total) {\n          if (this.debug) {\n            console.debug(`${this._logPrefix}Finished job id=${progression.id}`);\n          }\n          // emit event\n          this.jobFinished.emit(progression.id);\n          if (this.autoRemove) {\n            setTimeout(() => {\n              this.stopListenJob(progression.id);\n            }, this.autoRemoveDelay);\n          }\n        }\n      });\n\n    this._subscriptionsById[id] = sub;\n    this._subscriptions.add(sub);\n\n    return result;\n  }\n\n  protected stopListenJob(id: number, opts?: { emitEvent?: boolean }) {\n    if (this.debug) {\n      console.debug(`${this._logPrefix}Remove job id=${id}`);\n    }\n    const sub = this._subscriptionsById[id];\n    if (sub) {\n      this._subscriptions.remove(sub);\n      sub.unsubscribe();\n    }\n    // Remove job from service\n    this.jobProgressionService.removeJob(id);\n    if (!opts?.emitEvent !== false) {\n      this.updateValue();\n    }\n  }\n\n  protected getProgression(id: number): BehaviorSubject<JobProgression> | undefined {\n    return this.jobProgressions?.find((progression) => progression.value.id === id);\n  }\n\n  protected updateValue() {\n    if (this.debug) {\n      console.debug(`${this._logPrefix}Updating value`);\n    }\n    let value = 0;\n    const nbProgression = arraySize(this.jobProgressions);\n    let allIndeterminate = nbProgression > 0;\n\n    if (nbProgression) {\n      this.jobProgressions\n        .map((subject) => subject.value)\n        .forEach((progression) => {\n          const indeterminate = progression.total === 0;\n          allIndeterminate = allIndeterminate && indeterminate;\n          if (!indeterminate) {\n            value = value + (progression.current * 100) / progression.total;\n          }\n        });\n    }\n\n    this.set({\n      mode: allIndeterminate ? 'indeterminate' : 'determinate',\n      value: nbProgression > 0 ? value / nbProgression : 0,\n    });\n    if (this.debug) {\n      console.debug(`${this._logPrefix}Setting value=${this.get('value')}, mode=${this.get('mode')}`);\n    }\n\n    this.markForCheck();\n  }\n\n  async showList(event: Event) {\n    this._listPopover = await this.popoverController.create({\n      component: JobProgressionList,\n      componentProps: <JobProgressionListOptions>{\n        titleI18n: this.titleI18n,\n        jobProgressions: this.jobProgressions$,\n        headerActions: this.headerActions,\n      },\n      backdropDismiss: true,\n      keyboardClose: true,\n      event,\n      translucent: true,\n      cssClass: 'popover-large',\n    });\n    await this._listPopover.present();\n    await this._listPopover.onDidDismiss();\n    this._listPopover = undefined;\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","@let count = (jobCount$ | async);\n@if (visible$ | async) {\n  <button\n    #button\n    mat-icon-button\n    [title]=\"!showTooltip ? (titleI18n | translate) : ''\"\n    [matTooltip]=\"showTooltip ? (titleI18n | translate) : ''\"\n    [disabled]=\"disabled\"\n    (click)=\"showList($event)\"\n  >\n    <mat-icon\n      [matBadge]=\"count | badgeNumber\"\n      [matBadgeHidden]=\"!count\"\n      matBadgeColor=\"accent\"\n      matBadgeSize=\"small\"\n      matBadgePosition=\"above after\"\n      aria-hidden=\"false\"\n    >\n      {{ disabled || count ? 'schedule' : 'task_alt' }}\n    </mat-icon>\n    @if (count) {\n      <mat-spinner\n        #spinner\n        class=\"floating-spinner\"\n        [color]=\"color\"\n        [mode]=\"mode$ | push\"\n        [value]=\"value$ | push\"\n        diameter=\"30\"\n        strokeWidth=\"3\"\n      ></mat-spinner>\n    }\n  </button>\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { SharedModule } from '../../shared/shared.module';\nimport { JobProgressionIcon } from './progression/job-progression.icon';\nimport { JobProgressionList } from './progression/job-progression.list';\nimport { JobProgressionComponent } from './progression/job-progression.component';\n\n@NgModule({\n  imports: [CommonModule, SharedModule, TranslateModule.forChild()],\n  declarations: [JobProgressionIcon, JobProgressionList, JobProgressionComponent],\n  exports: [JobProgressionIcon, JobProgressionList, JobProgressionComponent],\n})\nexport class JobModule {}\n","import { InjectionToken, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CoreModule } from '../core/core.module';\nimport { SharedModule } from '../shared/shared.module';\nimport { UserEventModule } from './user-event/user-event.module';\nimport { MessageModule } from './message/message.module';\nimport { JobModule } from './job/job.module';\nimport { JobProgressionOptions } from './job/progression/job-progression.icon';\n\nexport interface SocialModuleOptions {\n  showUserEventNotification: boolean;\n  // todo : userEventNotificationOptions\n  showJobProgression: boolean;\n  jobProgressionOptions: JobProgressionOptions;\n}\n\nexport const SocialModuleOptionsToken = new InjectionToken<SocialModuleOptions>('SocialModuleOptions');\n\n@NgModule({\n  imports: [CommonModule, CoreModule, SharedModule, UserEventModule, JobModule, MessageModule],\n  exports: [UserEventModule, JobModule, MessageModule],\n})\nexport class SocialModule {}\n","import { booleanAttribute, ChangeDetectionStrategy, Component, inject, Inject, Injector, Input, OnInit, ViewChild } from '@angular/core';\nimport { Person, PRIORITIZED_AUTHORITIES } from '../../core/services/model/person.model';\nimport { ReferentialRef, StatusById, StatusList } from '../../core/services/model/referential.model';\nimport { APP_PERSON_SERVICE, IPersonService } from './person.service';\nimport { PersonValidatorService } from './person.validator';\nimport { AccountService } from '../../core/services/account.service';\nimport { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { AppTable } from '../../core/table/table.class';\nimport { ValidatorService } from '@e-is/ngx-material-table';\nimport { FormFieldDefinition, FormFieldDefinitionUtils } from '../../shared/form/field.model';\nimport { debounceTime, distinctUntilKeyChanged, filter, tap } from 'rxjs/operators';\nimport { EntitiesTableDataSource } from '../../core/table/entities-table-datasource.class';\nimport { getPropertyByPath, isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';\nimport { Environment, ENVIRONMENT } from '../../../environments/environment.class';\nimport { PersonFilter } from './person.filter';\nimport { ConfigService } from '../../core/services/config.service';\nimport { CORE_CONFIG_OPTIONS } from '../../core/services/config/core.config';\nimport { AuthTokenType } from '../../core/services/network.types';\nimport { MatExpansionPanel } from '@angular/material/expansion';\nimport { slideUpDownAnimation } from '../../shared/material/material.animations';\nimport { Message } from '../../social/message/message.model';\nimport { MessageService } from '../../social/message/message.service';\nimport { RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, TABLE_SETTINGS_ENUM } from '../../core/table/table.model';\nimport { MenuService } from '../../core/menu/menu.service';\nimport { CsvUtils } from '../../shared/file/csv.utils';\nimport { fromDateISOString } from '../../shared/dates';\nimport { AccountUtils } from '../../core/services/model/account.model';\n\nimport { APP_SHOW_TOOLTIP } from '../../shared/constants';\n\n@Component({\n  selector: 'app-users-table',\n  templateUrl: 'users.html',\n  styleUrls: ['./users.scss'],\n  providers: [{ provide: ValidatorService, useExisting: PersonValidatorService }],\n  animations: [slideUpDownAnimation],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UsersPage extends AppTable<Person, PersonFilter> implements OnInit {\n  readonly canDebug: boolean;\n  readonly filterForm: UntypedFormGroup;\n  readonly profiles = [...PRIORITIZED_AUTHORITIES].reverse();\n  readonly statusList = StatusList;\n  readonly statusById = StatusById;\n  readonly userProfileList: ReferentialRef[] = PRIORITIZED_AUTHORITIES.map((label) =>\n    ReferentialRef.fromObject({\n      label,\n      name: `USER.PROFILE_ENUM.${label}`,\n    })\n  );\n\n  protected additionalFields: FormFieldDefinition[];\n  protected additionalFilterFields: FormFieldDefinition[];\n  protected filterCriteriaCount = 0;\n  protected defaultCompact = false;\n\n  @Input() set showUsernameColumn(value: boolean) {\n    this.setShowColumn('username', value);\n  }\n\n  get showUsernameColumn(): boolean {\n    return this.getShowColumn('username');\n  }\n\n  @Input() set showUsernameExtranetColumn(value: boolean) {\n    this.setShowColumn('usernameExtranet', value);\n  }\n\n  get showUsernameExtranetColumn(): boolean {\n    return this.getShowColumn('usernameExtranet');\n  }\n\n  @Input() set showEmailColumn(value: boolean) {\n    this.setShowColumn('email', value);\n  }\n\n  get showEmailColumn(): boolean {\n    return this.getShowColumn('email');\n  }\n\n  @Input() set showPubkeyColumn(value: boolean) {\n    this.setShowColumn('pubkey', value);\n  }\n\n  get showPubkeyColumn(): boolean {\n    return this.getShowColumn('pubkey');\n  }\n  @Input() set showCreationDateColumn(value: boolean) {\n    this.setShowColumn('creationDate', value);\n  }\n\n  get showCreationDateColumn(): boolean {\n    return this.getShowColumn('creationDate');\n  }\n\n  @Input() set showUpdateDateColumn(value: boolean) {\n    this.setShowColumn('updateDate', value);\n  }\n\n  get showUpdateDateColumn(): boolean {\n    return this.getShowColumn('updateDate');\n  }\n\n  get showFormButtons() {\n    return !this.mobile && this.canEdit;\n  }\n\n  @Input() title: string;\n  @Input({ transform: booleanAttribute }) canSendMessage: boolean;\n  @Input({ transform: booleanAttribute }) canEdit: boolean;\n  @Input({ transform: booleanAttribute }) compact: boolean = null;\n  @Input({ transform: booleanAttribute }) usePageSettings = true;\n  @Input({ transform: booleanAttribute }) sticky = false;\n  @Input({ transform: booleanAttribute }) stickyEnd = false;\n  @Input({ transform: booleanAttribute }) canDownload = true;\n  @Input({ transform: booleanAttribute }) inModal = false;\n  @Input({ transform: booleanAttribute }) showFooter = true;\n  @Input({ transform: booleanAttribute }) showToolbar = true;\n  @Input({ transform: booleanAttribute }) showPaginator = true;\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    injector: Injector,\n    formBuilder: UntypedFormBuilder,\n    protected accountService: AccountService,\n    protected validatorService: ValidatorService,\n    protected configService: ConfigService,\n    @Inject(APP_PERSON_SERVICE) protected dataService: IPersonService,\n    protected messageService: MessageService,\n    protected menuService: MenuService,\n    @Inject(ENVIRONMENT) environment: Environment\n  ) {\n    super(\n      injector,\n      RESERVED_START_COLUMNS.concat(['avatar', 'lastName', 'firstName', 'email', 'profile', 'status', 'username', 'usernameExtranet', 'pubkey'])\n        .concat(accountService.additionalFields.filter((field) => AccountUtils.isFieldVisibleFor(field, 'users')).map((field) => field.key))\n        .concat(['creationDate', 'updateDate'])\n        .concat(RESERVED_END_COLUMNS),\n      new EntitiesTableDataSource(Person, dataService, validatorService, {\n        prependNewElements: false,\n        suppressErrors: environment.production,\n        saveOnlyDirtyRows: true,\n      }),\n      null\n    );\n\n    this.canDebug = !environment.production;\n    this.canEdit = accountService.isAdmin();\n    this.canSendMessage = this.canEdit;\n    this.inlineEdition = this.canEdit;\n    this.confirmBeforeDelete = true;\n    this.autoLoad = false; // Wait config loading\n    this.i18nColumnPrefix = 'USER.';\n    this.defaultSortBy = 'lastName';\n    this.defaultSortDirection = 'asc';\n\n    const additionalFields = (this.accountService.additionalFields || []).map((field) => {\n      // Register the autocomplete\n      if (isNotNil(field.autocomplete)) {\n        field = { ...field }; // Clone\n        // Get the final autocomplete config (e.g. with a suggestFn function)\n        field.autocomplete = this.registerAutocompleteField(field.key, {\n          ...field.autocomplete, // Copy, to be sure the original config is unchanged\n        });\n      }\n      return field;\n    });\n\n    // Initialize additional fields first\n    this.additionalFields = additionalFields.filter((field) => AccountUtils.isFieldVisibleFor(field, 'users'));\n\n    // Create filter form with dynamic controls for additional fields\n    const filterFormControls: any = {\n      searchText: [null],\n      statusId: [null],\n      userProfiles: [null],\n    };\n\n    // Add controls for each additional field that is not disabled for users\n    this.additionalFilterFields = (this.accountService.additionalFields || [])\n      .filter((field) => AccountUtils.isFieldEnableFor(field, 'usersFilter'))\n      .map((field) => {\n        filterFormControls[field.key] = [null];\n        return field;\n      });\n\n    this.filterForm = formBuilder.group(filterFormControls);\n\n    // Translate user profiles\n    this.userProfileList.forEach((profile) => {\n      profile.name = this.translate.instant(profile.name);\n    });\n\n    // For DEV only --\n    this.canDebug = true;\n    this.debug = !environment.production;\n  }\n\n  @ViewChild(MatExpansionPanel, { static: true }) filterExpansionPanel: MatExpansionPanel;\n\n  get firstUserColumn(): string {\n    const columnName = this.displayedColumns[RESERVED_START_COLUMNS.length];\n    // Skip avatar column, if present\n    return (columnName === 'avatar' && this.displayedColumns[RESERVED_START_COLUMNS.length + 1]) || columnName;\n  }\n\n  async ngOnInit() {\n    super.ngOnInit();\n\n    this.inlineEdition = this.inlineEdition && this.canEdit;\n\n    // Listen page action (e.g. from sub menu item)\n    if (!this.inModal) {\n      this.registerSubscription(\n        this.route.queryParams.pipe(distinctUntilKeyChanged('action')).subscribe((queryParams) => {\n          const action = queryParams['action'] || 'none';\n          switch (action) {\n            case 'send':\n              this.openComposeMessageModal();\n              break;\n            case 'none':\n              break;\n            default:\n              console.warn('[users] Unknown action=' + action);\n              break;\n          }\n          // Mark as consumed\n          this.router.navigate(['.'], {\n            relativeTo: this.route,\n            queryParams: { ...queryParams, action: undefined },\n            replaceUrl: true,\n            state: { animated: false },\n          });\n        })\n      );\n    }\n\n    this.registerSubscription(\n      this.configService.config.subscribe((config) => {\n        const authTokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE) as AuthTokenType;\n        console.debug('[users] AuthTokenType=' + authTokenType);\n        switch (authTokenType) {\n          case 'basic':\n            this.setShowColumn('pubkey', false, { emitEvent: false });\n            this.setShowColumn('username', true, { emitEvent: false });\n            this.setShowColumn('usernameExtranet', true, { emitEvent: false });\n            break;\n          case 'basic-and-token':\n            this.setShowColumn('pubkey', true, { emitEvent: false });\n            this.setShowColumn('username', true, { emitEvent: false });\n            this.setShowColumn('usernameExtranet', true, { emitEvent: false });\n            break;\n          case 'token':\n            this.setShowColumn('pubkey', true, { emitEvent: false });\n            this.setShowColumn('username', false, { emitEvent: false });\n            this.setShowColumn('usernameExtranet', false, { emitEvent: false });\n        }\n        this.updateColumns();\n        this.emitRefresh();\n      })\n    );\n\n    this.registerSubscription(\n      this.onRefresh.subscribe(() => {\n        this.filterForm.markAsUntouched();\n        this.filterForm.markAsPristine();\n      })\n    );\n\n    // Update filter when changes\n    this.registerSubscription(\n      this.filterForm.valueChanges\n        .pipe(\n          debounceTime(250),\n          filter(() => this.filterForm.valid),\n          tap((json) => {\n            const filter = PersonFilter.fromObject(json);\n            this.filterCriteriaCount = filter.countNotEmptyCriteria();\n            this.markForCheck();\n            // Update the filter, without reloading the content\n            this.setFilter(filter, { emitEvent: false });\n          }),\n          // Save filter in settings (after a debounce time)\n          debounceTime(500),\n          filter(() => isNotNilOrBlank(this.settingsId) && this.usePageSettings),\n          tap((json) => this.settings.savePageSetting(this.settingsId, json, TABLE_SETTINGS_ENUM.FILTER_KEY))\n        )\n        .subscribe()\n    );\n\n    if (this.canSendMessage) {\n      await this.menuService.addSubMenuItems(\n        [\n          {\n            parentPath: '/admin/users',\n            path: '/admin/users',\n            pathParams: { action: 'expand' },\n            matIcon: 'expand_more',\n            title: 'USER.LIST.BTN_ACTIONS',\n            action: 'expand',\n          },\n          {\n            parentPath: '/admin/users?action=expand',\n            path: '/admin/users?action=send',\n            icon: 'mail',\n            title: 'USER.LIST.BTN_SEND_MESSAGE',\n            action: () => this.openComposeMessageModal(),\n          },\n        ],\n        { skipIfExists: false }\n      );\n    }\n\n    // Restore compact rows\n    this.restoreCompactMode();\n\n    // Restore filter from settings, or load all\n    this.restoreFilterOrLoad();\n  }\n\n  applyFilterAndClosePanel(event?: Event) {\n    this.emitRefresh();\n    this.filterExpansionPanel.close();\n  }\n\n  resetFilter(event?: Event) {\n    this.totalRowCount = undefined;\n    this.filterCriteriaCount = 0;\n    this.markAsLoading();\n    this.filterForm.reset();\n    this.setFilter(null);\n  }\n\n  protected async restoreFilterOrLoad() {\n    this.markAsLoading();\n\n    console.debug('[users] Restoring filter from settings...');\n\n    const json = this.settings.getPageSettings(this.settingsId, TABLE_SETTINGS_ENUM.FILTER_KEY) || {};\n    const filter = PersonFilter.fromObject(json);\n\n    json.userProfiles = Array.isArray(json.userProfiles)\n      ? json.userProfiles.map((up) => {\n          const label = up.label ?? up;\n          return ReferentialRef.fromObject({\n            label,\n            name: this.translate.instant(`USER.PROFILE_ENUM.${label}`),\n          });\n        })\n      : null;\n\n    this.filterForm.patchValue(json);\n    this.setFilter(filter, { emitEvent: true });\n  }\n\n  clearControlValue(event: Event, formControl: AbstractControl): boolean {\n    if (event) event.stopPropagation(); // Avoid to enter input the field\n    formControl.setValue(null);\n    return false;\n  }\n\n  async openComposeMessageModal(event?: Event): Promise<any> {\n    // Compute recipients\n    const recipients = (this.selection.selected || [])\n      .map((row) => row.currentData)\n      .map(Person.fromObject)\n      .map((p) => {\n        const target = p.asObject({ minify: true });\n        target.department = p.department?.asObject();\n        return target;\n      });\n\n    const recipientFilter = PersonFilter.fromObject(this.filter);\n    const canRecipientFilter = !recipientFilter.isEmpty() && (this.accountService.isAdmin() || this.accountService.isSupervisor());\n    return this.messageService.openComposeModal({\n      suggestFn: (value, filter, sortBy, sortDirection) => this.dataService.suggest(value, filter, sortBy, sortDirection),\n      canRecipientFilter,\n      recipientFilterCount: this.totalRowCount,\n      data: Message.fromObject({\n        recipients,\n        recipientFilter,\n      }),\n      debug: this.debug,\n    });\n  }\n\n  async restoreCompactMode(opts?: { emitEvent?: boolean }) {\n    if (!this.usePageSettings || isNilOrBlank(this.settingsId) || isNotNil(this.compact)) return;\n\n    const compact = toBoolean(\n      this.settings.getPageSettings(this.settingsId, TABLE_SETTINGS_ENUM.COMPACT_ROWS_KEY),\n      toBoolean(this.compact, this.defaultCompact)\n    );\n    if (this.compact !== compact) {\n      this.compact = compact;\n\n      // Emit event\n      if (!opts || opts.emitEvent !== false) {\n        this.markForCheck();\n      }\n    }\n  }\n\n  async toggleCompactMode() {\n    this.compact = !this.compact;\n    // eslint-disable-next-line @rx-angular/no-explicit-change-detection-apis\n    this.markForCheck();\n    if (this.usePageSettings && isNotNilOrBlank(this.settingsId)) {\n      await this.savePageSettings(this.compact, TABLE_SETTINGS_ENUM.COMPACT_ROWS_KEY);\n    }\n  }\n\n  async exportToCsv(event: Event) {\n    // Prepare CSV options\n    const separator = CsvUtils.getLocalizedSeparator(this.translate);\n    const encoding = CsvUtils.getLocalizedEncoding(this.translate);\n    const translations = this.translate.instant([\n      'COMMON.DATE_TIME_PATTERN',\n      'USER.LIST.TITLE',\n      'USER.EMAIL',\n      'USER.FIRST_NAME',\n      'USER.LAST_NAME',\n      'USER.USERNAME',\n      'USER.USERNAME_EXTRANET',\n      'USER.DEPARTMENT_LABEL',\n      'USER.DEPARTMENT_NAME',\n      'USER.PROFILE',\n      'USER.STATUS',\n      'USER.PUBKEY',\n      ...(this.additionalFields || []).map((field) => field.label),\n      'USER.CREATION_DATE',\n      'USER.UPDATE_DATE',\n      ...this.statusList.map((status) => status.label),\n    ]);\n    const dateTimePattern = translations['COMMON.DATE_TIME_PATTERN'];\n    const filename = translations['USER.LIST.TITLE'] + '.csv';\n    const headers = [\n      translations['USER.EMAIL'],\n      translations['USER.FIRST_NAME'],\n      translations['USER.LAST_NAME'],\n      ...(this.showUsernameColumn ? [translations['USER.USERNAME']] : []),\n      ...(this.showUsernameExtranetColumn ? [translations['USER.USERNAME_EXTRANET']] : []),\n      translations['USER.PROFILE'],\n      translations['USER.STATUS'],\n      translations['USER.PUBKEY'],\n      ...(this.additionalFields || []).map((field) => translations[field.label]),\n      translations['USER.CREATION_DATE'],\n      translations['USER.UPDATE_DATE'],\n    ];\n\n    const additionalFieldsFns = (this.additionalFields || []).map(FormFieldDefinitionUtils.getDisplayValueFn);\n\n    const rows = (this.selection.isEmpty() ? this.dataSource.getRows() : this.selection.selected)\n      .map((element) => element.currentData)\n      .map((person) => {\n        const status = this.statusById[person.statusId];\n        return [\n          person.lastName,\n          person.firstName,\n          person.email,\n          ...(this.showUsernameColumn ? [person.username] : []),\n          ...(this.showUsernameExtranetColumn ? [person.usernameExtranet] : []),\n          person.mainProfile,\n          status ? translations[status?.label] : null,\n          person.pubkey,\n          ...additionalFieldsFns.map((displayFn, index) => {\n            const value = getPropertyByPath(person, this.additionalFields[index].key);\n            console.debug('[users] Additional field displayFn', value);\n            return displayFn(value);\n          }),\n          fromDateISOString(person.creationDate).format(dateTimePattern),\n          fromDateISOString(person.updateDate).format(dateTimePattern),\n        ];\n      });\n\n    CsvUtils.exportToFile(rows, { filename, headers, separator, encoding });\n  }\n\n  protected async devToggleDebug() {\n    this.debug = !this.debug;\n    // eslint-disable-next-line @rx-angular/no-explicit-change-detection-apis\n    this.markForCheck();\n    if (this.usePageSettings && isNotNilOrBlank(this.settingsId)) await this.savePageSettings(this.debug, 'debug');\n  }\n\n  getDisplayValueFn = FormFieldDefinitionUtils.getDisplayValueFn;\n}\n","<app-toolbar\n  [title]=\"title || 'USER.LIST.TITLE' | translate\"\n  color=\"primary\"\n  [canGoBack]=\"false\"\n  [class.cdk-visible-hidden]=\"!showToolbar\"\n  [hasValidate]=\"(loadingSubject | async) !== true && (dirtySubject | async) === true\"\n  (onValidate)=\"save()\"\n>\n  <ion-buttons slot=\"end\">\n    <!-- Compose message -->\n    <button\n      mat-icon-button\n      *ngIf=\"canSendMessage\"\n      [title]=\"!showTooltip ? ('USER.LIST.BTN_SEND_MESSAGE' | translate) : ''\"\n      [matTooltip]=\"showTooltip ? ('USER.LIST.BTN_SEND_MESSAGE' | translate) : ''\"\n      (click)=\"openComposeMessageModal($event)\"\n    >\n      <ion-icon name=\"mail\" slot=\"icon-only\"></ion-icon>\n    </button>\n\n    @if (selection | isEmptySelection) {\n      <!-- Add -->\n      <button\n        mat-icon-button\n        *ngIf=\"canEdit && !mobile\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n        (click)=\"addRow()\"\n      >\n        <mat-icon>add</mat-icon>\n      </button>\n\n      <!-- Refresh -->\n      <button\n        mat-icon-button\n        *ngIf=\"!mobile\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n        (click)=\"emitRefresh()\"\n      >\n        <mat-icon>refresh</mat-icon>\n      </button>\n\n      <!-- reset filter -->\n      <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n        <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n        <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n      </button>\n\n      <!-- show filter -->\n      <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n        <mat-icon\n          *ngIf=\"filterCriteriaCount; else emptyFilter\"\n          [matBadge]=\"filterCriteriaCount\"\n          matBadgeColor=\"accent\"\n          matBadgeSize=\"small\"\n          matBadgePosition=\"above after\"\n          aria-hidden=\"false\"\n        >\n          filter_list_alt\n        </mat-icon>\n        <ng-template #emptyFilter>\n          <mat-icon>filter_list_alt</mat-icon>\n        </ng-template>\n      </button>\n    } @else {\n      <!-- delete -->\n      <button\n        mat-icon-button\n        class=\"hidden-xs hidden-sm\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n        (click)=\"deleteSelection($event)\"\n      >\n        <mat-icon>delete</mat-icon>\n      </button>\n    }\n\n    @if (!mobile && (canDownload || canDebug)) {\n      <button\n        mat-icon-button\n        [title]=\"!showTooltip ? ('COMMON.BTN_OPTIONS' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_OPTIONS' | translate) : ''\"\n        [matMenuTriggerFor]=\"toolbarOptionsMenu\"\n      >\n        <mat-icon>more_vert</mat-icon>\n      </button>\n    }\n  </ion-buttons>\n</app-toolbar>\n\n<!-- Toolbar option menu -->\n<mat-menu #toolbarOptionsMenu=\"matMenu\" xPosition=\"after\">\n  <ng-template matMenuContent>\n    <!-- export button -->\n    @if (canDownload) {\n      <button mat-menu-item (click)=\"exportToCsv($event)\">\n        <mat-icon>download</mat-icon>\n        <ion-label translate>FILE.CSV.BTN_DOWNLOAD_HELP</ion-label>\n      </button>\n    }\n\n    <!-- Debug only: Test select users modal -->\n    @if (canDebug) {\n      <mat-divider></mat-divider>\n\n      <button mat-menu-item #menuTrigger=\"matMenuTrigger\" (mouseenter)=\"menuTrigger.openMenu()\" [matMenuTriggerFor]=\"debugMenu\">\n        <mat-icon>\n          <ion-icon name=\"bug\"></ion-icon>\n        </mat-icon>\n        <ion-label translate>COMMON.DEBUG.BTN_DEBUG_DOTS</ion-label>\n      </button>\n    }\n  </ng-template>\n</mat-menu>\n\n<!-- debug menu -->\n<mat-menu #debugMenu=\"matMenu\">\n  <ng-template matMenuContent>\n\n    <button mat-menu-item (click)=\"devToggleDebug()\">\n      <mat-icon>{{ debug ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n      <ion-label translate>COMMON.DEBUG.BTN_ENABLE_DEBUG</ion-label>\n    </button>\n  </ng-template>\n</mat-menu>\n\n<ion-content class=\"ion-no-padding\">\n  <!-- error -->\n  <ion-item\n    *ngIf=\"mobile && (errorSubject | async); let error\"\n    lines=\"none\"\n    class=\"hidden-sm hidden-xs hidden-mobile\"\n    @slideUpDownAnimation\n  >\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n\n  <!-- debug -->\n  <app-debug *ngIf=\"debug\">\n    <ion-grid class=\"ion-no-padding\">\n      <ion-row>\n        <ion-col>\n          focusColumn: {{ focusColumn }}\n          <br/>\n          loadingSubject: {{ loading }}\n          <br/>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </app-debug>\n\n  <!-- search -->\n  <mat-expansion-panel #filterExpansionPanel class=\"ion-no-padding filter-panel filter-panel-floating\">\n    <form class=\"form-container ion-padding\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <!-- search -->\n            <mat-form-field>\n              <mat-label>{{ 'USER.LIST.FILTER.SEARCH' | translate }}</mat-label>\n              <input matInput formControlName=\"searchText\"/>\n              <button\n                mat-icon-button\n                matSuffix\n                tabindex=\"-1\"\n                type=\"button\"\n                (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n                [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n              >\n                <mat-icon>close</mat-icon>\n              </button>\n            </mat-form-field>\n          </ion-col>\n\n          <ion-col>\n            <!-- status -->\n            <mat-form-field>\n              <mat-label>{{ 'USER.STATUS' | translate }}</mat-label>\n              <mat-select formControlName=\"statusId\">\n                <mat-option [value]=\"null\">\n                  <i><span translate>COMMON.EMPTY_OPTION</span></i>\n                </mat-option>\n                <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n                  <ion-icon [name]=\"item.icon\"></ion-icon>\n                  {{ item.label | translate }}\n                </mat-option>\n              </mat-select>\n\n              <button\n                mat-icon-button\n                matSuffix\n                tabindex=\"-1\"\n                type=\"button\"\n                (click)=\"clearControlValue($event, filterForm.controls.statusId)\"\n                [hidden]=\"filterForm.controls.statusId.disabled || filterForm.controls.statusId.value == null\"\n              >\n                <mat-icon>close</mat-icon>\n              </button>\n            </mat-form-field>\n          </ion-col>\n\n          <ion-col>\n            <!-- user profiles -->\n            <mat-chips-field\n              formControlName=\"userProfiles\"\n              [placeholder]=\"'USER.PROFILES' | translate\"\n              chipColor=\"accent\"\n              [items]=\"userProfileList\"\n              [displayAttributes]=\"['name']\"\n              [clearable]=\"true\">\n            </mat-chips-field>\n          </ion-col>\n        </ion-row>\n\n        <!-- Additional fields filters -->\n        @if (additionalFilterFields | isNotEmptyArray) {\n          <ion-row>\n            @for (field of additionalFilterFields; track field.key) {\n              <ion-col size=\"12\" size-md=\"6\" size-lg=\"4\">\n                <app-form-field\n                  [definition]=\"field\"\n                  [formControlName]=\"field.key\"\n                  [clearable]=\"true\"\n                  floatLabel=\"auto\">\n                </app-form-field>\n              </ion-col>\n            }\n          </ion-row>\n        }\n      </ion-grid>\n    </form>\n\n    <mat-action-row>\n      <!-- Counter  -->\n      <ion-label\n        [hidden]=\"(loadingSubject | async) === true || filterForm.dirty\"\n        [color]=\"empty && 'danger'\"\n        class=\"ion-padding\"\n      >\n        {{\n          (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n            | translate\n            : {\n              count: (totalRowCount | numberFormat),\n            }\n        }}\n      </ion-label>\n\n      <div class=\"toolbar-spacer\"></div>\n\n      <!-- Close panel -->\n      <ion-button\n        mat-button\n        fill=\"clear\"\n        color=\"dark\"\n        (click)=\"filterExpansionPanel.close()\"\n        [disabled]=\"loadingSubject | async\"\n      >\n        <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n      </ion-button>\n\n      <!-- Search button -->\n      <ion-button\n        mat-button\n        [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n        [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n        (click)=\"applyFilterAndClosePanel($event)\"\n        [disabled]=\"loadingSubject | async\"\n      >\n        <ion-text translate>COMMON.BTN_APPLY</ion-text>\n      </ion-button>\n    </mat-action-row>\n  </mat-expansion-panel>\n\n  <!-- error -->\n  @if (mobile && (errorSubject | async); as error) {\n    <ion-item lines=\"none\">\n      <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n      <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n    </ion-item>\n  }\n\n  <div class=\"table-container\" [class.has-toolbar]=\"showToolbar\"\n       [class.has-paginator]=\"showPaginator\" [class.has-form-buttons]=\"showFormButtons\">\n    <table\n      #table\n      mat-table\n      matSort\n      [class.compact]=\"compact\"\n      [dataSource]=\"dataSource\"\n      [matSortActive]=\"defaultSortBy\"\n      [matSortDirection]=\"defaultSortDirection\"\n      matSortDisableClear\n      [trackBy]=\"trackByFn\"\n    >\n      <ng-container matColumnDef=\"select\" [sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n          <mat-checkbox\n            (change)=\"$event ? masterToggle() : null\"\n            [checked]=\"this | isAllSelected\"\n            [indeterminate]=\"this | isNotAllSelected\"\n          ></mat-checkbox>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n          <mat-checkbox (click)=\"toggleSelectRow($event, row)\" [checked]=\"selection | isSelected: row\"></mat-checkbox>\n        </td>\n      </ng-container>\n\n      <!-- Id Column -->\n      <ng-container matColumnDef=\"id\" [sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label>#</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\">\n          <ion-label>{{ row.currentData.id }}</ion-label>\n        </td>\n      </ng-container>\n\n      <!-- avatar Column -->\n      <ng-container matColumnDef=\"avatar\" [sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef></th>\n        <td mat-cell *matCellDef=\"let row\">\n          <ion-avatar [style.background-color]=\"'white'\">\n            @if (row.currentData.avatar; as avatarUrl) {\n              <ion-img [src]=\"avatarUrl\"></ion-img>\n            } @else {\n              <svg width=\"39\" height=\"39\" [data-jdenticon-value]=\"row.currentData.id\"></svg>\n            }\n          </ion-avatar>\n        </td>\n      </ng-container>\n\n      <!-- lastName  -->\n      <ng-container matColumnDef=\"lastName\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <span translate>USER.LAST_NAME</span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'lastName'\">\n          @if (row.editing) {\n            <mat-form-field>\n              <input\n                matInput\n                [formControl]=\"row.validator.controls['lastName']\"\n                [placeholder]=\"'USER.LAST_NAME' | translate\"\n                [readonly]=\"!row.editing\"\n                [appAutofocus]=\"row.editing && focusColumn === 'lastName'\"\n              />\n              <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('required')\" translate>\n                ERROR.FIELD_REQUIRED\n              </mat-error>\n              <mat-error *ngIf=\"row.validator.controls['lastName'].hasError('minlength')\">\n                <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 2} }}</span>\n              </mat-error>\n            </mat-form-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'lastName' }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- firstname -->\n      <ng-container matColumnDef=\"firstName\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <span translate>USER.FIRST_NAME</span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'firstName'\">\n          @if (row.editing) {\n            <mat-form-field>\n              <input\n                matInput\n                [formControl]=\"row.validator.controls['firstName']\"\n                [placeholder]=\"'USER.FIRST_NAME' | translate\"\n                [readonly]=\"!row.editing\"\n                [appAutofocus]=\"row.editing && focusColumn === 'firstName'\"\n              />\n              <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('required')\" translate>\n                ERROR.FIELD_REQUIRED\n              </mat-error>\n              <mat-error *ngIf=\"row.validator.controls['firstName'].hasError('minlength')\">\n                <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 2} }}</span>\n              </mat-error>\n            </mat-form-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'firstName' }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- email  -->\n      <ng-container matColumnDef=\"email\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <span translate>USER.EMAIL</span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'email'\">\n          @if (row.editing) {\n            <mat-form-field>\n              <input\n                matInput\n                [formControl]=\"row.validator.controls['email']\"\n                [placeholder]=\"'USER.EMAIL' | translate\"\n                [readonly]=\"!row.editing\"\n                [appAutofocus]=\"row.editing && focusColumn === 'email'\"\n              />\n              <mat-error *ngIf=\"row.validator.controls['email'].hasError('required')\" translate>\n                ERROR.FIELD_REQUIRED\n              </mat-error>\n              <mat-error *ngIf=\"row.validator.controls['email'].hasError('email')\">\n                <span translate>ERROR.FIELD_NOT_VALID_EMAIL</span>\n              </mat-error>\n            </mat-form-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'email' }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- additional fields -->\n      @for (definition of additionalFields; track definition.key) {\n        <ng-container [matColumnDef]=\"definition.key\">\n          <th mat-header-cell *matHeaderCellDef>\n            <span>{{ definition.label | translate }}</span>\n          </th>\n          <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = definition.key\">\n            @if (row.editing) {\n              <app-form-field\n                floatLabel=\"never\"\n                [definition]=\"definition\"\n                [formControl]=\"row.validator.controls[definition.key]\"\n                [required]=\"definition.extra?.users?.required\"\n                [autofocus]=\"row.editing && focusColumn === definition.key\"\n              ></app-form-field>\n            } @else {\n              <ion-label appAutoTitle>{{ row.validator | formGetValue: definition.key | displayWith: getDisplayValueFn(definition) }}</ion-label>\n            }\n          </td>\n        </ng-container>\n      }\n\n      <!-- profile column  -->\n      <ng-container matColumnDef=\"profile\">\n        <th mat-header-cell *matHeaderCellDef>\n          <span translate>USER.PROFILE</span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'profile'\">\n          @if (row.editing) {\n            <mat-form-field>\n              <mat-select\n                [formControl]=\"row.validator | formGetControl: 'mainProfile'\"\n                [placeholder]=\"'USER.PROFILE' | translate\"\n              >\n                <mat-option *ngFor=\"let item of profiles\" [value]=\"item\">\n                  {{ 'USER.PROFILE_ENUM.' + item | uppercase | translate }}\n                </mat-option>\n              </mat-select>\n              <mat-error *ngIf=\"row.validator.controls['mainProfile'].hasError('required')\" translate>\n                ERROR.FIELD_REQUIRED\n              </mat-error>\n            </mat-form-field>\n          } @else {\n            @let profile = row.validator | formGetValue: 'mainProfile';\n            @if (profile) {\n              <ion-label appAutoTitle>{{ 'USER.PROFILE_ENUM.' + profile | uppercase | translate }}</ion-label>\n            }\n          }\n\n        </td>\n      </ng-container>\n\n      <!-- Status column  -->\n      <ng-container matColumnDef=\"status\">\n        <th mat-header-cell *matHeaderCellDef>\n          <span translate>USER.STATUS</span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'status'\">\n          @if (row.editing) {\n            @let control = row.validator | formGetControl: 'statusId';\n            <mat-form-field>\n              <mat-select\n                [formControl]=\"control\"\n                [placeholder]=\"'REFERENTIAL.STATUS' | translate\"\n              >\n                <mat-select-trigger>\n                  <span *ngIf=\"control.value >= 0\">\n                    {{ statusById[control.value]?.label | translate }}\n                  </span>\n                </mat-select-trigger>\n                @for (item of statusList; track item.id) {\n                  <mat-option [value]=\"item.id\">\n                    <mat-icon>\n                      <ion-icon [name]=\"item.icon\"></ion-icon>\n                    </mat-icon>\n                    {{ item.label | translate }}\n                  </mat-option>\n                }\n              </mat-select>\n              <mat-error *ngIf=\"control.hasError('required')\" translate>\n                ERROR.FIELD_REQUIRED\n              </mat-error>\n            </mat-form-field>\n          } @else {\n            @let statusId = row.validator | formGetValue: 'statusId';\n            @if (statusId >= 0) {\n              <ion-label appAutoTitle>\n                {{ (statusById | mapGet: statusId)?.label | translate }}\n              </ion-label>\n            }\n          }\n        </td>\n      </ng-container>\n\n      <!-- username -->\n      <ng-container matColumnDef=\"username\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <span translate>USER.USERNAME</span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'username'\">\n          @if (row.editing) {\n            <mat-form-field>\n              <input\n                matInput\n                [formControl]=\"row.validator.controls.username\"\n                [placeholder]=\"'USER.USERNAME' | translate\"\n                [readonly]=\"!row.editing\"\n                [appAutofocus]=\"row.editing && focusColumn === 'username'\"\n              />\n              <mat-error *ngIf=\"row.validator.controls.username.hasError('required')\" translate>\n                ERROR.FIELD_REQUIRED\n              </mat-error>\n            </mat-form-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'username' }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- username extranet -->\n      <ng-container matColumnDef=\"usernameExtranet\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <span translate>USER.USERNAME_EXTRANET</span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'usernameExtranet'\">\n          <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n            <input\n              matInput\n              [formControl]=\"row.validator.controls.usernameExtranet\"\n              [placeholder]=\"'USER.USERNAME_EXTRANET' | translate\"\n              [readonly]=\"!row.editing\"\n              [appAutofocus]=\"row.editing && focusColumn === 'usernameExtranet'\"\n            />\n            <mat-error *ngIf=\"row.validator.controls.usernameExtranet.hasError('required')\" translate>\n              ERROR.FIELD_REQUIRED\n            </mat-error>\n          </mat-form-field>\n          <ng-template #readonlyCell>\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'usernameExtranet' }}\n            </ion-label>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <!-- pubkey  -->\n      <ng-container matColumnDef=\"pubkey\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <span translate>USER.PUBKEY</span>\n        </th>\n        <td\n          mat-cell\n          *matCellDef=\"let row\"\n          [title]=\"!showTooltip ? (row.validator.controls.pubkey.valueChanges | async) : ''\"\n          [matTooltip]=\"showTooltip ? (row.validator.controls.pubkey.valueChanges | async) : ''\"\n          (click)=\"focusColumn = 'pubkey'\"\n        >\n          <mat-form-field *ngIf=\"row.editing; else readonlyCell\">\n            <input\n              matInput\n              [formControl]=\"row.validator.controls['pubkey']\"\n              [placeholder]=\"'USER.PUBKEY' | translate\"\n              [readonly]=\"!row.editing\"\n              autocomplete=\"off\"\n            />\n            <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('required')\" translate>\n              ERROR.FIELD_REQUIRED\n            </mat-error>\n            <mat-error *ngIf=\"row.validator.controls.pubkey.hasError('pubkey')\">\n              <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n            </mat-error>\n          </mat-form-field>\n          <ng-template #readonlyCell>\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'pubkey' }}\n            </ion-label>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <!-- Creation date column -->\n      <ng-container matColumnDef=\"creationDate\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label translate>USER.CREATION_DATE</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n          <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id !== -1\">\n            {{ row.currentData.creationDate | dateFormat: {time: true} }}\n          </ion-text>\n        </td>\n      </ng-container>\n\n      <!-- Update date column -->\n      <ng-container matColumnDef=\"updateDate\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label translate>USER.UPDATE_DATE</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n          <ion-text class=\"ion-text-end\" color=\"medium\" *ngIf=\"row.id !== -1\">\n            {{ row.currentData.updateDate | dateFormat: {time: true} }}\n          </ion-text>\n        </td>\n      </ng-container>\n\n      <!-- Actions buttons column -->\n      <app-actions-column\n        [stickyEnd]=\"stickyEnd\"\n        (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n        (confirmEditCreateClick)=\"confirmEditCreate($event.event, $event.row)\"\n        (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n        (backward)=\"confirmAndBackward($event.event, $event.row)\"\n        (forward)=\"confirmAndForward($event.event, $event.row)\"\n        [canCancel]=\"false\"\n      >\n        <!-- table options menu -->\n        <button\n          matHeader\n          mat-icon-button\n          [title]=\"!showTooltip ? ('COMMON.BTN_OPTIONS' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('COMMON.BTN_OPTIONS' | translate) : ''\"\n          [matMenuTriggerFor]=\"tableOptionsMenu\"\n        >\n          <mat-icon>more_vert</mat-icon>\n        </button>\n      </app-actions-column>\n\n      <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n      <tr\n        mat-row\n        *matRowDef=\"let row; columns: displayedColumns\"\n        [class.mat-row-error]=\"row.validator.invalid\"\n        [class.mat-row-dirty]=\"row.currentData.dirty\"\n        [class.mat-row-disabled]=\"!row.editing\"\n        [class.mat-mdc-row-selected]=\"row.editing || (!canEdit && selection | isSelected: row)\"\n        (click)=\"clickRow($event, row)\"\n        (keydown.escape)=\"escapeEditingRow($event)\"\n        [cdkTrapFocus]=\"!row.validator?.valid\"\n      ></tr>\n    </table>\n\n    <!-- Déclencheur invisible pour le mat-menu -->\n\n    @if (loadingSubject | async) {\n      <ion-item>\n        <ion-skeleton-text animated></ion-skeleton-text>\n      </ion-item>\n    } @else if (totalRowCount === 0) {\n      <ion-item>\n        <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n      </ion-item>\n    }\n  </div>\n</ion-content>\n\n<!-- Table options menu -->\n<mat-menu #tableOptionsMenu=\"matMenu\" xPosition=\"after\">\n  <!-- display columns -->\n  <button mat-menu-item (click)=\"openSelectColumnsModal($event)\">\n    <mat-icon>view_column</mat-icon>\n    <ion-label translate>COMMON.DISPLAYED_COLUMNS_DOTS</ion-label>\n  </button>\n\n  @if (usePageSettings) {\n    <mat-divider></mat-divider>\n\n    <!-- Compact mode -->\n    <button mat-menu-item (click)=\"toggleCompactMode()\">\n      <mat-icon>{{ compact ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n      <ion-label translate>COMMON.BTN_COMPACT_ROWS</ion-label>\n    </button>\n  }\n</mat-menu>\n\n<ion-footer>\n  <mat-paginator *ngIf=\"showPaginator\"\n                 [length]=\"totalRowCount\"\n                 [pageSize]=\"defaultPageSize\"\n                 [pageSizeOptions]=\"defaultPageSizeOptions\"\n                 showFirstLastButtons\n  ></mat-paginator>\n\n  @if (showFormButtons) {\n    <app-form-buttons-bar\n      (onCancel)=\"cancel($event)\"\n      (onSave)=\"save()\"\n      [disabled]=\"(loadingSubject | async) === true || (dirtySubject | async) !== true\"\n    >\n      <!-- error -->\n      <ion-item *ngIf=\"errorSubject | async; let error\" lines=\"none\">\n        <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n        <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n      </ion-item>\n    </app-form-buttons-bar>\n  }\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n  <ion-fab-button color=\"tertiary\" (click)=\"addRow()\">\n    <ion-icon name=\"add\"></ion-icon>\n  </ion-fab-button>\n</ion-fab>\n","import { AfterViewInit, booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core';\nimport { ModalController } from '@ionic/angular';\nimport { Person } from '../../core/services/model/person.model';\nimport { LocalSettingsService } from '../../core/services/local-settings.service';\nimport { toBoolean } from '../../shared/functions';\nimport { UsersPage } from './users';\nimport { RxState } from '@rx-angular/state';\nimport { TableElement } from '@e-is/ngx-material-table';\n\nexport interface AppSelectUsersModalOptions {\n  debug?: boolean;\n  title?: string;\n  showFilter?: boolean;\n  canEdit?: boolean;\n  hideFooter?: boolean;\n  showMessageButton?: boolean;\n  mobile?: boolean;\n  multiple?: boolean;\n  selectedUsers?: Person[];\n}\n\ninterface AppSelectUsersModalState {\n  showFilter: boolean;\n  canEdit: boolean;\n  showMessageButton: boolean;\n  mobile: boolean;\n  multiple: boolean;\n  selectedUsers: Person[];\n  showEmailColumn: boolean;\n  showPubkeyColumn: boolean;\n  showUpdateDateColumn: boolean;\n  showCreationDateColumn: boolean;\n}\n\n@Component({\n  selector: 'app-select-users-modal',\n  templateUrl: './users-select.modal.html',\n  styleUrls: ['./users-select.modal.scss'],\n  providers: [RxState],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppSelectUsersModal implements OnInit, AfterViewInit, AppSelectUsersModalOptions {\n  @Input() debug = false;\n  @Input() title = 'USER.SELECT.TITLE';\n  @Input() settingsId = 'users-select-modal';\n  @Input() showEmailColumn = false;\n  @Input() showPubkeyColumn = false;\n  @Input() showUpdateDateColumn = false;\n  @Input() showCreationDateColumn = false;\n\n  @ViewChild('usersTable', { static: true }) private usersTable: UsersPage;\n\n  constructor(\n    protected settings: LocalSettingsService,\n    protected viewCtrl: ModalController,\n    protected cd: ChangeDetectorRef,\n    protected state: RxState<AppSelectUsersModalState>\n  ) {\n    // Initialize state with default values\n    this.state.set({\n      showFilter: true,\n      canEdit: false,\n      showMessageButton: false,\n      mobile: this.settings.mobile,\n      multiple: true,\n      selectedUsers: [],\n    });\n  }\n\n  // Input getters and setters using RxState\n  get showFilter(): boolean {\n    return this.state.get('showFilter');\n  }\n  @Input({ transform: booleanAttribute }) set showFilter(value: boolean) {\n    this.state.set('showFilter', () => toBoolean(value, true));\n  }\n\n  get canEdit(): boolean {\n    return this.state.get('canEdit');\n  }\n  @Input({ transform: booleanAttribute }) set canEdit(value: boolean) {\n    this.state.set('canEdit', () => toBoolean(value, false));\n  }\n\n  get showMessageButton(): boolean {\n    return this.state.get('showMessageButton');\n  }\n  @Input({ transform: booleanAttribute }) set showMessageButton(value: boolean) {\n    this.state.set('showMessageButton', () => toBoolean(value, false));\n  }\n\n  get mobile(): boolean {\n    return this.state.get('mobile');\n  }\n  @Input({ transform: booleanAttribute }) set mobile(value: boolean) {\n    this.state.set('mobile', () => toBoolean(value, this.settings.mobile));\n  }\n\n  get multiple(): boolean {\n    return this.state.get('multiple');\n  }\n  @Input({ transform: booleanAttribute }) set multiple(value: boolean) {\n    this.state.set('multiple', () => toBoolean(value, true));\n  }\n\n  get selectedUsers(): Person[] {\n    return this.state.get('selectedUsers');\n  }\n  @Input() set selectedUsers(value: Person[]) {\n    this.state.set('selectedUsers', () => value || []);\n  }\n\n  get hasSelection(): boolean {\n    return this.selectedUsers && this.selectedUsers.length > 0;\n  }\n\n  ngOnInit() {\n    // Additional initialization if needed\n  }\n\n  ngAfterViewInit() {\n    setTimeout(() => {\n      if (this.usersTable) {\n        // Note: canEdit and canSendMessage are readonly properties set in constructor\n        // They will be configured via Input properties in the template\n\n        // Set initial selection if provided\n        if (this.selectedUsers && this.selectedUsers.length > 0) {\n          // TODO: Set initial selection in the table\n        }\n\n        this.markForCheck();\n      }\n    });\n  }\n\n  cancel() {\n    this.viewCtrl.dismiss();\n  }\n\n  async validate(): Promise<any> {\n    if (!this.usersTable) return;\n\n    const selectedRows = this.usersTable.selection.selected || [];\n    const selectedUsers = selectedRows.map((row) => row.currentData).map(Person.fromObject);\n\n    return this.viewCtrl.dismiss(selectedUsers);\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected clickRow(row: TableElement<Person>) {\n    // DEBUG\n    //console.debug('[users-select-modal] clickRow', row);\n\n    if (this.multiple) {\n      this.usersTable.selection.toggle(row);\n    } else {\n      this.usersTable.selection.select(row);\n    }\n\n    this.onSelectionChange();\n  }\n\n  protected onSelectionChange() {\n    const selectedRows = this.usersTable?.selection.selected || [];\n    const selectedUsers = selectedRows.map((row) => row.currentData).map(Person.fromObject);\n\n    this.state.set('selectedUsers', () => selectedUsers);\n    this.markForCheck();\n  }\n}\n","<ion-content scroll-y=\"false\">\n  <!-- Reuse UsersPage component -->\n  <app-users-table\n    #usersTable\n    [inModal]=\"true\"\n    [title]=\"title\"\n    [settingsId]=\"settingsId\"\n    [usePageSettings]=\"false\"\n    [sticky]=\"false\"\n    [stickyEnd]=\"false\"\n    [canSendMessage]=\"false\"\n    [canDownload]=\"false\"\n    [showFooter]=\"false\"\n    [showEmailColumn]=\"showEmailColumn\"\n    [showPubkeyColumn]=\"showPubkeyColumn\"\n    [showUpdateDateColumn]=\"showUpdateDateColumn\"\n    [showCreationDateColumn]=\"showCreationDateColumn\"\n    [showUsernameColumn]=\"false\"\n    [showUsernameExtranetColumn]=\"false\"\n    [canEdit]=\"false\"\n    [debug]=\"debug\"\n    (onClickRow)=\"clickRow($event)\"\n  >\n  </app-users-table>\n</ion-content>\n\n<ion-footer *ngIf=\"!mobile\" hidden-xs hidden-sm hidden-mobile>\n  <ion-toolbar>\n    <ion-row class=\"ion-no-padding\">\n      <!-- Selection info -->\n      <ion-col  >\n        <ion-item lines=\"none\" color=\"transparent\">\n          <ion-label color=\"medium\">\n            @if(hasSelection) {\n              {{ 'USER.SELECT.SELECTED_COUNT' | translate: { count: selectedUsers.length } }}\n            }\n          </ion-label>\n        </ion-item>\n      </ion-col>\n\n      <!-- buttons -->\n      <ion-col size=\"auto\">\n        <ion-button fill=\"clear\" color=\"dark\" (click)=\"cancel()\">\n          <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n        </ion-button>\n\n        <ion-button\n          [fill]=\"!hasSelection && !multiple ? 'clear' : 'solid'\"\n          [disabled]=\"!hasSelection\"\n          (keyup.enter)=\"validate()\"\n          (click)=\"validate()\"\n          color=\"tertiary\"\n        >\n          <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n        </ion-button>\n      </ion-col>\n    </ion-row>\n  </ion-toolbar>\n</ion-footer>\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '../../core/core.module';\nimport { UsersPage } from './users';\nimport { AppSelectUsersModal } from './users-select.modal';\nimport { SocialModule } from '../../social/social.module';\nimport { NgxJdenticonModule } from 'ngx-jdenticon';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { SharedMaterialModule } from '../../shared/material/material.module';\nimport { SharedDebugModule } from '../../shared/debug/debug.module';\nimport { MatFormFieldModule } from '@angular/material/form-field';\n\n@NgModule({\n  imports: [\n    NgxJdenticonModule,\n    TranslateModule.forChild(),\n\n    // App modules\n    CoreModule,\n    SocialModule,\n    SharedMaterialModule,\n    SharedDebugModule,\n    MatFormFieldModule,\n  ],\n  declarations: [UsersPage, AppSelectUsersModal],\n  exports: [\n    SocialModule,\n    TranslateModule,\n\n    // Components\n    UsersPage,\n    AppSelectUsersModal,\n  ],\n})\nexport class AdminUsersModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CoreModule } from '../core/core.module';\nimport { AdminUsersModule } from './users/users.module';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    CoreModule,\n\n    // Sub modules\n    AdminUsersModule,\n  ],\n  exports: [AdminUsersModule],\n})\nexport class AdminModule {\n  constructor() {\n    console.debug('[admin] Creating module');\n  }\n}\n","import { RouterModule, Routes } from '@angular/router';\nimport { UsersPage } from './users/users';\nimport { AuthGuardService } from '../core/services/auth-guard.service';\nimport { NgModule } from '@angular/core';\nimport { SharedRoutingModule } from '../shared/shared-routing.module';\nimport { AdminModule } from './admin.module';\nimport { ComponentDirtyGuard } from '../shared/guard/component-dirty.guard';\n\nconst routes: Routes = [\n  {\n    path: 'users',\n    pathMatch: 'full',\n    component: UsersPage,\n    canActivate: [AuthGuardService],\n    canDeactivate: [ComponentDirtyGuard],\n    data: {\n      profile: 'ADMIN',\n    },\n  },\n];\n\n@NgModule({\n  imports: [SharedRoutingModule, AdminModule, RouterModule.forChild(routes)],\n  exports: [RouterModule],\n})\nexport class AdminRoutingModule {}\n","import { AppSelectUsersModal, AppSelectUsersModalOptions } from './users-select.modal';\nimport { ModalController } from '@ionic/angular';\nimport { isMobile } from '../../shared/platforms';\nimport { Person } from '../../core/services/model/person.model';\n\nexport class UsersUtils {\n  static async openSelectUsersModal(modalCtrl: ModalController, opts?: Partial<AppSelectUsersModalOptions>): Promise<Person[]> {\n    const modal = await modalCtrl.create({\n      component: AppSelectUsersModal,\n      componentProps: <AppSelectUsersModalOptions>{\n        title: 'USER.SELECT.TITLE',\n        showFilter: true,\n        canEdit: false,\n        hideFooter: false,\n        showMessageButton: false,\n        mobile: isMobile(window),\n        multiple: true,\n        ...opts,\n      },\n      backdropDismiss: false,\n      cssClass: 'modal-large',\n    });\n\n    await modal.present();\n\n    const { data } = await modal.onDidDismiss();\n    if (data && Array.isArray(data)) {\n      return data as Person[];\n    }\n\n    // User cancel\n    return undefined;\n  }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { Platform } from '@ionic/angular';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedFormGroupValidators } from '../../../validator/validators';\nimport { AppFormUtils } from '../../../../core/form/form.utils';\nimport { DateUtils, MOMENT_NO_TIME_PROPERTY, toDateISOString } from '../../../dates';\nimport { isMobile } from '../../../platforms';\nimport { Subscription, timer } from 'rxjs';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\nimport { MatCheckboxChange } from '@angular/material/checkbox';\n\n@Component({\n  selector: 'app-data-time-test',\n  templateUrl: './mat-date-time.test.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DateTimeTestPage implements OnInit {\n  showLogPanel = true;\n  logContent = '';\n\n  memoryHide = false;\n  memoryMobile = true;\n  memoryTimer: Subscription;\n  hasFocus = false;\n\n  form: UntypedFormGroup;\n  mode: 'mobile' | 'desktop' | 'memory' | 'temp' = 'mobile';\n  appearance: MatFormFieldAppearance = 'fill';\n\n  noTimeProperty = MOMENT_NO_TIME_PROPERTY;\n\n  constructor(\n    protected platform: Platform,\n    protected formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef\n  ) {\n    this.form = formBuilder.group(\n      {\n        empty: [null],\n        emptyRequired: [null, Validators.required],\n        enable: [null, Validators.required],\n        disable: [null, Validators.required],\n        noTime: [null, Validators.required],\n        readonly: [null],\n        startDateTime: [null, Validators.required],\n        endDateTime: [null, Validators.required],\n        hint: [null],\n      },\n      {\n        validators: SharedFormGroupValidators.dateRange('empty', 'enable'),\n      }\n    );\n\n    const disableControl = this.form.get('disable');\n    disableControl.disable();\n\n    // Copy the 'enable' value, into the disable control\n    this.form.get('enable').valueChanges.subscribe((value) => disableControl.setValue(value));\n\n    this.showLogPanel = this.showLogPanel || isMobile(window);\n  }\n\n  ngOnInit() {\n    setTimeout(() => this.loadData(), 250);\n  }\n\n  toggleMode(value) {\n    if (this.mode !== value) {\n      this.mode = value;\n      this.stopMemoryTimer();\n    }\n  }\n\n  toggleAppearance(event: MatCheckboxChange) {\n    this.appearance = event.checked ? 'outline' : 'fill';\n  }\n\n  // Load the form with data\n  async loadData() {\n    const now = DateUtils.moment();\n    const data = {\n      empty: null, // toDateISOString(now.clone().add(2, 'hours'))\n      emptyRequired: null,\n      enable: toDateISOString(now),\n      disable: now,\n      noTime: DateUtils.markNoTime(DateUtils.resetTime(now)),\n      readonly: now,\n      startDateTime: toDateISOString(now),\n      endDateTime: toDateISOString(now.add(1, 'd')),\n      hint: null,\n    };\n\n    this.form.setValue(data);\n\n    this.log('[test-page] Data loaded: ' + JSON.stringify(data));\n\n    this.form\n      .get('empty')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°1: ' + JSON.stringify(value)));\n\n    this.form\n      .get('enable')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°2: ' + JSON.stringify(value)));\n\n    this.form\n      .get('noTime')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°3: ' + JSON.stringify(value)));\n  }\n\n  doSubmit(event?: Event) {\n    this.form.markAllAsTouched();\n    this.log('[test-page] Form content: ' + JSON.stringify(this.form.value));\n    this.log('[test-page] Form status: ' + this.form.status);\n    if (this.form.invalid) {\n      this.log('[test-page] Form errors: ' + JSON.stringify(this.form.errors));\n\n      // DEBUG\n      AppFormUtils.logFormErrors(this.form);\n    }\n  }\n\n  log(message: string) {\n    console.debug(message);\n\n    if (this.showLogPanel) {\n      this.logContent += message + '<br/>';\n      this.cd.markForCheck();\n    }\n  }\n\n  clearLogPanel() {\n    this.logContent = '';\n    this.cd.markForCheck();\n  }\n\n  startMemoryTimer() {\n    this.memoryTimer = timer(50, 50).subscribe(() => {\n      this.memoryHide = !this.memoryHide;\n      this.cd.markForCheck();\n    });\n  }\n\n  stopMemoryTimer() {\n    this.memoryTimer?.unsubscribe();\n    this.memoryTimer = null;\n    this.memoryHide = false;\n  }\n\n  stringify = JSON.stringify;\n\n  /* -- protected methods -- */\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Date/Time field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <!-- Tab nav - mobile/desktop mode -->\n  <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n    <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n      <mat-label>Mobile</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n      <mat-label>Desktop</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'memory'\" (click)=\"toggleMode('memory')\">\n      <mat-label>Memory leak debug</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n      <mat-label>Temporary</mat-label>\n    </a>\n  </nav>\n\n  <form #tabPanel class=\"form-container ion-padding\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    <!-- debugging something -->\n    @if (mode === 'temp') {\n      <ion-row>\n        <ion-col>\n          <ion-text><h4>Required, but allow no time</h4></ion-text>\n        </ion-col>\n      </ion-row>\n      <ion-label>\n        <small>\n          <pre>\nValue: {{ stringify(form.controls.noTime.value) }}\nErrors: {{ stringify(form.controls.noTime.errors) }}\nFocus: {{ hasFocus }}\n          </pre>\n        </small>\n      </ion-label>\n      <mat-date-time-field #tempField\n        formControlName=\"noTime\"\n        placeholder=\"Date/Time\"\n        [mobile]=\"false\"\n        [clearable]=\"true\"\n        [required]=\"true\"\n        [debug]=\"true\"\n        (focus)=\"hasFocus=true\"\n        (blur)=\"hasFocus=false\"\n      >\n        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n      </mat-date-time-field>\n\n      <ion-button (click)=\"tempField.focus()\">Focus</ion-button>\n    }\n\n    <!-- debugging memory leak -->\n    @if (mode === 'memory') {\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Debug memory leak</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col size=\"auto\">\n            @if (!memoryTimer) {\n              <ion-button (click)=\"startMemoryTimer()\">Start timer</ion-button>\n            }\n            @if (memoryTimer) {\n              <ion-button (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n            }\n          </ion-col>\n          <ion-col size=\"4\">\n            <mat-form-field floatLabel=\"auto\">\n              <input matInput type=\"text\" hidden />\n              <mat-checkbox (change)=\"memoryMobile = $event.checked\" [checked]=\"memoryMobile\">Mobile ?</mat-checkbox>\n            </mat-form-field>\n          </ion-col>\n          <ion-col>\n            @if (!memoryHide) {\n              <mat-date-time-field\n                formControlName=\"emptyRequired\"\n                placeholder=\"Date/Time\"\n                [required]=\"true\"\n                [mobile]=\"memoryMobile\"\n                [clearable]=\"true\"\n              >\n                <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n              </mat-date-time-field>\n            }\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n\n    <!-- Mobile mode -->\n    @if (mode === 'mobile') {\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <mat-checkbox (change)=\"toggleAppearance($event)\">Change apparence</mat-checkbox>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.empty.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"empty\"\n                  placeholder=\"Date/Time\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                  [appearance]=\"appearance\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Empty value + required -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value + required</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"emptyRequired\"\n                  placeholder=\"Date/Time\"\n                  [required]=\"true\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                  [appearance]=\"appearance\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Enable  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">With value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.enable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"enable\"\n                  placeholder=\"Date/Time\"\n                  [required]=\"true\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                  [appearance]=\"appearance\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Disable -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disable</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"disable\"\n                  placeholder=\"Date/Time\"\n                  [required]=\"true\"\n                  [mobile]=\"true\"\n                  [appearance]=\"appearance\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Readonly  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Readonly toggle</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox\n                        (change)=\"mobileReadonlyField.readonly = $event.checked\"\n                        [checked]=\"mobileReadonlyField.readonly\"\n                      >\n                        Readonly ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showReadonlyHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-time-field\n                        #mobileReadonlyField\n                        formControlName=\"readonly\"\n                        placeholder=\"Date/Time\"\n                        [readonly]=\"true\"\n                        [mobile]=\"true\"\n                        [clearable]=\"true\"\n                        [appearance]=\"appearance\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showReadonlyHint.checked) {\n                          <mat-hint>Some hint</mat-hint>\n                        }\n                      </mat-date-time-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <!-- Date diff -->\n        <ion-row>\n          <ion-col>\n            <ion-text><h5>Date diff</h5></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Start date time</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.startDateTime.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"startDateTime\"\n                  placeholder=\"Date/Time\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                  [required]=\"true\"\n                  [appearance]=\"appearance\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">End date time</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.endDateTime.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"endDateTime\"\n                  placeholder=\"Date/Time\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                  [required]=\"true\"\n                  [appearance]=\"appearance\"\n                  [subscriptSizing]=\"'fixed'\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                  <!-- duration -->\n                  @if (form.controls.startDateTime.valid && form.controls.endDateTime.value; as value) {\n                    <mat-hint align=\"end\">\n                      <span translate>COMMON.DURATION_DOTS</span>\n                      &nbsp;{{\n                        {\n                          startValue: form.controls.startDateTime.value,\n                          endValue: value,\n                        } | dateDiffDuration\n                      }}\n                    </mat-hint>\n                  }\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Hint -->\n          <ion-col size=\"12\" size-md=\"6\" size-lg=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Hint</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.hint.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #hintAlignEnd [checked]=\"false\" [disabled]=\"!showHint.checked\">\n                        Align end ?\n                      </mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-time-field\n                        formControlName=\"hint\"\n                        placeholder=\"Date/Time\"\n                        [mobile]=\"true\"\n                        [clearable]=\"true\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showHint.checked && !hintAlignEnd.checked) {\n                          <mat-hint>Some hint</mat-hint>\n                        } @else if (showHint.checked && hintAlignEnd.checked) {\n                          <mat-hint align=\"end\">End hint</mat-hint>\n                        }\n                      </mat-date-time-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Compact mode -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Compact mode (for table)</ion-label>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"empty\"\n                  floatLabel=\"never\"\n                  [mobile]=\"true\"\n                  [compact]=\"true\"\n                ></mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Suffix -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">matSuffix</ion-label>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"empty\"\n                  placeholder=\"Date/Time\"\n                  [mobile]=\"false\"\n                  hourMinWidth=\"93px\"\n                >\n                  <button\n                    matSuffix\n                    mat-icon-button\n                    type=\"button\"\n                    tabindex=\"-1\"\n                    [disabled]=\"(form | formGetControl: 'empty')?.disabled\"\n                  >\n                    <mat-icon>star_outline</mat-icon>\n                  </button>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <!-- debug console -->\n        <ion-row>\n          <!-- buttons -->\n          <ion-col size=\"2\">\n            <!-- submit form -->\n            <ion-button (click)=\"doSubmit($event)\" fill=\"outline\">\n              <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n            <!-- clear log  -->\n            <ion-button (click)=\"clearLogPanel()\" fill=\"outline\">\n              <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n          </ion-col>\n          @if (showLogPanel) {\n            <ion-col size=\"10\">\n              <ion-text color=\"primary\">\n                Log:\n                <br />\n              </ion-text>\n              <div class=\"ion-padding-start\">\n                <ion-text color=\"medium\">\n                  <small [innerHTML]=\"logContent\"></small>\n                </ion-text>\n              </div>\n            </ion-col>\n          }\n        </ion-row>\n      </ion-grid>\n    }\n\n    <!-- Desktop mode -->\n    @if (mode === 'desktop') {\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Desktop mode</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.empty.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"empty\"\n                  placeholder=\"Date/Time\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Empty required value -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value + required</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"emptyRequired\"\n                  placeholder=\"Date/Time\"\n                  [required]=\"true\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Enable  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">With value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.enable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"enable\"\n                  placeholder=\"Date/Time\"\n                  [required]=\"true\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Disable -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disable</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"disable\"\n                  placeholder=\"Date/Time\"\n                  [required]=\"true\"\n                  [mobile]=\"false\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- NoTime  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">With value (No time)</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{\n                        stringify(form.controls.noTime.value) +\n                          ' noTime:' +\n                          (form.controls.noTime.value && form.controls.noTime.value[noTimeProperty])\n                      }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"noTime\"\n                  placeholder=\"Date/Time\"\n                  [required]=\"true\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Readonly  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Readonly toggle</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox\n                        (change)=\"desktopReadonlyField.readonly = $event.checked\"\n                        [checked]=\"desktopReadonlyField.readonly\"\n                      >\n                        Readonly ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showDesktopReadonlyHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-time-field\n                        #desktopReadonlyField\n                        formControlName=\"readonly\"\n                        placeholder=\"Date/Time\"\n                        [readonly]=\"true\"\n                        [mobile]=\"false\"\n                        [clearable]=\"true\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showDesktopReadonlyHint.checked) {\n                          <mat-hint>Some hint</mat-hint>\n                        }\n                      </mat-date-time-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <!-- Date diff -->\n        <ion-row>\n          <ion-col>\n            <ion-text><h5>Date diff</h5></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Start date time</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.startDateTime.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"startDateTime\"\n                  placeholder=\"Date/Time\"\n                  [mobile]=\"false\"\n                  [required]=\"true\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">End date time</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.endDateTime.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"endDateTime\"\n                  placeholder=\"Date/Time\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                  [required]=\"true\"\n                  [subscriptSizing]=\"'fixed'\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                  <!-- duration -->\n                  @if (form.controls.startDateTime.valid && form.controls.endDateTime.value; as value) {\n                    <mat-hint align=\"end\">\n                      <span translate>COMMON.DURATION_DOTS</span>\n                      &nbsp;{{\n                        {\n                          startValue: form.controls.startDateTime.value,\n                          endValue: value,\n                        } | dateDiffDuration\n                      }}\n                    </mat-hint>\n                  }\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Hint -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Hint</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.hint.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showDesktopHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #desktopHintAlignEnd [checked]=\"false\" [disabled]=\"!showDesktopHint.checked\">\n                        Align end ?\n                      </mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-time-field\n                        formControlName=\"hint\"\n                        placeholder=\"Date/Time\"\n                        [mobile]=\"false\"\n                        [clearable]=\"true\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showDesktopHint.checked && !desktopHintAlignEnd.checked) {\n                          <mat-hint>Some hint</mat-hint>\n                        } @else if (showDesktopHint.checked && desktopHintAlignEnd.checked) {\n                          <mat-hint align=\"end\">End hint</mat-hint>\n                        }\n                      </mat-date-time-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Compact mode -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Compact mode (for table)</ion-label>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"empty\"\n                  floatLabel=\"never\"\n                  [mobile]=\"false\"\n                  [compact]=\"true\"\n                ></mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n\n          <!-- Suffix -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">matSuffix</ion-label>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-time-field\n                  formControlName=\"empty\"\n                  placeholder=\"Date/Time\"\n                  [mobile]=\"false\"\n                  hourMinWidth=\"93px\"\n                >\n                  <button\n                    matSuffix\n                    mat-icon-button\n                    type=\"button\"\n                    tabindex=\"-1\"\n                    [disabled]=\"(form | formGetControl: 'empty')?.disabled\"\n                  >\n                    <mat-icon>star_outline</mat-icon>\n                  </button>\n                </mat-date-time-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n  </form>\n</ion-content>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedFormGroupValidators, SharedValidators } from '../../../validator/validators';\nimport { AppFormUtils } from '../../../../core/form/form.utils';\nimport { DateUtils, toDateISOString } from '../../../dates';\nimport 'moment-timezone';\nimport { isMobile } from '../../../platforms';\nimport { Subscription, timer } from 'rxjs';\n\n@Component({\n  selector: 'app-data-test',\n  templateUrl: './mat-date.test.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DateTestPage implements OnInit {\n  showLogPanel = true;\n  logContent = '';\n\n  memoryHide = false;\n  memoryMobile = true;\n  memoryTimer: Subscription;\n  timezone = 'Indian/Mahe';\n\n  form: UntypedFormGroup;\n  mode: 'mobile' | 'desktop' | 'memory' | 'temp' = 'mobile';\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef\n  ) {\n    this.form = formBuilder.group(\n      {\n        empty: [null, SharedValidators.validDateAllowNoTime],\n        emptyRequired: [null, Validators.compose([Validators.required, SharedValidators.validDateAllowNoTime])],\n        enable: [null, Validators.required],\n        disable: [null, Validators.required],\n        readonly: [null],\n        timezone: [null],\n        hint: [null],\n      },\n      {\n        validators: SharedFormGroupValidators.dateRange('empty', 'enable'),\n      }\n    );\n\n    const disableControl = this.form.get('disable');\n    disableControl.disable();\n\n    // Copy the 'enable' value, into the disable control\n    this.form.get('enable').valueChanges.subscribe((value) => disableControl.setValue(value));\n\n    this.showLogPanel = this.showLogPanel || isMobile(window);\n  }\n\n  ngOnInit() {\n    setTimeout(() => this.loadData(), 250);\n  }\n\n  toggleMode(value) {\n    if (this.mode !== value) {\n      this.mode = value;\n      this.stopMemoryTimer();\n    }\n  }\n\n  // Load the form with data\n  async loadData() {\n    const now = DateUtils.moment();\n\n    const nowAtMahe = now.clone().tz(this.timezone).startOf('day');\n\n    const data = {\n      empty: null, // toDateISOString(now.clone().add(2, 'hours')),\n      emptyRequired: null,\n      enable: toDateISOString(now),\n      disable: now.clone(),\n      readonly: now.clone(),\n      timezone: nowAtMahe,\n      hint: now.clone(),\n    };\n\n    this.form.setValue(data);\n\n    this.log('[test-page] Data loaded: ' + JSON.stringify(data));\n\n    this.form\n      .get('empty')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°1: ' + JSON.stringify(value)));\n\n    this.form\n      .get('enable')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°2: ' + JSON.stringify(value)));\n\n    this.form\n      .get('timezone')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value with timezone: ' + JSON.stringify(value)));\n  }\n\n  doSubmit(event) {\n    this.form.markAllAsTouched();\n    this.log('[test-page] Form content: ' + JSON.stringify(this.form.value));\n    this.log('[test-page] Form status: ' + this.form.status);\n    if (this.form.invalid) {\n      this.log('[test-page] Form errors: ' + JSON.stringify(this.form.errors));\n\n      // DEBUG\n      AppFormUtils.logFormErrors(this.form);\n    }\n  }\n\n  log(message: string) {\n    console.debug(message);\n\n    if (this.showLogPanel) {\n      this.logContent += message + '<br/>';\n      this.cd.markForCheck();\n    }\n  }\n\n  clearLogPanel() {\n    this.logContent = '';\n    this.cd.markForCheck();\n  }\n\n  startMemoryTimer() {\n    this.memoryTimer = timer(50, 50).subscribe(() => {\n      this.memoryHide = !this.memoryHide;\n      this.cd.markForCheck();\n    });\n  }\n\n  stopMemoryTimer() {\n    this.memoryTimer?.unsubscribe();\n    this.memoryTimer = null;\n    this.memoryHide = false;\n  }\n\n  stringify = JSON.stringify;\n\n  /* -- protected methods -- */\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Date field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <!-- Tab nav - mobile/desktop mode -->\n  <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n    <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n      <mat-label>Mobile</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n      <mat-label>Desktop</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'memory'\" (click)=\"toggleMode('memory')\">\n      <mat-label>Memory leak debug</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n      <mat-label>Temporary</mat-label>\n    </a>\n  </nav>\n\n  <form #tabPanel class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    <!-- debugging memory leak -->\n    @if (mode === 'memory') {\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Debug memory leak</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col size=\"auto\">\n            @if (!memoryTimer) {\n              <ion-button (click)=\"startMemoryTimer()\">Start timer</ion-button>\n            }\n            @if (memoryTimer) {\n              <ion-button (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n            }\n          </ion-col>\n          <ion-col size=\"4\">\n            <mat-form-field floatLabel=\"auto\">\n              <input matInput type=\"text\" hidden />\n              <mat-checkbox (change)=\"memoryMobile = $event.checked\" [checked]=\"memoryMobile\">Mobile ?</mat-checkbox>\n            </mat-form-field>\n          </ion-col>\n          <ion-col>\n            @if (!memoryHide) {\n              <mat-date-field\n                formControlName=\"empty\"\n                placeholder=\"Date\"\n                [required]=\"true\"\n                [mobile]=\"memoryMobile\"\n                [clearable]=\"true\"\n              >\n                <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n              </mat-date-field>\n            }\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n\n    <!-- Mobile mode -->\n    @if (mode === 'mobile') {\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Mobile mode</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.empty.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field formControlName=\"empty\" placeholder=\"Date\" [mobile]=\"true\" [clearable]=\"true\">\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value (required)</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field\n                  formControlName=\"emptyRequired\"\n                  placeholder=\"Date\"\n                  [required]=\"true\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Enable  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">With value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.enable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field\n                  formControlName=\"enable\"\n                  placeholder=\"Date\"\n                  [required]=\"true\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Disable -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disable</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field formControlName=\"disable\" placeholder=\"Date\" [required]=\"true\" [mobile]=\"true\">\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- TimeZone  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">TimeZone</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>timezone=\"{{ timezone }}\" value=\"{{ stringify(form.controls.timezone.value) }}\"</pre>\n                    </small>\n                    <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field\n                  formControlName=\"timezone\"\n                  placeholder=\"Date\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                  [timezone]=\"timezone\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Readonly  -->\n          <ion-col size=\"12\" size-lg=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Readonly toggle</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox\n                        (change)=\"mobileReadonlyField.readonly = $event.checked\"\n                        [checked]=\"mobileReadonlyField.readonly\"\n                      >\n                        Readonly ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showReadonlyHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showReadonlyIcons [checked]=\"true\">Icons ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-field\n                        #mobileReadonlyField\n                        formControlName=\"readonly\"\n                        placeholder=\"Date\"\n                        [readonly]=\"true\"\n                        [mobile]=\"true\"\n                        [clearable]=\"true\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showReadonlyIcons.checked) {\n                          <mat-icon matSuffix>keyboard_arrow_left</mat-icon>\n                        }\n                        @if (showReadonlyHint.checked) {\n                          <mat-hint>Some hint</mat-hint>\n                        }\n                      </mat-date-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Hint -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Hint</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.hint.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showHintEnd [checked]=\"false\">Align end ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-field formControlName=\"hint\" placeholder=\"Date\" [mobile]=\"true\" [clearable]=\"true\">\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (!showHintEnd.checked) {\n                          <mat-hint>Start hint</mat-hint>\n                        } @else {\n                          <mat-hint align=\"end\">End hint</mat-hint>\n                        }\n                      </mat-date-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <!-- debug console -->\n        <ion-row>\n          <!-- buttons -->\n          <ion-col size=\"2\">\n            <!-- submit form -->\n            <ion-button (click)=\"doSubmit($event)\" fill=\"outline\">\n              <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n            <!-- clear log  -->\n            <ion-button (click)=\"clearLogPanel()\" fill=\"outline\">\n              <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n          </ion-col>\n          @if (showLogPanel) {\n            <ion-col size=\"10\">\n              <ion-text color=\"primary\">\n                Log:\n                <br />\n              </ion-text>\n              <div class=\"ion-padding-start\">\n                <ion-text color=\"medium\">\n                  <small [innerHTML]=\"logContent\"></small>\n                </ion-text>\n              </div>\n            </ion-col>\n          }\n        </ion-row>\n      </ion-grid>\n    }\n\n    <!-- Desktop mode -->\n    @if (mode === 'desktop') {\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Desktop mode</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.empty.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field formControlName=\"empty\" placeholder=\"Date\" [mobile]=\"false\" [clearable]=\"true\">\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value (required)</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field\n                  formControlName=\"emptyRequired\"\n                  placeholder=\"Date\"\n                  [required]=\"true\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Enable  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">With value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.enable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field\n                  formControlName=\"enable\"\n                  placeholder=\"Date\"\n                  [required]=\"true\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Disable -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disable</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field formControlName=\"disable\" placeholder=\"Date\" [required]=\"true\" [mobile]=\"false\">\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- TimeZone  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">TimeZone</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>timezone=\"{{ timezone }}\" value={{ stringify(form.controls.timezone.value) }}</pre>\n                    </small>\n                    <pre>Should display using the browser TZ,<br/>but serialize/deserialize for the given TZ</pre>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-field\n                  formControlName=\"timezone\"\n                  placeholder=\"Date\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                  [timezone]=\"timezone\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Readonly  -->\n          <ion-col size=\"12\" size-lg=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Readonly toggle</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox\n                        (change)=\"desktopReadonlyField.readonly = $event.checked\"\n                        [checked]=\"desktopReadonlyField.readonly\"\n                      >\n                        Readonly ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showDesktopHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-field\n                        #desktopReadonlyField\n                        formControlName=\"readonly\"\n                        placeholder=\"Date\"\n                        [readonly]=\"true\"\n                        [mobile]=\"false\"\n                        [clearable]=\"true\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showDesktopHint.checked) {\n                          <mat-hint>Some hint</mat-hint>\n                        }\n                      </mat-date-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Hint -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Hint</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.hint.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showDesktopHintEnd [checked]=\"false\">Align end ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-field formControlName=\"hint\" placeholder=\"Date\" [mobile]=\"false\" [clearable]=\"true\">\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (!showDesktopHintEnd.checked) {\n                          <mat-hint>Start hint</mat-hint>\n                        } @else {\n                          <mat-hint align=\"end\">End hint</mat-hint>\n                        }\n                      </mat-date-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n  </form>\n</ion-content>\n","import { Component, ElementRef, OnDestroy, ViewChild } from '@angular/core';\nimport { firstNotNilPromise, FirstOptions, WaitForOptions, waitForTrue } from '../observables';\nimport { Observable, Subject } from 'rxjs';\nimport { isNotNil } from '../functions';\nimport { tap } from 'rxjs/operators';\nimport { DateUtils, toDateISOString } from '../dates';\n\n@Component({\n  selector: 'app-observable-test',\n  templateUrl: './observable.test.html',\n  styleUrls: ['./observable.test.scss'],\n})\nexport class ObservableTestPage implements OnDestroy {\n  _stopSubject = new Subject<void>();\n\n  $value = new Subject<any>();\n  runningTaskCount = 0;\n  taskId = 0;\n  options: Partial<FirstOptions> = {\n    stop: this._stopSubject,\n  };\n\n  @ViewChild('result') resultDiv!: ElementRef;\n\n  constructor() {}\n\n  ngOnDestroy() {\n    this._stopSubject.next();\n  }\n\n  setOptions(opts: any) {\n    this.options = {\n      ...this.options,\n      ...opts,\n    };\n    this.log('Options changes to: ', { ...this.options, stop: this.options?.stop ? '$stop' : 'null' });\n  }\n\n  setOptionsError(errorMessage) {\n    this.setOptions({ stopError: new Error(errorMessage) });\n  }\n\n  async firstNotNilPromise(opts?: FirstOptions) {\n    const logPrefix = `[firstNotNilPromise() #${++this.taskId}] `;\n    await this.execute(firstNotNilPromise, opts, logPrefix);\n  }\n\n  async waitForTrue(opts?: WaitForOptions) {\n    const logPrefix = `[waitForTrue() #${++this.taskId}] `;\n    await this.execute(waitForTrue, opts, logPrefix);\n  }\n\n  async execute<T, O extends WaitForOptions = WaitForOptions>(fn: (o: Observable<any>, opts: O) => Promise<T>, opts?: O, logPrefix?: string) {\n    opts = {\n      ...this.options,\n      stop: this._stopSubject,\n      ...opts,\n    };\n    logPrefix = logPrefix || `[#${++this.taskId}] `;\n\n    const value$ = this.$value.pipe(tap((value) => this.log(logPrefix + `Received value: ${value}`)));\n\n    try {\n      this.runningTaskCount++;\n      this.log(logPrefix + 'Waiting...');\n\n      // Execute the async function\n      const result = await fn(value$, opts);\n\n      // Dump result\n      if (isNotNil(result)) this.log(logPrefix + '[OK] with result:', result);\n      else this.log(logPrefix + '[OK]');\n    } catch (err) {\n      const errorMsg = logPrefix + 'Error: ' + (err?.message || '');\n      console.error(errorMsg, err);\n      this.log(errorMsg + (err?.originalStack ? `<pre>${err.originalStack}</pre>` : ''));\n    } finally {\n      this.runningTaskCount--;\n    }\n  }\n\n  emit(value: any) {\n    this.$value.next(value);\n  }\n\n  stop() {\n    this._stopSubject.next();\n  }\n\n  log(message: string, ...args: any) {\n    let fullMessage = `${toDateISOString(DateUtils.moment())} - ${message}`;\n    if (args?.length) {\n      fullMessage += ' - <small>' + args.map(JSON.stringify).join(', ') + '</small>';\n    }\n    this.appendLog(fullMessage);\n  }\n\n  appendLog(message: string) {\n    this.resultDiv.nativeElement.innerHTML += message + '<br/>';\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Observables test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <ion-card>\n    <ion-card-header>\n      <ion-card-title>waitFor, waitForTrue, waitForFalse</ion-card-title>\n    </ion-card-header>\n    <ion-card-content>\n      <div style=\"display: inline-block\">\n        <p>Set options:</p>\n        <ion-button color=\"medium\" fill=\"outline\" (click)=\"setOptions({ stopError: false })\">\n          stopError: false\n        </ion-button>\n        <ion-button color=\"medium\" fill=\"outline\" (click)=\"setOptions({ stopError: true })\">stopError: true</ion-button>\n        <ion-button color=\"medium\" fill=\"outline\" (click)=\"setOptions({ stopError: 'my error' })\">\n          stopError: 'my error'\n        </ion-button>\n\n        <ion-button color=\"medium\" fill=\"outline\" (click)=\"setOptions({ timeout: 2000 })\">timeout: 2000</ion-button>\n        <ion-button color=\"medium\" fill=\"outline\" (click)=\"setOptions({ timeout: null })\">timeout: null</ion-button>\n        <br />\n        <p>Call await function:</p>\n        <ion-button (click)=\"waitForTrue()\">waitForTrue</ion-button>\n        <ion-button (click)=\"firstNotNilPromise()\">firstNotNilPromise</ion-button>\n        <br />\n        <p>Send event to source:</p>\n        <ion-button (click)=\"emit(true)\">Emit 'true'</ion-button>\n        <ion-button (click)=\"emit(false)\">Emit 'false'</ion-button>\n        <br />\n        <p>Stop:</p>\n        <ion-button color=\"danger\" (click)=\"stop()\">Stop</ion-button>\n      </div>\n    </ion-card-content>\n  </ion-card>\n\n  <ion-card>\n    <ion-toolbar>\n      <ion-title>Running job count: {{ runningTaskCount }}</ion-title>\n      <ion-button fill=\"outline\" slot=\"end\" (click)=\"result.innerHTML = ''\">Clear log</ion-button>\n    </ion-toolbar>\n    <ion-card-content>\n      <div #result style=\"color: var(--ion-color-medium)\"></div>\n    </ion-card-content>\n  </ion-card>\n</ion-content>\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { debounceTime } from 'rxjs/operators';\nimport { SharedFormGroupValidators, SharedValidators } from '../../../validator/validators';\nimport { AppFormUtils } from '../../../../core/form/form.utils';\nimport { DateUtils, toDateISOString } from '../../../dates';\nimport 'moment-timezone';\nimport { isMobile } from '../../../platforms';\nimport { Subscription, timer } from 'rxjs';\n\n@Component({\n  selector: 'app-data-short-test',\n  templateUrl: './mat-dateshort.test.html',\n})\nexport class DateShortTestPage implements OnInit {\n  showLogPanel = true;\n  logContent = '';\n\n  memoryHide = false;\n  memoryMobile = true;\n  memoryTimer: Subscription;\n\n  form: UntypedFormGroup;\n  mode: 'mobile' | 'desktop' | 'memory' | 'temp' = 'mobile';\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef\n  ) {\n    this.form = formBuilder.group(\n      {\n        empty: [null, SharedValidators.validDateAllowNoTime],\n        emptyRequired: [null, Validators.compose([Validators.required, SharedValidators.validDateAllowNoTime])],\n        enable: [null, Validators.required],\n        disable: [null, Validators.required],\n        readonly: [null],\n        hint: [null],\n      },\n      {\n        validators: SharedFormGroupValidators.dateRange('empty', 'enable'),\n      }\n    );\n\n    const disableControl = this.form.get('disable');\n    disableControl.disable();\n\n    // Copy the 'enable' value, into the disable control\n    this.form.get('enable').valueChanges.subscribe((value) => disableControl.setValue(value));\n\n    this.showLogPanel = this.showLogPanel || isMobile(window);\n  }\n\n  ngOnInit() {\n    setTimeout(() => this.loadData(), 250);\n  }\n\n  toggleMode(value) {\n    if (this.mode !== value) {\n      this.mode = value;\n      this.stopMemoryTimer();\n    }\n  }\n\n  // Load the form with data\n  async loadData() {\n    const now = DateUtils.moment();\n\n    const data = {\n      empty: null, // toDateISOString(now.clone().add(2, 'hours')),\n      emptyRequired: null,\n      enable: toDateISOString(now),\n      disable: now.clone(),\n      readonly: now.clone(),\n      hint: null,\n    };\n\n    this.form.setValue(data);\n\n    this.log('[test-page] Data loaded: ' + JSON.stringify(data));\n\n    this.form\n      .get('empty')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°1: ' + JSON.stringify(value)));\n\n    this.form\n      .get('enable')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°2: ' + JSON.stringify(value)));\n  }\n\n  doSubmit(event) {\n    this.form.markAllAsTouched();\n    this.log('[test-page] Form content: ' + JSON.stringify(this.form.value));\n    this.log('[test-page] Form status: ' + this.form.status);\n    if (this.form.invalid) {\n      this.log('[test-page] Form errors: ' + JSON.stringify(this.form.errors));\n\n      // DEBUG\n      AppFormUtils.logFormErrors(this.form);\n    }\n  }\n\n  log(message: string) {\n    console.debug(message);\n\n    if (this.showLogPanel) {\n      this.logContent += message + '<br/>';\n      this.cd.markForCheck();\n    }\n  }\n\n  clearLogPanel() {\n    this.logContent = '';\n    this.cd.markForCheck();\n  }\n\n  startMemoryTimer() {\n    this.memoryTimer = timer(50, 50).subscribe(() => {\n      this.memoryHide = !this.memoryHide;\n    });\n  }\n\n  stopMemoryTimer() {\n    this.memoryTimer?.unsubscribe();\n    this.memoryTimer = null;\n    this.memoryHide = false;\n  }\n\n  stringify = JSON.stringify;\n\n  /* -- protected methods -- */\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Date short field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <!-- Tab nav - mobile/desktop mode -->\n  <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n    <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n      <mat-label>Mobile</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n      <mat-label>Desktop</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'memory'\" (click)=\"toggleMode('memory')\">\n      <mat-label>Memory leak debug</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n      <mat-label>Temporary</mat-label>\n    </a>\n  </nav>\n\n  <form #tabPanel class=\"form-container ion-padding\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    @if (mode === 'memory') {\n      <ion-grid>\n        <!-- debugging memory leak -->\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Debug memory leak</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col size=\"auto\">\n            @if (!memoryTimer) {\n              <ion-button (click)=\"startMemoryTimer()\">Start timer</ion-button>\n            }\n            @if (memoryTimer) {\n              <ion-button (click)=\"stopMemoryTimer()\">Stop timer</ion-button>\n            }\n          </ion-col>\n          <ion-col size=\"4\">\n            <mat-form-field floatLabel=\"auto\">\n              <input matInput type=\"text\" hidden />\n              <mat-checkbox (change)=\"memoryMobile = $event.checked\" [checked]=\"memoryMobile\">Mobile ?</mat-checkbox>\n            </mat-form-field>\n          </ion-col>\n          <ion-col>\n            @if (!memoryHide) {\n              <mat-date-short-field\n                formControlName=\"empty\"\n                placeholder=\"Date\"\n                [required]=\"true\"\n                [mobile]=\"memoryMobile\"\n                [clearable]=\"true\"\n              >\n                <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n              </mat-date-short-field>\n            }\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n\n    @if (mode === 'mobile') {\n      <ion-grid>\n        <!-- Mobile mode -->\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Mobile mode</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.empty.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-short-field formControlName=\"empty\" placeholder=\"Date\" [mobile]=\"true\" [clearable]=\"true\">\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value (required)</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-short-field\n                  formControlName=\"emptyRequired\"\n                  placeholder=\"Date\"\n                  [required]=\"true\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Enable  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">With value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.enable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-short-field\n                  formControlName=\"enable\"\n                  placeholder=\"Date\"\n                  [required]=\"true\"\n                  [mobile]=\"true\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Disable -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disable</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-short-field formControlName=\"disable\" placeholder=\"Date\" [required]=\"true\" [mobile]=\"true\">\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Readonly  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Readonly toggle</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox\n                        (change)=\"mobileReadonlyField.readonly = $event.checked\"\n                        [checked]=\"mobileReadonlyField.readonly\"\n                      >\n                        Readonly ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showReadonlyHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showReadonlyIcons [checked]=\"true\">Icons ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-short-field\n                        #mobileReadonlyField\n                        formControlName=\"readonly\"\n                        placeholder=\"Date\"\n                        [readonly]=\"true\"\n                        [mobile]=\"true\"\n                        [clearable]=\"true\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showReadonlyIcons.checked) {\n                          <mat-icon matSuffix>keyboard_arrow_left</mat-icon>\n                        }\n                        @if (showReadonlyHint.checked) {\n                          <mat-hint>Some hint</mat-hint>\n                        }\n                      </mat-date-short-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n\n          <!-- Hint -->\n          <ion-col size=\"12\" size-md=\"6\" size-lg=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Hint</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.hint.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showHintAlignEnd [checked]=\"false\" [disabled]=\"!showHint.checked\">\n                        Align end ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showIcons [checked]=\"true\">Suffix icon ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-short-field\n                        formControlName=\"hint\"\n                        placeholder=\"Date\"\n                        [mobile]=\"true\"\n                        [clearable]=\"true\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showIcons.checked) {\n                          <mat-icon matSuffix>keyboard_arrow_left</mat-icon>\n                        }\n                        @if (showHint.checked) {\n                          <mat-hint [align]=\"showHintAlignEnd.checked ? 'end' : 'start'\">Some hint</mat-hint>\n                        }\n                      </mat-date-short-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <!-- debug console -->\n        <ion-row>\n          <!-- buttons -->\n          <ion-col size=\"2\">\n            <!-- submit form -->\n            <ion-button (click)=\"doSubmit($event)\" fill=\"outline\">\n              <ion-icon name=\"checkmark\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n            <!-- clear log  -->\n            <ion-button (click)=\"clearLogPanel()\" fill=\"outline\">\n              <ion-icon name=\"trash\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n          </ion-col>\n          @if (showLogPanel) {\n            <ion-col size=\"10\">\n              <ion-text color=\"primary\">\n                Log:\n                <br />\n              </ion-text>\n              <div class=\"ion-padding-start\">\n                <ion-text color=\"medium\">\n                  <small [innerHTML]=\"logContent\"></small>\n                </ion-text>\n              </div>\n            </ion-col>\n          }\n        </ion-row>\n      </ion-grid>\n    }\n\n    @if (mode === 'desktop') {\n      <ion-grid>\n        <!-- Desktop mode -->\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Desktop mode</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>\n                        {{ stringify(form.controls.empty.value) }}\n                      </pre>\n                      <br />\n                      <pre>\n                        formControl.valid? {{ form.controls.empty?.valid }}\n                      </pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-short-field\n                  formControlName=\"empty\"\n                  #desktopEmptyField\n                  placeholder=\"Date\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <!-- Empty value + required -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value (required)</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-short-field\n                  formControlName=\"emptyRequired\"\n                  placeholder=\"Date\"\n                  [required]=\"true\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Enable  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">With value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.enable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-short-field\n                  formControlName=\"enable\"\n                  placeholder=\"Date\"\n                  [required]=\"true\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Disable -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disable</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-date-short-field formControlName=\"disable\" placeholder=\"Date\" [required]=\"true\" [mobile]=\"false\">\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Readonly  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Readonly toggle</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-checkbox\n                  (change)=\"desktopReadonlyField.readonly = $event.checked\"\n                  [checked]=\"desktopReadonlyField.readonly\"\n                ></mat-checkbox>\n                <mat-date-short-field\n                  #desktopReadonlyField\n                  formControlName=\"readonly\"\n                  placeholder=\"Date\"\n                  [readonly]=\"true\"\n                  [mobile]=\"false\"\n                  [clearable]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                </mat-date-short-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n\n          <!-- Hint -->\n          <ion-col size=\"12\" size-md=\"6\" size-lg=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Hint</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.hint.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showHint [checked]=\"true\">Hint ?</mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showHintAlignEnd [checked]=\"false\" [disabled]=\"!showHint.checked\">\n                        Align end ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showIcons [checked]=\"true\">Suffix icon ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-date-short-field\n                        formControlName=\"hint\"\n                        placeholder=\"Date\"\n                        [mobile]=\"false\"\n                        [clearable]=\"true\"\n                      >\n                        <ion-icon matPrefix name=\"calendar-outline\"></ion-icon>\n                        @if (showIcons.checked) {\n                          <mat-icon matSuffix>keyboard_arrow_left</mat-icon>\n                        }\n                        @if (showHint.checked) {\n                          <mat-hint [align]=\"showHintAlignEnd.checked ? 'end' : 'start'\">Some hint</mat-hint>\n                        }\n                      </mat-date-short-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n  </form>\n</ion-content>\n","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { SharedFormArrayValidators, SharedValidators } from '../../../validator/validators';\nimport { MatAutocompleteField } from '../material.autocomplete';\nimport { isNil, isNotNil, sleep } from '../../../functions';\nimport { BehaviorSubject, Subscription, timer } from 'rxjs';\nimport { LoadResult } from '../../../services/entity-service.class';\nimport { suggestFromArray } from '../../../services';\nimport { MatAutocompleteConfigHolder } from '../material.autocomplete.config';\nimport { IonModal } from '@ionic/angular';\n\nclass EntityTestClass {\n  id: number;\n  label: string;\n  name: string;\n}\n\nconst FAKE_ENTITIES = [\n  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments. again for A' },\n  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments. again for B' },\n  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments. again for C' },\n  { id: 4, label: 'DDD', name: 'Item D', description: 'Very long description D', comments: 'Very very long comments. again for D' },\n  { id: 5, label: 'EEE', name: 'Item E', description: 'Very long description E', comments: 'Very very long comments. again for E' },\n];\n\nfunction deepCopy(values?: EntityTestClass[], size?: number): EntityTestClass[] {\n  if (isNil(size)) {\n    return (values || FAKE_ENTITIES).map((entity) => Object.assign({}, entity));\n  }\n\n  let result = [];\n  let i = 1;\n  while (result.length < size) {\n    result = result.concat(\n      (values || FAKE_ENTITIES).map((entity) => {\n        const label = entity.label + i;\n        const name = entity.name + ' #' + i;\n        return { ...entity, id: i++, label, name };\n      })\n    );\n  }\n  return result.slice(0, size);\n}\n\n@Component({\n    selector: 'app-autocomplete-test',\n    templateUrl: './autocomplete.test.html',\n    styleUrls: ['./autocomplete.test.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    standalone: false\n})\nexport class AutocompleteTestPage implements OnInit, AfterViewInit {\n  protected _items: any[] = deepCopy(FAKE_ENTITIES, 100);\n  protected _$items = new BehaviorSubject<EntityTestClass[]>(undefined);\n  protected _favoriteItems: any[] = deepCopy(FAKE_ENTITIES, 2).reverse();\n\n  protected _favoriteFarItems: any[] = [...deepCopy(FAKE_ENTITIES, 2), FAKE_ENTITIES[2]].reverse();\n\n  form: UntypedFormGroup;\n  autocompleteFields = new MatAutocompleteConfigHolder();\n  memoryHide = false;\n  memoryMobile = true;\n  memoryAutocompleteFieldName = 'entity-$items';\n  memoryTimer: Subscription;\n\n  mode: 'mobile' | 'desktop' | 'memory' | 'temp' = 'desktop';\n\n  @ViewChild('farEntityField') farEntityField: MatAutocompleteField;\n  @ViewChild(IonModal) ionModal: IonModal;\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    private cd: ChangeDetectorRef\n  ) {\n    this.form = formBuilder.group({\n      emptyEntity: [null, SharedValidators.entity],\n      entity: [null, SharedValidators.entity],\n      missingEntity: [null, SharedValidators.entity],\n      disableEntity: [null, SharedValidators.entity],\n      entities: [null, SharedFormArrayValidators.requiredArrayMinLength(1)],\n      farEntity: [null, SharedValidators.entity],\n      withButton: [null, SharedValidators.entity],\n    });\n\n    this.form.get('disableEntity').disable();\n  }\n\n  ngOnInit() {\n    this.mode = this.mode || 'mobile';\n\n    // From suggest\n    this.autocompleteFields.add('entity-suggestFn', {\n      suggestFn: (value, filter) => this.suggest(value, filter),\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n    });\n\n    // From items array\n    this.autocompleteFields.add('entity-items', {\n      items: this._items.slice(),\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n    });\n\n    // From $items observable\n    this.autocompleteFields.add('entity-$items', {\n      items: this._$items,\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n    });\n\n    // From $items with filter\n    this.autocompleteFields.add('entity-items-filter', {\n      service: {\n        suggest: (value, filter) => this.suggest(value, filter),\n      },\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n    });\n\n    // From items\n    this.autocompleteFields.add('entity-items-large', {\n      items: FAKE_ENTITIES.slice(),\n      attributes: ['label', 'name', 'description', 'comments'],\n      displayWith: this.entityToString,\n    });\n\n    // Far entity, in the list\n    this.autocompleteFields.add('entity-far', {\n      suggestFn: (value, filter) => this.suggest(value, filter),\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n    });\n\n    // For multiple value\n    this.autocompleteFields.add('entities-items-filter', {\n      service: {\n        suggest: (value, filter) => this.suggest(value, filter),\n      },\n      attributes: ['label', 'name'],\n      multiple: true,\n    });\n\n    // With button mode values\n    this.autocompleteFields.add('entity-with-button', {\n      service: {\n        suggest: (value, filter) => this.suggest(value, filter),\n      },\n      attributes: ['label', 'name'],\n    });\n  }\n\n  ngAfterViewInit() {\n    if (this.farEntityField) {\n      setTimeout(() => {\n        if (this.farEntityField) {\n          this.farEntityField.suggestLengthThreshold = 2;\n          this.farEntityField.reloadItems();\n        }\n      }, 500);\n    }\n\n    setTimeout(() => this.loadData(), 1000);\n  }\n\n  // Load the form with data\n  async loadData() {\n    const data = {\n      emptyEntity: null,\n\n      entity: deepCopy(FAKE_ENTITIES)[0], // First\n\n      farEntity: deepCopy(FAKE_ENTITIES)[2],\n\n      // This item is NOT in the items list => i should be displayed anyway\n      missingEntity: {\n        id: -1,\n        label: '??',\n        name: 'Missing item',\n      },\n\n      disableEntity: deepCopy(FAKE_ENTITIES)[2],\n\n      entities: deepCopy(FAKE_ENTITIES),\n\n      withButton: deepCopy(FAKE_ENTITIES)[0],\n    };\n\n    this.form.setValue(data);\n\n    // Load observables\n    setTimeout(() => this.loadItems(), 1000);\n  }\n\n  async loadItems() {\n    this._$items.next(this._items.slice());\n  }\n\n  entityToString(item: any) {\n    return [(item && item.label) || undefined, (item && item.name) || undefined].filter(isNotNil).join(' - ');\n  }\n\n  entitiesToString(items: any[]) {\n    return (items || []).map(this.entityToString).join(', ');\n  }\n\n  async suggest(value: any, filter?: any): Promise<LoadResult<EntityTestClass>> {\n    if (isNotNil(value?.id)) return { data: [value] };\n\n    filter = { offset: 0, size: 30, ...filter };\n    const res = suggestFromArray(this._items, value, {\n      ...filter,\n      searchAttributes: ['label', 'name'],\n    });\n\n    // Simulate a size = 30\n    const total = res.total || res.data.length;\n\n    const nextOffset = filter.offset + res.data.length;\n    if (nextOffset < total) {\n      filter = { ...filter, offset: nextOffset };\n      return {\n        total,\n        data: res.data,\n        fetchMore: async (variables) => {\n          await sleep(1000); // Simulate access to server\n          return this.suggest(value, { ...filter, ...variables });\n        },\n      };\n    }\n\n    return res;\n  }\n\n  doSubmit(_) {\n    console.debug('Validate form: ', this.form.value);\n  }\n\n  equals(o1: EntityTestClass, o2: EntityTestClass): boolean {\n    return o1 && o2 && o1.id === o2.id;\n  }\n\n  toggleMode(value) {\n    if (this.mode !== value) {\n      this.mode = value;\n      this.stopMemoryTimer();\n    }\n  }\n\n  startMemoryTimer() {\n    this.memoryTimer = timer(0, 50).subscribe(() => {\n      this.memoryHide = !this.memoryHide;\n      this.cd.markForCheck();\n    });\n  }\n\n  stopMemoryTimer() {\n    this.memoryTimer?.unsubscribe();\n    this.memoryTimer = null;\n    this.memoryHide = false;\n  }\n\n  updateFilter(autocompleteField: MatAutocompleteField, fieldName: string) {\n    const filter: { searchAttribute?: string } = this.autocompleteFields.get(fieldName).filter || {};\n    filter.searchAttribute = !filter || filter.searchAttribute !== 'name' ? 'name' : 'label';\n    autocompleteField.reloadItems();\n  }\n\n  /* -- protected methods -- */\n\n  stringify(value: any) {\n    return JSON.stringify(value);\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Autocomplete field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <!-- Tab nav - mobile/desktop mode -->\n  <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n    <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n      <mat-label>Mobile</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n      <mat-label>Desktop</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'memory'\" (click)=\"toggleMode('memory')\">\n      <mat-label>Memory leak debug</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n      <mat-label>Temporary</mat-label>\n    </a>\n  </nav>\n\n  <form #tabPanel class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    @if (mode === 'temp') {\n      <ion-grid>\n        <ion-row>\n          <!-- Autocomplete medium panel class - see issue sumaris-app#943\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Autocomplete with class 'min-width-medium'</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>\n                        class=\"min-width-medium\"\n                      </pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  placeholder=\"With panel class\"\n                  [config]=\"autocompleteFields.get('entity-items-large')\"\n                  panelClass=\"min-width-medium\"\n                  [mobile]=\"false\"\n                  [logPrefix]=\"'[combo-temp-min-width-medium]'\"\n                  [showAllOnFocus]=\"true\"\n                  [debug]=\"true\"\n                >\n                  <button matAfter type=\"button\" mat-icon-button tabindex=\"-1\" title=\"Filter\" [color]=\"'primary'\">\n                    <mat-icon>filter_list_alt</mat-icon>\n                  </button>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>-->\n\n          <!-- Autocomplete with button\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Autocomplete with button</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre style=\"white-space: normal !important\">\n                        value: {{ stringify(form.controls.withButton.value) }}</pre\n                      >\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"withButton\"\n                  placeholder=\"With button\"\n                  [config]=\"autocompleteFields.get('entity-with-button')\"\n                  [mobile]=\"false\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-temp-with-button]'\"\n                  [required]=\"true\"\n                  [clearable]=\"true\"\n                  [clearInvalidValueOnBlur]=\"true\"\n                  [reloadItemsOnFocus]=\"true\"\n                  [showAllOnFocus]=\"true\"\n                  [selectInputContentOnFocus]=\"true\"\n                  [debug]=\"true\"\n                >\n                  <button matAfter type=\"button\" mat-icon-button tabindex=\"-1\" title=\"Filter\" [color]=\"'primary'\">\n                    <mat-icon>filter_list_alt</mat-icon>\n                  </button>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col> -->\n\n          <!--<ion-col size=\"3\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">panelClass + suggestLengthThreshold</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>\nsuggestLengthThreshold: '3'\npanelClass=\"mat-select-panel-fit-content\"\n                      </pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"emptyEntity\"\n                  [config]=\"autocompleteFields.get('entity-items-filter')\"\n                  [placeholder]=\"'Entity'\"\n                  [mobile]=\"false\"\n                  [equals]=\"equals\"\n                  [suggestLengthThreshold]=\"3\"\n                  [logPrefix]=\"'[combo-desktop-suggestLengthThreshold]'\"\n                  [debug]=\"true\"\n                  [showAllOnFocus]=\"true\"\n                  panelClass=\"mat-select-panel-fit-content\"\n                >\n                  <mat-icon matPrefix>keyboard_arrow_right</mat-icon>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>-->\n\n          <!-- showAllOnFocus + required + NO searchbar\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">showAllOnFocus + required + NO searchbar</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>mobile: true, showSearchBar: false, showAllOnFocus: true, required: true</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  #field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                  [placeholder]=\"'Entity'\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-no-searchbar]'\"\n                  [debug]=\"true\"\n                  [mobile]=\"true\"\n                  [required]=\"true\"\n                  placeholder=\"No search bar\"\n                  showSearchBar=\"true\"\n                  [showAllOnFocus]=\"false\"\n                >\n                  <ion-spinner matSuffix *ngIf=\"field.loading\"></ion-spinner>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>-->\n        </ion-row>\n      </ion-grid>\n    }\n\n    @if (mode === 'memory') {\n      <ion-grid>\n        <!-- debugging memory leak -->\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Debug memory leak</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col size=\"2\">\n            <mat-form-field floatLabel=\"always\">\n              <mat-label>Items type</mat-label>\n              <input matInput type=\"text\" hidden />\n              <mat-select\n                (selectionChange)=\"memoryAutocompleteFieldName = $event.value\"\n                [value]=\"memoryAutocompleteFieldName\"\n              >\n                <mat-option value=\"entity-$items\">Observable</mat-option>\n                <mat-option value=\"entity-suggestFn\">Suggest function</mat-option>\n              </mat-select>\n            </mat-form-field>\n          </ion-col>\n          <ion-col size=\"1\" class=\"ion-no-padding\">\n            <mat-form-field floatLabel=\"always\">\n              <mat-label>Mobile ?</mat-label>\n              <input matInput type=\"text\" hidden />\n              <mat-checkbox (change)=\"memoryMobile = $event.checked\" [checked]=\"memoryMobile\"></mat-checkbox>\n            </mat-form-field>\n          </ion-col>\n          <ion-col size=\"2\">\n            @if (!memoryTimer) {\n              <ion-button (click)=\"startMemoryTimer()\" color=\"tertiary\">Start</ion-button>\n            }\n            @if (memoryTimer) {\n              <ion-button (click)=\"stopMemoryTimer()\" color=\"tertiary\">Stop</ion-button>\n            }\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            @if (!memoryHide && memoryAutocompleteFieldName) {\n              <span>OK {{ memoryHide }}</span>\n              <mat-autocomplete-field\n                formControlName=\"entity\"\n                [config]=\"autocompleteFields.get(memoryAutocompleteFieldName)\"\n                [mobile]=\"memoryMobile\"\n                [equals]=\"equals\"\n                [logPrefix]=\"'[combo-memory-leak]'\"\n              ></mat-autocomplete-field>\n            }\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n\n    <!-- Mobile mode -->\n    @if (mode === 'mobile') {\n      <ion-grid>\n        <ion-row>\n          <!-- using suggestFn (and favorites) -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">suggestFn</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>mobile: true, suggestFn: (searchText, filter) =&gt; any[], favoriteItems: any[]</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                  [favoriteItems]=\"_favoriteItems\"\n                  [mobile]=\"true\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-1]'\"\n                  [required]=\"true\"\n                  placeholder=\"Suggest field\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n\n          <!-- Far items (not in the first page) -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Entity far in the list (not in first page)</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre style=\"white-space: normal !important\">\n                        value: {{ stringify(form.controls.farEntity.value) }}</pre\n                      >\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"farEntity\"\n                  #farEntityField\n                  [config]=\"autocompleteFields.get('entity-far')\"\n                  [favoriteItems]=\"_favoriteFarItems\"\n                  [mobile]=\"true\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-far]'\"\n                  [debug]=\"true\"\n                  [required]=\"true\"\n                  [clearable]=\"true\"\n                  placeholder=\"Far item (in the list)\"\n                >\n                  <ion-icon matPrefix name=\"contract\"></ion-icon>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Items is an Observable</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>mobile: true, items: Observable&lt;any[]&gt;</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-$items')\"\n                  [placeholder]=\"'Item from observable'\"\n                  [mobile]=\"true\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-observable]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">showAllOnFocus + required + NO searchbar</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>mobile: true, showSearchBar: false, showAllOnFocus: true, required: true</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-$items')\"\n                  [mobile]=\"true\"\n                  [equals]=\"equals\"\n                  showSearchBar=\"false\"\n                  showAllOnFocus=\"true\"\n                  [logPrefix]=\"'[combo-mobile-no-searchbar]'\"\n                  [required]=\"true\"\n                  placeholder=\"No search bar\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Control value if missing in items</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>mobile: true, items: Observable&lt;any[]&gt;</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"missingEntity\"\n                  [config]=\"autocompleteFields.get('entity-$items')\"\n                  [mobile]=\"true\"\n                  [equals]=\"equals\"\n                  [clearable]=\"true\"\n                  [logPrefix]=\"'[combo-mobile-2]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">search with a suggestLengthThreshold</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>\n                          suggest: (value, filter) => LoadResult&lt;any&gt;\n                          suggestLengthThreshold: '3'</pre\n                      >\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"emptyEntity\"\n                  [config]=\"autocompleteFields.get('entity-items-filter')\"\n                  [placeholder]=\"'Entity'\"\n                  [mobile]=\"true\"\n                  [equals]=\"equals\"\n                  [suggestLengthThreshold]=\"3\"\n                  [logPrefix]=\"'[combo-mobile-suggestLengthThreshold]'\"\n                  [required]=\"true\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Multiple value</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small><pre>multiple: true</pre></small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entities\"\n                  [config]=\"autocompleteFields.get('entities-items-filter')\"\n                  [placeholder]=\"'Multiple'\"\n                  [mobile]=\"true\"\n                  [multiple]=\"true\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-multiple]'\"\n                  [debug]=\"true\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disabled control</ion-label>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"disableEntity\"\n                  [config]=\"autocompleteFields.get('entity-$items')\"\n                  [mobile]=\"true\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-2]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">In modal</ion-label>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-button (click)=\"ionModal.present()\">Open modal</ion-button>\n                <ion-modal>\n                  <ng-template>\n                    <ion-header>\n                      <ion-toolbar>\n                        <ion-title>Modal with embed auto complete field</ion-title>\n                        <ion-buttons slot=\"end\">\n                          <ion-button (click)=\"ionModal.dismiss()\">Close</ion-button>\n                        </ion-buttons>\n                      </ion-toolbar>\n                    </ion-header>\n                    <ion-content class=\"ion-padding\">\n                      <div class=\"form-container\">\n                        <ion-card>\n                          <ion-card-content>\n                            <mat-autocomplete-field\n                              formControlName=\"entity\"\n                              [tabindex]=\"10000\"\n                              [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                              [mobile]=\"true\"\n                              [equals]=\"equals\"\n                              [logPrefix]=\"'[combo-mobile-modal]'\"\n                              [required]=\"true\"\n                              placeholder=\"Suggest field\"\n                            ></mat-autocomplete-field>\n                          </ion-card-content>\n                        </ion-card>\n                        <ion-card>\n                          <ion-card-content>\n                            <mat-autocomplete-field\n                              formControlName=\"entity\"\n                              [tabindex]=\"10000\"\n                              [config]=\"autocompleteFields.get('entity-items-filter')\"\n                              [mobile]=\"true\"\n                              [equals]=\"equals\"\n                              [suggestLengthThreshold]=\"3\"\n                              [logPrefix]=\"'[combo-mobile-modal-suggestLengthThreshold]'\"\n                              [required]=\"true\"\n                              placeholder=\"Suggest field\"\n                            ></mat-autocomplete-field>\n                          </ion-card-content>\n                        </ion-card>\n                      </div>\n                    </ion-content>\n                  </ng-template>\n                </ion-modal>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col size=\"9\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Change filter</ion-label>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre></pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid class=\"ion-no-padding\">\n                  <ion-row>\n                    <ion-col>\n                      <ion-button (click)=\"updateFilter(filterChangeField, 'entity-items-filter')\">\n                        Filter on: {{ autocompleteFields.get('entity-items-filter').filter?.searchAttribute }}\n                      </ion-button>\n                    </ion-col>\n                    <ion-col>\n                      <mat-autocomplete-field\n                        formControlName=\"entity\"\n                        #filterChangeField\n                        [config]=\"autocompleteFields.get('entity-items-filter')\"\n                        [mobile]=\"true\"\n                        [equals]=\"equals\"\n                        [logPrefix]=\"'[combo-mobile-filter]'\"\n                      ></mat-autocomplete-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col size=\"3\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Large combo</ion-label>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre>\nmobile: true\npanelWidth=\"500px\"</pre\n                        >\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-items-large')\"\n                  [mobile]=\"true\"\n                  [panelWidth]=\"'500px'\"\n                  [matAutocompletePosition]=\"'auto'\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-large]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n\n          <ion-col size=\"3\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Fit content combo</ion-label>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre>\nmobile: true\npanelClass=\"mat-select-panel-fit-content\"</pre\n                        >\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-items-large')\"\n                  [mobile]=\"true\"\n                  [matAutocompletePosition]=\"'auto'\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-panelClass]'\"\n                  panelClass=\"mat-select-panel-fit-content\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Readonly toggle</ion-text>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox\n                        (change)=\"readonlyField.readonly = $event.checked\"\n                        [checked]=\"readonlyField.readonly\"\n                      >\n                        Readonly ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showIcons [checked]=\"false\">Icons ?</mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showHint [checked]=\"false\">Hint ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-autocomplete-field\n                        #readonlyField\n                        formControlName=\"entity\"\n                        [config]=\"autocompleteFields.get('entity-items')\"\n                        [placeholder]=\"'Entity'\"\n                        [mobile]=\"true\"\n                        [equals]=\"equals\"\n                        [logPrefix]=\"'[combo-mobile-readonly]'\"\n                        [readonly]=\"true\"\n                        [clearable]=\"!readonlyField.readonly\"\n                      >\n                        @if (showIcons.checked) {\n                          <mat-icon matPrefix>keyboard_arrow_right</mat-icon>\n                        }\n                        @if (showIcons.checked) {\n                          <mat-icon matSuffix>keyboard_arrow_left</mat-icon>\n                        }\n                        @if (showHint.checked) {\n                          <mat-hint matHint>Some hint</mat-hint>\n                        }\n                      </mat-autocomplete-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Full size panel</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>panelClass: 'full-size'</pre>\n                      or\n                      <pre>panelWidth: '100vw'</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-items-large')\"\n                  [mobile]=\"true\"\n                  panelClass=\"full-size\"\n                  panelWidth=\"100vw\"\n                  [matAutocompletePosition]=\"'above'\"\n                  [logPrefix]=\"'[combo-mobile-full-size]'\"\n                  [debug]=\"true\"\n                  [showAllOnFocus]=\"true\"\n                  [showPanelOnFocus]=\"true\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Autocomplete with button</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre style=\"white-space: normal !important\">\n                        value: {{ stringify(form.controls.withButton.value) }}</pre\n                      >\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"withButton\"\n                  [config]=\"autocompleteFields.get('entity-with-button')\"\n                  [mobile]=\"true\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-mobile-with-button]'\"\n                  [debug]=\"true\"\n                  [required]=\"true\"\n                  [clearable]=\"true\"\n                  placeholder=\"With button\"\n                >\n                  <button matAfter type=\"button\" mat-icon-button tabindex=\"-1\" title=\"Filter\" [color]=\"'primary'\">\n                    <mat-icon>filter_list_alt</mat-icon>\n                  </button>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n\n    <!-- Desktop mode -->\n    @if (mode === 'desktop') {\n      <ion-grid>\n        <ion-row>\n          <!-- Using suggestFn (and favorites) -->\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">suggestFn</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>\nshowAllOnFocus=true, suggestFn: (searchText, filter) => LoadResult&lt;any&gt;, favoriteItems: any[]\n                      </pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                  [favoriteItems]=\"_favoriteItems\"\n                  [mobile]=\"false\"\n                  [equals]=\"equals\"\n                  [clearable]=\"true\"\n                  [logPrefix]=\"'[combo-desktop-suggest]'\"\n                  placeholder=\"Suggest field\"\n                  [debug]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"contract\"></ion-icon>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n\n          <!-- Using service -->\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Service</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small><pre>Service with suggest: (searchText, filter) => LoadResult&lt;any&gt;</pre></small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entity-items-filter')\"\n                  [placeholder]=\"'Filtered field'\"\n                  [mobile]=\"false\"\n                  [equals]=\"equals\"\n                  [clearable]=\"true\"\n                  [logPrefix]=\"'[combo-desktop-service]'\"\n                  [debug]=\"true\"\n                >\n                  <ion-icon matPrefix name=\"contract\"></ion-icon>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">search with a suggestLengthThreshold</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>\n                            suggest: (value, filter) => LoadResult&lt;any&gt;\n                            suggestLengthThreshold: '3'</pre\n                      >\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"emptyEntity\"\n                  [config]=\"autocompleteFields.get('entity-items-filter')\"\n                  [placeholder]=\"'Filtered field'\"\n                  [mobile]=\"false\"\n                  [equals]=\"equals\"\n                  [suggestLengthThreshold]=\"3\"\n                  [logPrefix]=\"'[combo-desktop-suggestLengthThreshold]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Items is an array</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>items: [], value: {{ stringify(form.controls.entity.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [placeholder]=\"'Item from array'\"\n                  [config]=\"autocompleteFields.get('entity-items')\"\n                  [logPrefix]=\"'[combo-desktop-array-1]'\"\n                  [equals]=\"equals\"\n                  [mobile]=\"false\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Items is an Observable</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>items: Observable&lt;any[]&gt;</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [placeholder]=\"'Item from observable'\"\n                  [config]=\"autocompleteFields.get('entity-$items')\"\n                  [logPrefix]=\"'[combo-desktop-2]'\"\n                  [equals]=\"equals\"\n                  [mobile]=\"false\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Multiple value</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small><pre>multiple: true</pre></small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entities\"\n                  [config]=\"autocompleteFields.get('entities-items-filter')\"\n                  [placeholder]=\"'Multiple'\"\n                  [mobile]=\"false\"\n                  [multiple]=\"true\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-desktop-multiple]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Hide Header & ooter</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small><pre>showPanelHeader: false</pre></small>\n                    <small><pre>showPanelFooter: false</pre></small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entities-items-filter')\"\n                  [placeholder]=\"'Header'\"\n                  [mobile]=\"false\"\n                  [multiple]=\"false\"\n                  [equals]=\"equals\"\n                  [showPanelHeader]=\"false\"\n                  [showPanelFooter]=\"false\"\n                  [logPrefix]=\"'[combo-desktop-no-header]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Custom Header & Footer</ion-text>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small><pre>ng-template panelHeader</pre></small>\n                    <small><pre>ng-template panelFooter</pre></small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [config]=\"autocompleteFields.get('entities-items-filter')\"\n                  [placeholder]=\"'Header'\"\n                  [mobile]=\"false\"\n                  [multiple]=\"false\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-desktop-custom-header]'\"\n                  style=\"--header-column-top: 30px; --footer-bottom: 20px;\"\n                >\n                  <ng-template panelHeader let-itemCount=\"itemCount\">\n                    <ion-row\n                      class=\"mat-autocomplete-header sticky custom-header\"\n                      (mousedown)=\"$event.preventDefault()\"\n                    >\n                      <ion-col class=\"ion-padding-end\">\n                        @if (itemCount; as count) {\n                          <ion-text class=\"ion-float-start\">\n                            <i>{{ 'COMMON.RESULT_COUNT' | translate: { count: count } }}</i>\n                          </ion-text>\n                        }\n                        <div class=\"ion-float-end div-toggle\">\n                          <span>Custom Header</span>\n\n                          <mat-slide-toggle\n                            class=\"autocomplete-toggle\"\n                            labelPosition=\"before\"\n                            [hideIcon]=\"true\"\n                          ></mat-slide-toggle>\n                        </div>\n                      </ion-col>\n                    </ion-row>\n                  </ng-template>\n                  <ng-template panelFooter>\n                    <ion-row class=\"mat-autocomplete-footer sticky custom-footer\">\n                      <ion-col>Custom Footer</ion-col>\n                    </ion-row>\n                  </ng-template>\n                </mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Control value if missing in items</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>items: Observable&lt;any[]&gt;</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"missingEntity\"\n                  [placeholder]=\"'Missing item'\"\n                  [config]=\"autocompleteFields.get('entity-$items')\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-desktop-missing]'\"\n                  [mobile]=\"false\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Full size panel</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>panelClass: 'full-size'</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [placeholder]=\"'Full size panel'\"\n                  [config]=\"autocompleteFields.get('entity-items-large')\"\n                  [mobile]=\"false\"\n                  [panelClass]=\"'full-size'\"\n                  [matAutocompletePosition]=\"'above'\"\n                  [logPrefix]=\"'[combo-desktop-full-size]'\"\n                  [debug]=\"true\"\n                  [showAllOnFocus]=\"true\"\n                  [showPanelOnFocus]=\"true\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disabled control</ion-label>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"disableEntity\"\n                  [placeholder]=\"'Disable field'\"\n                  [config]=\"autocompleteFields.get('entity-$items')\"\n                  [mobile]=\"false\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-desktop-disable]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Readonly control</ion-label>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [placeholder]=\"'Readonly field'\"\n                  [config]=\"autocompleteFields.get('entity-$items')\"\n                  [mobile]=\"false\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-desktop-readonly]'\"\n                  [readonly]=\"true\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col size=\"9\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Full size combo</ion-label>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre>panelClass: 'full-size'</pre>\n                        or\n                        <pre>panelWidth: '100vw'</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [placeholder]=\"'Full size panel'\"\n                  [config]=\"autocompleteFields.get('entity-items-large')\"\n                  [mobile]=\"false\"\n                  panelClass=\"full-size\"\n                  panelWidth=\"100vw\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-desktop-full-size]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col size=\"3\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Large combo</ion-label>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre>panelWidth: string</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [placeholder]=\"'Fixed panel width (500px)'\"\n                  [config]=\"autocompleteFields.get('entity-items-large')\"\n                  [mobile]=\"false\"\n                  panelWidth=\"500px\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-desktop-large]'\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col size=\"3\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Fit content</ion-label>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre>panelClass=\"mat-select-panel-fit-content\"</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-autocomplete-field\n                  formControlName=\"entity\"\n                  [placeholder]=\"'Fit content'\"\n                  [config]=\"autocompleteFields.get('entity-items-large')\"\n                  [mobile]=\"false\"\n                  [equals]=\"equals\"\n                  [logPrefix]=\"'[combo-desktop-panelClass]'\"\n                  panelClass=\"mat-select-panel-fit-content\"\n                ></mat-autocomplete-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <ion-col size=\"6\">\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-text color=\"primary\">Readonly toggle</ion-text>\n                </ion-card-title>\n              </ion-card-header>\n              <ion-card-content>\n                <ion-grid>\n                  <ion-row>\n                    <ion-col size=\"4\">\n                      <mat-checkbox\n                        (change)=\"readonlyField.readonly = $event.checked\"\n                        [checked]=\"readonlyField.readonly\"\n                      >\n                        Readonly ?\n                      </mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showIcons2 [checked]=\"false\">Icons ?</mat-checkbox>\n                    </ion-col>\n                    <ion-col size=\"4\">\n                      <mat-checkbox #showHint2 [checked]=\"false\">Hint ?</mat-checkbox>\n                    </ion-col>\n                  </ion-row>\n                  <ion-row>\n                    <ion-col>\n                      <mat-autocomplete-field\n                        #readonlyField\n                        formControlName=\"entity\"\n                        [config]=\"autocompleteFields.get('entity-items-filter')\"\n                        [placeholder]=\"'Filtered field'\"\n                        [mobile]=\"false\"\n                        [equals]=\"equals\"\n                        [logPrefix]=\"'[combo-desktop-readonly]'\"\n                        [readonly]=\"true\"\n                        [clearable]=\"!readonlyField.readonly\"\n                      >\n                        @if (showIcons2.checked) {\n                          <mat-icon matPrefix>keyboard_arrow_right</mat-icon>\n                        }\n                        @if (showIcons2.checked) {\n                          <mat-icon matSuffix>keyboard_arrow_left</mat-icon>\n                        }\n                        @if (showHint2.checked) {\n                          <mat-hint>Some hint</mat-hint>\n                        }\n                      </mat-autocomplete-field>\n                    </ion-col>\n                  </ion-row>\n                </ion-grid>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n  </form>\n</ion-content>\n","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { SharedValidators } from '../../../validator/validators';\nimport { GeolocationUtils } from '../../../geolocation/geolocation.utils';\nimport { PlatformService } from '../../../../core/services/platform.service';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\nimport { MatCheckboxChange } from '@angular/material/checkbox';\nimport { LatLongPattern, LatLongSign } from '../latlong.utils';\n\n@Component({\n  selector: 'app-latlong-test',\n  templateUrl: './latlong.test.html',\n})\nexport class LatLongTestPage implements OnInit {\n  form: UntypedFormGroup;\n\n  geoPositionMessage: string;\n\n  protected testUpdateDefaultSign: LatLongSign;\n\n  mode: 'mobile' | 'desktop' | 'dev' | 'temp' = 'mobile';\n  selectedFormat: LatLongPattern = 'DDMM';\n  appearance: MatFormFieldAppearance = 'fill';\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected platform: PlatformService\n  ) {\n    this.form = formBuilder.group({\n      empty: formBuilder.group({\n        latitude: [null, SharedValidators.latitude],\n        longitude: [null, SharedValidators.longitude],\n      }),\n      emptyRequired: formBuilder.group({\n        latitude: [null, Validators.compose([Validators.required, SharedValidators.latitude])],\n        longitude: [null, Validators.compose([Validators.required, SharedValidators.longitude])],\n      }),\n      notRequired: formBuilder.group({\n        latitude: [null, SharedValidators.latitude],\n        longitude: [null, SharedValidators.latitude],\n      }),\n      enable: formBuilder.group({\n        latitude: [null, SharedValidators.latitude],\n        longitude: [null, SharedValidators.longitude],\n      }),\n      disable: formBuilder.group({\n        latitude: [null, SharedValidators.latitude],\n        longitude: [null, SharedValidators.longitude],\n      }),\n    });\n\n    const disableFormGroup = this.form.get('disable');\n    disableFormGroup.disable();\n\n    // Copy enable value to disable form\n    this.form.get('enable').valueChanges.subscribe((value) => disableFormGroup.setValue(value));\n  }\n\n  ngOnInit() {\n    setTimeout(() => this.loadData(), 250);\n  }\n\n  toggleMode(value) {\n    if (this.mode !== value) {\n      this.mode = value;\n    }\n    setTimeout(() => this.loadData(), 250);\n  }\n\n  // Load the form with data\n  async loadData() {\n    const data = {\n      empty: {\n        latitude: null,\n        longitude: null,\n      },\n      emptyRequired: {\n        latitude: null,\n        longitude: null,\n      },\n      notRequired: {\n        latitude: null,\n        longitude: null,\n      },\n      enable: {\n        latitude: 50.1,\n        longitude: -2,\n      },\n      disable: {\n        latitude: 50.1,\n        longitude: -2,\n      },\n    };\n\n    this.form.setValue(data);\n  }\n\n  doSubmit(event: Event) {\n    console.debug('Validate form: ', this.form.value);\n  }\n\n  async geoPosition(event: Event, controlName?: string) {\n    console.debug('Click on geoLocation button', event);\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    let logMessage: string;\n    const now = Date.now();\n\n    try {\n      const position = await GeolocationUtils.getCurrentPosition(this.platform, {\n        maximumAge: 80000 /*80s*/,\n        timeout: 40000 /*40s*/,\n        enableHighAccuracy: false,\n      });\n\n      this.form.get(controlName || 'empty').patchValue(position);\n\n      logMessage = `INFO (geolocation): OK in ${Date.now() - now}ms`;\n    } catch (err) {\n      logMessage = err?.message || err;\n      const duration = Date.now() - now;\n      if (typeof logMessage === 'object') {\n        logMessage = JSON.stringify(logMessage);\n      }\n      logMessage = `ERROR (geolocation): ${logMessage} - after ${duration}ms`;\n    }\n\n    this.geoPositionMessage = logMessage;\n\n    // Clean the log message, if same\n    setTimeout(() => {\n      if (this.geoPositionMessage === logMessage) {\n        this.geoPositionMessage = null;\n      }\n    }, 5000);\n  }\n\n  toggleAppearance(event: MatCheckboxChange) {\n    this.appearance = event.checked ? 'outline' : 'fill';\n  }\n\n  stringify = JSON.stringify;\n\n  /* -- protected methods -- */\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Lat/Long field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <!-- Tab nav - desktop mode -->\n  <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n    <a mat-tab-link [active]=\"mode === 'mobile'\" (click)=\"toggleMode('mobile')\">\n      <mat-label>Mobile</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n      <mat-label>Desktop</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'dev'\" (click)=\"toggleMode('dev')\">\n      <mat-label>Dev</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n      <mat-label>Temporary</mat-label>\n    </a>\n  </nav>\n\n  <form #tabPanel class=\"form-container ion-padding\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    @if (mode === 'mobile') {\n      <ng-container *ngTemplateOutlet=\"mainTest; context: { mobile: true }\"></ng-container>\n    } @else if (mode === 'desktop') {\n      <ng-container *ngTemplateOutlet=\"mainTest; context: { mobile: false }\"></ng-container>\n    } @else if (mode === 'dev') {\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <ion-button [disabled]=\"testUpdateDefaultSign === '-'\" (click)=\"testUpdateDefaultSign = '-'\">\n              Set default sign to \"-\"\n            </ion-button>\n          </ion-col>\n          <ion-col>\n            <ion-button [disabled]=\"testUpdateDefaultSign === '+'\" (click)=\"testUpdateDefaultSign = '+'\">\n              Set default sign to \"+\"\n            </ion-button>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <mat-checkbox (change)=\"toggleAppearance($event)\">Change apparence</mat-checkbox>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <mat-form-field [appearance]=\"appearance\" [subscriptSizing]=\"'dynamic'\">\n              <mat-label>LatLongFormat</mat-label>\n              <mat-select #selectLatLongFormat [(value)]=\"selectedFormat\">\n                <mat-option value=\"DDMM\" selected>DDMM</mat-option>\n                <mat-option value=\"DDMMSS\">DDMMSS</mat-option>\n                <mat-option value=\"DD\">DD</mat-option>\n              </mat-select>\n            </mat-form-field>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <!-- DDMMSS -->\n          <ion-col>\n            <ng-container\n              *ngTemplateOutlet=\"\n                newComponent;\n                context: {\n                  formGroup: 'empty',\n                  latLongPattern: selectedFormat,\n                  required: false,\n                  defaultSign: testUpdateDefaultSign,\n                }\n              \"\n            ></ng-container>\n          </ion-col>\n          <ion-col>\n            <ng-container\n              *ngTemplateOutlet=\"\n                newComponent;\n                context: {\n                  formGroup: 'enable',\n                  latLongPattern: selectedFormat,\n                  required: true,\n                  defaultSign: testUpdateDefaultSign,\n                }\n              \"\n            ></ng-container>\n          </ion-col>\n          <ion-col>\n            <ng-container\n              *ngTemplateOutlet=\"\n                newComponent;\n                context: {\n                  formGroup: 'disable',\n                  latLongPattern: selectedFormat,\n                  required: true,\n                  defaultSign: testUpdateDefaultSign,\n                }\n              \"\n            ></ng-container>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n\n      <ion-grid></ion-grid>\n    } @else {\n      <!-- Temporay TAB (for DEV) -->\n      <form *ngIf=\"form | formGetGroup: 'enable' as formGroup\" [formGroup]=\"formGroup\">\n        <ion-card>\n          <ion-card-header>\n            <ion-card-title>\n              <ion-label color=\"primary\">Required</ion-label>\n            </ion-card-title>\n            <ion-card-subtitle>\n              <ion-text color=\"medium\">\n                <small>\n                  <pre>formGroup.value: {{ formGroup.value | json }}</pre>\n                </small>\n              </ion-text>\n            </ion-card-subtitle>\n          </ion-card-header>\n          <ion-card-content>\n            <ion-grid class=\"ion-no-padding\">\n              <ion-row>\n                <ion-col>\n                  <mat-latlong-field\n                    formControlName=\"latitude\"\n                    type=\"latitude\"\n                    latLongPattern=\"DDMMSS\"\n                    placeholder=\"Latitude\"\n                    [appearance]=\"appearance\"\n                    [required]=\"true\"\n                    [clearable]=\"true\"\n                  >\n                    <mat-icon matPrefix>room</mat-icon>\n                    <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n                      <mat-icon>gps_fixed</mat-icon>\n                    </button>\n                  </mat-latlong-field>\n                </ion-col>\n                <ion-col>\n                  <mat-latlong-field\n                    formControlName=\"longitude\"\n                    type=\"longitude\"\n                    latLongPattern=\"DDMMSS\"\n                    placeholder=\"Longitude\"\n                    [appearance]=\"appearance\"\n                    [required]=\"true\"\n                    [clearable]=\"true\"\n                  >\n                    <mat-icon matPrefix>room</mat-icon>\n                    <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                      <mat-icon>gps_fixed</mat-icon>\n                    </button>\n                  </mat-latlong-field>\n                </ion-col>\n              </ion-row>\n              <ion-row *ngIf=\"geoPositionMessage\">\n                <ion-col>{{ geoPositionMessage }}</ion-col>\n              </ion-row>\n            </ion-grid>\n          </ion-card-content>\n        </ion-card>\n      </form>\n    }\n  </form>\n</ion-content>\n\n<ng-template #mainTest let-mobile=\"mobile\">\n  <!-- Empty value -->\n  <form *ngIf=\"form | formGetGroup: 'empty' as formGroup\" [formGroup]=\"formGroup\">\n    <ion-grid>\n      <ion-row>\n        <ion-col>\n          <mat-checkbox (change)=\"toggleAppearance($event)\">Change apparence</mat-checkbox>\n        </ion-col>\n      </ion-row>\n\n      <ion-row>\n        <ion-col>\n          <ion-text><h4>Empty, with defaults</h4></ion-text>\n        </ion-col>\n      </ion-row>\n\n      <ion-row>\n        <!-- DD Default sign -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DD, defaultSign '-'</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DD\"\n                      defaultSign=\"-\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DD\"\n                      defaultSign=\"-\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n                <ion-row *ngIf=\"geoPositionMessage\">\n                  <ion-col>{{ geoPositionMessage }}</ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- DDMM Default sign -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DDMM, defaultSign '+'</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DDMM\"\n                      defaultSign=\"+\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DDMM\"\n                      defaultSign=\"+\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- DDMMSS Default sign -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DDMMSS, defaultSign '+'</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DDMMSS\"\n                      defaultSign=\"+\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DDMMSS\"\n                      defaultSign=\"+\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n\n  <!-- Empty value -->\n  <form *ngIf=\"form | formGetGroup: 'emptyRequired' as formGroup\" [formGroup]=\"formGroup\">\n    <ion-grid>\n      <ion-row>\n        <ion-col>\n          <ion-text><h4>Empty, required (no defaults)</h4></ion-text>\n        </ion-col>\n      </ion-row>\n\n      <ion-row>\n        <!-- DD -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DD, required</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DD\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"true\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DD\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"true\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n                <ion-row *ngIf=\"geoPositionMessage\">\n                  <ion-col>{{ geoPositionMessage }}</ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- DDMM  -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DDMM, required</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"true\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"true\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n  <form *ngIf=\"form | formGetGroup: 'notRequired' as formGroup\" [formGroup]=\"formGroup\">\n    <ion-grid>\n      <!-- With value -->\n      <ion-row>\n        <ion-col>\n          <ion-text><h4>Empty, not required</h4></ion-text>\n        </ion-col>\n      </ion-row>\n      <ion-row>\n        <!-- DD -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DD, not required</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DD\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"false\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DD\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"false\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n                <ion-row *ngIf=\"geoPositionMessage\">\n                  <ion-col>{{ geoPositionMessage }}</ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- DDMM -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DDMM, not required</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"false\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"false\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n                <ion-row *ngIf=\"geoPositionMessage\">\n                  <ion-col>{{ geoPositionMessage }}</ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n  <form *ngIf=\"form | formGetGroup: 'enable' as formGroup\" [formGroup]=\"formGroup\">\n    <ion-grid>\n      <!-- With value -->\n      <ion-row>\n        <ion-col>\n          <ion-text><h4>With value</h4></ion-text>\n        </ion-col>\n      </ion-row>\n\n      <ion-row>\n        <!-- DD -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DD</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DD\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    ></mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DD\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    ></mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- DDMMSS -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DDMM</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    ></mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    ></mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- DDMMSS -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Format DDMMSS</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DDMMSS\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    ></mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DDMMSS\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    ></mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n\n  <!-- Disable  -->\n  <form *ngIf=\"form | formGetGroup: 'disable' as formGroup\" [formGroup]=\"formGroup\">\n    <ion-grid>\n      <ion-row>\n        <ion-col>\n          <ion-text><h4>Disabled control</h4></ion-text>\n        </ion-col>\n      </ion-row>\n      <ion-row>\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Disabled control</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(formGroup.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"latitude\"\n                      type=\"latitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Latitude\"\n                      [appearance]=\"appearance\"\n                      [required]=\"false\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <mat-icon matSuffix>gps_fixed</mat-icon>\n                    </mat-latlong-field>\n                  </ion-col>\n                  <ion-col>\n                    <mat-latlong-field\n                      formControlName=\"longitude\"\n                      type=\"longitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Longitude\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <button type=\"button\" mat-icon-button matSuffix (click)=\"geoPosition($event)\">\n                        <mat-icon>gps_fixed</mat-icon>\n                      </button>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Readonly (control is enable)</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-checkbox\n                (change)=\"readonlyField.readonly = $event.checked\"\n                [checked]=\"readonlyField.readonly\"\n              ></mat-checkbox>\n\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-latlong-field\n                      #readonlyField\n                      [formControl]=\"form | formGetControl: 'enable.latitude'\"\n                      type=\"latitude\"\n                      latLongPattern=\"DDMM\"\n                      placeholder=\"Latitude\"\n                      [readonly]=\"true\"\n                      [appearance]=\"appearance\"\n                      [mobile]=\"mobile\"\n                    >\n                      <mat-icon matPrefix>room</mat-icon>\n                      <mat-icon matSuffix>gps_fixed</mat-icon>\n                    </mat-latlong-field>\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">With hint</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-latlong-field\n                #readonlyField\n                [formControl]=\"form | formGetControl: 'enable.latitude'\"\n                type=\"latitude\"\n                latLongPattern=\"DDMM\"\n                placeholder=\"Latitude\"\n                [appearance]=\"appearance\"\n                [mobile]=\"mobile\"\n              >\n                <mat-hint align=\"end\">This is a long long hint</mat-hint>\n              </mat-latlong-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n</ng-template>\n\n<ng-template\n  #newComponent\n  let-formGroupName=\"formGroup\"\n  let-pattern=\"latLongPattern\"\n  let-required=\"required\"\n  let-defaultSign=\"defaultSign\"\n>\n  <form *ngIf=\"form | formGetGroup: formGroupName as formGroup\" [formGroup]=\"formGroup\">\n    <ion-card>\n      <ion-card-header>\n        <ion-card-title>\n          <ion-label color=\"primary\">{{ formGroupName }}</ion-label>\n        </ion-card-title>\n        <ion-card-subtitle>\n          <ion-grid class=\"ion-no-padding\">\n            <ion-row class=\"ion-no-padding\">\n              <ion-col class=\"ion-no-padding\">\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ formGroup.value | json }}</pre>\n                    <pre>invalid ? : {{ (formGroup | formGetControl: 'latitude').invalid }}</pre>\n                    <pre>touched ? : {{ (formGroup | formGetControl: 'latitude').touched }}</pre>\n                    <pre>errors : {{ formGroup | formGetGroup: 'latitude' | formError }}</pre>\n                    <pre>defaultSign : {{ defaultSign }}</pre>\n                  </small>\n                </ion-text>\n              </ion-col>\n            </ion-row>\n            <ion-row class=\"ion-no-padding\">\n              <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n                <mat-latlong-field\n                  formControlName=\"latitude\"\n                  type=\"latitude\"\n                  [readonly]=\"true\"\n                  [latLongPattern]=\"pattern\"\n                  [defaultSign]=\"defaultSign\"\n                  placeholder=\"Latitude\"\n                  [appearance]=\"appearance\"\n                ></mat-latlong-field>\n              </ion-col>\n              <ion-col sizeLg=\"6\">\n                <mat-latlong-field\n                  formControlName=\"longitude\"\n                  type=\"longitude\"\n                  [readonly]=\"true\"\n                  [latLongPattern]=\"pattern\"\n                  [defaultSign]=\"defaultSign\"\n                  placeholder=\"Longitude\"\n                  [appearance]=\"appearance\"\n                ></mat-latlong-field>\n              </ion-col>\n            </ion-row>\n          </ion-grid>\n        </ion-card-subtitle>\n      </ion-card-header>\n      <ion-card-content>\n        <ion-grid class=\"ion-no-padding\">\n          <ion-row>\n            <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n              <mat-latlong-field\n                formControlName=\"latitude\"\n                type=\"latitude\"\n                [latLongPattern]=\"pattern\"\n                [defaultSign]=\"defaultSign\"\n                placeholder=\"Latitude\"\n                [appearance]=\"appearance\"\n                [required]=\"required\"\n              >\n                <mat-icon matPrefix>room</mat-icon>\n                <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n                  <mat-icon>gps_fixed</mat-icon>\n                </button>\n              </mat-latlong-field>\n            </ion-col>\n            <ion-col class=\"ion-no-padding\" sizeLg=\"6\">\n              <mat-latlong-field\n                formControlName=\"longitude\"\n                type=\"longitude\"\n                [latLongPattern]=\"pattern\"\n                [defaultSign]=\"defaultSign\"\n                placeholder=\"Longitude\"\n                [appearance]=\"appearance\"\n                [required]=\"required\"\n              >\n                <mat-icon matPrefix>room</mat-icon>\n                <button matSuffix mat-icon-button (click)=\"geoPosition($event)\">\n                  <mat-icon>gps_fixed</mat-icon>\n                </button>\n              </mat-latlong-field>\n            </ion-col>\n          </ion-row>\n          <ion-row *ngIf=\"geoPositionMessage\">\n            <ion-col>{{ geoPositionMessage }}</ion-col>\n          </ion-row>\n        </ion-grid>\n      </ion-card-content>\n    </ion-card>\n  </form>\n</ng-template>\n","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { SharedValidators } from '../../../validator/validators';\nimport { BehaviorSubject } from 'rxjs';\nimport { Moment } from 'moment';\nimport { DateFormatService } from '../../../pipes/date-format.pipe';\nimport { distinctUntilChanged } from 'rxjs/operators';\nimport { DateUtils } from '../../../dates';\nimport { DisplayFn } from '../../../types';\n\n@Component({\n  selector: 'app-swipe-test',\n  templateUrl: './swipe.test.html',\n})\nexport class SwipeTestPage implements OnInit {\n  form: UntypedFormGroup;\n\n  $dates = new BehaviorSubject<Moment[]>(undefined);\n  private _today = DateUtils.moment().startOf('day');\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected dateFormat: DateFormatService\n  ) {\n    this.form = formBuilder.group({\n      empty: [null, Validators.required],\n      date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],\n      disabledEmpty: [null, Validators.required],\n      disabledDate: [null, Validators.required],\n    });\n\n    this.form.get('disabledEmpty').disable();\n    this.form.get('disabledDate').disable();\n  }\n\n  ngOnInit() {\n    const dates: Moment[] = [];\n    for (let d = 0; d < 7; d++) {\n      dates[d] = DateUtils.moment(this._today).add(d - 3, 'day');\n    }\n    this.$dates.next(dates);\n\n    this.loadData();\n    //setTimeout(() => this.loadData(), 1500);\n\n    this.form.valueChanges.pipe(distinctUntilChanged()).subscribe(() => console.debug(this.form.value));\n  }\n\n  // Load the form with data\n  async loadData() {\n    const data = {\n      empty: null,\n      date: this._today,\n      disabledEmpty: null,\n      disabledDate: this._today,\n    };\n\n    this.form.patchValue(data);\n  }\n\n  doSubmit(event?: Event) {\n    console.debug('Validate form: ', this.form.value);\n  }\n\n  /* -- protected methods -- */\n\n  displayDate(): DisplayFn {\n    return (obj: any) => this.dateFormat.transform(obj, { pattern: 'dddd L' }).toString();\n  }\n\n  compareDate() {\n    return (d1: Moment, d2: Moment) => (d1 && d2 && d1.isSame(d2)) || false;\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Swipe test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <h1>Swipe page:</h1>\n\n  <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    <ion-grid>\n      <ion-row>\n        <!-- empty -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Empty</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-swipe-field\n                formControlName=\"empty\"\n                placeholder=\"placeholder\"\n                [items]=\"$dates\"\n                [displayWith]=\"displayDate()\"\n                [equals]=\"compareDate()\"\n                [tabindex]=\"1\"\n                [debug]=\"true\"\n              ></mat-swipe-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- date -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Date</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-swipe-field\n                formControlName=\"date\"\n                placeholder=\"placeholder\"\n                [items]=\"$dates\"\n                [displayWith]=\"displayDate()\"\n                [equals]=\"compareDate()\"\n                [clearable]=\"true\"\n                [tabindex]=\"2\"\n                [debug]=\"true\"\n              ></mat-swipe-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n\n      <ion-row>\n        <!-- disable -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Disabled empty</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-swipe-field\n                formControlName=\"disabledEmpty\"\n                placeholder=\"placeholder\"\n                [items]=\"$dates\"\n                [displayWith]=\"displayDate()\"\n                [equals]=\"compareDate()\"\n                [clearable]=\"true\"\n                [tabindex]=\"3\"\n                [debug]=\"true\"\n              ></mat-swipe-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!--         read-only-->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Disabled with date</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-swipe-field\n                formControlName=\"disabledDate\"\n                placeholder=\"placeholder\"\n                [items]=\"$dates\"\n                [displayWith]=\"displayDate()\"\n                [equals]=\"compareDate()\"\n                [clearable]=\"true\"\n                [tabindex]=\"4\"\n                [debug]=\"true\"\n              ></mat-swipe-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n</ion-content>\n","import { Component, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { BehaviorSubject } from 'rxjs';\nimport { SharedValidators } from '../../../validator/validators';\nimport { isNil, isNotNil, sleep } from '../../../functions';\nimport { LoadResult } from '../../../services/entity-service.class';\nimport { EntityUtils } from '../../../../core/services/model/entity.model';\nimport { suggestFromArray } from '../../../services';\nimport { MatAutocompleteConfigHolder } from '../../autocomplete/material.autocomplete.config';\nimport { MatFormFieldAppearance } from '@angular/material/form-field';\n\nclass EntityTestClass {\n  id: number;\n  label: string;\n  name: string;\n}\n\nconst FAKE_ENTITIES: EntityTestClass[] = [\n  { id: 1, label: 'AAA', name: 'Item A' },\n  { id: 2, label: 'BBB', name: 'Item B' },\n  { id: 3, label: 'CCC', name: 'Item C' },\n  { id: 4, label: 'DDD', name: 'Item D' },\n  { id: 5, label: 'EEE', name: 'Item E' },\n  { id: 6, label: 'FFF', name: 'Item F' },\n  { id: 7, label: 'GGG', name: 'Item G' },\n];\n\nfunction deepCopy(values?: EntityTestClass[], size?: number): EntityTestClass[] {\n  if (isNil(size)) {\n    return (values || FAKE_ENTITIES).map((entity) => Object.assign({}, entity));\n  }\n\n  let result = [];\n  let i = 1;\n  while (result.length < size) {\n    result = result.concat(\n      (values || FAKE_ENTITIES).map((entity) => {\n        const name = entity.name + ' #' + i;\n        return { ...entity, id: i++, name };\n      })\n    );\n  }\n  return result.slice(0, size);\n}\n\n@Component({\n  selector: 'app-chips-test',\n  templateUrl: './chips.test.html',\n})\nexport class ChipsTestPage implements OnInit {\n  private _items = deepCopy(FAKE_ENTITIES, 100);\n  private _$items = new BehaviorSubject<EntityTestClass[]>(undefined);\n\n  form: UntypedFormGroup;\n  autocompleteFields = new MatAutocompleteConfigHolder();\n  appearance: MatFormFieldAppearance = 'fill';\n  mobile = true;\n\n  constructor(protected formBuilder: UntypedFormBuilder) {\n    this.form = formBuilder.group({\n      entity: [null, SharedValidators.entities],\n      entityInitial: [null, SharedValidators.entities],\n      disableEntity: [null, SharedValidators.entities],\n      farEntity: [null, SharedValidators.entities],\n      requiredEntity: [null, Validators.compose([Validators.required, SharedValidators.entities])],\n    });\n\n    this.form.get('disableEntity').disable();\n  }\n\n  ngOnInit() {\n    // From suggest\n    this.autocompleteFields.add('entity-suggestFn', {\n      suggestFn: (value, filter) => this.suggest(value, filter),\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n      equals: (o1, o2) => EntityUtils.compare(o1, o2, 1, 'id') === 0,\n    });\n\n    // From items\n    this.autocompleteFields.add('entity-items', {\n      items: this._items.slice(),\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n      equals: (o1, o2) => EntityUtils.compare(o1, o2, 1, 'id') === 0,\n    });\n\n    // Far entity, in the list\n    this.autocompleteFields.add('entity-far', {\n      suggestFn: (value, filter) => this.suggest(value, filter),\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n    });\n\n    // From $items observable\n    this.autocompleteFields.add('entity-$items', {\n      items: this._$items,\n      attributes: ['label', 'name'],\n      displayWith: this.entityToString,\n    });\n\n    this.loadData();\n  }\n\n  // Load the form with data\n  async loadData() {\n    const items = deepCopy(FAKE_ENTITIES);\n    const data = {\n      entity: items.slice(0, 1), // Select the first\n      entityInitial: items.slice(1, 2),\n      disableEntity: items.slice(1, 2),\n      farEntity: items[2],\n      requiredEntity: null,\n    };\n\n    this.form.setValue(data);\n\n    // Load observables\n    setTimeout(() => this.loadItems(), 1000);\n  }\n\n  async loadItems() {\n    this._$items.next(this._items.slice());\n  }\n\n  entityToString(item: any) {\n    return [(item && item.label) || undefined, (item && item.name) || undefined].filter(isNotNil).join(' - ');\n  }\n\n  async suggest(value: any, filter?: any): Promise<LoadResult<EntityTestClass>> {\n    filter = { offset: 0, size: 30, ...filter };\n    const res = suggestFromArray(this._items, value, {\n      ...filter,\n      searchAttributes: ['label', 'name'],\n    });\n\n    // Simulate a size = 30\n    const total = res.total || res.data.length;\n\n    const nextOffset = filter.offset + res.data.length;\n    if (nextOffset < total) {\n      filter = { ...filter, offset: nextOffset };\n      return {\n        total,\n        data: res.data,\n        fetchMore: async (variables) => {\n          await sleep(1000); // Simulate access to server\n          return this.suggest(value, { ...filter, ...variables });\n        },\n      };\n    }\n\n    return res;\n  }\n\n  doSubmit(_) {\n    console.debug('Validate form: ', this.form.value);\n  }\n\n  equals(o1: EntityTestClass, o2: EntityTestClass): boolean {\n    return o1 && o2 && o1.id === o2.id;\n  }\n\n  /* -- protected methods -- */\n\n  stringify(value: any) {\n    return JSON.stringify(value);\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Chips field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    <ion-grid>\n      <ion-row>\n        <ion-col size=\"6\">\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-text color=\"primary\">Suggest() function</ion-text>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <pre><small>suggestFn: (searchText, filter) =&gt; any[]</small></pre>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-chips-field\n                      formControlName=\"entity\"\n                      placeholder=\"A chip field\"\n                      [appearance]=\"appearance\"\n                      [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                      [logPrefix]=\"'[mat-chips-empty] '\"\n                      chipColor=\"accent\"\n                      [debug]=\"true\"\n                    ></mat-chips-field>\n                  </ion-col>\n\n                  <ion-col>\n                    <mat-form-field [appearance]=\"appearance\">\n                      <mat-label>Another field</mat-label>\n                      <input matInput type=\"text\" />\n                    </mat-form-field>\n                  </ion-col>\n                </ion-row>\n                <ion-row>\n                  <ion-col>\n                    {{ form.controls.entity.value | json }}\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col size=\"6\">\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-text color=\"primary\">Required</ion-text>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <pre><small>required: true</small></pre>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <ion-grid class=\"ion-no-padding\">\n                <ion-row>\n                  <ion-col>\n                    <mat-chips-field\n                      formControlName=\"requiredEntity\"\n                      placeholder=\"A required chip field\"\n                      [appearance]=\"appearance\"\n                      [config]=\"autocompleteFields.get('entity-items')\"\n                      [logPrefix]=\"'[mat-chips-required] '\"\n                      chipColor=\"accent\"\n                      required\n                      [debug]=\"true\"\n                    ></mat-chips-field>\n                  </ion-col>\n\n                  <ion-col>\n                    <mat-form-field [appearance]=\"appearance\">\n                      <mat-label>Another required field</mat-label>\n                      <input matInput type=\"text\" required />\n                    </mat-form-field>\n                  </ion-col>\n                </ion-row>\n                <ion-row>\n                  <ion-col>\n                    {{ form.controls.entity.value | json }}\n                  </ion-col>\n                </ion-row>\n              </ion-grid>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Suggest() function with initial value</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <pre><small>suggestFn: (searchText, filter) =&gt; any[]</small></pre>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-chips-field\n                formControlName=\"entityInitial\"\n                [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                placeholder=\"A suggestFn field\"\n                [logPrefix]=\"'[mat-chips-initialized] '\"\n                chipColor=\"primary\"\n                [debug]=\"true\"\n              ></mat-chips-field>\n              {{ form.controls.entityInitial.value | json }}\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Disabled control</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-chips-field\n                formControlName=\"disableEntity\"\n                [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                [equals]=\"equals\"\n                placeholder=\"A disabled field\"\n                [logPrefix]=\"'[mat-chips-disabled] '\"\n                chipColor=\"warn\"\n                [debug]=\"true\"\n              ></mat-chips-field>\n              {{ form.controls.disableEntity.value | json }}\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Readonly control</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-chips-field\n                formControlName=\"entity\"\n                [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                [equals]=\"equals\"\n                placeholder=\"A readonly field\"\n                [logPrefix]=\"'[mat-chips-readonly] '\"\n                [readonly]=\"true\"\n              ></mat-chips-field>\n              {{ form.controls.entity?.value | json }}\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Suggest with length threshold</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>\n                          suggest: (value, filter) => LoadResult&lt;any&gt;\n                          suggestLengthThreshold: '3'</pre\n                    >\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-chips-field\n                formControlName=\"entity\"\n                placeholder=\"Entity\"\n                [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                [equals]=\"equals\"\n                [suggestLengthThreshold]=\"3\"\n                [logPrefix]=\"'[mat-chips-suggestLengthThreshold] '\"\n                [debug]=\"true\"\n              ></mat-chips-field>\n              {{ form.controls.entity?.value | json }}\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n      <ion-row>\n        <ion-col size=\"6\">\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Deported chips</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              @for (item of form.controls.entity?.value; track item.id) {\n                <ion-item>\n                  {{ item.name }}\n                  <ion-button slot=\"end\" color=\"danger\" (click)=\"deportedChipsField.remove(item)\">X</ion-button>\n                </ion-item>\n              }\n              <mat-chips-field\n                #deportedChipsField\n                formControlName=\"entity\"\n                [showChips]=\"false\"\n                [config]=\"autocompleteFields.get('entity-suggestFn')\"\n                [equals]=\"equals\"\n                placeholder=\"Chips not shown here\"\n                [logPrefix]=\"'[mat-chips-deported] '\"\n              ></mat-chips-field>\n              {{ form.controls.entity?.value | json }}\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n</ion-content>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { MatBadgeFill } from './badge.directive';\nimport { MatBadgeSize } from '@angular/material/badge';\nimport { AppColors } from '../../types';\n\n@Component({\n  selector: 'mat-badge-test',\n  templateUrl: './badge.test.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatBadgeTestPage {\n  userText = 'A custom string';\n  matBadgeContent = '!';\n\n  $icon = new BehaviorSubject<string>('alert');\n  $size = new BehaviorSubject<MatBadgeSize>('small');\n  $fill = new BehaviorSubject<MatBadgeFill>('solid');\n  $color = new BehaviorSubject<AppColors>('danger');\n  $hidden = new BehaviorSubject<boolean>(false);\n  $overlap = new BehaviorSubject<boolean>(false);\n\n  constructor(private cd: ChangeDetectorRef) {}\n\n  onInputChanged(event: any) {\n    this.userText = event.target.value;\n    this.cd.markForCheck();\n  }\n\n  onMatBadgeContentChanged(event: any) {\n    this.matBadgeContent = event.target.value;\n    this.cd.markForCheck();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>matBadgeIcon directive</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <!-- small badge -->\n  <p>\n    <ion-text color=\"tertiary\">\n      <span appBadge appBadgeMatIcon=\"check\" appBadgeSize=\"small\" appBadgeColor=\"accent\" appBadgeOverlap=\"false\">\n        Small badge\n      </span>\n    </ion-text>\n  </p>\n\n  <!-- small badge with text -->\n  <p>\n    <ion-text color=\"tertiary\">\n      <span [appBadge]=\"0\" appBadgeSize=\"small\" appBadgeColor=\"accent\" appBadgeOverlap=\"false\">\n        Small badge with text 0\n      </span>\n    </ion-text>\n  </p>\n\n  <!-- medium badge -->\n  <p>\n    <ion-text\n      appBadge\n      appBadgeMatIcon=\"check\"\n      appBadgeSize=\"medium\"\n      [appBadgeColor]=\"'tertiary' | matColor\"\n      appBadgeOverlap=\"false\"\n    >\n      Medium badge\n    </ion-text>\n  </p>\n\n  <!-- small badge -->\n  <p>\n    <ion-label appBadge appBadgeMatIcon=\"close\" appBadgeSize=\"large\" appBadgeOverlap=\"false\">Large badge</ion-label>\n  </p>\n\n  <!-- default size badge -->\n  <p>\n    <ion-label appBadge appBadgeMatIcon=\"check\" [appBadgeColor]=\"'success' | matColor\" appBadgeOverlap=\"false\">\n      Badge (no size, no color)\n    </ion-label>\n  </p>\n\n  <!-- ion icon -->\n  <p>\n    <ion-label appBadge appBadgeIcon=\"checkmark\" [appBadgeColor]=\"'success' | matColor\" appBadgeOverlap=\"false\">\n      Badge with ion-icon\n    </ion-label>\n  </p>\n\n  <!-- ion icon clear -->\n  <p>\n    <ion-label\n      appBadge\n      appBadgeIcon=\"checkmark-circle\"\n      [appBadgeColor]=\"'tertiary' | matColor\"\n      appBadgeFill=\"clear\"\n      appBadgeOverlap=\"false\"\n    >\n      Badge with clear icon\n    </ion-label>\n  </p>\n\n  <!-- changing text-->\n  <ion-row>\n    <ion-col>\n      <ion-label\n        appBadge\n        appBadgeIcon=\"checkmark-circle\"\n        [appBadgeColor]=\"'tertiary' | matColor\"\n        appBadgeFill=\"clear\"\n        appBadgeOverlap=\"false\"\n      >\n        {{ userText }}\n      </ion-label>\n    </ion-col>\n    <ion-col>\n      <input type=\"text\" [value]=\"userText\" (input)=\"onInputChanged($event)\" />\n    </ion-col>\n  </ion-row>\n\n  <ion-row>\n    <ion-col>Configurable example :</ion-col>\n  </ion-row>\n  <ion-row class=\"ion-no-padding\">\n    <ion-col size=\"auto\">\n      <mat-icon\n        [style.color]=\"'var(--ion-color-secondary)'\"\n        appBadge\n        [appBadgeIcon]=\"$icon | async\"\n        [appBadgeColor]=\"$color | async | matColor\"\n        [appBadgeHidden]=\"$hidden | async\"\n        [appBadgeFill]=\"$fill | async\"\n        [appBadgeSize]=\"$size | async\"\n        appBadgeOverlap=\"true\"\n        appBadgePosition=\"above before\"\n      >\n        <ion-icon slot=\"icon-only\" [color]=\"'secondary'\" name=\"navigate\"></ion-icon>\n      </mat-icon>\n    </ion-col>\n\n    <ion-col>\n      <mat-form-field>\n        <mat-label>appBadgeColor</mat-label>\n        <mat-select [value]=\"$color.value\" (selectionChange)=\"this.$color.next($event.value)\">\n          <mat-option [value]=\"'primary'\">primary</mat-option>\n          <mat-option [value]=\"'secondary'\">secondary</mat-option>\n          <mat-option [value]=\"'tertiary'\">tertiary</mat-option>\n          <mat-option [value]=\"'danger'\">danger</mat-option>\n        </mat-select>\n      </mat-form-field>\n    </ion-col>\n\n    <ion-col>\n      <mat-form-field>\n        <mat-label>appBadgeIcon</mat-label>\n        <mat-select [value]=\"$icon.value\" (selectionChange)=\"this.$icon.next($event.value)\">\n          <mat-option [value]=\"'checkmark-circle'\">checkmark-circle</mat-option>\n          <mat-option [value]=\"'alert-circle'\">alert-circle</mat-option>\n          <mat-option [value]=\"'alert'\">alert</mat-option>\n          <mat-option [value]=\"'flag'\">flag</mat-option>\n        </mat-select>\n      </mat-form-field>\n    </ion-col>\n\n    <ion-col>\n      <mat-form-field>\n        <mat-label>appBadgeSize</mat-label>\n        <mat-select [value]=\"$size.value\" (selectionChange)=\"this.$size.next($event.value)\">\n          <mat-option [value]=\"'large'\">large</mat-option>\n          <mat-option [value]=\"'medium'\">medium</mat-option>\n          <mat-option [value]=\"'small'\">small</mat-option>\n        </mat-select>\n      </mat-form-field>\n    </ion-col>\n\n    <ion-col>\n      <mat-form-field>\n        <mat-label>appBadgeFill</mat-label>\n        <mat-select [value]=\"$fill.value\" (selectionChange)=\"this.$fill.next($event.value)\">\n          <mat-option [value]=\"'clear'\">clear</mat-option>\n          <mat-option [value]=\"'solid'\">solid</mat-option>\n        </mat-select>\n      </mat-form-field>\n    </ion-col>\n\n    <ion-col>\n      <mat-form-field>\n        <mat-label>appBadgeHidden</mat-label>\n        <mat-select [value]=\"$hidden.value\" (selectionChange)=\"this.$hidden.next($event.value)\">\n          <mat-option [value]=\"true\">true</mat-option>\n          <mat-option [value]=\"false\">false</mat-option>\n        </mat-select>\n      </mat-form-field>\n    </ion-col>\n  </ion-row>\n\n  <ion-row>\n    <ion-col size=\"auto\">\n      <p>mat-raised-button:</p>\n    </ion-col>\n    <ion-col>\n      <button\n        mat-raised-button\n        color=\"primary\"\n        [appBadgeIcon]=\"$icon | async\"\n        [appBadgeColor]=\"$color | async | matColor\"\n        [appBadgeHidden]=\"$hidden | async\"\n        [appBadgeFill]=\"$fill | async\"\n        [appBadgeSize]=\"$size | async\"\n        appBadgeOverlap=\"true\"\n        appBadgePosition=\"below after\"\n      >\n        {{ userText }}\n      </button>\n    </ion-col>\n  </ion-row>\n\n  <ion-row>\n    <ion-col size=\"auto\">\n      <p>mat-button with mat-label:</p>\n    </ion-col>\n    <ion-col>\n      <button\n        mat-button\n        color=\"primary\"\n        class=\"ion-no-padding\"\n        [appBadgeIcon]=\"$icon | async\"\n        [appBadgeColor]=\"$color | async | matColor\"\n        [appBadgeHidden]=\"$hidden | async\"\n        [appBadgeFill]=\"$fill | async\"\n        [appBadgeSize]=\"$size | async\"\n        matBadgeOverlap=\"true\"\n        matBadgePosition=\"above after\"\n      >\n        {{ userText }}\n      </button>\n    </ion-col>\n  </ion-row>\n\n  <h4>Angular Material Badge (standard way)</h4>\n\n  <ion-row>\n    <ion-col size=\"auto\">\n      <p>mat-icon:</p>\n    </ion-col>\n    <ion-col>\n      <mat-icon\n        [style.color]=\"'var(--ion-color-secondary)'\"\n        [matBadge]=\"'!'\"\n        [matBadgeColor]=\"$color | async | matColor\"\n        [matBadgeHidden]=\"$hidden | async\"\n        [matBadgeSize]=\"$size | async\"\n        matBadgeOverlap=\"true\"\n      >\n        <ion-icon slot=\"icon-only\" [color]=\"'secondary'\" name=\"navigate\"></ion-icon>\n      </mat-icon>\n    </ion-col>\n  </ion-row>\n\n  <ion-row>\n    <ion-col size=\"auto\">\n      <p>mat-button:</p>\n    </ion-col>\n    <ion-col>\n      <button\n        mat-raised-button\n        color=\"primary\"\n        [matBadge]=\"matBadgeContent\"\n        [matBadgeColor]=\"$color | async | matColor\"\n        [matBadgeHidden]=\"$hidden | async\"\n        [matBadgeSize]=\"$size | async\"\n        matBadgeOverlap=\"true\"\n        matBadgePosition=\"above after\"\n      >\n        {{ userText }}\n      </button>\n    </ion-col>\n\n    <ion-col>\n      <input type=\"text\" [value]=\"matBadgeContent\" (input)=\"onMatBadgeContentChanged($event)\" />\n    </ion-col>\n  </ion-row>\n\n  <ion-row>\n    <ion-col size=\"auto\">\n      <p>mat-button</p>\n    </ion-col>\n    <ion-col>\n      <button\n        mat-button\n        color=\"primary\"\n        [matBadge]=\"matBadgeContent\"\n        [matBadgeColor]=\"$color | async | matColor\"\n        [matBadgeHidden]=\"$hidden | async\"\n        [matBadgeSize]=\"$size | async\"\n        matBadgeOverlap=\"true\"\n        matBadgePosition=\"after\"\n      >\n        {{ userText }}\n      </button>\n    </ion-col>\n  </ion-row>\n</ion-content>\n","import { ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { debounceTime } from 'rxjs/operators';\nimport { AppFormUtils } from '../../../../core/form/form.utils';\nimport 'moment-timezone';\n\n@Component({\n  selector: 'app-duration-test',\n  templateUrl: './mat-duration.test.html',\n})\nexport class DurationTestPage implements OnInit {\n  form: UntypedFormGroup;\n  mode: 'desktop' | 'temp' = 'desktop';\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef\n  ) {\n    this.form = formBuilder.group({\n      empty: [null],\n      enable: [null, Validators.required],\n      disable: [null, Validators.required],\n      readonly: [null],\n      duration: [null],\n    });\n\n    const disableControl = this.form.get('disable');\n    disableControl.disable();\n\n    // Copy the 'enable' value, into the disable control\n    this.form.get('enable').valueChanges.subscribe((value) => disableControl.setValue(value));\n  }\n\n  ngOnInit() {\n    setTimeout(() => this.loadData(), 250);\n  }\n\n  toggleMode(value) {\n    if (this.mode !== value) {\n      this.mode = value;\n    }\n  }\n\n  // Load the form with data\n  async loadData() {\n    const data = {\n      empty: null, // toDateISOString(now.clone().add(2, 'hours')),\n      enable: 1.5,\n      disable: 3.25,\n      readonly: 5,\n      duration: null,\n    };\n\n    this.form.setValue(data);\n\n    this.log('[test-page] Data loaded: ' + JSON.stringify(data));\n\n    this.form\n      .get('empty')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°1: ' + JSON.stringify(value)));\n\n    this.form\n      .get('enable')\n      .valueChanges.pipe(debounceTime(300))\n      .subscribe((value) => this.log('[test-page] Value n°2: ' + JSON.stringify(value)));\n  }\n\n  doSubmit(event) {\n    this.form.markAllAsTouched();\n    this.log('[test-page] Form content: ' + JSON.stringify(this.form.value));\n    this.log('[test-page] Form status: ' + this.form.status);\n    if (this.form.invalid) {\n      this.log('[test-page] Form errors: ' + JSON.stringify(this.form.errors));\n\n      // DEBUG\n      AppFormUtils.logFormErrors(this.form);\n    }\n  }\n\n  log(message: string) {\n    console.debug(message);\n  }\n  stringify = JSON.stringify;\n\n  /* -- protected methods -- */\n  protected readonly Number = Number;\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Duration field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <!-- Tab nav - desktop mode -->\n  <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n    <a mat-tab-link [active]=\"mode === 'desktop'\" (click)=\"toggleMode('desktop')\">\n      <mat-label>Desktop</mat-label>\n    </a>\n    <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n      <mat-label>Temporary</mat-label>\n    </a>\n  </nav>\n\n  <form #tabPanel class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    @if (mode === 'desktop') {\n      <ion-grid>\n        <!-- Desktop mode -->\n        <ion-row>\n          <ion-col>\n            <ion-text><h4>Desktop mode</h4></ion-text>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <!-- Empty value -->\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Empty value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>\n                        {{ stringify(form.controls.empty.value) }}\n                      </pre>\n                      <br />\n                      <pre>\n                        formControl.valid? {{ form.controls.empty?.valid }}\n                        textControl.valid? {{ desktopEmptyField.textControl?.valid }}\n                      </pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-duration-field formControlName=\"empty\" #desktopEmptyField placeholder=\"Duration\" [clearable]=\"true\">\n                  <ion-icon matPrefix name=\"hourglass\"></ion-icon>\n                </mat-duration-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Enable  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">With value</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.enable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-duration-field formControlName=\"enable\" placeholder=\"Duration\" [required]=\"true\" [clearable]=\"true\">\n                  <ion-icon matPrefix name=\"hourglass\"></ion-icon>\n                </mat-duration-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Disable -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Disable</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-duration-field formControlName=\"disable\" placeholder=\"Duration\" [required]=\"true\">\n                  <ion-icon matPrefix name=\"hourglass\"></ion-icon>\n                </mat-duration-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n          <!-- Readonly  -->\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Readonly toggle</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-checkbox\n                  (change)=\"desktopReadonlyField.readonly = $event.checked\"\n                  [checked]=\"desktopReadonlyField.readonly\"\n                ></mat-checkbox>\n                <mat-duration-field\n                  #desktopReadonlyField\n                  formControlName=\"readonly\"\n                  placeholder=\"Duration\"\n                  [readonly]=\"true\"\n                  [clearable]=\"true\"\n                  >\n                  <ion-icon matPrefix name=\"hourglass\"></ion-icon>\n                </mat-duration-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n        <ion-row>\n          <ion-col>\n            <ion-card>\n              <ion-card-header>\n                <ion-card-title>\n                  <ion-label color=\"primary\">Duration to hours format</ion-label>\n                </ion-card-title>\n                <ion-card-subtitle>\n                  <ion-text color=\"medium\">\n                    <small>\n                      <pre>Value sexagesimal mode: {{ form.controls.duration.value | duration }}</pre>\n                      <pre>Value set: {{ stringify(form.controls.duration.value) }}</pre>\n                      <pre>dirty: {{ form.controls.duration.dirty }}</pre>\n                      <pre>valid: {{ form.controls.duration.valid }}</pre>\n                    </small>\n                  </ion-text>\n                </ion-card-subtitle>\n              </ion-card-header>\n              <ion-card-content>\n                <mat-duration-field\n                  #duration\n                  formControlName=\"duration\"\n                  placeholder=\"Duration\"\n                >\n                </mat-duration-field>\n              </ion-card-content>\n            </ion-card>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    }\n  </form>\n</ion-content>\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { AppFormUtils } from '../../../core/form/form.utils';\nimport { debounceTime } from 'rxjs/operators';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { SharedFormGroupValidators, SharedValidators } from '../../validator/validators';\nimport { isMobile } from '../../platforms';\nimport { DateUtils, toDateISOString } from '../../dates';\nimport { StatusList } from '../../../core/services/model/referential.model';\nimport { Subscription } from 'rxjs';\n\n@Component({\n  selector: 'mat-common-test',\n  templateUrl: './common.test.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatCommonTestPage implements OnInit, OnDestroy {\n  showLogPanel = true;\n  logContent = '';\n\n  form: UntypedFormGroup;\n\n  statusList = StatusList;\n\n  private subscription = new Subscription();\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef\n  ) {\n    this.form = formBuilder.group(\n      {\n        empty: [null],\n        emptyRequired: [null, Validators.required],\n        enable: [null, Validators.required],\n        disable: [null, Validators.required],\n        readonly: [null],\n        select: [null, Validators.required],\n        boolean: [null],\n        date: [null, Validators.compose([Validators.required, SharedValidators.validDate])],\n      },\n      {\n        validators: SharedFormGroupValidators.dateRange('empty', 'enable'),\n      }\n    );\n\n    const disableControl = this.form.get('disable');\n    disableControl.disable();\n\n    // Copy the 'enable' value, into the disable control\n    this.subscription.add(this.form.get('enable').valueChanges.subscribe((value) => disableControl.setValue(value)));\n\n    this.showLogPanel = this.showLogPanel || isMobile(window);\n  }\n\n  ngOnInit() {\n    setTimeout(() => this.loadData(), 250);\n  }\n\n  ngOnDestroy() {\n    this.subscription.unsubscribe();\n  }\n\n  // Load the form with data\n  async loadData() {\n    const now = DateUtils.moment();\n\n    const data = {\n      empty: null, // toDateISOString(now.clone().add(2, 'hours')),\n      emptyRequired: null,\n      enable: toDateISOString(now),\n      disable: now.clone(),\n      readonly: now.clone(),\n      select: null,\n      boolean: null,\n      date: null,\n    };\n\n    this.form.setValue(data);\n\n    this.log('[test-page] Data loaded: ' + JSON.stringify(data));\n\n    this.subscription.add(\n      this.form\n        .get('empty')\n        .valueChanges.pipe(debounceTime(300))\n        .subscribe((value) => this.log('[test-page] Value n°1: ' + JSON.stringify(value)))\n    );\n\n    this.subscription.add(\n      this.form\n        .get('enable')\n        .valueChanges.pipe(debounceTime(300))\n        .subscribe((value) => this.log('[test-page] Value n°2: ' + JSON.stringify(value)))\n    );\n  }\n\n  doSubmit(_) {\n    this.form.markAllAsTouched();\n    this.log('[test-page] Form content: ' + JSON.stringify(this.form.value));\n    this.log('[test-page] Form status: ' + this.form.status);\n    if (this.form.invalid) {\n      this.log('[test-page] Form errors: ' + JSON.stringify(this.form.errors));\n\n      // DEBUG\n      AppFormUtils.logFormErrors(this.form);\n    }\n  }\n\n  log(message: string) {\n    console.debug(message);\n\n    if (this.showLogPanel) {\n      this.logContent += message + '<br/>';\n      this.cd.markForCheck();\n    }\n  }\n\n  clearLogPanel() {\n    this.logContent = '';\n    this.cd.markForCheck();\n  }\n\n  stringify = JSON.stringify;\n\n  /* -- protected methods -- */\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Common field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <form class=\"form-container\" [formGroup]=\"form\" (ngSubmit)=\"doSubmit($event)\">\n    <ion-grid>\n      <ion-row>\n        <ion-col>\n          <!-- Empty value -->\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Empty value</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>\n                      {{ stringify(form.controls.empty.value) }}\n                    </pre>\n                    <br />\n                    <pre>\n                      formControl.valid? {{ form.controls.empty?.valid }}\n                    </pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-form-field>\n                <mat-label>Value</mat-label>\n                <input matInput formControlName=\"empty\" />\n              </mat-form-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <!-- Empty value + required -->\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Empty value (required)</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(form.controls.emptyRequired.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-form-field>\n                <mat-label>Value</mat-label>\n                <input matInput formControlName=\"emptyRequired\" [required]=\"true\" />\n\n                <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n              </mat-form-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- Enable  -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">With value</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(form.controls.enable.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-form-field>\n                <mat-label>Value</mat-label>\n                <input matInput formControlName=\"enable\" [required]=\"true\" />\n              </mat-form-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- Disable -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Disable</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-form-field>\n                <mat-label>Value</mat-label>\n                <input matInput formControlName=\"disable\" [required]=\"true\" />\n              </mat-form-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- Readonly  -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Readonly toggle</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-checkbox\n                (change)=\"desktopReadonlyField.readOnly = $event.checked\"\n                [checked]=\"desktopReadonlyField.readOnly\"\n              >Readonly ?</mat-checkbox>\n              <mat-form-field>\n                <mat-label>Value</mat-label>\n                <input matInput #desktopReadonlyField formControlName=\"readonly\" [readOnly]=\"true\" />\n              </mat-form-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- Boolean -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Boolean</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(form.controls.disable.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-boolean-field formControlName=\"boolean\" placeholder=\"Boolean\"></mat-boolean-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- MatSelect  -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Mat Select</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(form.controls.readonly.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-form-field>\n                <mat-label>Select</mat-label>\n                <mat-select [formControl]=\"form.controls['select'] | formGetControl\" placeholder=\"Select a value\">\n                  <mat-select-trigger>\n                    {{ (form | formGetValue: 'select' | propertyGet: 'label' | translate) || '' }}\n                  </mat-select-trigger>\n                  @for (item of statusList; track item) {\n                    <mat-option [value]=\"item\">{{ item.label | translate }}</mat-option>\n                  }\n                </mat-select>\n\n\n              </mat-form-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <!-- MatDateTime  -->\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Mat DateTime</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ stringify(form.controls.date.value) }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-date-time-field\n                [formControl]=\"form.controls['date'] | formGetControl\"\n                placeholder=\"Date/Time\">\n              </mat-date-time-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n</ion-content>\n","import { AfterViewInit, ChangeDetectorRef, Component, Injector, OnInit, viewChildren } from '@angular/core';\nimport { AppForm } from '../../../../core/form/form.class';\nimport { UntypedFormBuilder, Validators } from '@angular/forms';\n\nimport { AppFloatLabelType } from '../../../types';\nimport { MatBooleanField } from '../material.boolean';\n\n@Component({\n  selector: 'app-boolean-test-page',\n  templateUrl: './boolean.test.page.html',\n})\nexport class BooleanTestPage extends AppForm<any> implements OnInit, AfterViewInit {\n  stringify = JSON.stringify;\n  mode: 'radio' | 'checkbox' | 'button' | 'temp' = 'radio';\n  styles: string[] = ['radio', 'checkbox', 'button'];\n  floatLabel: AppFloatLabelType = 'auto';\n  floatLabels: string[] = ['auto', 'always', 'never'];\n\n  protected booleanFieldsUndefinedTooltip = viewChildren<MatBooleanField>('booleanFieldUndefinedTooltip');\n  protected booleanFieldsHideTooltip = viewChildren<MatBooleanField>('booleanFieldHideTooltip');\n  protected booleanFieldsShowTooltip = viewChildren<MatBooleanField>('booleanFieldShowTooltip');\n\n  constructor(\n    protected injector: Injector,\n    protected formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef\n  ) {\n    super(injector);\n    this.setForm(\n      this.formBuilder.group({\n        disabledEmpty: [null],\n        disabledFalse: [false],\n        disabledTrue: [true],\n        enabledEmpty: [null],\n        enabledEmptyRequired: [null, Validators.required],\n        enabledFalse: [false],\n        enabledTrue: [true],\n      })\n    );\n  }\n\n  ngAfterViewInit(): void {\n    this.form.get('enabledEmpty').enable();\n    this.form.get('enabledFalse').enable();\n    this.form.get('enabledTrue').enable();\n    this.form.get('enabledEmptyRequired').enable();\n\n    // Set showTooltip option\n    this.updateFields();\n  }\n\n  toggleMode(value) {\n    if (this.mode !== value) {\n      this.mode = value;\n      this.cd.detectChanges();\n      this.updateFields();\n      this.markForCheck();\n    }\n  }\n\n  toggleFloatLabel(value: AppFloatLabelType) {\n    if (this.floatLabel !== value) {\n      this.floatLabel = value;\n      this.markForCheck();\n    }\n  }\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n\n  protected updateFields() {\n    this.booleanFieldsUndefinedTooltip().forEach((c) => (c.showTooltip = undefined));\n    this.booleanFieldsHideTooltip().forEach((c) => (c.showTooltip = false));\n    this.booleanFieldsShowTooltip().forEach((c) => (c.showTooltip = true));\n  }\n\n  protected clearControlValue(path: string, event?: Event) {\n    event?.preventDefault();\n    this.form.get(path)?.setValue(null);\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Boolean field test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n    @for (style of styles; track style) {\n      <a mat-tab-link [active]=\"mode === style\" (click)=\"toggleMode(style)\">\n        <mat-label>{{ style | capitalize }}</mat-label>\n      </a>\n    }\n\n    <a mat-tab-link [active]=\"mode === 'temp'\" (click)=\"toggleMode('temp')\">\n      <mat-label>Temp</mat-label>\n    </a>\n  </nav>\n\n  <form #tabPanel [formGroup]=\"form\" class=\"form-container ion-padding\">\n    <ion-grid class=\"ion-no-padding\">\n      <ion-row>\n        <ion-col size=\"4\">\n          <mat-form-field>\n            <mat-label>Float label</mat-label>\n            <mat-select [(value)]=\"floatLabel\">\n              @for (floatLabel of floatLabels; track floatLabel) {\n                <mat-option [value]=\"floatLabel\">{{ floatLabel | capitalize }}</mat-option>\n              }\n            </mat-select>\n          </mat-form-field>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n\n    @if (mode === 'temp') {\n      <ng-container [ngTemplateOutlet]=\"temp\"></ng-container>\n    } @else {\n      @for (style of styles; track style) {\n        <ng-container [ngTemplateOutlet]=\"components\" [ngTemplateOutletContext]=\"{ style: style }\"></ng-container>\n      }\n    }\n\n    <ng-template #components let-style=\"style\">\n      @if (style === mode) {\n        <ion-grid>\n          <ion-row>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Disabled empty</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.disabledEmpty?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"disabledEmpty\"\n                    placeholder=\"Placeholder\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Disabled false</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.disabledFalse?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"disabledFalse\"\n                    placeholder=\"Placeholder\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Disabled true</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.disabledTrue?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"disabledTrue\"\n                    placeholder=\"Placeholder\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Disabled + readonly</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.disabledTrue?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"disabledTrue\"\n                    placeholder=\"Placeholder\"\n                    readonly=\"true\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n          </ion-row>\n          <ion-row>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled empty</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledEmpty?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledEmpty\"\n                    placeholder=\"Placeholder\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled empty + required</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{\n                          form.controls.enabledEmptyRequired?.value | json\n                        }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledEmptyRequired\"\n                    placeholder=\"Placeholder\"\n                    [required]=\"true\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled false</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledFalse?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledFalse\"\n                    placeholder=\"Placeholder\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled true</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledTrue?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledTrue\"\n                    placeholder=\"Placeholder\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n          </ion-row>\n          <ion-row>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled empty (no placeholder)</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledEmpty?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledEmpty\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled false (no placeholder)</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledFalse?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledFalse\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled true (no placeholder)</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledTrue?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledTrue\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n          </ion-row>\n\n          <ion-row>\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled empty + clearable</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledEmpty?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledEmpty\"\n                    placeholder=\"Placeholder\"\n                    [clearable]=\"true\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">Enabled false + floatLabel=\"always\"</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledFalse?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledFalse\"\n                    placeholder=\"Placeholder\"\n                    floatLabel=\"always\"\n                    [clearable]=\"true\"\n                  ></mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n\n            <ion-col size=\"4\">\n              <ion-card>\n                <ion-card-header>\n                  <ion-card-title>\n                    <ion-label color=\"primary\">appearance=\"outline\" + icon + clearable</ion-label>\n                  </ion-card-title>\n                  <ion-card-subtitle>\n                    <ion-text color=\"medium\">\n                      <small>\n                        <pre style=\"white-space: break-spaces\">{{ form.controls.enabledTrue?.value | json }}</pre>\n                      </small>\n                    </ion-text>\n                  </ion-card-subtitle>\n                </ion-card-header>\n                <ion-card-content>\n                  <mat-boolean-field\n                    [style]=\"style\"\n                    [floatLabel]=\"floatLabel\"\n                    formControlName=\"enabledTrue\"\n                    placeholder=\"Placeholder\"\n                    appearance=\"outline\"\n                    [clearable]=\"true\"\n                  >\n                    <mat-icon matPrefix>room</mat-icon>\n                  </mat-boolean-field>\n                </ion-card-content>\n              </ion-card>\n            </ion-col>\n\n            @if (style === 'button') {\n              <ion-col size=\"4\">\n                <ion-card>\n                  <ion-card-header>\n                    <ion-card-title>\n                      <ion-label color=\"primary\">Enabled empty + showButtonIcons: false</ion-label>\n                    </ion-card-title>\n                    <ion-card-subtitle>\n                      <ion-text color=\"medium\">\n                        <small>\n                          <pre style=\"white-space: break-spaces\">{{ form.controls.enabledEmpty?.value | json }}</pre>\n                        </small>\n                      </ion-text>\n                    </ion-card-subtitle>\n                  </ion-card-header>\n                  <ion-card-content>\n                    <mat-boolean-field\n                      [style]=\"style\"\n                      [floatLabel]=\"floatLabel\"\n                      formControlName=\"enabledEmpty\"\n                      placeholder=\"Placeholder\"\n                      [showButtonIcons]=\"false\"\n                    ></mat-boolean-field>\n                  </ion-card-content>\n                </ion-card>\n              </ion-col>\n            } @else if (style === 'checkbox') {\n              <ion-col size=\"4\">\n                <ion-card>\n                  <ion-card-header>\n                    <ion-card-title>\n                      <ion-label color=\"primary\">showTooltip: undefined</ion-label>\n                    </ion-card-title>\n                    <ion-card-subtitle>\n                      <ion-text color=\"medium\">\n                        <small>\n                          <pre style=\"white-space: break-spaces\">{{ form.controls.enabledEmpty?.value | json }}</pre>\n                        </small>\n                      </ion-text>\n                    </ion-card-subtitle>\n                  </ion-card-header>\n                  <ion-card-content>\n                    <mat-boolean-field\n                      #booleanFieldUndefinedTooltip\n                      [style]=\"style\"\n                      [floatLabel]=\"floatLabel\"\n                      formControlName=\"enabledEmpty\"\n                      placeholder=\"Placeholder\"\n                      [showButtonIcons]=\"false\"\n                    ></mat-boolean-field>\n                  </ion-card-content>\n                </ion-card>\n              </ion-col>\n              <ion-col size=\"4\">\n                <ion-card>\n                  <ion-card-header>\n                    <ion-card-title>\n                      <ion-label color=\"primary\">showTooltip: false</ion-label>\n                    </ion-card-title>\n                    <ion-card-subtitle>\n                      <ion-text color=\"medium\">\n                        <small>\n                          <pre style=\"white-space: break-spaces\">{{ form.controls.enabledEmpty?.value | json }}</pre>\n                        </small>\n                      </ion-text>\n                    </ion-card-subtitle>\n                  </ion-card-header>\n                  <ion-card-content>\n                    <mat-boolean-field\n                      #booleanFieldHideTooltip\n                      [style]=\"style\"\n                      [floatLabel]=\"floatLabel\"\n                      formControlName=\"enabledEmpty\"\n                      placeholder=\"Placeholder\"\n                      [showButtonIcons]=\"false\"\n                    ></mat-boolean-field>\n                  </ion-card-content>\n                </ion-card>\n              </ion-col>\n              <ion-col size=\"4\">\n                <ion-card>\n                  <ion-card-header>\n                    <ion-card-title>\n                      <ion-label color=\"primary\">showTooltip: true</ion-label>\n                    </ion-card-title>\n                    <ion-card-subtitle>\n                      <ion-text color=\"medium\">\n                        <small>\n                          <pre style=\"white-space: break-spaces\">{{ form.controls.enabledEmpty?.value | json }}</pre>\n                        </small>\n                      </ion-text>\n                    </ion-card-subtitle>\n                  </ion-card-header>\n                  <ion-card-content>\n                    <mat-boolean-field\n                      #booleanFieldShowTooltip\n                      [style]=\"style\"\n                      [floatLabel]=\"floatLabel\"\n                      formControlName=\"enabledEmpty\"\n                      placeholder=\"Placeholder\"\n                      [showButtonIcons]=\"false\"\n                    ></mat-boolean-field>\n                  </ion-card-content>\n                </ion-card>\n              </ion-col>\n            }\n          </ion-row>\n        </ion-grid>\n      }\n    </ng-template>\n\n    <ng-template #temp>\n      <ion-grid>\n        <ion-row>\n          <ion-col size=\"4\">\n            <mat-boolean-field\n              [style]=\"'radio'\"\n              [floatLabel]=\"floatLabel\"\n              formControlName=\"enabledEmpty\"\n              placeholder=\"Placeholder\"\n            ></mat-boolean-field>\n          </ion-col>\n          <ion-col size=\"4\">\n            <mat-boolean-field\n              [style]=\"'checkbox'\"\n              [floatLabel]=\"floatLabel\"\n              formControlName=\"enabledEmpty\"\n              placeholder=\"Placeholder\"\n            ></mat-boolean-field>\n          </ion-col>\n          <ion-col size=\"4\">\n            <mat-boolean-field\n              [style]=\"'button'\"\n              [floatLabel]=\"floatLabel\"\n              formControlName=\"enabledEmpty\"\n              placeholder=\"Placeholder\"\n            ></mat-boolean-field>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    </ng-template>\n  </form>\n</ion-content>\n","import { Component } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\n\n@Component({\n  selector: 'app-maskito-test',\n  templateUrl: './maskito.test.html',\n})\nexport class MaskitoTestPage {\n  form: UntypedFormGroup;\n\n  labelMask: (string | RegExp)[] = [\n    /\\d/,\n    /\\d/,\n    ' ',\n    /^[a-zA-Z]$/,\n    /^[a-zA-Z]$/,\n    /^[a-zA-Z]$/,\n    /^[a-zA-Z]$/,\n    /^[a-zA-Z]$/,\n    /^[a-zA-Z]$/,\n    /^[a-zA-Z]$/,\n    ' ',\n    /\\d/,\n    /\\d/,\n    /\\d/,\n  ];\n\n  constructor(protected formBuilder: UntypedFormBuilder) {\n    this.form = formBuilder.group({\n      strategy: [null],\n    });\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Maskito test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <form [formGroup]=\"form\">\n    <ion-grid>\n      <ion-row>\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Test Strategy Pattern</ion-label>\n              </ion-card-title>\n            </ion-card-header>\n            <ion-card-content>\n              <mat-form-field>\n                <input\n                  matInput\n                  #strategyInput\n                  formControlName=\"strategy\"\n                  autocomplete=\"off\"\n                  type=\"text\"\n                  [maskito]=\"'__ _______ ___' | maskitoPlaceholder: labelMask\"\n                  placeholder=\"Strategy field\"\n                />\n              </mat-form-field>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n</ion-content>\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { AsyncPipe, JsonPipe } from '@angular/common';\nimport {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  forwardRef,\n  inject,\n  input,\n  model,\n  OnDestroy,\n  signal,\n  untracked,\n  viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n  AbstractControl,\n  ControlValueAccessor,\n  FormBuilder,\n  FormControl,\n  FormGroup,\n  FormsModule,\n  NgControl,\n  ReactiveFormsModule,\n  Validators,\n} from '@angular/forms';\nimport { MAT_FORM_FIELD, MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { Subject } from 'rxjs';\nimport { IonicModule } from '@ionic/angular';\n\n/** @title Form field with custom telephone number input control. */\n@Component({\n  selector: 'form-field-custom-control-example',\n  template: `\n    <ion-header>\n      <ion-toolbar color=\"primary\">\n        <ion-buttons slot=\"start\">\n          <ion-back-button></ion-back-button>\n        </ion-buttons>\n\n        <ion-title>Custom field test page</ion-title>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <div [formGroup]=\"form\">\n        <mat-form-field>\n          <mat-label>Phone number</mat-label>\n          <example-tel-input formControlName=\"tel\" required></example-tel-input>\n          <mat-icon matSuffix>phone</mat-icon>\n          <mat-hint>Include area code</mat-hint>\n        </mat-form-field>\n        <p>Entered value: {{ form.valueChanges | async | json }}</p>\n      </div>\n    </ion-content>\n  `,\n  standalone: true,\n  imports: [FormsModule, ReactiveFormsModule, MatFormFieldModule, forwardRef(() => MyTelInput), MatIconModule, AsyncPipe, JsonPipe, IonicModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormFieldCustomControlExample {\n  readonly form = new FormGroup({\n    tel: new FormControl(null),\n  });\n}\n\n/** Data structure for holding telephone number. */\nexport class MyTel {\n  constructor(\n    public area: string,\n    public exchange: string,\n    public subscriber: string\n  ) {}\n}\n\n/** Custom `MatFormFieldControl` for telephone number input. */\n@Component({\n  selector: 'example-tel-input',\n  templateUrl: 'test-component.html',\n  styleUrl: 'test-component.css',\n  providers: [{ provide: MatFormFieldControl, useExisting: MyTelInput }],\n  host: {\n    '[class.example-floating]': 'shouldLabelFloat',\n    '[id]': 'id',\n  },\n  standalone: true,\n  imports: [FormsModule, ReactiveFormsModule, IonicModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MyTelInput implements ControlValueAccessor, MatFormFieldControl<MyTel>, OnDestroy {\n  static nextId = 0;\n  readonly areaInput = viewChild.required<HTMLInputElement>('area');\n  readonly exchangeInput = viewChild.required<HTMLInputElement>('exchange');\n  readonly subscriberInput = viewChild.required<HTMLInputElement>('subscriber');\n  ngControl = inject(NgControl, { optional: true, self: true });\n  readonly parts: FormGroup<{\n    area: FormControl<string | null>;\n    exchange: FormControl<string | null>;\n    subscriber: FormControl<string | null>;\n  }>;\n  readonly stateChanges = new Subject<void>();\n  readonly touched = signal(false);\n  readonly controlType = 'example-tel-input';\n  readonly id = `example-tel-input-${MyTelInput.nextId++}`;\n  readonly _userAriaDescribedBy = input<string>('', { alias: 'aria-describedby' });\n  readonly _placeholder = input<string>('', { alias: 'placeholder' });\n  readonly _required = input<boolean, unknown>(false, {\n    alias: 'required',\n    transform: booleanAttribute,\n  });\n  readonly _disabledByInput = input<boolean, unknown>(false, {\n    alias: 'disabled',\n    transform: booleanAttribute,\n  });\n  readonly _value = model<MyTel | null>(null, { alias: 'value' });\n  onChange = (_: any) => {};\n  onTouched = () => {};\n\n  protected readonly _formField = inject(MAT_FORM_FIELD, {\n    optional: true,\n  });\n\n  private readonly _focused = signal(false);\n  private readonly _disabledByCva = signal(false);\n  private readonly _disabled = computed(() => this._disabledByInput() || this._disabledByCva());\n  private readonly _focusMonitor = inject(FocusMonitor);\n  private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n  get focused(): boolean {\n    return this._focused();\n  }\n\n  get empty() {\n    const {\n      value: { area, exchange, subscriber },\n    } = this.parts;\n\n    return !area && !exchange && !subscriber;\n  }\n\n  get shouldLabelFloat() {\n    return this.focused || !this.empty;\n  }\n\n  get userAriaDescribedBy() {\n    return this._userAriaDescribedBy();\n  }\n\n  get placeholder(): string {\n    return this._placeholder();\n  }\n\n  get required(): boolean {\n    return this._required();\n  }\n\n  get disabled(): boolean {\n    return this._disabled();\n  }\n\n  get value(): MyTel | null {\n    return this._value();\n  }\n\n  get errorState(): boolean {\n    return this.parts.invalid && this.touched();\n  }\n\n  constructor() {\n    if (this.ngControl != null) {\n      this.ngControl.valueAccessor = this;\n    }\n\n    this.parts = inject(FormBuilder).group({\n      area: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(3)]],\n      exchange: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(3)]],\n      subscriber: ['', [Validators.required, Validators.minLength(4), Validators.maxLength(4)]],\n    });\n\n    effect(() => {\n      // Read signals to trigger effect.\n      this._placeholder();\n      this._required();\n      this._disabled();\n      this._focused();\n      // Propagate state changes.\n      untracked(() => this.stateChanges.next());\n    });\n\n    effect(() => {\n      if (this._disabled()) {\n        untracked(() => this.parts.disable());\n      } else {\n        untracked(() => this.parts.enable());\n      }\n    });\n\n    effect(() => {\n      const value = this._value() || new MyTel('', '', '');\n      untracked(() => this.parts.setValue(value));\n    });\n\n    this.parts.statusChanges.pipe(takeUntilDestroyed()).subscribe(() => {\n      this.stateChanges.next();\n    });\n\n    this.parts.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => {\n      const tel = this.parts.valid\n        ? new MyTel(this.parts.value.area || '', this.parts.value.exchange || '', this.parts.value.subscriber || '')\n        : null;\n      this._updateValue(tel);\n    });\n  }\n\n  ngOnDestroy() {\n    this.stateChanges.complete();\n    this._focusMonitor.stopMonitoring(this._elementRef);\n  }\n\n  onFocusIn() {\n    if (!this._focused()) {\n      this._focused.set(true);\n    }\n  }\n\n  onFocusOut(event: FocusEvent) {\n    if (!this._elementRef.nativeElement.contains(event.relatedTarget as Element)) {\n      this.touched.set(true);\n      this._focused.set(false);\n      this.onTouched();\n    }\n  }\n\n  autoFocusNext(control: AbstractControl, nextElement?: HTMLInputElement): void {\n    if (!control.errors && nextElement) {\n      this._focusMonitor.focusVia(nextElement, 'program');\n    }\n  }\n\n  autoFocusPrev(control: AbstractControl, prevElement: HTMLInputElement): void {\n    if (control.value.length < 1) {\n      this._focusMonitor.focusVia(prevElement, 'program');\n    }\n  }\n\n  setDescribedByIds(ids: string[]) {\n    const controlElement = this._elementRef.nativeElement.querySelector('.example-tel-input-container')!;\n    controlElement.setAttribute('aria-describedby', ids.join(' '));\n  }\n\n  onContainerClick() {\n    if (this.parts.controls.subscriber.valid) {\n      this._focusMonitor.focusVia(this.subscriberInput(), 'program');\n    } else if (this.parts.controls.exchange.valid) {\n      this._focusMonitor.focusVia(this.subscriberInput(), 'program');\n    } else if (this.parts.controls.area.valid) {\n      this._focusMonitor.focusVia(this.exchangeInput(), 'program');\n    } else {\n      this._focusMonitor.focusVia(this.areaInput(), 'program');\n    }\n  }\n\n  writeValue(tel: MyTel | null): void {\n    this._updateValue(tel);\n  }\n\n  registerOnChange(fn: any): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: any): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this._disabledByCva.set(isDisabled);\n  }\n\n  _handleInput(control: AbstractControl, nextElement?: HTMLInputElement): void {\n    this.autoFocusNext(control, nextElement);\n    this.onChange(this.value);\n  }\n\n  private _updateValue(tel: MyTel | null) {\n    const current = this._value();\n    if (tel === current || (tel?.area === current?.area && tel?.exchange === current?.exchange && tel?.subscriber === current?.subscriber)) {\n      return;\n    }\n    this._value.set(tel);\n  }\n}\n","<div\n  role=\"group\"\n  class=\"example-tel-input-container\"\n  [formGroup]=\"parts\"\n  [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n  (focusin)=\"onFocusIn()\"\n  (focusout)=\"onFocusOut($event)\"\n>\n  <input\n    class=\"example-tel-input-element\"\n    formControlName=\"area\"\n    size=\"3\"\n    maxLength=\"3\"\n    aria-label=\"Area code\"\n    (input)=\"_handleInput(parts.controls.area, exchange)\"\n    #area\n  />\n  <span class=\"example-tel-input-spacer\">&ndash;</span>\n  <input\n    class=\"example-tel-input-element\"\n    formControlName=\"exchange\"\n    maxLength=\"3\"\n    size=\"3\"\n    aria-label=\"Exchange code\"\n    (input)=\"_handleInput(parts.controls.exchange, subscriber)\"\n    (keyup.backspace)=\"autoFocusPrev(parts.controls.exchange, area)\"\n    #exchange\n  />\n  <span class=\"example-tel-input-spacer\">&ndash;</span>\n  <input\n    class=\"example-tel-input-element\"\n    formControlName=\"subscriber\"\n    maxLength=\"4\"\n    size=\"4\"\n    aria-label=\"Subscriber number\"\n    (input)=\"_handleInput(parts.controls.subscriber)\"\n    (keyup.backspace)=\"autoFocusPrev(parts.controls.subscriber, exchange)\"\n    #subscriber\n  />\n</div>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { SharedTestsPage, TestingPage } from '../testing/tests.page';\nimport { SharedMaterialModule } from './material.module';\nimport { IonicModule } from '@ionic/angular';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { DateTimeTestPage } from './datetime/testing/mat-date-time.test';\nimport { DateTestPage } from './datetime/testing/mat-date.test';\nimport { SharedPipesModule } from '../pipes/pipes.module';\nimport { ObservableTestPage } from '../testing/observable.test';\nimport { DateShortTestPage } from './datetime/testing/mat-dateshort.test';\nimport { AutocompleteTestPage } from './autocomplete/testing/autocomplete.test';\nimport { LatLongTestPage } from './latlong/testing/latlong.test';\nimport { SwipeTestPage } from './swipe/testing/swipe.test';\nimport { ChipsTestPage } from './chips/testing/chips.test';\nimport { MatBadgeTestPage } from './badge/badge.test';\nimport { SharedBadgeModule } from './badge/badge.module';\nimport { DurationTestPage } from './duration/testing/mat-duration.test';\nimport { MatCommonTestPage } from './testing/common.test';\nimport { BooleanTestPage } from './boolean/testing/boolean.test.page';\nimport { MaskitoTestPage } from '../testing/maskito.test';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { FormFieldCustomControlExample } from './test/test-component';\nimport { SharedMatLatLongModule } from './latlong/material.latlong.module';\n\nexport const SHARED_MATERIAL_TESTING_PAGES: TestingPage[] = [\n  { label: 'Shared Material components', divider: true },\n  { label: 'Common field', page: '/testing/shared/common' },\n  { label: 'Date/Time field', page: '/testing/shared/datetime' },\n  { label: 'Date field', page: '/testing/shared/date' },\n  { label: 'Date short field', page: '/testing/shared/dateshort' },\n  { label: 'Duration field', page: '/testing/shared/duration' },\n  { label: 'Autocomplete field', page: '/testing/shared/autocomplete' },\n  { label: 'Chips field', page: '/testing/shared/chips' },\n  { label: 'Boolean field', page: '/testing/shared/boolean' },\n  { label: 'Lat/Long field', page: '/testing/shared/latlong' },\n  { label: 'Swipe field', page: '/testing/shared/swipe' },\n  { label: 'Custom field example', page: '/testing/shared/custom' },\n  //{ label: 'Numeric pad component', page: '/testing/shared/numpad' },\n\n  { label: 'Shared directives', divider: true },\n  { label: 'Badge directive', page: '/testing/shared/badge' },\n\n  { label: 'Shared utils', divider: true },\n  { label: 'Observable', page: '/testing/shared/observable' },\n  { label: 'Maskito', page: '/testing/shared/maskito' },\n];\n\nconst routes: Routes = [\n  {\n    path: '',\n    pathMatch: 'full',\n    component: SharedTestsPage,\n  },\n  {\n    path: 'common',\n    pathMatch: 'full',\n    component: MatCommonTestPage,\n  },\n  {\n    path: 'datetime',\n    pathMatch: 'full',\n    component: DateTimeTestPage,\n  },\n  {\n    path: 'date',\n    pathMatch: 'full',\n    component: DateTestPage,\n  },\n  {\n    path: 'dateshort',\n    pathMatch: 'full',\n    component: DateShortTestPage,\n  },\n  {\n    path: 'duration',\n    pathMatch: 'full',\n    component: DurationTestPage,\n  },\n  {\n    path: 'autocomplete',\n    pathMatch: 'full',\n    component: AutocompleteTestPage,\n  },\n  {\n    path: 'boolean',\n    pathMatch: 'full',\n    component: BooleanTestPage,\n  },\n  {\n    path: 'latlong',\n    pathMatch: 'full',\n    component: LatLongTestPage,\n  },\n  {\n    path: 'custom',\n    pathMatch: 'full',\n    component: FormFieldCustomControlExample,\n  },\n  // {\n  //   path: 'numpad',\n  //   pathMatch: 'full',\n  //   component: NumpadTestPage\n  // },\n  {\n    path: 'swipe',\n    pathMatch: 'full',\n    component: SwipeTestPage,\n  },\n  {\n    path: 'chips',\n    pathMatch: 'full',\n    component: ChipsTestPage,\n  },\n  {\n    path: 'badge',\n    pathMatch: 'full',\n    component: MatBadgeTestPage,\n  },\n  {\n    path: 'observable',\n    pathMatch: 'full',\n    component: ObservableTestPage,\n  },\n  {\n    path: 'maskito',\n    pathMatch: 'full',\n    component: MaskitoTestPage,\n  },\n];\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ReactiveFormsModule,\n    SharedMaterialModule,\n    TranslateModule.forChild(),\n    RouterModule.forChild(routes),\n    SharedPipesModule,\n    SharedBadgeModule,\n    FormsModule,\n    MaskitoDirective,\n    SharedMatLatLongModule,\n  ],\n  declarations: [\n    MatCommonTestPage,\n    DateTimeTestPage,\n    DateTestPage,\n    DateShortTestPage,\n    DurationTestPage,\n    AutocompleteTestPage,\n    BooleanTestPage,\n    LatLongTestPage,\n    //NumpadTestPage,\n    SwipeTestPage,\n    ChipsTestPage,\n    MatBadgeTestPage,\n    ObservableTestPage,\n    MaskitoTestPage,\n  ],\n  exports: [\n    SharedMaterialModule,\n    RouterModule,\n    MatCommonTestPage,\n    DateTimeTestPage,\n    DateTestPage,\n    DateShortTestPage,\n    DurationTestPage,\n    AutocompleteTestPage,\n    BooleanTestPage,\n    LatLongTestPage,\n    //NumpadTestPage,\n    SwipeTestPage,\n    ChipsTestPage,\n    MatBadgeTestPage,\n    ObservableTestPage,\n    MaskitoTestPage,\n  ],\n})\nexport class MaterialTestingModule {}\n","import { Component, Injector } from '@angular/core';\nimport { ShowToastOptions, Toasts } from './toasts';\n\n@Component({\n  selector: 'toast-testing',\n  templateUrl: 'toast.testing.html',\n})\nexport class ToastTestingPage {\n  protected options: ShowToastOptions = {\n    showCloseButton: false,\n    duration: -1, // 5000, // 5s\n    header: undefined,\n    message: 'This is a message text !',\n    positionAnchor: 'header',\n    position: 'top',\n  };\n\n  constructor(private injector: Injector) {}\n\n  showToast(opts?: ShowToastOptions) {\n    return Toasts.showSimple(this.injector, {\n      ...this.options,\n      position: this.options.position === ('auto' as any) ? null : this.options.position,\n      ...opts,\n    });\n  }\n\n  showInfo(opts?: ShowToastOptions) {\n    return this.showToast({\n      type: 'info',\n      ...opts,\n    });\n  }\n\n  showWarning(opts?: ShowToastOptions) {\n    return this.showToast({\n      type: 'warning',\n      ...opts,\n    });\n  }\n\n  showError(opts?: ShowToastOptions) {\n    return this.showToast({\n      type: 'error',\n      ...opts,\n    });\n  }\n\n  toggleCloseButton() {\n    this.options.showCloseButton = !this.options.showCloseButton;\n  }\n}\n","<ion-toolbar color=\"primary\" id=\"header\">\n  <ion-title>Toasts</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n  <p>Toast examples:</p>\n\n  <ion-button (click)=\"showToast()\" color=\"dark\">default</ion-button>\n\n  <ion-button (click)=\"showInfo()\" color=\"secondary\">info</ion-button>\n\n  <ion-button (click)=\"showWarning()\" color=\"accent\">warning</ion-button>\n\n  <ion-button (click)=\"showError()\" color=\"danger\">error</ion-button>\n\n  <ion-button (click)=\"showInfo({ message: 'This is <b>HTML</b> text' })\" color=\"danger\">message with HTML</ion-button>\n  <br />\n\n  <ion-list>\n    <ion-item>\n      <ion-label>Header (optional)</ion-label>\n      <ion-input [(ngModel)]=\"options.header\"></ion-input>\n    </ion-item>\n    <ion-item>\n      <ion-label>Message</ion-label>\n      <ion-input [(ngModel)]=\"options.message\"></ion-input>\n    </ion-item>\n\n    <ion-item>\n      <ion-checkbox [(ngModel)]=\"options.showCloseButton\">\n        <ion-label>Close button ?</ion-label>\n      </ion-checkbox>\n    </ion-item>\n\n    <ion-item>\n      <ion-label>Duration</ion-label>\n      <ion-input [(ngModel)]=\"options.duration\"></ion-input>\n    </ion-item>\n\n    <ion-item>\n      <ion-label>Position</ion-label>\n      <ion-select [(ngModel)]=\"options.position\">\n        <ion-select-option value=\"auto\">auto</ion-select-option>\n        <ion-select-option value=\"top\">top</ion-select-option>\n        <ion-select-option value=\"bottom\">bottom</ion-select-option>\n        <ion-select-option value=\"middle\">middle</ion-select-option>\n      </ion-select>\n    </ion-item>\n  </ion-list>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { IonicModule } from '@ionic/angular';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ToastTestingPage } from './toast.testing';\nimport { FormsModule } from '@angular/forms';\n\nconst routes: Routes = [\n  {\n    path: 'toast',\n    pathMatch: 'full',\n    component: ToastTestingPage,\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, IonicModule, TranslateModule.forChild(), RouterModule.forChild(routes), FormsModule],\n  declarations: [ToastTestingPage],\n  exports: [RouterModule, ToastTestingPage],\n})\nexport class ToastTestingModule {}\n","import { Component } from '@angular/core';\nimport { PopoverController } from '@ionic/angular';\nimport { UploadFilePopoverOptions } from '../upload-file-popover.component';\nimport { Observable, Subject, timer } from 'rxjs';\nimport { HttpEventType, HttpResponse } from '@angular/common/http';\nimport { map, takeUntil } from 'rxjs/operators';\nimport { sleep } from '../../functions';\nimport { FileEvent } from '../upload-file.model';\nimport { FilesUtils } from '../../file/file.utils';\n\n@Component({\n  selector: 'upload-file-testing',\n  templateUrl: 'upload-file.testing.html',\n})\nexport class UploadFileTestingPage {\n  constructor(private popoverController: PopoverController) {}\n\n  async showPopover(event: Event, opts?: Partial<UploadFilePopoverOptions<any>>) {\n    const { data } = await FilesUtils.showUploadPopover(this.popoverController, event, {\n      uploadFn: (file) => this.uploadFile(file),\n      deleteFn: (file) => this.deleteFile(file),\n      ...opts,\n    });\n\n    const filenames = (data || []).map((file) => file.response?.body?.finalName);\n    console.info('Popover result: ', filenames);\n  }\n\n  /**\n   * Simulate a upload function, with progression\n   *\n   * @param file\n   */\n  uploadFile(file: File): Observable<FileEvent<{ finalName: string }>> {\n    const $stop = new Subject<void>();\n    const loadStep = file.size / 10;\n    let loaded = 0;\n    return timer(0, 250).pipe(\n      takeUntil($stop),\n      map(() => {\n        // pause in middle\n        // if (loaded > 0) return { type: HttpEventType.UploadProgress, total: file.size, loaded };\n\n        loaded += loadStep;\n\n        // Return progression\n        if (loaded < file.size) {\n          return { type: HttpEventType.UploadProgress, total: file.size, loaded };\n        }\n\n        // Stop the timer\n        setTimeout(() => $stop.next(), 1000);\n\n        // Return final response\n        return new HttpResponse({ body: { finalName: file.name } });\n      })\n    );\n  }\n\n  async deleteFile(file: File): Promise<boolean> {\n    console.info('[testing] Simulate remote deletion... (waiting 2s)');\n    await sleep(2000);\n    return true;\n  }\n}\n","<ion-toolbar color=\"primary\">\n  <ion-title>File upload</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n  <p>Popover examples:</p>\n\n  <ion-button (click)=\"showPopover($event, { uniqueFile: true })\" color=\"tertiary\">\n    <span translate>COMMON.BTN_IMPORT</span>\n    &nbsp;(unique file)\n  </ion-button>\n\n  <ion-button (click)=\"showPopover($event, { uniqueFile: false })\" color=\"tertiary\">\n    <span translate>COMMON.BTN_IMPORT</span>\n    &nbsp;(many files)\n  </ion-button>\n\n  <ion-button (click)=\"showPopover($event, { uniqueFile: false, instantUpload: true })\" color=\"tertiary\">\n    <span translate>COMMON.BTN_IMPORT</span>\n    &nbsp;(instant upload)\n  </ion-button>\n\n  <ion-button\n    (click)=\"showPopover($event, { uniqueFile: false, instantUpload: true, maxParallelUpload: 3 })\"\n    color=\"tertiary\"\n  >\n    <span translate>COMMON.BTN_IMPORT</span>\n    &nbsp;(max parallel upload)\n  </ion-button>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { IonicModule } from '@ionic/angular';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { UploadFileTestingPage } from './upload-file.testing';\n\nconst routes: Routes = [\n  {\n    path: 'upload-file',\n    pathMatch: 'full',\n    component: UploadFileTestingPage,\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, IonicModule, TranslateModule.forChild(), RouterModule.forChild(routes)],\n  declarations: [UploadFileTestingPage],\n  exports: [RouterModule, UploadFileTestingPage],\n})\nexport class UploadFileTestingModule {}\n","import { Injectable } from '@angular/core';\n\nimport { SortDirection } from '@angular/material/sort';\nimport { map } from 'rxjs/operators';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { StartableService } from '../../../services/startable-service.class';\nimport { EntitiesServiceWatchOptions, IEntitiesService, LoadResult } from '../../../services/entity-service.class';\nimport { Platform } from '@ionic/angular';\nimport { isNil, isNotNil, removeDuplicatesFromArray } from '../../../functions';\nimport { Entity, EntityUtils } from '../../../../core/services/model/entity.model';\nimport { EntityClass } from '../../../../core/services/model/entity.decorators';\nimport { Image } from '../../image.model';\nimport { EntityFilter } from '../../../../core/services/model/filter.model';\n\n// @dynamic\n@EntityClass({ typename: 'ImageAttachmentVO' })\nexport class ImageAttachment extends Entity<ImageAttachment> implements Image {\n  static fromObject: (source: any, opts?: any) => ImageAttachment;\n\n  dataUrl: string = null;\n  url: string = null;\n  title: string = null;\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source, opts);\n    this.url = source.url;\n    this.dataUrl = source.dataUrl;\n    this.title = source.title;\n  }\n}\n\n// @dynamic\n@EntityClass({ typename: 'ImageAttachmentFilterVO' })\nexport class ImageAttachmentFilter extends EntityFilter<ImageAttachmentFilter, ImageAttachment> {\n  static fromObject: (source: any, opts?: any) => ImageAttachmentFilter;\n}\n\n@Injectable()\nexport class ImageAttachmentService extends StartableService implements IEntitiesService<ImageAttachment, ImageAttachmentFilter> {\n  $images = new BehaviorSubject<Partial<ImageAttachment>[]>([\n    ImageAttachment.fromObject({ id: 0, url: 'https://test.sumaris.net/assets/img/bg/ray-1.jpg', title: 'ray #1' }),\n    ImageAttachment.fromObject({ id: 1, url: 'https://test.sumaris.net/assets/img/bg/ray-2.jpg', title: 'ray #2' }),\n    ImageAttachment.fromObject({ id: 2, url: 'https://test.sumaris.net/assets/img/bg/ray-2.jpg', title: 'ray #3' }),\n    ImageAttachment.fromObject({ id: 3, url: 'https://test.sumaris.net/assets/img/bg/ray-2.jpg', title: 'ray #4' }),\n    ImageAttachment.fromObject({ id: 4, url: 'https://test.sumaris.net/assets/img/bg/ray-2.jpg', title: 'ray #5' }),\n    ImageAttachment.fromObject({ id: 5, url: 'https://test.sumaris.net/assets/img/bg/ray-2.jpg', title: 'ray #6' }),\n    ImageAttachment.fromObject({ id: 6, url: 'https://test.sumaris.net/assets/img/bg/ray-2.jpg', title: 'ray #7' }),\n  ]);\n\n  constructor(protected platform: Platform) {\n    super(platform);\n    console.debug('[gallery-testing-service] Create service');\n  }\n\n  protected ngOnStart(): Promise<any> {\n    return Promise.resolve(undefined);\n  }\n\n  watchAll(\n    offset: number,\n    size: number,\n    sortBy?: string,\n    sortDirection?: SortDirection,\n    filter?: ImageAttachmentFilter,\n    opts?: EntitiesServiceWatchOptions & { query?: any }\n  ): Observable<LoadResult<ImageAttachment>> {\n    console.debug('[gallery-testing-service] Watching images...');\n    return this.$images.pipe(\n      map((images) => {\n        let data = (images || []).map(ImageAttachment.fromObject);\n\n        data = EntityUtils.sort(data, sortBy, sortDirection);\n\n        console.debug(`[gallery-testing-service] Loaded ${data.length} images...`);\n\n        return { data, total: data.length };\n      })\n    );\n  }\n\n  async saveAll(entities: ImageAttachment[]): Promise<any[]> {\n    console.debug('[gallery-service-testing] Saving images...' + JSON.stringify(entities));\n    if (!entities) return [];\n\n    const existingImages = this.$images.value;\n    let currentId = existingImages.reduce((res, image) => Math.max(res, +image?.id || 0), 0);\n    entities\n      .filter((item) => isNil(item.id))\n      .forEach((item) => {\n        item.id = ++currentId;\n      });\n    this.$images.next(removeDuplicatesFromArray([...existingImages, ...entities], 'id'));\n  }\n\n  async deleteAll(entities: ImageAttachment[]): Promise<any> {\n    const deletedIds = (entities || []).map((item) => item.id).filter(isNotNil);\n    const filteredData = this.$images.value.filter((item) => !deletedIds.includes(item.id));\n    this.$images.next(filteredData);\n  }\n\n  asFilter(filter: any) {\n    return ImageAttachmentFilter.fromObject(filter);\n  }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { ImageAttachment, ImageAttachmentService } from './gallery.service.testing';\nimport { EntitiesTableDataSource } from '../../../../core/table/entities-table-datasource.class';\nimport { Subscription } from 'rxjs';\nimport { ImageAttachmentFilter } from './gallegry.model.testing';\nimport { ImageGallerySlideshowMode } from '../image-gallery.component';\n\n@Component({\n  selector: 'app-gallery-test-page',\n  templateUrl: './gallery.testing.html',\n  providers: [{ provide: ImageAttachmentService, useClass: ImageAttachmentService }],\n})\nexport class GalleryTestPage implements OnInit, OnDestroy {\n  private _subscription = new Subscription();\n  readonly dataSource: EntitiesTableDataSource<ImageAttachment, ImageAttachmentFilter>;\n  protected slideshowMode: ImageGallerySlideshowMode = 'modal';\n  protected enableSlideshowLoop = true;\n  protected debug = false;\n\n  constructor(\n    protected dataService: ImageAttachmentService,\n    protected route: ActivatedRoute\n  ) {\n    this.dataSource = new EntitiesTableDataSource<ImageAttachment, ImageAttachmentFilter>(ImageAttachment, this.dataService, null, {\n      saveBeforeDelete: true,\n      saveOnlyDirtyRows: false,\n    });\n    this.debug = this.route.snapshot.queryParamMap.get('debug') === 'true';\n  }\n\n  ngOnInit() {\n    this.slideshowMode = (this.route.snapshot.queryParamMap.get('zoomPresentation') as ImageGallerySlideshowMode) || 'modal';\n    this._subscription.add(this.dataSource.watchAll(0, 100, null, null, null).subscribe());\n  }\n\n  ngOnDestroy() {\n    this._subscription.unsubscribe();\n  }\n\n  save() {\n    this.dataSource.save();\n  }\n\n  toggleZoomPresentation() {\n    this.slideshowMode = this.slideshowMode === 'modal' ? 'inline' : 'modal';\n  }\n\n  toggleSlideshowLoop() {\n    this.enableSlideshowLoop = !this.enableSlideshowLoop;\n  }\n\n  toggleDebug() {\n    this.debug = !this.debug;\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Image gallery</ion-title>\n\n    <ion-buttons slot=\"end\">\n      <button mat-icon-button [matMenuTriggerFor]=\"toolbarOptionsMenu\">\n        <mat-icon>more_vert</mat-icon>\n      </button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<mat-menu #toolbarOptionsMenu=\"matMenu\" xPosition=\"after\">\n  <ng-template matMenuContent>\n    <button mat-menu-item (click)=\"toggleZoomPresentation()\">\n      <mat-icon>{{ slideshowMode === 'modal' ? 'check' : '' }}</mat-icon>\n      <ion-label translate>IMAGE.GALLERY.BTN_ENABLE_MODAL_ZOOM</ion-label>\n    </button>\n\n    <button mat-menu-item (click)=\"toggleSlideshowLoop()\">\n      <mat-icon>{{ enableSlideshowLoop ? 'check' : '' }}</mat-icon>\n      <ion-label translate>IMAGE.GALLERY.BTN_ENABLE_LOOP</ion-label>\n    </button>\n\n    <button mat-menu-item (click)=\"toggleDebug()\">\n      <mat-icon>{{ debug ? 'check' : '' }}</mat-icon>\n      <ion-label translate>COMMON.DEBUG.BTN_ENABLE_DEBUG</ion-label>\n    </button>\n  </ng-template>\n</mat-menu>\n\n<ion-content>\n  <!-- DEBUG -->\n  @if (debug) {\n    <app-debug title=\"Galley\">\n      <ion-grid>\n        <ion-row>\n          <ion-col>gallery.count: {{ gallery.rows?.length }}</ion-col>\n        </ion-row>\n      </ion-grid>\n    </app-debug>\n  }\n\n  <app-image-gallery\n    #gallery\n    [dataSource]=\"dataSource\"\n    [slideshowMode]=\"slideshowMode\"\n    [enableSlideshowLoop]=\"enableSlideshowLoop\"\n    [inlineZoomHeight]=\"'100%'\"\n    (onAfterAddRows)=\"save()\"\n    (onAfterEditRow)=\"save()\"\n    [debug]=\"debug\"\n  ></app-image-gallery>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { GalleryTestPage } from './gallery.testing';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\nimport { ImageGalleryModule } from '../image-gallery.module';\nimport { SharedDebugModule } from '../../../debug/debug.module';\nimport { SharedMaterialModule } from '../../../material/material.module';\n\nconst routes: Routes = [\n  {\n    path: 'gallery',\n    pathMatch: 'full',\n    component: GalleryTestPage,\n  },\n];\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    ImageGalleryModule,\n    SharedMaterialModule,\n    TranslateModule.forChild(),\n    RouterModule.forChild(routes),\n    TranslateModule.forChild(),\n    SharedDebugModule,\n  ],\n  declarations: [\n    // Components\n    GalleryTestPage,\n  ],\n  exports: [\n    RouterModule,\n\n    // Components\n    GalleryTestPage,\n  ],\n})\nexport class ImageGalleryTestingModule {}\n","import { Component } from '@angular/core';\nimport { AudioProvider } from './audio';\n\n@Component({\n  selector: 'audio-testing',\n  templateUrl: 'audio.testing.html',\n})\nexport class AudioTestingPage {\n  constructor(private audio: AudioProvider) {}\n\n  playBeepConfirm() {\n    return this.audio.playBeepConfirm();\n  }\n  playBeepError() {\n    return this.audio.playBeepError();\n  }\n  playStartupSound() {\n    return this.audio.playStartupSound();\n  }\n  playBeepNotification() {\n    return this.audio.playBeepNotification();\n  }\n\n  vibrate(duration?: number | number[]) {\n    return this.audio.vibrate(duration || [1000, 500, 1000, 500, 1000]);\n  }\n}\n","<ion-toolbar color=\"primary\">\n  <ion-title>Toasts</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n  <p>Toast examples:</p>\n\n  <ion-button (click)=\"playStartupSound()\" color=\"dark\">\n    <ion-icon name=\"play\" slot=\"start\"></ion-icon>\n    Startup\n  </ion-button>\n\n  <ion-button (click)=\"playBeepConfirm()\" color=\"success\">\n    <ion-icon name=\"play\" slot=\"start\"></ion-icon>\n    Confirmation\n  </ion-button>\n\n  <ion-button (click)=\"playBeepNotification()\" color=\"tertiary\">\n    <ion-icon name=\"play\" slot=\"start\"></ion-icon>\n    Notification\n  </ion-button>\n\n  <ion-button (click)=\"playBeepError()\" color=\"accent\">\n    <ion-icon name=\"play\" slot=\"start\"></ion-icon>\n    Error\n  </ion-button>\n\n  <ion-button (click)=\"vibrate()\" color=\"accent\">Vibrate (many time)</ion-button>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { IonicModule } from '@ionic/angular';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { AudioTestingPage } from './audio.testing';\n\nconst routes: Routes = [\n  {\n    path: 'audio',\n    pathMatch: 'full',\n    component: AudioTestingPage,\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, IonicModule, TranslateModule.forChild(), RouterModule.forChild(routes)],\n  declarations: [AudioTestingPage],\n  exports: [RouterModule, AudioTestingPage],\n})\nexport class AudioTestingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\nimport { TestingPage } from '../testing/tests.page';\n\nexport const SHARED_STORAGE_TESTING_PAGES: TestingPage[] = [{ label: 'Storage explorer', page: '/testing/shared/storage' }];\n\nconst routes: Routes = [\n  {\n    path: 'storage',\n    loadChildren: () => import('./storage-explorer.testing-routing.module').then((m) => m.StorageExplorerTestingRoutingModule),\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, RouterModule.forChild(routes)],\n  exports: [RouterModule],\n})\nexport class StorageExplorerTestingModule {}\n","import { AfterViewInit, Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\nimport { MenuService } from '../menu.service';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { AlertController, NavController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { DateUtils } from '../../../shared/dates';\nimport { toBoolean } from '../../../shared/functions';\nimport { MatTabGroup } from '@angular/material/tabs';\nimport { AppTabEditor } from '../../form/entity/tab-editor.class';\n\n@Component({\n  selector: 'app-testing-menu',\n  templateUrl: './menu.testing.html',\n  styleUrls: ['./menu.testing.scss'],\n})\nexport class MenuTestingPage extends AppTabEditor implements OnInit, OnDestroy, AfterViewInit {\n  protected logPrefix = '[menu-testing] ';\n  protected childPath = '';\n  protected thirdTabTitle = '';\n  protected parentPath: string = null;\n  protected path: string = null;\n  protected showOtherLinks = true;\n  protected showThirdTab = false;\n\n  protected $title = new Subject<string>();\n  protected $secondTabTitle = new Subject<string>();\n  protected $thirdTabBadge = new BehaviorSubject<number>(1);\n  protected _subSelectedTabIndex = 0;\n\n  subTabCount: number;\n\n  @Input() set subSelectedTabIndex(value: number) {\n    this.setSubSelectedTabIndex(value);\n  }\n  get subSelectedTabIndex(): number {\n    return this._subSelectedTabIndex;\n  }\n\n  @Output() readonly subSelectedTabIndexChange = new EventEmitter<number>();\n\n  @ViewChild('subTabGroup', { static: true }) subTabGroup: MatTabGroup;\n\n  protected set title(value: string) {\n    this.$title.next(value);\n  }\n\n  protected set secondTabTitle(value: string) {\n    this.$secondTabTitle.next(value);\n  }\n\n  constructor(\n    route: ActivatedRoute, // Modal editor give 'null'\n    router: Router,\n    navController: NavController,\n    alertCtrl: AlertController,\n    translate: TranslateService,\n    protected menuService: MenuService\n  ) {\n    super(route, router, navController, alertCtrl, translate, {\n      tabCount: 4,\n    });\n  }\n\n  ngOnInit() {\n    console.debug(`${this.logPrefix} Init page...`);\n\n    super.ngOnInit();\n\n    this.showThirdTab = this.route.snapshot.queryParamMap.get('tab') === '2';\n  }\n\n  ngAfterViewInit() {\n    super.ngAfterViewInit();\n    this.initSubMenu();\n  }\n\n  ngOnDestroy() {\n    super.ngOnDestroy();\n    console.debug(`${this.logPrefix}Destroying...`);\n  }\n\n  load(id?: number, options?: any): Promise<void> {\n    return Promise.resolve(undefined);\n  }\n\n  get isNewData(): boolean {\n    return false;\n  }\n\n  reload(): Promise<void> {\n    return Promise.resolve(undefined);\n  }\n\n  save(event: Event | undefined, options: any): Promise<boolean> {\n    return Promise.resolve(false);\n  }\n\n  changeTitle(event?: UIEvent) {\n    this.title = '';\n    setTimeout(() => {\n      const time = DateUtils.moment().format('HH:mm:ss');\n      this.title = `${this.getDefaultTitle()} <b>${time}</b>`;\n    }, 2000);\n  }\n\n  changeSecondTabTitle(event?: UIEvent) {\n    const time = DateUtils.moment().format('HH:mm:ss');\n    this.secondTabTitle = `<small>${time}<br/></small>Second`;\n  }\n\n  addSubMenuItem(event?: UIEvent) {\n    this.menuService.addSubMenuItem({\n      title: 'Fake',\n      parentPath: this.path,\n      path: this.path + '/fake',\n      //pinned: true\n    });\n  }\n\n  addOutsideRouteSubMenuItem(event?: UIEvent, pinned?: boolean) {\n    this.menuService.addSubMenuItem({\n      title: 'Fake',\n      parentPath: '/admin/users',\n      path: '/admin/users/fake',\n      pinned: toBoolean(pinned, false),\n    });\n  }\n\n  protected enableMenu(value: boolean) {\n    this.menuService.enable(value);\n  }\n  protected toggleSplitPaneWhen() {\n    this.menuService.toggleSplitPaneWhen();\n  }\n  protected async initSubMenu() {\n    this.title = await this.computeTitle();\n    this.secondTabTitle = 'Others';\n    this.thirdTabTitle = 'Third';\n    this.parentPath = '/testing';\n    this.path = this.parentPath + '/shared/menu';\n    this.childPath = this.path + '/others';\n    console.debug(`${this.logPrefix} Setup with`, { path: this.path, parentPath: this.parentPath });\n    this.markForCheck();\n  }\n\n  protected getFirstInvalidTabIndex(): number {\n    return 0;\n  }\n\n  protected getDefaultTitle() {\n    return 'Menu';\n  }\n\n  protected async computeTitle() {\n    return this.getDefaultTitle();\n  }\n\n  setSubSelectedTabIndex(value: number) {\n    // Fix value\n    if (value < 0) {\n      value = 0;\n    } else if (value > this.tabCount - 1) {\n      console.warn(`[menu-other] Invalid tab index ${value}. Max value is ${this.subTabCount - 1}`);\n      value = this._subSelectedTabIndex;\n    }\n\n    this._subSelectedTabIndex = value;\n    this.subSelectedTabIndexChange.next(value);\n\n    if (this.subTabGroup) {\n      this.subTabGroup.selectedIndex = value;\n      this.markForCheck();\n      // Wait tab change in UI, before realign ink tab\n      setTimeout(() => this.subTabGroup.realignInkBar(), 200);\n    }\n  }\n\n  protected incrementThirdTabBadge() {\n    console.log('incrementThirdTabBadge');\n    this.$thirdTabBadge.next(this.$thirdTabBadge.value + 1);\n  }\n}\n","<app-toolbar [defaultBackHref]=\"parentPath\">\n  <ion-title [innerHTML]=\"$title | async\"></ion-title>\n</app-toolbar>\n\n<ion-content>\n  <mat-tab-group\n    #tabGroup\n    [(selectedIndex)]=\"selectedTabIndex\"\n    (selectedTabChange)=\"onTabChange($event)\"\n    class=\"mat-mdc-tab-disabled-hidden\"\n    dynamicHeight\n    [mat-stretch-tabs]=\"toggleStretchTab.checked\"\n  >\n    <!-- TAB: 1 -->\n    <mat-tab\n      label=\"Details\"\n      class=\"ion-padding\"\n      appSubMenuTab\n      [subMenuTitle]=\"($title | async) || ''\"\n      [parentPath]=\"parentPath\"\n    >\n      <ng-template mat-tab-label>\n        <mat-icon>information-circle</mat-icon>\n        <ion-label>Details</ion-label>\n      </ng-template>\n\n      <div class=\"ion-padding\">\n        <p>A first tab</p>\n\n        <p [class.cdk-visually-hidden]=\"showThirdTab\">\n          <ion-toggle #toggleThird>Toggle Third Tab</ion-toggle>\n        </p>\n\n        <p>\n          <ion-toggle #toggleStretchTab>Stretch Tabs</ion-toggle>\n        </p>\n\n        <p>\n          <ion-button (click)=\"changeTitle($event)\">Change page title</ion-button>\n\n          <ion-button (click)=\"addSubMenuItem($event)\">Add sub menu other 3</ion-button>\n\n          <ion-button (click)=\"addOutsideRouteSubMenuItem($event, true)\">\n            Add sub menu (outside route) - pinned\n          </ion-button>\n\n          <ion-button (click)=\"addOutsideRouteSubMenuItem($event, false)\">\n            Add sub menu (outside route) - not pinned\n          </ion-button>\n        </p>\n\n        <p>\n          &nbsp;&nbsp;\n          <ion-button (click)=\"enableMenu(false)\" *ngIf=\"menuService.enabled | async\">Disable menu</ion-button>\n          <ion-button (click)=\"enableMenu(true)\" *ngIf=\"(menuService.enabled | async) !== true\">Enable menu</ion-button>\n          <ion-button (click)=\"toggleSplitPaneWhen()\" [disabled]=\"(menuService.enabled | async) !== true\">\n            Toggle split pane\n          </ion-button>\n        </p>\n      </div>\n    </mat-tab>\n\n    <!-- TAB: 2 -->\n    <mat-tab\n      label=\"Second\"\n      class=\"ion-padding\"\n      appSubMenuTab\n      [subMenuIcon]=\"{ icon: 'settings' }\"\n      [subMenuTitle]=\"$secondTabTitle | async\"\n    >\n      <ng-template mat-tab-label>\n        <mat-icon><ion-icon name=\"settings\"></ion-icon></mat-icon>\n        <ion-label [innerHTML]=\"$secondTabTitle | async\"></ion-label>\n      </ng-template>\n\n      <div class=\"ion-padding\">\n        <p>A second tab</p>\n\n        <p *ngIf=\"showOtherLinks\">\n          Navigate to :\n          <a [routerLink]=\"childPath + '/1'\">{{ childPath }}/1</a>\n          <br />\n          Navigate to :\n          <a [routerLink]=\"childPath + '/2'\">{{ childPath }}/2</a>\n        </p>\n\n        <p>\n          <ion-button (click)=\"changeSecondTabTitle($event)\">Change tab label</ion-button>\n        </p>\n      </div>\n    </mat-tab>\n\n    <!-- TAB: 3 -->\n    <mat-tab\n      [label]=\"thirdTabTitle\"\n      class=\"ion-padding\"\n      [disabled]=\"!showThirdTab && !toggleThird.checked\"\n      appSubMenuTab\n      [subMenuBadge]=\"$thirdTabBadge | async\"\n      [subMenuIcon]=\"{ icon: 'none' }\"\n    >\n      <ng-template mat-tab-label>\n        <ion-label [matBadge]=\"$thirdTabBadge | async\" matBadgeColor=\"primary\" matBadgeOverlap=\"false\" matBadgeSize=\"small\">\n          {{ thirdTabTitle }}\n        </ion-label>\n      </ng-template>\n\n      <div class=\"ion-padding\">\n        <p>\n          A third tab (with a badge)\n        </p>\n        <ion-button (click)=\"incrementThirdTabBadge()\">Increment badge count</ion-button>\n      </div>\n    </mat-tab>\n\n    <!-- TAB: 4 -->\n    <mat-tab appSubMenuTab [subMenuIcon]=\"{ icon: 'person' }\" label=\"Sub Tab\" class=\"ion-padding\">\n      <ng-template mat-tab-label>\n        <mat-icon><ion-icon name=\"person\"></ion-icon></mat-icon>\n        <ion-label>Sub Tab</ion-label>\n      </ng-template>\n\n      <mat-tab-group\n        #subTabGroup\n        [(selectedIndex)]=\"subSelectedTabIndex\"\n        (selectedTabChange)=\"onTabChange($event, 'subtab')\"\n        class=\"mat-mdc-tab-disabled-hidden\"\n        dynamicHeight\n      >\n        <mat-tab label=\"Sub1\" class=\"ion-padding\">\n          <ng-template mat-tab-label>\n            <ion-label>Sub1</ion-label>\n          </ng-template>\n\n          <div class=\"ion-padding\">\n            <p>First SubTab</p>\n          </div>\n        </mat-tab>\n\n        <mat-tab label=\"Sub2\" class=\"ion-padding\">\n          <ng-template mat-tab-label>\n            <ion-label>Sub2</ion-label>\n          </ng-template>\n\n          <div class=\"ion-padding\">\n            <p>Second SubTab</p>\n          </div>\n        </mat-tab>\n      </mat-tab-group>\n    </mat-tab>\n  </mat-tab-group>\n</ion-content>\n","import {Component} from '@angular/core';\nimport {ActivatedRoute, Router} from '@angular/router';\nimport {AlertController, NavController} from '@ionic/angular';\nimport {TranslateService} from '@ngx-translate/core';\nimport {sleep} from '../../../shared/functions';\nimport {MenuService} from '../menu.service';\nimport {MenuTestingPage} from './menu.testing';\n\n@Component({\n  selector: 'app-testing-menu-other',\n  templateUrl: './menu.testing.html',\n  styleUrls: ['./menu.testing.scss'],\n})\nexport class OtherMenuTestingPage extends MenuTestingPage {\n  constructor(\n    route: ActivatedRoute, // Modal editor give 'null'\n    router: Router,\n\n    navController: NavController,\n    alertCtrl: AlertController,\n    translate: TranslateService,\n    menuService: MenuService\n  ) {\n    super(route, router, navController, alertCtrl, translate, menuService);\n    this.logPrefix = '[menu-testing-other] ';\n    this.showOtherLinks = false;\n    this.showThirdTab = true;\n    this.subTabCount = 2;\n  }\n\n  async initSubMenu() {\n    this.secondTabTitle = 'Second';\n    this.parentPath = '/testing/shared/menu?tab=1';\n    this.childPath = '';\n    this.path = '/testing/shared/menu/others/' + this.route.snapshot.paramMap.get('otherId');\n    console.debug(`${this.logPrefix} Setup with`, { path: this.path, parentPath: this.parentPath });\n    this.thirdTabTitle = 'Third';\n    this.markForCheck();\n\n    this.title = await this.computeTitle();\n    this.markForCheck();\n  }\n\n  protected getDefaultTitle(): string {\n    return 'Other';\n  }\n\n  protected async computeTitle(): Promise<string> {\n    // Load title (with a delay (e.g. when loading data)\n    await sleep(2000);\n\n    const otherId = this.route.snapshot.paramMap.get('otherId');\n\n    return this.getDefaultTitle() + ' ' + otherId;\n  }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\nimport { MenuTestingPage } from './menu.testing';\nimport { AppMenuModule } from '../menu.module';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { OtherMenuTestingPage } from './menu-other.testing';\nimport { AuthGuardService } from '../../services/auth-guard.service';\n\nconst routes: Routes = [\n  {\n    path: 'menu',\n    data: {\n      test: 'menu',\n    },\n    children: [\n      {\n        path: '',\n        pathMatch: 'full',\n        component: MenuTestingPage,\n        data: {\n          test: 'empty',\n        },\n      },\n      {\n        path: 'others',\n        canActivate: [AuthGuardService],\n        data: {\n          profile: 'USER',\n        },\n        children: [\n          {\n            path: ':otherId',\n            pathMatch: 'full',\n            component: OtherMenuTestingPage,\n            canActivate: [AuthGuardService],\n            data: {\n              profile: 'ADMIN',\n            },\n          },\n        ],\n      },\n    ],\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, RouterModule.forChild(routes), AppMenuModule, SharedModule],\n  declarations: [MenuTestingPage, OtherMenuTestingPage],\n  exports: [RouterModule, MenuTestingPage, OtherMenuTestingPage],\n})\nexport class MenuTestingModule {}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { MatAutocompleteFieldConfig } from '../../material/autocomplete/material.autocomplete.config';\nimport { NamedFilter } from '../named-filter.model';\nimport { LocalSettingsService } from '../../../core/services/local-settings.service';\n\nclass DummyFilter {\n  filterA: string;\n  filterB: string;\n  filterC: string;\n}\n\n@Component({\n  selector: 'app-name-filter-selector-testing',\n  templateUrl: './named-filter-selector.testing.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NamedFilterSelectorTestingPage implements OnDestroy {\n  private _subscription = new Subscription();\n  protected _filterForm: UntypedFormGroup;\n  protected mobile: boolean;\n\n  protected namedFilterContentProvider = (): object => this.filterForm.value;\n  protected namedFilterAutocompleteConfig: MatAutocompleteFieldConfig = {\n    showAllOnFocus: true,\n  };\n\n  @Input()\n  set filterForm(value: UntypedFormGroup) {\n    this.setFilterForm(value);\n  }\n\n  get filterForm(): UntypedFormGroup {\n    return this._filterForm;\n  }\n  constructor(\n    protected cd: ChangeDetectorRef,\n    protected settings: LocalSettingsService,\n    formBuilder: UntypedFormBuilder\n  ) {\n    this._filterForm = formBuilder.group({\n      filterA: [null],\n      filterB: [null],\n      filterC: [null],\n    });\n    this.mobile = settings.mobile;\n  }\n\n  ngOnDestroy(): void {\n    this._subscription.unsubscribe();\n  }\n\n  setFilterForm(filterForm: UntypedFormGroup) {\n    if (this._filterForm !== filterForm) {\n      this._filterForm = filterForm;\n      this._subscription.add(this._filterForm.statusChanges.subscribe((_) => this.markForCheck()));\n    }\n  }\n\n  getFilterValue(): any {\n    return this._filterForm.value;\n  }\n\n  protected markForCheck() {\n    this.cd.detectChanges();\n  }\n\n  protected filterImportCallback = async (namedFilter: NamedFilter): Promise<NamedFilter> => {\n    delete namedFilter.id;\n    delete namedFilter.updateDate;\n    return namedFilter;\n  };\n\n  async setFilter(filter: Partial<DummyFilter>, opts?: { emitEvent: boolean }) {\n    filter = filter || {};\n    this.filterForm.patchValue(filter, { emitEvent: false });\n    this.markForCheck();\n  }\n}\n","<app-toolbar defaultBackHref=\"testing/shared\">\n  <ion-title>Named filter selector testing page</ion-title>\n  @if (!mobile) {\n    <ion-buttons slot=\"end\">\n      <app-named-filter-selector\n        class=\"ion-padding-right ion-padding-top\"\n        [entityName]=\"'DummyEntity'\"\n        [subscriptSizing]=\"'dynamic'\"\n        [filterContentProvider]=\"namedFilterContentProvider\"\n        [filterFormDirty]=\"filterForm.dirty\"\n        [autocompleteConfig]=\"namedFilterAutocompleteConfig\"\n        [filterImportCallback]=\"filterImportCallback\"\n        (filterSelected)=\"setFilter($event)\"\n        [detectChangeOnSelectFilter]=\"true\"\n      ></app-named-filter-selector>\n    </ion-buttons>\n  }\n</app-toolbar>\n<ion-content>\n  <ion-grid>\n    <ion-row>\n      <ion-col>\n        <ion-card>\n          <ion-card-header>\n            <ion-label>Dummy filter</ion-label>\n          </ion-card-header>\n          <ion-card-content>\n            @if (mobile) {\n              <app-named-filter-selector\n                class=\"ion-padding-right ion-padding-top\"\n                [entityName]=\"'DummyEntity'\"\n                [subscriptSizing]=\"'dynamic'\"\n                [filterContentProvider]=\"namedFilterContentProvider\"\n                [filterFormDirty]=\"filterForm.dirty\"\n                [autocompleteConfig]=\"namedFilterAutocompleteConfig\"\n                [filterImportCallback]=\"filterImportCallback\"\n                (filterSelected)=\"setFilter($event)\"\n                [detectChangeOnSelectFilter]=\"true\"\n              ></app-named-filter-selector>\n            }\n\n            <form class=\"form-container\" [formGroup]=\"filterForm\">\n              <div class=\"form-group\">\n                <label for=\"filter-a\">Filter A&nbsp;</label>\n                <input type=\"text\" class=\"form-control\" id=\"filter-a\" name=\"filter-a\" formControlName=\"filterA\" />\n              </div>\n              <div class=\"form-group\">\n                <label for=\"filter-b\">Filter B&nbsp;</label>\n                <input type=\"text\" class=\"form-control\" id=\"filter-b\" name=\"filter-b\" formControlName=\"filterB\" />\n              </div>\n              <div class=\"form-group\">\n                <label for=\"filter-a\">Filter C&nbsp;</label>\n                <input type=\"text\" class=\"form-control\" id=\"filter-c\" name=\"filter-c\" formControlName=\"filterC\" />\n              </div>\n            </form>\n          </ion-card-content>\n        </ion-card>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n</ion-content>\n","import { RouterModule, Routes } from '@angular/router';\nimport { SharedModule } from '../../shared.module';\nimport { NamedFilterSelectorTestingPage } from './named-filter-selector.testing';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nconst routes: Routes = [\n  {\n    path: 'name-filter-selector',\n    pathMatch: 'full',\n    component: NamedFilterSelectorTestingPage,\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, RouterModule.forChild(routes), SharedModule],\n  declarations: [NamedFilterSelectorTestingPage],\n  exports: [RouterModule, NamedFilterSelectorTestingPage],\n})\nexport class NamedFilterSelectorTestingModule {}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject } from '@angular/core';\nimport { AppMarkdownModal } from '../markdown.modal';\nimport { ModalController } from '@ionic/angular';\nimport { Environment, ENVIRONMENT } from '../../../../environments/environment.class';\n\n@Component({\n  selector: 'app-markdown-test',\n  templateUrl: './markdown.test.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MarkdownTestPage {\n  protected markdownModalTitle = 'Markdown modal';\n  protected debug: boolean;\n\n  // URL from a starting markdown\n  //protected markdownUrl = 'http://localhost:3000/user-manual/index.md';\n  protected markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/projects/pifil/man/quick_start_guide_fr.md';\n  //protected markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/README.md';\n  //protected markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/model/index.md';\n  //protected markdownUrl = 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/model/administration/index.md';\n  //protected markdownUrl ='https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-doc/-/raw/master/projects/activity-calendar/spe/collecte_de_donnees.md';\n  //protected markdownUrl ='https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/raw/develop/doc/privacy_policy.md';\n\n  constructor(\n    private modalCtrl: ModalController,\n    private cd: ChangeDetectorRef,\n    @Inject(ENVIRONMENT) protected environment: Environment\n  ) {\n    this.debug = !environment.production;\n  }\n\n  onSubmit(event: Event, newUrl: string | number) {\n    this.markdownUrl = '' + newUrl;\n    this.cd.markForCheck();\n  }\n\n  updateInputUrl(url: string) {\n    this.markdownUrl = url;\n    this.cd.markForCheck();\n  }\n\n  openHelpModal(event: Event) {\n    return AppMarkdownModal.show(this.modalCtrl, {\n      title: this.markdownModalTitle,\n      src: this.markdownUrl,\n      canPrint: true,\n    });\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      @if (content.canGoBack) {\n        <ion-button class=\"back-button\" (click)=\"content.goBack($event)\" routerDirection=\"back\">\n          <ion-icon slot=\"icon-only\" name=\"arrow-back\"></ion-icon>\n        </ion-button>\n      } @else {\n        <ion-back-button></ion-back-button>\n      }\n    </ion-buttons>\n\n    <ion-title>Markdown test page</ion-title>\n\n    <ion-buttons slot=\"end\">\n      <ion-button slot=\"end\" (click)=\"content.print()\">\n        <ion-icon slot=\"icon-only\" name=\"print\"></ion-icon>\n      </ion-button>\n\n      <ion-button (click)=\"openHelpModal($event)\">Open in modal</ion-button>\n    </ion-buttons>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <ion-input\n    #input\n    fill=\"outline\"\n    [ngModel]=\"markdownUrl\"\n    placeholder=\"Markdown URL\"\n    label=\"URL: \"\n    (keyup.enter)=\"onSubmit($event, input.value)\"\n  >\n    <ion-button\n      slot=\"end\"\n      [fill]=\"markdownUrl !== input.value ? 'solid' : 'clear'\"\n      (click)=\"onSubmit($event, input.value)\"\n    >\n      {{ 'COMMON.BTN_OK' | translate }}\n    </ion-button>\n  </ion-input>\n\n  <app-markdown-content\n    #content\n    [src]=\"markdownUrl\"\n    enableNavigationHistory=\"true\"\n    [debug]=\"debug\"\n    (markdownUrlChange)=\"updateInputUrl($event)\"\n  ></app-markdown-content>\n</ion-content>\n","import { RouterModule, Routes } from '@angular/router';\nimport { SharedModule } from '../../shared.module';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MarkdownTestPage } from './markdown.test';\nimport { FormsModule } from '@angular/forms';\nimport { SharedMarkdownModule } from '../markdown.module';\n\nconst routes: Routes = [\n  {\n    path: 'markdown',\n    pathMatch: 'full',\n    component: MarkdownTestPage,\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, RouterModule.forChild(routes), SharedModule, FormsModule, SharedMarkdownModule],\n  declarations: [MarkdownTestPage],\n  exports: [RouterModule, MarkdownTestPage],\n})\nexport class MarkdownTestingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MaterialTestingModule, SHARED_MATERIAL_TESTING_PAGES } from './material/material.testing.module';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ToastTestingModule } from './toast/toast.testing.module';\nimport { UploadFileTestingModule } from './upload-file/testing/upload-file.testing.module';\nimport { TestingPage } from './testing/tests.page';\nimport { ImageGalleryTestingModule } from './image/gallery/testing/gallery.testing.module';\nimport { IonicModule } from '@ionic/angular';\nimport { AudioTestingModule } from './audio/audio.testing.module';\nimport { SHARED_STORAGE_TESTING_PAGES, StorageExplorerTestingModule } from './storage/storage-explorer.testing.module';\nimport { MenuTestingModule } from '../core/menu/testing/menu.testing.module';\nimport { NamedFilterSelectorTestingModule } from './named-filter/testing/named-filter.testing.module';\nimport { MarkdownTestingModule } from './markdown/testing/markdown.testing.module';\n\nexport const SHARED_TESTING_PAGES: TestingPage[] = [\n  ...SHARED_MATERIAL_TESTING_PAGES,\n\n  { label: 'Shared other components', divider: true },\n  { label: 'Image gallery', page: '/testing/shared/gallery' },\n  { label: 'Toast', page: '/testing/shared/toast' },\n  { label: 'File upload', page: '/testing/shared/upload-file' },\n  { label: 'Sound & Vibration', page: '/testing/shared/audio' },\n  { label: 'Menu', page: '/testing/shared/menu' },\n  { label: 'NamedFilterSelector', page: '/testing/shared/name-filter-selector' },\n  { label: 'Markdown', page: '/testing/shared/markdown' },\n\n  ...SHARED_STORAGE_TESTING_PAGES,\n];\n\n@NgModule({\n  imports: [\n    CommonModule,\n    IonicModule,\n    TranslateModule.forChild(),\n\n    // Testing sub-modules\n    MaterialTestingModule,\n    ToastTestingModule,\n    UploadFileTestingModule,\n    ImageGalleryTestingModule,\n    AudioTestingModule,\n    StorageExplorerTestingModule,\n    MenuTestingModule,\n    NamedFilterSelectorTestingModule,\n    MarkdownTestingModule,\n  ],\n  exports: [\n    // Testing sub-modules\n    MaterialTestingModule,\n    ToastTestingModule,\n    UploadFileTestingModule,\n    ImageGalleryTestingModule,\n    AudioTestingModule,\n    StorageExplorerTestingModule,\n    MenuTestingModule,\n    NamedFilterSelectorTestingModule,\n    MarkdownTestingModule,\n  ],\n})\nexport class SharedTestingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\nimport { StorageExplorerModule } from './storage-explorer.module';\nimport { StorageExplorerComponent } from './storage-explorer.component';\n\nconst routes: Routes = [\n  {\n    path: '',\n    pathMatch: 'full',\n    component: StorageExplorerComponent,\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, RouterModule.forChild(routes), StorageExplorerModule],\n  exports: [RouterModule],\n})\nexport class StorageExplorerTestingRoutingModule {}\n","import { EntityClass } from '../model/entity.decorators';\nimport { EntityFilter } from '../model/filter.model';\nimport { Referential } from '../model/referential.model';\nimport { EntityUtils } from '../model/entity.model';\n\nimport { FilterFn } from '../../../shared/types';\n\n// @dynamic\n@EntityClass({ typename: 'ReferentialFilterVO' })\nexport class ReferentialFilter extends EntityFilter<ReferentialFilter, Referential> {\n  static fromObject: (source: any, opts?: any) => ReferentialFilter;\n\n  searchText: string;\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source, opts);\n    this.searchText = source.searchText;\n  }\n\n  protected buildFilter(): FilterFn<Referential>[] {\n    const target = super.buildFilter();\n\n    const searchTextFn = EntityUtils.searchTextFilter(['label', 'name'], this.searchText);\n    if (searchTextFn) target.push(searchTextFn);\n\n    return target;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { AbstractControlOptions, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { Referential } from '../model/referential.model';\nimport { AppValidatorService } from '../validator/base.validator.class';\nimport { StatusIds } from '../model/model.enum';\n\n@Injectable()\nexport class ReferentialValidatorService<T extends Referential = Referential> extends AppValidatorService<T> {\n  constructor(protected formBuilder: UntypedFormBuilder) {\n    super(formBuilder);\n  }\n\n  getRowValidator(): UntypedFormGroup {\n    return this.getFormGroup();\n  }\n\n  getFormGroup(\n    data?: T,\n    opts?: {\n      withDescription?: boolean;\n      withComments?: boolean;\n    }\n  ): UntypedFormGroup {\n    return this.formBuilder.group(this.getFormGroupConfig(data, opts), this.getFormGroupOptions(data, opts));\n  }\n\n  getFormGroupConfig(\n    data?: T,\n    opts?: {\n      withDescription?: boolean;\n      withComments?: boolean;\n    }\n  ): { [key: string]: any } {\n    const controlsConfig: { [key: string]: any } = {\n      id: [data?.id ?? null],\n      updateDate: [(data?.updateDate) || null],\n      creationDate: [(data?.creationDate) || null],\n      statusId: [(data?.statusId) || null, Validators.required],\n      levelId: [(data?.levelId) || null],\n      label: [(data?.label) || null, Validators.required],\n      name: [(data?.name) || null, Validators.required],\n      entityName: [(data?.entityName) || null, Validators.required],\n    };\n\n    if (!opts || opts.withDescription !== false) {\n      controlsConfig.description = [(data?.description) || null, Validators.maxLength(255)];\n    }\n    if (!opts || opts.withComments !== false) {\n      controlsConfig.comments = [(data?.comments) || null, Validators.maxLength(2000)];\n    }\n\n    return controlsConfig;\n  }\n\n  getFormGroupOptions(data?: T, opts?: any): AbstractControlOptions | null {\n    return null;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ReferentialValidatorService } from '../../services/testing/referential.validator';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { Referential } from '../../services/model/referential.model';\nimport { SharedValidators } from '../../../shared/validator/validators';\n\n@Injectable()\nexport class TableValidatorService extends ReferentialValidatorService {\n  constructor(protected formBuilder: UntypedFormBuilder) {\n    super(formBuilder);\n  }\n\n  getFormGroup(data?: Referential, opts?: { withDescription?: boolean; withComments?: boolean }): UntypedFormGroup {\n    const form = super.getFormGroup(data, opts);\n\n    form.addControl('properties', this.getPropertiesForm(data?.properties));\n\n    return form;\n  }\n\n  getPropertiesForm(data: { [key: string]: any }, opts?: any): UntypedFormGroup {\n    return this.formBuilder.group({\n      values: [data?.['values'], Validators.required],\n      boolean: [data?.['boolean'], Validators.required],\n      date: [data?.['date'], Validators.required, SharedValidators.validDate],\n      latitude: [data?.['latitude'], Validators.required, SharedValidators.latitude],\n    });\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ReferentialValidatorService } from '../../services/testing/referential.validator';\nimport { UntypedFormBuilder } from '@angular/forms';\n\n@Injectable()\nexport class Table2ValidatorService extends ReferentialValidatorService {\n  constructor(protected formBuilder: UntypedFormBuilder) {\n    super(formBuilder);\n  }\n\n  getFormGroupConfig(data?: any, opts?: { withDescription?: boolean; withComments?: boolean }): { [p: string]: any } {\n    return {\n      ...super.getFormGroupConfig(data, opts),\n      boolean: [data?.boolean || null],\n      boolean2: [data?.boolean2 || null],\n      boolean3: [data?.boolean3 || null],\n    };\n  }\n}\n","import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, Injector, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { AppTable } from '../table.class';\nimport { Referential } from '../../services/model/referential.model';\nimport { IonInfiniteScroll } from '@ionic/angular';\nimport { InMemoryEntitiesService } from '../../../shared/services/memory-entity-service.class';\nimport { AppValidatorService } from '../../services/validator/base.validator.class';\nimport { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { isNil } from '../../../shared/functions';\nimport { ReferentialFilter } from '../../services/testing/referential-filter.model';\nimport { debounceTime, filter, tap } from 'rxjs/operators';\nimport { MatExpansionPanel } from '@angular/material/expansion';\nimport { DEFAULT_PAGE_SIZE, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../table.model';\nimport { Table2ValidatorService } from './table2-validator.service';\nimport { StatusIds } from '../../services/model/model.enum';\nimport { AppAsyncTable } from '../async-table.class';\nimport { EntitiesAsyncTableDataSource } from '../entities-async-table-datasource.class';\nimport {\n  APP_CELL_SELECTION_SERVICE_TOKEN,\n  CellSelectionEvent,\n  CellSelectionService,\n  ICellId,\n} from '../../../shared/directives/cell-selection/cell-selection.service';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\n\n@Component({\n  selector: 'app-table2-testing',\n  styleUrls: ['table2.testing.scss'],\n  templateUrl: 'table2.testing.html',\n  providers: [\n    {\n      provide: AppValidatorService,\n      useClass: Table2ValidatorService,\n    },\n    {\n      provide: AppTable,\n      useExisting: forwardRef(() => Table2TestPage),\n    },\n    // Provide options :\n    // {\n    //   provide: APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN,\n    //   useFactory: () => {\n    //     return <CellSelectionServiceConfig<ICellId>>{\n    //       equals: (cell1, cell2) => {\n    //         console.debug('[table2-test] Comparing cell ids:', cell1, cell2);\n    //         return cell1?.rowId === cell2?.rowId && cell1?.columnName === cell2?.columnName;\n    //       },\n    //     };\n    //   },\n    // },\n    {\n      provide: APP_CELL_SELECTION_SERVICE_TOKEN,\n      useClass: CellSelectionService,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Table2TestPage extends AppAsyncTable<Referential, ReferentialFilter> implements OnInit, OnDestroy, AfterViewInit {\n  static readonly maxRowCount = 100;\n\n  canEdit = true;\n  data: Referential[];\n  filterForm: UntypedFormGroup;\n  filterCriteriaCount = 0;\n  rowHeight = 33;\n  enableInfiniteScroll: boolean;\n  checkBoxSelection = true;\n  resizable = true;\n\n  @Input() filterPanelFloating = true;\n  @Input() sticky = true;\n  @Input() stickyEnd = true;\n\n  get hasMoreData(): boolean {\n    return this.data.length < 100;\n  }\n\n  @ViewChild(MatExpansionPanel, { static: true }) filterExpansionPanel: MatExpansionPanel;\n  @ViewChild(IonInfiniteScroll) infiniteScroll: IonInfiniteScroll;\n\n  protected readonly selectableColumns = ['name', 'levelId', 'boolean'];\n\n  get dataService(): InMemoryEntitiesService<Referential> {\n    return this._dataSource.dataService as InMemoryEntitiesService<Referential>;\n  }\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    injector: Injector,\n    protected validatorService: AppValidatorService,\n    protected formBuilder: UntypedFormBuilder\n  ) {\n    super(\n      injector,\n      [\n        ...RESERVED_START_COLUMNS,\n        'name',\n        'levelId',\n        'boolean',\n        'boolean2',\n        //'boolean3',\n        ...RESERVED_END_COLUMNS,\n      ],\n      new EntitiesAsyncTableDataSource(\n        Referential,\n        new InMemoryEntitiesService(Referential, ReferentialFilter, {\n          sortByReplacement: { id: 'id' },\n        }),\n        validatorService,\n        {\n          suppressErrors: false,\n        }\n      ),\n      null\n    );\n\n    // Works with true and false\n    this.enableInfiniteScroll = this.mobile;\n\n    this.autoLoad = false;\n    this.inlineEdition = true;\n    this.i18nColumnPrefix = 'TABLE.TESTING.';\n\n    this.confirmBeforeDelete = true;\n    this.confirmBeforeCancel = false;\n    this.undoableDeletion = false;\n    this.saveBeforeDelete = false;\n\n    this.saveBeforeSort = true;\n    this.saveBeforeFilter = true;\n    this.propagateRowError = true;\n\n    this.filterForm = formBuilder.group({\n      searchText: [null],\n    });\n\n    this.onStartEditingRow.subscribe((row) => {\n      row.validator.patchValue({ entityName: 'TestVO' }, { emitEvent: false });\n    });\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Update filter when changes\n    this.registerSubscription(\n      this.filterForm.valueChanges\n        .pipe(\n          debounceTime(250),\n          filter(() => this.filterForm.valid),\n          tap((value) => {\n            const filter = ReferentialFilter.fromObject(value);\n            this.filterCriteriaCount = filter.countNotEmptyCriteria();\n            this.markForCheck();\n            // Applying the filter\n            this.setFilter(filter, { emitEvent: false });\n          }),\n          // Save filter in settings (after a debounce time)\n          debounceTime(500),\n          tap((json) => this.settings.savePageSetting(this.settingsId, json, 'filter'))\n        )\n        .subscribe()\n    );\n\n    this.registerAutocompleteField('level', {\n      items: [\n        { id: 1, label: 'A', name: 'item A' },\n        { id: 1, label: 'B', name: 'item B' },\n      ],\n      mobile: this.mobile,\n    });\n\n    this.registerSubscription(\n      this.onRefresh.subscribe(() => {\n        this.filterForm.markAsUntouched();\n        this.filterForm.markAsPristine();\n      })\n    );\n\n    this.markAsReady();\n  }\n\n  async ngAfterViewInit() {\n    super.ngAfterViewInit();\n\n    // Restore filter from settings\n    await this.restoreFilter();\n\n    // Load data\n    this.load();\n  }\n\n  ngOnDestroy() {\n    console.debug('[test-table] Destroying table...');\n    super.ngOnDestroy();\n  }\n\n  protected async restoreFilter() {\n    await this.settings.ready();\n\n    const json = this.settings.getPageSettings(this.settingsId, 'filter');\n    console.debug('[table-test] Restoring filter from settings...', json);\n\n    if (json) {\n      const filter = ReferentialFilter.fromObject(json);\n      this.filterForm.patchValue(json, { emitEvent: false });\n      this.filterCriteriaCount = filter.countNotEmptyCriteria();\n      this.setFilter(filter, { emitEvent: true });\n      this.markForCheck();\n    }\n  }\n\n  async load() {\n    console.debug('[test-table] Updating data...');\n    this.markAsLoading();\n\n    if (isNil(this.data)) {\n      this.data = this.generateData(0, Table2TestPage.maxRowCount);\n    }\n    this.dataService.value = this.data;\n\n    this.emitRefresh();\n  }\n\n  async fetchMore(event) {\n    console.debug('[table-test] Loading more...', event);\n    const fetched = await this._dataSource.fetchMore();\n\n    if (fetched && event?.target && event.target.complete) {\n      // Wait end of load\n      await this.waitIdle();\n      // Mark target event as completed (e.g. IonRefresher)\n      event.target.complete();\n    }\n  }\n\n  async save(opts?: { keepEditing?: boolean }): Promise<boolean> {\n    const saved = await super.save(opts);\n    if (saved) {\n      // Update source data\n      this.data = this.dataService.value;\n    }\n    return saved;\n  }\n\n  clearControlValue(event: Event, formControl: AbstractControl): boolean {\n    if (event) event.stopPropagation(); // Avoid to enter input the field\n    formControl.setValue(null);\n    return false;\n  }\n\n  toggleFilterPanelFloating() {\n    this.filterPanelFloating = !this.filterPanelFloating;\n    this.markForCheck();\n  }\n\n  applyFilterAndClosePanel(event?: Event) {\n    this.defaultPageSize = DEFAULT_PAGE_SIZE;\n    this.emitRefresh();\n    if (this.filterPanelFloating) this.filterExpansionPanel?.close();\n  }\n\n  closeFilterPanel() {\n    this.filterExpansionPanel?.close();\n    if (!this.filterPanelFloating) {\n      this.filterPanelFloating = true;\n      this.markForCheck();\n    }\n  }\n\n  async resetFilter(event?: Event) {\n    this.filterForm.reset({}, { emitEvent: true });\n    await this.setFilter(ReferentialFilter.fromObject({}), { emitEvent: true });\n    this.filterExpansionPanel.close();\n  }\n\n  protected generateData(offset?: number, size?: number): Referential[] {\n    offset = offset || 0;\n    size = size || 100;\n\n    const result = new Array<Referential>();\n    for (let i = 0; i < size; i++) {\n      const id = i + 1 + offset;\n      const item = Referential.fromObject({\n        id,\n        label: 'CODE-' + id,\n        name: 'Name #' + id,\n        levelId: { id: 1, label: 'A', name: 'Item A' },\n        statusId: StatusIds.ENABLE,\n        comments: 'My comment #' + id,\n        boolean: id % 2 === 0,\n        boolean2: true,\n        // boolean3: false,\n        entityName: 'TestVO',\n      });\n      result.push(item);\n    }\n\n    return result;\n  }\n\n  protected onCellSelectionChange(event: CellSelectionEvent<ICellId>) {\n    this.markForCheck();\n    console.debug('[table2-test] Selection changed:', {\n      selectedCells: event.selectedCells,\n      isRange: event.isRangeSelection,\n      isToggle: event.isToggleSelection,\n    });\n  }\n\n  protected onCellRightClick(event: MouseEvent) {\n    console.debug('[table2-test] Right click on cell:', event);\n  }\n}\n","<app-toolbar\n  color=\"primary\"\n  [canGoBack]=\"true\"\n  [hasValidate]=\"(loadingSubject | async) !== true && (dirtySubject | async) === true\"\n  (onValidate)=\"save()\"\n  [backHref]=\"'/testing'\"\n>\n  <ion-title>Table 2 (click to select)</ion-title>\n\n  <ion-buttons slot=\"end\">\n    @if (selection | isEmptySelection) {\n      <input matInput type=\"number\" step=\"1\" style=\"color: black; width: 50px\" [(ngModel)]=\"rowHeight\" />\n\n      <!-- Add -->\n      <button\n        mat-icon-button\n        *ngIf=\"canEdit && !mobile\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n        (click)=\"addRow()\"\n      >\n        <mat-icon>add</mat-icon>\n      </button>\n\n      <!-- reset filter -->\n      <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n        <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n        <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n      </button>\n\n      <!-- show filter -->\n      <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n        <mat-icon\n          *ngIf=\"filterCriteriaCount; else emptyFilter\"\n          [matBadge]=\"filterCriteriaCount\"\n          matBadgeColor=\"accent\"\n          matBadgeSize=\"small\"\n          matBadgePosition=\"above after\"\n          aria-hidden=\"false\"\n        >\n          filter_list_alt\n        </mat-icon>\n        <ng-template #emptyFilter>\n          <mat-icon>filter_list_alt</mat-icon>\n        </ng-template>\n      </button>\n\n      <!-- save -->\n      <button mat-icon-button *ngIf=\"mobile\" [disabled]=\"(dirtySubject | async) !== true\" (click)=\"save()\">\n        <mat-icon>save</mat-icon>\n      </button>\n    } @else {\n      <!-- if row selection -->\n      <!-- delete -->\n      <button\n        mat-icon-button\n        *ngIf=\"canEdit\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n        (click)=\"deleteSelection($event)\"\n      >\n        <mat-icon>delete</mat-icon>\n      </button>\n\n      <!-- duplicate -->\n      <button\n        mat-icon-button\n        *ngIf=\"canEdit && selection.selected | isArrayLength: { equals: 1 }\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_DUPLICATE' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_DUPLICATE' | translate) : ''\"\n        (click)=\"duplicateRow($event, selection.selected[0])\"\n      >\n        <mat-icon>file_copy</mat-icon>\n      </button>\n    }\n  </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n  <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n    <ion-refresher-content></ion-refresher-content>\n  </ion-refresher>\n\n  <!-- error -->\n  <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n\n  <!-- search -->\n  <mat-expansion-panel\n    #filterExpansionPanel\n    class=\"filter-panel\"\n    [class.filter-panel-floating]=\"filterPanelFloating\"\n    [class.filter-panel-pinned]=\"!filterPanelFloating\"\n  >\n    <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <!-- search text -->\n            <mat-form-field>\n              <mat-label>{{ 'TABLE.TESTING.SEARCH_TEXT' | translate }}</mat-label>\n              <ion-icon matPrefix name=\"search\"></ion-icon>\n              <input matInput formControlName=\"searchText\" autocomplete=\"off\" />\n              <button\n                mat-icon-button\n                matSuffix\n                tabindex=\"-1\"\n                type=\"button\"\n                (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n                [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n              >\n                <mat-icon>close</mat-icon>\n              </button>\n            </mat-form-field>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    </form>\n\n    <mat-action-row>\n      <!-- Counter  -->\n      <ion-label\n        [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n        [color]=\"empty && 'danger'\"\n        class=\"ion-padding\"\n      >\n        {{\n          (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n            | translate\n              : {\n                  count: (totalRowCount | numberFormat),\n                }\n        }}\n      </ion-label>\n\n      <div class=\"toolbar-spacer\"></div>\n\n      <button\n        mat-icon-button\n        color=\"accent\"\n        *ngIf=\"filterPanelFloating\"\n        (click)=\"toggleFilterPanelFloating()\"\n        class=\"hidden-xs hidden-sm hidden-md\"\n        [title]=\"!showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n      >\n        <mat-icon>\n          <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '&#xbb;' : '&#xab;' }}</span>\n        </mat-icon>\n      </button>\n\n      <!-- Close panel -->\n      <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n        <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n      </ion-button>\n\n      <!-- Search button -->\n      <ion-button\n        mat-button\n        [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n        [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n        (click)=\"applyFilterAndClosePanel($event)\"\n      >\n        <ion-text translate>COMMON.BTN_APPLY</ion-text>\n      </ion-button>\n    </mat-action-row>\n  </mat-expansion-panel>\n\n  <!-- table -->\n  <div [class.table-container]=\"!enableInfiniteScroll\" style=\"position: relative\">\n    <table\n      #table\n      mat-table\n      matSort\n      matSortDisableClear\n      [dataSource]=\"dataSource\"\n      [matSortActive]=\"defaultSortBy\"\n      [matSortDirection]=\"defaultSortDirection\"\n      [trackBy]=\"trackByFn\"\n      [style.--mat-row-height]=\"rowHeight + 'px'\"\n      appCellSelection\n      [appSelectableColumns]=\"selectableColumns\"\n      [appCellSelectionDisabled]=\"invalid\"\n      (appCellSelectionChange)=\"onCellSelectionChange($event)\"\n      (appCellRightClick)=\"onCellRightClick($event)\"\n    >\n      <ng-container matColumnDef=\"select\" [sticky]=\"checkBoxSelection\" [class.mat-column-sticky]=\"checkBoxSelection\">\n        <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!checkBoxSelection\">\n          @if (selection | isMultipleSelection) {\n            <mat-checkbox\n              [checked]=\"this | isAllSelected\"\n              [indeterminate]=\"this | isNotAllSelected\"\n              (change)=\"$event ? masterToggle() : null\"\n            ></mat-checkbox>\n          }\n        </th>\n        <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!checkBoxSelection\">\n          <mat-checkbox [checked]=\"selection | isSelected: row\" (click)=\"toggleSelectRow($event, row)\"></mat-checkbox>\n        </td>\n      </ng-container>\n\n      <!-- Id column -->\n      <ng-container matColumnDef=\"id\" [sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef>\n          <span mat-sort-header>\n            <ion-label title=\"Id\">#</ion-label>\n            <ion-label color=\"danger\" [innerHTML]=\"'&nbsp;*'\"></ion-label>\n          </span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" [appCellId]=\"{ rowId: row.id, columnName: 'id' }\">\n          <mat-form-field *ngIf=\"!readOnly && row.id === -1 && row.editing; else readOnlyId\">\n            <input\n              matInput\n              autocomplete=\"off\"\n              required\n              [formControl]=\"row.validator | formGetControl: 'id'\"\n              placeholder=\"Id\"\n              [appAutofocus]=\"true\"\n            />\n            <mat-error *ngIf=\"(row.validator | formGetControl: 'id').hasError('required')\" translate>\n              ERROR.FIELD_REQUIRED\n            </mat-error>\n            <mat-error *ngIf=\"(row.validator | formGetControl: 'id').hasError('alreadyExists')\" translate>\n              ERROR.FIELD_NOT_UNIQUE_ID\n            </mat-error>\n          </mat-form-field>\n\n          <ng-template #readOnlyId>\n            <ion-label appAutoTooltip>\n              {{ (row.validator | formGetValue: 'id') || (row.currentData | propertyGet: 'id') }}\n            </ion-label>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <!-- Name column -->\n      <ng-container matColumnDef=\"name\" [sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef [resizable]=\"resizable\">\n          <!-- if sortable, wrap the header with a mat-sort-header -->\n          <span mat-sort-header>\n            <ion-label\n              [title]=\"!showTooltip ? ('TABLE.TESTING.NAME' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('TABLE.TESTING.NAME' | translate) : ''\"\n            >\n              {{ 'TABLE.TESTING.NAME' | translate }}\n            </ion-label>\n            <ion-label color=\"danger\" [innerHTML]=\"'&nbsp;*'\"></ion-label>\n          </span>\n        </th>\n        <td\n          mat-cell\n          *matCellDef=\"let row\"\n          (click)=\"focusColumn = 'name'\"\n          [appCellId]=\"{ rowId: row.id, columnName: 'name' }\"\n        >\n          <mat-form-field *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\">\n            <input\n              matInput\n              autocomplete=\"off\"\n              [required]=\"true\"\n              [formControl]=\"row.validator | formGetControl: 'name'\"\n              [placeholder]=\"'TABLE.TESTING.NAME' | translate\"\n              [appAutofocus]=\"row.id === -1 || focusColumn === 'name'\"\n            />\n            <ng-content select=\"[suffix]\"></ng-content>\n            <mat-error *ngIf=\"(row.validator | formGetControl: 'name').hasError('required')\" translate>\n              ERROR.FIELD_REQUIRED\n            </mat-error>\n            <mat-error *ngIf=\"(row.validator | formGetControl: 'name').hasError('maxlength')\" translate>\n              ERROR.FIELD_MAX_LENGTH_COMPACT\n            </mat-error>\n            <mat-error *ngIf=\"(row.validator | formGetControl: 'name').hasError('minlength')\" translate>\n              ERROR.FIELD_MIN_LENGTH_COMPACT\n            </mat-error>\n          </mat-form-field>\n          <ng-template #readOnlyTemplate>\n            <ion-label appAutoTooltip>\n              {{ (row.validator | formGetValue: 'name') || (row.currentData | propertyGet: 'name') }}\n            </ion-label>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <!-- Level column -->\n      <ng-container matColumnDef=\"levelId\" [sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef [resizable]=\"resizable\">\n          <span mat-sort-header>\n            <ion-label>{{ 'TABLE.TESTING.LEVEL_ID' | translate }}</ion-label>\n            <ion-label color=\"danger\" [innerHTML]=\"'&nbsp;*'\"></ion-label>\n          </span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" [appCellId]=\"{ rowId: row.id, columnName: 'levelId' }\">\n          <mat-autocomplete-field\n            *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\"\n            panelWidth=\"750px\"\n            [formControl]=\"row.validator | formGetControl: 'levelId'\"\n            [placeholder]=\"'TABLE.TESTING.LEVEL_ID' | translate\"\n            floatLabel=\"never\"\n            [required]=\"true\"\n            [config]=\"autocompleteFields.level\"\n            [highlightAccent]=\"true\"\n          >\n            <mat-error matError *ngIf=\"(row.validator | formGetControl: 'levelId').hasError('invalid')\" translate>\n              ERROR.FIELD_INVALID\n            </mat-error>\n          </mat-autocomplete-field>\n          <ng-template #readOnlyTemplate>\n            <ion-label appAutoTooltip>\n              {{\n                autocompleteFields.level?.displayWith(\n                  (row.validator | formGetValue: 'levelId') || (row.currentData | propertyGet: 'levelId')\n                ) ||\n                  ((row.validator | formGetValue: 'levelId') || (row.currentData | propertyGet: 'levelId')\n                    | referentialToString)\n              }}\n            </ion-label>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"boolean\">\n        <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"resizable\">\n          <!-- if sortable, wrap the header with a mat-sort-header -->\n          <span mat-sort-header>\n            <ion-label>Boolean</ion-label>\n          </span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" [appCellId]=\"{ rowId: row.id, columnName: 'boolean' }\">\n          <mat-boolean-field\n            *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\"\n            floatLabel=\"never\"\n            [style]=\"'checkbox'\"\n            [formControl]=\"\n              (row.validator | formGetControl: 'boolean') || formBuilder.control(row.currentData['boolean'])\n            \"\n            [compact]=\"true\"\n          ></mat-boolean-field>\n          <ng-template #readOnlyTemplate>\n            <ion-label appAutoTooltip>\n              {{\n                (row.validator | formGetValue: 'boolean') || (row.currentData | propertyGet: 'boolean')\n                  ? ('COMMON.YES' | translate)\n                  : ('COMMON.NO' | translate)\n              }}\n            </ion-label>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"boolean2\">\n        <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"resizable\">\n          <!-- if sortable, wrap the header with a mat-sort-header -->\n          <span mat-sort-header>\n            <ion-label>Boolean 2</ion-label>\n          </span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" [appCellId]=\"{ rowId: row.id, columnName: 'boolean2' }\">\n          <mat-boolean-field\n            *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\"\n            [floatLabel]=\"'never'\"\n            [style]=\"'radio'\"\n            [showRadio]=\"true\"\n            [formControl]=\"\n              (row.validator | formGetControl: 'boolean2') || formBuilder.control(row.currentData['boolean2'])\n            \"\n          ></mat-boolean-field>\n          <ng-template #readOnlyTemplate>\n            <ion-label appAutoTooltip>\n              {{\n                (row.validator | formGetValue: 'boolean2') || (row.currentData | propertyGet: 'boolean2')\n                  ? ('COMMON.YES' | translate)\n                  : ('COMMON.NO' | translate)\n              }}\n            </ion-label>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <ng-container matColumnDef=\"boolean3\">\n        <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"resizable\">\n          <!-- if sortable, wrap the header with a mat-sort-header -->\n          <span mat-sort-header>\n            <ion-label>Boolean 3</ion-label>\n          </span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\">\n          <mat-boolean-field\n            *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\"\n            floatLabel=\"never\"\n            [style]=\"'button'\"\n            [formControl]=\"\n              (row.validator | formGetControl: 'boolean2') || formBuilder.control(row.currentData['boolean2'])\n            \"\n          ></mat-boolean-field>\n          <ng-template #readOnlyTemplate>\n            <ion-label appAutoTooltip>\n              {{\n                (row.validator | formGetValue: 'boolean2') || (row.currentData | propertyGet: 'boolean2')\n                  ? ('COMMON.YES' | translate)\n                  : ('COMMON.NO' | translate)\n              }}\n            </ion-label>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <!-- Actions buttons column -->\n      <app-actions-column\n        [stickyEnd]=\"stickyEnd\"\n        [canCancel]=\"false\"\n        [style]=\"'table'\"\n        (optionsClick)=\"openSelectColumnsModal($event)\"\n        (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n        (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n        (backward)=\"confirmAndBackward($event.event, $event.row)\"\n        (forward)=\"confirmAndForward($event.event, $event.row)\"\n        [cellTemplate]=\"cellInjection\"\n      >\n        <!-- cell injection-->\n        <ng-template #cellInjection let-row>\n          <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n        </ng-template>\n      </app-actions-column>\n\n      <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n      <tr\n        mat-row\n        *matRowDef=\"let row; columns: displayedColumns\"\n        [class.mat-row-selected]=\"row.editing\"\n        [class.mat-row-error]=\"row.invalid\"\n        [class.mat-row-disabled]=\"!row.editing\"\n        [class.mat-row-dirty]=\"row.dirty\"\n        (click)=\"clickRow($event, row)\"\n        (keydown.escape)=\"escapeEditingRow($event)\"\n        [cdkTrapFocus]=\"row.invalid\"\n      ></tr>\n    </table>\n\n    <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n      <ion-item>\n        <ion-skeleton-text animated></ion-skeleton-text>\n      </ion-item>\n    </ng-container>\n\n    <ng-template #noResult>\n      <ion-item *ngIf=\"totalRowCount === 0\">\n        <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n      </ion-item>\n    </ng-template>\n\n    <ion-infinite-scroll\n      *ngIf=\"enableInfiniteScroll\"\n      [threshold]=\"mobile ? '10%' : '2%'\"\n      position=\"bottom\"\n      (ionInfinite)=\"fetchMore($event)\"\n    >\n      <ion-infinite-scroll-content\n        loadingSpinner=\"circles\"\n        [loadingText]=\"'COMMON.LOADING_DOTS' | translate\"\n      ></ion-infinite-scroll-content>\n    </ion-infinite-scroll>\n  </div>\n</ion-content>\n\n<ion-footer>\n  <!-- Paginator  -->\n  <mat-paginator\n    *ngIf=\"!enableInfiniteScroll\"\n    [length]=\"totalRowCount\"\n    [pageSize]=\"defaultPageSize\"\n    [pageSizeOptions]=\"defaultPageSizeOptions\"\n    showFirstLastButtons\n  ></mat-paginator>\n\n  <app-form-buttons-bar\n    *ngIf=\"canEdit && !mobile\"\n    (onCancel)=\"load()\"\n    (onSave)=\"save()\"\n    [disabled]=\"(loadingSubject | async) || !dirty\"\n  >\n    <!-- error -->\n    <ion-item *ngIf=\"errorSubject | async\" lines=\"none\">\n      <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n      <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n    </ion-item>\n  </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"canEdit && mobile\">\n  <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n    <ion-icon name=\"add\"></ion-icon>\n  </ion-fab-button>\n</ion-fab>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, Injector, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { AppTable } from '../table.class';\nimport { Referential, StatusList } from '../../services/model/referential.model';\nimport { IonInfiniteScroll } from '@ionic/angular';\nimport { EntitiesTableDataSource } from '../entities-table-datasource.class';\nimport { InMemoryEntitiesService } from '../../../shared/services/memory-entity-service.class';\nimport { AppValidatorService } from '../../services/validator/base.validator.class';\nimport { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { isNil, isNotNil } from '../../../shared/functions';\nimport { DateUtils, fromUnixMsTimestamp, toDateISOString } from '../../../shared/dates';\nimport { ReferentialFilter } from '../../services/testing/referential-filter.model';\nimport { debounceTime, filter, tap } from 'rxjs/operators';\nimport { MatExpansionPanel } from '@angular/material/expansion';\nimport { StatusIds } from '../../services/model/model.enum';\nimport { Subscription, timer } from 'rxjs';\nimport { RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../table.model';\nimport { TableValidatorService } from './table-validator.service';\nimport { Table2TestPage } from './table2.testing';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\nimport { APP_CELL_SELECTION_SERVICE_TOKEN } from '../../../shared/directives/cell-selection/cell-selection.service';\n\n@Component({\n  selector: 'app-table-testing',\n  styleUrls: ['table.testing.scss'],\n  templateUrl: 'table.testing.html',\n  providers: [\n    {\n      provide: AppValidatorService,\n      useClass: TableValidatorService,\n    },\n    {\n      provide: AppTable,\n      useExisting: forwardRef(() => TableTestPage),\n    },\n    {\n      provide: APP_CELL_SELECTION_SERVICE_TOKEN,\n      useValue: null, // Disable cell selection if this table is nested (ex: NestedTableTestPage)\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableTestPage extends AppTable<Referential, ReferentialFilter> implements OnInit, OnDestroy, AfterViewInit {\n  static readonly maxRowCount = 100;\n\n  timer: Subscription;\n  canEdit = true;\n  data: Referential[];\n  filterForm: UntypedFormGroup;\n  filterCriteriaCount = 0;\n  groupColumns = ['top-start', 'group-1', 'group-2', 'top-end'];\n  rowHeight = 48;\n  permanentSelectionAllowed = true;\n\n  readonly statusList = StatusList;\n\n  @Input() filterPanelFloating = true;\n  @Input() enableInfiniteScroll: boolean;\n  @Input() sticky = true;\n  @Input() stickyEnd = true;\n\n  get hasMoreData(): boolean {\n    return this.data.length < 100;\n  }\n\n  @ViewChild(MatExpansionPanel, { static: true }) filterExpansionPanel: MatExpansionPanel;\n  @ViewChild(IonInfiniteScroll) infiniteScroll: IonInfiniteScroll;\n\n  get dataService(): InMemoryEntitiesService<Referential> {\n    return this._dataSource.dataService as InMemoryEntitiesService<Referential>;\n  }\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    injector: Injector,\n    protected validatorService: AppValidatorService,\n    protected formBuilder: UntypedFormBuilder\n  ) {\n    super(\n      injector,\n      [\n        ...RESERVED_START_COLUMNS,\n        'label',\n        'name',\n        'levelId',\n        'statusId',\n        'boolean',\n        'date',\n        'latitude',\n        'updateDate',\n        'comments',\n        ...RESERVED_END_COLUMNS,\n      ],\n      new EntitiesTableDataSource(\n        Referential,\n        new InMemoryEntitiesService(Referential, ReferentialFilter, {\n          sortByReplacement: { id: 'id' },\n        }),\n        validatorService,\n        {\n          suppressErrors: false,\n        }\n      ),\n      null\n    );\n\n    // Works with true and false\n    this.enableInfiniteScroll = this.mobile;\n\n    this.autoLoad = false;\n    this.inlineEdition = true;\n    this.i18nColumnPrefix = 'TABLE.TESTING.';\n\n    this.confirmBeforeDelete = true;\n    this.confirmBeforeCancel = false;\n    this.undoableDeletion = false;\n    this.saveBeforeDelete = false;\n\n    this.saveBeforeSort = true;\n    this.saveBeforeFilter = true;\n    this.propagateRowError = true;\n\n    this.filterForm = formBuilder.group({\n      searchText: [null],\n    });\n\n    // this.columnDefinitions['values'] = <FormFieldDefinition>{\n    //   key: 'values',\n    //   type: 'enums',\n    //   values: [\n    //     {key: 'A', value: 'Value A'},\n    //     {key: 'B', value: 'Value B'}\n    //   ]\n    // };\n\n    // Init new entity\n    this.onStartEditingRow.subscribe((row) => {\n      row.validator.patchValue(\n        {\n          entityName: 'TestVO',\n          properties: {\n            boolean: false,\n            date: toDateISOString(DateUtils.moment()),\n            latitude: 11.1111,\n            ...row.currentData.properties,\n          },\n        },\n        { emitEvent: false }\n      );\n    });\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Update filter when changes\n    this.registerSubscription(\n      this.filterForm.valueChanges\n        .pipe(\n          debounceTime(250),\n          filter(() => this.filterForm.valid),\n          tap((value) => {\n            const filter = ReferentialFilter.fromObject(value);\n            this.filterCriteriaCount = filter.countNotEmptyCriteria();\n            this.markForCheck();\n            // Applying the filter\n            this.setFilter(filter, { emitEvent: false });\n          }),\n          // Save filter in settings (after a debounce time)\n          debounceTime(500),\n          tap((json) => this.settings.savePageSetting(this.settingsId, json, 'filter'))\n        )\n        .subscribe()\n    );\n\n    this.registerAutocompleteField('level', {\n      items: [\n        { id: 1, label: 'A', name: 'item A' },\n        { id: 1, label: 'B', name: 'item B' },\n      ],\n      mobile: this.mobile,\n    });\n\n    this.registerSubscription(\n      this.onRefresh.subscribe(() => {\n        this.filterForm.markAsUntouched();\n        this.filterForm.markAsPristine();\n      })\n    );\n\n    this.markAsReady();\n  }\n\n  async ngAfterViewInit() {\n    super.ngAfterViewInit();\n\n    // Restore filter from settings\n    await this.restoreFilter();\n\n    // Load data\n    this.load();\n  }\n\n  ngOnDestroy() {\n    console.debug('[test-table] Destroying table...');\n    super.ngOnDestroy();\n    this.stopTimer();\n  }\n\n  protected async restoreFilter() {\n    await this.settings.ready();\n\n    const json = this.settings.getPageSettings(this.settingsId, 'filter');\n    console.debug('[table-test] Restoring filter from settings...', json);\n\n    if (json) {\n      const filter = ReferentialFilter.fromObject(json);\n      this.filterForm.patchValue(json, { emitEvent: false });\n      this.filterCriteriaCount = filter.countNotEmptyCriteria();\n      this.setFilter(filter, { emitEvent: true });\n      this.markForCheck();\n    }\n  }\n\n  toggleTimer() {\n    if (isNotNil(this.timer)) this.stopTimer();\n    else this.startTimer();\n  }\n\n  async load() {\n    console.debug('[test-table] Updating data...');\n    this.markAsLoading();\n\n    if (isNil(this.data)) {\n      this.data = this.generateData(0, Table2TestPage.maxRowCount);\n    }\n    this.dataService.value = this.data;\n\n    this.emitRefresh();\n  }\n\n  async fetchMore(event: any) {\n    console.debug('[table-test] Loading more...', event);\n    const fetched = await this._dataSource.fetchMore();\n\n    if (fetched && event?.target && event.target.complete) {\n      // Wait end of load\n      await this.waitIdle();\n      // Mark target event as completed (e.g. IonRefresher)\n      event.target.complete();\n    }\n  }\n\n  async save(opts?: { keepEditing?: boolean }): Promise<boolean> {\n    const saved = await super.save(opts);\n    if (saved) {\n      // Update source data\n      this.data = this.dataService.value;\n    }\n    return saved;\n  }\n\n  clearControlValue(event: Event, formControl: AbstractControl): boolean {\n    if (event) event.stopPropagation(); // Avoid to enter input the field\n    formControl.setValue(null);\n    return false;\n  }\n\n  toggleFilterPanelFloating() {\n    this.filterPanelFloating = !this.filterPanelFloating;\n    this.markForCheck();\n  }\n\n  applyFilterAndClosePanel(event?: Event) {\n    const filter = this.filterForm.value;\n    this.setFilter(filter, { emitEvent: false });\n    this.emitRefresh();\n    if (this.filterPanelFloating) this.filterExpansionPanel?.close();\n  }\n\n  closeFilterPanel() {\n    this.filterExpansionPanel?.close();\n    if (!this.filterPanelFloating) {\n      this.filterPanelFloating = true;\n      this.markForCheck();\n    }\n  }\n\n  resetFilter(_?: Event) {\n    this.filterForm.reset({}, { emitEvent: true });\n    this.setFilter(ReferentialFilter.fromObject({}), { emitEvent: true });\n    this.filterExpansionPanel.close();\n  }\n\n  startTimer() {\n    this.stopTimer();\n    this.timer = timer(500).subscribe(() => {\n      this.data = null; // Reset\n      this.load();\n    });\n  }\n\n  stopTimer() {\n    this.timer?.unsubscribe();\n    this.timer = null;\n  }\n\n  protected generateData(offset?: number, size?: number): Referential[] {\n    offset = offset || 0;\n    size = size || 100;\n\n    const result = new Array<Referential>();\n    for (let i = 0; i < size; i++) {\n      const id = i + 1 + offset;\n      const item = Referential.fromObject({\n        id,\n        label: 'CODE-' + id,\n        name: 'Name #' + id,\n        levelId: { id: 1, label: 'A', name: 'Item A' },\n        statusId: StatusIds.ENABLE,\n        comments: i % 3 === 0 ? 'My comment #' + id : undefined,\n        properties: {\n          values: i % 2 === 0 ? 'A' : 'A,B',\n          boolean: false,\n          date: null, // toDateISOString(DateUtils.moment()),\n          latitude: null, // 11.1111\n        },\n        creationDate: fromUnixMsTimestamp(Date.now() - i * 60 * 1000),\n        updateDate: fromUnixMsTimestamp(Date.now() - i * 60 * 1000),\n        entityName: 'TestVO',\n      });\n      result.push(item);\n    }\n\n    return result;\n  }\n}\n","<app-toolbar\n  color=\"primary\"\n  [canGoBack]=\"true\"\n  [hasValidate]=\"(loadingSubject | async) !== true && (dirtySubject | async) === true\"\n  (onValidate)=\"save()\"\n  [backHref]=\"'/testing'\"\n>\n  <ion-title>Table (click to edit)</ion-title>\n  <ion-buttons slot=\"end\">\n    @if (selection | isEmptySelection) {\n      <input matInput type=\"number\" step=\"1\" style=\"color: black; width: 50px\" [(ngModel)]=\"rowHeight\" />\n\n      <!-- Add -->\n      <button\n        mat-icon-button\n        *ngIf=\"canEdit && !mobile\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n        (click)=\"addRow()\"\n      >\n        <mat-icon>add</mat-icon>\n      </button>\n\n      <!-- reset filter -->\n      <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n        <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n        <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n      </button>\n\n      <!-- show filter -->\n      <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n        <mat-icon\n          *ngIf=\"filterCriteriaCount; else emptyFilter\"\n          [matBadge]=\"filterCriteriaCount\"\n          matBadgeColor=\"accent\"\n          matBadgeSize=\"small\"\n          matBadgePosition=\"above after\"\n          aria-hidden=\"false\"\n        >\n          filter_list_alt\n        </mat-icon>\n        <ng-template #emptyFilter>\n          <mat-icon>filter_list_alt</mat-icon>\n        </ng-template>\n      </button>\n\n      <!-- save -->\n      <button mat-icon-button *ngIf=\"mobile\" [disabled]=\"(dirtySubject | async) !== true\" (click)=\"save()\">\n        <mat-icon>save</mat-icon>\n      </button>\n\n      <!-- start/stop timer to auto-load data -->\n      <ion-button *ngIf=\"!timer\" (click)=\"startTimer()\">Start reload</ion-button>\n      <ion-button *ngIf=\"timer\" (click)=\"stopTimer()\" color=\"accent\">Stop reload</ion-button>\n    } @else {\n      <!-- if row selection -->\n      <!-- delete -->\n      <button\n        mat-icon-button\n        *ngIf=\"canEdit\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n        (click)=\"deleteSelection($event)\"\n      >\n        <mat-icon>delete</mat-icon>\n      </button>\n\n      <!-- duplicate -->\n      <button\n        mat-icon-button\n        *ngIf=\"canEdit && selection.selected | isArrayLength: { equals: 1 }\"\n        [title]=\"!showTooltip ? ('COMMON.BTN_DUPLICATE' | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ('COMMON.BTN_DUPLICATE' | translate) : ''\"\n        (click)=\"duplicateRow($event, selection.selected[0])\"\n      >\n        <mat-icon>file_copy</mat-icon>\n      </button>\n    }\n  </ion-buttons>\n</app-toolbar>\n<ion-content class=\"ion-no-padding\">\n  <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n    <ion-refresher-content></ion-refresher-content>\n  </ion-refresher>\n\n  <!-- error -->\n  <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n    <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n    <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n  </ion-item>\n\n  <!-- search -->\n  <mat-expansion-panel\n    #filterExpansionPanel\n    class=\"filter-panel\"\n    [class.filter-panel-floating]=\"filterPanelFloating\"\n    [class.filter-panel-pinned]=\"!filterPanelFloating\"\n  >\n    <form class=\"form-container ion-padding-top\" [formGroup]=\"filterForm\" (ngSubmit)=\"applyFilterAndClosePanel($event)\">\n      <ion-grid>\n        <ion-row>\n          <ion-col>\n            <!-- search text -->\n            <mat-form-field>\n              <mat-label>{{ 'TABLE.TESTING.SEARCH_TEXT' | translate }}</mat-label>\n              <ion-icon matPrefix name=\"search\"></ion-icon>\n              <input matInput formControlName=\"searchText\" autocomplete=\"off\" />\n              <button\n                mat-icon-button\n                matSuffix\n                tabindex=\"-1\"\n                type=\"button\"\n                (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n                [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n              >\n                <mat-icon>close</mat-icon>\n              </button>\n            </mat-form-field>\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    </form>\n\n    <mat-action-row>\n      <!-- Counter  -->\n      <ion-label\n        [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n        [color]=\"empty && 'danger'\"\n        class=\"ion-padding\"\n      >\n        {{\n          (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n            | translate\n              : {\n                  count: (totalRowCount | numberFormat),\n                }\n        }}\n      </ion-label>\n\n      <div class=\"toolbar-spacer\"></div>\n\n      <button\n        mat-icon-button\n        color=\"accent\"\n        *ngIf=\"filterPanelFloating\"\n        (click)=\"toggleFilterPanelFloating()\"\n        class=\"hidden-xs hidden-sm hidden-md\"\n        [title]=\"!showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n        [matTooltip]=\"showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n      >\n        <mat-icon>\n          <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '&#xbb;' : '&#xab;' }}</span>\n        </mat-icon>\n      </button>\n\n      <!-- Close panel -->\n      <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n        <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n      </ion-button>\n\n      <!-- Search button -->\n      <ion-button\n        mat-button\n        [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n        [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n        (click)=\"applyFilterAndClosePanel($event)\"\n      >\n        <ion-text translate>COMMON.BTN_APPLY</ion-text>\n      </ion-button>\n    </mat-action-row>\n  </mat-expansion-panel>\n\n  <!-- table -->\n  <div [class.table-container]=\"!enableInfiniteScroll\">\n    <table\n      #table\n      mat-table\n      matSort\n      matSortDisableClear\n      [dataSource]=\"dataSource\"\n      [matSortActive]=\"defaultSortBy\"\n      [matSortDirection]=\"defaultSortDirection\"\n      [trackBy]=\"trackByFn\"\n      [style.--mat-row-height]=\"rowHeight + 'px'\"\n    >\n      <!-- group header cells -->\n      <ng-container matColumnDef=\"top-start\" [sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\" [attr.colspan]=\"2\">\n          <!-- start spacer -->\n        </th>\n      </ng-container>\n\n      <ng-container matColumnDef=\"group-1\">\n        <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"3\">\n          <ion-label translate>{{ i18nColumnPrefix + 'GROUP_1' }}</ion-label>\n        </th>\n      </ng-container>\n\n      <ng-container matColumnDef=\"group-2\">\n        <th mat-header-cell *matHeaderCellDef [attr.colspan]=\"displayedColumns.length - 6\">\n          <ion-label translate>{{ i18nColumnPrefix + 'GROUP_2' }}</ion-label>\n        </th>\n      </ng-container>\n\n      <ng-container matColumnDef=\"top-end\" [stickyEnd]=\"stickyEnd\">\n        <th mat-header-cell *matHeaderCellDef>\n          <!-- end spacer -->\n          <ion-label></ion-label>\n        </th>\n      </ng-container>\n\n      <ng-container matColumnDef=\"select\" [sticky]=\"sticky\" [class.mat-column-sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n          @if (selection | isMultipleSelection) {\n            <mat-checkbox\n              [checked]=\"this | isAllSelected\"\n              [indeterminate]=\"this | isNotAllSelected\"\n              (change)=\"$event ? masterToggle() : null\"\n            ></mat-checkbox>\n          }\n        </th>\n        <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n          <mat-checkbox\n            (click)=\"toggleSelectRow($event, row)\"\n            [checked]=\"selection | isSelected: row\"\n            tabindex=\"-1\"\n          ></mat-checkbox>\n        </td>\n      </ng-container>\n\n      <!-- Id column -->\n      <ng-container matColumnDef=\"id\" [sticky]=\"sticky\" [class.mat-column-sticky]=\"sticky\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label>#</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\">{{ row.currentData?.id }}</td>\n      </ng-container>\n\n      <!-- Label column -->\n      <ng-container matColumnDef=\"label\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label translate>TABLE.TESTING.LABEL</ion-label>\n        </th>\n        <td\n          mat-cell\n          *matCellDef=\"let row\"\n          (click)=\"focusColumn = 'label'\"\n          [appCellId]=\"{ rowId: row.id, columnName: 'label' }\"\n        >\n          @if (row.editing) {\n            <mat-form-field>\n              <input\n                matInput\n                autocomplete=\"off\"\n                [formControl]=\"row.validator.controls['label']\"\n                [placeholder]=\"'TABLE.TESTING.LABEL' | translate\"\n                [appAutofocus]=\"focusColumn === 'label'\"\n                [readonly]=\"!row.editing\"\n              />\n              <mat-error *ngIf=\"row.validator.controls['label'].hasError('required')\" translate>\n                ERROR.FIELD_REQUIRED\n              </mat-error>\n            </mat-form-field>\n          } @else {\n            <ion-label appAutoTooltip>\n              {{ row.validator | formGetValue: 'label' }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- Name column -->\n      <ng-container matColumnDef=\"name\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label translate>TABLE.TESTING.NAME</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'name'\">\n          @if (row.editing) {\n            <mat-form-field>\n              <input\n                matInput\n                [formControl]=\"row.validator?.controls.name\"\n                [placeholder]=\"'TABLE.TESTING.NAME' | translate\"\n                [appAutofocus]=\"focusColumn === 'name'\"\n              />\n              <mat-error *ngIf=\"row.validator?.controls.name.hasError('required')\" translate>\n                ERROR.FIELD_REQUIRED\n              </mat-error>\n            </mat-form-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'name' }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- Level column -->\n      <ng-container matColumnDef=\"levelId\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label translate>TABLE.TESTING.LEVEL_ID</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'levelId'\">\n          @if (row.editing) {\n            <mat-autocomplete-field\n              [formControl]=\"row.validator.controls.levelId\"\n              [placeholder]=\"'TABLE.TESTING.LEVEL_ID' | translate\"\n              floatLabel=\"never\"\n              [config]=\"autocompleteFields.level\"\n              [readonly]=\"!row.editing\"\n              [autofocus]=\"focusColumn === 'levelId'\"\n              [required]=\"true\"\n            ></mat-autocomplete-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'levelId' | referentialToString: autocompleteFields.level.attributes }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- Status column  -->\n      <ng-container matColumnDef=\"statusId\">\n        <th mat-header-cell *matHeaderCellDef>\n          <span translate>USER.STATUS</span>\n        </th>\n        <td\n          mat-cell\n          *matCellDef=\"let row\"\n          [class.mat-form-field-disabled]=\"!row.editing\"\n          (click)=\"focusColumn = 'statusId'\"\n        >\n          <mat-form-field>\n            <mat-select\n              [formControl]=\"row.validator.controls['statusId']\"\n              [placeholder]=\"i18nColumnPrefix + 'STATUS_ID' | translate\"\n            >\n              <mat-option *ngFor=\"let item of statusList\" [value]=\"item.id\">\n                <mat-icon><ion-icon [name]=\"item.icon\"></ion-icon></mat-icon>\n                <mat-label>{{ item.label | translate }}</mat-label>\n              </mat-option>\n            </mat-select>\n            <mat-error *ngIf=\"row.validator.controls['statusId'].hasError('required')\" translate>\n              ERROR.FIELD_REQUIRED\n            </mat-error>\n          </mat-form-field>\n        </td>\n      </ng-container>\n\n      <!-- Enum column  -->\n      <!-- NOTE : Never used in table  -->\n      <!--      <ng-container matColumnDef=\"values\">-->\n      <!--        <th mat-header-cell *matHeaderCellDef>-->\n      <!--          <span translate>Enums</span>-->\n      <!--        </th>-->\n      <!--        <td mat-cell *matCellDef=\"let row\" [class.mat-form-field-disabled]=\"!row.editing\">-->\n      <!--          <app-form-field-->\n      <!--            [formControl]=\"row.validator|formGetControl:'properties.values'\"-->\n      <!--            [definition]=\"columnDefinitions['values']\"-->\n      <!--          ></app-form-field>-->\n      <!--        </td>-->\n      <!--      </ng-container>-->\n\n      <!-- boolean (as checkbox) -->\n      <ng-container matColumnDef=\"boolean\">\n        <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\">\n          <!-- if sortable, wrap the header with a mat-sort-header -->\n          <span mat-sort-header>\n            <ion-label>Boolean</ion-label>\n          </span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\">\n          @if (!readOnly && row.editing) {\n            <mat-boolean-field\n              floatLabel=\"never\"\n              [style]=\"'checkbox'\"\n              placeholder=\"Oui/Non\"\n              [formControl]=\"row.validator | formGetControl: 'properties.boolean'\"\n              [compact]=\"true\"\n            ></mat-boolean-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{ (row.validator | formGetValue: 'properties.boolean') ? '&#x2714;' : '&#x2718;' }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- date -->\n      <ng-container matColumnDef=\"date\">\n        <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\" class=\"mat-cell-date-time\">\n          <!-- if sortable, wrap the header with a mat-sort-header -->\n          <span mat-sort-header>\n            <ion-label>Date</ion-label>\n          </span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\" (click)=\"focusColumn = 'date'\">\n          @if (!readOnly && row.editing) {\n            <mat-date-time-field\n              floatLabel=\"never\"\n              [formControl]=\"row.validator | formGetControl: 'properties.date'\"\n              [autofocus]=\"focusColumn === 'date'\"\n              placeholder=\"Date/Time\"\n              [compact]=\"true\"\n            ></mat-date-time-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{ row.validator | formGetValue: 'properties.date' | dateFormat: { time: true } }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- latitude -->\n      <ng-container matColumnDef=\"latitude\">\n        <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"true\">\n          <!-- if sortable, wrap the header with a mat-sort-header -->\n          <span mat-sort-header>\n            <ion-label>Latitude</ion-label>\n          </span>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" (click)=\"focusColumn = 'latitude'\">\n          @if (!readOnly && row.editing) {\n            <mat-latlong-field\n              floatLabel=\"never\"\n              [formControl]=\"row.validator | formGetControl: 'properties.latitude'\"\n              placeholder=\"Latitude\"\n              [latLongPattern]=\"'DDMM'\"\n              [type]=\"'latitude'\"\n              [autofocus]=\"focusColumn === 'latitude'\"\n            ></mat-latlong-field>\n          } @else {\n            <ion-label appAutoTitle>\n              {{\n                row.validator\n                  | formGetValue: 'properties.latitude'\n                  | latitudeFormat: { pattern: 'DDMM', placeholderChar: '0' }\n              }}\n            </ion-label>\n          }\n        </td>\n      </ng-container>\n\n      <!-- Creation date column -->\n      <ng-container matColumnDef=\"updateDate\">\n        <th mat-header-cell *matHeaderCellDef mat-sort-header>\n          <ion-label translate>TABLE.TESTING.UPDATE_DATE</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\" class=\"mat-form-field-disabled\">\n          <ion-text color=\"medium\" *ngIf=\"row.id !== -1\">\n            <small>\n              {{ row.validator | formGetValue: 'creationDate' | dateFormat: { time: true } }}\n            </small>\n          </ion-text>\n        </td>\n      </ng-container>\n\n      <!-- Comment column -->\n      <ng-container matColumnDef=\"comments\">\n        <th mat-header-cell *matHeaderCellDef>\n          <ion-label translate>TABLE.TESTING.COMMENTS</ion-label>\n        </th>\n        <td mat-cell *matCellDef=\"let row\">\n          <mat-form-field *ngIf=\"row.editing; else iconComment\">\n            <!--<textarea matInput [formControl]=\"row.validator?.controls.comments\"\n                      [placeholder]=\"'TABLE.TESTING.COMMENTS'|translate\"\n                      [readonly]=\"!row.editing\"></textarea>-->\n\n            <input\n              type=\"text\"\n              matInput\n              [formControl]=\"row.validator?.controls.comments\"\n              [placeholder]=\"'TABLE.TESTING.COMMENTS' | translate\"\n              [readonly]=\"!row.editing\"\n            />\n          </mat-form-field>\n\n          <ng-template #iconComment>\n            <ion-icon\n              [color]=\"row.validator?.controls.comments.value ? 'tertiary' : 'medium'\"\n              name=\"chatbox\"\n              slot=\"icon-only\"\n            ></ion-icon>\n          </ng-template>\n        </td>\n      </ng-container>\n\n      <!-- Actions column -->\n      <app-nav-actions-column\n        [stickyEnd]=\"stickyEnd\"\n        (optionsClick)=\"openSelectColumnsModal($event)\"\n        [cellTemplate]=\"cellInjection\"\n        [showPending]=\"true\"\n      >\n        <!-- cell injection-->\n        <ng-template #cellInjection let-row>\n          <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n        </ng-template>\n      </app-nav-actions-column>\n\n      <tr mat-header-row *matHeaderRowDef=\"groupColumns\"></tr>\n      <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n      <tr\n        mat-row\n        *matRowDef=\"let row; columns: displayedColumns\"\n        [class.mat-mdc-row-selected]=\"row.editing\"\n        [class.mat-mdc-row-error]=\"row.invalid\"\n        [class.mat-mdc-row-disabled]=\"!row.editing\"\n        [class.mat-mdc-row-dirty]=\"row.dirty\"\n        (click)=\"clickRow($event, row)\"\n        (keydown.escape)=\"escapeEditingRow($event)\"\n        [cdkTrapFocus]=\"row.invalid\"\n      ></tr>\n    </table>\n\n    <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n      <ion-item>\n        <ion-skeleton-text animated></ion-skeleton-text>\n      </ion-item>\n    </ng-container>\n\n    <ng-template #noResult>\n      <ion-item *ngIf=\"totalRowCount === 0\">\n        <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n      </ion-item>\n    </ng-template>\n\n    <ion-infinite-scroll\n      *ngIf=\"enableInfiniteScroll\"\n      [threshold]=\"mobile ? '10%' : '2%'\"\n      position=\"bottom\"\n      (ionInfinite)=\"fetchMore($event)\"\n    >\n      <ion-infinite-scroll-content\n        loadingSpinner=\"circles\"\n        [loadingText]=\"'COMMON.LOADING_DOTS' | translate\"\n      ></ion-infinite-scroll-content>\n    </ion-infinite-scroll>\n  </div>\n</ion-content>\n\n<ion-footer>\n  <!-- Paginator  -->\n  <mat-paginator\n    *ngIf=\"!enableInfiniteScroll\"\n    [length]=\"totalRowCount\"\n    [pageSize]=\"defaultPageSize\"\n    [pageSizeOptions]=\"defaultPageSizeOptions\"\n    showFirstLastButtons\n  ></mat-paginator>\n\n  <app-form-buttons-bar\n    *ngIf=\"canEdit && !mobile\"\n    (onCancel)=\"load()\"\n    (onSave)=\"save()\"\n    [disabled]=\"(loadingSubject | async) || !dirty\"\n  >\n    <!-- error -->\n    <ion-item *ngIf=\"error$ | async\" lines=\"none\">\n      <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n      <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n    </ion-item>\n  </app-form-buttons-bar>\n</ion-footer>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"canEdit && mobile\">\n  <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n    <ion-icon name=\"add\"></ion-icon>\n  </ion-fab-button>\n</ion-fab>\n","import { AfterViewInit, ChangeDetectionStrategy, Component, forwardRef, inject, Injector, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { Referential } from '../../services/model/referential.model';\nimport { IonInfiniteScroll } from '@ionic/angular';\nimport { InMemoryEntitiesService } from '../../../shared/services/memory-entity-service.class';\nimport { AppValidatorService } from '../../services/validator/base.validator.class';\nimport { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { isNil } from '../../../shared/functions';\nimport { debounceTime, filter, tap } from 'rxjs/operators';\nimport { MatExpansionPanel } from '@angular/material/expansion';\nimport { ReferentialFilter } from '../../services/testing/referential-filter.model';\nimport { DEFAULT_PAGE_SIZE, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../table.model';\n\nimport { APP_SHOW_TOOLTIP } from '../../../shared/constants';\nimport { AppAsyncTable } from '../async-table.class';\nimport { EntitiesAsyncTableDataSource } from '../entities-async-table-datasource.class';\nimport { StatusIds } from '../../services/model/model.enum';\nimport {\n  APP_CELL_SELECTION_SERVICE_TOKEN,\n  CellSelectionEvent,\n  CellSelectionService,\n  ICellId,\n} from '../../../shared/directives/cell-selection/cell-selection.service';\nimport { Table2ValidatorService } from './table2-validator.service';\nimport { AppTable } from '../table.class';\nimport { Table2TestPage } from './table2.testing';\n\n@Component({\n  selector: 'app-nested-table-testing',\n  templateUrl: 'nested-table.testing.html',\n  providers: [\n    {\n      provide: AppValidatorService,\n      useClass: Table2ValidatorService,\n    },\n    {\n      provide: AppTable,\n      useExisting: forwardRef(() => Table2TestPage),\n    },\n    // Provide options :\n    // {\n    //   provide: APP_CELL_SELECTION_SERVICE_CONFIG_TOKEN,\n    //   useFactory: () => {\n    //     return <CellSelectionServiceConfig<ICellId>>{\n    //       equals: (cell1, cell2) => {\n    //         console.debug('[table2-test] Comparing cell ids:', cell1, cell2);\n    //         return cell1?.rowId === cell2?.rowId && cell1?.columnName === cell2?.columnName;\n    //       },\n    //     };\n    //   },\n    // },\n    {\n      provide: APP_CELL_SELECTION_SERVICE_TOKEN,\n      useClass: CellSelectionService,\n    },\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NestedTableTestPage extends AppAsyncTable<Referential, ReferentialFilter> implements OnInit, OnDestroy, AfterViewInit {\n  static readonly maxRowCount = 100;\n\n  canEdit = true;\n  data: Referential[];\n  filterForm: UntypedFormGroup;\n  filterCriteriaCount = 0;\n  rowHeight = 33;\n  enableInfiniteScroll: boolean;\n  checkBoxSelection = true;\n  resizable = true;\n  showTable2 = false;\n\n  @Input() filterPanelFloating = true;\n  @Input() sticky = true;\n  @Input() stickyEnd = true;\n\n  get hasMoreData(): boolean {\n    return this.data.length < 100;\n  }\n\n  @ViewChild(MatExpansionPanel, { static: true }) filterExpansionPanel: MatExpansionPanel;\n  @ViewChild(IonInfiniteScroll) infiniteScroll: IonInfiniteScroll;\n\n  protected readonly selectableColumns = ['name', 'levelId', 'boolean'];\n\n  get dataService(): InMemoryEntitiesService<Referential> {\n    return this._dataSource.dataService as InMemoryEntitiesService<Referential>;\n  }\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    injector: Injector,\n    protected validatorService: AppValidatorService,\n    protected formBuilder: UntypedFormBuilder\n  ) {\n    super(\n      injector,\n      [\n        ...RESERVED_START_COLUMNS,\n        'name',\n        'levelId',\n        'boolean',\n        'boolean2',\n        //'boolean3',\n        ...RESERVED_END_COLUMNS,\n      ],\n      new EntitiesAsyncTableDataSource(\n        Referential,\n        new InMemoryEntitiesService(Referential, ReferentialFilter, {\n          sortByReplacement: { id: 'id' },\n        }),\n        validatorService,\n        {\n          suppressErrors: false,\n        }\n      ),\n      null\n    );\n\n    // Works with true and false\n    this.enableInfiniteScroll = this.mobile;\n\n    this.autoLoad = false;\n    this.inlineEdition = true;\n    this.i18nColumnPrefix = 'TABLE.TESTING.';\n\n    this.confirmBeforeDelete = true;\n    this.confirmBeforeCancel = false;\n    this.undoableDeletion = false;\n    this.saveBeforeDelete = false;\n\n    this.saveBeforeSort = true;\n    this.saveBeforeFilter = true;\n    this.propagateRowError = true;\n\n    this.filterForm = formBuilder.group({\n      searchText: [null],\n    });\n\n    this.onStartEditingRow.subscribe((row) => {\n      row.validator.patchValue({ entityName: 'TestVO' }, { emitEvent: false });\n    });\n  }\n\n  ngOnInit() {\n    super.ngOnInit();\n\n    // Update filter when changes\n    this.registerSubscription(\n      this.filterForm.valueChanges\n        .pipe(\n          debounceTime(250),\n          filter(() => this.filterForm.valid),\n          tap((value) => {\n            const filter = ReferentialFilter.fromObject(value);\n            this.filterCriteriaCount = filter.countNotEmptyCriteria();\n            this.markForCheck();\n            // Applying the filter\n            this.setFilter(filter, { emitEvent: false });\n          }),\n          // Save filter in settings (after a debounce time)\n          debounceTime(500),\n          tap((json) => this.settings.savePageSetting(this.settingsId, json, 'filter'))\n        )\n        .subscribe()\n    );\n\n    this.registerAutocompleteField('level', {\n      items: [\n        { id: 1, label: 'A', name: 'item A' },\n        { id: 1, label: 'B', name: 'item B' },\n      ],\n      mobile: this.mobile,\n    });\n\n    this.registerSubscription(\n      this.onRefresh.subscribe(() => {\n        this.filterForm.markAsUntouched();\n        this.filterForm.markAsPristine();\n      })\n    );\n\n    this.markAsReady();\n  }\n\n  async ngAfterViewInit() {\n    super.ngAfterViewInit();\n\n    // Restore filter from settings\n    await this.restoreFilter();\n\n    // Load data\n    this.load();\n  }\n\n  ngOnDestroy() {\n    console.debug('[test-table] Destroying table...');\n    super.ngOnDestroy();\n  }\n\n  protected async restoreFilter() {\n    await this.settings.ready();\n\n    const json = this.settings.getPageSettings(this.settingsId, 'filter');\n    console.debug('[table-test] Restoring filter from settings...', json);\n\n    if (json) {\n      const filter = ReferentialFilter.fromObject(json);\n      this.filterForm.patchValue(json, { emitEvent: false });\n      this.filterCriteriaCount = filter.countNotEmptyCriteria();\n      this.setFilter(filter, { emitEvent: true });\n      this.markForCheck();\n    }\n  }\n\n  async load() {\n    console.debug('[test-table] Updating data...');\n    this.markAsLoading();\n\n    if (isNil(this.data)) {\n      this.data = this.generateData(0, Table2TestPage.maxRowCount);\n    }\n    this.dataService.value = this.data;\n\n    this.emitRefresh();\n  }\n\n  async fetchMore(event) {\n    console.debug('[table-test] Loading more...', event);\n    const fetched = await this._dataSource.fetchMore();\n\n    if (fetched && event?.target && event.target.complete) {\n      // Wait end of load\n      await this.waitIdle();\n      // Mark target event as completed (e.g. IonRefresher)\n      event.target.complete();\n    }\n  }\n\n  async save(opts?: { keepEditing?: boolean }): Promise<boolean> {\n    const saved = await super.save(opts);\n    if (saved) {\n      // Update source data\n      this.data = this.dataService.value;\n    }\n    return saved;\n  }\n\n  clearControlValue(event: Event, formControl: AbstractControl): boolean {\n    if (event) event.stopPropagation(); // Avoid to enter input the field\n    formControl.setValue(null);\n    return false;\n  }\n\n  toggleFilterPanelFloating() {\n    this.filterPanelFloating = !this.filterPanelFloating;\n    this.markForCheck();\n  }\n\n  applyFilterAndClosePanel(event?: Event) {\n    this.defaultPageSize = DEFAULT_PAGE_SIZE;\n    this.emitRefresh();\n    if (this.filterPanelFloating) this.filterExpansionPanel?.close();\n  }\n\n  closeFilterPanel() {\n    this.filterExpansionPanel?.close();\n    if (!this.filterPanelFloating) {\n      this.filterPanelFloating = true;\n      this.markForCheck();\n    }\n  }\n\n  async resetFilter(event?: Event) {\n    this.filterForm.reset({}, { emitEvent: true });\n    await this.setFilter(ReferentialFilter.fromObject({}), { emitEvent: true });\n    this.filterExpansionPanel.close();\n  }\n\n  protected generateData(offset?: number, size?: number): Referential[] {\n    offset = offset || 0;\n    size = size || 100;\n\n    const result = new Array<Referential>();\n    for (let i = 0; i < size; i++) {\n      const id = i + 1 + offset;\n      const item = Referential.fromObject({\n        id,\n        label: 'CODE-' + id,\n        name: 'Name #' + id,\n        levelId: { id: 1, label: 'A', name: 'Item A' },\n        statusId: StatusIds.ENABLE,\n        comments: 'My comment #' + id,\n        boolean: id % 2 === 0,\n        boolean2: true,\n        // boolean3: false,\n        entityName: 'TestVO',\n      });\n      result.push(item);\n    }\n\n    return result;\n  }\n\n  protected onCellSelectionChange(event: CellSelectionEvent<ICellId>) {\n    this.markForCheck();\n    console.debug('[table2-test] Selection changed:', {\n      selectedCells: event.selectedCells,\n      isRange: event.isRangeSelection,\n      isToggle: event.isToggleSelection,\n    });\n  }\n\n  protected onCellRightClick(event: MouseEvent) {\n    console.debug('[table2-test] Right click on cell:', event);\n  }\n}\n","<div style=\"display: flex; flex-wrap: nowrap; width: 100%; height: 100%\">\n  <div style=\"flex: 0 0 50%; box-sizing: border-box\">\n    <app-toolbar\n      color=\"primary\"\n      [canGoBack]=\"true\"\n      [hasValidate]=\"(loadingSubject | async) !== true && (dirtySubject | async) === true\"\n      (onValidate)=\"save()\"\n      [backHref]=\"'/testing'\"\n    >\n      <ion-title>Table with cell selection</ion-title>\n\n      <ion-buttons slot=\"end\">\n        @if (selection | isEmptySelection) {\n          <mat-label>\n            {{ showTable2 ? 'With 2nd table with cell selection' : 'With 2nd table without cell selection' }}\n          </mat-label>\n          <mat-checkbox [(ngModel)]=\"showTable2\"></mat-checkbox>\n\n          <input matInput type=\"number\" step=\"1\" style=\"color: black; width: 50px\" [(ngModel)]=\"rowHeight\" />\n\n          <!-- Add -->\n          <button\n            mat-icon-button\n            *ngIf=\"canEdit && !mobile\"\n            [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n            (click)=\"addRow()\"\n          >\n            <mat-icon>add</mat-icon>\n          </button>\n\n          <!-- reset filter -->\n          <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n            <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n            <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n          </button>\n\n          <!-- show filter -->\n          <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n            <mat-icon\n              *ngIf=\"filterCriteriaCount; else emptyFilter\"\n              [matBadge]=\"filterCriteriaCount\"\n              matBadgeColor=\"accent\"\n              matBadgeSize=\"small\"\n              matBadgePosition=\"above after\"\n              aria-hidden=\"false\"\n            >\n              filter_list_alt\n            </mat-icon>\n            <ng-template #emptyFilter>\n              <mat-icon>filter_list_alt</mat-icon>\n            </ng-template>\n          </button>\n\n          <!-- save -->\n          <button mat-icon-button *ngIf=\"mobile\" [disabled]=\"(dirtySubject | async) !== true\" (click)=\"save()\">\n            <mat-icon>save</mat-icon>\n          </button>\n        } @else {\n          <!-- if row selection -->\n          <!-- delete -->\n          <button\n            mat-icon-button\n            *ngIf=\"canEdit\"\n            [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n            (click)=\"deleteSelection($event)\"\n          >\n            <mat-icon>delete</mat-icon>\n          </button>\n\n          <!-- duplicate -->\n          <button\n            mat-icon-button\n            *ngIf=\"canEdit && selection.selected | isArrayLength: { equals: 1 }\"\n            [title]=\"!showTooltip ? ('COMMON.BTN_DUPLICATE' | translate) : ''\"\n            [matTooltip]=\"showTooltip ? ('COMMON.BTN_DUPLICATE' | translate) : ''\"\n            (click)=\"duplicateRow($event, selection.selected[0])\"\n          >\n            <mat-icon>file_copy</mat-icon>\n          </button>\n        }\n      </ion-buttons>\n    </app-toolbar>\n    <ion-content class=\"ion-no-padding\">\n      <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n        <ion-refresher-content></ion-refresher-content>\n      </ion-refresher>\n\n      <!-- error -->\n      <ion-item *ngIf=\"mobile && error\" lines=\"none\" @slideUpDownAnimation>\n        <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n        <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n      </ion-item>\n\n      <!-- search -->\n      <mat-expansion-panel\n        #filterExpansionPanel\n        class=\"filter-panel\"\n        [class.filter-panel-floating]=\"filterPanelFloating\"\n        [class.filter-panel-pinned]=\"!filterPanelFloating\"\n      >\n        <form\n          class=\"form-container ion-padding-top\"\n          [formGroup]=\"filterForm\"\n          (ngSubmit)=\"applyFilterAndClosePanel($event)\"\n        >\n          <ion-grid>\n            <ion-row>\n              <ion-col>\n                <!-- search text -->\n                <mat-form-field>\n                  <mat-label>{{ 'TABLE.TESTING.SEARCH_TEXT' | translate }}</mat-label>\n                  <ion-icon matPrefix name=\"search\"></ion-icon>\n                  <input matInput formControlName=\"searchText\" autocomplete=\"off\" />\n                  <button\n                    mat-icon-button\n                    matSuffix\n                    tabindex=\"-1\"\n                    type=\"button\"\n                    (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n                    [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n                  >\n                    <mat-icon>close</mat-icon>\n                  </button>\n                </mat-form-field>\n              </ion-col>\n            </ion-row>\n          </ion-grid>\n        </form>\n\n        <mat-action-row>\n          <!-- Counter  -->\n          <ion-label\n            [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n            [color]=\"empty && 'danger'\"\n            class=\"ion-padding\"\n          >\n            {{\n              (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n                | translate\n                  : {\n                      count: (totalRowCount | numberFormat),\n                    }\n            }}\n          </ion-label>\n\n          <div class=\"toolbar-spacer\"></div>\n\n          <button\n            mat-icon-button\n            color=\"accent\"\n            *ngIf=\"filterPanelFloating\"\n            (click)=\"toggleFilterPanelFloating()\"\n            class=\"hidden-xs hidden-sm hidden-md\"\n            [title]=\"!showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n            [matTooltip]=\"\n              showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\n            \"\n          >\n            <mat-icon>\n              <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '&#xbb;' : '&#xab;' }}</span>\n            </mat-icon>\n          </button>\n\n          <!-- Close panel -->\n          <ion-button\n            mat-button\n            fill=\"clear\"\n            color=\"dark\"\n            (click)=\"closeFilterPanel()\"\n            [disabled]=\"loadingSubject | async\"\n          >\n            <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n          </ion-button>\n\n          <!-- Search button -->\n          <ion-button\n            mat-button\n            [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n            [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n            (click)=\"applyFilterAndClosePanel($event)\"\n          >\n            <ion-text translate>COMMON.BTN_APPLY</ion-text>\n          </ion-button>\n        </mat-action-row>\n      </mat-expansion-panel>\n\n      <!-- table -->\n      <div [class.table-container]=\"!enableInfiniteScroll\" style=\"position: relative\">\n        <table\n          #table\n          mat-table\n          matSort\n          matSortDisableClear\n          [dataSource]=\"dataSource\"\n          [matSortActive]=\"defaultSortBy\"\n          [matSortDirection]=\"defaultSortDirection\"\n          [trackBy]=\"trackByFn\"\n          [style.--mat-row-height]=\"rowHeight + 'px'\"\n          appCellSelection\n          [appSelectableColumns]=\"selectableColumns\"\n          [appCellSelectionDisabled]=\"invalid\"\n          (appCellSelectionChange)=\"onCellSelectionChange($event)\"\n          (appCellRightClick)=\"onCellRightClick($event)\"\n        >\n          <ng-container\n            matColumnDef=\"select\"\n            [sticky]=\"checkBoxSelection\"\n            [class.mat-column-sticky]=\"checkBoxSelection\"\n          >\n            <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!checkBoxSelection\">\n              @if (selection | isMultipleSelection) {\n                <mat-checkbox\n                  [checked]=\"this | isAllSelected\"\n                  [indeterminate]=\"this | isNotAllSelected\"\n                  (change)=\"$event ? masterToggle() : null\"\n                ></mat-checkbox>\n              }\n            </th>\n            <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!checkBoxSelection\">\n              <mat-checkbox\n                [checked]=\"selection | isSelected: row\"\n                (click)=\"toggleSelectRow($event, row)\"\n              ></mat-checkbox>\n            </td>\n          </ng-container>\n\n          <!-- Id column -->\n          <ng-container matColumnDef=\"id\" [sticky]=\"sticky\">\n            <th mat-header-cell *matHeaderCellDef>\n              <span mat-sort-header>\n                <ion-label title=\"Id\">#</ion-label>\n                <ion-label color=\"danger\" [innerHTML]=\"'&nbsp;*'\"></ion-label>\n              </span>\n            </th>\n            <td mat-cell *matCellDef=\"let row\" [appCellId]=\"{ rowId: row.id, columnName: 'id' }\">\n              <mat-form-field *ngIf=\"!readOnly && row.id === -1 && row.editing; else readOnlyId\">\n                <input\n                  matInput\n                  autocomplete=\"off\"\n                  required\n                  [formControl]=\"row.validator | formGetControl: 'id'\"\n                  placeholder=\"Id\"\n                  [appAutofocus]=\"true\"\n                />\n                <mat-error *ngIf=\"(row.validator | formGetControl: 'id').hasError('required')\" translate>\n                  ERROR.FIELD_REQUIRED\n                </mat-error>\n                <mat-error *ngIf=\"(row.validator | formGetControl: 'id').hasError('alreadyExists')\" translate>\n                  ERROR.FIELD_NOT_UNIQUE_ID\n                </mat-error>\n              </mat-form-field>\n\n              <ng-template #readOnlyId>\n                <ion-label appAutoTooltip>\n                  {{ (row.validator | formGetValue: 'id') || (row.currentData | propertyGet: 'id') }}\n                </ion-label>\n              </ng-template>\n            </td>\n          </ng-container>\n\n          <!-- Name column -->\n          <ng-container matColumnDef=\"name\">\n            <th mat-header-cell *matHeaderCellDef [resizable]=\"resizable\">\n              <!-- if sortable, wrap the header with a mat-sort-header -->\n              <span mat-sort-header>\n                <ion-label\n                  [title]=\"!showTooltip ? ('TABLE.TESTING.NAME' | translate) : ''\"\n                  [matTooltip]=\"showTooltip ? ('TABLE.TESTING.NAME' | translate) : ''\"\n                >\n                  {{ 'TABLE.TESTING.NAME' | translate }}\n                </ion-label>\n                <ion-label color=\"danger\" [innerHTML]=\"'&nbsp;*'\"></ion-label>\n              </span>\n            </th>\n            <td\n              mat-cell\n              *matCellDef=\"let row\"\n              (click)=\"focusColumn = 'name'\"\n              [appCellId]=\"{ rowId: row.id, columnName: 'name' }\"\n            >\n              <mat-form-field *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\">\n                <input\n                  matInput\n                  autocomplete=\"off\"\n                  [required]=\"true\"\n                  [formControl]=\"row.validator | formGetControl: 'name'\"\n                  [placeholder]=\"'TABLE.TESTING.NAME' | translate\"\n                  [appAutofocus]=\"row.id === -1 || focusColumn === 'name'\"\n                />\n                <ng-content select=\"[suffix]\"></ng-content>\n                <mat-error *ngIf=\"(row.validator | formGetControl: 'name').hasError('required')\" translate>\n                  ERROR.FIELD_REQUIRED\n                </mat-error>\n                <mat-error *ngIf=\"(row.validator | formGetControl: 'name').hasError('maxlength')\" translate>\n                  ERROR.FIELD_MAX_LENGTH_COMPACT\n                </mat-error>\n                <mat-error *ngIf=\"(row.validator | formGetControl: 'name').hasError('minlength')\" translate>\n                  ERROR.FIELD_MIN_LENGTH_COMPACT\n                </mat-error>\n              </mat-form-field>\n              <ng-template #readOnlyTemplate>\n                <ion-label appAutoTooltip>\n                  {{ (row.validator | formGetValue: 'name') || (row.currentData | propertyGet: 'name') }}\n                </ion-label>\n              </ng-template>\n            </td>\n          </ng-container>\n\n          <!-- Level column -->\n          <ng-container matColumnDef=\"levelId\">\n            <th mat-header-cell *matHeaderCellDef [resizable]=\"resizable\">\n              <span mat-sort-header>\n                <ion-label>{{ 'TABLE.TESTING.LEVEL_ID' | translate }}</ion-label>\n                <ion-label color=\"danger\" [innerHTML]=\"'&nbsp;*'\"></ion-label>\n              </span>\n            </th>\n            <td mat-cell *matCellDef=\"let row\" [appCellId]=\"{ rowId: row.id, columnName: 'levelId' }\">\n              <mat-autocomplete-field\n                *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\"\n                panelWidth=\"750px\"\n                [formControl]=\"row.validator | formGetControl: 'levelId'\"\n                [placeholder]=\"'TABLE.TESTING.LEVEL_ID' | translate\"\n                floatLabel=\"never\"\n                [required]=\"true\"\n                [config]=\"autocompleteFields.level\"\n                [highlightAccent]=\"true\"\n              >\n                <mat-error matError *ngIf=\"(row.validator | formGetControl: 'levelId').hasError('invalid')\" translate>\n                  ERROR.FIELD_INVALID\n                </mat-error>\n              </mat-autocomplete-field>\n              <ng-template #readOnlyTemplate>\n                <ion-label appAutoTooltip>\n                  {{\n                    autocompleteFields.level?.displayWith(\n                      (row.validator | formGetValue: 'levelId') || (row.currentData | propertyGet: 'levelId')\n                    ) ||\n                      ((row.validator | formGetValue: 'levelId') || (row.currentData | propertyGet: 'levelId')\n                        | referentialToString)\n                  }}\n                </ion-label>\n              </ng-template>\n            </td>\n          </ng-container>\n\n          <ng-container matColumnDef=\"boolean\">\n            <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"resizable\">\n              <!-- if sortable, wrap the header with a mat-sort-header -->\n              <span mat-sort-header>\n                <ion-label>Boolean</ion-label>\n              </span>\n            </th>\n            <td mat-cell *matCellDef=\"let row\" [appCellId]=\"{ rowId: row.id, columnName: 'boolean' }\">\n              <mat-boolean-field\n                *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\"\n                floatLabel=\"never\"\n                [style]=\"'checkbox'\"\n                [formControl]=\"\n                  (row.validator | formGetControl: 'boolean') || formBuilder.control(row.currentData['boolean'])\n                \"\n                [compact]=\"true\"\n              ></mat-boolean-field>\n              <ng-template #readOnlyTemplate>\n                <ion-label appAutoTooltip>\n                  {{\n                    (row.validator | formGetValue: 'boolean') || (row.currentData | propertyGet: 'boolean')\n                      ? ('COMMON.YES' | translate)\n                      : ('COMMON.NO' | translate)\n                  }}\n                </ion-label>\n              </ng-template>\n            </td>\n          </ng-container>\n\n          <ng-container matColumnDef=\"boolean2\">\n            <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"resizable\">\n              <!-- if sortable, wrap the header with a mat-sort-header -->\n              <span mat-sort-header>\n                <ion-label>Boolean 2</ion-label>\n              </span>\n            </th>\n            <td mat-cell *matCellDef=\"let row\" [appCellId]=\"{ rowId: row.id, columnName: 'boolean2' }\">\n              <mat-boolean-field\n                *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\"\n                [floatLabel]=\"'never'\"\n                [style]=\"'radio'\"\n                [showRadio]=\"true\"\n                [formControl]=\"\n                  (row.validator | formGetControl: 'boolean2') || formBuilder.control(row.currentData['boolean2'])\n                \"\n              ></mat-boolean-field>\n              <ng-template #readOnlyTemplate>\n                <ion-label appAutoTooltip>\n                  {{\n                    (row.validator | formGetValue: 'boolean2') || (row.currentData | propertyGet: 'boolean2')\n                      ? ('COMMON.YES' | translate)\n                      : ('COMMON.NO' | translate)\n                  }}\n                </ion-label>\n              </ng-template>\n            </td>\n          </ng-container>\n\n          <ng-container matColumnDef=\"boolean3\">\n            <th mat-header-cell *matHeaderCellDef cdkDrag [resizable]=\"resizable\">\n              <!-- if sortable, wrap the header with a mat-sort-header -->\n              <span mat-sort-header>\n                <ion-label>Boolean 3</ion-label>\n              </span>\n            </th>\n            <td mat-cell *matCellDef=\"let row\">\n              <mat-boolean-field\n                *ngIf=\"!readOnly && row.editing; else readOnlyTemplate\"\n                floatLabel=\"never\"\n                [style]=\"'button'\"\n                [formControl]=\"\n                  (row.validator | formGetControl: 'boolean2') || formBuilder.control(row.currentData['boolean2'])\n                \"\n              ></mat-boolean-field>\n              <ng-template #readOnlyTemplate>\n                <ion-label appAutoTooltip>\n                  {{\n                    (row.validator | formGetValue: 'boolean2') || (row.currentData | propertyGet: 'boolean2')\n                      ? ('COMMON.YES' | translate)\n                      : ('COMMON.NO' | translate)\n                  }}\n                </ion-label>\n              </ng-template>\n            </td>\n          </ng-container>\n\n          <!-- Actions buttons column -->\n          <app-actions-column\n            [stickyEnd]=\"stickyEnd\"\n            [canCancel]=\"false\"\n            [style]=\"'table'\"\n            (optionsClick)=\"openSelectColumnsModal($event)\"\n            (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n            (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n            (backward)=\"confirmAndBackward($event.event, $event.row)\"\n            (forward)=\"confirmAndForward($event.event, $event.row)\"\n            [cellTemplate]=\"cellInjection\"\n          >\n            <!-- cell injection-->\n            <ng-template #cellInjection let-row>\n              <span *ngIf=\"row.editing && !row.validator.dirty\">-</span>\n            </ng-template>\n          </app-actions-column>\n\n          <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n          <tr\n            mat-row\n            *matRowDef=\"let row; columns: displayedColumns\"\n            [class.mat-row-selected]=\"row.editing\"\n            [class.mat-row-error]=\"row.invalid\"\n            [class.mat-row-disabled]=\"!row.editing\"\n            [class.mat-row-dirty]=\"row.dirty\"\n            (click)=\"clickRow($event, row)\"\n            (keydown.escape)=\"escapeEditingRow($event)\"\n            [cdkTrapFocus]=\"row.invalid\"\n          ></tr>\n        </table>\n\n        <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n          <ion-item>\n            <ion-skeleton-text animated></ion-skeleton-text>\n          </ion-item>\n        </ng-container>\n\n        <ng-template #noResult>\n          <ion-item *ngIf=\"totalRowCount === 0\">\n            <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n          </ion-item>\n        </ng-template>\n\n        <ion-infinite-scroll\n          *ngIf=\"enableInfiniteScroll\"\n          [threshold]=\"mobile ? '10%' : '2%'\"\n          position=\"bottom\"\n          (ionInfinite)=\"fetchMore($event)\"\n        >\n          <ion-infinite-scroll-content\n            loadingSpinner=\"circles\"\n            [loadingText]=\"'COMMON.LOADING_DOTS' | translate\"\n          ></ion-infinite-scroll-content>\n        </ion-infinite-scroll>\n      </div>\n    </ion-content>\n    <ion-footer>\n      <!-- Paginator  -->\n      <mat-paginator\n        *ngIf=\"!enableInfiniteScroll\"\n        [length]=\"totalRowCount\"\n        [pageSize]=\"defaultPageSize\"\n        [pageSizeOptions]=\"defaultPageSizeOptions\"\n        showFirstLastButtons\n      ></mat-paginator>\n\n      <app-form-buttons-bar\n        *ngIf=\"canEdit && !mobile\"\n        (onCancel)=\"load()\"\n        (onSave)=\"save()\"\n        [disabled]=\"(loadingSubject | async) || !dirty\"\n      >\n        <!-- error -->\n        <ion-item *ngIf=\"errorSubject | async\" lines=\"none\">\n          <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n          <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n        </ion-item>\n      </app-form-buttons-bar>\n    </ion-footer>\n    <ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"canEdit && mobile\">\n      <ion-fab-button color=\"tertiary\" (click)=\"addRow($event)\">\n        <ion-icon name=\"add\"></ion-icon>\n      </ion-fab-button>\n    </ion-fab>\n  </div>\n  <div style=\"flex: 0 0 50%; box-sizing: border-box\">\n    @if (showTable2) {\n      <app-table2-testing></app-table2-testing>\n    } @else {\n      <app-table-testing></app-table-testing>\n    }\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CoreModule } from '../../core.module';\nimport { TableTestPage } from './table.testing';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { FormsModule } from '@angular/forms';\nimport { Table2TestPage } from './table2.testing';\nimport { ResizableModule } from '../../../shared/directives/resizable/resizable.module';\nimport { CellIdentifierDirective } from '../../../shared/directives/cell-selection/cell-identifier.directive';\nimport { CellSelectionDirective } from '../../../shared/directives/cell-selection/cell-selection.directive';\nimport { NestedTableTestPage } from './nested-table.testing';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    SharedModule,\n    CoreModule,\n    TranslateModule.forChild(),\n    FormsModule,\n    ResizableModule,\n    CellIdentifierDirective,\n    CellSelectionDirective,\n  ],\n  declarations: [TableTestPage, Table2TestPage, NestedTableTestPage],\n  exports: [TableTestPage, Table2TestPage, NestedTableTestPage, TranslateModule],\n})\nexport class TableTestingModule {}\n","import { Component } from '@angular/core';\nimport { PopoverController, ToastController } from '@ionic/angular';\nimport { TextPopover, TextPopoverOptions } from '../text-popover.component';\nimport { TranslateService } from '@ngx-translate/core';\nimport { PlatformService } from '../../../services/platform.service';\n\n@Component({\n  selector: 'text-popover-testing',\n  templateUrl: 'text-popover.testing.html',\n})\nexport class TextPopoverTestingPage {\n  constructor(\n    private popoverController: PopoverController,\n    private toastController: ToastController,\n    private translate: TranslateService,\n    private platform: PlatformService\n  ) {}\n\n  async showPopover(event: Event, opts?: Partial<TextPopoverOptions>) {\n    const modal = await this.popoverController.create({\n      component: TextPopover,\n      componentProps: <TextPopoverOptions>{\n        title: 'modalTitle',\n        headerColor: 'primary',\n        placeholder: 'your text',\n        ...opts,\n      },\n      backdropDismiss: false,\n      keyboardClose: false,\n      event,\n      translucent: true,\n      cssClass: 'popover-large',\n    });\n\n    await modal.present();\n    const { data } = await modal.onDidDismiss();\n\n    if (data) {\n      console.info('Popover result: ', data);\n    }\n  }\n\n  protected async showSharePopoverWithButtons(event: UIEvent, opts?: Partial<TextPopoverOptions>) {\n    opts = {\n      ...opts,\n      text:\n        opts?.multiline !== false\n          ? 'Lorem ipsum dolor sit amet,\\nconsectetur adipiscing elit'\n          : 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',\n      editing: false,\n      headerButtons: [\n        {\n          icon: 'copy',\n          text: 'Copy',\n          fill: 'outline',\n          side: 'end',\n          handler: async (value: string) => {\n            await this.platform.copyToClipboard(\n              {\n                label: opts?.title,\n                string: value,\n              },\n              {\n                message: 'INFO.COPY_SUCCEED',\n              }\n            );\n\n            return false; // Avoid dismiss\n          },\n        },\n      ],\n    };\n\n    return this.showPopover(event, opts);\n  }\n}\n","<ion-toolbar color=\"primary\">\n  <ion-title>Text popover</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n  <p>\n    Multi lines examples:\n    <br />\n    <small>Press Ctrl+Enter to validate</small>\n    <small>\n      <pre>multiline: true</pre>\n    </small>\n  </p>\n\n  <ion-button (click)=\"showPopover($event, {})\" color=\"tertiary\">\n    <span translate>COMMON.BTN_SHOW</span>\n  </ion-button>\n\n  <ion-button (click)=\"showPopover($event, { autofocus: true })\" color=\"tertiary\">\n    <span translate>COMMON.BTN_SHOW</span>\n    &nbsp;(autofocus)\n  </ion-button>\n\n  <ion-button (click)=\"showSharePopoverWithButtons($event, { autofocus: true })\" color=\"tertiary\">\n    <span translate>COMMON.BTN_SHOW</span>\n    &nbsp;(headerButtons)\n  </ion-button>\n\n  <p>\n    One line examples:\n    <small>\n      <pre>multiline: false</pre>\n    </small>\n  </p>\n\n  <ion-button (click)=\"showPopover($event, { multiline: false })\" color=\"tertiary\">\n    <span translate>COMMON.BTN_SHOW</span>\n    &nbsp;\n  </ion-button>\n\n  <ion-button (click)=\"showPopover($event, { multiline: false, autofocus: true })\" color=\"tertiary\">\n    <span translate>COMMON.BTN_SHOW</span>\n    &nbsp;(autofocus)\n  </ion-button>\n\n  <ion-button (click)=\"showSharePopoverWithButtons($event, { multiline: false })\" color=\"tertiary\">\n    <span translate>COMMON.BTN_SHOW</span>\n    &nbsp;(headerButtons)\n  </ion-button>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { IonicModule } from '@ionic/angular';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { TextPopoverTestingPage } from './text-popover.testing';\n\n@NgModule({\n  imports: [CommonModule, IonicModule, TranslateModule.forChild()],\n  declarations: [TextPopoverTestingPage],\n  exports: [RouterModule, TextPopoverTestingPage],\n})\nexport class TextPopoverTestingModule {}\n","import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';\nimport { FormFieldDefinition } from '../../../../shared/form/field.model';\nimport { AppPropertiesForm } from '../properties.form';\nimport { StatusIds } from '../../../services/model/model.enum';\nimport { suggestFromArray } from '../../../../shared/services';\nimport { LoadResult, SuggestFn } from '../../../../shared/services/entity-service.class';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { PropertyValidator } from '../property.validator';\nimport { PropertyMap } from '../../../../shared/types';\nimport { SortDirection } from '@angular/material/sort';\n\nconst TEST_PROPERTIES = Object.freeze({\n  // Entity\n  ENTITY: <FormFieldDefinition>{\n    key: 'sumaris.properties.entity',\n    label: 'Select one entity',\n    type: 'entity',\n    autocomplete: {\n      showAllOnFocus: true,\n      filter: {\n        entityName: 'LocationLevel',\n        statusIds: [StatusIds.DISABLE, StatusIds.ENABLE],\n      },\n      attributes: ['label', 'name'],\n    },\n    defaultValue: null,\n  },\n\n  // Entities\n  ENTITIES: <FormFieldDefinition>{\n    key: 'sumaris.properties.entities',\n    label: 'Select many entities',\n    type: 'entities',\n    autocomplete: {\n      showAllOnFocus: true,\n      filter: {\n        entityName: 'LocationLevel',\n        statusIds: [StatusIds.DISABLE, StatusIds.ENABLE],\n      },\n      attributes: ['label', 'name'],\n    },\n    defaultValue: null,\n  },\n});\n\nconst FAKE_ENTITIES = [\n  { id: 1, label: 'AAA', name: 'Item A', description: 'Very long description A', comments: 'Very very long comments... again for A' },\n  { id: 2, label: 'BBB', name: 'Item B', description: 'Very long description B', comments: 'Very very long comments... again for B' },\n  { id: 3, label: 'CCC', name: 'Item C', description: 'Very long description C', comments: 'Very very long comments... again for C' },\n];\n\n@Component({\n  selector: 'app-properties-form-test',\n  templateUrl: './properties-form.test.html',\n})\nexport class PropertiesFormTestPage implements OnInit, AfterViewInit {\n  propertyDefinitions: FormFieldDefinition[];\n  i18nFieldPrefix: string;\n  form: FormGroup;\n\n  @ViewChild('propertiesForm', { read: AppPropertiesForm, static: true }) propertiesForm: AppPropertiesForm;\n\n  constructor(\n    protected formBuilder: FormBuilder,\n    protected pv: PropertyValidator\n  ) {\n    this.i18nFieldPrefix = '';\n    this.form = formBuilder.group({\n      properties: formBuilder.array([\n        this.formBuilder.group({\n          key: [null, Validators.compose([Validators.required, Validators.max(50)])],\n          value: [null, Validators.required],\n        }),\n      ]),\n    });\n\n    const suggestFn: SuggestFn<any, any> = (value, filter, sortBy, sortDirection, options) =>\n      this.suggestEntity(value, filter, sortBy, sortDirection, options);\n\n    this.propertyDefinitions = Object.values(TEST_PROPERTIES).map((def) => {\n      if (def.type === 'entity' || def.type === 'entities') {\n        def = { ...def }; // Copy\n        def.autocomplete.suggestFn = suggestFn;\n      }\n      return def;\n    });\n  }\n\n  ngOnInit() {\n    this.propertiesForm.markAsReady();\n    this.propertiesForm.enable();\n  }\n\n  async ngAfterViewInit() {\n    // Create the map, as it comes from the pod\n    const json = <PropertyMap>{\n      // Simple entity\n      [TEST_PROPERTIES.ENTITY.key]: FAKE_ENTITIES[0].id.toString(),\n\n      // Multiples entities\n      [TEST_PROPERTIES.ENTITIES.key]: [FAKE_ENTITIES[0], FAKE_ENTITIES[1]].map((entity) => entity.id).join(','),\n    };\n    await this.propertiesForm.setValue(json);\n  }\n\n  protected async suggestEntity(value: any, filter: any, sortBy: any | string, sortDirection: SortDirection, options: any): Promise<LoadResult<any>> {\n    return suggestFromArray(FAKE_ENTITIES, value, filter, sortBy, sortDirection, options);\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Properties form test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <form [formGroup]=\"form\">\n    <app-properties-form\n      #propertiesForm\n      formArrayName=\"properties\"\n      [definitions]=\"propertyDefinitions\"\n      [options]=\"{ allowEmptyArray: true }\"\n      [showToolbar]=\"true\"\n      [canDownload]=\"true\"\n      [canImport]=\"true\"\n    ></app-properties-form>\n  </form>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { PropertiesFormTestPage } from './properties-form.test';\nimport { SharedModule } from '../../../../shared/shared.module';\nimport { CoreModule } from '../../../core.module';\n\n@NgModule({\n  imports: [CommonModule, SharedModule, CoreModule, TranslateModule.forChild()],\n  declarations: [PropertiesFormTestPage],\n  exports: [RouterModule, PropertiesFormTestPage],\n})\nexport class PropertiesFormTestingModule {}\n","import { ChangeDetectorRef, Component, inject, Injector, OnDestroy, OnInit } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormControl } from '@angular/forms';\n\nimport { PlatformService } from '../../../services/platform.service';\nimport { Subscription } from 'rxjs';\nimport { isNilOrBlank, trimEmptyToNull } from '../../../../shared/functions';\nimport { AppForm } from '../../form.class';\nimport { AppFormArray } from '../form-array';\n\nimport { APP_SHOW_TOOLTIP } from '../../../../shared/constants';\n\n@Component({\n  selector: 'app-array-test',\n  templateUrl: './form-array.test.html',\n})\nexport class ArrayFormTestPage extends AppForm<any> implements OnInit, OnDestroy {\n  private subscription = new Subscription();\n\n  get defaultFormArray(): AppFormArray<any, any> {\n    return this.form.get('default') as AppFormArray<any, any>;\n  }\n\n  get notEmptyFormArray(): AppFormArray<any, any> {\n    return this.form.get('notEmpty') as AppFormArray<any, any>;\n  }\n\n  get nullValuesFormArray(): AppFormArray<any, any> {\n    return this.form.get('nullValues') as AppFormArray<any, any>;\n  }\n\n  get duplicatedValuesFormArray(): AppFormArray<any, any> {\n    return this.form.get('duplicatedValues') as AppFormArray<any, any>;\n  }\n\n  get valueToAddControl(): UntypedFormControl {\n    return this.form?.get('valueToAdd') as UntypedFormControl;\n  }\n\n  showTooltip = inject(APP_SHOW_TOOLTIP, { optional: true });\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected platform: PlatformService,\n    protected injection: Injector,\n    protected cd: ChangeDetectorRef\n  ) {\n    super(\n      injection,\n      formBuilder.group({\n        default: new AppFormArray(\n          (value) => this.formBuilder.control(value),\n          (v1, v2) => v1 === v2,\n          (value) => isNilOrBlank(value)\n        ),\n\n        notEmpty: new AppFormArray(\n          (value) => this.formBuilder.control(value),\n          (v1, v2) => v1 === v2,\n          (value) => isNilOrBlank(value),\n          {\n            allowEmptyArray: false,\n          }\n        ),\n\n        nullValues: new AppFormArray(\n          (value) => this.formBuilder.control(value),\n          (v1, v2) => v1 === v2,\n          (value) => isNilOrBlank(value),\n          {\n            allowEmptyArray: false,\n            allowManyNullValues: true,\n          }\n        ),\n\n        duplicatedValues: new AppFormArray(\n          (value) => this.formBuilder.control(value),\n          (v1, v2) => v1 === v2,\n          (value) => isNilOrBlank(value),\n          {\n            allowEmptyArray: false,\n            allowManyNullValues: true,\n            allowDuplicateValue: true,\n          }\n        ),\n\n        // Value to add\n        valueToAdd: formBuilder.control(null, []),\n      })\n    );\n  }\n\n  ngOnInit() {\n    setTimeout(() => this.loadData(), 250);\n  }\n\n  ngOnDestroy() {\n    this.subscription.unsubscribe();\n  }\n\n  // Load the form with data\n  async loadData() {\n    this.setValue({\n      default: ['TESTING_1', 'TESTING_2'],\n      notEmpty: ['TESTING_1', 'TESTING_2'],\n      nullValues: ['TESTING_1', null, 'TESTING_4'],\n      duplicatedValues: ['TESTING_1', null, 'TESTING_1'],\n      // Add with value\n      valueToAdd: null,\n    });\n  }\n\n  protected setFormArrayValue(formArray: AppFormArray<any, any>, values: string | string[]) {\n    const arrayValues = Array.isArray(values) ? values : values?.split(',').map(trimEmptyToNull);\n    formArray.patchValue(arrayValues);\n    this.markAsDirty();\n  }\n\n  /* -- protected methods -- */\n\n  protected markForCheck() {\n    this.cd.markForCheck();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Form Array test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <form class=\"form-container ion-padding\" [formGroup]=\"form\">\n    <ion-grid>\n      <ion-row>\n        <!-- Default -->\n        <ion-col size=\"6\">\n          <ng-container\n            *ngTemplateOutlet=\"\n              arrayCard;\n              context: { $implicit: defaultFormArray, title: 'Default behavior', showSetValue: true }\n            \"\n          ></ng-container>\n        </ion-col>\n\n        <!-- Not empty array -->\n        <ion-col size=\"6\">\n          <ng-container\n            *ngTemplateOutlet=\"\n              arrayCard;\n              context: { $implicit: notEmptyFormArray, title: 'Not empty array', showSetValue: true }\n            \"\n          ></ng-container>\n        </ion-col>\n\n        <!-- Allow null values -->\n        <ion-col size=\"6\">\n          <ng-container\n            *ngTemplateOutlet=\"\n              arrayCard;\n              context: {\n                $implicit: nullValuesFormArray,\n                title: 'Allow many null values',\n                showAddToolbar: true,\n                showResizeToolbar: true,\n                showSetValue: true\n              }\n            \"\n          ></ng-container>\n        </ion-col>\n\n        <!-- Allow duplicated value -->\n        <ion-col size=\"6\">\n          <ng-container\n            *ngTemplateOutlet=\"\n              arrayCard;\n              context: {\n                $implicit: duplicatedValuesFormArray,\n                title: 'Allow duplicated values',\n                showAddToolbar: true,\n                showResizeToolbar: true,\n                showSetValue: true\n              }\n            \"\n          ></ng-container>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n</ion-content>\n\n<ng-template\n  #arrayCard\n  let-formArray\n  let-title=\"title\"\n  let-showAddToolbar=\"showAddToolbar\"\n  let-showResizeToolbar=\"showResizeToolbar\"\n  let-showSetValue=\"showSetValue\"\n>\n  <ion-card>\n    <ion-card-header>\n      <ion-card-title>{{ title }}</ion-card-title>\n    </ion-card-header>\n    <ion-card-content>\n      @for (\n        control of (formArray | formGetArray).controls;\n        track i;\n        let i = $index;\n        let first = $first;\n        let last = $last\n      ) {\n        <ion-row>\n          <ion-col>\n            <mat-form-field>\n              <mat-label>Value #{{ i + 1 }}</mat-label>\n              <input matInput [formControl]=\"control | formGetControl\" />\n            </mat-form-field>\n          </ion-col>\n          <ion-col size=\"auto\">\n            @if (last && !showAddToolbar) {\n              <button\n                type=\"button\"\n                mat-icon-button\n                [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n                [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n                (click)=\"formArray.add()\"\n              >\n                <mat-icon>add</mat-icon>\n              </button>\n            }\n            <button\n              type=\"button\"\n              mat-icon-button\n              [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n              (click)=\"formArray.removeAt(i) && markAsDirty()\"\n            >\n              <mat-icon>close</mat-icon>\n            </button>\n          </ion-col>\n        </ion-row>\n      }\n\n      @if (formArray.length === 0 && !showAddToolbar) {\n        <button\n          type=\"button\"\n          mat-icon-button\n          [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n          [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n          (click)=\"formArray.add()\"\n        >\n          <mat-icon>add</mat-icon>\n        </button>\n      }\n    </ion-card-content>\n\n    @if (showAddToolbar || showResizeToolbar || showSetValue) {\n      <ion-toolbar>\n        <!-- Set array value -->\n        <ion-row *ngIf=\"showSetValue\">\n          <ion-col>\n            <mat-form-field>\n              <mat-label>Set Value</mat-label>\n              <input\n                #setValueInput\n                matInput\n                type=\"text\"\n                placeholder=\"Comma separated values\"\n                (keydown.enter)=\"setFormArrayValue(formArray, setValueInput.value)\"\n              />\n            </mat-form-field>\n          </ion-col>\n          <ion-col size=\"auto\">\n            <button\n              type=\"button\"\n              mat-icon-button\n              title=\"Set value\"\n              (click)=\"setFormArrayValue(formArray, setValueInput.value)\"\n            >\n              <mat-icon>checkmark</mat-icon>\n            </button>\n          </ion-col>\n        </ion-row>\n\n        <!-- Resize the array -->\n        <ion-row *ngIf=\"showResizeToolbar\">\n          <ion-col>\n            <mat-form-field>\n              <mat-label>Resize</mat-label>\n              <input\n                #sizeInput\n                matInput\n                type=\"number\"\n                step=\"1\"\n                min=\"0\"\n                placeholder=\"New array length\"\n                (keydown.enter)=\"formArray.resize(sizeInput.value)\"\n              />\n            </mat-form-field>\n          </ion-col>\n          <ion-col size=\"auto\">\n            <button type=\"button\" mat-icon-button title=\"Resize\" (click)=\"formArray.resize(sizeInput.value)\">\n              <mat-icon>checkmark</mat-icon>\n            </button>\n          </ion-col>\n        </ion-row>\n\n        <!-- Add a item with a value -->\n        <ion-row *ngIf=\"showAddToolbar\">\n          <ion-col>\n            <mat-form-field>\n              <mat-label>Value to add</mat-label>\n              <input #valueInput matInput type=\"text\" (keydown.enter)=\"formArray.add(valueInput.value)\" />\n            </mat-form-field>\n          </ion-col>\n          <ion-col size=\"auto\">\n            <button\n              type=\"button\"\n              mat-icon-button\n              [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n              [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n              (click)=\"formArray.add(valueInput.value)\"\n            >\n              <mat-icon>add</mat-icon>\n            </button>\n          </ion-col>\n        </ion-row>\n      </ion-toolbar>\n    }\n  </ion-card>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { CommonModule } from '@angular/common';\nimport { SharedModule } from '../../../../shared/shared.module';\nimport { CoreModule } from '../../../core.module';\nimport { ArrayFormTestPage } from './form-array.test';\nimport { RouterModule } from '@angular/router';\n\n@NgModule({\n  imports: [CommonModule, SharedModule, CoreModule, TranslateModule.forChild()],\n\n  declarations: [ArrayFormTestPage],\n  exports: [ArrayFormTestPage, RouterModule],\n})\nexport class FormArrayTestModule {}\n","import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { TextForm } from '../text-form.component';\n\n@Component({\n  selector: 'text-form-testing',\n  templateUrl: 'text-form.testing.html',\n})\nexport class TextFormTestingPage implements AfterViewInit {\n  @ViewChild('standaloneTextForm1') standaloneTextForm1: TextForm;\n  @ViewChild('standaloneTextForm2') standaloneTextForm2: TextForm;\n\n  form: UntypedFormGroup;\n\n  protected readonly Validators = Validators;\n  stringify = JSON.stringify;\n\n  constructor(protected formBuilder: UntypedFormBuilder) {\n    this.form = formBuilder.group({\n      empty: [null],\n      required: [null, Validators.required],\n      multiline: [null],\n    });\n  }\n\n  ngAfterViewInit(): void {\n    this.standaloneTextForm1.enable();\n    this.standaloneTextForm2.enable();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Text form examples</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <ion-grid>\n    <ion-row>\n      <ion-col>\n        <ion-text><h4>Standalone mode (no form)</h4></ion-text>\n      </ion-col>\n    </ion-row>\n    <ion-row>\n      <ion-col>\n        <ion-card>\n          <ion-card-header>\n            <ion-card-title>\n              <ion-label color=\"primary\">Default validator</ion-label>\n            </ion-card-title>\n          </ion-card-header>\n          <ion-card-content>\n            <app-text-form\n              #standaloneTextForm1\n              [standalone]=\"true\"\n              [multiline]=\"false\"\n              [maxLength]=\"10\"\n            ></app-text-form>\n          </ion-card-content>\n        </ion-card>\n      </ion-col>\n\n      <ion-col>\n        <ion-card>\n          <ion-card-header>\n            <ion-card-title>\n              <ion-label color=\"primary\">Required</ion-label>\n            </ion-card-title>\n          </ion-card-header>\n          <ion-card-content>\n            <app-text-form\n              #standaloneTextForm2\n              [standalone]=\"true\"\n              [multiline]=\"false\"\n              [maxLength]=\"10\"\n              [validator]=\"Validators.required\"\n            >\n              @if (standaloneTextForm2.textControl.hasError('required')) {\n                <mat-error matError>REQUIRED</mat-error>\n              }\n            </app-text-form>\n          </ion-card-content>\n        </ion-card>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n\n  <form class=\"form-container\" [formGroup]=\"form\">\n    <ion-grid>\n      <ion-row>\n        <ion-col>\n          <ion-text><h4>FormGroup mode, no placeholder</h4></ion-text>\n        </ion-col>\n      </ion-row>\n      <ion-row>\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Empty</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ form.controls.empty.value | json }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <app-text-form formControlName=\"empty\" [multiline]=\"false\" [maxLength]=\"10\"></app-text-form>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Required</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ form.controls.required.value | json }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <app-text-form\n                formControlName=\"required\"\n                [multiline]=\"false\"\n                [maxLength]=\"10\"\n                [validator]=\"Validators.required\"\n              >\n                <mat-error matError *ngIf=\"form.controls.required.hasError('required')\" translate>\n                  ERROR.FIELD_REQUIRED\n                </mat-error>\n              </app-text-form>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n\n      <ion-row>\n        <ion-col>\n          <ion-text><h4>FormGroup mode, with placeholder</h4></ion-text>\n        </ion-col>\n      </ion-row>\n      <ion-row>\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Empty</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ form.controls.empty.value | json }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <app-text-form\n                formControlName=\"empty\"\n                [multiline]=\"false\"\n                [maxLength]=\"10\"\n                placeholder=\"Empty field\"\n              ></app-text-form>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Required</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ form.controls.required.value | json }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <app-text-form\n                formControlName=\"required\"\n                [multiline]=\"false\"\n                [maxLength]=\"10\"\n                [validator]=\"Validators.required\"\n                placeholder=\"Required field\"\n              >\n                <mat-error matError *ngIf=\"form.controls.required.hasError('required')\" translate>\n                  ERROR.FIELD_REQUIRED\n                </mat-error>\n              </app-text-form>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n\n      <ion-row>\n        <ion-col>\n          <ion-card>\n            <ion-card-header>\n              <ion-card-title>\n                <ion-label color=\"primary\">Outline</ion-label>\n              </ion-card-title>\n              <ion-card-subtitle>\n                <ion-text color=\"medium\">\n                  <small>\n                    <pre>{{ form.controls.multiline.value | json }}</pre>\n                  </small>\n                </ion-text>\n              </ion-card-subtitle>\n            </ion-card-header>\n            <ion-card-content>\n              <app-text-form\n                formControlName=\"multiline\"\n                [multiline]=\"true\"\n                appearance=\"outline\"\n                autoSize=\"true\"\n                autoSizeMinRows=\"4\"\n                [maxLength]=\"2000\"\n                placeholder=\"Outline field\"\n              ></app-text-form>\n            </ion-card-content>\n          </ion-card>\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  </form>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { SharedModule } from '../../../../shared/shared.module';\nimport { CoreModule } from '../../../core.module';\nimport { TextFormTestingPage } from './text-form.testing';\nimport { IonicModule } from '@ionic/angular';\nimport { AppTextFormModule } from '../text-form.module';\n\n@NgModule({\n  imports: [CommonModule, IonicModule, SharedModule, CoreModule, TranslateModule.forChild(), AppTextFormModule],\n  declarations: [TextFormTestingPage],\n  exports: [RouterModule, TextFormTestingPage],\n})\nexport class TextFormTestingModule {}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { IconRef } from '../../../shared/types';\n\n@Component({\n  selector: 'app-icon-selector-test',\n  templateUrl: './icon-selector.test.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconSelectorTestPage {\n  form: UntypedFormGroup;\n  selectedIcon: IconRef | null = null;\n  disabled = false;\n\n  constructor(\n    protected formBuilder: UntypedFormBuilder,\n    protected cd: ChangeDetectorRef\n  ) {\n    this.form = formBuilder.group({\n      icon: [null],\n    });\n\n    this.form.get('icon').valueChanges.subscribe((ref) => {\n      this.selectedIcon = ref;\n      this.cd.markForCheck();\n    });\n  }\n\n  toggleDisabled() {\n    this.disabled = !this.disabled;\n    if (this.disabled) {\n      this.form.get('icon').disable();\n    } else {\n      this.form.get('icon').enable();\n    }\n  }\n\n  stringify = JSON.stringify;\n}","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Icon Selector test page</ion-title>\n\n  </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\">\n  <ion-grid>\n    <ion-row>\n      <!-- Icon selector field -->\n      <ion-col size=\"12\" size-md=\"6\">\n        <ion-card>\n          <ion-card-header>\n            <ion-card-title>\n              <ion-label color=\"primary\">Icon selector field</ion-label>\n            </ion-card-title>\n            <ion-card-subtitle>\n              <ion-text color=\"medium\">\n                <small>\n                  <pre>{{ stringify(selectedIcon) }}</pre>\n                </small>\n              </ion-text>\n\n            </ion-card-subtitle>\n          </ion-card-header>\n          <ion-card-content>\n            <app-icon-selector-field\n              [formControl]=\"form | formGetControl: 'icon'\"\n              [placeholder]=\"'Icon'\"\n              [disabled]=\"disabled\"\n            ></app-icon-selector-field>\n\n            <br/>\n            <mat-checkbox (change)=\"disabled = $event.checked\" [checked]=\"disabled\">\n              <mat-label>Disabled ?</mat-label>\n            </mat-checkbox>\n          </ion-card-content>\n        </ion-card>\n      </ion-col>\n\n      <!-- Preview -->\n      <ion-col size=\"12\" size-md=\"6\">\n        <ion-card>\n          <ion-card-header>\n            <ion-card-title>\n              <ion-label color=\"primary\">Preview</ion-label>\n            </ion-card-title>\n          </ion-card-header>\n          <ion-card-content class=\"preview-container\">\n            @if (selectedIcon?.icon) {\n              <ion-icon [name]=\"selectedIcon.icon\" size=\"large\"></ion-icon>\n              <br/>\n              <ion-text color=\"medium\">\n                <small><pre>{{ selectedIcon.icon }}</pre></small>\n              </ion-text>\n            }\n            @if (selectedIcon?.matIcon) {\n              <mat-icon [fontIcon]=\"selectedIcon.matIcon\"></mat-icon>\n              <br/>\n              <ion-text color=\"medium\">\n                <small><pre>{{ selectedIcon.matIcon }}</pre></small>\n              </ion-text>\n            }\n            @if (!selectedIcon) {\n              <ion-text color=\"medium\">No icon selected</ion-text>\n            }\n          </ion-card-content>\n        </ion-card>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n</ion-content>\n","import { RouterModule, Routes } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { IconSelectorTestPage } from './icon-selector.test';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { AppIconSelectorModule } from '../icon-selector.module';\nimport { IonicModule } from '@ionic/angular';\n\nconst routes: Routes = [\n  {\n    path: 'icon-selector',\n    pathMatch: 'full',\n    component: IconSelectorTestPage,\n  },\n];\n\n@NgModule({\n  imports: [CommonModule, IonicModule, RouterModule.forChild(routes), SharedModule, AppIconSelectorModule],\n  declarations: [IconSelectorTestPage],\n  exports: [RouterModule, IconSelectorTestPage],\n})\nexport class IconSelectorTestingModule {}","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { TableTestingModule } from './table/testing/table.testing.module';\nimport { TableTestPage } from './table/testing/table.testing';\nimport { TextPopoverTestingModule } from './form/text-popover/testing/text-popover.testing.module';\nimport { TextPopoverTestingPage } from './form/text-popover/testing/text-popover.testing';\nimport { TestingPage } from '../shared/testing/tests.page';\nimport { PropertiesFormTestingModule } from './form/properties/testing/properties-form.testing.module';\nimport { PropertiesFormTestPage } from './form/properties/testing/properties-form.test';\nimport { Table2TestPage } from './table/testing/table2.testing';\nimport { ArrayFormTestPage } from './form/array/testing/form-array.test';\nimport { FormArrayTestModule } from './form/array/testing/form-array-test.module';\nimport { TextFormTestingPage } from './form/text/testing/text-form.testing';\nimport { TextFormTestingModule } from './form/text/testing/text-form.testing.module';\nimport { NestedTableTestPage } from './table/testing/nested-table.testing';\nimport { IconSelectorTestingModule } from './icon/testing/icon-selector.testing.module';\nimport { IconSelectorTestPage } from './icon/testing/icon-selector.test';\n\nexport const CORE_TESTING_PAGES: TestingPage[] = [\n  { label: 'Core components', divider: true },\n  { label: 'Table (click to edit)', page: '/testing/core/table' },\n  { label: 'Table 2 (click to select)', page: '/testing/core/table2' },\n  { label: 'Nested Table (with cell selection)', page: '/testing/core/nested-table' },\n  { label: 'Text form', page: '/testing/core/text-form' },\n  { label: 'Text popover', page: '/testing/core/text-popover' },\n  { label: 'Properties form', page: '/testing/core/properties-form' },\n  { label: 'Array form', page: '/testing/core/array-form' },\n  { label: 'Icon Selector', page: '/testing/core/icon-selector' },\n];\n\nconst routes: Routes = [\n  {\n    path: '',\n    pathMatch: 'full',\n    redirectTo: 'table',\n  },\n  {\n    path: 'table',\n    pathMatch: 'full',\n    component: TableTestPage,\n  },\n  {\n    path: 'table2',\n    pathMatch: 'full',\n    component: Table2TestPage,\n  },\n  {\n    path: 'nested-table',\n    pathMatch: 'full',\n    component: NestedTableTestPage,\n  },\n  {\n    path: 'text-form',\n    pathMatch: 'full',\n    component: TextFormTestingPage,\n  },\n  {\n    path: 'text-popover',\n    pathMatch: 'full',\n    component: TextPopoverTestingPage,\n  },\n  {\n    path: 'properties-form',\n    pathMatch: 'full',\n    component: PropertiesFormTestPage,\n  },\n  {\n    path: 'array-form',\n    pathMatch: 'full',\n    component: ArrayFormTestPage,\n  },\n  {\n    path: 'icon-selector',\n    pathMatch: 'full',\n    component: IconSelectorTestPage,\n  },\n];\n\n@NgModule({\n  imports: [\n    CommonModule,\n    TranslateModule.forChild(),\n    RouterModule.forChild(routes),\n\n    // Sub modules\n    TableTestingModule,\n    TextFormTestingModule,\n    TextPopoverTestingModule,\n    PropertiesFormTestingModule,\n    FormArrayTestModule,\n    IconSelectorTestingModule,\n  ],\n  exports: [\n    RouterModule,\n\n    // Sub modules\n    TableTestingModule,\n    TextFormTestingModule,\n    TextPopoverTestingModule,\n    PropertiesFormTestingModule,\n    FormArrayTestModule,\n    IconSelectorTestingModule,\n  ],\n})\nexport class CoreTestingModule {}\n","import { Component, Inject, ViewChild } from '@angular/core';\nimport { JobProgressionIcon, JobProgressionOptions } from '../progression/job-progression.icon';\nimport { JobProgression } from '../progression/job-progression.model';\nimport { APP_JOB_PROGRESSION_SERVICE, IJobProgressionService } from '../progression/job-progression.service';\n\n@Component({\n  selector: 'job-progression-testing',\n  templateUrl: 'job-progression.testing.html',\n})\nexport class JobProgressionTestingPage {\n  @ViewChild('icon') jobProgressionIcon: JobProgressionIcon;\n\n  jobId = 0;\n  options = <JobProgressionOptions>{\n    autoHide: true,\n  };\n\n  constructor(@Inject(APP_JOB_PROGRESSION_SERVICE) protected jobProgressionService: IJobProgressionService) {}\n\n  createJob() {\n    const job = new JobProgression();\n    job.id = ++this.jobId;\n    job.name = 'test';\n    job.current = 0;\n    job.total = 100;\n    this.jobProgressionService.addJob(job.id, job);\n  }\n}\n","<ion-toolbar color=\"primary\">\n  <ion-title>Job progression</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n  <p>\n    <ion-button (click)=\"createJob()\">Add Job</ion-button>\n  </p>\n\n  <app-job-progression-icon #icon [debug]=\"true\" [options]=\"options\"></app-job-progression-icon>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { JobProgressionTestingPage } from './job-progression.testing';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { JobModule } from '../job.module';\n\n@NgModule({\n  imports: [CommonModule, TranslateModule.forChild(), SharedModule, JobModule],\n  declarations: [JobProgressionTestingPage],\n  exports: [JobProgressionTestingPage],\n})\nexport class JobTestingModule {}\n","// @dynamic\nimport { EntityClass } from '../../../core/services/model/entity.decorators';\nimport { Entity, EntityAsObjectOptions } from '../../../core/services/model/entity.model';\nimport { Moment } from 'moment';\nimport { FilterFn, IconRef } from '../../../shared/types';\nimport { fromDateISOString, toDateISOString } from '../../../shared/dates';\nimport { EventLevel, IUserEvent, IUserEventAction, IUserEventFilter } from '../user-event.model';\nimport { EntityFilter } from '../../../core/services/model/filter.model';\nimport { isNil, isNotEmptyArray, isNotNil } from '../../../shared/functions';\nimport { StoreObject } from '@apollo/client/core';\n\n// @dynamic\n@EntityClass({ typename: 'UserEventTestVO' })\nexport class UserEventTest extends Entity<UserEventTest> implements IUserEvent<UserEventTest> {\n  static fromObject: (source: any, opts?: any) => UserEventTest;\n\n  type: string;\n  level: EventLevel;\n  issuer: string;\n  recipient: string;\n  creationDate: Moment;\n  readDate: Moment;\n\n  message: string | undefined;\n  content: string | any;\n  hash: string;\n  signature: string;\n  readSignature: string;\n\n  avatar?: string;\n  avatarIcon?: IconRef;\n  icon?: IconRef;\n  jobId?: number;\n\n  actions?: IUserEventAction[];\n\n  constructor() {\n    super(UserEventTest.TYPENAME);\n  }\n\n  asObject(opts?: EntityAsObjectOptions): any {\n    const target = super.asObject(opts);\n    target.creationDate = toDateISOString(this.creationDate);\n    target.readDate = toDateISOString(this.readDate);\n\n    // Serialize content\n    if (typeof target.content === 'object') {\n      target.content = JSON.stringify(target.content);\n    }\n\n    delete target.avatar;\n    delete target.avatarIcon;\n    delete target.icon;\n    delete target.actions;\n\n    return target;\n  }\n\n  fromObject(source: any) {\n    Object.assign(this, source); // Copy all properties\n    super.fromObject(source);\n    this.creationDate = fromDateISOString(source.creationDate);\n    this.readDate = fromDateISOString(source.readDate);\n\n    try {\n      // Deserialize content\n      if (typeof source.content === 'string' && source.content.startsWith('{')) {\n        this.content = JSON.parse(source.content);\n      }\n\n      // Deserialize content.context\n      if (this.content && typeof this.content.context === 'string' && this.content.context.startsWith('{')) {\n        this.content.context = JSON.parse(this.content.context);\n      }\n    } catch (err) {\n      console.error('Error during UserEvent deserialization', err);\n    }\n  }\n}\n\n// @dynamic\n@EntityClass({ typename: 'UserEventTestFilterVO' })\nexport class UserEventTestFilter extends EntityFilter<UserEventTestFilter, UserEventTest> implements IUserEventFilter<UserEventTest> {\n  static fromObject: (source: any, opts?: any) => UserEventTestFilter;\n\n  types: string[] = [];\n  levels: EventLevel[] = [];\n  issuers: string[] = [];\n  recipients: string[] = [];\n  startDate: Moment = null;\n  includedIds: number[];\n  excludeRead = false;\n  jobId: number = null;\n\n  fromObject(source: any, opts?: any) {\n    super.fromObject(source, opts);\n    this.types = source.types || [];\n    this.levels = source.levels || [];\n    this.issuers = source.issuers || [];\n    this.recipients = source.recipients || [];\n    this.startDate = fromDateISOString(source.startDate);\n    this.excludeRead = source.excludeRead || false;\n    this.includedIds = source.includedIds || [];\n    this.jobId = source.jobId;\n  }\n\n  protected buildFilter(): FilterFn<UserEventTest>[] {\n    const filterFns = super.buildFilter();\n\n    if (isNotEmptyArray(this.types)) {\n      filterFns.push((t) => this.types.includes(t.type));\n    }\n    if (isNotEmptyArray(this.levels)) {\n      filterFns.push((t) => this.levels.includes(t.level));\n    }\n    if (isNotEmptyArray(this.issuers)) {\n      filterFns.push((t) => this.issuers.includes(t.issuer));\n    }\n    if (isNotEmptyArray(this.recipients)) {\n      filterFns.push((t) => this.recipients.includes(t.recipient));\n    }\n\n    if (isNotNil(this.startDate)) {\n      filterFns.push((t) => this.startDate.isSameOrBefore(t.creationDate));\n    }\n    if (isNotEmptyArray(this.includedIds)) {\n      filterFns.push((t) => this.includedIds.includes(t.id));\n    }\n    if (this.excludeRead === true) {\n      filterFns.push((t) => isNil(t.readSignature)); // todo or t.signature ?\n    }\n    if (isNotNil(this.jobId)) {\n      filterFns.push((t) => this.jobId === t.jobId);\n    }\n    return filterFns;\n  }\n\n  asObject(opts?: EntityAsObjectOptions): StoreObject {\n    const target = super.asObject(opts);\n    return target;\n  }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { AbstractUserEventService, UserEventLoadOptions, UserEventWatchOptions } from '../user-event.service';\nimport { BehaviorSubject, firstValueFrom, Observable, Subject } from 'rxjs';\nimport { GraphqlService } from '../../../core/graphql/graphql.service';\nimport { AccountService } from '../../../core/services/account.service';\nimport { NetworkService } from '../../../core/services/network.service';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Environment, ENVIRONMENT } from '../../../../environments/environment.class';\nimport { FetchPolicy } from '@apollo/client/core';\nimport { EntityServiceSaveOptions, LoadResult } from '../../../shared/services/entity-service.class';\nimport { SortDirection } from '@angular/material/sort';\nimport { EntityUtils } from '../../../core/services/model/entity.model';\nimport { map } from 'rxjs/operators';\nimport { UserEventTest, UserEventTestFilter } from './user-event.testing.model';\n\n@Injectable()\nexport class UserEventTestService extends AbstractUserEventService<UserEventTest, UserEventTestFilter> {\n  private $userEvents = new BehaviorSubject<UserEventTest[]>([]);\n  private $newUserEvents = new Subject<UserEventTest[]>();\n\n  constructor(\n    protected graphql: GraphqlService,\n    protected accountService: AccountService,\n    protected network: NetworkService,\n    protected translate: TranslateService,\n    @Inject(ENVIRONMENT) protected environment: Environment\n  ) {\n    super(graphql, accountService, network, translate, {\n      queries: {\n        loadAll: null,\n        loadAllWithContent: null,\n      },\n      production: environment?.production,\n    });\n  }\n\n  fromObject(source: any): UserEventTest {\n    return UserEventTest.fromObject(source);\n  }\n\n  async add(entity: UserEventTest): Promise<UserEventTest> {\n    entity = await this.processUserEvent(entity);\n    entity.id = (this.$userEvents.value?.length || 0) + 1;\n    this.$userEvents.next([entity, ...this.$userEvents.value]);\n    this._countSubject.next((this._countSubject.value || 0) + 1);\n    this.$newUserEvents.next([entity]);\n    return entity;\n  }\n\n  async replaceLast(entity: UserEventTest) {\n    entity = await this.processUserEvent(entity);\n    const events = this.$userEvents.value.slice();\n    const last = events.shift();\n    entity.id = last.id;\n    events.unshift(entity);\n    this.$userEvents.next(events);\n    this.$newUserEvents.next([entity]);\n  }\n\n  asFilter(filter: Partial<any>): any {\n    return filter;\n  }\n\n  count(filter: any, options?: { fetchPolicy?: FetchPolicy }): Promise<number> {\n    return Promise.resolve(this.$userEvents.value?.length || 0);\n  }\n\n  delete(entity: any): Promise<any> {\n    return Promise.resolve(undefined);\n  }\n\n  deleteAll(data: any[], opts?: any): Promise<any> {\n    return Promise.resolve(undefined);\n  }\n\n  listenAllChanges(filter: any, options?: UserEventLoadOptions<UserEventTest> & { interval?: number }): Observable<any[]> {\n    return this.$newUserEvents.asObservable();\n  }\n\n  save(entity: any, options?: EntityServiceSaveOptions<UserEventTest>): Promise<any> {\n    const toSave = this.$userEvents.value?.find((value) => value.id == entity?.id);\n    Object.assign(toSave, entity);\n\n    return entity;\n  }\n\n  async saveAll(data: any[], opts?: any): Promise<any[]> {\n    for (const entity of data || []) {\n      await this.save(entity);\n    }\n\n    return firstValueFrom(this.$userEvents);\n  }\n\n  protected defaultRecipient(): any {\n    return this.accountService.isLogin() ? this.accountService.person.pubkey : undefined;\n  }\n\n  watchAll(\n    offset: number,\n    size: number,\n    sortBy?: string,\n    sortDirection?: SortDirection,\n    filter?: Partial<any>,\n    opts?: UserEventWatchOptions<UserEventTest>\n  ): Observable<LoadResult<any>> {\n    return this.$userEvents.pipe(\n      map((userEvents) => {\n        let data = (userEvents || []).slice(offset || 0, offset + size);\n        const total = this.$userEvents.value?.length || 0;\n\n        const res = <LoadResult<UserEventTest>>{ data, total };\n\n        // Must re-order because of listenChanges result will add new event at the end\n        data = EntityUtils.sort(data, sortBy, sortDirection);\n\n        // Add fetch more\n        const nextOffset = offset + data.length;\n        if (nextOffset < res.total) {\n          res.fetchMore = (_) =>\n            this.loadAll(nextOffset, size, sortBy, sortDirection, filter, {\n              ...opts,\n              fetchPolicy: <FetchPolicy>'no-cache',\n            } as unknown as UserEventLoadOptions<UserEventTest>);\n        }\n\n        return res;\n      })\n    );\n  }\n\n  loadAll(\n    offset: number,\n    size: number,\n    sortBy?: string,\n    sortDirection?: SortDirection,\n    filter?: Partial<any>,\n    opts?: UserEventLoadOptions<UserEventTest>\n  ): Promise<LoadResult<any>> {\n    let data = (this.$userEvents.value || []).slice(offset || 0, offset + size);\n    const total = this.$userEvents.value?.length || 0;\n\n    const res = <LoadResult<UserEventTest>>{ data, total };\n\n    // Must re-order because of listenChanges result will add new event at the end\n    data = EntityUtils.sort(data, sortBy, sortDirection);\n\n    // Add fetch more\n    const nextOffset = offset + data.length;\n    if (nextOffset < res.total) {\n      res.fetchMore = (_) =>\n        this.loadAll(nextOffset, size, sortBy, sortDirection, filter, {\n          ...opts,\n          fetchPolicy: <FetchPolicy>'no-cache',\n        } as unknown as UserEventLoadOptions<UserEventTest>);\n    }\n\n    return Promise.resolve(res);\n  }\n}\n","import { Component, Inject, OnDestroy, ViewChild } from '@angular/core';\nimport { APP_USER_EVENT_SERVICE } from '../user-event.service';\nimport { IUserEventAction } from '../user-event.model';\nimport { Router } from '@angular/router';\nimport { Alerts } from '../../../shared/alerts';\nimport { AlertController } from '@ionic/angular';\nimport { TranslateService } from '@ngx-translate/core';\nimport { UserEventTestService } from './user-event.testing.service';\nimport { UserEventNotificationIcon } from '../notification/user-event-notification.icon';\nimport { Subscription, timer } from 'rxjs';\nimport { UserEventTest } from './user-event.testing.model';\nimport { DateUtils } from '../../../shared/dates';\nimport { LocalSettingsService } from '../../../core/services/local-settings.service';\n\n@Component({\n  selector: 'job-progression-testing',\n  templateUrl: 'user-event.testing.html',\n})\nexport class UserEventTestingPage implements OnDestroy {\n  private _timerSubscription: Subscription;\n\n  protected mobile: boolean;\n  protected popoverHeaderActions: IUserEventAction[] = [];\n  protected modalHeaderActions: IUserEventAction[] = [];\n  protected footerActions: IUserEventAction[] = [];\n\n  @ViewChild('notification') notification: UserEventNotificationIcon;\n\n  get timerStarted(): boolean {\n    return !!this._timerSubscription;\n  }\n\n  constructor(\n    @Inject(APP_USER_EVENT_SERVICE) protected userEventService: UserEventTestService,\n    protected router: Router,\n    protected alertController: AlertController,\n    protected settings: LocalSettingsService,\n    protected translateService: TranslateService\n  ) {\n    this.mobile = settings.mobile;\n    this.popoverHeaderActions = [{ name: 'SOCIAL.USER_EVENT.NOTIFICATION.SHOW_ALL', executeAction: () => this.showNotificationModal() }];\n    this.footerActions = [{ name: 'MENU.LOCAL_SETTINGS', executeAction: () => this.openSettings() }];\n    userEventService.registerListener({\n      accept: (_: UserEventTest) => true,\n      onReceived: (userEvent: UserEventTest) => {\n        this.customize(userEvent);\n        return userEvent;\n      },\n    });\n    userEventService.registerListener({\n      accept: (userEvent: UserEventTest) => userEvent.level === 'DEBUG',\n      onRead: (_: UserEventTest) => {\n        this.showMessage('debug message read ');\n      },\n    });\n  }\n\n  ngOnDestroy() {\n    this.stopTimer();\n  }\n\n  protected customize(userEvent: UserEventTest) {\n    // Choose avatarIcon\n    switch (userEvent.level) {\n      case 'ERROR':\n        userEvent.avatarIcon = { icon: 'close-outline', color: 'danger' };\n        break;\n      case 'WARNING':\n        userEvent.avatarIcon = { icon: 'warning-outline', color: 'warning' };\n        break;\n      case 'INFO':\n        userEvent.avatarIcon = { icon: 'information-circle-outline' };\n        break;\n      case 'DEBUG':\n        userEvent.avatarIcon = { icon: 'cog', color: 'medium' };\n        break;\n    }\n\n    // Choose icon\n    switch (userEvent.type) {\n      case 'message':\n        userEvent.icon = { matIcon: 'inbox', color: 'accent' };\n        break;\n      case 'upload':\n        userEvent.icon = { matIcon: 'file_upload' };\n        break;\n      case 'download':\n        userEvent.icon = { matIcon: 'file_download' };\n        break;\n    }\n  }\n\n  addNotification() {\n    this.userEventService.add(\n      UserEventTest.fromObject({\n        issuer: 'system',\n        recipient: 'me',\n        type: 'message',\n        level: 'INFO',\n        message: 'message test message test message test message test message test message test message test message test',\n        creationDate: DateUtils.moment(),\n      })\n    );\n  }\n\n  addError() {\n    this.userEventService.add(\n      UserEventTest.fromObject({\n        issuer: 'system',\n        recipient: 'me',\n        type: 'upload',\n        level: 'ERROR',\n        message: 'message error',\n        creationDate: DateUtils.moment(),\n      })\n    );\n  }\n\n  addWarning() {\n    this.userEventService.add(\n      UserEventTest.fromObject({\n        issuer: 'system',\n        recipient: 'me',\n        type: 'download',\n        level: 'WARNING',\n        message: 'message warning',\n        creationDate: DateUtils.moment(),\n      })\n    );\n  }\n\n  addDebug() {\n    this.userEventService.add(\n      UserEventTest.fromObject({\n        issuer: 'system',\n        recipient: 'me',\n        type: 'debug',\n        level: 'DEBUG',\n        message: 'message DEBUG',\n        creationDate: DateUtils.moment(),\n      })\n    );\n  }\n\n  addNotificationWithLink() {\n    this.userEventService.add(\n      UserEventTest.fromObject({\n        issuer: 'system',\n        recipient: 'me',\n        type: 'message',\n        level: 'INFO',\n        message: 'message with link',\n        creationDate: DateUtils.moment(),\n        actions: [\n          <IUserEventAction>{\n            name: 'click here',\n            iconRef: {\n              icon: 'arrow-forward-outline',\n            },\n            executeAction: (_) => {\n              this.router.navigateByUrl('/');\n            },\n          },\n        ],\n      })\n    );\n  }\n\n  addNotificationWithAction() {\n    this.userEventService.add(\n      UserEventTest.fromObject({\n        issuer: 'system',\n        recipient: 'me',\n        type: 'message',\n        level: 'INFO',\n        message: 'message with action',\n        creationDate: DateUtils.moment(),\n        actions: [\n          <IUserEventAction>{\n            name: 'click here',\n            iconRef: {\n              icon: 'arrow-forward-outline',\n              color: 'warning',\n            },\n            executeAction: (_) => {\n              this.showMessage('action 1');\n            },\n          },\n          <IUserEventAction>{\n            name: 'click here 2',\n            iconRef: {\n              matIcon: 'settings_applications',\n              color: 'secondary',\n            },\n            executeAction: (_) => {\n              this.showMessage('action 2');\n            },\n          },\n        ],\n      })\n    );\n  }\n\n  addMany(count?: number) {\n    count = count || 20;\n    for (let i = 0; i < count; i++) {\n      this.addRandom(i);\n    }\n  }\n\n  startTimer(period?: number) {\n    this._timerSubscription?.unsubscribe();\n\n    period = period || 1000;\n    let counter = 0;\n\n    this._timerSubscription = timer(period, period).subscribe(() => {\n      this.addRandom(counter);\n      counter++;\n    });\n  }\n\n  stopTimer() {\n    this._timerSubscription?.unsubscribe();\n    this._timerSubscription = null;\n  }\n\n  addRandom(value: number) {\n    switch (value % 7) {\n      case 0:\n        this.addNotification();\n        break;\n      case 1:\n        this.addError();\n        break;\n      case 2:\n        this.addDebug();\n        break;\n      case 3:\n        this.addNotificationWithLink();\n        break;\n      case 4:\n        this.addNotificationWithAction();\n        break;\n      case 5:\n        this.addNotificationWithDefaultAction();\n        break;\n      case 6:\n        this.replaceLastEvent();\n        break;\n    }\n  }\n\n  addNotificationWithDefaultAction() {\n    this.userEventService.add(\n      UserEventTest.fromObject({\n        issuer: 'system',\n        recipient: 'me',\n        type: 'message',\n        level: 'INFO',\n        message: 'message with action',\n        creationDate: DateUtils.moment(),\n        actions: [\n          <IUserEventAction>{\n            default: true,\n            name: 'default',\n            executeAction: (_) => {\n              this.showMessage('default action');\n            },\n          },\n        ],\n      })\n    );\n  }\n\n  protected showMessage(text: string): Promise<void> {\n    return Alerts.showError(text, this.alertController, this.translateService);\n  }\n\n  protected showNotificationModal() {\n    this.notification.showList(null, { style: 'modal', headerActions: [] });\n  }\n\n  protected openSettings() {\n    this.router.navigateByUrl('/settings');\n  }\n\n  protected replaceLastEvent() {\n    this.userEventService.replaceLast(\n      UserEventTest.fromObject({\n        issuer: 'system',\n        recipient: 'me',\n        type: 'message',\n        level: 'INFO',\n        message: 'REPLACED',\n        creationDate: DateUtils.moment(),\n      })\n    );\n  }\n}\n","<ion-toolbar color=\"primary\">\n  <ion-title>User events</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n\n  <ion-grid>\n    <ion-row>\n      <ion-col size=\"auto\">\n        <pre>listStyle='popover'</pre>\n      </ion-col>\n      <ion-col>\n        <app-user-event-notification-icon #notification\n                                          [headerActions]=\"popoverHeaderActions\"\n                                          [footerActions]=\"footerActions\"\n                                          [listStyle]=\"'popover'\"\n                                          [debug]=\"true\">\n        </app-user-event-notification-icon>\n      </ion-col>\n    </ion-row>\n\n    <ion-row>\n      <ion-col size=\"auto\">\n        <pre>listStyle='modal'</pre>\n      </ion-col>\n      <ion-col>\n        <app-user-event-notification-icon [headerActions]=\"modalHeaderActions\"\n                                          [footerActions]=\"footerActions\"\n                                          [listStyle]=\"'modal'\"\n                                          [debug]=\"true\">\n        </app-user-event-notification-icon>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n\n  <p>\n    <ion-button (click)=\"addNotification()\">Add notification</ion-button>\n    <ion-button (click)=\"addError()\">Add error</ion-button>\n    <ion-button (click)=\"addWarning()\">Add warning</ion-button>\n    <ion-button (click)=\"addDebug()\">Add debug</ion-button>\n  </p>\n  <p>\n    <ion-button (click)=\"addNotificationWithLink()\">Add notification with link</ion-button>\n    <ion-button (click)=\"addNotificationWithAction()\">Add notification with action</ion-button>\n    <ion-button (click)=\"addNotificationWithDefaultAction()\">Add notification with default action</ion-button>\n  </p>\n  <p>\n    <ion-button (click)=\"addMany()\">Add notifications (x20)</ion-button>\n  </p>\n  <p>\n    <ion-button (click)=\"startTimer()\" *ngIf=\"!timerStarted\">Start timer</ion-button>\n    <ion-button (click)=\"stopTimer()\" *ngIf=\"timerStarted\">Stop timer</ion-button>\n  </p>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { UserEventModule } from '../user-event.module';\nimport { UserEventTestingPage } from './user-event.testing';\n\n@NgModule({\n  imports: [CommonModule, TranslateModule.forChild(), SharedModule, UserEventModule],\n  declarations: [UserEventTestingPage],\n  exports: [UserEventTestingPage],\n})\nexport class UserEventTestingModule {}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Optional } from '@angular/core';\nimport { Environment, ENVIRONMENT } from '../../../../environments/environment.class';\nimport { LocalSettingsService } from '../../../core/services/local-settings.service';\nimport { LocalSettings } from '../../../core/services/model/settings.model';\nimport { AppColors } from '../../../shared/types';\n\n@Component({\n  selector: 'app-feed-test',\n  templateUrl: './feed.testing.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedTestingPage {\n  protected availableFeedUrls: string[] = [\n    'https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/1.1/feed-fr-FR.json',\n    'https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-fr.json',\n  ];\n  protected availableColors: (AppColors | 'light-transparent')[] = [\n    'light-transparent',\n    'accent',\n    'primary',\n    'secondary',\n    'tertiary',\n    'danger',\n    'light',\n    'medium',\n    'dark',\n    'transparent',\n  ];\n  protected availableShapes = ['round', 'legacy'];\n\n  protected debug = false;\n  protected feedUrls: string[];\n  protected shape: 'round' | 'legacy' = 'legacy';\n  protected headerColor: AppColors | 'light-transparent' = 'secondary';\n  protected cardColor: AppColors | 'light-transparent' = 'light';\n\n  constructor(\n    protected settings: LocalSettingsService,\n    protected cd: ChangeDetectorRef,\n    @Optional() @Inject(ENVIRONMENT) private environment: Environment\n  ) {\n    this.settings.ready().then((settings) => this.start(settings));\n  }\n\n  protected start(settings: LocalSettings) {\n    const locale = settings.locale || this.environment?.defaultLocale || 'fr';\n    this.feedUrls = this.environment?.feed?.jsonFeed?.[locale] || [\n      'https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/1.1/feed-fr-FR.json',\n      'https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-fr.json',\n    ];\n    console.debug('[feed-testing] Feed URLs:', this.feedUrls);\n    this.cd.markForCheck();\n  }\n}\n","<ion-header>\n  <ion-toolbar color=\"primary\">\n    <ion-buttons slot=\"start\">\n      <ion-back-button></ion-back-button>\n    </ion-buttons>\n\n    <ion-title>Feed test page</ion-title>\n  </ion-toolbar>\n</ion-header>\n\n<ion-content>\n  <ion-grid class=\"form-container ion-padding-top\">\n    <ion-row>\n      <ion-col size=\"12\">\n        <mat-form-field [subscriptSizing]=\"'dynamic'\">\n          <mat-label>Feed URL(s)</mat-label>\n          <mat-select [(value)]=\"feedUrls\" multiple>\n            <mat-option *ngFor=\"let feedUrl of availableFeedUrls\" [value]=\"feedUrl\">\n              {{ feedUrl }}\n            </mat-option>\n            <mat-option>(Use environment)</mat-option>\n          </mat-select>\n        </mat-form-field>\n      </ion-col>\n    </ion-row>\n    <ion-row>\n      <ion-col size=\"3\">\n        <mat-form-field [subscriptSizing]=\"'dynamic'\">\n          <mat-label>Header color</mat-label>\n          <mat-select [(value)]=\"headerColor\">\n            <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n              {{ color }}\n            </mat-option>\n          </mat-select>\n        </mat-form-field>\n      </ion-col>\n      <ion-col size=\"3\">\n        <mat-form-field [subscriptSizing]=\"'dynamic'\">\n          <mat-label>Card color</mat-label>\n          <mat-select [(value)]=\"cardColor\">\n            <mat-option *ngFor=\"let color of availableColors\" [value]=\"color\">\n              {{ color }}\n            </mat-option>\n          </mat-select>\n        </mat-form-field>\n      </ion-col>\n      <ion-col size=\"3\">\n        <mat-form-field [subscriptSizing]=\"'dynamic'\">\n          <mat-label>Shape</mat-label>\n          <mat-select [(value)]=\"shape\">\n            <mat-option *ngFor=\"let shape of availableShapes\" [value]=\"shape\">\n              {{ shape }}\n            </mat-option>\n          </mat-select>\n        </mat-form-field>\n      </ion-col>\n      <ion-col size=\"3\">\n        <mat-checkbox (change)=\"debug = $event.checked\" [checked]=\"debug\">Debug ?</mat-checkbox>\n      </ion-col>\n    </ion-row>\n  </ion-grid>\n\n  <div class=\"ion-padding\">\n    <app-feed\n      [urls]=\"feedUrls\"\n      [headerColor]=\"headerColor\"\n      [cardColor]=\"cardColor\"\n      [shape]=\"shape\"\n      [debug]=\"debug\"\n    ></app-feed>\n  </div>\n</ion-content>\n","import { NgModule } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { SharedModule } from '../../../shared/shared.module';\nimport { FeedTestingPage } from './feed.testing';\nimport { FeedModule } from '../feed.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatSelectModule } from '@angular/material/select';\n\n@NgModule({\n  imports: [SharedModule, TranslateModule.forChild(), FeedModule, ReactiveFormsModule, MatSelectModule],\n  declarations: [FeedTestingPage],\n  exports: [FeedTestingPage, FeedModule],\n})\nexport class FeedTestingModule {}\n","import { TestingPage } from '../shared/testing/tests.page';\nimport { RouterModule, Routes } from '@angular/router';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { JobTestingModule } from './job/testing/job.testing.module';\nimport { JobProgressionTestingPage } from './job/testing/job-progression.testing';\nimport { UserEventTestingModule } from './user-event/testing/user-event.testing.module';\nimport { UserEventTestingPage } from './user-event/testing/user-event.testing';\nimport { FeedTestingPage } from './feed/testing/feed.testing';\nimport { FeedTestingModule } from './feed/testing/feed.testing.module';\nimport { FeedPage } from './feed/feed.page';\n\nexport const SOCIAL_TESTING_PAGES: TestingPage[] = [\n  { label: 'Social components', divider: true },\n  { label: 'Job progression', page: '/testing/social/job-progression' },\n  { label: 'User event', page: '/testing/social/user-event' },\n  { label: 'Feed', page: '/testing/social/feed' },\n];\n\nconst routes: Routes = [\n  {\n    path: 'job-progression',\n    pathMatch: 'full',\n    component: JobProgressionTestingPage,\n  },\n  {\n    path: 'user-event',\n    pathMatch: 'full',\n    component: UserEventTestingPage,\n  },\n  {\n    path: 'feed',\n    pathMatch: 'full',\n    component: FeedTestingPage,\n  },\n  {\n    path: 'feed/page',\n    pathMatch: 'full',\n    component: FeedPage,\n  },\n];\n\n@NgModule({\n  imports: [\n    CommonModule,\n    TranslateModule.forChild(),\n    RouterModule.forChild(routes),\n\n    // Sub modules\n    JobTestingModule,\n    UserEventTestingModule,\n    FeedTestingModule,\n  ],\n})\nexport class SocialTestingModule {}\n","import { Injectable } from '@angular/core';\nimport { JobProgressionService } from '../progression/job-progression.service';\nimport { interval, Observable } from 'rxjs';\nimport { JobProgression } from '../progression/job-progression.model';\nimport { map, take } from 'rxjs/operators';\n\n@Injectable()\nexport class JobProgressionTestService extends JobProgressionService {\n  listenChanges(id: number): Observable<JobProgression> {\n    return interval(100).pipe(\n      take(111),\n      map((value) => {\n        if (value <= 10) {\n          return <JobProgression>{\n            id,\n            name: `Job #${id}`,\n            current: 0,\n            total: 0,\n            message: `Progression pending`,\n          };\n        }\n        value = value - 10;\n        return <JobProgression>{\n          id,\n          name: `Job #${id}`,\n          current: value,\n          total: 100,\n          message: `Progression ${value}/100`,\n        };\n      })\n    );\n  }\n}\n","// Environment\n\nimport { MatLatLongFieldInput } from './src/app/shared/material/latlong/material.latlong-input';\n\nexport * from './src/environments/environment.class';\nexport * from './src/environments/environment.loader';\n\n// Shared\nexport * from './src/app/shared/constants';\nexport * from './src/app/shared/shared.module';\nexport { SharedRoutingModule } from './src/app/shared/shared-routing.module';\nexport { RxStateModule } from './src/app/shared/rx-state/rx-state.module';\nexport * from './src/app/shared/rx-state/rx-state.decorators';\nexport * from './src/app/shared/rx-state/rx-state.types';\n\n// Shared material\nexport * from './src/app/shared/material/material.module';\nexport * from './src/app/shared/material/material.config';\nexport * from './src/app/shared/material/material.animations';\nexport * from './src/app/shared/material/boolean/boolean.module';\nexport { MatBooleanField } from './src/app/shared/material/boolean/material.boolean';\nexport * from './src/app/shared/material/autocomplete/material.autocomplete.module';\nexport * from './src/app/shared/material/autocomplete/material.autocomplete';\nexport * from './src/app/shared/material/autocomplete/material.autocomplete.directive';\nexport * from './src/app/shared/material/autocomplete/material.autocomplete.config';\nexport * from './src/app/shared/material/autocomplete/material.autocomplete.utils';\nexport * from './src/app/shared/material/chips/chips.module';\nexport { MatChipsField } from './src/app/shared/material/chips/material.chips';\nexport * from './src/app/shared/material/paginator/material.paginator-i18n';\nexport * from './src/app/shared/material/stepper/material.stepper-i18n';\nexport * from './src/app/shared/material/datetime/datetime.module';\nexport { MatDateShort } from './src/app/shared/material/datetime/material.dateshort';\nexport { MatDateTime } from './src/app/shared/material/datetime/material.datetime';\nexport { MatDate } from './src/app/shared/material/datetime/material.date';\nexport { MatLatLongField } from './src/app/shared/material/latlong/material.latlong';\nexport { MatLatLongFieldInput } from './src/app/shared/material/latlong/material.latlong-input';\nexport * from './src/app/shared/material/latlong/material.latlong.module';\nexport * from './src/app/shared/material/duration/duration.module';\nexport { MatDuration } from './src/app/shared/material/duration/material.duration';\n// export * from './src/app/shared/material/numpad/numpad.module';\n// export * from './src/app/shared/material/numpad/numpad.directive';\n// export * from './src/app/shared/material/numpad/numpad.append-to-input.directive';\n// export * from './src/app/shared/material/numpad/numpad.container';\n// export * from './src/app/shared/material/numpad/numpad.content';\n// export * from './src/app/shared/material/numpad/numpad.component';\nexport * from './src/app/shared/material/swipe/swipe.module';\nexport * from './src/app/shared/material/swipe/material.swipe';\nexport * from './src/app/shared/material/badge/badge.module';\nexport * from './src/app/shared/material/badge/badge.directive';\nexport * from './src/app/core/form/text/text-form.component';\nexport * from './src/app/core/form/text/text-form.module';\nexport * from './src/app/core/icon/icon-selector.field';\nexport * from './src/app/core/icon/icon-selector.modal';\nexport * from './src/app/core/icon/icon-selector.module';\nexport * from './src/app/core/icon/icon-selector.service';\n\n// Shared components\nexport * from './src/app/shared/inputs';\nexport { AppFormField } from './src/app/shared/form/field.component';\nexport * from './src/app/shared/form/loading-spinner';\nexport * from './src/app/shared/form/field.model';\nexport * from './src/app/shared/toolbar/toolbar';\nexport * from './src/app/shared/toolbar/modal-toolbar';\nexport * from './src/app/shared/toolbar/toolbar.module';\nexport * from './src/app/shared/interceptors/progess.interceptor';\nexport * from './src/app/shared/toast/toasts';\nexport * from './src/app/shared/guard/component-dirty.guard';\nexport * from './src/app/shared/upload-file/upload-file.model';\nexport * from './src/app/shared/upload-file/upload-file-popover.component';\nexport * from './src/app/shared/upload-file/upload-file.component';\nexport * from './src/app/shared/image/gallery/slideshow/image-gallery-slideshow.component';\nexport * from './src/app/shared/image/gallery/image-gallery.component';\nexport * from './src/app/shared/image/gallery/image-gallery.module';\nexport * from './src/app/shared/image/gallery/image-gallery.model';\nexport * from './src/app/shared/image/image.model';\nexport * from './src/app/shared/image/image.module';\nexport * from './src/app/shared/storage/storage-explorer.component';\nexport * from './src/app/shared/storage/storage-explorer.module';\nexport * from './src/app/shared/logging/log-level.model';\nexport * from './src/app/shared/logging/logger.model';\nexport * from './src/app/shared/logging/logging-service.class';\nexport * from './src/app/shared/logging/logging-service.config';\nexport * from './src/app/shared/logging/logging-service.module';\n\n// Shared directives\nexport * from './src/app/shared/directives/directives.module';\nexport * from './src/app/shared/directives/autofocus.directive';\nexport * from './src/app/shared/directives/ng-var.directive';\nexport * from './src/app/shared/directives/drag-and-drop.directive';\nexport * from './src/app/shared/directives/autotitle.directive';\nexport * from './src/app/shared/directives/autotooltip.directive';\nexport * from './src/app/shared/directives/throttled-click.directive';\nexport * from './src/app/shared/directives/resizable/resizable.directive';\nexport * from './src/app/shared/directives/resizable/resizable.component';\nexport * from './src/app/shared/directives/resizable/resizable.module';\nexport * from './src/app/shared/directives/autoresize.directive';\nexport * from './src/app/shared/directives/cell-selection/cell-selection.service';\nexport * from './src/app/shared/directives/cell-selection/cell-selection.directive';\nexport * from './src/app/shared/directives/cell-selection/cell-identifier.directive';\n\n// Shared pipes\nexport * from './src/app/shared/pipes/pipes.module';\nexport * from './src/app/shared/pipes/date-format.pipe';\nexport * from './src/app/shared/pipes/date-from.pipe';\nexport * from './src/app/shared/pipes/date-from-now.pipe';\nexport * from './src/app/shared/pipes/date-diff-duration.pipe';\nexport * from './src/app/shared/pipes/dates.pipe';\nexport * from './src/app/shared/pipes/latlong-format.pipe';\nexport * from './src/app/shared/pipes/highlight.pipe';\nexport * from './src/app/shared/pipes/number-format.pipe';\nexport * from './src/app/shared/pipes/duration.pipe';\nexport * from './src/app/shared/pipes/file-size.pipe';\nexport * from './src/app/shared/pipes/property.pipes';\nexport * from './src/app/shared/pipes/math.pipes';\nexport * from './src/app/shared/pipes/arrays.pipe';\nexport * from './src/app/shared/pipes/maps.pipe';\nexport * from './src/app/shared/pipes/string.pipes';\nexport * from './src/app/shared/pipes/url.pipes';\nexport * from './src/app/shared/pipes/observable.pipes';\nexport * from './src/app/shared/pipes/translate-context.pipe';\nexport * from './src/app/shared/pipes/ng-init.pipe';\nexport * from './src/app/shared/pipes/form.pipes';\nexport * from './src/app/shared/pipes/colors.pipe';\nexport * from './src/app/shared/pipes/types.pipes';\nexport * from './src/app/shared/pipes/maskito.pipe';\nexport * from './src/app/shared/pipes/selection.pipes';\nexport * from './src/app/shared/pipes/badge.pipes';\nexport * from './src/app/shared/pipes/html.pipes';\nexport * from './src/app/shared/pipes/display-with.pipe';\n\n// Shared services\nexport * from './src/app/shared/services';\nexport * from './src/app/shared/audio/audio';\nexport * from './src/app/shared/file/file.service';\nexport * from './src/app/shared/image/image.service';\nexport * from './src/app/shared/services/startable-service.class';\nexport * from './src/app/shared/services/entity-service.class';\nexport * from './src/app/shared/services/memory-entity-service.class';\nexport * from './src/app/shared/services/progress-bar.service';\nexport * from './src/app/shared/services/translate-context.service';\nexport * from './src/app/shared/services/job.utils';\nexport * from './src/app/shared/storage/storage.service';\nexport * from './src/app/shared/storage/storage.utils';\nexport * from './src/app/shared/storage/storage-explorer.component';\nexport * from './src/app/shared/storage/storage-explorer.module';\nexport * from './src/app/shared/validator/form-error-adapter.class';\nexport * from './src/app/shared/debug/debug-service.class';\n\n// Shared other\nexport * from './src/app/shared/types';\nexport * from './src/app/shared/dates';\nexport * from './src/app/shared/functions';\nexport * from './src/app/shared/focusable';\nexport * from './src/app/shared/regexps';\nexport * from './src/app/shared/services';\nexport * from './src/app/shared/forms';\nexport * from './src/app/shared/observables';\nexport * from './src/app/shared/events';\nexport * from './src/app/shared/alerts';\nexport * from './src/app/shared/platforms';\nexport * from './src/app/shared/html.utils';\nexport * from './src/app/shared/base64.utils';\nexport * from './src/app/shared/geolocation/geolocation.utils';\nexport * from './src/app/shared/version/versions';\nexport * from './src/app/shared/file/file.utils';\nexport * from './src/app/shared/file/csv.utils';\nexport * from './src/app/shared/file/images.utils';\nexport * from './src/app/shared/file/json.utils';\nexport * from './src/app/shared/file/uri.utils';\nexport * from './src/app/shared/file/url.utils';\nexport * from './src/app/shared/hotkeys/shared-hotkeys.module';\nexport * from './src/app/shared/hotkeys/hotkeys.service';\nexport * from './src/app/shared/hotkeys/dialog/hotkeys-dialog.component';\nexport {\n  Color,\n  ColorName,\n  ColorScale,\n  ColorScaleLegend,\n  ColorScaleOptions,\n  ColorGradientOptions,\n  ColorScaleLegendItem,\n} from './src/app/shared/graph/graph-colors';\nexport * from './src/app/shared/graph/colors.utils';\nexport * from './src/app/shared/gesture/gesture-config';\nexport * from './src/app/shared/gesture/hammer.utils';\nexport * from './src/app/shared/validator/validators';\nexport * from './src/app/shared/validator/form-error-adapter.class';\nexport * from './src/app/shared/material/latlong/latlong.utils';\nexport * from './src/app/shared/debug/debug.module';\nexport * from './src/app/shared/debug/debug.component';\nexport * from './src/app/shared/named-filter/named-filter.module';\nexport * from './src/app/shared/named-filter/named-filter.model';\nexport * from './src/app/shared/named-filter/named-filter.service';\nexport * from './src/app/shared/named-filter/named-filter-selector.component';\nexport * from './src/app/shared/markdown/markdown.module';\nexport * from './src/app/shared/markdown/markdown.utils';\nexport * from './src/app/shared/markdown/markdown.service';\nexport * from './src/app/shared/markdown/markdown.directive';\nexport * from './src/app/shared/markdown/markdown.component';\nexport * from './src/app/shared/markdown/markdown.modal';\nexport * from './src/app/shared/print/print.service';\n\n// Core\nexport * from './src/app/core/core.module';\n\n// Core model\nexport * from './src/app/core/services/model/account.model';\nexport * from './src/app/core/services/model/token.model';\nexport * from './src/app/core/services/model/config.model';\nexport * from './src/app/core/services/model/department.model';\nexport * from './src/app/core/services/model/entity.model';\nexport * from './src/app/core/services/model/tree-item-entity.model';\nexport * from './src/app/core/services/model/filter.model';\nexport * from './src/app/core/services/model/history.model';\nexport * from './src/app/core/services/model/model.enum';\nexport * from './src/app/core/services/model/peer.model';\nexport * from './src/app/core/services/model/person.model';\nexport {\n  IReferentialRef,\n  ReferentialRef,\n  BaseReferential,\n  Referential,\n  ReferentialUtils,\n  ReferentialAsObjectOptions,\n  referentialToString,\n  referentialsToString,\n  IStatus,\n  StatusList,\n  StatusById,\n  MINIFY_ENTITY_FOR_LOCAL_STORAGE,\n  MINIFY_ENTITY_FOR_POD,\n} from './src/app/core/services/model/referential.model';\nexport * from './src/app/core/services/model/settings.model';\n\n// GraphQL\nexport * from './src/app/core/graphql/graphql.module';\nexport * from './src/app/core/graphql/graphql.service';\n\n// Core pipes\nexport * from './src/app/core/services/pipes/account.pipes';\nexport * from './src/app/core/services/pipes/department-to-string.pipe';\nexport * from './src/app/core/services/pipes/person-to-string.pipe';\nexport * from './src/app/core/services/pipes/usage-mode.pipes';\nexport * from './src/app/core/services/pipes/referential-to-string.pipe';\nexport * from './src/app/core/services/pipes/pipes.module';\n\n// Core services\nexport * from './src/app/core/services/base58';\nexport * from './src/app/core/services/errors';\nexport * from './src/app/core/services/platform.service';\nexport * from './src/app/core/services/network.service';\nexport * from './src/app/core/services/network.types';\nexport * from './src/app/core/services/network.utils';\nexport * from './src/app/core/services/config.service';\nexport { CORE_CONFIG_OPTIONS } from './src/app/core/services/config/core.config';\nexport * from './src/app/core/services/local-settings.service';\nexport * from './src/app/core/services/account.service';\nexport * from './src/app/core/services/crypto.service';\nexport * from './src/app/core/services/auth-guard.service';\nexport * from './src/app/core/services/base-graphql-service.class';\nexport * from './src/app/core/services/base-entity-service.class';\nexport * from './src/app/core/services/storage/entities-storage.service';\nexport * from './src/app/core/services/storage/entity-store.class';\nexport * from './src/app/core/services/validator/base.validator.class';\n\n// Startup\nexport * from './src/app/core/services/startup.model';\nexport { STARTUP_DATA_STORAGE_KEY } from './src/app/core/services/startup.constants';\nexport { StartupService, StartupData, createAppStartupInitializer } from './src/app/core/services/startup.service';\n\n// Core components\nexport * from './src/app/core/form/form.class';\nexport * from './src/app/core/form/form.utils';\nexport * from './src/app/core/form/form-container.class';\nexport * from './src/app/core/form/form.module';\nexport * from './src/app/core/form/buttons/form-buttons-bar.component';\nexport * from './src/app/core/form/buttons/form-buttons-bar.module';\nexport * from './src/app/core/form/entity/editor.class';\nexport * from './src/app/core/form/entity/tab-editor.class';\nexport * from './src/app/core/form/entity/entity-editor.class';\nexport * from './src/app/core/form/entity/entity-editor-modal.class';\nexport * from './src/app/core/form/entity/entity-metadata.component';\nexport * from './src/app/core/form/entity/entity.module';\nexport * from './src/app/core/form/list/list.form';\nexport * from './src/app/core/form/list/list.module';\nexport * from './src/app/core/form/properties/properties.form';\nexport * from './src/app/core/form/properties/properties.utils';\nexport * from './src/app/core/form/properties/properties.table';\nexport * from './src/app/core/form/properties/properties.module';\nexport * from './src/app/core/form/text-popover/text-popover.component';\nexport * from './src/app/core/form/text-popover/text-popover.module';\nexport * from './src/app/core/form/array/form-array';\nexport * from './src/app/core/table/table.model';\nexport * from './src/app/core/table/table.class';\nexport * from './src/app/core/table/async-table.class';\nexport * from './src/app/core/table/table.utils';\nexport * from './src/app/core/table/table.pipes';\nexport * from './src/app/core/table/table.module';\nexport * from './src/app/core/table/memory-table.class';\nexport * from './src/app/core/table/entities-table-datasource.class';\nexport * from './src/app/core/table/entities-async-table-datasource.class';\nexport * from './src/app/core/table/table-select-columns.component';\nexport * from './src/app/core/table/column/actions-column.component';\nexport * from './src/app/core/table/column/nav-actions-column.component';\nexport * from './src/app/core/table/column/row-field.component';\nexport * from './src/app/core/icon/icon.component';\nexport * from './src/app/core/icon/icon.module';\nexport * from './src/app/core/home/home';\nexport * from './src/app/core/home/home.module';\nexport * from './src/app/core/settings/settings.page';\nexport * from './src/app/core/settings/settings.module';\nexport * from './src/app/core/account/account.page';\nexport * from './src/app/core/account/account.module';\nexport * from './src/app/core/account/account.page';\nexport * from './src/app/core/account/token.table';\nexport * from './src/app/core/account/new-token.form';\nexport * from './src/app/core/account/new-token.modal';\nexport * from './src/app/core/account/password/change-password.module';\nexport * from './src/app/core/account/password/change-password.form';\nexport * from './src/app/core/account/password/change-password.page';\nexport * from './src/app/core/auth/auth.form';\nexport * from './src/app/core/auth/auth.modal';\nexport * from './src/app/core/auth/auth.module';\nexport * from './src/app/core/auth/reset-password.modal';\nexport * from './src/app/core/register/register-confirm.page';\nexport * from './src/app/core/register/register.form';\nexport * from './src/app/core/register/register.modal';\nexport * from './src/app/core/register/register.module';\nexport * from './src/app/core/about/about.modal';\nexport * from './src/app/core/about/about.module';\nexport * from './src/app/core/peer/select-peer.modal';\nexport * from './src/app/core/peer/select-peer.module';\nexport * from './src/app/core/install/install-upgrade-card.component';\nexport * from './src/app/core/install/install-upgrade-card.module';\nexport * from './src/app/core/menu/menu.component';\nexport * from './src/app/core/menu/menu.model';\nexport * from './src/app/core/menu/menu.module';\nexport * from './src/app/core/menu/menu.service';\nexport * from './src/app/core/menu/sub-menu-tab.directive';\nexport * from './src/app/core/offline/update-offline-mode-card.component';\nexport * from './src/app/core/offline/update-offline-mode-card.module';\n\n// Core decorator\nexport { EntityClass, EntityClasses } from './src/app/core/services/model/entity.decorators';\n\n// Social\nexport * from './src/app/social/social.module';\nexport * from './src/app/social/config/social.config';\nexport * from './src/app/social/social.errors';\nexport * from './src/app/social/user-event/user-event.module';\nexport * from './src/app/social/user-event/user-event.model';\nexport * from './src/app/social/user-event/user-event.service';\nexport * from './src/app/social/user-event/notification/user-event-notification.icon';\nexport * from './src/app/social/user-event/notification/user-event-notification.list';\nexport * from './src/app/social/user-event/notification/user-event-notification.modal';\nexport * from './src/app/social/job/job.module';\nexport * from './src/app/social/job/progression/job-progression.service';\nexport * from './src/app/social/job/progression/job-progression.model';\nexport * from './src/app/social/job/progression/job-progression.icon';\nexport * from './src/app/social/job/progression/job-progression.list';\nexport * from './src/app/social/job/progression/job-progression.component';\nexport * from './src/app/social/message/message.module';\nexport * from './src/app/social/message/message.model';\nexport * from './src/app/social/message/message.service';\nexport * from './src/app/social/message/message.form';\nexport * from './src/app/social/message/message.modal';\nexport * from './src/app/social/feed/feed.component';\nexport * from './src/app/social/feed/feed.page';\nexport * from './src/app/social/feed/feed.service';\nexport * from './src/app/social/feed/feed.model';\nexport * from './src/app/social/feed/feed.directive';\nexport * from './src/app/social/feed/feed.module';\n\n// Feed using discourse (not need for now)\n//export * from './src/app/social/feed/discourse/discourse-feed.service';\n//export * from './src/app/social/feed/discourse/discourse.utils';\n\n// Admin\nexport * from './src/app/admin/admin.module';\nexport { AdminRoutingModule } from './src/app/admin/admin-routing.module';\nexport * from './src/app/admin/users/person.filter';\nexport * from './src/app/admin/users/person.validator';\nexport * from './src/app/admin/users/person.service';\nexport * from './src/app/admin/users/users.module';\nexport * from './src/app/admin/users/users';\nexport * from './src/app/admin/users/users.utils';\nexport * from './src/app/admin/users/users-select.modal';\n\n// Shared tests page\nexport * from './src/app/shared/testing/tests.page';\n\n// ------------------------------------------------------------------------\n// Testing module and components\n//\n// TODO: to remove when ngx-components will be well tested\n// (or export into a sub package, like '@sumaris-net/ngx-components/testing')\n// ------------------------------------------------------------------------\n\n// Shared material test\nexport * from './src/app/shared/material/material.testing.module';\nexport * from './src/app/shared/material/autocomplete/testing/autocomplete.test';\nexport * from './src/app/shared/material/latlong/testing/latlong.test';\nexport * from './src/app/shared/material/swipe/testing/swipe.test';\nexport * from './src/app/shared/material/datetime/testing/mat-date-time.test';\nexport * from './src/app/shared/material/datetime/testing/mat-date.test';\nexport * from './src/app/shared/material/datetime/testing/mat-dateshort.test';\nexport * from './src/app/shared/material/chips/testing/chips.test';\n//export * from './src/app/shared/material/numpad/testing/numpad.test';\nexport * from './src/app/shared/testing/observable.test';\nexport * from './src/app/shared/material/badge/badge.test';\nexport * from './src/app/shared/material/testing/common.test';\nexport * from './src/app/shared/material/boolean/testing/boolean.test.page';\nexport * from './src/app/shared/material/duration/testing/mat-duration.test';\nexport * from './src/app/shared/testing/maskito.test';\n\n// Shared other test\nexport * from './src/app/shared/shared.testing.module';\nexport * from './src/app/shared/upload-file/testing/upload-file.testing';\nexport * from './src/app/shared/upload-file/testing/upload-file.testing.module';\nexport * from './src/app/shared/toast/toast.testing';\nexport * from './src/app/shared/toast/toast.testing.module';\nexport * from './src/app/shared/image/gallery/testing/gallery.service.testing';\nexport * from './src/app/shared/image/gallery/testing/gallery.testing';\nexport * from './src/app/shared/image/gallery/testing/gallery.testing.module';\nexport * from './src/app/shared/storage/storage-explorer.testing.module';\nexport * from './src/app/shared/storage/storage-explorer.testing-routing.module';\nexport * from './src/app/shared/audio/audio.testing';\nexport * from './src/app/shared/audio/audio.testing.module';\nexport * from './src/app/shared/markdown/testing/markdown.test';\nexport * from './src/app/shared/markdown/testing/markdown.testing.module';\nexport * from './src/app/shared/named-filter/testing/named-filter-selector.testing';\nexport * from './src/app/shared/named-filter/testing/named-filter.testing.module';\n\n// Core testing\nexport * from './src/app/core/core.testing.module';\nexport * from './src/app/core/services/testing/referential-filter.model';\nexport * from './src/app/core/services/testing/referential.validator';\nexport * from './src/app/core/table/testing/table.testing.module';\nexport * from './src/app/core/table/testing/table.testing';\nexport * from './src/app/core/table/testing/table2.testing';\nexport * from './src/app/core/table/testing/nested-table.testing';\nexport * from './src/app/core/form/text/testing/text-form.testing';\nexport * from './src/app/core/form/text/testing/text-form.testing.module';\nexport * from './src/app/core/form/text-popover/testing/text-popover.testing.module';\nexport * from './src/app/core/form/text-popover/testing/text-popover.testing';\nexport * from './src/app/core/form/properties/testing/properties-form.test';\nexport * from './src/app/core/form/properties/testing/properties-form.testing.module';\nexport * from './src/app/core/menu/testing/menu.testing';\nexport * from './src/app/core/menu/testing/menu.testing.module';\nexport * from './src/app/core/menu/testing/menu-other.testing';\nexport * from './src/app/core/form/array/testing/form-array.test';\nexport * from './src/app/core/form/array/testing/form-array-test.module';\nexport * from './src/app/core/icon/testing/icon-selector.test';\nexport * from './src/app/core/icon/testing/icon-selector.testing.module';\n\n// Social testing\nexport * from './src/app/social/social.testing.module';\nexport * from './src/app/social/user-event/testing/user-event.testing.module';\nexport * from './src/app/social/user-event/testing/user-event.testing';\nexport * from './src/app/social/user-event/testing/user-event.testing.service';\nexport * from './src/app/social/job/testing/job.testing.module';\nexport * from './src/app/social/job/testing/job-progression.testing';\nexport * from './src/app/social/job/testing/job-progression.testing.service';\nexport * from './src/app/core/table/testing/table-validator.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2","isMoment","i1","i1.TranslateContextService","tap","i1.FormErrorTranslator","components","DEFAULT_VALUE_ACCESSOR","noop","i3","i4","i5","i6","i7","i8.DurationPipe","i9.AsFloatLabelTypePipe","i10.MaskitoPlaceholderPipe","i1.KeyboardService","i8","i9.AutofocusDirective","i10","i11","i12","i13.IsNilPipe","i14.AsFloatLabelTypePipe","i4.NgInitDirective","i5.AutofocusDirective","i9","i13","i14","i15.PropertyGetPipe","i16.HighlightPipe","i17.NotEmptyArrayPipe","i17.EmptyArrayPipe","i17.ArrayIncludesPipe","i18.ToStringPipe","i18.StrLengthPipe","i19.AsFloatLabelTypePipe","I18N_KEYS","i12.AutofocusDirective","i13.DateFormatPipe","i14.ArrayFirstPipe","i15.MapKeysPipe","i16.AsFloatLabelTypePipe","i14.DateFormatPipe","i15.ArrayFirstPipe","i16.MapKeysPipe","i17.AsFloatLabelTypePipe","i14.PropertyGetPipe","i15.HighlightPipe","i16.EmptyArrayPipe","i16.ArrayFirstPipe","i17.MapKeysPipe","i7.LatLongFormatPipe","i6.MatLatLongFieldInput","i7.ArrayFirstPipe","i8.MapGetPipe","i8.MapKeysPipe","i9.IsNotNilOrBlankPipe","i9.IsNilPipe","i10.AsFloatLabelTypePipe","i12.MatAutocompleteField","i13.MatDate","i14.MatDateTime","i15.MatBooleanField","i16.MatChipsField","i17.AutofocusDirective","i18.IsNilOrBlankPipe","i19.FormGetValuePipe","i20.MatColorPipe","i21.AsFloatLabelTypePipe","uuidv4","i6.DragAndDropDirective","i7.FileSizePipe","i3.UploadFileComponent","cordovaSQLiteDriver","i5.MatColorPipe","i1.Hotkeys","toHex","i6.AutofocusDirective","i7.AutoResizeDirective","i7.TextForm","i8.ArrayFilterPipe","i11.HighlightPipe","i12.NotEmptyArrayPipe","i14.BadgeNumberPipe","i15.ReferentialToStringPipe","i3.LocalSettingsService","i4.NetworkService","i5.StorageService","i6.LocalSettingsService","i1.GraphqlService","Queries","Mutations","i1.NetworkService","i2.GraphqlService","i5.FileService","i6.StartupService","gql","i7.AccountService","locale","momentLocale","i6.EntitiesStorage","i7.LocalSettingsService","i8.NetworkService","i9.AccountService","i10.ConfigService","i12.AudioProvider","debounceTime","distinctUntilChanged","i4.MatAutocompleteField","i13.AppLoadingSpinner","i14.EmptyArrayPipe","i15.BadgeNumberPipe","i6.AppIconComponent","i7.AsFloatLabelTypePipe","i6.ArrayLengthPipe","i7.AppendQueryParamsPipePipe","i14.AppImageGallerySlideshowComponent","i16.IsNotNilOrBlankPipe","i17.AppendQueryParamsPipePipe","i10.DateFormatPipe","i11.EmptyArrayPipe","i2.ResizableDirective","i1.MarkdownService","mergeMap","i5.DebugComponent","i6.MarkdownDirective","i2.PlatformService","i5.NetworkService","i6.ModalToolbarComponent","i7.AppMarkdownContent","i3.ConfigService","i8.DateFormatPipe","i9.NotEmptyArrayPipe","i10.CapitalizePipe","i1.LocalSettingsService","i2.ConfigService","i3.AccountService","i1.AccountService","i4.MenuService","i1.MenuService","i4.UserSettingsValidatorService","i4.LocalSettingsService","i13.AutofocusDirective","i14.AppFormField","i5.RegisterForm","i9.FormGetControlPipe","i5.AppUsernameForm","i15.MatColorPipe","i5.AppAuthForm","i2.LocalSettingsService","i7.AppIconComponent","i9.DateFormatPipe","i10.DateFromNowPipe","i11.NotEmptyArrayPipe","i11.ArrayFilterPipe","i5.UserEventNotificationList","i10.MatColorPipe","i11.BadgeNumberPipe","i10.MatChipsField","i11.AutoResizeDirective","i13.DebugComponent","i14.FormErrorPipe","i14.FormGetValuePipe","i15.PersonToStringPipe","i6.MessageForm","switchMap","i2.AccountService","i11.FeedDirective","i13.DateFromNowPipe","i14.NotEmptyArrayPipe","i14.ArrayFilterPipe","i15.MapPipe","i4.ConfigService","i5.PlatformService","i6.NetworkService","i15.NgInitDirective","i16.ToolbarComponent","i17","i18.AppInstallUpgradeCard","i19.UserEventNotificationIcon","i20.FeedsComponent","i21","i22.DateFormatPipe","i23.DateFromNowPipe","i24.NotEmptyArrayPipe","i24.EmptyArrayPipe","i25.IsNotNilOrBlankPipe","i26.MatColorPipe","i1.PlatformService","i8.ToolbarComponent","i3.FeedsComponent","i2.PropertyValidator","i3.NetworkService","i2.MenuService","i3.PropertyValidator","i15.MatAutocompleteField","i16.AppFormField","i17.PropertyGetPipe","i18.NotEmptyArrayPipe","i18.EmptyArrayPipe","i19.FormGetControlPipe","i20.AsBooleanPipe","i3.LocalSettingsValidatorService","i6.AccountService","i15","i16","i18","i19","i20","i21.ToolbarComponent","i22.FormButtonsBarComponent","i23.AppPropertiesForm","i7.AutofocusDirective","i8.AutoTitleDirective","i9.AppFormField","i10.ResizableComponent","i11.ResizableDirective","i13.PropertyGetPipe","i13.ValueFormatPipe","i14.FormGetControlPipe","i16.MatBooleanField","i17.ActionsColumnComponent","i18.AppRowField","i19.PropertyGetPipe","i20.NumberFormatPipe","i21.FormGetValuePipe","i2.AppTable","i3.AppAsyncTable","i8.NotEmptyArrayPipe","i4.DateFormatPipe","i5.IsNotNilPipe","i6.PersonToStringPipe","i1.UserTokenValidatorService","i12.MatDate","i13.MatChipsField","i14.AutofocusDirective","i15.IsNilOrBlankPipe","i15.IsNotNilOrBlankPipe","i16.FormGetValuePipe","i5.ModalToolbarComponent","i6.NewTokenForm","i14.ActionsColumnComponent","i16.DateFormatPipe","i17.IsSelectedPipe","i17.IsEmptySelectionPipe","i18.IsAllSelectedPipe","i18.IsNotAllSelectedPipe","i5.AccountValidatorService","i6.ConfigService","i7.ImageService","i18.ToolbarComponent","i19.AppFormField","i20.FormButtonsBarComponent","i21.AppPropertiesTable","i22.AppInstallUpgradeCard","i23.UserTokenTable","i25.FormGetControlPipe","i8.ArrayFirstPipe","i9.MapKeysPipe","i10.FormGetControlPipe","i1.ConfigService","i7.ToolbarComponent","i8.ChangePasswordForm","i3.JobProgressionComponent","i7.EmptyArrayPipe","i10.BadgeNumberPipe","i5.MessageService","i6.MenuService","i22","i23","i24","i25","i26","i27.MatChipsField","i28.AutofocusDirective","i29.AutoTitleDirective","i30.ToolbarComponent","i31.AppFormField","i32.FormButtonsBarComponent","i33.ActionsColumnComponent","i34.DebugComponent","i35.DateFormatPipe","i36.NumberFormatPipe","i37.NotEmptyArrayPipe","i38.MapGetPipe","i39.FormGetControlPipe","i39.FormGetValuePipe","i40.IsSelectedPipe","i40.IsEmptySelectionPipe","i41.DisplayWithPipe","i42.IsAllSelectedPipe","i42.IsNotAllSelectedPipe","i6.UsersPage","routes","i9.MatDateTime","i11.DateDiffDurationPipe","i12.FormGetControlPipe","i8.MatDate","i8.MatDateShort","FAKE_ENTITIES","deepCopy","i13.MaterialAutocompleteHeaderDirective","i13.MaterialAutocompleteFooterDirective","i12.MatLatLongField","i13.FormErrorPipe","i13.FormGetControlPipe","i13.FormGetGroupPipe","i2.DateFormatService","i4.MatSwipeField","i5.MatChipsField","i8.BadgeDirective","i6.MatDuration","i7.DurationPipe","i8.MatDateTime","i9.MatBooleanField","i11.PropertyGetPipe","i12.FormGetValuePipe","i6.MaskitoPlaceholderPipe","i1.ImageAttachmentService","i5.AppImageGalleryComponent","i9.DebugComponent","i1.AudioProvider","i6.SubMenuTabDirective","i10.ToolbarComponent","i4.ToolbarComponent","i5.NamedFilterSelector","i3.AppMarkdownContent","i1.AppValidatorService","i19.MatAutocompleteField","i20.MatBooleanField","i21.AutofocusDirective","i22.AutoTooltipDirective","i23.ToolbarComponent","i24.FormButtonsBarComponent","i25.ActionsColumnComponent","i26.ResizableComponent","i27.ResizableDirective","i28.CellIdentifierDirective","i29.CellSelectionDirective","i30.PropertyGetPipe","i31.NumberFormatPipe","i32.ArrayLengthPipe","i33.FormGetControlPipe","i33.FormGetValuePipe","i34.IsSelectedPipe","i34.IsEmptySelectionPipe","i34.IsMultipleSelectionPipe","i35.IsAllSelectedPipe","i35.IsNotAllSelectedPipe","i36.ReferentialToStringPipe","i21.MatAutocompleteField","i22.MatLatLongField","i23.MatDateTime","i24.MatBooleanField","i25.AutofocusDirective","i26.AutoTitleDirective","i27.AutoTooltipDirective","i28.ToolbarComponent","i29.FormButtonsBarComponent","i30.NavActionsColumnComponent","i31.ResizableComponent","i32.ResizableDirective","i33.CellIdentifierDirective","i34.DateFormatPipe","i35.LatitudeFormatPipe","i37.ArrayLengthPipe","i38.FormGetControlPipe","i38.FormGetValuePipe","i39.IsSelectedPipe","i39.IsEmptySelectionPipe","i39.IsMultipleSelectionPipe","i40.IsAllSelectedPipe","i40.IsNotAllSelectedPipe","i41.ReferentialToStringPipe","i30.TableTestPage","i31.Table2TestPage","i32.PropertyGetPipe","i33.NumberFormatPipe","i34.ArrayLengthPipe","i35.FormGetControlPipe","i35.FormGetValuePipe","i36.IsSelectedPipe","i36.IsEmptySelectionPipe","i36.IsMultipleSelectionPipe","i37.IsAllSelectedPipe","i37.IsNotAllSelectedPipe","i38.ReferentialToStringPipe","i3.PlatformService","i4.AppPropertiesForm","i11.FormGetControlPipe","i11.FormGetArrayPipe","i6.TextForm","i6.AppIconSelectorField","i7.FormGetControlPipe","i2.JobProgressionIcon","i6.UserEventNotificationIcon","i8.FeedsComponent"],"mappings":"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"}