@siemens/element-ng 49.16.0 → 51.0.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/siemens-element-ng-about.mjs +41 -25
- package/fesm2022/siemens-element-ng-about.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-accordion.mjs +59 -41
- package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-action-modal.mjs +83 -53
- package/fesm2022/siemens-element-ng-action-modal.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ag-grid.mjs +143 -148
- package/fesm2022/siemens-element-ng-ag-grid.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-application-header.mjs +180 -188
- package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs +34 -28
- package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-autocomplete.mjs +27 -22
- package/fesm2022/siemens-element-ng-autocomplete.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-avatar.mjs +34 -24
- package/fesm2022/siemens-element-ng-avatar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-badge.mjs +9 -8
- package/fesm2022/siemens-element-ng-badge.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-breadcrumb-router.mjs +17 -14
- package/fesm2022/siemens-element-ng-breadcrumb-router.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-breadcrumb.mjs +21 -17
- package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-card.mjs +72 -47
- package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-carousel.mjs +58 -34
- package/fesm2022/siemens-element-ng-carousel.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-chat-messages.mjs +323 -215
- package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-circle-status.mjs +39 -25
- package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-color-picker.mjs +44 -34
- package/fesm2022/siemens-element-ng-color-picker.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +58 -37
- package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-common.mjs +22 -22
- package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-connection-strength.mjs +14 -12
- package/fesm2022/siemens-element-ng-connection-strength.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-content-action-bar.mjs +37 -28
- package/fesm2022/siemens-element-ng-content-action-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-copyright-notice.mjs +19 -14
- package/fesm2022/siemens-element-ng-copyright-notice.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-dashboard.mjs +337 -223
- package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datatable.mjs +12 -15
- package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-date-range-filter.mjs +126 -76
- package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-datepicker.mjs +393 -251
- package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-electron-titlebar.mjs +22 -17
- package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-empty-state.mjs +15 -12
- package/fesm2022/siemens-element-ng-empty-state.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-file-uploader.mjs +105 -91
- package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filter-bar.mjs +33 -25
- package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-filtered-search.mjs +274 -165
- package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-footer.mjs +12 -10
- package/fesm2022/siemens-element-ng-footer.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-form.mjs +361 -116
- package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-formly-legacy.mjs +99 -0
- package/fesm2022/siemens-element-ng-formly-legacy.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-formly.mjs +224 -318
- package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-header-dropdown.mjs +40 -30
- package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-help-button.mjs +6 -6
- package/fesm2022/siemens-element-ng-help-button.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-icon.mjs +56 -57
- package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-info-page.mjs +17 -11
- package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-inline-notification.mjs +19 -14
- package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-ip-input.mjs +19 -15
- package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-landing-page.mjs +121 -75
- package/fesm2022/siemens-element-ng-landing-page.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-language-switcher.mjs +16 -12
- package/fesm2022/siemens-element-ng-language-switcher.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-link.mjs +31 -21
- package/fesm2022/siemens-element-ng-link.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-list-details.mjs +132 -66
- package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-loading-spinner.mjs +51 -64
- package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-localization.mjs +14 -12
- package/fesm2022/siemens-element-ng-localization.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-main-detail-container.mjs +116 -51
- package/fesm2022/siemens-element-ng-main-detail-container.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-maplibre.mjs +401 -0
- package/fesm2022/siemens-element-ng-maplibre.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-directives-tabs.mjs +70 -0
- package/fesm2022/siemens-element-ng-markdown-directives-tabs.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-citations.mjs +215 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-citations.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs +76 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-mermaid.mjs +86 -0
- package/fesm2022/siemens-element-ng-markdown-extensions-mermaid.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown-hightlighter-highlightjs.mjs +130 -0
- package/fesm2022/siemens-element-ng-markdown-hightlighter-highlightjs.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-markdown.mjs +800 -0
- package/fesm2022/siemens-element-ng-markdown.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-menu.mjs +71 -57
- package/fesm2022/siemens-element-ng-menu.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-modal.mjs +14 -11
- package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs +251 -206
- package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs +123 -86
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar.mjs +72 -45
- package/fesm2022/siemens-element-ng-navbar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-notification-item.mjs +19 -11
- package/fesm2022/siemens-element-ng-notification-item.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-number-input.mjs +41 -29
- package/fesm2022/siemens-element-ng-number-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-pagination.mjs +31 -20
- package/fesm2022/siemens-element-ng-pagination.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-password-strength.mjs +33 -24
- package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-password-toggle.mjs +19 -14
- package/fesm2022/siemens-element-ng-password-toggle.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-phone-number.mjs +144 -139
- package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-photo-upload.mjs +85 -52
- package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-pills-input.mjs +56 -41
- package/fesm2022/siemens-element-ng-pills-input.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-popover-legacy.mjs +43 -28
- package/fesm2022/siemens-element-ng-popover-legacy.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-popover.mjs +35 -27
- package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-progressbar.mjs +23 -16
- package/fesm2022/siemens-element-ng-progressbar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-resize-observer.mjs +32 -43
- package/fesm2022/siemens-element-ng-resize-observer.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-result-details-list.mjs +12 -10
- package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-search-bar.mjs +38 -37
- package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-select.mjs +265 -170
- package/fesm2022/siemens-element-ng-select.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-shadow-root.mjs +4 -4
- package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-side-panel.mjs +181 -104
- package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-skip-links.mjs +21 -24
- package/fesm2022/siemens-element-ng-skip-links.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-slider.mjs +45 -30
- package/fesm2022/siemens-element-ng-slider.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-source-chip.mjs +79 -0
- package/fesm2022/siemens-element-ng-source-chip.mjs.map +1 -0
- package/fesm2022/siemens-element-ng-split.mjs +290 -306
- package/fesm2022/siemens-element-ng-split.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-status-bar.mjs +66 -52
- package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-status-counter.mjs +15 -11
- package/fesm2022/siemens-element-ng-status-counter.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-status-toggle.mjs +26 -16
- package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-summary-chip.mjs +25 -16
- package/fesm2022/siemens-element-ng-summary-chip.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-summary-widget.mjs +27 -17
- package/fesm2022/siemens-element-ng-summary-widget.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-system-banner.mjs +13 -10
- package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tabs-legacy.mjs +20 -17
- package/fesm2022/siemens-element-ng-tabs-legacy.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tabs.mjs +156 -131
- package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-theme.mjs +29 -6
- package/fesm2022/siemens-element-ng-theme.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-threshold.mjs +62 -42
- package/fesm2022/siemens-element-ng-threshold.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-toast-notification.mjs +59 -40
- package/fesm2022/siemens-element-ng-toast-notification.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tooltip.mjs +108 -82
- package/fesm2022/siemens-element-ng-tooltip.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tour.mjs +36 -19
- package/fesm2022/siemens-element-ng-tour.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-translate.mjs +0 -1
- package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tree-view.mjs +113 -84
- package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-typeahead.mjs +69 -49
- package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-wizard.mjs +95 -54
- package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
- package/formly-legacy/package.json +4 -0
- package/maplibre/package.json +4 -0
- package/maplibre/styles/_index.scss +1 -0
- package/maplibre/styles/maplibre-gl.scss +724 -0
- package/markdown/directives/tabs/package.json +4 -0
- package/markdown/extensions/citations/package.json +4 -0
- package/markdown/extensions/katex/package.json +4 -0
- package/markdown/extensions/mermaid/package.json +4 -0
- package/markdown/hightlighter/highlightjs/package.json +4 -0
- package/markdown/package.json +4 -0
- package/package.json +96 -25
- package/schematics/collection.json +5 -0
- package/schematics/{migrations/icon-path-migration → migrate-tabs-legacy}/index.js +1 -1
- package/schematics/migrate-tabs-legacy/migrate-tabs-legacy-rule.js +675 -0
- package/schematics/migrate-tabs-legacy/schema.json +14 -0
- package/schematics/migration.json +4 -4
- package/schematics/migrations/data/class-member-replacement.js +1 -19
- package/schematics/migrations/data/component-property-names.js +1 -25
- package/schematics/migrations/data/component-property-to-child.js +11 -0
- package/schematics/migrations/data/css-custom-properties.js +224 -0
- package/schematics/migrations/data/element-class-changes.js +116 -18
- package/schematics/migrations/data/element-migration-data.js +6 -0
- package/schematics/migrations/data/element-selectors.js +1 -9
- package/schematics/migrations/data/index.js +0 -4
- package/schematics/migrations/data/migration-test-data.js +49 -6
- package/schematics/migrations/data/provider-function-removals.js +7 -0
- package/schematics/migrations/data/symbol-removals.js +17 -7
- package/schematics/migrations/data/symbol-renaming.js +3 -44
- package/schematics/migrations/element-migration/element-migration.js +6 -6
- package/schematics/migrations/utilities/component-property-to-child.migration.js +73 -0
- package/schematics/migrations/utilities/css-custom-property.migration.js +51 -0
- package/schematics/migrations/utilities/element-class-change.migration.js +10 -5
- package/schematics/migrations/utilities/import-removal.js +39 -0
- package/schematics/migrations/utilities/index.js +4 -0
- package/schematics/migrations/utilities/provider-function-removal.migration.js +116 -0
- package/schematics/ng-update/index.js +1 -1
- package/schematics/ng-update/migrate-content-formatter.js +288 -0
- package/schematics/ng-update/migrate-list-details-units.js +86 -0
- package/schematics/ng-update/migrate-main-detail-units.js +89 -0
- package/schematics/ng-update/migrate-markdown-renderer.js +106 -0
- package/schematics/ng-update/migrate-spacers.js +32 -0
- package/schematics/ng-update/migrate-split-collapse.js +276 -0
- package/schematics/ng-update/migrate-split-scale.js +524 -0
- package/schematics/ng-update/migrate-split-sizes.js +107 -0
- package/schematics/ng-update/migrate-to-v51.js +35 -0
- package/schematics/utils/index.js +1 -0
- package/schematics/utils/template-edit-utils.js +35 -0
- package/schematics/utils/template-utils.js +31 -45
- package/source-chip/package.json +4 -0
- package/template-i18n.json +78 -47
- package/types/siemens-element-ng-application-header.d.ts +7 -33
- package/types/siemens-element-ng-avatar.d.ts +1 -1
- package/types/siemens-element-ng-breadcrumb.d.ts +1 -1
- package/types/siemens-element-ng-chat-messages.d.ts +118 -70
- package/types/siemens-element-ng-circle-status.d.ts +1 -1
- package/types/siemens-element-ng-content-action-bar.d.ts +1 -1
- package/types/siemens-element-ng-dashboard.d.ts +2 -2
- package/types/siemens-element-ng-datatable.d.ts +5 -56
- package/types/siemens-element-ng-date-range-filter.d.ts +1 -1
- package/types/siemens-element-ng-datepicker.d.ts +8 -15
- package/types/siemens-element-ng-electron-titlebar.d.ts +1 -1
- package/types/siemens-element-ng-file-uploader.d.ts +13 -31
- package/types/siemens-element-ng-filter-bar.d.ts +1 -1
- package/types/siemens-element-ng-filtered-search.d.ts +4 -4
- package/types/siemens-element-ng-form.d.ts +183 -44
- package/types/siemens-element-ng-formly-legacy.d.ts +40 -0
- package/types/siemens-element-ng-formly.d.ts +34 -167
- package/types/siemens-element-ng-icon.d.ts +2 -19
- package/types/siemens-element-ng-landing-page.d.ts +2 -2
- package/types/siemens-element-ng-list-details.d.ts +25 -3
- package/types/siemens-element-ng-loading-spinner.d.ts +11 -17
- package/types/siemens-element-ng-main-detail-container.d.ts +23 -3
- package/types/siemens-element-ng-maplibre.d.ts +190 -0
- package/types/siemens-element-ng-markdown-directives-tabs.d.ts +10 -0
- package/types/siemens-element-ng-markdown-extensions-citations.d.ts +11 -0
- package/types/siemens-element-ng-markdown-extensions-katex.d.ts +19 -0
- package/types/siemens-element-ng-markdown-extensions-mermaid.d.ts +11 -0
- package/types/siemens-element-ng-markdown-hightlighter-highlightjs.d.ts +48 -0
- package/types/siemens-element-ng-markdown.d.ts +367 -0
- package/types/siemens-element-ng-menu.d.ts +2 -0
- package/types/siemens-element-ng-navbar-vertical-next.d.ts +87 -39
- package/types/siemens-element-ng-navbar-vertical.d.ts +1 -1
- package/types/siemens-element-ng-navbar.d.ts +3 -3
- package/types/siemens-element-ng-notification-item.d.ts +12 -0
- package/types/siemens-element-ng-phone-number.d.ts +28 -10
- package/types/siemens-element-ng-photo-upload.d.ts +4 -4
- package/types/siemens-element-ng-resize-observer.d.ts +0 -17
- package/types/siemens-element-ng-search-bar.d.ts +2 -9
- package/types/siemens-element-ng-select.d.ts +32 -5
- package/types/siemens-element-ng-side-panel.d.ts +25 -11
- package/types/siemens-element-ng-source-chip.d.ts +53 -0
- package/types/siemens-element-ng-split.d.ts +101 -78
- package/types/siemens-element-ng-status-bar.d.ts +5 -13
- package/types/siemens-element-ng-status-counter.d.ts +1 -1
- package/types/siemens-element-ng-system-banner.d.ts +2 -2
- package/types/siemens-element-ng-tabs.d.ts +1 -2
- package/types/siemens-element-ng-theme.d.ts +12 -2
- package/types/siemens-element-ng-threshold.d.ts +1 -1
- package/types/siemens-element-ng-toast-notification.d.ts +0 -1
- package/types/siemens-element-ng-tooltip.d.ts +7 -7
- package/types/siemens-element-ng-translate.d.ts +35 -5
- package/types/siemens-element-ng-tree-view.d.ts +3 -0
- package/types/siemens-element-ng-wizard.d.ts +18 -3
- package/fesm2022/siemens-element-ng-icon-status.mjs +0 -46
- package/fesm2022/siemens-element-ng-icon-status.mjs.map +0 -1
- package/fesm2022/siemens-element-ng-markdown-renderer.mjs +0 -263
- package/fesm2022/siemens-element-ng-markdown-renderer.mjs.map +0 -1
- package/fesm2022/siemens-element-ng-sort-bar.mjs +0 -99
- package/fesm2022/siemens-element-ng-sort-bar.mjs.map +0 -1
- package/icon-status/package.json +0 -4
- package/markdown-renderer/package.json +0 -4
- package/schematics/migrations/icon-path-migration/icon-path-migration.js +0 -95
- package/schematics/ng-update/migrate-to-v49.js +0 -21
- package/schematics/vitest-setup.js +0 -5
- package/sort-bar/package.json +0 -4
- package/types/siemens-element-ng-icon-status.d.ts +0 -25
- package/types/siemens-element-ng-markdown-renderer.d.ts +0 -36
- package/types/siemens-element-ng-sort-bar.d.ts +0 -59
- /package/{LICENSE.md → LICENSE} +0 -0
|
@@ -103,11 +103,12 @@ class SiLocaleService {
|
|
|
103
103
|
let initialLocale;
|
|
104
104
|
const browserCultureLang = getBrowserCultureLanguage();
|
|
105
105
|
const browserLang = getBrowserLanguage();
|
|
106
|
+
const currentLanguage = this.translate.currentLanguage;
|
|
106
107
|
if (this.hasLocale(savedLocale)) {
|
|
107
108
|
initialLocale = savedLocale;
|
|
108
109
|
}
|
|
109
|
-
else if (
|
|
110
|
-
initialLocale =
|
|
110
|
+
else if (currentLanguage) {
|
|
111
|
+
initialLocale = currentLanguage;
|
|
111
112
|
}
|
|
112
113
|
else if (this.hasLocale(browserCultureLang)) {
|
|
113
114
|
initialLocale = browserCultureLang;
|
|
@@ -205,10 +206,10 @@ class SiLocaleService {
|
|
|
205
206
|
}
|
|
206
207
|
return false;
|
|
207
208
|
}
|
|
208
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
209
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
209
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
210
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleService, providedIn: 'root' });
|
|
210
211
|
}
|
|
211
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
212
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleService, decorators: [{
|
|
212
213
|
type: Injectable,
|
|
213
214
|
args: [{ providedIn: 'root' }]
|
|
214
215
|
}], ctorParameters: () => [] });
|
|
@@ -244,10 +245,10 @@ class SiLocaleId extends String {
|
|
|
244
245
|
toLowerCase() {
|
|
245
246
|
return this.toString().toLowerCase();
|
|
246
247
|
}
|
|
247
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
248
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
248
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleId, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
249
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleId });
|
|
249
250
|
}
|
|
250
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
251
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleId, decorators: [{
|
|
251
252
|
type: Injectable
|
|
252
253
|
}], ctorParameters: () => [] });
|
|
253
254
|
|
|
@@ -278,7 +279,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
278
279
|
class SiDirectionality {
|
|
279
280
|
change = new EventEmitter();
|
|
280
281
|
/** @defaultValue 'ltr' */
|
|
281
|
-
valueSignal = signal('ltr',
|
|
282
|
+
valueSignal = signal('ltr', /* @ts-ignore */
|
|
283
|
+
...(ngDevMode ? [{ debugName: "valueSignal" }] : /* istanbul ignore next */ []));
|
|
282
284
|
get value() {
|
|
283
285
|
const dir = isRTL() ? 'rtl' : 'ltr';
|
|
284
286
|
this.valueSignal.set(dir);
|
|
@@ -289,10 +291,10 @@ class SiDirectionality {
|
|
|
289
291
|
ngOnDestroy() {
|
|
290
292
|
// empty, from Directionality
|
|
291
293
|
}
|
|
292
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
293
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
294
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiDirectionality, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
295
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiDirectionality });
|
|
294
296
|
}
|
|
295
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
297
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiDirectionality, decorators: [{
|
|
296
298
|
type: Injectable
|
|
297
299
|
}] });
|
|
298
300
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siemens-element-ng-localization.mjs","sources":["../../../../projects/element-ng/localization/si-locale-store.ts","../../../../projects/element-ng/localization/si-locale.service.ts","../../../../projects/element-ng/localization/si-locale-id.ts","../../../../projects/element-ng/localization/si-directionality.ts","../../../../projects/element-ng/localization/index.ts","../../../../projects/element-ng/localization/siemens-element-ng-localization.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Observable, of } from 'rxjs';\n\nexport abstract class SiLocaleStore {\n abstract get locale(): string | undefined;\n abstract saveLocale(locale: string): Observable<boolean>;\n}\n\nexport const SI_LOCALE_LOCAL_STORAGE_KEY = 'lang';\n\nexport class SiDefaultLocaleStore extends SiLocaleStore {\n constructor(private isBrowser: boolean) {\n super();\n }\n\n get locale(): string | undefined {\n if (this.isBrowser) {\n return localStorage.getItem(SI_LOCALE_LOCAL_STORAGE_KEY) ?? undefined;\n } else {\n return undefined;\n }\n }\n\n saveLocale(locale: string): Observable<boolean> {\n if (this.isBrowser) {\n localStorage.setItem(SI_LOCALE_LOCAL_STORAGE_KEY, locale);\n return of(true);\n } else {\n return of(false);\n }\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, InjectionToken, PLATFORM_ID } from '@angular/core';\nimport {\n getBrowserCultureLanguage,\n getBrowserLanguage,\n injectSiTranslateService\n} from '@siemens/element-translate-ng/translate';\nimport { BehaviorSubject, ReplaySubject } from 'rxjs';\nimport { first } from 'rxjs/operators';\n\nimport { SiDefaultLocaleStore, SiLocaleStore } from './si-locale-store';\n\nexport const SI_LOCALE_STORE = new InjectionToken<string>('SI_LOCALE_STORE');\nexport const SI_LOCALE_CONFIG = new InjectionToken<SiLocaleConfig>('SI_LOCALE_CONFIG');\n\n// this is a function because Angular compiler exports arrows for no good reason\n// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\nfunction defaultLocaleInitializer(localeId: string): Promise<void> {\n if (localeId === 'en') {\n return Promise.resolve();\n } else {\n return Promise.reject();\n }\n}\n\nexport interface SiLocaleConfig {\n /**\n * The default locale to be used, when no user preference\n * available and the browser language is not part of the\n * available languages.\n */\n defaultLocale?: string;\n /**\n * The list of available locales (e.g. en, fr, de, en-GB, de-AT)\n */\n availableLocales?: string[];\n /**\n * The localeInitializer function is invoked on every locale change.\n * Make sure to invoke `registerLocaleData` with the locale to enable\n * the Angular localization.\n */\n localeInitializer?: (localeId: string) => Promise<any>;\n /**\n * Set to true to also enable the default language on ngx-translate. When true,\n * ngx-translate will use a translate value from the default language when a required\n * value is not available in the current language. But note, this will also enforce\n * to load the default language translation file into the application, even if a different\n * locale is active. In other words, the application start time increases.\n */\n fallbackEnabled?: boolean;\n /**\n * Default is false and defines that on setting a new locale, the locale is stored and the\n * browser is reloaded. When changing to true, window reload is not invoked, but angular\n * pure pipes like DatePipe will not work.\n */\n dynamicLanguageChange?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SiLocaleService {\n /**\n * Holds the used locale definition like en, de, or en-US.\n */\n readonly locale$: BehaviorSubject<string>;\n /**\n * Emits to indicate that the localization package (e.g. \\@angular/common/locales/$\\{localeId\\})\n * is loaded and registered. Emits after calling `localeInitializer` from the `config` object.\n */\n readonly localePackageLoaded$ = new ReplaySubject<void>(1);\n\n private _nextLocale!: string;\n private isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private translate = injectSiTranslateService();\n private localeStore =\n inject(SiLocaleStore, { optional: true }) ?? new SiDefaultLocaleStore(this.isBrowser);\n /**\n * The config for the local service.\n */\n config = inject(SI_LOCALE_CONFIG, { optional: true }) ?? {\n availableLocales: ['en'],\n defaultLocale: 'en',\n localeInitializer: defaultLocaleInitializer,\n fallbackEnabled: false,\n dynamicLanguageChange: false\n };\n\n constructor() {\n if (!this.config.defaultLocale) {\n if (this.config.availableLocales && this.config.availableLocales.length > 0) {\n this.config.defaultLocale = this.config.availableLocales[0];\n } else {\n this.config.defaultLocale = 'en';\n }\n }\n\n if (!this.config.availableLocales || this.config.availableLocales.length === 0) {\n this.config.availableLocales = [this.config.defaultLocale];\n }\n // Also adds all locales to the translate service to enable\n // components working with the translate service directly to still work.\n this.translate.availableLanguages = this.config.availableLocales;\n\n this.config.localeInitializer ??= defaultLocaleInitializer;\n this.config.fallbackEnabled ??= false;\n this.config.dynamicLanguageChange ??= false;\n\n const savedLocale = this.localeStore.locale;\n // The following check is important. We do not control the store and when it comes from\n // a remove backend, someone might give us a locale that we do not understand. In this\n // case we switch to the default.\n let initialLocale;\n const browserCultureLang = getBrowserCultureLanguage();\n const browserLang = getBrowserLanguage();\n if (this.hasLocale(savedLocale)) {\n initialLocale = savedLocale!;\n } else if (this.translate.currentLanguage) {\n initialLocale = this.translate.currentLanguage;\n } else if (this.hasLocale(browserCultureLang)) {\n initialLocale = browserCultureLang!;\n } else if (this.hasLocale(browserLang)) {\n initialLocale = browserLang!;\n } else {\n initialLocale = this.config.defaultLocale;\n }\n this.locale$ = new BehaviorSubject<string>(initialLocale);\n this.doSetLocale(initialLocale);\n\n // If a user changes the language on the translate service directly,\n // we synchronize the change again.\n this.translate.translationChange.subscribe(() => {\n const current = this.translate.currentLanguage;\n if (current) {\n this.locale = current;\n }\n });\n\n if (this.config.fallbackEnabled) {\n this.translate.setDefaultLanguage(this.config.defaultLocale);\n }\n }\n\n /**\n * Sets a new locale to the locale service and also to the translate\n * service.\n * @throws An error if the new value is not configured in the available locales\n * or if the new locale cannot be saved, an error is thrown.\n */\n set locale(value: string) {\n if (value === this.locale$.value || value === this._nextLocale) {\n return;\n }\n if (!this.hasLocale(value)) {\n throw new Error(`The value ${value} does not exist in the available locales.`);\n }\n this.localeStore\n .saveLocale(value)\n .pipe(first())\n .subscribe({\n next: (saveSucceed: boolean) => {\n if (saveSucceed) {\n if (this.config.dynamicLanguageChange) {\n this.doSetLocale(value);\n } else if (this.isBrowser) {\n window.location.reload();\n }\n } else {\n throw new Error(`Could not save new locale ${value}.`);\n }\n },\n error: () => {\n throw new Error(`Could not save new locale ${value}.`);\n }\n });\n }\n\n get locale(): string {\n return this.locale$.value;\n }\n\n private doSetLocale(value: string): void {\n this._nextLocale = value;\n this.config.localeInitializer!(value).then(\n () => {\n this.localePackageLoaded$.next();\n this.translate\n .setCurrentLanguage(value)\n .pipe(first())\n .subscribe(() => {\n if (this.locale$.value !== value) {\n this.locale$.next(value);\n }\n });\n },\n () => {\n console.error(\n `Could not initialize new locale ${value}. Setting default locale ${this.config.defaultLocale}`\n );\n // Initialization of locale rejected. Setting default locale.\n this.translate\n .setCurrentLanguage(this.config.defaultLocale!)\n .pipe(first())\n .subscribe(() => {\n if (this.locale$.value !== this.config.defaultLocale!) {\n this.locale$.next(this.config.defaultLocale!);\n }\n });\n }\n );\n }\n\n /**\n * Test if the given locale is part of the available locales.\n * @param locale - The locale to be tested.\n */\n hasLocale(locale?: string): boolean {\n if (locale) {\n return this.config.availableLocales!.includes(locale);\n }\n return false;\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { inject, Injectable } from '@angular/core';\n\nimport { SiLocaleService } from './si-locale.service';\n\n/**\n * The SiLocaleId is used to provide a locale id from the translate service\n * to the angular localization. The Angular services call toString or valueOf\n * so that the current locale of the translation service is provided. The Intl.\n * library does not invoke toString() and using the value directly in Intl\n * formatting results always having the `en` locale. Thus, when using the SiLocaleId\n * in other services, make sure to use the `toString()` method before.\n */\n@Injectable()\nexport class SiLocaleId extends String {\n protected service: SiLocaleService;\n\n // the constructor is needed for unknown reasons. w/o the inject() fails\n constructor() {\n super();\n this.service = inject(SiLocaleService);\n }\n\n /**\n * Outputs the locale id as a string.\n */\n override toString(): string {\n return this.service.locale === 'template' ? 'en' : this.service.locale;\n }\n\n override valueOf(): string {\n return this.toString();\n }\n\n override toLowerCase(): string {\n return this.toString().toLowerCase();\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Direction, Directionality } from '@angular/cdk/bidi';\nimport { EventEmitter, Injectable, signal } from '@angular/core';\nimport { isRTL } from '@siemens/element-ng/common';\n\n/**\n * Provider for dynamic CDK directionality.\n *\n * CDK per default evaluates directionality once during initialization. This is a problem when\n * switching language later in the lifecycle. This provider can be used to make this dynamic.\n * To use, simply provide this in the `ApplicationConfig`:\n *\n * ```ts\n * import { Directionality } from '@angular/cdk/bidi';\n * import { SiDirectionality } from '@siemens/element-ng/localization';\n *\n * ...\n * export const APP_CONFIG: ApplicationConfig = {\n * providers: [\n * { provide: Directionality, useClass: SiDirectionality },\n * ...\n * ]\n * }\n *\n * bootstrapApplication(AppComponent, APP_CONFIG)\n * ...\n *\n * ```\n */\n\n@Injectable()\nexport class SiDirectionality implements Directionality {\n readonly change = new EventEmitter<Direction>();\n\n /** @defaultValue 'ltr' */\n readonly valueSignal = signal<Direction>('ltr');\n\n get value(): Direction {\n const dir = isRTL() ? 'rtl' : 'ltr';\n this.valueSignal.set(dir);\n return dir;\n }\n\n /** @internal */\n // eslint-disable-next-line @angular-eslint/use-lifecycle-interface, @angular-eslint/no-empty-lifecycle-method\n ngOnDestroy(): void {\n // empty, from Directionality\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-locale-id';\nexport * from './si-locale-store';\nexport * from './si-locale.service';\nexport * from './si-directionality';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"siemens-element-ng-localization.mjs","sources":["../../../../projects/element-ng/localization/si-locale-store.ts","../../../../projects/element-ng/localization/si-locale.service.ts","../../../../projects/element-ng/localization/si-locale-id.ts","../../../../projects/element-ng/localization/si-directionality.ts","../../../../projects/element-ng/localization/index.ts","../../../../projects/element-ng/localization/siemens-element-ng-localization.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Observable, of } from 'rxjs';\n\nexport abstract class SiLocaleStore {\n abstract get locale(): string | undefined;\n abstract saveLocale(locale: string): Observable<boolean>;\n}\n\nexport const SI_LOCALE_LOCAL_STORAGE_KEY = 'lang';\n\nexport class SiDefaultLocaleStore extends SiLocaleStore {\n constructor(private isBrowser: boolean) {\n super();\n }\n\n get locale(): string | undefined {\n if (this.isBrowser) {\n return localStorage.getItem(SI_LOCALE_LOCAL_STORAGE_KEY) ?? undefined;\n } else {\n return undefined;\n }\n }\n\n saveLocale(locale: string): Observable<boolean> {\n if (this.isBrowser) {\n localStorage.setItem(SI_LOCALE_LOCAL_STORAGE_KEY, locale);\n return of(true);\n } else {\n return of(false);\n }\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, InjectionToken, PLATFORM_ID } from '@angular/core';\nimport {\n getBrowserCultureLanguage,\n getBrowserLanguage,\n injectSiTranslateService\n} from '@siemens/element-translate-ng/translate';\nimport { BehaviorSubject, ReplaySubject } from 'rxjs';\nimport { first } from 'rxjs/operators';\n\nimport { SiDefaultLocaleStore, SiLocaleStore } from './si-locale-store';\n\nexport const SI_LOCALE_STORE = new InjectionToken<string>('SI_LOCALE_STORE');\nexport const SI_LOCALE_CONFIG = new InjectionToken<SiLocaleConfig>('SI_LOCALE_CONFIG');\n\n// this is a function because Angular compiler exports arrows for no good reason\n// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\nfunction defaultLocaleInitializer(localeId: string): Promise<void> {\n if (localeId === 'en') {\n return Promise.resolve();\n } else {\n return Promise.reject();\n }\n}\n\nexport interface SiLocaleConfig {\n /**\n * The default locale to be used, when no user preference\n * available and the browser language is not part of the\n * available languages.\n */\n defaultLocale?: string;\n /**\n * The list of available locales (e.g. en, fr, de, en-GB, de-AT)\n */\n availableLocales?: string[];\n /**\n * The localeInitializer function is invoked on every locale change.\n * Make sure to invoke `registerLocaleData` with the locale to enable\n * the Angular localization.\n */\n localeInitializer?: (localeId: string) => Promise<any>;\n /**\n * Set to true to also enable the default language on ngx-translate. When true,\n * ngx-translate will use a translate value from the default language when a required\n * value is not available in the current language. But note, this will also enforce\n * to load the default language translation file into the application, even if a different\n * locale is active. In other words, the application start time increases.\n */\n fallbackEnabled?: boolean;\n /**\n * Default is false and defines that on setting a new locale, the locale is stored and the\n * browser is reloaded. When changing to true, window reload is not invoked, but angular\n * pure pipes like DatePipe will not work.\n */\n dynamicLanguageChange?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SiLocaleService {\n /**\n * Holds the used locale definition like en, de, or en-US.\n */\n readonly locale$: BehaviorSubject<string>;\n /**\n * Emits to indicate that the localization package (e.g. \\@angular/common/locales/$\\{localeId\\})\n * is loaded and registered. Emits after calling `localeInitializer` from the `config` object.\n */\n readonly localePackageLoaded$ = new ReplaySubject<void>(1);\n\n private _nextLocale!: string;\n private isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private translate = injectSiTranslateService();\n private localeStore =\n inject(SiLocaleStore, { optional: true }) ?? new SiDefaultLocaleStore(this.isBrowser);\n /**\n * The config for the local service.\n */\n config = inject(SI_LOCALE_CONFIG, { optional: true }) ?? {\n availableLocales: ['en'],\n defaultLocale: 'en',\n localeInitializer: defaultLocaleInitializer,\n fallbackEnabled: false,\n dynamicLanguageChange: false\n };\n\n constructor() {\n if (!this.config.defaultLocale) {\n if (this.config.availableLocales && this.config.availableLocales.length > 0) {\n this.config.defaultLocale = this.config.availableLocales[0];\n } else {\n this.config.defaultLocale = 'en';\n }\n }\n\n if (!this.config.availableLocales || this.config.availableLocales.length === 0) {\n this.config.availableLocales = [this.config.defaultLocale];\n }\n // Also adds all locales to the translate service to enable\n // components working with the translate service directly to still work.\n this.translate.availableLanguages = this.config.availableLocales;\n\n this.config.localeInitializer ??= defaultLocaleInitializer;\n this.config.fallbackEnabled ??= false;\n this.config.dynamicLanguageChange ??= false;\n\n const savedLocale = this.localeStore.locale;\n // The following check is important. We do not control the store and when it comes from\n // a remove backend, someone might give us a locale that we do not understand. In this\n // case we switch to the default.\n let initialLocale;\n const browserCultureLang = getBrowserCultureLanguage();\n const browserLang = getBrowserLanguage();\n const currentLanguage = this.translate.currentLanguage;\n if (this.hasLocale(savedLocale)) {\n initialLocale = savedLocale!;\n } else if (currentLanguage) {\n initialLocale = currentLanguage;\n } else if (this.hasLocale(browserCultureLang)) {\n initialLocale = browserCultureLang!;\n } else if (this.hasLocale(browserLang)) {\n initialLocale = browserLang!;\n } else {\n initialLocale = this.config.defaultLocale;\n }\n this.locale$ = new BehaviorSubject<string>(initialLocale);\n this.doSetLocale(initialLocale);\n\n // If a user changes the language on the translate service directly,\n // we synchronize the change again.\n this.translate.translationChange.subscribe(() => {\n const current = this.translate.currentLanguage;\n if (current) {\n this.locale = current;\n }\n });\n\n if (this.config.fallbackEnabled) {\n this.translate.setDefaultLanguage(this.config.defaultLocale);\n }\n }\n\n /**\n * Sets a new locale to the locale service and also to the translate\n * service.\n * @throws An error if the new value is not configured in the available locales\n * or if the new locale cannot be saved, an error is thrown.\n */\n set locale(value: string) {\n if (value === this.locale$.value || value === this._nextLocale) {\n return;\n }\n if (!this.hasLocale(value)) {\n throw new Error(`The value ${value} does not exist in the available locales.`);\n }\n this.localeStore\n .saveLocale(value)\n .pipe(first())\n .subscribe({\n next: (saveSucceed: boolean) => {\n if (saveSucceed) {\n if (this.config.dynamicLanguageChange) {\n this.doSetLocale(value);\n } else if (this.isBrowser) {\n window.location.reload();\n }\n } else {\n throw new Error(`Could not save new locale ${value}.`);\n }\n },\n error: () => {\n throw new Error(`Could not save new locale ${value}.`);\n }\n });\n }\n\n get locale(): string {\n return this.locale$.value;\n }\n\n private doSetLocale(value: string): void {\n this._nextLocale = value;\n this.config.localeInitializer!(value).then(\n () => {\n this.localePackageLoaded$.next();\n this.translate\n .setCurrentLanguage(value)\n .pipe(first())\n .subscribe(() => {\n if (this.locale$.value !== value) {\n this.locale$.next(value);\n }\n });\n },\n () => {\n console.error(\n `Could not initialize new locale ${value}. Setting default locale ${this.config.defaultLocale}`\n );\n // Initialization of locale rejected. Setting default locale.\n this.translate\n .setCurrentLanguage(this.config.defaultLocale!)\n .pipe(first())\n .subscribe(() => {\n if (this.locale$.value !== this.config.defaultLocale!) {\n this.locale$.next(this.config.defaultLocale!);\n }\n });\n }\n );\n }\n\n /**\n * Test if the given locale is part of the available locales.\n * @param locale - The locale to be tested.\n */\n hasLocale(locale?: string): boolean {\n if (locale) {\n return this.config.availableLocales!.includes(locale);\n }\n return false;\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { inject, Injectable } from '@angular/core';\n\nimport { SiLocaleService } from './si-locale.service';\n\n/**\n * The SiLocaleId is used to provide a locale id from the translate service\n * to the angular localization. The Angular services call toString or valueOf\n * so that the current locale of the translation service is provided. The Intl.\n * library does not invoke toString() and using the value directly in Intl\n * formatting results always having the `en` locale. Thus, when using the SiLocaleId\n * in other services, make sure to use the `toString()` method before.\n */\n@Injectable()\nexport class SiLocaleId extends String {\n protected service: SiLocaleService;\n\n // the constructor is needed for unknown reasons. w/o the inject() fails\n constructor() {\n super();\n this.service = inject(SiLocaleService);\n }\n\n /**\n * Outputs the locale id as a string.\n */\n override toString(): string {\n return this.service.locale === 'template' ? 'en' : this.service.locale;\n }\n\n override valueOf(): string {\n return this.toString();\n }\n\n override toLowerCase(): string {\n return this.toString().toLowerCase();\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Direction, Directionality } from '@angular/cdk/bidi';\nimport { EventEmitter, Injectable, signal } from '@angular/core';\nimport { isRTL } from '@siemens/element-ng/common';\n\n/**\n * Provider for dynamic CDK directionality.\n *\n * CDK per default evaluates directionality once during initialization. This is a problem when\n * switching language later in the lifecycle. This provider can be used to make this dynamic.\n * To use, simply provide this in the `ApplicationConfig`:\n *\n * ```ts\n * import { Directionality } from '@angular/cdk/bidi';\n * import { SiDirectionality } from '@siemens/element-ng/localization';\n *\n * ...\n * export const APP_CONFIG: ApplicationConfig = {\n * providers: [\n * { provide: Directionality, useClass: SiDirectionality },\n * ...\n * ]\n * }\n *\n * bootstrapApplication(AppComponent, APP_CONFIG)\n * ...\n *\n * ```\n */\n\n@Injectable()\nexport class SiDirectionality implements Directionality {\n readonly change = new EventEmitter<Direction>();\n\n /** @defaultValue 'ltr' */\n readonly valueSignal = signal<Direction>('ltr');\n\n get value(): Direction {\n const dir = isRTL() ? 'rtl' : 'ltr';\n this.valueSignal.set(dir);\n return dir;\n }\n\n /** @internal */\n // eslint-disable-next-line @angular-eslint/use-lifecycle-interface, @angular-eslint/no-empty-lifecycle-method\n ngOnDestroy(): void {\n // empty, from Directionality\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-locale-id';\nexport * from './si-locale-store';\nexport * from './si-locale.service';\nexport * from './si-directionality';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { NgTemplateOutlet } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { inject, ElementRef, ChangeDetectorRef, DestroyRef, input, output, model, booleanAttribute, computed, signal,
|
|
3
|
+
import { inject, ElementRef, ChangeDetectorRef, DestroyRef, viewChild, input, output, model, booleanAttribute, computed, signal, Component, NgModule } from '@angular/core';
|
|
4
4
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
5
|
import { elementBack } from '@siemens/element-icons';
|
|
6
6
|
import { addIcons, SiIconComponent } from '@siemens/element-ng/icon';
|
|
7
7
|
import { ResizeObserverService, BOOTSTRAP_BREAKPOINTS } from '@siemens/element-ng/resize-observer';
|
|
8
|
-
import {
|
|
8
|
+
import { SiSplitPartComponent, SiSplitComponent } from '@siemens/element-ng/split';
|
|
9
9
|
import { t, SiTranslatePipe } from '@siemens/element-translate-ng/translate';
|
|
10
10
|
import { timer } from 'rxjs';
|
|
11
11
|
|
|
@@ -20,6 +20,8 @@ class SiMainDetailContainerComponent {
|
|
|
20
20
|
resizeObserver = inject(ResizeObserverService);
|
|
21
21
|
changeDetectorRef = inject(ChangeDetectorRef);
|
|
22
22
|
destroyRef = inject(DestroyRef);
|
|
23
|
+
splitElement = viewChild('splitElement', { ...(ngDevMode ? { debugName: "splitElement" } : /* istanbul ignore next */ {}), read: ElementRef });
|
|
24
|
+
mainSplitPart = viewChild('mainSplitPart', { ...(ngDevMode ? { debugName: "mainSplitPart" } : /* istanbul ignore next */ {}), read: SiSplitPartComponent });
|
|
23
25
|
/**
|
|
24
26
|
* A numeric value defining the minimum width in px, which the container needs
|
|
25
27
|
* to be displayed in its large layout. Whenever smaller than
|
|
@@ -28,7 +30,8 @@ class SiMainDetailContainerComponent {
|
|
|
28
30
|
*
|
|
29
31
|
* @defaultValue BOOTSTRAP_BREAKPOINTS.mdMinimum
|
|
30
32
|
*/
|
|
31
|
-
largeLayoutBreakpoint = input(BOOTSTRAP_BREAKPOINTS.mdMinimum,
|
|
33
|
+
largeLayoutBreakpoint = input(BOOTSTRAP_BREAKPOINTS.mdMinimum, /* @ts-ignore */
|
|
34
|
+
...(ngDevMode ? [{ debugName: "largeLayoutBreakpoint" }] : /* istanbul ignore next */ []));
|
|
32
35
|
/**
|
|
33
36
|
* Whether the main-detail layout component has a large size or not,
|
|
34
37
|
* `true` if the container´s width matches or exceeds the `largeLayoutBreakpoint`.
|
|
@@ -45,26 +48,29 @@ class SiMainDetailContainerComponent {
|
|
|
45
48
|
*
|
|
46
49
|
* @defaultValue false
|
|
47
50
|
*/
|
|
48
|
-
detailsActive = model(false,
|
|
51
|
+
detailsActive = model(false, /* @ts-ignore */
|
|
52
|
+
...(ngDevMode ? [{ debugName: "detailsActive" }] : /* istanbul ignore next */ []));
|
|
49
53
|
/**
|
|
50
54
|
* The heading of the main-detail layout component, usually a page heading.
|
|
51
55
|
*
|
|
52
56
|
* @defaultValue ''
|
|
53
57
|
*/
|
|
54
|
-
heading = input('',
|
|
58
|
+
heading = input('', /* @ts-ignore */
|
|
59
|
+
...(ngDevMode ? [{ debugName: "heading" }] : /* istanbul ignore next */ []));
|
|
55
60
|
/**
|
|
56
61
|
* Whether the heading should be truncated (single line) or not.
|
|
57
62
|
* Default value is `false`.
|
|
58
63
|
*
|
|
59
64
|
* @defaultValue false
|
|
60
65
|
*/
|
|
61
|
-
truncateHeading = input(false, { ...(ngDevMode ? { debugName: "truncateHeading" } : {}), transform: booleanAttribute });
|
|
66
|
+
truncateHeading = input(false, { ...(ngDevMode ? { debugName: "truncateHeading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
62
67
|
/**
|
|
63
68
|
* The heading of the detail area.
|
|
64
69
|
*
|
|
65
70
|
* @defaultValue ''
|
|
66
71
|
*/
|
|
67
|
-
detailsHeading = input('',
|
|
72
|
+
detailsHeading = input('', /* @ts-ignore */
|
|
73
|
+
...(ngDevMode ? [{ debugName: "detailsHeading" }] : /* istanbul ignore next */ []));
|
|
68
74
|
/**
|
|
69
75
|
* Whether the main and detail parts should be resizable by a splitter or not.
|
|
70
76
|
* This is only supported in the 'large' scenario (when `hasLargeSize` is `true`).
|
|
@@ -72,7 +78,7 @@ class SiMainDetailContainerComponent {
|
|
|
72
78
|
*
|
|
73
79
|
* @defaultValue false
|
|
74
80
|
*/
|
|
75
|
-
resizableParts = input(false, { ...(ngDevMode ? { debugName: "resizableParts" } : {}), transform: booleanAttribute });
|
|
81
|
+
resizableParts = input(false, { ...(ngDevMode ? { debugName: "resizableParts" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
76
82
|
/**
|
|
77
83
|
* You can hide the back button in the mobile view by setting true. Required
|
|
78
84
|
* in add, edit workflows on mobile sizes. During add or edit, the back button
|
|
@@ -80,7 +86,7 @@ class SiMainDetailContainerComponent {
|
|
|
80
86
|
*
|
|
81
87
|
* @defaultValue false
|
|
82
88
|
*/
|
|
83
|
-
hideBackButton = input(false, { ...(ngDevMode ? { debugName: "hideBackButton" } : {}), transform: booleanAttribute });
|
|
89
|
+
hideBackButton = input(false, { ...(ngDevMode ? { debugName: "hideBackButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
84
90
|
/**
|
|
85
91
|
* Details back button text. Required for a11y.
|
|
86
92
|
*
|
|
@@ -89,52 +95,76 @@ class SiMainDetailContainerComponent {
|
|
|
89
95
|
* t(() => $localize`:@@SI_MAIN_DETAIL_CONTAINER.BACK:Back`)
|
|
90
96
|
* ```
|
|
91
97
|
*/
|
|
92
|
-
detailsBackButtonText = input(t(() => $localize `:@@SI_MAIN_DETAIL_CONTAINER.BACK:Back`),
|
|
98
|
+
detailsBackButtonText = input(t(() => $localize `:@@SI_MAIN_DETAIL_CONTAINER.BACK:Back`), /* @ts-ignore */
|
|
99
|
+
...(ngDevMode ? [{ debugName: "detailsBackButtonText" }] : /* istanbul ignore next */ []));
|
|
93
100
|
/**
|
|
94
101
|
* CSS class(es) applied to the outermost container. Per default, Bootstrap classes
|
|
95
102
|
* to handle responsive paddings are applied: `px-6 pt-6 px-md-9`.
|
|
96
103
|
*
|
|
97
104
|
* @defaultValue 'px-6 pt-6 px-md-9'
|
|
98
105
|
*/
|
|
99
|
-
containerClass = input('px-6 pt-6 px-md-9',
|
|
106
|
+
containerClass = input('px-6 pt-6 px-md-9', /* @ts-ignore */
|
|
107
|
+
...(ngDevMode ? [{ debugName: "containerClass" }] : /* istanbul ignore next */ []));
|
|
100
108
|
/**
|
|
101
109
|
* CSS class(es) applied to the main container. In combination with `containerClass`,
|
|
102
110
|
* this allows for settings individual padding and margin values on the individual containers.
|
|
103
111
|
*
|
|
104
112
|
* @defaultValue 'pb-6'
|
|
105
113
|
*/
|
|
106
|
-
mainContainerClass = input('pb-6',
|
|
114
|
+
mainContainerClass = input('pb-6', /* @ts-ignore */
|
|
115
|
+
...(ngDevMode ? [{ debugName: "mainContainerClass" }] : /* istanbul ignore next */ []));
|
|
107
116
|
/**
|
|
108
117
|
* CSS class(es) applied to the detail container. In combination with `containerClass`,
|
|
109
118
|
* this allows for settings individual padding and margin values on the individual containers.
|
|
110
119
|
*
|
|
111
120
|
* @defaultValue 'pb-6'
|
|
112
121
|
*/
|
|
113
|
-
detailContainerClass = input('pb-6',
|
|
122
|
+
detailContainerClass = input('pb-6', /* @ts-ignore */
|
|
123
|
+
...(ngDevMode ? [{ debugName: "detailContainerClass" }] : /* istanbul ignore next */ []));
|
|
114
124
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
125
|
+
* Unit used for the main split part when {@link resizableParts} is enabled.
|
|
126
|
+
*
|
|
127
|
+
* @defaultValue 'px'
|
|
128
|
+
*/
|
|
129
|
+
mainContainerWidthUnit = input('px', /* @ts-ignore */
|
|
130
|
+
...(ngDevMode ? [{ debugName: "mainContainerWidthUnit" }] : /* istanbul ignore next */ []));
|
|
131
|
+
/**
|
|
132
|
+
* The size of the main container. When {@link resizableParts} is enabled,
|
|
133
|
+
* the value is interpreted using {@link mainContainerWidthUnit} and updates as the splitter is moved.
|
|
134
|
+
* With `mainContainerWidthUnit="fr"`, numeric values must be from `0` to `100` (inclusive).
|
|
135
|
+
* The main and detail fractional weights are the value and `100 - value`;
|
|
136
|
+
* out-of-range values fall back to `32` and `68`.
|
|
137
|
+
* In the static layout, numeric values represent a percentage from `0` to `100`
|
|
138
|
+
* (inclusive); out-of-range values leave both containers without max-size constraints.
|
|
139
|
+
* Pixel widths are not limited to the `0` to `100` range.
|
|
140
|
+
*
|
|
141
|
+
* With `'default'`, resizable pixel layouts use {@link minMainSize}, resizable fractional
|
|
142
|
+
* layouts use main and detail weights of `32` and `68`, and static layouts use `50%`.
|
|
117
143
|
*
|
|
118
144
|
* @defaultValue 'default'
|
|
119
145
|
*/
|
|
120
|
-
mainContainerWidth = model('default',
|
|
146
|
+
mainContainerWidth = model('default', /* @ts-ignore */
|
|
147
|
+
...(ngDevMode ? [{ debugName: "mainContainerWidth" }] : /* istanbul ignore next */ []));
|
|
121
148
|
/**
|
|
122
149
|
* Sets the minimal width of the main container in pixel.
|
|
123
150
|
*
|
|
124
151
|
* @defaultValue 300
|
|
125
152
|
*/
|
|
126
|
-
minMainSize = input(300,
|
|
153
|
+
minMainSize = input(300, /* @ts-ignore */
|
|
154
|
+
...(ngDevMode ? [{ debugName: "minMainSize" }] : /* istanbul ignore next */ []));
|
|
127
155
|
/**
|
|
128
156
|
* Sets the minimal width of the detail container in pixel.
|
|
129
157
|
*
|
|
130
158
|
* @defaultValue 300
|
|
131
159
|
*/
|
|
132
|
-
minDetailSize = input(300,
|
|
160
|
+
minDetailSize = input(300, /* @ts-ignore */
|
|
161
|
+
...(ngDevMode ? [{ debugName: "minDetailSize" }] : /* istanbul ignore next */ []));
|
|
133
162
|
/**
|
|
134
163
|
* An optional stateId to uniquely identify a component instance.
|
|
135
164
|
* Required for persistence of ui state.
|
|
136
165
|
*/
|
|
137
|
-
stateId = input(
|
|
166
|
+
stateId = input(/* @ts-ignore */
|
|
167
|
+
...(ngDevMode ? [undefined, { debugName: "stateId" }] : /* istanbul ignore next */ []));
|
|
138
168
|
/**
|
|
139
169
|
* The attribute is set to true when the detail area is not visible to ensure that the user
|
|
140
170
|
* can't tab to details area when it is hidden.
|
|
@@ -142,16 +172,16 @@ class SiMainDetailContainerComponent {
|
|
|
142
172
|
preventFocusDetails = false;
|
|
143
173
|
actualMainContainerWidth = computed(() => {
|
|
144
174
|
const mainContainerWidth = this.mainContainerWidth();
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
175
|
+
if (mainContainerWidth !== 'default') {
|
|
176
|
+
return mainContainerWidth;
|
|
177
|
+
}
|
|
178
|
+
if (!this.resizableParts()) {
|
|
179
|
+
return 50;
|
|
180
|
+
}
|
|
181
|
+
return this.mainContainerWidthUnit() === 'px' ? this.minMainSize() : 32;
|
|
182
|
+
}, /* @ts-ignore */
|
|
183
|
+
...(ngDevMode ? [{ debugName: "actualMainContainerWidth" }] : /* istanbul ignore next */ []));
|
|
184
|
+
splitSizes = this.getSplitSizes();
|
|
155
185
|
// The max size to limit the main container in the static flex layout (if less than 50%), otherwise not set.
|
|
156
186
|
maxMainSize = this.getMaxSize(0);
|
|
157
187
|
// The max size to limit the detail container in the static flex layout (if less than 50%), otherwise not set.
|
|
@@ -159,20 +189,27 @@ class SiMainDetailContainerComponent {
|
|
|
159
189
|
mainStateId = computed(() => {
|
|
160
190
|
const stateId = this.stateId();
|
|
161
191
|
return stateId ? `${stateId}-main` : undefined;
|
|
162
|
-
},
|
|
192
|
+
}, /* @ts-ignore */
|
|
193
|
+
...(ngDevMode ? [{ debugName: "mainStateId" }] : /* istanbul ignore next */ []));
|
|
163
194
|
detailStateId = computed(() => {
|
|
164
195
|
const stateId = this.stateId();
|
|
165
196
|
return stateId ? `${stateId}-detail` : undefined;
|
|
166
|
-
},
|
|
167
|
-
|
|
168
|
-
|
|
197
|
+
}, /* @ts-ignore */
|
|
198
|
+
...(ngDevMode ? [{ debugName: "detailStateId" }] : /* istanbul ignore next */ []));
|
|
199
|
+
animate = signal(false, /* @ts-ignore */
|
|
200
|
+
...(ngDevMode ? [{ debugName: "animate" }] : /* istanbul ignore next */ []));
|
|
201
|
+
opacity = signal('0', /* @ts-ignore */
|
|
202
|
+
...(ngDevMode ? [{ debugName: "opacity" }] : /* istanbul ignore next */ []));
|
|
169
203
|
ngOnChanges(changes) {
|
|
170
204
|
if (changes.detailsActive) {
|
|
171
205
|
this.updateDetailsFocusable();
|
|
172
206
|
this.doAnimation(changes.detailsActive.currentValue);
|
|
173
207
|
}
|
|
174
|
-
if (changes.mainContainerWidth ||
|
|
175
|
-
|
|
208
|
+
if (changes.mainContainerWidth ||
|
|
209
|
+
changes.resizableParts ||
|
|
210
|
+
changes.mainContainerWidthUnit ||
|
|
211
|
+
changes.minMainSize) {
|
|
212
|
+
this.splitSizes = this.getSplitSizes();
|
|
176
213
|
this.maxMainSize = this.getMaxSize(0);
|
|
177
214
|
this.maxDetailSize = this.getMaxSize(1);
|
|
178
215
|
}
|
|
@@ -184,7 +221,12 @@ class SiMainDetailContainerComponent {
|
|
|
184
221
|
.subscribe(dimensions => this.determineLayout(dimensions));
|
|
185
222
|
}
|
|
186
223
|
onSplitSizesChange(sizes) {
|
|
187
|
-
this.
|
|
224
|
+
if (this.mainContainerWidthUnit() === 'px') {
|
|
225
|
+
this.mainContainerWidth.set(this.getMainSizePx(sizes[0]));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
this.mainContainerWidth.set(sizes[0]);
|
|
229
|
+
}
|
|
188
230
|
}
|
|
189
231
|
detailsBackClicked() {
|
|
190
232
|
this.detailsActive.set(false);
|
|
@@ -194,12 +236,35 @@ class SiMainDetailContainerComponent {
|
|
|
194
236
|
* Get the max size to limit in the static flex layout (if less than 50%), otherwise not set
|
|
195
237
|
*/
|
|
196
238
|
getMaxSize(part) {
|
|
197
|
-
|
|
198
|
-
|
|
239
|
+
const mainContainerWidth = this.mainContainerWidth();
|
|
240
|
+
if (this.resizableParts() ||
|
|
241
|
+
mainContainerWidth === 'default' ||
|
|
199
242
|
!this.hasLargeSize ||
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
243
|
+
mainContainerWidth < 0 ||
|
|
244
|
+
mainContainerWidth > 100) {
|
|
245
|
+
return '';
|
|
246
|
+
}
|
|
247
|
+
const size = part === 0 ? mainContainerWidth : 100 - mainContainerWidth;
|
|
248
|
+
return size > 50 ? '' : size + '%';
|
|
249
|
+
}
|
|
250
|
+
getSplitSizes() {
|
|
251
|
+
const mainSize = this.actualMainContainerWidth();
|
|
252
|
+
if (!this.resizableParts()) {
|
|
253
|
+
return mainSize >= 0 && mainSize <= 100 ? [mainSize, 100 - mainSize] : [50, 50];
|
|
254
|
+
}
|
|
255
|
+
if (this.mainContainerWidthUnit() === 'fr') {
|
|
256
|
+
return mainSize >= 0 && mainSize <= 100 ? [mainSize, 100 - mainSize] : [32, 68];
|
|
257
|
+
}
|
|
258
|
+
// The main size is in pixels; the detail part fills the remaining space with 1fr.
|
|
259
|
+
return [mainSize, 1];
|
|
260
|
+
}
|
|
261
|
+
getMainSizePx(fallbackPercentage) {
|
|
262
|
+
const mainPartSize = this.mainSplitPart()?.expandedSize();
|
|
263
|
+
if (mainPartSize !== undefined) {
|
|
264
|
+
return Math.round(mainPartSize);
|
|
265
|
+
}
|
|
266
|
+
const splitWidth = this.splitElement()?.nativeElement.getBoundingClientRect().width;
|
|
267
|
+
return splitWidth ? Math.round((splitWidth * fallbackPercentage) / 100) : this.minMainSize();
|
|
203
268
|
}
|
|
204
269
|
determineLayout(dimensions) {
|
|
205
270
|
const newHasLargeSize = dimensions.width >= this.largeLayoutBreakpoint();
|
|
@@ -225,10 +290,10 @@ class SiMainDetailContainerComponent {
|
|
|
225
290
|
updateDetailsFocusable() {
|
|
226
291
|
this.preventFocusDetails = !this.hasLargeSize && !this.detailsActive();
|
|
227
292
|
}
|
|
228
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
229
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiMainDetailContainerComponent, isStandalone: true, selector: "si-main-detail-container", inputs: { largeLayoutBreakpoint: { classPropertyName: "largeLayoutBreakpoint", publicName: "largeLayoutBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, detailsActive: { classPropertyName: "detailsActive", publicName: "detailsActive", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, truncateHeading: { classPropertyName: "truncateHeading", publicName: "truncateHeading", isSignal: true, isRequired: false, transformFunction: null }, detailsHeading: { classPropertyName: "detailsHeading", publicName: "detailsHeading", isSignal: true, isRequired: false, transformFunction: null }, resizableParts: { classPropertyName: "resizableParts", publicName: "resizableParts", isSignal: true, isRequired: false, transformFunction: null }, hideBackButton: { classPropertyName: "hideBackButton", publicName: "hideBackButton", isSignal: true, isRequired: false, transformFunction: null }, detailsBackButtonText: { classPropertyName: "detailsBackButtonText", publicName: "detailsBackButtonText", isSignal: true, isRequired: false, transformFunction: null }, containerClass: { classPropertyName: "containerClass", publicName: "containerClass", isSignal: true, isRequired: false, transformFunction: null }, mainContainerClass: { classPropertyName: "mainContainerClass", publicName: "mainContainerClass", isSignal: true, isRequired: false, transformFunction: null }, detailContainerClass: { classPropertyName: "detailContainerClass", publicName: "detailContainerClass", isSignal: true, isRequired: false, transformFunction: null }, mainContainerWidth: { classPropertyName: "mainContainerWidth", publicName: "mainContainerWidth", isSignal: true, isRequired: false, transformFunction: null }, minMainSize: { classPropertyName: "minMainSize", publicName: "minMainSize", isSignal: true, isRequired: false, transformFunction: null }, minDetailSize: { classPropertyName: "minDetailSize", publicName: "minDetailSize", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hasLargeSizeChange: "hasLargeSizeChange", detailsActive: "detailsActiveChange", mainContainerWidth: "mainContainerWidthChange" }, host: { properties: { "class.animate": "animate()", "style.opacity": "opacity()" }, classAttribute: "si-layout-inner" }, usesOnChanges: true, ngImport: i0, template: "@if (resizableParts() && hasLargeSize) {\n <div class=\"main-detail-layout d-flex flex-column\" [class]=\"containerClass()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <si-split\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n [sizes]=\"splitSizes\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n scale=\"none\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minMainSize()\"\n [stateId]=\"mainStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"mainTemplate\" />\n </si-split-part>\n <si-split-part\n scale=\"auto\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailSize()\"\n [stateId]=\"detailStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailTemplate\" />\n </si-split-part>\n </si-split>\n </div>\n} @else {\n <div\n class=\"main-detail-layout d-flex flex-column\"\n [class]=\"containerClass()\"\n [class.large-size]=\"hasLargeSize\"\n >\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <div\n class=\"main-detail-container d-flex flex-grow-1\"\n [class.details-active]=\"detailsActive() && !hasLargeSize\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n mainTemplate;\n context: { customClass: hasLargeSize ? 'col-3 ps-0 pe-4' : 'col-6 px-0' }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n detailTemplate;\n context: { customClass: hasLargeSize ? 'col-9 ps-4 pe-0' : 'col-6 px-0' }\n \"\n />\n </div>\n </div>\n}\n\n<!-- Templates -->\n<ng-template #headingTemplate>\n @if (heading()) {\n <div class=\"si-layout-header\">\n <h2 class=\"si-layout-title si-layout-top-element\" [class.text-truncate]=\"truncateHeading()\">{{\n heading() | translate\n }}</h2>\n </div>\n }\n</ng-template>\n\n<ng-template #mainTemplate let-customClass=\"customClass\">\n <div\n class=\"main-container d-flex flex-column\"\n [class]=\"[mainContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxMainSize\"\n >\n <div class=\"main-search-actions d-flex align-items-center\">\n <ng-content select=\"[slot=mainSearch]\" />\n <ng-content select=\"[slot=mainActions]\" />\n </div>\n <div class=\"main-data-container d-flex\">\n <ng-content select=\"[slot=mainData]\" />\n </div>\n </div>\n</ng-template>\n\n<ng-template #detailTemplate let-customClass=\"customClass\">\n <div\n class=\"detail-container d-flex flex-column\"\n [class]=\"[detailContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxDetailSize\"\n [attr.inert]=\"preventFocusDetails ? '' : null\"\n >\n <div class=\"detail-heading-actions d-flex align-items-center\">\n @if (!this.hasLargeSize && !this.hideBackButton()) {\n <button type=\"button\" class=\"btn btn-circle btn-secondary\" (click)=\"detailsBackClicked()\">\n <si-icon [icon]=\"icons.elementBack\" />\n <span class=\"visually-hidden\">{{ detailsBackButtonText() | translate }}</span>\n </button>\n }\n @if (detailsHeading()) {\n <span class=\"detail-heading si-h4 me-auto ms-6 my-auto text-truncate\">{{\n detailsHeading() | translate\n }}</span>\n }\n <ng-content select=\"[slot=detailActions]\" />\n </div>\n <ng-content select=\"[slot=details]\" />\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}:host ::ng-deep [slot=mainSearch]{flex:1 1 0}:host ::ng-deep [slot=mainSearch]+[slot=mainActions]{margin-inline-start:12px}:host ::ng-deep [slot=mainActions]{margin-inline-start:auto}:host ::ng-deep [slot=mainData],:host ::ng-deep [slot=details]{flex:1 1 0;min-block-size:0}:host ::ng-deep [slot=detailActions]{margin-inline-start:auto}:host ::ng-deep .detail-heading+[slot=detailActions]{margin-inline-start:12px}:host ::ng-deep si-split{--si-split-gutter-background: transparent;min-block-size:0}:host ::ng-deep si-split si-split-part,:host ::ng-deep si-split .si-split-container,:host ::ng-deep si-split .si-split-part-content{overflow:visible}:host.animate{--si-main-detail-animation-duration: calc(.5s * var(--element-animations-enabled, 1))}.main-detail-layout{overflow-x:hidden;position:relative}.main-detail-layout.large-size{--si-main-detail-container-width: 100%;--si-main-detail-container-transition: none;--si-main-detail-container-transform: none;--si-main-detail-transition: none;--si-main-detail-opacity: 1;--si-main-detail-pointer-events: auto}.main-detail-container{--si-main-detail-transition: opacity var(--si-main-detail-animation-duration, 0) ease-in-out;--si-main-detail-detail-opacity: 0;--si-main-detail-detail-pointer-events: none;inline-size:var(--si-main-detail-container-width, 200%);transform:var(--si-main-detail-container-transform, none);transform-origin:top left;transition:var(--si-main-detail-container-transition, transform var(--si-main-detail-animation-duration, 0) ease-in-out)}.main-detail-container.details-active{--si-main-detail-container-transform: translateX(-50%);--si-main-detail-main-opacity: 0;--si-main-detail-detail-opacity: 1;--si-main-detail-main-pointer-events: none;--si-main-detail-detail-pointer-events: auto}.main-detail-layout,.main-detail-container,.main-container,.detail-container,.main-data-container{flex:1 1 0;min-block-size:0}.main-container,.detail-container{transition:var(--si-main-detail-transition, none)}.main-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-main-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-main-pointer-events, auto))}.detail-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-detail-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-detail-pointer-events, auto))}.main-search-actions:not(:empty),.detail-heading-actions:not(:empty){min-block-size:calc(1lh + 16px);margin-block-end:16px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiSplitComponent, selector: "si-split", inputs: ["gutterSize", "orientation", "sizes", "stateId"], outputs: ["sizesChange"] }, { kind: "component", type: SiSplitPartComponent, selector: "si-split-part", inputs: ["actions", "collapseDirection", "collapseIconClass", "collapseToMinSize", "headerTemplate", "heading", "minSize", "removeContentOnCollapse", "scale", "showCollapseButton", "showHeader", "collapseLabel", "stateId", "size", "collapseOthers", "expanded"], outputs: ["collapseChanged", "stateChange"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
293
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
294
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiMainDetailContainerComponent, isStandalone: true, selector: "si-main-detail-container", inputs: { largeLayoutBreakpoint: { classPropertyName: "largeLayoutBreakpoint", publicName: "largeLayoutBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, detailsActive: { classPropertyName: "detailsActive", publicName: "detailsActive", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, truncateHeading: { classPropertyName: "truncateHeading", publicName: "truncateHeading", isSignal: true, isRequired: false, transformFunction: null }, detailsHeading: { classPropertyName: "detailsHeading", publicName: "detailsHeading", isSignal: true, isRequired: false, transformFunction: null }, resizableParts: { classPropertyName: "resizableParts", publicName: "resizableParts", isSignal: true, isRequired: false, transformFunction: null }, hideBackButton: { classPropertyName: "hideBackButton", publicName: "hideBackButton", isSignal: true, isRequired: false, transformFunction: null }, detailsBackButtonText: { classPropertyName: "detailsBackButtonText", publicName: "detailsBackButtonText", isSignal: true, isRequired: false, transformFunction: null }, containerClass: { classPropertyName: "containerClass", publicName: "containerClass", isSignal: true, isRequired: false, transformFunction: null }, mainContainerClass: { classPropertyName: "mainContainerClass", publicName: "mainContainerClass", isSignal: true, isRequired: false, transformFunction: null }, detailContainerClass: { classPropertyName: "detailContainerClass", publicName: "detailContainerClass", isSignal: true, isRequired: false, transformFunction: null }, mainContainerWidthUnit: { classPropertyName: "mainContainerWidthUnit", publicName: "mainContainerWidthUnit", isSignal: true, isRequired: false, transformFunction: null }, mainContainerWidth: { classPropertyName: "mainContainerWidth", publicName: "mainContainerWidth", isSignal: true, isRequired: false, transformFunction: null }, minMainSize: { classPropertyName: "minMainSize", publicName: "minMainSize", isSignal: true, isRequired: false, transformFunction: null }, minDetailSize: { classPropertyName: "minDetailSize", publicName: "minDetailSize", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hasLargeSizeChange: "hasLargeSizeChange", detailsActive: "detailsActiveChange", mainContainerWidth: "mainContainerWidthChange" }, host: { properties: { "class.animate": "animate()", "style.opacity": "opacity()" }, classAttribute: "si-layout-inner" }, viewQueries: [{ propertyName: "splitElement", first: true, predicate: ["splitElement"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "mainSplitPart", first: true, predicate: ["mainSplitPart"], descendants: true, read: SiSplitPartComponent, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "@if (resizableParts() && hasLargeSize) {\n <div class=\"main-detail-layout d-flex flex-column\" [class]=\"containerClass()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <si-split\n #splitElement\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n #mainSplitPart\n [unit]=\"mainContainerWidthUnit()\"\n [size]=\"splitSizes[0]\"\n [showHeader]=\"false\"\n [minSize]=\"minMainSize()\"\n [stateId]=\"mainStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"mainTemplate\" />\n </si-split-part>\n <si-split-part\n unit=\"fr\"\n [size]=\"splitSizes[1]\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailSize()\"\n [stateId]=\"detailStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailTemplate\" />\n </si-split-part>\n </si-split>\n </div>\n} @else {\n <div\n class=\"main-detail-layout d-flex flex-column\"\n [class]=\"containerClass()\"\n [class.large-size]=\"hasLargeSize\"\n >\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <div\n class=\"main-detail-container d-flex flex-grow-1\"\n [class.details-active]=\"detailsActive() && !hasLargeSize\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n mainTemplate;\n context: { customClass: hasLargeSize ? 'col-3 ps-0 pe-4' : 'col-6 px-0' }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n detailTemplate;\n context: { customClass: hasLargeSize ? 'col-9 ps-4 pe-0' : 'col-6 px-0' }\n \"\n />\n </div>\n </div>\n}\n\n<!-- Templates -->\n<ng-template #headingTemplate>\n @if (heading()) {\n <div class=\"si-layout-header\">\n <h2 class=\"si-layout-title si-layout-top-element\" [class.text-truncate]=\"truncateHeading()\">{{\n heading() | translate\n }}</h2>\n </div>\n }\n</ng-template>\n\n<ng-template #mainTemplate let-customClass=\"customClass\">\n <div\n class=\"main-container d-flex flex-column\"\n [class]=\"[mainContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxMainSize\"\n >\n <div class=\"main-search-actions d-flex align-items-center\">\n <ng-content select=\"[slot=mainSearch]\" />\n <ng-content select=\"[slot=mainActions]\" />\n </div>\n <div class=\"main-data-container d-flex\">\n <ng-content select=\"[slot=mainData]\" />\n </div>\n </div>\n</ng-template>\n\n<ng-template #detailTemplate let-customClass=\"customClass\">\n <div\n class=\"detail-container d-flex flex-column\"\n [class]=\"[detailContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxDetailSize\"\n [attr.inert]=\"preventFocusDetails ? '' : null\"\n >\n <div class=\"detail-heading-actions d-flex align-items-center\">\n @if (!this.hasLargeSize && !this.hideBackButton()) {\n <button type=\"button\" class=\"btn btn-circle btn-secondary\" (click)=\"detailsBackClicked()\">\n <si-icon [icon]=\"icons.elementBack\" />\n <span class=\"visually-hidden\">{{ detailsBackButtonText() | translate }}</span>\n </button>\n }\n @if (detailsHeading()) {\n <span class=\"detail-heading si-h4 me-auto ms-6 my-auto text-truncate\">{{\n detailsHeading() | translate\n }}</span>\n }\n <ng-content select=\"[slot=detailActions]\" />\n </div>\n <ng-content select=\"[slot=details]\" />\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}:host ::ng-deep [slot=mainSearch]{flex:1 1 0}:host ::ng-deep [slot=mainSearch]+[slot=mainActions]{margin-inline-start:var(--si-sys-sizing-spacing-x-50)}:host ::ng-deep [slot=mainActions]{margin-inline-start:auto}:host ::ng-deep [slot=mainData],:host ::ng-deep [slot=details]{flex:1 1 0;min-block-size:0}:host ::ng-deep [slot=detailActions]{margin-inline-start:auto}:host ::ng-deep .detail-heading+[slot=detailActions]{margin-inline-start:var(--si-sys-sizing-spacing-x-50)}:host ::ng-deep si-split{--si-split-gutter-background: transparent;min-block-size:0}:host ::ng-deep si-split si-split-part,:host ::ng-deep si-split .si-split-container,:host ::ng-deep si-split .si-split-part-content{overflow:visible}:host.animate{--si-main-detail-animation-duration: calc(.5s * var(--element-animations-enabled, 1))}.main-detail-layout{overflow-x:hidden;position:relative}.main-detail-layout.large-size{--si-main-detail-container-width: 100%;--si-main-detail-container-transition: none;--si-main-detail-container-transform: none;--si-main-detail-transition: none;--si-main-detail-opacity: 1;--si-main-detail-pointer-events: auto}.main-detail-container{--si-main-detail-transition: opacity var(--si-main-detail-animation-duration, 0) ease-in-out;--si-main-detail-detail-opacity: 0;--si-main-detail-detail-pointer-events: none;inline-size:var(--si-main-detail-container-width, 200%);transform:var(--si-main-detail-container-transform, none);transform-origin:top left;transition:var(--si-main-detail-container-transition, transform var(--si-main-detail-animation-duration, 0) ease-in-out)}.main-detail-container.details-active{--si-main-detail-container-transform: translateX(-50%);--si-main-detail-main-opacity: 0;--si-main-detail-detail-opacity: 1;--si-main-detail-main-pointer-events: none;--si-main-detail-detail-pointer-events: auto}.main-detail-layout,.main-detail-container,.main-container,.detail-container,.main-data-container{flex:1 1 0;min-block-size:0}.main-container,.detail-container{transition:var(--si-main-detail-transition, none)}.main-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-main-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-main-pointer-events, auto))}.detail-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-detail-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-detail-pointer-events, auto))}.main-search-actions:not(:empty),.detail-heading-actions:not(:empty){min-block-size:calc(1lh + 2 * var(--si-sys-sizing-spacing-y-40));margin-block-end:var(--si-sys-sizing-spacing-y-60)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiSplitComponent, selector: "si-split", inputs: ["gutterSize", "orientation", "stateId"], outputs: ["sizesChange"] }, { kind: "component", type: SiSplitPartComponent, selector: "si-split-part", inputs: ["actions", "collapsible", "collapseIconClass", "collapseToMinSize", "headerTemplate", "heading", "minSize", "removeContentOnCollapse", "showHeader", "collapseLabel", "stateId", "size", "unit", "collapseOthers", "expanded"], outputs: ["collapseChanged", "stateChange"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
230
295
|
}
|
|
231
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
296
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerComponent, decorators: [{
|
|
232
297
|
type: Component,
|
|
233
298
|
args: [{ selector: 'si-main-detail-container', imports: [
|
|
234
299
|
NgTemplateOutlet,
|
|
@@ -236,23 +301,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
|
|
|
236
301
|
SiSplitPartComponent,
|
|
237
302
|
SiTranslatePipe,
|
|
238
303
|
SiIconComponent
|
|
239
|
-
],
|
|
304
|
+
], host: {
|
|
240
305
|
class: 'si-layout-inner',
|
|
241
306
|
'[class.animate]': 'animate()',
|
|
242
307
|
'[style.opacity]': 'opacity()'
|
|
243
|
-
}, template: "@if (resizableParts() && hasLargeSize) {\n <div class=\"main-detail-layout d-flex flex-column\" [class]=\"containerClass()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <si-split\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n
|
|
244
|
-
}], propDecorators: { largeLayoutBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "largeLayoutBreakpoint", required: false }] }], hasLargeSizeChange: [{ type: i0.Output, args: ["hasLargeSizeChange"] }], detailsActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsActive", required: false }] }, { type: i0.Output, args: ["detailsActiveChange"] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], truncateHeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateHeading", required: false }] }], detailsHeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsHeading", required: false }] }], resizableParts: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizableParts", required: false }] }], hideBackButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideBackButton", required: false }] }], detailsBackButtonText: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsBackButtonText", required: false }] }], containerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "containerClass", required: false }] }], mainContainerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerClass", required: false }] }], detailContainerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailContainerClass", required: false }] }], mainContainerWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerWidth", required: false }] }, { type: i0.Output, args: ["mainContainerWidthChange"] }], minMainSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minMainSize", required: false }] }], minDetailSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDetailSize", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }] } });
|
|
308
|
+
}, template: "@if (resizableParts() && hasLargeSize) {\n <div class=\"main-detail-layout d-flex flex-column\" [class]=\"containerClass()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <si-split\n #splitElement\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n #mainSplitPart\n [unit]=\"mainContainerWidthUnit()\"\n [size]=\"splitSizes[0]\"\n [showHeader]=\"false\"\n [minSize]=\"minMainSize()\"\n [stateId]=\"mainStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"mainTemplate\" />\n </si-split-part>\n <si-split-part\n unit=\"fr\"\n [size]=\"splitSizes[1]\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailSize()\"\n [stateId]=\"detailStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailTemplate\" />\n </si-split-part>\n </si-split>\n </div>\n} @else {\n <div\n class=\"main-detail-layout d-flex flex-column\"\n [class]=\"containerClass()\"\n [class.large-size]=\"hasLargeSize\"\n >\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <div\n class=\"main-detail-container d-flex flex-grow-1\"\n [class.details-active]=\"detailsActive() && !hasLargeSize\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n mainTemplate;\n context: { customClass: hasLargeSize ? 'col-3 ps-0 pe-4' : 'col-6 px-0' }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n detailTemplate;\n context: { customClass: hasLargeSize ? 'col-9 ps-4 pe-0' : 'col-6 px-0' }\n \"\n />\n </div>\n </div>\n}\n\n<!-- Templates -->\n<ng-template #headingTemplate>\n @if (heading()) {\n <div class=\"si-layout-header\">\n <h2 class=\"si-layout-title si-layout-top-element\" [class.text-truncate]=\"truncateHeading()\">{{\n heading() | translate\n }}</h2>\n </div>\n }\n</ng-template>\n\n<ng-template #mainTemplate let-customClass=\"customClass\">\n <div\n class=\"main-container d-flex flex-column\"\n [class]=\"[mainContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxMainSize\"\n >\n <div class=\"main-search-actions d-flex align-items-center\">\n <ng-content select=\"[slot=mainSearch]\" />\n <ng-content select=\"[slot=mainActions]\" />\n </div>\n <div class=\"main-data-container d-flex\">\n <ng-content select=\"[slot=mainData]\" />\n </div>\n </div>\n</ng-template>\n\n<ng-template #detailTemplate let-customClass=\"customClass\">\n <div\n class=\"detail-container d-flex flex-column\"\n [class]=\"[detailContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxDetailSize\"\n [attr.inert]=\"preventFocusDetails ? '' : null\"\n >\n <div class=\"detail-heading-actions d-flex align-items-center\">\n @if (!this.hasLargeSize && !this.hideBackButton()) {\n <button type=\"button\" class=\"btn btn-circle btn-secondary\" (click)=\"detailsBackClicked()\">\n <si-icon [icon]=\"icons.elementBack\" />\n <span class=\"visually-hidden\">{{ detailsBackButtonText() | translate }}</span>\n </button>\n }\n @if (detailsHeading()) {\n <span class=\"detail-heading si-h4 me-auto ms-6 my-auto text-truncate\">{{\n detailsHeading() | translate\n }}</span>\n }\n <ng-content select=\"[slot=detailActions]\" />\n </div>\n <ng-content select=\"[slot=details]\" />\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}:host ::ng-deep [slot=mainSearch]{flex:1 1 0}:host ::ng-deep [slot=mainSearch]+[slot=mainActions]{margin-inline-start:var(--si-sys-sizing-spacing-x-50)}:host ::ng-deep [slot=mainActions]{margin-inline-start:auto}:host ::ng-deep [slot=mainData],:host ::ng-deep [slot=details]{flex:1 1 0;min-block-size:0}:host ::ng-deep [slot=detailActions]{margin-inline-start:auto}:host ::ng-deep .detail-heading+[slot=detailActions]{margin-inline-start:var(--si-sys-sizing-spacing-x-50)}:host ::ng-deep si-split{--si-split-gutter-background: transparent;min-block-size:0}:host ::ng-deep si-split si-split-part,:host ::ng-deep si-split .si-split-container,:host ::ng-deep si-split .si-split-part-content{overflow:visible}:host.animate{--si-main-detail-animation-duration: calc(.5s * var(--element-animations-enabled, 1))}.main-detail-layout{overflow-x:hidden;position:relative}.main-detail-layout.large-size{--si-main-detail-container-width: 100%;--si-main-detail-container-transition: none;--si-main-detail-container-transform: none;--si-main-detail-transition: none;--si-main-detail-opacity: 1;--si-main-detail-pointer-events: auto}.main-detail-container{--si-main-detail-transition: opacity var(--si-main-detail-animation-duration, 0) ease-in-out;--si-main-detail-detail-opacity: 0;--si-main-detail-detail-pointer-events: none;inline-size:var(--si-main-detail-container-width, 200%);transform:var(--si-main-detail-container-transform, none);transform-origin:top left;transition:var(--si-main-detail-container-transition, transform var(--si-main-detail-animation-duration, 0) ease-in-out)}.main-detail-container.details-active{--si-main-detail-container-transform: translateX(-50%);--si-main-detail-main-opacity: 0;--si-main-detail-detail-opacity: 1;--si-main-detail-main-pointer-events: none;--si-main-detail-detail-pointer-events: auto}.main-detail-layout,.main-detail-container,.main-container,.detail-container,.main-data-container{flex:1 1 0;min-block-size:0}.main-container,.detail-container{transition:var(--si-main-detail-transition, none)}.main-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-main-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-main-pointer-events, auto))}.detail-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-detail-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-detail-pointer-events, auto))}.main-search-actions:not(:empty),.detail-heading-actions:not(:empty){min-block-size:calc(1lh + 2 * var(--si-sys-sizing-spacing-y-40));margin-block-end:var(--si-sys-sizing-spacing-y-60)}\n"] }]
|
|
309
|
+
}], propDecorators: { splitElement: [{ type: i0.ViewChild, args: ['splitElement', { ...{ read: ElementRef }, isSignal: true }] }], mainSplitPart: [{ type: i0.ViewChild, args: ['mainSplitPart', { ...{ read: SiSplitPartComponent }, isSignal: true }] }], largeLayoutBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "largeLayoutBreakpoint", required: false }] }], hasLargeSizeChange: [{ type: i0.Output, args: ["hasLargeSizeChange"] }], detailsActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsActive", required: false }] }, { type: i0.Output, args: ["detailsActiveChange"] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], truncateHeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateHeading", required: false }] }], detailsHeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsHeading", required: false }] }], resizableParts: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizableParts", required: false }] }], hideBackButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideBackButton", required: false }] }], detailsBackButtonText: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsBackButtonText", required: false }] }], containerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "containerClass", required: false }] }], mainContainerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerClass", required: false }] }], detailContainerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailContainerClass", required: false }] }], mainContainerWidthUnit: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerWidthUnit", required: false }] }], mainContainerWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerWidth", required: false }] }, { type: i0.Output, args: ["mainContainerWidthChange"] }], minMainSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minMainSize", required: false }] }], minDetailSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDetailSize", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }] } });
|
|
245
310
|
|
|
246
311
|
/**
|
|
247
312
|
* Copyright (c) Siemens 2016 - 2026
|
|
248
313
|
* SPDX-License-Identifier: MIT
|
|
249
314
|
*/
|
|
250
315
|
class SiMainDetailContainerModule {
|
|
251
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
252
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
253
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
316
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
317
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerModule, imports: [SiMainDetailContainerComponent], exports: [SiMainDetailContainerComponent] });
|
|
318
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerModule, imports: [SiMainDetailContainerComponent] });
|
|
254
319
|
}
|
|
255
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
320
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerModule, decorators: [{
|
|
256
321
|
type: NgModule,
|
|
257
322
|
args: [{
|
|
258
323
|
imports: [SiMainDetailContainerComponent],
|