@unipin/angular-applet 18.9.7 → 21.0.1
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 +49 -10
- package/common/assets/sprites/flagGlobal.png +0 -0
- package/common/assets/sprites/flagSprite42.webp +0 -0
- package/common/assets/styles/freakflags.scss +263 -0
- package/common/assets/styles/theme.css +69 -0
- package/fesm2022/unipin-angular-applet-accordion.mjs +242 -0
- package/fesm2022/unipin-angular-applet-accordion.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-alert-dialog.mjs +267 -0
- package/fesm2022/unipin-angular-applet-alert-dialog.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-alert.mjs +94 -0
- package/fesm2022/unipin-angular-applet-alert.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-auth.mjs +707 -0
- package/fesm2022/unipin-angular-applet-auth.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-avatar.mjs +41 -0
- package/fesm2022/unipin-angular-applet-avatar.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-badge.mjs +50 -0
- package/fesm2022/unipin-angular-applet-badge.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-buttons.mjs +263 -0
- package/fesm2022/unipin-angular-applet-buttons.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-calendar.mjs +492 -0
- package/fesm2022/unipin-angular-applet-calendar.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-collapsible.mjs +97 -0
- package/fesm2022/unipin-angular-applet-collapsible.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-common.mjs +342 -0
- package/fesm2022/unipin-angular-applet-common.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-containers.mjs +472 -0
- package/fesm2022/unipin-angular-applet-containers.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-dialog.mjs +535 -0
- package/fesm2022/unipin-angular-applet-dialog.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-forms.mjs +1699 -0
- package/fesm2022/unipin-angular-applet-forms.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-froala.mjs +298 -0
- package/fesm2022/unipin-angular-applet-froala.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-grids.mjs +105 -0
- package/fesm2022/unipin-angular-applet-grids.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-infinite-scroll.mjs +86 -0
- package/fesm2022/unipin-angular-applet-infinite-scroll.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-json-viewer.mjs +71 -0
- package/fesm2022/unipin-angular-applet-json-viewer.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-loading-dialog.mjs +252 -0
- package/fesm2022/unipin-angular-applet-loading-dialog.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-markdown.mjs +703 -0
- package/fesm2022/unipin-angular-applet-markdown.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-micro-frontend.mjs +75 -0
- package/fesm2022/unipin-angular-applet-micro-frontend.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-popover.mjs +333 -0
- package/fesm2022/unipin-angular-applet-popover.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-progress-bar.mjs +38 -0
- package/fesm2022/unipin-angular-applet-progress-bar.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-skeleton.mjs +32 -0
- package/fesm2022/unipin-angular-applet-skeleton.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-spinner.mjs +144 -0
- package/fesm2022/unipin-angular-applet-spinner.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-swipeable.mjs +270 -0
- package/fesm2022/unipin-angular-applet-swipeable.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-tabs.mjs +142 -0
- package/fesm2022/unipin-angular-applet-tabs.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet-tooltip.mjs +118 -0
- package/fesm2022/unipin-angular-applet-tooltip.mjs.map +1 -0
- package/fesm2022/unipin-angular-applet.mjs +5 -4617
- package/fesm2022/unipin-angular-applet.mjs.map +1 -1
- package/package.json +132 -29
- package/types/unipin-angular-applet-accordion.d.ts +60 -0
- package/types/unipin-angular-applet-alert-dialog.d.ts +35 -0
- package/types/unipin-angular-applet-alert.d.ts +34 -0
- package/types/unipin-angular-applet-auth.d.ts +225 -0
- package/types/unipin-angular-applet-avatar.d.ts +16 -0
- package/types/unipin-angular-applet-badge.d.ts +20 -0
- package/types/unipin-angular-applet-buttons.d.ts +37 -0
- package/types/unipin-angular-applet-calendar.d.ts +44 -0
- package/types/unipin-angular-applet-collapsible.d.ts +35 -0
- package/types/unipin-angular-applet-common.d.ts +94 -0
- package/types/unipin-angular-applet-containers.d.ts +179 -0
- package/types/unipin-angular-applet-dialog.d.ts +180 -0
- package/types/unipin-angular-applet-forms.d.ts +412 -0
- package/types/unipin-angular-applet-froala.d.ts +85 -0
- package/types/unipin-angular-applet-grids.d.ts +22 -0
- package/types/unipin-angular-applet-infinite-scroll.d.ts +51 -0
- package/types/unipin-angular-applet-json-viewer.d.ts +30 -0
- package/types/unipin-angular-applet-loading-dialog.d.ts +19 -0
- package/types/unipin-angular-applet-markdown.d.ts +119 -0
- package/types/unipin-angular-applet-micro-frontend.d.ts +11 -0
- package/types/unipin-angular-applet-popover.d.ts +58 -0
- package/types/unipin-angular-applet-progress-bar.d.ts +14 -0
- package/types/unipin-angular-applet-skeleton.d.ts +11 -0
- package/types/unipin-angular-applet-spinner.d.ts +12 -0
- package/types/unipin-angular-applet-swipeable.d.ts +66 -0
- package/types/unipin-angular-applet-tabs.d.ts +40 -0
- package/types/unipin-angular-applet-tooltip.d.ts +32 -0
- package/types/unipin-angular-applet.d.ts +3 -0
- package/esm2022/graphql/generated.mjs +0 -938
- package/esm2022/lib/components/approval/detail/approval-detail.component.mjs +0 -78
- package/esm2022/lib/components/approval/form/approval-form.component.mjs +0 -128
- package/esm2022/lib/components/approval/index.mjs +0 -5
- package/esm2022/lib/components/approval/list/approval-list.component.mjs +0 -114
- package/esm2022/lib/components/approval/list/provide-approval-entities.util.mjs +0 -9
- package/esm2022/lib/components/approval/services/approval.service.mjs +0 -46
- package/esm2022/lib/components/audit/detail/audit-detail.component.mjs +0 -123
- package/esm2022/lib/components/audit/index.mjs +0 -3
- package/esm2022/lib/components/audit/list/audit-list.component.mjs +0 -81
- package/esm2022/lib/components/audit/service/audit.service.mjs +0 -49
- package/esm2022/lib/components/audit/types/audit-detail-form.type.mjs +0 -2
- package/esm2022/lib/components/buttons/group/btn-group.component.mjs +0 -43
- package/esm2022/lib/components/buttons/group/interfaces/btn-group-config.interface.mjs +0 -2
- package/esm2022/lib/components/buttons/index.mjs +0 -3
- package/esm2022/lib/components/buttons/loading/btn-loading.component.mjs +0 -48
- package/esm2022/lib/components/containers/applet-container/applet-container.component.mjs +0 -55
- package/esm2022/lib/components/containers/applet-container/provide-applet-config.util.mjs +0 -9
- package/esm2022/lib/components/containers/colum-header-container/column-header-container.component.mjs +0 -23
- package/esm2022/lib/components/containers/column-container/column-container.component.mjs +0 -79
- package/esm2022/lib/components/containers/column-container/directives/lazy-route.directive.mjs +0 -57
- package/esm2022/lib/components/containers/index.mjs +0 -7
- package/esm2022/lib/components/containers/list-container/index.mjs +0 -3
- package/esm2022/lib/components/containers/list-container/interfaces/list-container-config.interface.mjs +0 -2
- package/esm2022/lib/components/containers/list-container/list-pagination-container/list-pagination-container.component.mjs +0 -58
- package/esm2022/lib/components/containers/list-container/list-snapshot-container/list-snapshot-container.component.mjs +0 -57
- package/esm2022/lib/components/containers/modal-container/modal-container.component.mjs +0 -40
- package/esm2022/lib/components/filter/filter.component.mjs +0 -222
- package/esm2022/lib/components/filter/index.mjs +0 -2
- package/esm2022/lib/components/filter/interfaces/filter-config.interface.mjs +0 -2
- package/esm2022/lib/components/filter/interfaces/filter-field.interface.mjs +0 -2
- package/esm2022/lib/components/filter/interfaces/filter-search-event.interface.mjs +0 -2
- package/esm2022/lib/components/forms/country-input/form-country-input.component.mjs +0 -122
- package/esm2022/lib/components/forms/currency-input/form-currency-input.component.mjs +0 -157
- package/esm2022/lib/components/forms/date/form-date.component.mjs +0 -117
- package/esm2022/lib/components/forms/image-picker/directives/drag-n-drop.directive.mjs +0 -49
- package/esm2022/lib/components/forms/image-picker/form-image-picker.component.mjs +0 -68
- package/esm2022/lib/components/forms/index.mjs +0 -12
- package/esm2022/lib/components/forms/input/form-input.component.mjs +0 -98
- package/esm2022/lib/components/forms/number/form-number.component.mjs +0 -97
- package/esm2022/lib/components/forms/number/pipes/locale-number.pipe.mjs +0 -33
- package/esm2022/lib/components/forms/password/form-password.component.mjs +0 -100
- package/esm2022/lib/components/forms/rate-group-code-input/form-rate-group-code-input.component.mjs +0 -135
- package/esm2022/lib/components/forms/searchable-select/form-searchable-select.component.mjs +0 -138
- package/esm2022/lib/components/forms/select/form-select.component.mjs +0 -119
- package/esm2022/lib/components/forms/textarea/form-textarea.component.mjs +0 -88
- package/esm2022/lib/components/grids/grid-pagination/grid-pagination.component.mjs +0 -111
- package/esm2022/lib/components/grids/grid-snapshot/grid-snapshot.component.mjs +0 -109
- package/esm2022/lib/components/grids/index.mjs +0 -4
- package/esm2022/lib/components/grids/interfaces/grid-config.interface.mjs +0 -2
- package/esm2022/lib/components/grids/services/grid.service.mjs +0 -25
- package/esm2022/lib/components/index.mjs +0 -9
- package/esm2022/lib/components/infinite-scroll/directive/infinite-scroll.directive.mjs +0 -43
- package/esm2022/lib/components/infinite-scroll/index.mjs +0 -3
- package/esm2022/lib/components/infinite-scroll/infinite-scroll.component.mjs +0 -36
- package/esm2022/lib/components/tabs/index.mjs +0 -3
- package/esm2022/lib/components/tabs/tab-content/tab-content.component.mjs +0 -37
- package/esm2022/lib/components/tabs/tab-group/tab-group.component.mjs +0 -47
- package/esm2022/lib/guards/auth/auth.guard.mjs +0 -10
- package/esm2022/lib/guards/index.mjs +0 -2
- package/esm2022/lib/interceptors/header/header.interceptor.mjs +0 -29
- package/esm2022/lib/interceptors/index.mjs +0 -3
- package/esm2022/lib/interceptors/refresh-token/refresh-token.interceptor.mjs +0 -83
- package/esm2022/lib/interfaces/index.mjs +0 -2
- package/esm2022/lib/interfaces/user/user.interface.mjs +0 -2
- package/esm2022/lib/modules/index.mjs +0 -3
- package/esm2022/lib/modules/micro-frontend/index.mjs +0 -2
- package/esm2022/lib/modules/micro-frontend/utils/mf-bootstrap.util.mjs +0 -55
- package/esm2022/lib/modules/micro-frontend/utils/mf-global-state.util.mjs +0 -14
- package/esm2022/lib/modules/permission/directive/permission.directive.mjs +0 -41
- package/esm2022/lib/modules/permission/guards/permission.guard.mjs +0 -26
- package/esm2022/lib/modules/permission/index.mjs +0 -7
- package/esm2022/lib/modules/permission/pages/401/unauthorized.page.mjs +0 -15
- package/esm2022/lib/modules/permission/pages/loading/loading.page.mjs +0 -65
- package/esm2022/lib/modules/permission/pages/loading/provide-loading-config.util.mjs +0 -9
- package/esm2022/lib/modules/permission/services/permission.service.mjs +0 -50
- package/esm2022/lib/resolvers/auth/auth.resolver.mjs +0 -87
- package/esm2022/lib/resolvers/index.mjs +0 -2
- package/esm2022/lib/services/auth/auth.service.mjs +0 -171
- package/esm2022/lib/services/country/country.service.mjs +0 -43
- package/esm2022/lib/services/currency/currency.service.mjs +0 -40
- package/esm2022/lib/services/index.mjs +0 -6
- package/esm2022/lib/services/profile/profile.service.mjs +0 -82
- package/esm2022/lib/services/rate-group-code/rate-group-code.service.mjs +0 -31
- package/esm2022/lib/utils/contrast-color-generator/contrast-color-generator.util.mjs +0 -16
- package/esm2022/lib/utils/form-error-message/form-error-message.util.mjs +0 -21
- package/esm2022/lib/utils/format-capitalize/format-capitalize.util.mjs +0 -18
- package/esm2022/lib/utils/index.mjs +0 -5
- package/esm2022/lib/utils/redirect-to-first-menu/redirect-to-first-menu.util.mjs +0 -9
- package/esm2022/public-api.mjs +0 -10
- package/esm2022/unipin-angular-applet.mjs +0 -2
- package/graphql/generated.d.ts +0 -16225
- package/index.d.ts +0 -2
- package/lib/components/approval/detail/approval-detail.component.d.ts +0 -26
- package/lib/components/approval/form/approval-form.component.d.ts +0 -33
- package/lib/components/approval/index.d.ts +0 -4
- package/lib/components/approval/list/approval-list.component.d.ts +0 -33
- package/lib/components/approval/list/provide-approval-entities.util.d.ts +0 -3
- package/lib/components/approval/services/approval.service.d.ts +0 -18
- package/lib/components/audit/detail/audit-detail.component.d.ts +0 -33
- package/lib/components/audit/index.d.ts +0 -2
- package/lib/components/audit/list/audit-list.component.d.ts +0 -31
- package/lib/components/audit/service/audit.service.d.ts +0 -15
- package/lib/components/audit/types/audit-detail-form.type.d.ts +0 -12
- package/lib/components/buttons/group/btn-group.component.d.ts +0 -18
- package/lib/components/buttons/group/interfaces/btn-group-config.interface.d.ts +0 -11
- package/lib/components/buttons/index.d.ts +0 -3
- package/lib/components/buttons/loading/btn-loading.component.d.ts +0 -19
- package/lib/components/containers/applet-container/applet-container.component.d.ts +0 -22
- package/lib/components/containers/applet-container/provide-applet-config.util.d.ts +0 -15
- package/lib/components/containers/colum-header-container/column-header-container.component.d.ts +0 -7
- package/lib/components/containers/column-container/column-container.component.d.ts +0 -26
- package/lib/components/containers/column-container/directives/lazy-route.directive.d.ts +0 -17
- package/lib/components/containers/index.d.ts +0 -6
- package/lib/components/containers/list-container/index.d.ts +0 -3
- package/lib/components/containers/list-container/interfaces/list-container-config.interface.d.ts +0 -9
- package/lib/components/containers/list-container/list-pagination-container/list-pagination-container.component.d.ts +0 -23
- package/lib/components/containers/list-container/list-snapshot-container/list-snapshot-container.component.d.ts +0 -23
- package/lib/components/containers/modal-container/modal-container.component.d.ts +0 -16
- package/lib/components/filter/filter.component.d.ts +0 -44
- package/lib/components/filter/index.d.ts +0 -4
- package/lib/components/filter/interfaces/filter-config.interface.d.ts +0 -5
- package/lib/components/filter/interfaces/filter-field.interface.d.ts +0 -24
- package/lib/components/filter/interfaces/filter-search-event.interface.d.ts +0 -4
- package/lib/components/forms/country-input/form-country-input.component.d.ts +0 -41
- package/lib/components/forms/currency-input/form-currency-input.component.d.ts +0 -52
- package/lib/components/forms/date/form-date.component.d.ts +0 -33
- package/lib/components/forms/image-picker/directives/drag-n-drop.directive.d.ts +0 -10
- package/lib/components/forms/image-picker/form-image-picker.component.d.ts +0 -21
- package/lib/components/forms/index.d.ts +0 -11
- package/lib/components/forms/input/form-input.component.d.ts +0 -31
- package/lib/components/forms/number/form-number.component.d.ts +0 -27
- package/lib/components/forms/number/pipes/locale-number.pipe.d.ts +0 -8
- package/lib/components/forms/password/form-password.component.d.ts +0 -27
- package/lib/components/forms/rate-group-code-input/form-rate-group-code-input.component.d.ts +0 -41
- package/lib/components/forms/searchable-select/form-searchable-select.component.d.ts +0 -42
- package/lib/components/forms/select/form-select.component.d.ts +0 -34
- package/lib/components/forms/textarea/form-textarea.component.d.ts +0 -26
- package/lib/components/grids/grid-pagination/grid-pagination.component.d.ts +0 -33
- package/lib/components/grids/grid-snapshot/grid-snapshot.component.d.ts +0 -36
- package/lib/components/grids/index.d.ts +0 -4
- package/lib/components/grids/interfaces/grid-config.interface.d.ts +0 -16
- package/lib/components/grids/services/grid.service.d.ts +0 -12
- package/lib/components/index.d.ts +0 -8
- package/lib/components/infinite-scroll/directive/infinite-scroll.directive.d.ts +0 -15
- package/lib/components/infinite-scroll/index.d.ts +0 -2
- package/lib/components/infinite-scroll/infinite-scroll.component.d.ts +0 -12
- package/lib/components/tabs/index.d.ts +0 -6
- package/lib/components/tabs/tab-content/tab-content.component.d.ts +0 -14
- package/lib/components/tabs/tab-group/tab-group.component.d.ts +0 -18
- package/lib/guards/auth/auth.guard.d.ts +0 -1
- package/lib/guards/index.d.ts +0 -1
- package/lib/interceptors/header/header.interceptor.d.ts +0 -9
- package/lib/interceptors/index.d.ts +0 -2
- package/lib/interceptors/refresh-token/refresh-token.interceptor.d.ts +0 -14
- package/lib/interfaces/index.d.ts +0 -1
- package/lib/interfaces/user/user.interface.d.ts +0 -27
- package/lib/modules/index.d.ts +0 -2
- package/lib/modules/micro-frontend/index.d.ts +0 -1
- package/lib/modules/micro-frontend/utils/mf-bootstrap.util.d.ts +0 -9
- package/lib/modules/micro-frontend/utils/mf-global-state.util.d.ts +0 -4
- package/lib/modules/permission/directive/permission.directive.d.ts +0 -16
- package/lib/modules/permission/guards/permission.guard.d.ts +0 -2
- package/lib/modules/permission/index.d.ts +0 -6
- package/lib/modules/permission/pages/401/unauthorized.page.d.ts +0 -5
- package/lib/modules/permission/pages/loading/loading.page.d.ts +0 -18
- package/lib/modules/permission/pages/loading/provide-loading-config.util.d.ts +0 -10
- package/lib/modules/permission/services/permission.service.d.ts +0 -21
- package/lib/resolvers/auth/auth.resolver.d.ts +0 -14
- package/lib/resolvers/index.d.ts +0 -1
- package/lib/services/auth/auth.service.d.ts +0 -39
- package/lib/services/country/country.service.d.ts +0 -16
- package/lib/services/currency/currency.service.d.ts +0 -16
- package/lib/services/index.d.ts +0 -5
- package/lib/services/profile/profile.service.d.ts +0 -12
- package/lib/services/rate-group-code/rate-group-code.service.d.ts +0 -14
- package/lib/utils/contrast-color-generator/contrast-color-generator.util.d.ts +0 -4
- package/lib/utils/form-error-message/form-error-message.util.d.ts +0 -2
- package/lib/utils/format-capitalize/format-capitalize.util.d.ts +0 -1
- package/lib/utils/index.d.ts +0 -4
- package/lib/utils/redirect-to-first-menu/redirect-to-first-menu.util.d.ts +0 -2
- package/public-api.d.ts +0 -11
- package/src/assets/scss/forms.scss +0 -65
- package/src/assets/scss/grid.scss +0 -7505
- package/src/assets/scss/select.scss +0 -328
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ViewContainerRef, DestroyRef, input, reflectComponentType, Directive, InjectionToken, forwardRef, signal, ChangeDetectionStrategy, Component, HostListener, booleanAttribute, output, computed } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import * as i1$1 from '@angular/router';
|
|
5
|
+
import { Router, ActivatedRoute, NavigationEnd, RouterLink, RouterLinkActive } from '@angular/router';
|
|
6
|
+
import { isObservable, firstValueFrom, filter, distinctUntilChanged } from 'rxjs';
|
|
7
|
+
import * as i1 from '@unipin/angular-applet/auth';
|
|
8
|
+
import { PermissionService } from '@unipin/angular-applet/auth';
|
|
9
|
+
import { NgIcon, provideIcons } from '@ng-icons/core';
|
|
10
|
+
import { matSettingsRound, matChevronRightRound, matCloseRound } from '@ng-icons/material-icons/round';
|
|
11
|
+
import { UpButtonDirective } from '@unipin/angular-applet/buttons';
|
|
12
|
+
import * as i2 from 'angular-split';
|
|
13
|
+
import { AngularSplitModule } from 'angular-split';
|
|
14
|
+
import { up } from '@unipin/angular-applet/common';
|
|
15
|
+
|
|
16
|
+
class UpLazyRouteDirective {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.router = inject(Router);
|
|
19
|
+
this.vcr = inject(ViewContainerRef);
|
|
20
|
+
this.route = inject(ActivatedRoute);
|
|
21
|
+
this.destroyRef = inject(DestroyRef);
|
|
22
|
+
/**
|
|
23
|
+
* Accepts a route config object containing `loadComponent`.
|
|
24
|
+
*/
|
|
25
|
+
this.loadRoute = input.required(...(ngDevMode ? [{ debugName: "loadRoute" }] : []));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Lifecycle hook that is called after the directive's data-bound properties have been initialized.
|
|
29
|
+
* Dynamically loads the component using the `loadComponent` method and creates it within the directive's view container.
|
|
30
|
+
*/
|
|
31
|
+
ngOnInit() {
|
|
32
|
+
if (!this.loadRoute().loadComponent)
|
|
33
|
+
return;
|
|
34
|
+
const result = this.loadRoute().loadComponent();
|
|
35
|
+
const load = isObservable(result) ? firstValueFrom(result) : Promise.resolve(result);
|
|
36
|
+
load.then((m) => {
|
|
37
|
+
const cmp = m.default ?? m;
|
|
38
|
+
const cr = this.vcr.createComponent(cmp);
|
|
39
|
+
const mirror = reflectComponentType(cmp);
|
|
40
|
+
this.setInput(cr, mirror);
|
|
41
|
+
this.router.events.pipe(filter((e) => e instanceof NavigationEnd), distinctUntilChanged((prev, curr) => {
|
|
42
|
+
return prev.urlAfterRedirects.split('#')[0] === curr.urlAfterRedirects.split('#')[0];
|
|
43
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
44
|
+
.subscribe({
|
|
45
|
+
next: () => this.setInput(cr, mirror)
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Method to manually set Input to the child component, because component created by ViewContainerRef won't accept the input from route param directly.
|
|
51
|
+
* @param { ComponentRef<any> } cr
|
|
52
|
+
*/
|
|
53
|
+
setInput(cr, mirror) {
|
|
54
|
+
const params = this.route.firstChild?.snapshot.params ?? {};
|
|
55
|
+
if (Object.keys(params).length === 0) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
for (const key of Object.keys(params)) {
|
|
59
|
+
if (key in cr.instance) {
|
|
60
|
+
cr.setInput(key, params[key]);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (mirror) {
|
|
64
|
+
const match = mirror.inputs.find((i) => i.templateName === key);
|
|
65
|
+
if (match) {
|
|
66
|
+
cr.setInput(match.templateName, params[key]);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UpLazyRouteDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
72
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.0", type: UpLazyRouteDirective, isStandalone: true, selector: "[upLoadRoute]", inputs: { loadRoute: { classPropertyName: "loadRoute", publicName: "loadRoute", isSignal: true, isRequired: true, transformFunction: null } }, exportAs: ["upLoadRoute"], ngImport: i0 }); }
|
|
73
|
+
}
|
|
74
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UpLazyRouteDirective, decorators: [{
|
|
75
|
+
type: Directive,
|
|
76
|
+
args: [{
|
|
77
|
+
standalone: true,
|
|
78
|
+
exportAs: 'upLoadRoute',
|
|
79
|
+
selector: '[upLoadRoute]'
|
|
80
|
+
}]
|
|
81
|
+
}], propDecorators: { loadRoute: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadRoute", required: true }] }] } });
|
|
82
|
+
|
|
83
|
+
const APPLET_CONFIG = new InjectionToken('APPLET_CONFIG');
|
|
84
|
+
function provideAppletConfig(config) {
|
|
85
|
+
return {
|
|
86
|
+
provide: APPLET_CONFIG,
|
|
87
|
+
useValue: config
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Redirects the user to their first accessible menu route based on permissions.
|
|
93
|
+
* @returns {RedirectFunction} The first allowed route
|
|
94
|
+
*/
|
|
95
|
+
function redirectToFirstMenu() {
|
|
96
|
+
const { has } = inject(PermissionService);
|
|
97
|
+
const { containers } = inject(() => forwardRef(() => APPLET_CONFIG));
|
|
98
|
+
const firstMenu = containers.find(({ permissions }) => {
|
|
99
|
+
if (!permissions)
|
|
100
|
+
return true;
|
|
101
|
+
const { codes, aggregator } = permissions;
|
|
102
|
+
return codes[aggregator === 'AND' ? 'every' : 'some']((code) => has(code));
|
|
103
|
+
});
|
|
104
|
+
return firstMenu?.path ?? containers[0].path;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
class AppletContainerComponent {
|
|
108
|
+
constructor(permissionService) {
|
|
109
|
+
this.permissionService = permissionService;
|
|
110
|
+
this.config = inject(APPLET_CONFIG);
|
|
111
|
+
/**
|
|
112
|
+
* A flag variable that used to control sidebar. When set the the value to true, the component will open the sidebar.
|
|
113
|
+
* when set the value to false, the component will close the sidebar.
|
|
114
|
+
* @type {boolean}
|
|
115
|
+
*/
|
|
116
|
+
this.isExpanded = signal(false, ...(ngDevMode ? [{ debugName: "isExpanded" }] : []));
|
|
117
|
+
/**
|
|
118
|
+
* A flag variable for indicates whether the sidebar menu is active or not in mobile view.
|
|
119
|
+
* When set false the sidebar menu will be hidden
|
|
120
|
+
* @type {boolean[]}
|
|
121
|
+
*/
|
|
122
|
+
this.isMenuActive = signal(false, ...(ngDevMode ? [{ debugName: "isMenuActive" }] : []));
|
|
123
|
+
/**
|
|
124
|
+
* A flag variable that used to control sidebar menu. When set value to true, the component will hide the sidebar menu.
|
|
125
|
+
* When set false, the component will show the sidebar menu.
|
|
126
|
+
* @type {boolean[]}
|
|
127
|
+
*/
|
|
128
|
+
this.isHidden = signal(Array(this.config.containers.length).fill(true), ...(ngDevMode ? [{ debugName: "isHidden" }] : []));
|
|
129
|
+
this.isHidden.set(this.config.containers.map(({ permissions }) => {
|
|
130
|
+
if (!permissions)
|
|
131
|
+
return false;
|
|
132
|
+
if (permissions.aggregator === 'AND') {
|
|
133
|
+
return !permissions.codes.every((code) => this.permissionService.has(code));
|
|
134
|
+
}
|
|
135
|
+
return !permissions.codes.some((code) => this.permissionService.has(code));
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* When the method is called, it will change the value of isExpanded to its opposite value.
|
|
140
|
+
* If isExpanded is currently true, it will be set to false, and if it is currently false, it will be set to true.
|
|
141
|
+
* This method is typically used to toggle the visibility of a side navigation menu.
|
|
142
|
+
*/
|
|
143
|
+
toggleSidenav() {
|
|
144
|
+
this.isExpanded.update((v) => !v);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Handles menu selection by dispatching a custom event.
|
|
148
|
+
* This method is called when a sidebar menu item is selected.
|
|
149
|
+
* It dispatches a custom 'menuEvent' with detail indicating the menu is inactive.
|
|
150
|
+
* This event is typically used to close the sidebar menu.
|
|
151
|
+
*/
|
|
152
|
+
selectMenu() {
|
|
153
|
+
dispatchEvent(new CustomEvent('menuEvent', {
|
|
154
|
+
detail: {
|
|
155
|
+
isActive: false
|
|
156
|
+
}
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AppletContainerComponent, deps: [{ token: i1.PermissionService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
160
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: AppletContainerComponent, isStandalone: true, selector: "up-applet-container", host: { classAttribute: "flex size-full" }, providers: [
|
|
161
|
+
provideIcons({
|
|
162
|
+
matChevronRightRound,
|
|
163
|
+
matSettingsRound
|
|
164
|
+
})
|
|
165
|
+
], ngImport: i0, template: "<nav \n class=\"shrink-0 h-full group flex flex-col transition-all ease-in-out border-r border-border max-md:w-0 max-md:z-10 max-md:absolute [&.expanded]:w-60\"\n [class.show]=\"isMenuActive()\"\n [class.expanded]=\"isExpanded()\"\n>\n <div class=\"shrink-0 p-2 border-b border-border flex items-center gap-2 relative\">\n <img \n class=\"rounded size-9 shrink-0\" \n [alt]=\"config.name\"\n [src]=\"config.icon\" \n />\n\n <div class=\"hidden group-[.expanded]:flex grow flex-col gap-0.5 select-none\">\n <div class=\"font-medium line-clamp-1 text-sm\">{{ config.name }}</div>\n \n <div class=\"text-muted-foreground font-medium text-xs\">\n v{{ config.version }}\n </div>\n </div>\n\n <button \n upButton\n size=\"icon\"\n variant=\"outline\"\n class=\"rounded-full absolute -right-5\"\n (click)=\"toggleSidenav()\"\n >\n <ng-icon \n size=\"18\" \n name=\"matChevronRightRound\" \n class=\"group-[.expanded]:rotate-180 transition-all ease-in-out\"\n />\n </button>\n </div>\n\n <div class=\"grow overflow-y-auto p-2 flex flex-col gap-1\">\n @for (c of config.containers; track $index) {\n <a \n upButton\n variant=\"ghost\"\n routerLinkActive=\"font-medium\"\n class=\"group-[.expanded]:w-full group-[.expanded]:justify-start\"\n [routerLink]=\"c.path\"\n [size]=\"!isExpanded()? 'icon' : 'default'\"\n (click)=\"selectMenu()\"\n >\n <ng-icon \n size=\"18\" \n [name]=\"c.icon\" \n />\n \n <span class=\"line-clamp-1 hidden group-[.expanded]:block\">\n {{ c.label }}\n </span>\n </a>\n }\n </div>\n\n @if (config.enabledSetting) {\n <div class=\"shrink-0 p-2 border-t border-border\">\n <a \n upButton\n variant=\"ghost\"\n routerLink=\"setting\" \n routerLinkActive=\"font-medium\"\n class=\"group-[.expanded]:w-full group-[.expanded]:justify-start\"\n [size]=\"!isExpanded()? 'icon' : 'default'\"\n (click)=\"selectMenu()\"\n >\n <ng-icon size=\"18\" name=\"matSettingsRound\" />\n <span class=\"line-clamp-1 hidden group-[.expanded]:block\">Setting</span>\n </a>\n </div>\n }\n</nav>\n\n<div class=\"grow overflow-y-auto overflow-x-hidden\">\n <ng-content />\n</div>\n", dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: UpButtonDirective, selector: "[upButton]", inputs: ["size", "variant", "class"], exportAs: ["upButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
166
|
+
}
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: AppletContainerComponent, decorators: [{
|
|
168
|
+
type: Component,
|
|
169
|
+
args: [{ standalone: true, selector: 'up-applet-container', changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
170
|
+
class: 'flex size-full'
|
|
171
|
+
}, imports: [
|
|
172
|
+
NgIcon,
|
|
173
|
+
RouterLink,
|
|
174
|
+
RouterLinkActive,
|
|
175
|
+
UpButtonDirective,
|
|
176
|
+
], providers: [
|
|
177
|
+
provideIcons({
|
|
178
|
+
matChevronRightRound,
|
|
179
|
+
matSettingsRound
|
|
180
|
+
})
|
|
181
|
+
], template: "<nav \n class=\"shrink-0 h-full group flex flex-col transition-all ease-in-out border-r border-border max-md:w-0 max-md:z-10 max-md:absolute [&.expanded]:w-60\"\n [class.show]=\"isMenuActive()\"\n [class.expanded]=\"isExpanded()\"\n>\n <div class=\"shrink-0 p-2 border-b border-border flex items-center gap-2 relative\">\n <img \n class=\"rounded size-9 shrink-0\" \n [alt]=\"config.name\"\n [src]=\"config.icon\" \n />\n\n <div class=\"hidden group-[.expanded]:flex grow flex-col gap-0.5 select-none\">\n <div class=\"font-medium line-clamp-1 text-sm\">{{ config.name }}</div>\n \n <div class=\"text-muted-foreground font-medium text-xs\">\n v{{ config.version }}\n </div>\n </div>\n\n <button \n upButton\n size=\"icon\"\n variant=\"outline\"\n class=\"rounded-full absolute -right-5\"\n (click)=\"toggleSidenav()\"\n >\n <ng-icon \n size=\"18\" \n name=\"matChevronRightRound\" \n class=\"group-[.expanded]:rotate-180 transition-all ease-in-out\"\n />\n </button>\n </div>\n\n <div class=\"grow overflow-y-auto p-2 flex flex-col gap-1\">\n @for (c of config.containers; track $index) {\n <a \n upButton\n variant=\"ghost\"\n routerLinkActive=\"font-medium\"\n class=\"group-[.expanded]:w-full group-[.expanded]:justify-start\"\n [routerLink]=\"c.path\"\n [size]=\"!isExpanded()? 'icon' : 'default'\"\n (click)=\"selectMenu()\"\n >\n <ng-icon \n size=\"18\" \n [name]=\"c.icon\" \n />\n \n <span class=\"line-clamp-1 hidden group-[.expanded]:block\">\n {{ c.label }}\n </span>\n </a>\n }\n </div>\n\n @if (config.enabledSetting) {\n <div class=\"shrink-0 p-2 border-t border-border\">\n <a \n upButton\n variant=\"ghost\"\n routerLink=\"setting\" \n routerLinkActive=\"font-medium\"\n class=\"group-[.expanded]:w-full group-[.expanded]:justify-start\"\n [size]=\"!isExpanded()? 'icon' : 'default'\"\n (click)=\"selectMenu()\"\n >\n <ng-icon size=\"18\" name=\"matSettingsRound\" />\n <span class=\"line-clamp-1 hidden group-[.expanded]:block\">Setting</span>\n </a>\n </div>\n }\n</nav>\n\n<div class=\"grow overflow-y-auto overflow-x-hidden\">\n <ng-content />\n</div>\n" }]
|
|
182
|
+
}], ctorParameters: () => [{ type: i1.PermissionService }] });
|
|
183
|
+
|
|
184
|
+
class UpColumnContainerComponent {
|
|
185
|
+
constructor(router, destroyRef, activeRoute) {
|
|
186
|
+
this.router = router;
|
|
187
|
+
this.destroyRef = destroyRef;
|
|
188
|
+
this.activeRoute = activeRoute;
|
|
189
|
+
/**
|
|
190
|
+
* An array of objects representing the columns, each containing a visibility flag and the associated route.
|
|
191
|
+
* @type {{ visible: boolean, route: Route }[]}
|
|
192
|
+
* @default {[]}
|
|
193
|
+
*/
|
|
194
|
+
this.areas = signal([], ...(ngDevMode ? [{ debugName: "areas" }] : []));
|
|
195
|
+
/**
|
|
196
|
+
* The default size for the split area: 100 means it will be full width, and 50 means it will be divided in half.
|
|
197
|
+
* This can be resizable with minimum width 20%
|
|
198
|
+
*/
|
|
199
|
+
this.colSize = signal(window.innerWidth <= 768 ? 100 : 50, ...(ngDevMode ? [{ debugName: "colSize" }] : []));
|
|
200
|
+
/**
|
|
201
|
+
* An object to keep track of the position of opened areas based on their route paths.
|
|
202
|
+
* @type {{ [key: string]: number }}
|
|
203
|
+
* @default {{}}
|
|
204
|
+
*/
|
|
205
|
+
this.openedArea = {};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Lifecycle hook called after the component has been initialized.
|
|
209
|
+
* Subscribes to router events, initializes columns based on the initial route, and sets up the first visible column.
|
|
210
|
+
*/
|
|
211
|
+
ngOnInit() {
|
|
212
|
+
this.checkScreen();
|
|
213
|
+
this.router.events.pipe(filter((e) => e instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef)).subscribe({
|
|
214
|
+
next: () => this.navigate()
|
|
215
|
+
});
|
|
216
|
+
const url = this.activeRoute.firstChild?.routeConfig?.path;
|
|
217
|
+
const routeList = this.activeRoute.snapshot.routeConfig._loadedRoutes;
|
|
218
|
+
if (routeList?.length) {
|
|
219
|
+
this.next(routeList[0]);
|
|
220
|
+
for (let i = 1; i < routeList.length; i++) {
|
|
221
|
+
if (url?.startsWith(routeList[i].path)) {
|
|
222
|
+
this.next(routeList[i]);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Event listener for the window resize event. Adjusts the default size of the split area based on the screen width.
|
|
229
|
+
*/
|
|
230
|
+
checkScreen() {
|
|
231
|
+
this.colSize.set(window.innerWidth <= 768 ? 100 : 50);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Handles router navigation events and adjusts the display of columns accordingly.
|
|
235
|
+
*/
|
|
236
|
+
navigate() {
|
|
237
|
+
const route = this.activeRoute.firstChild.routeConfig;
|
|
238
|
+
const pos = this.openedArea[`r-${route.path}`];
|
|
239
|
+
if (pos <= this.areas().length) {
|
|
240
|
+
this.previous(pos);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
this.next(route);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Adds a new column to the container and updates visibility based on the route navigation.
|
|
247
|
+
* @param {Route} route - Contain next route.
|
|
248
|
+
*/
|
|
249
|
+
next(route) {
|
|
250
|
+
this.areas.update((areas) => {
|
|
251
|
+
if (this.colSize() === 100 &&
|
|
252
|
+
areas.length >= 1) {
|
|
253
|
+
areas[areas.length - 1].visible = false;
|
|
254
|
+
}
|
|
255
|
+
else if (areas.length >= 2) {
|
|
256
|
+
areas[areas.length - 2].visible = false;
|
|
257
|
+
}
|
|
258
|
+
const newAreas = [
|
|
259
|
+
...areas,
|
|
260
|
+
{ visible: true, route }
|
|
261
|
+
];
|
|
262
|
+
this.openedArea[`r-${route.path}`] = newAreas.length;
|
|
263
|
+
return newAreas;
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Removes columns from the container based on the route navigation.
|
|
268
|
+
* @param {number} pos - Contain position of the last active area index.
|
|
269
|
+
*/
|
|
270
|
+
previous(pos) {
|
|
271
|
+
this.areas.update((areas) => {
|
|
272
|
+
const newAreas = areas.slice(0, pos);
|
|
273
|
+
if (this.colSize() === 100 && newAreas.length) {
|
|
274
|
+
newAreas[newAreas.length - 1].visible = true;
|
|
275
|
+
return newAreas;
|
|
276
|
+
}
|
|
277
|
+
if (newAreas.length === 1)
|
|
278
|
+
newAreas[0].visible = true;
|
|
279
|
+
else if (newAreas.length >= 2) {
|
|
280
|
+
newAreas[pos - 1].visible = true;
|
|
281
|
+
newAreas[pos - 2].visible = true;
|
|
282
|
+
}
|
|
283
|
+
return newAreas;
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UpColumnContainerComponent, deps: [{ token: i1$1.Router }, { token: i0.DestroyRef }, { token: i1$1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
287
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UpColumnContainerComponent, isStandalone: true, selector: "up-column-container", host: { listeners: { "window:resize": "checkScreen()" }, classAttribute: "block size-full" }, ngImport: i0, template: `
|
|
288
|
+
<as-split
|
|
289
|
+
unit="percent"
|
|
290
|
+
[gutterSize]="5"
|
|
291
|
+
[useTransition]="true"
|
|
292
|
+
>
|
|
293
|
+
@for (a of areas(); track $index) {
|
|
294
|
+
<as-split-area
|
|
295
|
+
class="border-start"
|
|
296
|
+
[minSize]="20"
|
|
297
|
+
[size]="colSize()"
|
|
298
|
+
[visible]="a.visible"
|
|
299
|
+
[maxSize]="$index === areas().length - 1? 80 : null"
|
|
300
|
+
>
|
|
301
|
+
<ng-container
|
|
302
|
+
upLoadRoute
|
|
303
|
+
[loadRoute]="a.route"
|
|
304
|
+
/>
|
|
305
|
+
</as-split-area>
|
|
306
|
+
}
|
|
307
|
+
</as-split>
|
|
308
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularSplitModule }, { kind: "component", type: i2.SplitComponent, selector: "as-split", inputs: ["gutterSize", "gutterStep", "disabled", "gutterClickDeltaPx", "direction", "dir", "unit", "gutterAriaLabel", "restrictMove", "useTransition", "gutterDblClickDuration"], outputs: ["gutterClick", "gutterDblClick", "dragStart", "dragEnd", "transitionEnd"], exportAs: ["asSplit"] }, { kind: "component", type: i2.SplitAreaComponent, selector: "as-split-area", inputs: ["size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "directive", type: UpLazyRouteDirective, selector: "[upLoadRoute]", inputs: ["loadRoute"], exportAs: ["upLoadRoute"] }] }); }
|
|
309
|
+
}
|
|
310
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UpColumnContainerComponent, decorators: [{
|
|
311
|
+
type: Component,
|
|
312
|
+
args: [{
|
|
313
|
+
standalone: true,
|
|
314
|
+
selector: 'up-column-container',
|
|
315
|
+
host: {
|
|
316
|
+
class: 'block size-full',
|
|
317
|
+
},
|
|
318
|
+
imports: [
|
|
319
|
+
AngularSplitModule,
|
|
320
|
+
UpLazyRouteDirective
|
|
321
|
+
],
|
|
322
|
+
template: `
|
|
323
|
+
<as-split
|
|
324
|
+
unit="percent"
|
|
325
|
+
[gutterSize]="5"
|
|
326
|
+
[useTransition]="true"
|
|
327
|
+
>
|
|
328
|
+
@for (a of areas(); track $index) {
|
|
329
|
+
<as-split-area
|
|
330
|
+
class="border-start"
|
|
331
|
+
[minSize]="20"
|
|
332
|
+
[size]="colSize()"
|
|
333
|
+
[visible]="a.visible"
|
|
334
|
+
[maxSize]="$index === areas().length - 1? 80 : null"
|
|
335
|
+
>
|
|
336
|
+
<ng-container
|
|
337
|
+
upLoadRoute
|
|
338
|
+
[loadRoute]="a.route"
|
|
339
|
+
/>
|
|
340
|
+
</as-split-area>
|
|
341
|
+
}
|
|
342
|
+
</as-split>
|
|
343
|
+
`,
|
|
344
|
+
}]
|
|
345
|
+
}], ctorParameters: () => [{ type: i1$1.Router }, { type: i0.DestroyRef }, { type: i1$1.ActivatedRoute }], propDecorators: { checkScreen: [{
|
|
346
|
+
type: HostListener,
|
|
347
|
+
args: ['window:resize']
|
|
348
|
+
}] } });
|
|
349
|
+
|
|
350
|
+
class UpContentContainerComponent {
|
|
351
|
+
constructor() {
|
|
352
|
+
/**
|
|
353
|
+
* The title text displayed in the header.
|
|
354
|
+
* If the text is too long, it will be truncated with an ellipsis.
|
|
355
|
+
* @type {Signal<string>}
|
|
356
|
+
* @default ''
|
|
357
|
+
*/
|
|
358
|
+
this.header = input('', ...(ngDevMode ? [{ debugName: "header" }] : []));
|
|
359
|
+
/**
|
|
360
|
+
* Disables the close/back button when set to true.
|
|
361
|
+
* When disabled, the close button will not be shown in the header.
|
|
362
|
+
* @type {Signal<boolean>}
|
|
363
|
+
* @default false
|
|
364
|
+
*/
|
|
365
|
+
this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
366
|
+
/**
|
|
367
|
+
* Hides the close/back button when set to true.
|
|
368
|
+
* When hidden, the close button will not be shown in the header.
|
|
369
|
+
* @type {Signal<boolean>}
|
|
370
|
+
* @default false
|
|
371
|
+
*/
|
|
372
|
+
this.hideCloseButton = input(false, ...(ngDevMode ? [{ debugName: "hideCloseButton", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
373
|
+
/**
|
|
374
|
+
* Event emitted when the user clicks the close button.
|
|
375
|
+
* Typically used to handle closing a modal or navigating back.
|
|
376
|
+
* @type {OutputEmitterRef<void>}
|
|
377
|
+
*/
|
|
378
|
+
this.closed = output();
|
|
379
|
+
this._headerClass = computed(() => {
|
|
380
|
+
return up('shrink-0 flex items-center py-2 gap-6 border-b border-[#e0e0e0]', this.hideCloseButton() ? 'px-4' : 'pr-4 pl-1');
|
|
381
|
+
}, ...(ngDevMode ? [{ debugName: "_headerClass" }] : []));
|
|
382
|
+
}
|
|
383
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UpContentContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
384
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.0", type: UpContentContainerComponent, isStandalone: true, selector: "up-content-container", inputs: { header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hideCloseButton: { classPropertyName: "hideCloseButton", publicName: "hideCloseButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, host: { classAttribute: "flex flex-col size-full" }, providers: [
|
|
385
|
+
provideIcons({ matCloseRound }),
|
|
386
|
+
], ngImport: i0, template: `
|
|
387
|
+
<div [class]="_headerClass()">
|
|
388
|
+
<div class="grow flex items-center gap-1">
|
|
389
|
+
@if (!this.hideCloseButton()) {
|
|
390
|
+
<button
|
|
391
|
+
upButton
|
|
392
|
+
size="icon"
|
|
393
|
+
tabindex="-1"
|
|
394
|
+
variant="ghost"
|
|
395
|
+
class="shrink-0 rounded-full"
|
|
396
|
+
[disabled]="disabled()"
|
|
397
|
+
(click)="closed.emit()"
|
|
398
|
+
>
|
|
399
|
+
<ng-icon size="20" name="matCloseRound" />
|
|
400
|
+
</button>
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
<h3 class="grow select-none line-clamp-1 font-semibold text-lg">
|
|
404
|
+
{{ header() }}
|
|
405
|
+
</h3>
|
|
406
|
+
</div>
|
|
407
|
+
|
|
408
|
+
<div class="shrink-0">
|
|
409
|
+
<ng-content select="[actions]" />
|
|
410
|
+
</div>
|
|
411
|
+
</div>
|
|
412
|
+
|
|
413
|
+
<div class="grow overflow-auto">
|
|
414
|
+
<ng-content />
|
|
415
|
+
</div>
|
|
416
|
+
`, isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: UpButtonDirective, selector: "[upButton]", inputs: ["size", "variant", "class"], exportAs: ["upButton"] }] }); }
|
|
417
|
+
}
|
|
418
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UpContentContainerComponent, decorators: [{
|
|
419
|
+
type: Component,
|
|
420
|
+
args: [{
|
|
421
|
+
standalone: true,
|
|
422
|
+
selector: 'up-content-container',
|
|
423
|
+
host: {
|
|
424
|
+
class: 'flex flex-col size-full'
|
|
425
|
+
},
|
|
426
|
+
imports: [
|
|
427
|
+
NgIcon,
|
|
428
|
+
UpButtonDirective
|
|
429
|
+
],
|
|
430
|
+
providers: [
|
|
431
|
+
provideIcons({ matCloseRound }),
|
|
432
|
+
],
|
|
433
|
+
template: `
|
|
434
|
+
<div [class]="_headerClass()">
|
|
435
|
+
<div class="grow flex items-center gap-1">
|
|
436
|
+
@if (!this.hideCloseButton()) {
|
|
437
|
+
<button
|
|
438
|
+
upButton
|
|
439
|
+
size="icon"
|
|
440
|
+
tabindex="-1"
|
|
441
|
+
variant="ghost"
|
|
442
|
+
class="shrink-0 rounded-full"
|
|
443
|
+
[disabled]="disabled()"
|
|
444
|
+
(click)="closed.emit()"
|
|
445
|
+
>
|
|
446
|
+
<ng-icon size="20" name="matCloseRound" />
|
|
447
|
+
</button>
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
<h3 class="grow select-none line-clamp-1 font-semibold text-lg">
|
|
451
|
+
{{ header() }}
|
|
452
|
+
</h3>
|
|
453
|
+
</div>
|
|
454
|
+
|
|
455
|
+
<div class="shrink-0">
|
|
456
|
+
<ng-content select="[actions]" />
|
|
457
|
+
</div>
|
|
458
|
+
</div>
|
|
459
|
+
|
|
460
|
+
<div class="grow overflow-auto">
|
|
461
|
+
<ng-content />
|
|
462
|
+
</div>
|
|
463
|
+
`
|
|
464
|
+
}]
|
|
465
|
+
}], propDecorators: { header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], hideCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideCloseButton", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Generated bundle index. Do not edit.
|
|
469
|
+
*/
|
|
470
|
+
|
|
471
|
+
export { APPLET_CONFIG, AppletContainerComponent, UpColumnContainerComponent, UpContentContainerComponent, UpLazyRouteDirective, provideAppletConfig, redirectToFirstMenu };
|
|
472
|
+
//# sourceMappingURL=unipin-angular-applet-containers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unipin-angular-applet-containers.mjs","sources":["../../../projects/unipin-angular/containers/column-container/directives/lazy-route.directive.ts","../../../projects/unipin-angular/containers/applet-container/utils/provide-applet-config/provide-applet-config.util.ts","../../../projects/unipin-angular/containers/applet-container/utils/redirect-to-first-menu/redirect-to-first-menu.util.ts","../../../projects/unipin-angular/containers/applet-container/components/applet-container.component.ts","../../../projects/unipin-angular/containers/applet-container/components/applet-container.component.html","../../../projects/unipin-angular/containers/column-container/column-container.component.ts","../../../projects/unipin-angular/containers/content-container/content-container.component.ts","../../../projects/unipin-angular/containers/unipin-angular-applet-containers.ts"],"sourcesContent":["import { ComponentRef, Directive, OnInit, ViewContainerRef, inject, DestroyRef, input, reflectComponentType, ComponentMirror } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, NavigationEnd, Router, Route } from '@angular/router';\nimport { distinctUntilChanged, filter, isObservable, firstValueFrom } from 'rxjs';\n\n@Directive({\n standalone: true,\n exportAs: 'upLoadRoute',\n selector: '[upLoadRoute]'\n})\nexport class UpLazyRouteDirective implements OnInit {\n \n protected readonly router = inject(Router);\n protected readonly vcr = inject(ViewContainerRef);\n protected readonly route = inject(ActivatedRoute);\n protected readonly destroyRef = inject(DestroyRef);\n\n /**\n * Accepts a route config object containing `loadComponent`.\n */\n public readonly loadRoute = input.required<Pick<Route, 'loadComponent'>>();\n\n /**\n * Lifecycle hook that is called after the directive's data-bound properties have been initialized.\n * Dynamically loads the component using the `loadComponent` method and creates it within the directive's view container.\n */\n public ngOnInit(): void{\n if (!this.loadRoute().loadComponent) return;\n\n const result = this.loadRoute().loadComponent!();\n const load = isObservable(result)? firstValueFrom(result) : Promise.resolve(result);\n\n load.then(\n (m: any) => {\n const cmp = m.default?? m;\n \n const cr = this.vcr.createComponent(cmp);\n const mirror = reflectComponentType(cmp);\n \n this.setInput(cr, mirror);\n this.router.events.pipe(\n filter(\n (e): e is NavigationEnd => e instanceof NavigationEnd\n ),\n distinctUntilChanged(\n (prev, curr) => {\n return prev.urlAfterRedirects.split('#')[0] === curr.urlAfterRedirects.split('#')[0];\n }\n ),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: () => this.setInput(cr, mirror)\n });\n }\n );\n }\n\n /**\n * Method to manually set Input to the child component, because component created by ViewContainerRef won't accept the input from route param directly.\n * @param { ComponentRef<any> } cr\n */\n protected setInput(cr: ComponentRef<any>, mirror: ComponentMirror<unknown> | null): void{\n const params = this.route.firstChild?.snapshot.params ?? {};\n\n if (Object.keys(params).length === 0) {\n return;\n }\n\n for (const key of Object.keys(params)) {\n if (key in cr.instance) {\n cr.setInput(key, params[key]);\n continue;\n }\n\n if (mirror) {\n const match = mirror.inputs.find(\n (i) => i.templateName === key\n );\n \n if (match) {\n cr.setInput(match.templateName, params[key]);\n }\n }\n }\n }\n}\n","import { InjectionToken, Provider } from '@angular/core';\nimport { AppletConfig } from '../../types/applet-config.type';\n\nexport const APPLET_CONFIG = new InjectionToken<AppletConfig>('APPLET_CONFIG');\n\nexport function provideAppletConfig(config: AppletConfig): Provider{\n \n return { \n provide: APPLET_CONFIG, \n useValue: config \n };\n}\n","import { forwardRef, inject } from '@angular/core';\nimport { RedirectFunction } from '@angular/router';\nimport { PermissionService } from '@unipin/angular-applet/auth';\nimport { AppletConfig } from '../../types/applet-config.type';\nimport { APPLET_CONFIG } from '../provide-applet-config/provide-applet-config.util';\n\n/**\n * Redirects the user to their first accessible menu route based on permissions.\n * @returns {RedirectFunction} The first allowed route\n */\nexport function redirectToFirstMenu(): ReturnType<RedirectFunction>{\n \n const { has } = inject(PermissionService);\n const { containers } = inject<AppletConfig>(\n () => forwardRef(() => APPLET_CONFIG)\n );\n\n const firstMenu = containers.find(\n ({ permissions }) => {\n if (!permissions) return true;\n\n const { codes, aggregator } = permissions;\n return codes[aggregator === 'AND'? 'every' : 'some']((code) => has(code));\n }\n );\n return firstMenu?.path?? containers[0].path;\n}\n","import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { matChevronRightRound, matSettingsRound } from '@ng-icons/material-icons/round';\nimport { PermissionService } from '@unipin/angular-applet/auth';\nimport { UpButtonDirective } from '@unipin/angular-applet/buttons';\nimport { AppletConfig } from '../types/applet-config.type';\nimport { APPLET_CONFIG } from '../utils/provide-applet-config/provide-applet-config.util';\n\n@Component({\n standalone: true,\n selector: 'up-applet-container',\n templateUrl: './applet-container.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'flex size-full'\n },\n imports: [\n NgIcon,\n RouterLink,\n RouterLinkActive,\n UpButtonDirective,\n ],\n providers: [\n provideIcons(\n { \n matChevronRightRound, \n matSettingsRound \n }\n )\n ]\n})\nexport class AppletContainerComponent {\n\n public readonly config: AppletConfig = inject<AppletConfig>(APPLET_CONFIG); \n\n /**\n * A flag variable that used to control sidebar. When set the the value to true, the component will open the sidebar.\n * when set the value to false, the component will close the sidebar.\n * @type {boolean}\n */\n public readonly isExpanded = signal<boolean>(false);\n\n /**\n * A flag variable for indicates whether the sidebar menu is active or not in mobile view.\n * When set false the sidebar menu will be hidden\n * @type {boolean[]}\n */\n public readonly isMenuActive = signal<boolean>(false);\n\n /**\n * A flag variable that used to control sidebar menu. When set value to true, the component will hide the sidebar menu.\n * When set false, the component will show the sidebar menu.\n * @type {boolean[]}\n */\n public readonly isHidden = signal<boolean[]>(Array(this.config.containers.length).fill(true));\n\n constructor(\n protected readonly permissionService: PermissionService\n ) {\n this.isHidden.set(\n this.config.containers.map(\n ({ permissions }) => {\n if (!permissions) return false;\n \n if (permissions.aggregator === 'AND') {\n return !permissions.codes.every((code) => this.permissionService.has(code));\n }\n return !permissions.codes.some((code) => this.permissionService.has(code));\n }\n )\n );\n }\n\n /**\n * When the method is called, it will change the value of isExpanded to its opposite value. \n * If isExpanded is currently true, it will be set to false, and if it is currently false, it will be set to true. \n * This method is typically used to toggle the visibility of a side navigation menu.\n */\n public toggleSidenav(): void{\n this.isExpanded.update((v) => !v);\n }\n\n /**\n * Handles menu selection by dispatching a custom event.\n * This method is called when a sidebar menu item is selected.\n * It dispatches a custom 'menuEvent' with detail indicating the menu is inactive.\n * This event is typically used to close the sidebar menu.\n */\n public selectMenu(): void{\n dispatchEvent(\n new CustomEvent(\n 'menuEvent', \n { \n detail: { \n isActive: false \n } \n }\n )\n );\n }\n}\n","<nav \n class=\"shrink-0 h-full group flex flex-col transition-all ease-in-out border-r border-border max-md:w-0 max-md:z-10 max-md:absolute [&.expanded]:w-60\"\n [class.show]=\"isMenuActive()\"\n [class.expanded]=\"isExpanded()\"\n>\n <div class=\"shrink-0 p-2 border-b border-border flex items-center gap-2 relative\">\n <img \n class=\"rounded size-9 shrink-0\" \n [alt]=\"config.name\"\n [src]=\"config.icon\" \n />\n\n <div class=\"hidden group-[.expanded]:flex grow flex-col gap-0.5 select-none\">\n <div class=\"font-medium line-clamp-1 text-sm\">{{ config.name }}</div>\n \n <div class=\"text-muted-foreground font-medium text-xs\">\n v{{ config.version }}\n </div>\n </div>\n\n <button \n upButton\n size=\"icon\"\n variant=\"outline\"\n class=\"rounded-full absolute -right-5\"\n (click)=\"toggleSidenav()\"\n >\n <ng-icon \n size=\"18\" \n name=\"matChevronRightRound\" \n class=\"group-[.expanded]:rotate-180 transition-all ease-in-out\"\n />\n </button>\n </div>\n\n <div class=\"grow overflow-y-auto p-2 flex flex-col gap-1\">\n @for (c of config.containers; track $index) {\n <a \n upButton\n variant=\"ghost\"\n routerLinkActive=\"font-medium\"\n class=\"group-[.expanded]:w-full group-[.expanded]:justify-start\"\n [routerLink]=\"c.path\"\n [size]=\"!isExpanded()? 'icon' : 'default'\"\n (click)=\"selectMenu()\"\n >\n <ng-icon \n size=\"18\" \n [name]=\"c.icon\" \n />\n \n <span class=\"line-clamp-1 hidden group-[.expanded]:block\">\n {{ c.label }}\n </span>\n </a>\n }\n </div>\n\n @if (config.enabledSetting) {\n <div class=\"shrink-0 p-2 border-t border-border\">\n <a \n upButton\n variant=\"ghost\"\n routerLink=\"setting\" \n routerLinkActive=\"font-medium\"\n class=\"group-[.expanded]:w-full group-[.expanded]:justify-start\"\n [size]=\"!isExpanded()? 'icon' : 'default'\"\n (click)=\"selectMenu()\"\n >\n <ng-icon size=\"18\" name=\"matSettingsRound\" />\n <span class=\"line-clamp-1 hidden group-[.expanded]:block\">Setting</span>\n </a>\n </div>\n }\n</nav>\n\n<div class=\"grow overflow-y-auto overflow-x-hidden\">\n <ng-content />\n</div>\n","import { Component, HostListener, DestroyRef, signal, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, NavigationEnd, Route, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AngularSplitModule } from 'angular-split';\nimport { UpLazyRouteDirective } from './directives/lazy-route.directive';\n\n@Component({\n standalone: true,\n selector: 'up-column-container',\n host: {\n class: 'block size-full',\n },\n imports: [\n AngularSplitModule, \n UpLazyRouteDirective\n ],\n template: `\n <as-split \n unit=\"percent\" \n [gutterSize]=\"5\" \n [useTransition]=\"true\"\n >\n @for (a of areas(); track $index) {\n <as-split-area\n class=\"border-start\"\n [minSize]=\"20\"\n [size]=\"colSize()\"\n [visible]=\"a.visible\"\n [maxSize]=\"$index === areas().length - 1? 80 : null\"\n >\n <ng-container \n upLoadRoute\n [loadRoute]=\"a.route\" \n />\n </as-split-area>\n }\n </as-split>\n `,\n})\nexport class UpColumnContainerComponent implements OnInit {\n \n /**\n * An array of objects representing the columns, each containing a visibility flag and the associated route.\n * @type {{ visible: boolean, route: Route }[]}\n * @default {[]}\n */\n public readonly areas = signal<{ visible: boolean; route: Pick<Route, 'loadComponent'> }[]>([]);\n\n /**\n * The default size for the split area: 100 means it will be full width, and 50 means it will be divided in half.\n * This can be resizable with minimum width 20%\n */\n public readonly colSize = signal<number>(window.innerWidth <= 768? 100 : 50);\n\n /**\n * An object to keep track of the position of opened areas based on their route paths.\n * @type {{ [key: string]: number }}\n * @default {{}}\n */\n protected readonly openedArea: Record<string, number> = {};\n\n constructor(\n protected readonly router: Router,\n protected readonly destroyRef: DestroyRef,\n protected readonly activeRoute: ActivatedRoute\n ){ }\n\n /**\n * Lifecycle hook called after the component has been initialized.\n * Subscribes to router events, initializes columns based on the initial route, and sets up the first visible column.\n */\n public ngOnInit(): void{\n this.checkScreen();\n\n this.router.events.pipe(\n filter(\n (e): e is NavigationEnd => e instanceof NavigationEnd\n ),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: () => this.navigate()\n });\n\n const url: string | undefined = this.activeRoute.firstChild?.routeConfig?.path;\n const routeList: Route[] =(this.activeRoute.snapshot.routeConfig as any)._loadedRoutes;\n\n if (routeList?.length) {\n this.next(routeList[0]);\n\n for (let i = 1; i < routeList.length; i++) {\n if (\n url?.startsWith(\n routeList[i].path as string\n )\n ) {\n this.next(routeList[i]);\n }\n }\n }\n }\n\n /**\n * Event listener for the window resize event. Adjusts the default size of the split area based on the screen width.\n */\n @HostListener('window:resize')\n public checkScreen(): void{\n this.colSize.set(window.innerWidth <= 768? 100 : 50);\n }\n\n /**\n * Handles router navigation events and adjusts the display of columns accordingly.\n */\n protected navigate(): void{\n const route: Route = this.activeRoute.firstChild!.routeConfig!;\n const pos = this.openedArea[`r-${ route.path }`];\n\n if (pos <= this.areas().length) {\n this.previous(pos);\n return;\n }\n this.next(route);\n }\n\n /**\n * Adds a new column to the container and updates visibility based on the route navigation.\n * @param {Route} route - Contain next route.\n */\n protected next(route: Route): void{\n this.areas.update(\n (areas) => {\n if (\n this.colSize() === 100 &&\n areas.length >= 1\n ) {\n areas[areas.length - 1].visible = false;\n } else if (areas.length >= 2) {\n areas[areas.length - 2].visible = false;\n }\n\n const newAreas = [\n ...areas,\n { visible: true, route }\n ];\n\n this.openedArea[`r-${ route.path }`] = newAreas.length;\n return newAreas;\n }\n );\n }\n\n /**\n * Removes columns from the container based on the route navigation.\n * @param {number} pos - Contain position of the last active area index.\n */\n protected previous(pos: number): void{\n this.areas.update(\n (areas) => {\n const newAreas = areas.slice(0, pos);\n\n if (this.colSize() === 100 && newAreas.length) {\n newAreas[newAreas.length - 1].visible = true;\n return newAreas;\n }\n\n if (newAreas.length === 1) newAreas[0].visible = true;\n else if (newAreas.length >= 2) {\n newAreas[pos - 1].visible = true;\n newAreas[pos - 2].visible = true;\n }\n return newAreas;\n }\n );\n }\n}\n","import { Component, input, booleanAttribute, computed, output } from '@angular/core';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { matCloseRound } from '@ng-icons/material-icons/round';\nimport { up } from '@unipin/angular-applet/common';\nimport { UpButtonDirective } from '@unipin/angular-applet/buttons';\n\n@Component({\n standalone: true,\n selector: 'up-content-container',\n host: {\n class: 'flex flex-col size-full'\n },\n imports: [\n NgIcon,\n UpButtonDirective\n ],\n providers: [\n provideIcons({ matCloseRound }),\n ],\n template: `\n <div [class]=\"_headerClass()\">\n <div class=\"grow flex items-center gap-1\">\n @if (!this.hideCloseButton()) {\n <button\n upButton\n size=\"icon\"\n tabindex=\"-1\"\n variant=\"ghost\"\n class=\"shrink-0 rounded-full\"\n [disabled]=\"disabled()\"\n (click)=\"closed.emit()\"\n >\n <ng-icon size=\"20\" name=\"matCloseRound\" />\n </button>\n }\n\n <h3 class=\"grow select-none line-clamp-1 font-semibold text-lg\">\n {{ header() }}\n </h3>\n </div>\n\n <div class=\"shrink-0\">\n <ng-content select=\"[actions]\" />\n </div>\n </div>\n\n <div class=\"grow overflow-auto\">\n <ng-content />\n </div>\n `\n})\nexport class UpContentContainerComponent {\n\n /**\n * The title text displayed in the header.\n * If the text is too long, it will be truncated with an ellipsis.\n * @type {Signal<string>}\n * @default ''\n */\n public readonly header = input<string>('');\n\n /**\n * Disables the close/back button when set to true.\n * When disabled, the close button will not be shown in the header.\n * @type {Signal<boolean>}\n * @default false\n */\n public readonly disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Hides the close/back button when set to true.\n * When hidden, the close button will not be shown in the header.\n * @type {Signal<boolean>}\n * @default false\n */\n public readonly hideCloseButton = input(false, { transform: booleanAttribute });\n\n /**\n * Event emitted when the user clicks the close button.\n * Typically used to handle closing a modal or navigating back.\n * @type {OutputEmitterRef<void>}\n */\n public readonly closed = output<void>();\n\n protected readonly _headerClass = computed(\n () => {\n return up(\n 'shrink-0 flex items-center py-2 gap-6 border-b border-[#e0e0e0]',\n this.hideCloseButton()? 'px-4' : 'pr-4 pl-1'\n );\n }\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|