@villedemontreal/angular-ui 13.2.1 → 13.3.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/esm2020/lib/bao.module.mjs +12 -7
- package/esm2020/lib/button/button.component.mjs +2 -2
- package/esm2020/lib/core/breakpoints.mjs +13 -0
- package/esm2020/lib/core/index.mjs +8 -0
- package/esm2020/lib/dropdown-menu/dropdown-menu.component.mjs +10 -3
- package/esm2020/lib/modal/modal-container.mjs +2 -2
- package/esm2020/lib/snack-bar/index.mjs +12 -0
- package/esm2020/lib/snack-bar/module.mjs +54 -0
- package/esm2020/lib/snack-bar/simple-snack-bar.component.mjs +92 -0
- package/esm2020/lib/snack-bar/snack-bar-animations.mjs +28 -0
- package/esm2020/lib/snack-bar/snack-bar-config.mjs +37 -0
- package/esm2020/lib/snack-bar/snack-bar-container.mjs +272 -0
- package/esm2020/lib/snack-bar/snack-bar-ref.mjs +75 -0
- package/esm2020/lib/snack-bar/snack-bar.mjs +251 -0
- package/esm2020/lib/system-header/index.mjs +8 -0
- package/esm2020/lib/system-header/module.mjs +33 -0
- package/esm2020/lib/system-header/system-header.component.mjs +128 -0
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/villedemontreal-angular-ui.mjs +982 -16
- package/fesm2015/villedemontreal-angular-ui.mjs.map +1 -1
- package/fesm2020/villedemontreal-angular-ui.mjs +978 -16
- package/fesm2020/villedemontreal-angular-ui.mjs.map +1 -1
- package/lib/bao.module.d.ts +3 -1
- package/lib/button/button.component.d.ts +3 -3
- package/lib/core/breakpoints.d.ts +7 -0
- package/lib/core/index.d.ts +2 -0
- package/lib/snack-bar/index.d.ts +6 -0
- package/lib/snack-bar/module.d.ts +13 -0
- package/lib/snack-bar/simple-snack-bar.component.d.ts +51 -0
- package/lib/snack-bar/snack-bar-animations.d.ts +8 -0
- package/lib/snack-bar/snack-bar-config.d.ts +51 -0
- package/lib/snack-bar/snack-bar-container.d.ts +111 -0
- package/lib/snack-bar/snack-bar-ref.d.ts +51 -0
- package/lib/snack-bar/snack-bar.d.ts +89 -0
- package/lib/system-header/index.d.ts +2 -0
- package/lib/system-header/module.d.ts +9 -0
- package/lib/system-header/system-header.component.d.ts +41 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { SecurityContext, Injectable, Inject, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, NgModule, Directive, EventEmitter, Output, CUSTOM_ELEMENTS_SCHEMA, ViewChild, forwardRef, InjectionToken, ContentChildren, Optional, HostListener, ContentChild, Injector, TemplateRef, SkipSelf, ViewChildren } from '@angular/core';
|
|
2
|
+
import { SecurityContext, Injectable, Inject, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, NgModule, Directive, EventEmitter, Output, CUSTOM_ELEMENTS_SCHEMA, ViewChild, forwardRef, InjectionToken, ContentChildren, Optional, HostListener, ContentChild, Injector, TemplateRef, SkipSelf, ViewChildren, inject } from '@angular/core';
|
|
3
3
|
import * as i1$1 from '@angular/common';
|
|
4
4
|
import { DOCUMENT, CommonModule } from '@angular/common';
|
|
5
5
|
import * as i1 from '@angular/platform-browser';
|
|
@@ -12,10 +12,14 @@ import * as i2 from '@angular/cdk/collections';
|
|
|
12
12
|
import * as i1$4 from '@angular/cdk/overlay';
|
|
13
13
|
import { OverlayConfig, OverlayModule } from '@angular/cdk/overlay';
|
|
14
14
|
import * as i3 from '@angular/cdk/portal';
|
|
15
|
-
import { BasePortalOutlet, CdkPortalOutlet, ComponentPortal, TemplatePortal, PortalModule, DomPortal } from '@angular/cdk/portal';
|
|
15
|
+
import { BasePortalOutlet, CdkPortalOutlet, ComponentPortal, TemplatePortal, PortalModule, DomPortal, PortalInjector } from '@angular/cdk/portal';
|
|
16
16
|
import { Subject, filter, take, defer, startWith } from 'rxjs';
|
|
17
|
+
import * as i1$5 from '@angular/cdk/platform';
|
|
17
18
|
import { _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';
|
|
18
19
|
import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
|
|
20
|
+
import { take as take$1 } from 'rxjs/operators';
|
|
21
|
+
import { trigger, state, style, transition, animate } from '@angular/animations';
|
|
22
|
+
import * as i2$1 from '@angular/cdk/layout';
|
|
19
23
|
|
|
20
24
|
function baoColorToHex(baoColor) {
|
|
21
25
|
switch (baoColor) {
|
|
@@ -429,7 +433,7 @@ class BaoButtonComponent {
|
|
|
429
433
|
get nativeElement() {
|
|
430
434
|
return this.elementRef.nativeElement;
|
|
431
435
|
}
|
|
432
|
-
|
|
436
|
+
ngAfterContentInit() {
|
|
433
437
|
const childNodes = Array.from(this.nativeElement.childNodes);
|
|
434
438
|
const textIndex = childNodes.findIndex(c => c.nodeType === Node.TEXT_NODE);
|
|
435
439
|
this.noText = textIndex === -1;
|
|
@@ -3216,7 +3220,7 @@ class BaoModalContainer extends _BaoModalContainerBase {
|
|
|
3216
3220
|
}
|
|
3217
3221
|
}
|
|
3218
3222
|
BaoModalContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoModalContainer, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
3219
|
-
BaoModalContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: BaoModalContainer, selector: "bao-modal-container", host: { attributes: { "tabindex": "-1", "aria-modal": "true" }, properties: { "id": "_id", "attr.role": "_config.role", "attr.aria-labelledby": "_config.ariaLabel ? null : _ariaLabelledBy", "attr.aria-label": "_config.ariaLabel", "attr.aria-describedby": "_config.ariaDescribedBy || null" }, classAttribute: "bao-modal-container" }, usesInheritance: true, ngImport: i0, template: "<ng-template cdkPortalOutlet></ng-template>\n", styles: [".bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex}.cdk-overlay-pane.bao-modal-mobil-full{width:100%;height:100%}.cdk-overlay-pane.bao-modal-mobil-compact{width:300px;height:100%}@media (min-width: 768px){.cdk-overlay-pane{width:500px;height:auto}.cdk-overlay-pane.bao-modal-lg{width:calc(100% - 4rem);height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-md,.cdk-overlay-pane.bao-modal-sm{width:500px;height:auto}}@media (min-width: 992px){.cdk-overlay-pane{width:500px;height:auto}.cdk-overlay-pane.bao-modal-lg{width:calc(100% - 4rem);height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-md{width:800px;height:auto}.cdk-overlay-pane.bao-modal-sm{width:500px;height:auto}}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.5}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:black}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:.5}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.bao-modal-container{display:block;overflow:auto;
|
|
3223
|
+
BaoModalContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: BaoModalContainer, selector: "bao-modal-container", host: { attributes: { "tabindex": "-1", "aria-modal": "true" }, properties: { "id": "_id", "attr.role": "_config.role", "attr.aria-labelledby": "_config.ariaLabel ? null : _ariaLabelledBy", "attr.aria-label": "_config.ariaLabel", "attr.aria-describedby": "_config.ariaDescribedBy || null" }, classAttribute: "bao-modal-container" }, usesInheritance: true, ngImport: i0, template: "<ng-template cdkPortalOutlet></ng-template>\n", styles: [".bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex}.cdk-overlay-pane.bao-modal-mobil-full{width:100%;height:100%}.cdk-overlay-pane.bao-modal-mobil-compact{width:300px;height:100%}@media (min-width: 768px){.cdk-overlay-pane{width:500px;height:auto}.cdk-overlay-pane.bao-modal-lg{width:calc(100% - 4rem);height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-md,.cdk-overlay-pane.bao-modal-sm{width:500px;height:auto;max-height:calc(100% - 4rem)}}@media (min-width: 992px){.cdk-overlay-pane{width:500px;height:auto}.cdk-overlay-pane.bao-modal-lg{width:calc(100% - 4rem);height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-md{width:800px;height:auto;max-height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-sm{width:500px;height:auto;max-height:calc(100% - 4rem)}}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.5}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:black}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:.5}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.bao-modal-container{display:block;overflow:auto;min-height:inherit;max-height:inherit;background-color:#fff;background-clip:padding-box;border:0 solid rgba(0,0,0,.2);border-radius:.5rem;outline:0}.bao-modal-content{display:flex;flex-direction:column;height:100%}.bao-modal-header{flex:0 0 auto;display:flex;align-items:flex-start;justify-content:space-between;border-bottom:1px solid #ced4da;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.bao-modal-header .bao-modal-title{font-size:1rem;line-height:1.5rem;margin:1rem 0 1rem 1rem}.bao-modal-header button{margin:.5rem}.bao-modal-body{display:block;padding:1rem;overflow:auto;flex-grow:1}@media (min-width: 768px){.bao-modal-body{padding:2rem}}.bao-modal-footer{display:flex;flex-wrap:wrap;padding:1rem;border-top:1px solid #ced4da;border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.bao-modal-footer.bao-modal-footer-order{justify-content:unset;flex-direction:column-reverse}.bao-modal-footer button{text-align:center}.bao-modal-footer .bao-button-primary,.bao-modal-footer .bao-button-secondary{width:100%;display:block}.bao-modal-footer .bao-button-secondary{margin-bottom:.5rem}.bao-modal-footer .bao-button-tertiary{display:none}@media (min-width: 768px){.bao-modal-footer{justify-content:flex-end}.bao-modal-footer.bao-modal-footer-order{flex-direction:row-reverse}.bao-modal-footer .bao-button-primary{margin-left:1rem}.bao-modal-footer .bao-button-secondary{margin-bottom:0}.bao-modal-footer .bao-button-primary,.bao-modal-footer .bao-button-secondary{width:auto}.bao-modal-footer .bao-button-tertiary{display:block}}\n"], directives: [{ type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
|
|
3220
3224
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoModalContainer, decorators: [{
|
|
3221
3225
|
type: Component,
|
|
3222
3226
|
args: [{ selector: 'bao-modal-container', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, host: {
|
|
@@ -3228,18 +3232,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
3228
3232
|
'[attr.aria-labelledby]': '_config.ariaLabel ? null : _ariaLabelledBy',
|
|
3229
3233
|
'[attr.aria-label]': '_config.ariaLabel',
|
|
3230
3234
|
'[attr.aria-describedby]': '_config.ariaDescribedBy || null'
|
|
3231
|
-
}, template: "<ng-template cdkPortalOutlet></ng-template>\n", styles: [".bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex}.cdk-overlay-pane.bao-modal-mobil-full{width:100%;height:100%}.cdk-overlay-pane.bao-modal-mobil-compact{width:300px;height:100%}@media (min-width: 768px){.cdk-overlay-pane{width:500px;height:auto}.cdk-overlay-pane.bao-modal-lg{width:calc(100% - 4rem);height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-md,.cdk-overlay-pane.bao-modal-sm{width:500px;height:auto}}@media (min-width: 992px){.cdk-overlay-pane{width:500px;height:auto}.cdk-overlay-pane.bao-modal-lg{width:calc(100% - 4rem);height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-md{width:800px;height:auto}.cdk-overlay-pane.bao-modal-sm{width:500px;height:auto}}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.5}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:black}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:.5}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.bao-modal-container{display:block;overflow:auto;
|
|
3235
|
+
}, template: "<ng-template cdkPortalOutlet></ng-template>\n", styles: [".bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex}.cdk-overlay-pane.bao-modal-mobil-full{width:100%;height:100%}.cdk-overlay-pane.bao-modal-mobil-compact{width:300px;height:100%}@media (min-width: 768px){.cdk-overlay-pane{width:500px;height:auto}.cdk-overlay-pane.bao-modal-lg{width:calc(100% - 4rem);height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-md,.cdk-overlay-pane.bao-modal-sm{width:500px;height:auto;max-height:calc(100% - 4rem)}}@media (min-width: 992px){.cdk-overlay-pane{width:500px;height:auto}.cdk-overlay-pane.bao-modal-lg{width:calc(100% - 4rem);height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-md{width:800px;height:auto;max-height:calc(100% - 4rem)}.cdk-overlay-pane.bao-modal-sm{width:500px;height:auto;max-height:calc(100% - 4rem)}}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.5}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:black}.cdk-overlay-transparent-backdrop,.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:.5}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.bao-modal-container{display:block;overflow:auto;min-height:inherit;max-height:inherit;background-color:#fff;background-clip:padding-box;border:0 solid rgba(0,0,0,.2);border-radius:.5rem;outline:0}.bao-modal-content{display:flex;flex-direction:column;height:100%}.bao-modal-header{flex:0 0 auto;display:flex;align-items:flex-start;justify-content:space-between;border-bottom:1px solid #ced4da;border-top-left-radius:.5rem;border-top-right-radius:.5rem}.bao-modal-header .bao-modal-title{font-size:1rem;line-height:1.5rem;margin:1rem 0 1rem 1rem}.bao-modal-header button{margin:.5rem}.bao-modal-body{display:block;padding:1rem;overflow:auto;flex-grow:1}@media (min-width: 768px){.bao-modal-body{padding:2rem}}.bao-modal-footer{display:flex;flex-wrap:wrap;padding:1rem;border-top:1px solid #ced4da;border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.bao-modal-footer.bao-modal-footer-order{justify-content:unset;flex-direction:column-reverse}.bao-modal-footer button{text-align:center}.bao-modal-footer .bao-button-primary,.bao-modal-footer .bao-button-secondary{width:100%;display:block}.bao-modal-footer .bao-button-secondary{margin-bottom:.5rem}.bao-modal-footer .bao-button-tertiary{display:none}@media (min-width: 768px){.bao-modal-footer{justify-content:flex-end}.bao-modal-footer.bao-modal-footer-order{flex-direction:row-reverse}.bao-modal-footer .bao-button-primary{margin-left:1rem}.bao-modal-footer .bao-button-secondary{margin-bottom:0}.bao-modal-footer .bao-button-primary,.bao-modal-footer .bao-button-secondary{width:auto}.bao-modal-footer .bao-button-tertiary{display:block}}\n"] }]
|
|
3232
3236
|
}] });
|
|
3233
3237
|
|
|
3234
3238
|
// Counter for unique modal ids.
|
|
3235
|
-
let uniqueId = 0;
|
|
3239
|
+
let uniqueId$1 = 0;
|
|
3236
3240
|
/**
|
|
3237
3241
|
* Reference to a modal opened via the BaoModalService.
|
|
3238
3242
|
*/
|
|
3239
3243
|
class BaoModalRef {
|
|
3240
3244
|
constructor(_overlayRef, _containerInstance,
|
|
3241
3245
|
/** Id of the modal. */
|
|
3242
|
-
id = `bao-modal-${uniqueId++}`) {
|
|
3246
|
+
id = `bao-modal-${uniqueId$1++}`) {
|
|
3243
3247
|
this._overlayRef = _overlayRef;
|
|
3244
3248
|
this._containerInstance = _containerInstance;
|
|
3245
3249
|
this.id = id;
|
|
@@ -4305,11 +4309,18 @@ class BaoDropdownMenuTrigger {
|
|
|
4305
4309
|
overlayY: 'bottom'
|
|
4306
4310
|
},
|
|
4307
4311
|
{
|
|
4308
|
-
// top-right of the overlay is connected to bottom-
|
|
4309
|
-
originX: '
|
|
4312
|
+
// top-right of the overlay is connected to bottom-right of the origin;
|
|
4313
|
+
originX: 'end',
|
|
4310
4314
|
originY: 'bottom',
|
|
4311
4315
|
overlayX: 'end',
|
|
4312
4316
|
overlayY: 'top'
|
|
4317
|
+
},
|
|
4318
|
+
{
|
|
4319
|
+
// bottom-right of the overlay is connected to top-right of the origin;
|
|
4320
|
+
originX: 'end',
|
|
4321
|
+
originY: 'top',
|
|
4322
|
+
overlayX: 'end',
|
|
4323
|
+
overlayY: 'bottom'
|
|
4313
4324
|
}
|
|
4314
4325
|
]),
|
|
4315
4326
|
backdropClass: 'bao-overlay-transparent-backdrop',
|
|
@@ -4975,6 +4986,948 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
4975
4986
|
}]
|
|
4976
4987
|
}] });
|
|
4977
4988
|
|
|
4989
|
+
/** Injection token that can be used to access the data that was passed in to a snack bar. */
|
|
4990
|
+
const BAO_SNACK_BAR_DATA = new InjectionToken('BaoSnackBarData');
|
|
4991
|
+
/**
|
|
4992
|
+
* Configuration used when opening a snack-bar.
|
|
4993
|
+
*/
|
|
4994
|
+
class BaoSnackBarConfig {
|
|
4995
|
+
constructor() {
|
|
4996
|
+
/** The message to display in the snackbar. */
|
|
4997
|
+
this.message = 'No message';
|
|
4998
|
+
/** The type of snackbar template to display. */
|
|
4999
|
+
this.toastType = 'info';
|
|
5000
|
+
/**
|
|
5001
|
+
* The attached action to the snack bar. If the name of the action matches an icon provided as part of
|
|
5002
|
+
* angular-ui icon dictionnary an icon will be displayed instead of text.
|
|
5003
|
+
* */
|
|
5004
|
+
this.actionLabelOrIcon = '';
|
|
5005
|
+
/** Displays the close button when set to true */
|
|
5006
|
+
this.showClose = false;
|
|
5007
|
+
/** The length of time in milliseconds to wait before automatically dismissing the snack bar. */
|
|
5008
|
+
this.duration = 5000;
|
|
5009
|
+
/** The politeness level for the MatAriaLiveAnnouncer announcement. */
|
|
5010
|
+
this.politeness = 'assertive';
|
|
5011
|
+
/**
|
|
5012
|
+
* Message to be announced by the LiveAnnouncer. When opening a snackbar without a custom
|
|
5013
|
+
* component or template, the announcement message will default to the specified message.
|
|
5014
|
+
*/
|
|
5015
|
+
this.announcementMessage = '';
|
|
5016
|
+
/** Data being injected into the child component. */
|
|
5017
|
+
this.data = null;
|
|
5018
|
+
/** The horizontal position to place the snack bar. */
|
|
5019
|
+
this.horizontalPosition = 'left';
|
|
5020
|
+
/** The vertical position to place the snack bar. */
|
|
5021
|
+
this.verticalPosition = 'bottom';
|
|
5022
|
+
}
|
|
5023
|
+
}
|
|
5024
|
+
|
|
5025
|
+
/** Maximum amount of milliseconds that can be passed into setTimeout. */
|
|
5026
|
+
const MAX_TIMEOUT = Math.pow(2, 31) - 1;
|
|
5027
|
+
/**
|
|
5028
|
+
* Reference to a snack bar dispatched from the snack bar service.
|
|
5029
|
+
*/
|
|
5030
|
+
class BaoSnackBarRef {
|
|
5031
|
+
constructor(containerInstance, _overlayRef) {
|
|
5032
|
+
this._overlayRef = _overlayRef;
|
|
5033
|
+
/** Subject for notifying the user that the snack bar has been dismissed. */
|
|
5034
|
+
this._afterDismissed = new Subject();
|
|
5035
|
+
/** Subject for notifying the user that the snack bar has opened and appeared. */
|
|
5036
|
+
this._afterOpened = new Subject();
|
|
5037
|
+
/** Subject for notifying the user that the snack bar action was called. */
|
|
5038
|
+
this._onAction = new Subject();
|
|
5039
|
+
/** Whether the snack bar was dismissed using the action button. */
|
|
5040
|
+
this._dismissedByAction = false;
|
|
5041
|
+
this.containerInstance = containerInstance;
|
|
5042
|
+
// Dismiss snackbar on action.
|
|
5043
|
+
this.onAction().subscribe(() => this.dismiss());
|
|
5044
|
+
containerInstance._onExit.subscribe(() => this.finishDismiss());
|
|
5045
|
+
}
|
|
5046
|
+
/** Dismisses the snack bar. */
|
|
5047
|
+
dismiss() {
|
|
5048
|
+
if (!this._afterDismissed.closed) {
|
|
5049
|
+
this.containerInstance.exit();
|
|
5050
|
+
}
|
|
5051
|
+
clearTimeout(this._durationTimeoutId);
|
|
5052
|
+
}
|
|
5053
|
+
/** Marks the snackbar action clicked. */
|
|
5054
|
+
dismissWithAction() {
|
|
5055
|
+
if (!this._onAction.closed) {
|
|
5056
|
+
this._dismissedByAction = true;
|
|
5057
|
+
this._onAction.next();
|
|
5058
|
+
this._onAction.complete();
|
|
5059
|
+
}
|
|
5060
|
+
}
|
|
5061
|
+
/** Dismisses the snack bar after some duration */
|
|
5062
|
+
dismissAfter(duration) {
|
|
5063
|
+
// Note that we need to cap the duration to the maximum value for setTimeout, because
|
|
5064
|
+
// it'll revert to 1 if somebody passes in something greater (e.g. `Infinity`). See #17234.
|
|
5065
|
+
// @TODO: window.setTimeout() ?
|
|
5066
|
+
this._durationTimeoutId = window.setTimeout(() => this.dismiss(), Math.min(duration, MAX_TIMEOUT));
|
|
5067
|
+
}
|
|
5068
|
+
/** Marks the snackbar as opened */
|
|
5069
|
+
open() {
|
|
5070
|
+
if (!this._afterOpened.closed) {
|
|
5071
|
+
this._afterOpened.next();
|
|
5072
|
+
this._afterOpened.complete();
|
|
5073
|
+
}
|
|
5074
|
+
}
|
|
5075
|
+
/** Gets an observable that is notified when the snack bar is finished closing. */
|
|
5076
|
+
afterDismissed() {
|
|
5077
|
+
return this._afterDismissed;
|
|
5078
|
+
}
|
|
5079
|
+
/** Gets an observable that is notified when the snack bar has opened and appeared. */
|
|
5080
|
+
afterOpened() {
|
|
5081
|
+
return this.containerInstance._onEnter;
|
|
5082
|
+
}
|
|
5083
|
+
/** Gets an observable that is notified when the snack bar action is called. */
|
|
5084
|
+
onAction() {
|
|
5085
|
+
return this._onAction;
|
|
5086
|
+
}
|
|
5087
|
+
/** Cleans up the DOM after closing. */
|
|
5088
|
+
finishDismiss() {
|
|
5089
|
+
this._overlayRef.dispose();
|
|
5090
|
+
if (!this._onAction.closed) {
|
|
5091
|
+
this._onAction.complete();
|
|
5092
|
+
}
|
|
5093
|
+
this._afterDismissed.next({ dismissedByAction: this._dismissedByAction });
|
|
5094
|
+
this._afterDismissed.complete();
|
|
5095
|
+
this._dismissedByAction = false;
|
|
5096
|
+
}
|
|
5097
|
+
}
|
|
5098
|
+
|
|
5099
|
+
/*
|
|
5100
|
+
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
5101
|
+
* Licensed under the MIT license.
|
|
5102
|
+
* See LICENSE file in the project root for full license information.
|
|
5103
|
+
*/
|
|
5104
|
+
const toastTypeToAttributes = {
|
|
5105
|
+
info: {
|
|
5106
|
+
toastClass: 'bao-snackbar-info',
|
|
5107
|
+
icon: 'icon-info',
|
|
5108
|
+
iconTitle: 'Information',
|
|
5109
|
+
politeness: 'assertive'
|
|
5110
|
+
},
|
|
5111
|
+
success: {
|
|
5112
|
+
toastClass: 'bao-snackbar-success',
|
|
5113
|
+
icon: 'icon-check-circle',
|
|
5114
|
+
iconTitle: 'Succès',
|
|
5115
|
+
politeness: 'polite'
|
|
5116
|
+
},
|
|
5117
|
+
danger: {
|
|
5118
|
+
toastClass: 'bao-snackbar-danger',
|
|
5119
|
+
icon: 'icon-error',
|
|
5120
|
+
iconTitle: 'Erreur',
|
|
5121
|
+
politeness: 'assertive'
|
|
5122
|
+
}
|
|
5123
|
+
};
|
|
5124
|
+
/**
|
|
5125
|
+
* A component used to open as the default snack bar, matching material spec.
|
|
5126
|
+
* This should only be used internally by the snack bar service.
|
|
5127
|
+
*/
|
|
5128
|
+
class BaoSimpleSnackBarComponent {
|
|
5129
|
+
constructor(snackBarRef, data) {
|
|
5130
|
+
this.snackBarRef = snackBarRef;
|
|
5131
|
+
this.showCloseTitle = 'Fermer le message';
|
|
5132
|
+
this.data = data;
|
|
5133
|
+
}
|
|
5134
|
+
/** Returns the politeness */
|
|
5135
|
+
get politeness() {
|
|
5136
|
+
return (toastTypeToAttributes[this.data.toastType]?.politeness ||
|
|
5137
|
+
toastTypeToAttributes['info'].politeness);
|
|
5138
|
+
}
|
|
5139
|
+
/** Returns the toast class */
|
|
5140
|
+
get toastClass() {
|
|
5141
|
+
return (toastTypeToAttributes[this.data.toastType]?.toastClass ||
|
|
5142
|
+
toastTypeToAttributes['info'].toastClass);
|
|
5143
|
+
}
|
|
5144
|
+
/** Returns the toast icon */
|
|
5145
|
+
get toastIcon() {
|
|
5146
|
+
return (toastTypeToAttributes[this.data.toastType]?.icon ||
|
|
5147
|
+
toastTypeToAttributes['info'].icon);
|
|
5148
|
+
}
|
|
5149
|
+
/** Returns the toast icon title */
|
|
5150
|
+
get toastIconTitle() {
|
|
5151
|
+
return (toastTypeToAttributes[this.data.toastType]?.iconTitle ||
|
|
5152
|
+
toastTypeToAttributes['info'].iconTitle);
|
|
5153
|
+
}
|
|
5154
|
+
/** If the action button should be shown. */
|
|
5155
|
+
get hasAction() {
|
|
5156
|
+
return !!this.data.actionLabelOrIcon;
|
|
5157
|
+
}
|
|
5158
|
+
/** If the action is an icon */
|
|
5159
|
+
get isActionIcon() {
|
|
5160
|
+
return !!ICONS_DCT[this.data.actionLabelOrIcon];
|
|
5161
|
+
}
|
|
5162
|
+
/** Performs the action on the snack bar. */
|
|
5163
|
+
action() {
|
|
5164
|
+
this.snackBarRef.dismissWithAction();
|
|
5165
|
+
}
|
|
5166
|
+
/** Closes the snack bar. */
|
|
5167
|
+
close() {
|
|
5168
|
+
this.snackBarRef.dismiss();
|
|
5169
|
+
}
|
|
5170
|
+
}
|
|
5171
|
+
BaoSimpleSnackBarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSimpleSnackBarComponent, deps: [{ token: BaoSnackBarRef }, { token: BAO_SNACK_BAR_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
5172
|
+
BaoSimpleSnackBarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: BaoSimpleSnackBarComponent, selector: "bao-simple-snack-bar", host: { classAttribute: "bao-simple-snackbar" }, ngImport: i0, template: "<div\n class=\"bao-snackbar show\"\n [ngClass]=\"toastClass\"\n [attr.aria-live]=\"politeness\"\n aria-atomic=\"true\"\n>\n <div class=\"bao-snackbar-icon\">\n <bao-icon [svgIcon]=\"toastIcon\" [title]=\"toastIconTitle\"></bao-icon>\n </div>\n <div class=\"bao-snackbar-body\">\n {{ data.message }}\n </div>\n <div class=\"bao-snackbar-action\">\n <div *ngIf=\"hasAction\">\n <button\n bao-button\n role=\"button\"\n type=\"utility\"\n level=\"tertiary\"\n [reversed]=\"true\"\n [title]=\"data.actionLabelOrIcon\"\n (click)=\"action()\"\n >\n <bao-icon\n *ngIf=\"isActionIcon; else isActionText\"\n [svgIcon]=\"data.actionLabelOrIcon\"\n [title]=\"data.actionLabelOrIcon\"\n ></bao-icon>\n <ng-template #isActionText\n ><span>{{ data.actionLabelOrIcon }}</span></ng-template\n >\n </button>\n </div>\n <div *ngIf=\"data.showClose\">\n <button\n bao-button\n role=\"button\"\n type=\"utility\"\n level=\"tertiary\"\n [reversed]=\"true\"\n title=\"{{ showCloseTitle }}\"\n (click)=\"close()\"\n >\n <bao-icon svgIcon=\"icon-x\" title=\"{{ showCloseTitle }}\"></bao-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [".bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.bao-snackbar{overflow:hidden;font-size:.875rem;line-height:1.25rem;color:#fff;background-color:#004b7b;background-clip:padding-box;box-shadow:0 2px 8px #0000001a;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem;width:100%}.bao-snackbar:not(:last-child){margin-bottom:1rem}.bao-snackbar.showing{opacity:1}.bao-snackbar.show{display:inline-flex;opacity:1}.bao-snackbar.hide{display:none}@media (min-width: 768px){.bao-snackbar{margin:1rem;width:auto}}.bao-snackbar-icon{display:inline-flex;align-items:center;flex-grow:0;margin:1rem 0 1rem 1rem}.bao-snackbar-body{display:flex;align-items:center;padding:1rem;margin:0}.bao-snackbar-action{display:flex;align-items:center;margin-left:auto}.bao-snackbar-action:last-child{margin-right:.5rem}.bao-snackbar-info{color:#fff;background-color:#004b7b}.bao-snackbar-success{color:#fff;background-color:#025d29}.bao-snackbar-danger{color:#fff;background-color:#851a00}\n"], components: [{ type: BaoIconComponent, selector: "bao-icon", inputs: ["color", "size", "svgIcon", "title"], exportAs: ["baoIcon"] }, { type: BaoButtonComponent, selector: "button[bao-button]", inputs: ["displayType", "level", "size", "loading", "reversed", "loadingSpinnerAriaLabel", "fullWidth"] }], directives: [{ type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
5173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSimpleSnackBarComponent, decorators: [{
|
|
5174
|
+
type: Component,
|
|
5175
|
+
args: [{ selector: 'bao-simple-snack-bar', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
5176
|
+
class: 'bao-simple-snackbar'
|
|
5177
|
+
}, template: "<div\n class=\"bao-snackbar show\"\n [ngClass]=\"toastClass\"\n [attr.aria-live]=\"politeness\"\n aria-atomic=\"true\"\n>\n <div class=\"bao-snackbar-icon\">\n <bao-icon [svgIcon]=\"toastIcon\" [title]=\"toastIconTitle\"></bao-icon>\n </div>\n <div class=\"bao-snackbar-body\">\n {{ data.message }}\n </div>\n <div class=\"bao-snackbar-action\">\n <div *ngIf=\"hasAction\">\n <button\n bao-button\n role=\"button\"\n type=\"utility\"\n level=\"tertiary\"\n [reversed]=\"true\"\n [title]=\"data.actionLabelOrIcon\"\n (click)=\"action()\"\n >\n <bao-icon\n *ngIf=\"isActionIcon; else isActionText\"\n [svgIcon]=\"data.actionLabelOrIcon\"\n [title]=\"data.actionLabelOrIcon\"\n ></bao-icon>\n <ng-template #isActionText\n ><span>{{ data.actionLabelOrIcon }}</span></ng-template\n >\n </button>\n </div>\n <div *ngIf=\"data.showClose\">\n <button\n bao-button\n role=\"button\"\n type=\"utility\"\n level=\"tertiary\"\n [reversed]=\"true\"\n title=\"{{ showCloseTitle }}\"\n (click)=\"close()\"\n >\n <bao-icon svgIcon=\"icon-x\" title=\"{{ showCloseTitle }}\"></bao-icon>\n </button>\n </div>\n </div>\n</div>\n", styles: [".bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.bao-snackbar{overflow:hidden;font-size:.875rem;line-height:1.25rem;color:#fff;background-color:#004b7b;background-clip:padding-box;box-shadow:0 2px 8px #0000001a;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem;width:100%}.bao-snackbar:not(:last-child){margin-bottom:1rem}.bao-snackbar.showing{opacity:1}.bao-snackbar.show{display:inline-flex;opacity:1}.bao-snackbar.hide{display:none}@media (min-width: 768px){.bao-snackbar{margin:1rem;width:auto}}.bao-snackbar-icon{display:inline-flex;align-items:center;flex-grow:0;margin:1rem 0 1rem 1rem}.bao-snackbar-body{display:flex;align-items:center;padding:1rem;margin:0}.bao-snackbar-action{display:flex;align-items:center;margin-left:auto}.bao-snackbar-action:last-child{margin-right:.5rem}.bao-snackbar-info{color:#fff;background-color:#004b7b}.bao-snackbar-success{color:#fff;background-color:#025d29}.bao-snackbar-danger{color:#fff;background-color:#851a00}\n"] }]
|
|
5178
|
+
}], ctorParameters: function () { return [{ type: BaoSnackBarRef }, { type: undefined, decorators: [{
|
|
5179
|
+
type: Inject,
|
|
5180
|
+
args: [BAO_SNACK_BAR_DATA]
|
|
5181
|
+
}] }]; } });
|
|
5182
|
+
|
|
5183
|
+
/*
|
|
5184
|
+
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
5185
|
+
* Licensed under the MIT license.
|
|
5186
|
+
* See LICENSE file in the project root for full license information.
|
|
5187
|
+
*/
|
|
5188
|
+
/**
|
|
5189
|
+
* Animations used by the Material snack bar.
|
|
5190
|
+
* @docs-private
|
|
5191
|
+
*/
|
|
5192
|
+
const matSnackBarAnimations = {
|
|
5193
|
+
/** Animation that shows and hides a snack bar. */
|
|
5194
|
+
snackBarState: trigger('state', [
|
|
5195
|
+
state('void, hidden', style({
|
|
5196
|
+
transform: 'scale(0.8)',
|
|
5197
|
+
opacity: 0
|
|
5198
|
+
})),
|
|
5199
|
+
state('visible', style({
|
|
5200
|
+
transform: 'scale(1)',
|
|
5201
|
+
opacity: 1
|
|
5202
|
+
})),
|
|
5203
|
+
transition('* => visible', animate('150ms cubic-bezier(0, 0, 0.2, 1)')),
|
|
5204
|
+
transition('* => void, * => hidden', animate('75ms cubic-bezier(0.4, 0.0, 1, 1)', style({
|
|
5205
|
+
opacity: 0
|
|
5206
|
+
})))
|
|
5207
|
+
])
|
|
5208
|
+
};
|
|
5209
|
+
|
|
5210
|
+
let uniqueId = 0;
|
|
5211
|
+
/**
|
|
5212
|
+
* Internal component that wraps user-provided snack bar content.
|
|
5213
|
+
* @docs-private
|
|
5214
|
+
*/
|
|
5215
|
+
class BaoSnackBarContainerComponent extends BasePortalOutlet {
|
|
5216
|
+
constructor(_ngZone, _elementRef, _changeDetectorRef, _platform,
|
|
5217
|
+
/** The snack bar configuration. */
|
|
5218
|
+
snackBarConfig) {
|
|
5219
|
+
super();
|
|
5220
|
+
this._ngZone = _ngZone;
|
|
5221
|
+
this._elementRef = _elementRef;
|
|
5222
|
+
this._changeDetectorRef = _changeDetectorRef;
|
|
5223
|
+
this._platform = _platform;
|
|
5224
|
+
this.snackBarConfig = snackBarConfig;
|
|
5225
|
+
this._document = inject(DOCUMENT);
|
|
5226
|
+
this._trackedModals = new Set();
|
|
5227
|
+
/** Subject for notifying that the snack bar has announced to screen readers. */
|
|
5228
|
+
this._onAnnounce = new Subject();
|
|
5229
|
+
/** Subject for notifying that the snack bar has exited from view. */
|
|
5230
|
+
this._onExit = new Subject();
|
|
5231
|
+
/** Subject for notifying that the snack bar has finished entering the view. */
|
|
5232
|
+
this._onEnter = new Subject();
|
|
5233
|
+
/** The state of the snack bar animations. */
|
|
5234
|
+
this._animationState = 'void';
|
|
5235
|
+
/** The number of milliseconds to wait before announcing the snack bar's content. */
|
|
5236
|
+
this._announceDelay = 150;
|
|
5237
|
+
/** Whether the component has been destroyed. */
|
|
5238
|
+
this._destroyed = false;
|
|
5239
|
+
/** Unique ID of the aria-live element. */
|
|
5240
|
+
this._liveElementId = `bao-snack-bar-container-live-${uniqueId++}`;
|
|
5241
|
+
/**
|
|
5242
|
+
* Attaches a DOM portal to the snack bar container.
|
|
5243
|
+
* @deprecated To be turned into a method.
|
|
5244
|
+
* @breaking-change 10.0.0
|
|
5245
|
+
*/
|
|
5246
|
+
this.attachDomPortal = (portal) => {
|
|
5247
|
+
this.assertNotAttached();
|
|
5248
|
+
const result = this._portalOutlet.attachDomPortal(portal);
|
|
5249
|
+
this._afterPortalAttached();
|
|
5250
|
+
return result;
|
|
5251
|
+
};
|
|
5252
|
+
// Use aria-live rather than a live role like 'alert' or 'status'
|
|
5253
|
+
// because NVDA and JAWS have show inconsistent behavior with live roles.
|
|
5254
|
+
if (snackBarConfig.politeness === 'assertive' &&
|
|
5255
|
+
!snackBarConfig.announcementMessage) {
|
|
5256
|
+
this._live = 'assertive';
|
|
5257
|
+
}
|
|
5258
|
+
else if (snackBarConfig.politeness === 'off') {
|
|
5259
|
+
this._live = 'off';
|
|
5260
|
+
}
|
|
5261
|
+
else {
|
|
5262
|
+
this._live = 'polite';
|
|
5263
|
+
}
|
|
5264
|
+
// Only set role for Firefox. Set role based on aria-live because setting role="alert" implies
|
|
5265
|
+
// aria-live="assertive" which may cause issues if aria-live is set to "polite" above.
|
|
5266
|
+
if (this._platform.FIREFOX) {
|
|
5267
|
+
if (this._live === 'polite') {
|
|
5268
|
+
this._role = 'status';
|
|
5269
|
+
}
|
|
5270
|
+
if (this._live === 'assertive') {
|
|
5271
|
+
this._role = 'alert';
|
|
5272
|
+
}
|
|
5273
|
+
}
|
|
5274
|
+
}
|
|
5275
|
+
/** Attach a component portal as content to this snack bar container. */
|
|
5276
|
+
attachComponentPortal(portal) {
|
|
5277
|
+
this.assertNotAttached();
|
|
5278
|
+
this.applySnackBarClasses();
|
|
5279
|
+
const result = this._portalOutlet.attachComponentPortal(portal);
|
|
5280
|
+
this._afterPortalAttached();
|
|
5281
|
+
return result;
|
|
5282
|
+
}
|
|
5283
|
+
/** Attach a template portal as content to this snack bar container. */
|
|
5284
|
+
attachTemplatePortal(portal) {
|
|
5285
|
+
this.assertNotAttached();
|
|
5286
|
+
this.applySnackBarClasses();
|
|
5287
|
+
const result = this._portalOutlet.attachTemplatePortal(portal);
|
|
5288
|
+
this._afterPortalAttached();
|
|
5289
|
+
return result;
|
|
5290
|
+
}
|
|
5291
|
+
/** Handle end of animations, updating the state of the snackbar. */
|
|
5292
|
+
onAnimationEnd(event) {
|
|
5293
|
+
const { fromState, toState } = event;
|
|
5294
|
+
if ((toState === 'void' && fromState !== 'void') || toState === 'hidden') {
|
|
5295
|
+
this.completeExit();
|
|
5296
|
+
}
|
|
5297
|
+
if (toState === 'visible') {
|
|
5298
|
+
// Note: we shouldn't use `this` inside the zone callback,
|
|
5299
|
+
// because it can cause a memory leak.
|
|
5300
|
+
const onEnter = this._onEnter;
|
|
5301
|
+
this._ngZone.run(() => {
|
|
5302
|
+
onEnter.next();
|
|
5303
|
+
onEnter.complete();
|
|
5304
|
+
});
|
|
5305
|
+
}
|
|
5306
|
+
}
|
|
5307
|
+
/** Begin animation of snack bar entrance into view. */
|
|
5308
|
+
enter() {
|
|
5309
|
+
if (!this._destroyed) {
|
|
5310
|
+
this._animationState = 'visible';
|
|
5311
|
+
this._changeDetectorRef.detectChanges();
|
|
5312
|
+
this.screenReaderAnnounce();
|
|
5313
|
+
}
|
|
5314
|
+
}
|
|
5315
|
+
/** Begin animation of the snack bar exiting from view. */
|
|
5316
|
+
exit() {
|
|
5317
|
+
// Note: this one transitions to `hidden`, rather than `void`, in order to handle the case
|
|
5318
|
+
// where multiple snack bars are opened in quick succession (e.g. two consecutive calls to
|
|
5319
|
+
// `MatSnackBar.open`).
|
|
5320
|
+
this._animationState = 'hidden';
|
|
5321
|
+
// Mark this element with an 'exit' attribute to indicate that the snackbar has
|
|
5322
|
+
// been dismissed and will soon be removed from the DOM. This is used by the snackbar
|
|
5323
|
+
// test harness.
|
|
5324
|
+
this._elementRef.nativeElement.setAttribute('mat-exit', '');
|
|
5325
|
+
// If the snack bar hasn't been announced by the time it exits it wouldn't have been open
|
|
5326
|
+
// long enough to visually read it either, so clear the timeout for announcing.
|
|
5327
|
+
clearTimeout(this._announceTimeoutId);
|
|
5328
|
+
return this._onExit;
|
|
5329
|
+
}
|
|
5330
|
+
/** Makes sure the exit callbacks have been invoked when the element is destroyed. */
|
|
5331
|
+
ngOnDestroy() {
|
|
5332
|
+
this._destroyed = true;
|
|
5333
|
+
this.completeExit();
|
|
5334
|
+
}
|
|
5335
|
+
/**
|
|
5336
|
+
* Waits for the zone to settle before removing the element. Helps prevent
|
|
5337
|
+
* errors where we end up removing an element which is in the middle of an animation.
|
|
5338
|
+
*/
|
|
5339
|
+
completeExit() {
|
|
5340
|
+
this._ngZone.onMicrotaskEmpty.pipe(take$1(1)).subscribe(() => {
|
|
5341
|
+
this._onExit.next();
|
|
5342
|
+
this._onExit.complete();
|
|
5343
|
+
});
|
|
5344
|
+
}
|
|
5345
|
+
/** Applies the various positioning and user-configured CSS classes to the snack bar. */
|
|
5346
|
+
applySnackBarClasses() {
|
|
5347
|
+
const element = this._elementRef.nativeElement;
|
|
5348
|
+
const panelClasses = this.snackBarConfig.panelClass;
|
|
5349
|
+
if (panelClasses) {
|
|
5350
|
+
if (Array.isArray(panelClasses)) {
|
|
5351
|
+
// Note that we can't use a spread here, because IE doesn't support multiple arguments.
|
|
5352
|
+
panelClasses.forEach(cssClass => element.classList.add(cssClass));
|
|
5353
|
+
}
|
|
5354
|
+
else {
|
|
5355
|
+
element.classList.add(panelClasses);
|
|
5356
|
+
}
|
|
5357
|
+
}
|
|
5358
|
+
if (this.snackBarConfig.horizontalPosition === 'center') {
|
|
5359
|
+
element.classList.add('bao-snack-bar-center');
|
|
5360
|
+
}
|
|
5361
|
+
if (this.snackBarConfig.verticalPosition === 'top') {
|
|
5362
|
+
element.classList.add('bao-snack-bar-top');
|
|
5363
|
+
}
|
|
5364
|
+
}
|
|
5365
|
+
/**
|
|
5366
|
+
* Called after the portal contents have been attached. Can be
|
|
5367
|
+
* used to modify the DOM once it's guaranteed to be in place.
|
|
5368
|
+
*/
|
|
5369
|
+
_afterPortalAttached() {
|
|
5370
|
+
const element = this._elementRef.nativeElement;
|
|
5371
|
+
const panelClasses = this.snackBarConfig.panelClass;
|
|
5372
|
+
if (panelClasses) {
|
|
5373
|
+
if (Array.isArray(panelClasses)) {
|
|
5374
|
+
// Note that we can't use a spread here, because IE doesn't support multiple arguments.
|
|
5375
|
+
panelClasses.forEach(cssClass => element.classList.add(cssClass));
|
|
5376
|
+
}
|
|
5377
|
+
else {
|
|
5378
|
+
element.classList.add(panelClasses);
|
|
5379
|
+
}
|
|
5380
|
+
}
|
|
5381
|
+
this._exposeToModals();
|
|
5382
|
+
}
|
|
5383
|
+
/**
|
|
5384
|
+
* Some browsers won't expose the accessibility node of the live element if there is an
|
|
5385
|
+
* `aria-modal` and the live element is outside of it. This method works around the issue by
|
|
5386
|
+
* pointing the `aria-owns` of all modals to the live element.
|
|
5387
|
+
*/
|
|
5388
|
+
_exposeToModals() {
|
|
5389
|
+
// Note that the selector here is limited to CDK overlays at the moment in order to reduce the
|
|
5390
|
+
// section of the DOM we need to look through. This should cover all the cases we support, but
|
|
5391
|
+
// the selector can be expanded if it turns out to be too narrow.
|
|
5392
|
+
const id = this._liveElementId;
|
|
5393
|
+
const modals = this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal="true"]');
|
|
5394
|
+
for (let i = 0; i < modals.length; i++) {
|
|
5395
|
+
const modal = modals[i];
|
|
5396
|
+
const ariaOwns = modal.getAttribute('aria-owns');
|
|
5397
|
+
this._trackedModals.add(modal);
|
|
5398
|
+
if (!ariaOwns) {
|
|
5399
|
+
modal.setAttribute('aria-owns', id);
|
|
5400
|
+
}
|
|
5401
|
+
else if (ariaOwns.indexOf(id) === -1) {
|
|
5402
|
+
modal.setAttribute('aria-owns', ariaOwns + ' ' + id);
|
|
5403
|
+
}
|
|
5404
|
+
}
|
|
5405
|
+
}
|
|
5406
|
+
/** Clears the references to the live element from any modals it was added to. */
|
|
5407
|
+
_clearFromModals() {
|
|
5408
|
+
this._trackedModals.forEach(modal => {
|
|
5409
|
+
const ariaOwns = modal.getAttribute('aria-owns');
|
|
5410
|
+
if (ariaOwns) {
|
|
5411
|
+
const newValue = ariaOwns.replace(this._liveElementId, '').trim();
|
|
5412
|
+
if (newValue.length > 0) {
|
|
5413
|
+
modal.setAttribute('aria-owns', newValue);
|
|
5414
|
+
}
|
|
5415
|
+
else {
|
|
5416
|
+
modal.removeAttribute('aria-owns');
|
|
5417
|
+
}
|
|
5418
|
+
}
|
|
5419
|
+
});
|
|
5420
|
+
this._trackedModals.clear();
|
|
5421
|
+
}
|
|
5422
|
+
/** Asserts that no content is already attached to the container. */
|
|
5423
|
+
assertNotAttached() {
|
|
5424
|
+
if (this._portalOutlet.hasAttached()) {
|
|
5425
|
+
throw Error('Attempting to attach snack bar content after content is already attached');
|
|
5426
|
+
}
|
|
5427
|
+
}
|
|
5428
|
+
/**
|
|
5429
|
+
* Starts a timeout to move the snack bar content to the live region so screen readers will
|
|
5430
|
+
* announce it.
|
|
5431
|
+
*/
|
|
5432
|
+
screenReaderAnnounce() {
|
|
5433
|
+
if (!this._announceTimeoutId) {
|
|
5434
|
+
this._ngZone.runOutsideAngular(() => {
|
|
5435
|
+
this._announceTimeoutId = window.setTimeout(() => {
|
|
5436
|
+
const inertElement = this._elementRef.nativeElement.querySelector('[aria-hidden]');
|
|
5437
|
+
const liveElement = this._elementRef.nativeElement.querySelector('[aria-live]');
|
|
5438
|
+
if (inertElement && liveElement) {
|
|
5439
|
+
// If an element in the snack bar content is focused before being moved
|
|
5440
|
+
// track it and restore focus after moving to the live region.
|
|
5441
|
+
let focusedElement = null;
|
|
5442
|
+
if (this._platform.isBrowser &&
|
|
5443
|
+
document.activeElement instanceof HTMLElement &&
|
|
5444
|
+
inertElement.contains(document.activeElement)) {
|
|
5445
|
+
focusedElement = document.activeElement;
|
|
5446
|
+
}
|
|
5447
|
+
inertElement.removeAttribute('aria-hidden');
|
|
5448
|
+
liveElement.appendChild(inertElement);
|
|
5449
|
+
focusedElement?.focus();
|
|
5450
|
+
this._onAnnounce.next();
|
|
5451
|
+
this._onAnnounce.complete();
|
|
5452
|
+
}
|
|
5453
|
+
}, this._announceDelay);
|
|
5454
|
+
});
|
|
5455
|
+
}
|
|
5456
|
+
}
|
|
5457
|
+
}
|
|
5458
|
+
BaoSnackBarContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarContainerComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$5.Platform }, { token: BaoSnackBarConfig }], target: i0.ɵɵFactoryTarget.Component });
|
|
5459
|
+
BaoSnackBarContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: BaoSnackBarContainerComponent, selector: "bao-snack-bar-container", host: { listeners: { "@state.done": "onAnimationEnd($event)" }, properties: { "@state": "_animationState" }, classAttribute: "bao-snack-bar-container" }, viewQueries: [{ propertyName: "_portalOutlet", first: true, predicate: CdkPortalOutlet, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<!-- Initialy holds the snack bar content, will be empty after announcing to screen readers. -->\n<div aria-hidden=\"true\">\n <ng-template cdkPortalOutlet></ng-template>\n</div>\n\n<!-- Will receive the snack bar content from the non-live div, move will happen a short delay after opening -->\n<div\n [attr.aria-live]=\"_live\"\n [attr.role]=\"_role\"\n [attr.id]=\"_liveElementId\"\n></div>\n", styles: [".bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.cdk-overlay-pane{width:100%}@media (min-width: 768px){.cdk-overlay-pane{margin:0;width:auto}}.bao-snack-bar-container{border-radius:.25rem;box-sizing:border-box;display:block;margin:1rem;max-width:100vw;min-width:15rem;min-height:3rem;transform-origin:center;width:100%}\n"], directives: [{ type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], animations: [matSnackBarAnimations.snackBarState], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
|
|
5460
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarContainerComponent, decorators: [{
|
|
5461
|
+
type: Component,
|
|
5462
|
+
args: [{ selector: 'bao-snack-bar-container', changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.None, animations: [matSnackBarAnimations.snackBarState], host: {
|
|
5463
|
+
class: 'bao-snack-bar-container',
|
|
5464
|
+
'[@state]': '_animationState',
|
|
5465
|
+
'(@state.done)': 'onAnimationEnd($event)'
|
|
5466
|
+
}, template: "<!-- Initialy holds the snack bar content, will be empty after announcing to screen readers. -->\n<div aria-hidden=\"true\">\n <ng-template cdkPortalOutlet></ng-template>\n</div>\n\n<!-- Will receive the snack bar content from the non-live div, move will happen a short delay after opening -->\n<div\n [attr.aria-live]=\"_live\"\n [attr.role]=\"_role\"\n [attr.id]=\"_liveElementId\"\n></div>\n", styles: [".bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.cdk-overlay-pane{width:100%}@media (min-width: 768px){.cdk-overlay-pane{margin:0;width:auto}}.bao-snack-bar-container{border-radius:.25rem;box-sizing:border-box;display:block;margin:1rem;max-width:100vw;min-width:15rem;min-height:3rem;transform-origin:center;width:100%}\n"] }]
|
|
5467
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$5.Platform }, { type: BaoSnackBarConfig }]; }, propDecorators: { _portalOutlet: [{
|
|
5468
|
+
type: ViewChild,
|
|
5469
|
+
args: [CdkPortalOutlet, { static: true }]
|
|
5470
|
+
}] } });
|
|
5471
|
+
|
|
5472
|
+
function baoFactory() {
|
|
5473
|
+
return new BaoSnackBarConfig();
|
|
5474
|
+
}
|
|
5475
|
+
/** Injection token that can be used to specify default snack bar. */
|
|
5476
|
+
const BAO_SNACK_BAR_DEFAULT_OPTIONS = new InjectionToken('bao-snack-bar-default-options', {
|
|
5477
|
+
providedIn: 'root',
|
|
5478
|
+
factory: baoFactory
|
|
5479
|
+
});
|
|
5480
|
+
/**
|
|
5481
|
+
* Service to dispatch Material Design snack bar messages.
|
|
5482
|
+
*/
|
|
5483
|
+
class BaoSnackBarService {
|
|
5484
|
+
constructor(_overlay, _live, _injector, _parentSnackBar, _defaultConfig) {
|
|
5485
|
+
this._overlay = _overlay;
|
|
5486
|
+
this._live = _live;
|
|
5487
|
+
this._injector = _injector;
|
|
5488
|
+
this._parentSnackBar = _parentSnackBar;
|
|
5489
|
+
this._defaultConfig = _defaultConfig;
|
|
5490
|
+
/** The component that should be rendered as the snack bar's simple component. */
|
|
5491
|
+
this.simpleSnackBarComponent = BaoSimpleSnackBarComponent;
|
|
5492
|
+
/** The container component that attaches the provided template or component. */
|
|
5493
|
+
this.snackBarContainerComponent = BaoSnackBarContainerComponent;
|
|
5494
|
+
/**
|
|
5495
|
+
* Reference to the current snack bar in the view *at this level* (in the Angular injector tree).
|
|
5496
|
+
* If there is a parent snack-bar service, all operations should delegate to that parent
|
|
5497
|
+
* via `_openedSnackBarRef`.
|
|
5498
|
+
*/
|
|
5499
|
+
this._snackBarRefAtThisLevel = null;
|
|
5500
|
+
}
|
|
5501
|
+
/** Reference to the currently opened snackbar at *any* level. */
|
|
5502
|
+
get _openedSnackBarRef() {
|
|
5503
|
+
const parent = this._parentSnackBar;
|
|
5504
|
+
return parent ? parent._openedSnackBarRef : this._snackBarRefAtThisLevel;
|
|
5505
|
+
}
|
|
5506
|
+
set _openedSnackBarRef(value) {
|
|
5507
|
+
if (this._parentSnackBar) {
|
|
5508
|
+
this._parentSnackBar._openedSnackBarRef = value;
|
|
5509
|
+
}
|
|
5510
|
+
else {
|
|
5511
|
+
this._snackBarRefAtThisLevel = value;
|
|
5512
|
+
}
|
|
5513
|
+
}
|
|
5514
|
+
/**
|
|
5515
|
+
* Creates and dispatches a snack bar with a custom component for the content, removing any
|
|
5516
|
+
* currently opened snack bars.
|
|
5517
|
+
*
|
|
5518
|
+
* @param component Component to be instantiated.
|
|
5519
|
+
* @param config Extra configuration for the snack bar.
|
|
5520
|
+
*/
|
|
5521
|
+
openFromComponent(component, config) {
|
|
5522
|
+
return this.attach(component, config);
|
|
5523
|
+
}
|
|
5524
|
+
/**
|
|
5525
|
+
* Creates and dispatches a snack bar with a custom template for the content, removing any
|
|
5526
|
+
* currently opened snack bars.
|
|
5527
|
+
*
|
|
5528
|
+
* @param template Template to be instantiated.
|
|
5529
|
+
* @param config Extra configuration for the snack bar.
|
|
5530
|
+
*/
|
|
5531
|
+
openFromTemplate(template, config) {
|
|
5532
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
5533
|
+
return this.attach(template, config);
|
|
5534
|
+
}
|
|
5535
|
+
/**
|
|
5536
|
+
* Opens a snackbar with a message and an optional action.
|
|
5537
|
+
* @param message The message to show in the snackbar.
|
|
5538
|
+
* @param toastType The type of of toast to display the snackbar.
|
|
5539
|
+
* @param actionLabelOrIcon The label or icon for the snackbar action.
|
|
5540
|
+
* @param showClose If true, the snackbar will require user interaction to close.
|
|
5541
|
+
* @param config Additional configuration options for the snackbar.
|
|
5542
|
+
*/
|
|
5543
|
+
open(config) {
|
|
5544
|
+
const _config = { ...this._defaultConfig, ...config };
|
|
5545
|
+
// Since the user doesn't have access to the component, we can
|
|
5546
|
+
// override the data to pass in our own message, action and type.
|
|
5547
|
+
_config.data = {
|
|
5548
|
+
message: _config.message,
|
|
5549
|
+
toastType: _config.toastType,
|
|
5550
|
+
actionLabelOrIcon: _config.actionLabelOrIcon,
|
|
5551
|
+
showClose: _config.showClose
|
|
5552
|
+
};
|
|
5553
|
+
if (_config.showClose)
|
|
5554
|
+
_config.duration = 0;
|
|
5555
|
+
if (!_config.announcementMessage) {
|
|
5556
|
+
_config.announcementMessage = _config.message;
|
|
5557
|
+
}
|
|
5558
|
+
return this.openFromComponent(this.simpleSnackBarComponent, _config);
|
|
5559
|
+
}
|
|
5560
|
+
/**
|
|
5561
|
+
* Dismisses the currently-visible snack bar.
|
|
5562
|
+
*/
|
|
5563
|
+
dismiss() {
|
|
5564
|
+
if (this._openedSnackBarRef) {
|
|
5565
|
+
this._openedSnackBarRef.dismiss();
|
|
5566
|
+
}
|
|
5567
|
+
}
|
|
5568
|
+
ngOnDestroy() {
|
|
5569
|
+
// Only dismiss the snack bar at the current level on destroy.
|
|
5570
|
+
if (this._snackBarRefAtThisLevel) {
|
|
5571
|
+
this._snackBarRefAtThisLevel.dismiss();
|
|
5572
|
+
}
|
|
5573
|
+
}
|
|
5574
|
+
/**
|
|
5575
|
+
* Attaches the snack bar container component to the overlay.
|
|
5576
|
+
*/
|
|
5577
|
+
attachSnackBarContainer(overlayRef, config) {
|
|
5578
|
+
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
|
|
5579
|
+
const injector = new PortalInjector(userInjector || this._injector, new WeakMap([[BaoSnackBarConfig, config]]));
|
|
5580
|
+
const containerPortal = new ComponentPortal(this.snackBarContainerComponent, config.viewContainerRef, injector);
|
|
5581
|
+
const containerRef = overlayRef.attach(containerPortal);
|
|
5582
|
+
containerRef.instance.snackBarConfig = config;
|
|
5583
|
+
return containerRef.instance;
|
|
5584
|
+
}
|
|
5585
|
+
/**
|
|
5586
|
+
* Places a new component or a template as the content of the snack bar container.
|
|
5587
|
+
*/
|
|
5588
|
+
attach(content, userConfig) {
|
|
5589
|
+
const config = {
|
|
5590
|
+
...new BaoSnackBarConfig(),
|
|
5591
|
+
...this._defaultConfig,
|
|
5592
|
+
...userConfig
|
|
5593
|
+
};
|
|
5594
|
+
const overlayRef = this.createOverlay(config);
|
|
5595
|
+
const container = this.attachSnackBarContainer(overlayRef, config);
|
|
5596
|
+
const snackBarRef = new BaoSnackBarRef(container, overlayRef);
|
|
5597
|
+
if (content instanceof TemplateRef) {
|
|
5598
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
5599
|
+
const portal = new TemplatePortal(content, null, {
|
|
5600
|
+
$implicit: config.data,
|
|
5601
|
+
snackBarRef
|
|
5602
|
+
});
|
|
5603
|
+
snackBarRef.instance = container.attachTemplatePortal(portal);
|
|
5604
|
+
}
|
|
5605
|
+
else {
|
|
5606
|
+
const injector = this.createInjector(config, snackBarRef);
|
|
5607
|
+
const portal = new ComponentPortal(content, undefined, injector);
|
|
5608
|
+
const contentRef = container.attachComponentPortal(portal);
|
|
5609
|
+
// We can't pass this via the injector, because the injector is created earlier.
|
|
5610
|
+
snackBarRef.instance = contentRef.instance;
|
|
5611
|
+
}
|
|
5612
|
+
this.animateSnackBar(snackBarRef, config);
|
|
5613
|
+
this._openedSnackBarRef = snackBarRef;
|
|
5614
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
5615
|
+
return this._openedSnackBarRef;
|
|
5616
|
+
}
|
|
5617
|
+
/** Animates the old snack bar out and the new one in. */
|
|
5618
|
+
animateSnackBar(snackBarRef, config) {
|
|
5619
|
+
// When the snackbar is dismissed, clear the reference to it.
|
|
5620
|
+
snackBarRef.afterDismissed().subscribe(() => {
|
|
5621
|
+
// Clear the snackbar ref if it hasn't already been replaced by a newer snackbar.
|
|
5622
|
+
// eslint-disable-next-line eqeqeq
|
|
5623
|
+
if (this._openedSnackBarRef == snackBarRef) {
|
|
5624
|
+
this._openedSnackBarRef = null;
|
|
5625
|
+
}
|
|
5626
|
+
if (config.announcementMessage) {
|
|
5627
|
+
this._live.clear();
|
|
5628
|
+
}
|
|
5629
|
+
});
|
|
5630
|
+
if (this._openedSnackBarRef) {
|
|
5631
|
+
// If a snack bar is already in view, dismiss it and enter the
|
|
5632
|
+
// new snack bar after exit animation is complete.
|
|
5633
|
+
this._openedSnackBarRef.afterDismissed().subscribe(() => {
|
|
5634
|
+
snackBarRef.containerInstance.enter();
|
|
5635
|
+
});
|
|
5636
|
+
this._openedSnackBarRef.dismiss();
|
|
5637
|
+
}
|
|
5638
|
+
else {
|
|
5639
|
+
// If no snack bar is in view, enter the new snack bar.
|
|
5640
|
+
snackBarRef.containerInstance.enter();
|
|
5641
|
+
}
|
|
5642
|
+
// If a dismiss timeout is provided, set up dismiss based on after the snackbar is opened.
|
|
5643
|
+
if (config.duration && config.duration > 0) {
|
|
5644
|
+
snackBarRef
|
|
5645
|
+
.afterOpened()
|
|
5646
|
+
.subscribe(() => snackBarRef.dismissAfter(config.duration));
|
|
5647
|
+
}
|
|
5648
|
+
if (config.announcementMessage) {
|
|
5649
|
+
void this._live.announce(config.announcementMessage, config.politeness);
|
|
5650
|
+
}
|
|
5651
|
+
}
|
|
5652
|
+
/**
|
|
5653
|
+
* Creates a new overlay and places it in the correct location.
|
|
5654
|
+
* @param config The user-specified snack bar config.
|
|
5655
|
+
*/
|
|
5656
|
+
createOverlay(config) {
|
|
5657
|
+
const overlayConfig = new OverlayConfig();
|
|
5658
|
+
overlayConfig.direction = config.direction;
|
|
5659
|
+
const positionStrategy = this._overlay.position().global();
|
|
5660
|
+
// Set horizontal position.
|
|
5661
|
+
const isRtl = config.direction === 'rtl';
|
|
5662
|
+
const isLeft = config.horizontalPosition === 'left' ||
|
|
5663
|
+
(config.horizontalPosition === 'start' && !isRtl) ||
|
|
5664
|
+
(config.horizontalPosition === 'end' && isRtl);
|
|
5665
|
+
const isRight = !isLeft && config.horizontalPosition !== 'center';
|
|
5666
|
+
if (isLeft) {
|
|
5667
|
+
positionStrategy.left('0');
|
|
5668
|
+
}
|
|
5669
|
+
else if (isRight) {
|
|
5670
|
+
positionStrategy.right('0');
|
|
5671
|
+
}
|
|
5672
|
+
else {
|
|
5673
|
+
positionStrategy.centerHorizontally();
|
|
5674
|
+
}
|
|
5675
|
+
// Set horizontal position.
|
|
5676
|
+
if (config.verticalPosition === 'top') {
|
|
5677
|
+
positionStrategy.top('0');
|
|
5678
|
+
}
|
|
5679
|
+
else {
|
|
5680
|
+
positionStrategy.bottom('0');
|
|
5681
|
+
}
|
|
5682
|
+
overlayConfig.positionStrategy = positionStrategy;
|
|
5683
|
+
return this._overlay.create(overlayConfig);
|
|
5684
|
+
}
|
|
5685
|
+
/**
|
|
5686
|
+
* Creates an injector to be used inside of a snack bar component.
|
|
5687
|
+
* @param config Config that was used to create the snack bar.
|
|
5688
|
+
* @param snackBarRef Reference to the snack bar.
|
|
5689
|
+
*/
|
|
5690
|
+
createInjector(config, snackBarRef) {
|
|
5691
|
+
const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector;
|
|
5692
|
+
return new PortalInjector(userInjector || this._injector, new WeakMap([
|
|
5693
|
+
[BaoSnackBarRef, snackBarRef],
|
|
5694
|
+
[BAO_SNACK_BAR_DATA, config.data]
|
|
5695
|
+
]));
|
|
5696
|
+
}
|
|
5697
|
+
}
|
|
5698
|
+
BaoSnackBarService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarService, deps: [{ token: i1$4.Overlay }, { token: i1$3.LiveAnnouncer }, { token: i0.Injector }, { token: BaoSnackBarService, optional: true, skipSelf: true }, { token: BAO_SNACK_BAR_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
5699
|
+
BaoSnackBarService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarService, providedIn: 'root' });
|
|
5700
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarService, decorators: [{
|
|
5701
|
+
type: Injectable,
|
|
5702
|
+
args: [{ providedIn: 'root' }]
|
|
5703
|
+
}], ctorParameters: function () { return [{ type: i1$4.Overlay }, { type: i1$3.LiveAnnouncer }, { type: i0.Injector }, { type: BaoSnackBarService, decorators: [{
|
|
5704
|
+
type: Optional
|
|
5705
|
+
}, {
|
|
5706
|
+
type: SkipSelf
|
|
5707
|
+
}] }, { type: BaoSnackBarConfig, decorators: [{
|
|
5708
|
+
type: Inject,
|
|
5709
|
+
args: [BAO_SNACK_BAR_DEFAULT_OPTIONS]
|
|
5710
|
+
}] }]; } });
|
|
5711
|
+
|
|
5712
|
+
/*
|
|
5713
|
+
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
5714
|
+
* Licensed under the MIT license.
|
|
5715
|
+
* See LICENSE file in the project root for full license information.
|
|
5716
|
+
*/
|
|
5717
|
+
const SNACKBAR_DIRECTIVES = [
|
|
5718
|
+
BaoSimpleSnackBarComponent,
|
|
5719
|
+
BaoSnackBarContainerComponent
|
|
5720
|
+
];
|
|
5721
|
+
class BaoSnackBarModule {
|
|
5722
|
+
}
|
|
5723
|
+
BaoSnackBarModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
5724
|
+
BaoSnackBarModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarModule, declarations: [BaoSimpleSnackBarComponent,
|
|
5725
|
+
BaoSnackBarContainerComponent], imports: [CommonModule,
|
|
5726
|
+
OverlayModule,
|
|
5727
|
+
PortalModule,
|
|
5728
|
+
BaoButtonModule,
|
|
5729
|
+
BaoIconModule], exports: [BaoSimpleSnackBarComponent,
|
|
5730
|
+
BaoSnackBarContainerComponent] });
|
|
5731
|
+
BaoSnackBarModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarModule, providers: [BaoSnackBarService, BaoSnackBarConfig], imports: [[
|
|
5732
|
+
CommonModule,
|
|
5733
|
+
OverlayModule,
|
|
5734
|
+
PortalModule,
|
|
5735
|
+
BaoButtonModule,
|
|
5736
|
+
BaoIconModule
|
|
5737
|
+
]] });
|
|
5738
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSnackBarModule, decorators: [{
|
|
5739
|
+
type: NgModule,
|
|
5740
|
+
args: [{
|
|
5741
|
+
imports: [
|
|
5742
|
+
CommonModule,
|
|
5743
|
+
OverlayModule,
|
|
5744
|
+
PortalModule,
|
|
5745
|
+
BaoButtonModule,
|
|
5746
|
+
BaoIconModule
|
|
5747
|
+
],
|
|
5748
|
+
providers: [BaoSnackBarService, BaoSnackBarConfig],
|
|
5749
|
+
declarations: SNACKBAR_DIRECTIVES,
|
|
5750
|
+
exports: SNACKBAR_DIRECTIVES,
|
|
5751
|
+
entryComponents: [SNACKBAR_DIRECTIVES]
|
|
5752
|
+
}]
|
|
5753
|
+
}] });
|
|
5754
|
+
|
|
5755
|
+
/*
|
|
5756
|
+
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
5757
|
+
* Licensed under the MIT license.
|
|
5758
|
+
* See LICENSE file in the project root for full license information.
|
|
5759
|
+
*/
|
|
5760
|
+
const Breakpoints = {
|
|
5761
|
+
XSmall: '(max-width: 575.98px)',
|
|
5762
|
+
Small: '(min-width: 576px) and (max-width: 767.98px)',
|
|
5763
|
+
Medium: '(min-width: 768px) and (max-width: 991.98px)',
|
|
5764
|
+
Large: '(min-width: 992px) and (max-width: 1199.98px)',
|
|
5765
|
+
XLarge: '(min-width: 1200px)'
|
|
5766
|
+
};
|
|
5767
|
+
|
|
5768
|
+
/*
|
|
5769
|
+
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
5770
|
+
* Licensed under the MIT license.
|
|
5771
|
+
* See LICENSE file in the project root for full license information.
|
|
5772
|
+
*/
|
|
5773
|
+
|
|
5774
|
+
/**
|
|
5775
|
+
* This component is dynamically added to replace breadcrumb when System Header is viewed on tablet or mobile screens.
|
|
5776
|
+
* Used internally by BaoSystemHeaderComponent only, not to be used by host application.
|
|
5777
|
+
*/
|
|
5778
|
+
class BaoBackNavigationComponent {
|
|
5779
|
+
constructor(renderer, elementRef) {
|
|
5780
|
+
this.renderer = renderer;
|
|
5781
|
+
this.elementRef = elementRef;
|
|
5782
|
+
}
|
|
5783
|
+
ngOnChanges(changes) {
|
|
5784
|
+
if (changes['link'] && changes['link'].currentValue) {
|
|
5785
|
+
this.renderer.setAttribute(this.elementRef.nativeElement.children[0], 'href', changes['link'].currentValue);
|
|
5786
|
+
}
|
|
5787
|
+
}
|
|
5788
|
+
}
|
|
5789
|
+
BaoBackNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoBackNavigationComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
5790
|
+
BaoBackNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: BaoBackNavigationComponent, selector: "bao-back-navigation-component", inputs: { link: "link" }, host: { classAttribute: "bao-system-header-back-button" }, usesOnChanges: true, ngImport: i0, template: ` <a>
|
|
5791
|
+
<bao-icon
|
|
5792
|
+
color="action"
|
|
5793
|
+
title="arrow-left"
|
|
5794
|
+
svgIcon="icon-arrow-left"
|
|
5795
|
+
size="x-small"
|
|
5796
|
+
></bao-icon>
|
|
5797
|
+
</a>`, isInline: true, components: [{ type: BaoIconComponent, selector: "bao-icon", inputs: ["color", "size", "svgIcon", "title"], exportAs: ["baoIcon"] }] });
|
|
5798
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoBackNavigationComponent, decorators: [{
|
|
5799
|
+
type: Component,
|
|
5800
|
+
args: [{
|
|
5801
|
+
selector: 'bao-back-navigation-component',
|
|
5802
|
+
template: ` <a>
|
|
5803
|
+
<bao-icon
|
|
5804
|
+
color="action"
|
|
5805
|
+
title="arrow-left"
|
|
5806
|
+
svgIcon="icon-arrow-left"
|
|
5807
|
+
size="x-small"
|
|
5808
|
+
></bao-icon>
|
|
5809
|
+
</a>`,
|
|
5810
|
+
host: {
|
|
5811
|
+
class: 'bao-system-header-back-button'
|
|
5812
|
+
}
|
|
5813
|
+
}]
|
|
5814
|
+
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { link: [{
|
|
5815
|
+
type: Input
|
|
5816
|
+
}] } });
|
|
5817
|
+
/**
|
|
5818
|
+
* This directive is to mark the template where the BaoBackNavigationComponent should be dynamically inserted,
|
|
5819
|
+
* when a Breadcrumb component needs to be replaced
|
|
5820
|
+
*/
|
|
5821
|
+
class BaoBackNavigationInsert {
|
|
5822
|
+
constructor(viewContainerRef) {
|
|
5823
|
+
this.viewContainerRef = viewContainerRef;
|
|
5824
|
+
}
|
|
5825
|
+
}
|
|
5826
|
+
BaoBackNavigationInsert.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoBackNavigationInsert, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
5827
|
+
BaoBackNavigationInsert.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: BaoBackNavigationInsert, selector: "[backNavigationInsert]", ngImport: i0 });
|
|
5828
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoBackNavigationInsert, decorators: [{
|
|
5829
|
+
type: Directive,
|
|
5830
|
+
args: [{
|
|
5831
|
+
selector: '[backNavigationInsert]'
|
|
5832
|
+
}]
|
|
5833
|
+
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }]; } });
|
|
5834
|
+
class BaoSystemHeaderComponent {
|
|
5835
|
+
constructor(breakpointObserver, renderer) {
|
|
5836
|
+
this.breakpointObserver = breakpointObserver;
|
|
5837
|
+
this.renderer = renderer;
|
|
5838
|
+
this.screenType = 'desktop';
|
|
5839
|
+
}
|
|
5840
|
+
get textContainerChildren() {
|
|
5841
|
+
return Array.from(this.textContainer.nativeElement.children);
|
|
5842
|
+
}
|
|
5843
|
+
ngOnInit() {
|
|
5844
|
+
if ([Breakpoints.XSmall, Breakpoints.Small].some(size => this.breakpointObserver.isMatched(size))) {
|
|
5845
|
+
this.screenType = 'mobile';
|
|
5846
|
+
}
|
|
5847
|
+
else if (this.breakpointObserver.isMatched(Breakpoints.Medium)) {
|
|
5848
|
+
this.screenType = 'tablet';
|
|
5849
|
+
}
|
|
5850
|
+
else if ([Breakpoints.Large, Breakpoints.XLarge].some(size => this.breakpointObserver.isMatched(size))) {
|
|
5851
|
+
this.screenType = 'desktop';
|
|
5852
|
+
}
|
|
5853
|
+
}
|
|
5854
|
+
ngAfterViewInit() {
|
|
5855
|
+
this.formatNavigation();
|
|
5856
|
+
this.applySizeClass();
|
|
5857
|
+
}
|
|
5858
|
+
formatNavigation() {
|
|
5859
|
+
// If view is rendered on a mobile/tablet screen
|
|
5860
|
+
if (this.screenType == 'mobile' || this.screenType == 'tablet') {
|
|
5861
|
+
if (this.textContainerChildren[0].className == 'bao-breadcrumb') {
|
|
5862
|
+
// Retrieve link of parent page
|
|
5863
|
+
const breadcrumbElementsList = this.textContainerChildren[0].children[0];
|
|
5864
|
+
const breadcrumbLength = breadcrumbElementsList.children.length;
|
|
5865
|
+
const parentLink = breadcrumbElementsList.children[breadcrumbLength - 2].attributes['href'].value;
|
|
5866
|
+
// Remove Breadcrumb component and replace it with back button
|
|
5867
|
+
this.renderer.removeChild(this.textContainer.nativeElement, this.textContainerChildren[0]);
|
|
5868
|
+
const viewContainerRef = this.backButtonInsert.viewContainerRef;
|
|
5869
|
+
viewContainerRef.clear();
|
|
5870
|
+
const componentRef = viewContainerRef.createComponent(BaoBackNavigationComponent);
|
|
5871
|
+
componentRef.instance.link = parentLink;
|
|
5872
|
+
}
|
|
5873
|
+
}
|
|
5874
|
+
}
|
|
5875
|
+
applySizeClass() {
|
|
5876
|
+
const tagInfoContainer = this.textContainer.nativeElement.childNodes[this.textContainerChildren.length - 1];
|
|
5877
|
+
if (this.screenType === 'mobile') {
|
|
5878
|
+
this.renderer.addClass(tagInfoContainer, 'mobile');
|
|
5879
|
+
}
|
|
5880
|
+
}
|
|
5881
|
+
}
|
|
5882
|
+
BaoSystemHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSystemHeaderComponent, deps: [{ token: i2$1.BreakpointObserver }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
5883
|
+
BaoSystemHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: BaoSystemHeaderComponent, selector: "bao-system-header", host: { classAttribute: "bao-system-header" }, viewQueries: [{ propertyName: "textContainer", first: true, predicate: ["textContainer"], descendants: true }, { propertyName: "backButtonInsert", first: true, predicate: BaoBackNavigationInsert, descendants: true, static: true }], ngImport: i0, template: "<div class=\"left-side-content\">\n <div class=\"back-navigation-container\">\n <ng-content select=\"a\"></ng-content>\n <ng-template backNavigationInsert></ng-template>\n </div>\n <div #textContainer class=\"text-content\">\n <ng-content select=\"bao-breadcrumb\"></ng-content>\n <ng-content select=\"h1\"></ng-content>\n <div class=\"tag-info-container\">\n <ng-content select=\"bao-tag\"></ng-content>\n <span class=\"additional-info\">\n <ng-content select=\"span\"></ng-content>\n </span>\n </div>\n </div>\n</div>\n<div class=\"button-container\">\n <ng-content></ng-content>\n</div>\n", styles: ["@charset \"UTF-8\";.bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.bao-system-header{display:flex;justify-content:flex-start}.bao-system-header .left-side-content{display:inline-flex;width:75%}.bao-system-header .left-side-content .back-navigation-container a{margin-right:1.25rem;border-bottom:none}.bao-system-header .left-side-content .back-navigation-container a:hover{cursor:pointer}.bao-system-header .left-side-content .text-content{width:100%}.bao-system-header .left-side-content .text-content h1{font-weight:700;color:#212529;font-size:1.5rem;line-height:2rem;margin-bottom:.5rem}.bao-system-header .left-side-content .text-content .tag-info-container{width:100%;display:block}.bao-system-header .left-side-content .text-content .tag-info-container>span:nth-child(2):before{content:\"\\b7\";margin:0 .5rem}.bao-system-header .left-side-content .text-content .tag-info-container .additional-info>*{font-weight:400;font-size:.875rem;line-height:1.25rem}.bao-system-header .left-side-content .text-content .tag-info-container.mobile .bao-tag{margin-bottom:.25rem}.bao-system-header .left-side-content .text-content .tag-info-container.mobile .additional-info{display:block}.bao-system-header .left-side-content .text-content .tag-info-container.mobile .additional-info:before{content:none}.bao-system-header .left-side-content .text-content .tag-info-container>.bao-tag{max-width:100%}.bao-system-header .left-side-content .text-content .tag-info-container>.bao-tag>span{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bao-system-header .button-container{flex-shrink:0;margin-left:auto}.bao-system-header .button-container .bao-button{margin-left:1rem}\n"], directives: [{ type: BaoBackNavigationInsert, selector: "[backNavigationInsert]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
5884
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSystemHeaderComponent, decorators: [{
|
|
5885
|
+
type: Component,
|
|
5886
|
+
args: [{ selector: 'bao-system-header', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
5887
|
+
class: 'bao-system-header'
|
|
5888
|
+
}, template: "<div class=\"left-side-content\">\n <div class=\"back-navigation-container\">\n <ng-content select=\"a\"></ng-content>\n <ng-template backNavigationInsert></ng-template>\n </div>\n <div #textContainer class=\"text-content\">\n <ng-content select=\"bao-breadcrumb\"></ng-content>\n <ng-content select=\"h1\"></ng-content>\n <div class=\"tag-info-container\">\n <ng-content select=\"bao-tag\"></ng-content>\n <span class=\"additional-info\">\n <ng-content select=\"span\"></ng-content>\n </span>\n </div>\n </div>\n</div>\n<div class=\"button-container\">\n <ng-content></ng-content>\n</div>\n", styles: ["@charset \"UTF-8\";.bao-container{padding-right:16px;padding-left:16px;margin-right:auto;margin-left:auto;width:100%}@media (min-width: 576px){.bao-container{max-width:576px}}@media (min-width: 768px){.bao-container{max-width:768px}}@media (min-width: 992px){.bao-container{max-width:992px}}@media (min-width: 1200px){.bao-container{max-width:1200px}}.bao-row{display:flex;flex-wrap:wrap;margin-right:-16px;margin-left:-16px}.bao-col-12,.bao-col-lg-7{position:relative;width:100%;padding-right:1rem;padding-left:1rem}@media (min-width: 992px){.bao-col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}}.bao-system-header{display:flex;justify-content:flex-start}.bao-system-header .left-side-content{display:inline-flex;width:75%}.bao-system-header .left-side-content .back-navigation-container a{margin-right:1.25rem;border-bottom:none}.bao-system-header .left-side-content .back-navigation-container a:hover{cursor:pointer}.bao-system-header .left-side-content .text-content{width:100%}.bao-system-header .left-side-content .text-content h1{font-weight:700;color:#212529;font-size:1.5rem;line-height:2rem;margin-bottom:.5rem}.bao-system-header .left-side-content .text-content .tag-info-container{width:100%;display:block}.bao-system-header .left-side-content .text-content .tag-info-container>span:nth-child(2):before{content:\"\\b7\";margin:0 .5rem}.bao-system-header .left-side-content .text-content .tag-info-container .additional-info>*{font-weight:400;font-size:.875rem;line-height:1.25rem}.bao-system-header .left-side-content .text-content .tag-info-container.mobile .bao-tag{margin-bottom:.25rem}.bao-system-header .left-side-content .text-content .tag-info-container.mobile .additional-info{display:block}.bao-system-header .left-side-content .text-content .tag-info-container.mobile .additional-info:before{content:none}.bao-system-header .left-side-content .text-content .tag-info-container>.bao-tag{max-width:100%}.bao-system-header .left-side-content .text-content .tag-info-container>.bao-tag>span{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bao-system-header .button-container{flex-shrink:0;margin-left:auto}.bao-system-header .button-container .bao-button{margin-left:1rem}\n"] }]
|
|
5889
|
+
}], ctorParameters: function () { return [{ type: i2$1.BreakpointObserver }, { type: i0.Renderer2 }]; }, propDecorators: { textContainer: [{
|
|
5890
|
+
type: ViewChild,
|
|
5891
|
+
args: ['textContainer', { static: false }]
|
|
5892
|
+
}], backButtonInsert: [{
|
|
5893
|
+
type: ViewChild,
|
|
5894
|
+
args: [BaoBackNavigationInsert, { static: true }]
|
|
5895
|
+
}] } });
|
|
5896
|
+
|
|
5897
|
+
/*
|
|
5898
|
+
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
5899
|
+
* Licensed under the MIT license.
|
|
5900
|
+
* See LICENSE file in the project root for full license information.
|
|
5901
|
+
*/
|
|
5902
|
+
const SYSTEM_HEADER_DIRECTIVES = [
|
|
5903
|
+
BaoSystemHeaderComponent,
|
|
5904
|
+
BaoBackNavigationInsert,
|
|
5905
|
+
BaoBackNavigationComponent
|
|
5906
|
+
];
|
|
5907
|
+
class BaoSystemHeaderModule {
|
|
5908
|
+
}
|
|
5909
|
+
BaoSystemHeaderModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSystemHeaderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
5910
|
+
BaoSystemHeaderModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSystemHeaderModule, declarations: [BaoSystemHeaderComponent,
|
|
5911
|
+
BaoBackNavigationInsert,
|
|
5912
|
+
BaoBackNavigationComponent], imports: [CommonModule, BaoIconModule], exports: [BaoSystemHeaderComponent,
|
|
5913
|
+
BaoBackNavigationInsert,
|
|
5914
|
+
BaoBackNavigationComponent] });
|
|
5915
|
+
BaoSystemHeaderModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSystemHeaderModule, imports: [[CommonModule, BaoIconModule]] });
|
|
5916
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoSystemHeaderModule, decorators: [{
|
|
5917
|
+
type: NgModule,
|
|
5918
|
+
args: [{
|
|
5919
|
+
imports: [CommonModule, BaoIconModule],
|
|
5920
|
+
declarations: [SYSTEM_HEADER_DIRECTIVES],
|
|
5921
|
+
exports: [SYSTEM_HEADER_DIRECTIVES]
|
|
5922
|
+
}]
|
|
5923
|
+
}] });
|
|
5924
|
+
|
|
5925
|
+
/*
|
|
5926
|
+
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
5927
|
+
* Licensed under the MIT license.
|
|
5928
|
+
* See LICENSE file in the project root for full license information.
|
|
5929
|
+
*/
|
|
5930
|
+
|
|
4978
5931
|
/*
|
|
4979
5932
|
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
4980
5933
|
* Licensed under the MIT license.
|
|
@@ -5005,9 +5958,10 @@ BaoModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.
|
|
|
5005
5958
|
BaoModalModule,
|
|
5006
5959
|
BaoHyperlinkModule,
|
|
5007
5960
|
BaoDropdownMenuModule,
|
|
5008
|
-
BaoFileModule
|
|
5961
|
+
BaoFileModule,
|
|
5962
|
+
BaoSnackBarModule,
|
|
5963
|
+
BaoSystemHeaderModule
|
|
5009
5964
|
// TODO: reactivate once component does not depend on global css BaoBadgeModule,
|
|
5010
|
-
// TODO: reactivate once component does not depend on global css BaoSnackBarModule,
|
|
5011
5965
|
] });
|
|
5012
5966
|
BaoModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoModule, imports: [[
|
|
5013
5967
|
BaoIconModule,
|
|
@@ -5033,9 +5987,10 @@ BaoModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.
|
|
|
5033
5987
|
BaoModalModule,
|
|
5034
5988
|
BaoHyperlinkModule,
|
|
5035
5989
|
BaoDropdownMenuModule,
|
|
5036
|
-
BaoFileModule
|
|
5990
|
+
BaoFileModule,
|
|
5991
|
+
BaoSnackBarModule,
|
|
5992
|
+
BaoSystemHeaderModule
|
|
5037
5993
|
// TODO: reactivate once component does not depend on global css BaoBadgeModule,
|
|
5038
|
-
// TODO: reactivate once component does not depend on global css BaoSnackBarModule,
|
|
5039
5994
|
] });
|
|
5040
5995
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BaoModule, decorators: [{
|
|
5041
5996
|
type: NgModule,
|
|
@@ -5066,9 +6021,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
5066
6021
|
BaoModalModule,
|
|
5067
6022
|
BaoHyperlinkModule,
|
|
5068
6023
|
BaoDropdownMenuModule,
|
|
5069
|
-
BaoFileModule
|
|
6024
|
+
BaoFileModule,
|
|
6025
|
+
BaoSnackBarModule,
|
|
6026
|
+
BaoSystemHeaderModule
|
|
5070
6027
|
// TODO: reactivate once component does not depend on global css BaoBadgeModule,
|
|
5071
|
-
// TODO: reactivate once component does not depend on global css BaoSnackBarModule,
|
|
5072
6028
|
]
|
|
5073
6029
|
}]
|
|
5074
6030
|
}] });
|
|
@@ -5148,9 +6104,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
|
|
|
5148
6104
|
* See LICENSE file in the project root for full license information.
|
|
5149
6105
|
*/
|
|
5150
6106
|
|
|
6107
|
+
/*
|
|
6108
|
+
* Copyright (c) 2023 Ville de Montreal. All rights reserved.
|
|
6109
|
+
* Licensed under the MIT license.
|
|
6110
|
+
* See LICENSE file in the project root for full license information.
|
|
6111
|
+
*/
|
|
6112
|
+
|
|
5151
6113
|
/**
|
|
5152
6114
|
* Generated bundle index. Do not edit.
|
|
5153
6115
|
*/
|
|
5154
6116
|
|
|
5155
|
-
export { BAO_FILE_INTL_PROVIDER, BAO_FILE_INTL_PROVIDER_FACTORY, BAO_MODAL_DATA, BAO_RADIO_GROUP, BaoAlertActions, BaoAlertComponent, BaoAlertContent, BaoAlertLink, BaoAlertModule, BaoAlertTitle, BaoAvatarComponent, BaoAvatarContent, BaoAvatarModule, BaoBadgeComponent, BaoBadgeModule, BaoBreadcrumbComponent, BaoBreadcrumbModule, BaoButtonComponent, BaoButtonModule, BaoCardComponent, BaoCardContent, BaoCardHeader, BaoCardModule, BaoCardTextInterface, BaoCardTitle, BaoCheckBoxDescription, BaoCheckboxComponent, BaoCheckboxGroupComponent, BaoCheckboxModule, BaoCommonComponentsModule, BaoDropdownMenuComponent, BaoDropdownMenuDivider, BaoDropdownMenuItem, BaoDropdownMenuItemDescription, BaoDropdownMenuItemLabel, BaoDropdownMenuModule, BaoDropdownMenuSection, BaoDropdownMenuTrigger, BaoErrorTextComponent, BaoFileDropDirective, BaoFileDropzoneIntructions, BaoFileInputComponent, BaoFileIntl, BaoFileIntlEnglish, BaoFileModule, BaoFilePreviewComponent, BaoGuidingTextComponent, BaoHeaderInfoComponent, BaoHeaderInfoContent, BaoHeaderInfoModule, BaoHeaderInfoSubtitle, BaoHeaderInfoSurtitle, BaoHeaderInfoTitle, BaoHeaderInfoTitleGroupComponent, BaoHyperlinkComponent, BaoHyperlinkModule, BaoIconComponent, BaoIconModule, BaoLabelTextComponent, BaoList, BaoListItem, BaoListItemDescription, BaoListItemTitle, BaoListModule, BaoListSummary, BaoListSummaryItem, BaoModal, BaoModalBase, BaoModalClose, BaoModalContainer, BaoModalInitialConfig, BaoModalModule, BaoModalRef, BaoModule, BaoNavList, BaoRadioButtonComponent, BaoRadioButtonGroupComponent, BaoRadioDescription, BaoRadioModule, BaoSummaryComponent, BaoSummaryDescription, BaoSummaryModule, BaoTabHeader, BaoTabPanel, BaoTablistComponent, BaoTabsContainer, BaoTabsModule, BaoTagComponent, BaoTagModule, BaoTitleTextComponent, _BaoModalContainerBase, _closeModalVia, eModalDesktopWidthSize, eModalMobileWidthSize, throwBaoModalContentAlreadyAttachedError };
|
|
6117
|
+
export { BAO_FILE_INTL_PROVIDER, BAO_FILE_INTL_PROVIDER_FACTORY, BAO_MODAL_DATA, BAO_RADIO_GROUP, BAO_SNACK_BAR_DATA, BAO_SNACK_BAR_DEFAULT_OPTIONS, BaoAlertActions, BaoAlertComponent, BaoAlertContent, BaoAlertLink, BaoAlertModule, BaoAlertTitle, BaoAvatarComponent, BaoAvatarContent, BaoAvatarModule, BaoBackNavigationComponent, BaoBackNavigationInsert, BaoBadgeComponent, BaoBadgeModule, BaoBreadcrumbComponent, BaoBreadcrumbModule, BaoButtonComponent, BaoButtonModule, BaoCardComponent, BaoCardContent, BaoCardHeader, BaoCardModule, BaoCardTextInterface, BaoCardTitle, BaoCheckBoxDescription, BaoCheckboxComponent, BaoCheckboxGroupComponent, BaoCheckboxModule, BaoCommonComponentsModule, BaoDropdownMenuComponent, BaoDropdownMenuDivider, BaoDropdownMenuItem, BaoDropdownMenuItemDescription, BaoDropdownMenuItemLabel, BaoDropdownMenuModule, BaoDropdownMenuSection, BaoDropdownMenuTrigger, BaoErrorTextComponent, BaoFileDropDirective, BaoFileDropzoneIntructions, BaoFileInputComponent, BaoFileIntl, BaoFileIntlEnglish, BaoFileModule, BaoFilePreviewComponent, BaoGuidingTextComponent, BaoHeaderInfoComponent, BaoHeaderInfoContent, BaoHeaderInfoModule, BaoHeaderInfoSubtitle, BaoHeaderInfoSurtitle, BaoHeaderInfoTitle, BaoHeaderInfoTitleGroupComponent, BaoHyperlinkComponent, BaoHyperlinkModule, BaoIconComponent, BaoIconModule, BaoLabelTextComponent, BaoList, BaoListItem, BaoListItemDescription, BaoListItemTitle, BaoListModule, BaoListSummary, BaoListSummaryItem, BaoModal, BaoModalBase, BaoModalClose, BaoModalContainer, BaoModalInitialConfig, BaoModalModule, BaoModalRef, BaoModule, BaoNavList, BaoRadioButtonComponent, BaoRadioButtonGroupComponent, BaoRadioDescription, BaoRadioModule, BaoSimpleSnackBarComponent, BaoSnackBarConfig, BaoSnackBarContainerComponent, BaoSnackBarModule, BaoSnackBarRef, BaoSnackBarService, BaoSummaryComponent, BaoSummaryDescription, BaoSummaryModule, BaoSystemHeaderComponent, BaoSystemHeaderModule, BaoTabHeader, BaoTabPanel, BaoTablistComponent, BaoTabsContainer, BaoTabsModule, BaoTagComponent, BaoTagModule, BaoTitleTextComponent, _BaoModalContainerBase, _closeModalVia, baoFactory, eModalDesktopWidthSize, eModalMobileWidthSize, throwBaoModalContentAlreadyAttachedError };
|
|
5156
6118
|
//# sourceMappingURL=villedemontreal-angular-ui.mjs.map
|