@byuhbll/components 4.0.0-alpha.17 → 4.0.0-alpha.19
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/esm2022/lib/animations/animations.mjs +1 -19
- package/esm2022/lib/hbll-checkbox/hbll-checkbox.component.mjs +17 -0
- package/esm2022/lib/hbll-header/hbll-header.component.mjs +31 -81
- package/esm2022/lib/hbll-multi-select/hbll-multi-select.component.mjs +115 -0
- package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +5 -5
- package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +3 -3
- package/esm2022/public-api.mjs +1 -4
- package/fesm2022/byuhbll-components.mjs +65 -913
- package/fesm2022/byuhbll-components.mjs.map +1 -1
- package/lib/animations/animations.d.ts +0 -1
- package/lib/{checkbox/checkbox.component.d.ts → hbll-checkbox/hbll-checkbox.component.d.ts} +2 -2
- package/lib/hbll-header/hbll-header.component.d.ts +28 -23
- package/lib/{multi-select/multi-select.component.d.ts → hbll-multi-select/hbll-multi-select.component.d.ts} +1 -1
- package/lib/ss-search-bar/advanced-search/advanced-search.component.d.ts +1 -4
- package/package.json +1 -4
- package/public-api.d.ts +0 -3
- package/styles/scss/_mixins.scss +1 -1
- package/styles/scss/_vars.scss +0 -7
- package/styles/scss/base.scss +5 -38
- package/styles/scss/cta-btn.scss +2 -2
- package/styles/scss/pill-btn.scss +2 -2
- package/esm2022/lib/checkbox/checkbox.component.mjs +0 -15
- package/esm2022/lib/copy-tooltip/copy-tooltip.component.mjs +0 -49
- package/esm2022/lib/expand-collapse/expand-collapse.component.mjs +0 -31
- package/esm2022/lib/hbll-header/models/library-hours.mjs +0 -2
- package/esm2022/lib/hbll-header/nav-bar/nav-bar.component.mjs +0 -333
- package/esm2022/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.mjs +0 -29
- package/esm2022/lib/hbll-header/pipes/library-hours.pipe.mjs +0 -31
- package/esm2022/lib/header-with-impersonation/header-with-impersonation.component.mjs +0 -38
- package/esm2022/lib/impersonate-modal/impersonate-modal.component.mjs +0 -190
- package/esm2022/lib/impersonation-banner/impersonation-banner.component.mjs +0 -128
- package/esm2022/lib/impersonation-banner/models/application-access.mjs +0 -7
- package/esm2022/lib/impersonation-banner/models/person-summary.mjs +0 -15
- package/esm2022/lib/models/token-payload.mjs +0 -2
- package/esm2022/lib/multi-select/multi-select.component.mjs +0 -115
- package/esm2022/lib/utils.mjs +0 -7
- package/lib/copy-tooltip/copy-tooltip.component.d.ts +0 -12
- package/lib/expand-collapse/expand-collapse.component.d.ts +0 -10
- package/lib/hbll-header/models/library-hours.d.ts +0 -10
- package/lib/hbll-header/nav-bar/nav-bar.component.d.ts +0 -30
- package/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.d.ts +0 -12
- package/lib/hbll-header/pipes/library-hours.pipe.d.ts +0 -7
- package/lib/header-with-impersonation/header-with-impersonation.component.d.ts +0 -19
- package/lib/impersonate-modal/impersonate-modal.component.d.ts +0 -60
- package/lib/impersonation-banner/impersonation-banner.component.d.ts +0 -31
- package/lib/impersonation-banner/models/application-access.d.ts +0 -15
- package/lib/impersonation-banner/models/person-summary.d.ts +0 -33
- package/lib/models/token-payload.d.ts +0 -3
- package/lib/utils.d.ts +0 -5
- package/styles/scss/shared.scss +0 -7
- package/styles/scss/spinner.scss +0 -20
|
@@ -19,22 +19,4 @@ export const libHbllFadeIn = trigger('libHbllFadeIn', [
|
|
|
19
19
|
export const libHbllFadeOut = trigger('libHbllFadeOut', [
|
|
20
20
|
transition(':leave', [animate('.15s ease-out', style({ opacity: '0' }))]),
|
|
21
21
|
]);
|
|
22
|
-
|
|
23
|
-
transition(':enter', [
|
|
24
|
-
style({
|
|
25
|
-
transform: 'translateX({{xOffset}})',
|
|
26
|
-
}),
|
|
27
|
-
animate('200ms ease-in-out', style({
|
|
28
|
-
transform: 'translateX(0)',
|
|
29
|
-
})),
|
|
30
|
-
], { params: { xOffset: '100%' } }),
|
|
31
|
-
transition(':leave', [
|
|
32
|
-
style({
|
|
33
|
-
transform: 'translateX(0)',
|
|
34
|
-
}),
|
|
35
|
-
animate('200ms ease-in-out', style({
|
|
36
|
-
transform: 'translateX({{xOffset}})',
|
|
37
|
-
})),
|
|
38
|
-
], { params: { xOffset: '100%' } }),
|
|
39
|
-
]);
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9hbmltYXRpb25zL2FuaW1hdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILE9BQU8sRUFDUCxVQUFVLEVBQ1YsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLFlBQVksR0FDZixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRTtJQUNsRSxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztJQUM1QixVQUFVLENBQ04sU0FBUyxFQUNUO1FBQ0ksS0FBSyxDQUFDO1lBQ0YsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUM7WUFDdEMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDakQsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1NBQzlCLENBQUM7S0FDTCxFQUNELEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3JDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFO0lBQ3hELFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUN6RSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDNUUsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUU7SUFDbEQsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7SUFDcEQsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQyw0QkFBNEIsRUFBRTtJQUM1RSxVQUFVLENBQ04sUUFBUSxFQUNSO1FBQ0ksS0FBSyxDQUFDO1lBQ0YsU0FBUyxFQUFFLHlCQUF5QjtTQUN2QyxDQUFDO1FBQ0YsT0FBTyxDQUNILG1CQUFtQixFQUNuQixLQUFLLENBQUM7WUFDRixTQUFTLEVBQUUsZUFBZTtTQUM3QixDQUFDLENBQ0w7S0FDSixFQUNELEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQ2xDO0lBQ0QsVUFBVSxDQUNOLFFBQVEsRUFDUjtRQUNJLEtBQUssQ0FBQztZQUNGLFNBQVMsRUFBRSxlQUFlO1NBQzdCLENBQUM7UUFDRixPQUFPLENBQ0gsbUJBQW1CLEVBQ25CLEtBQUssQ0FBQztZQUNGLFNBQVMsRUFBRSx5QkFBeUI7U0FDdkMsQ0FBQyxDQUNMO0tBQ0osRUFDRCxFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUNsQztDQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgdHJpZ2dlcixcbiAgICB0cmFuc2l0aW9uLFxuICAgIGFuaW1hdGUsXG4gICAgc3R5bGUsXG4gICAgZ3JvdXAsXG4gICAgcXVlcnksXG4gICAgYW5pbWF0ZUNoaWxkLFxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuZXhwb3J0IGNvbnN0IGxpYkhibGxFeHBhbmRDb2xsYXBzZSA9IHRyaWdnZXIoJ2xpYkhibGxFeHBhbmRDb2xsYXBzZScsIFtcbiAgICB0cmFuc2l0aW9uKCd2b2lkIDw9PiAqJywgW10pLFxuICAgIHRyYW5zaXRpb24oXG4gICAgICAgICcqIDw9PiAqJyxcbiAgICAgICAgW1xuICAgICAgICAgICAgZ3JvdXAoW1xuICAgICAgICAgICAgICAgIHN0eWxlKHsgaGVpZ2h0OiAne3tzdGFydEhlaWdodH19cHgnIH0pLFxuICAgICAgICAgICAgICAgIHF1ZXJ5KCdAKicsIFthbmltYXRlQ2hpbGQoKV0sIHsgb3B0aW9uYWw6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnLjE1cyBlYXNlLWluLW91dCcpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIF0sXG4gICAgICAgIHsgcGFyYW1zOiB7IHN0YXJ0SGVpZ2h0OiAnMHB4JyB9IH0sXG4gICAgKSxcbl0pO1xuXG5leHBvcnQgY29uc3QgbGliSGJsbEZhZGVJbk91dCA9IHRyaWdnZXIoJ2xpYkhibGxGYWRlSW5PdXQnLCBbXG4gICAgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHsgb3BhY2l0eTogJzAnIH0pLCBhbmltYXRlKCcuMTVzIGVhc2Utb3V0JyldKSxcbiAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbYW5pbWF0ZSgnLjE1cyBlYXNlLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogJzAnIH0pKV0pLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBsaWJIYmxsRmFkZUluID0gdHJpZ2dlcignbGliSGJsbEZhZGVJbicsIFtcbiAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbc3R5bGUoeyBvcGFjaXR5OiAnMCcgfSksIGFuaW1hdGUoJy4xNXMgZWFzZS1vdXQnKV0pLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBsaWJIYmxsRmFkZU91dCA9IHRyaWdnZXIoJ2xpYkhibGxGYWRlT3V0JywgW1xuICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFthbmltYXRlKCcuMTVzIGVhc2Utb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAnMCcgfSkpXSksXG5dKTtcblxuZXhwb3J0IGNvbnN0IGxpYkhibGxTbGlkZUluT3V0UmlnaHRMZWZ0ID0gdHJpZ2dlcignbGliSGJsbFNsaWRlSW5PdXRSaWdodExlZnQnLCBbXG4gICAgdHJhbnNpdGlvbihcbiAgICAgICAgJzplbnRlcicsXG4gICAgICAgIFtcbiAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKHt7eE9mZnNldH19KScsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGFuaW1hdGUoXG4gICAgICAgICAgICAgICAgJzIwMG1zIGVhc2UtaW4tb3V0JyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgXSxcbiAgICAgICAgeyBwYXJhbXM6IHsgeE9mZnNldDogJzEwMCUnIH0gfSxcbiAgICApLFxuICAgIHRyYW5zaXRpb24oXG4gICAgICAgICc6bGVhdmUnLFxuICAgICAgICBbXG4gICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwKScsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGFuaW1hdGUoXG4gICAgICAgICAgICAgICAgJzIwMG1zIGVhc2UtaW4tb3V0JyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoe3t4T2Zmc2V0fX0pJyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICAgIHsgcGFyYW1zOiB7IHhPZmZzZXQ6ICcxMDAlJyB9IH0sXG4gICAgKSxcbl0pO1xuIl19
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9hbmltYXRpb25zL2FuaW1hdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILE9BQU8sRUFDUCxVQUFVLEVBQ1YsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLFlBQVksR0FDZixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRTtJQUNsRSxVQUFVLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztJQUM1QixVQUFVLENBQ04sU0FBUyxFQUNUO1FBQ0ksS0FBSyxDQUFDO1lBQ0YsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUM7WUFDdEMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDakQsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1NBQzlCLENBQUM7S0FDTCxFQUNELEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3JDO0NBQ0osQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFO0lBQ3hELFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUN6RSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDNUUsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEVBQUU7SUFDbEQsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7SUFDcEQsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzVFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgdHJpZ2dlcixcbiAgICB0cmFuc2l0aW9uLFxuICAgIGFuaW1hdGUsXG4gICAgc3R5bGUsXG4gICAgZ3JvdXAsXG4gICAgcXVlcnksXG4gICAgYW5pbWF0ZUNoaWxkLFxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuZXhwb3J0IGNvbnN0IGxpYkhibGxFeHBhbmRDb2xsYXBzZSA9IHRyaWdnZXIoJ2xpYkhibGxFeHBhbmRDb2xsYXBzZScsIFtcbiAgICB0cmFuc2l0aW9uKCd2b2lkIDw9PiAqJywgW10pLFxuICAgIHRyYW5zaXRpb24oXG4gICAgICAgICcqIDw9PiAqJyxcbiAgICAgICAgW1xuICAgICAgICAgICAgZ3JvdXAoW1xuICAgICAgICAgICAgICAgIHN0eWxlKHsgaGVpZ2h0OiAne3tzdGFydEhlaWdodH19cHgnIH0pLFxuICAgICAgICAgICAgICAgIHF1ZXJ5KCdAKicsIFthbmltYXRlQ2hpbGQoKV0sIHsgb3B0aW9uYWw6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnLjE1cyBlYXNlLWluLW91dCcpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIF0sXG4gICAgICAgIHsgcGFyYW1zOiB7IHN0YXJ0SGVpZ2h0OiAnMHB4JyB9IH0sXG4gICAgKSxcbl0pO1xuXG5leHBvcnQgY29uc3QgbGliSGJsbEZhZGVJbk91dCA9IHRyaWdnZXIoJ2xpYkhibGxGYWRlSW5PdXQnLCBbXG4gICAgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHsgb3BhY2l0eTogJzAnIH0pLCBhbmltYXRlKCcuMTVzIGVhc2Utb3V0JyldKSxcbiAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbYW5pbWF0ZSgnLjE1cyBlYXNlLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogJzAnIH0pKV0pLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBsaWJIYmxsRmFkZUluID0gdHJpZ2dlcignbGliSGJsbEZhZGVJbicsIFtcbiAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbc3R5bGUoeyBvcGFjaXR5OiAnMCcgfSksIGFuaW1hdGUoJy4xNXMgZWFzZS1vdXQnKV0pLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBsaWJIYmxsRmFkZU91dCA9IHRyaWdnZXIoJ2xpYkhibGxGYWRlT3V0JywgW1xuICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFthbmltYXRlKCcuMTVzIGVhc2Utb3V0Jywgc3R5bGUoeyBvcGFjaXR5OiAnMCcgfSkpXSksXG5dKTtcbiJdfQ==
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, Input } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class HbllCheckboxComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.isChecked = false;
|
|
7
|
+
}
|
|
8
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllCheckboxComponent, isStandalone: true, selector: "lib-hbll-checkbox", inputs: { isChecked: "isChecked" }, ngImport: i0, template: "<span class=\"components-checkbox-container\" [class.components-checked]=\"isChecked\">\n @if (isChecked) {\n <span class=\"material-symbols-outlined components-icon\"> check </span>\n }\n</span>\n", styles: [".components-checkbox-container{transition:.15s;height:1.13em;aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;border-radius:4px;border:solid 1px #707070;color:#fff;box-sizing:border-box;position:relative}.components-checkbox-container.components-checked{border-color:#3a6093;background-color:#3a6093}.components-checkbox-container.components-checked .components-icon{position:absolute;font-size:1.1em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
|
|
10
|
+
}
|
|
11
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllCheckboxComponent, decorators: [{
|
|
12
|
+
type: Component,
|
|
13
|
+
args: [{ selector: 'lib-hbll-checkbox', standalone: true, imports: [CommonModule], template: "<span class=\"components-checkbox-container\" [class.components-checked]=\"isChecked\">\n @if (isChecked) {\n <span class=\"material-symbols-outlined components-icon\"> check </span>\n }\n</span>\n", styles: [".components-checkbox-container{transition:.15s;height:1.13em;aspect-ratio:1/1;display:flex;align-items:center;justify-content:center;border-radius:4px;border:solid 1px #707070;color:#fff;box-sizing:border-box;position:relative}.components-checkbox-container.components-checked{border-color:#3a6093;background-color:#3a6093}.components-checkbox-container.components-checked .components-icon{position:absolute;font-size:1.1em}\n"] }]
|
|
14
|
+
}], propDecorators: { isChecked: [{
|
|
15
|
+
type: Input
|
|
16
|
+
}] } });
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1jaGVja2JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvaGJsbC1jaGVja2JveC9oYmxsLWNoZWNrYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLWNoZWNrYm94L2hibGwtY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVNqRCxNQUFNLE9BQU8scUJBQXFCO0lBUGxDO1FBUWEsY0FBUyxHQUFHLEtBQUssQ0FBQztLQUM5Qjs4R0FGWSxxQkFBcUI7a0dBQXJCLHFCQUFxQixpSENWbEMsb05BS0EsbWVER2MsWUFBWTs7MkZBRWIscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNJLG1CQUFtQixjQUdqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7OEJBR2QsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWhibGwtY2hlY2tib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oYmxsLWNoZWNrYm94LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9oYmxsLWNoZWNrYm94LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgSGJsbENoZWNrYm94Q29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBpc0NoZWNrZWQgPSBmYWxzZTtcbn1cbiIsIjxzcGFuIGNsYXNzPVwiY29tcG9uZW50cy1jaGVja2JveC1jb250YWluZXJcIiBbY2xhc3MuY29tcG9uZW50cy1jaGVja2VkXT1cImlzQ2hlY2tlZFwiPlxuICAgIEBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjb21wb25lbnRzLWljb25cIj4gY2hlY2sgPC9zcGFuPlxuICAgIH1cbjwvc3Bhbj5cbiJdfQ==
|
|
@@ -1,110 +1,60 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DatePipe, LowerCasePipe } from '@angular/common';
|
|
2
2
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
3
3
|
import { HttpClient } from '@angular/common/http';
|
|
4
|
-
import { Component, EventEmitter,
|
|
5
|
-
import { NavBarComponent } from './nav-bar/nav-bar.component';
|
|
6
|
-
import { libHbllFadeInOut, libHbllSlideInOutRightLeft } from '../animations/animations';
|
|
7
|
-
import { BreakpointObserver } from '@angular/cdk/layout';
|
|
8
|
-
import { isScreenSmallSignal } from '../utils';
|
|
9
|
-
import { LibraryHoursPipe } from './pipes/library-hours.pipe';
|
|
10
|
-
import { map, of, shareReplay, switchMap } from 'rxjs';
|
|
11
|
-
import { ExpandCollapseComponent } from '../expand-collapse/expand-collapse.component';
|
|
4
|
+
import { Component, EventEmitter, Output, Pipe, Renderer2, computed, inject, input, viewChild, } from '@angular/core';
|
|
12
5
|
import * as i0 from "@angular/core";
|
|
13
|
-
|
|
14
|
-
export
|
|
6
|
+
const LIBRARY_HOURS_API_URL = 'https://apps.lib.byu.edu/libraryhours/api/hours';
|
|
7
|
+
export class LibraryHoursDatePipe {
|
|
8
|
+
transform(date, time) {
|
|
9
|
+
return new Date(date + 'T' + time);
|
|
10
|
+
}
|
|
11
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: LibraryHoursDatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
12
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.1.0", ngImport: i0, type: LibraryHoursDatePipe, isStandalone: true, name: "libraryHoursDate" }); }
|
|
13
|
+
}
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: LibraryHoursDatePipe, decorators: [{
|
|
15
|
+
type: Pipe,
|
|
16
|
+
args: [{
|
|
17
|
+
name: 'libraryHoursDate',
|
|
18
|
+
standalone: true,
|
|
19
|
+
}]
|
|
20
|
+
}] });
|
|
21
|
+
/**
|
|
22
|
+
* Header component built to be exported as a custom element.
|
|
23
|
+
* This component uses icons provided by Google Material.
|
|
24
|
+
* The link to these icons should be included once in the \<head> of your base html.
|
|
25
|
+
*
|
|
26
|
+
* When a non-empty string `name` is provided to this component, the user is considered logged in.
|
|
27
|
+
* Two outputs/events are accessible: `login` and `logout`.
|
|
28
|
+
*/
|
|
15
29
|
export class HbllHeaderComponent {
|
|
16
30
|
constructor() {
|
|
17
31
|
this.r2 = inject(Renderer2);
|
|
18
|
-
// TODO: does this increase bundle size more than it's worth? vs fetch?
|
|
19
32
|
this.http = inject(HttpClient);
|
|
20
|
-
this.bo = inject(BreakpointObserver);
|
|
21
|
-
this.doc = inject(DOCUMENT);
|
|
22
33
|
// --- API ---
|
|
23
|
-
|
|
24
|
-
this.name = '';
|
|
25
|
-
this.mainsitebaseurl = 'https://lib.byu.edu';
|
|
26
|
-
// TODO: this is a singal input currently because it won't be used by any other applications than Angular ones.
|
|
27
|
-
this.showImpersonateButton = input(false);
|
|
28
|
-
this.openImpersonationModal = new EventEmitter();
|
|
34
|
+
this.name = input('');
|
|
29
35
|
this.login = new EventEmitter();
|
|
30
36
|
this.logout = new EventEmitter();
|
|
31
37
|
// -----------
|
|
32
|
-
this.formatDateForHours = (date) => `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
|
|
33
38
|
this.accountInfoEl = viewChild('accountInfo');
|
|
34
|
-
this.
|
|
35
|
-
// Hours
|
|
39
|
+
this.isLoggedIn = computed(() => !!this.name());
|
|
36
40
|
this.libraryHours = toSignal(this.http.get(LIBRARY_HOURS_API_URL));
|
|
37
|
-
this.hoursExceptions$ = of(null).pipe(map(() => {
|
|
38
|
-
// Get exceptions from today to two months out
|
|
39
|
-
const today = new Date();
|
|
40
|
-
const start = this.formatDateForHours(today);
|
|
41
|
-
const newDate = new Date();
|
|
42
|
-
newDate.setMonth(today.getMonth() + 2);
|
|
43
|
-
const stop = this.formatDateForHours(newDate);
|
|
44
|
-
return [start, stop];
|
|
45
|
-
}), switchMap(([start, stop]) => this.http
|
|
46
|
-
.get(`${LIBRARY_HOURS_API_URL}?start=${start}&stop=${stop}`)
|
|
47
|
-
.pipe(map((res) => res.filter((day) => day.has_exception).slice(0, 5)))), shareReplay(1));
|
|
48
41
|
this.showAccountDropdown = false;
|
|
49
|
-
this.showLibraryHours = false;
|
|
50
|
-
this.mobileSidebarHeight = 0;
|
|
51
|
-
this.showNavBar = false;
|
|
52
|
-
this.isScreenSmall = isScreenSmallSignal(this.bo);
|
|
53
|
-
this.openSidebarNav = () => {
|
|
54
|
-
this.showNavBar = true;
|
|
55
|
-
window.scrollTo(0, 0);
|
|
56
|
-
this.r2.setStyle(this.doc.body, 'overflow', 'hidden');
|
|
57
|
-
};
|
|
58
|
-
this.closeSidebarNav = () => {
|
|
59
|
-
this.showNavBar = false;
|
|
60
|
-
this.r2.removeStyle(this.doc.body, 'overflow');
|
|
61
|
-
};
|
|
62
|
-
this.setMobileSidebarHeight = () => (this.mobileSidebarHeight =
|
|
63
|
-
window.innerHeight - this.header.nativeElement.getBoundingClientRect().height);
|
|
64
|
-
}
|
|
65
|
-
get isLoggedIn() {
|
|
66
|
-
return !!this.name;
|
|
67
42
|
}
|
|
68
43
|
ngAfterViewInit() {
|
|
69
44
|
this.r2.listen('window', 'click', (e) => {
|
|
70
45
|
if (!this.accountInfoEl()?.nativeElement.contains(e.target))
|
|
71
46
|
this.showAccountDropdown = false;
|
|
72
|
-
if (!this.hoursEl()?.nativeElement.contains(e.target))
|
|
73
|
-
this.showLibraryHours = false;
|
|
74
47
|
});
|
|
75
|
-
this.setMobileSidebarHeight();
|
|
76
|
-
}
|
|
77
|
-
onResize() {
|
|
78
|
-
this.setMobileSidebarHeight();
|
|
79
48
|
}
|
|
80
49
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
81
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllHeaderComponent, isStandalone: true, selector: "lib-hbll-header", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: false, isRequired: false, transformFunction: null }, mainsitebaseurl: { classPropertyName: "mainsitebaseurl", publicName: "mainsitebaseurl", isSignal: false, isRequired: false, transformFunction: null }, showImpersonateButton: { classPropertyName: "showImpersonateButton", publicName: "showImpersonateButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openImpersonationModal: "openImpersonationModal", login: "login", logout: "logout" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "accountInfoEl", first: true, predicate: ["accountInfo"], descendants: true, isSignal: true }, { propertyName: "hoursEl", first: true, predicate: ["hours"], descendants: true, isSignal: true }, { propertyName: "header", first: true, predicate: ["header"], descendants: true }], ngImport: i0, template: "<header\n role=\"banner\"\n class=\"hbll-header-wrapper\"\n #header\n [ngClass]=\"{ 'hbll-header-desktop': !isScreenSmall() }\"\n>\n <a [href]=\"mainsitebaseurl\">\n <h1>\n <img\n src=\"https://media.lib.byu.edu/web-assets/images/2.0.0/byu-hbll-logo-full.svg\"\n alt=\"BYU Library Logo\"\n />\n </h1>\n </a>\n <div id=\"libraryInfo\" class=\"hbll-header-wrapper\">\n @if (!isScreenSmall()) {\n <div #hours id=\"mainLibraryHours\" data-testid=\"desktopHours\">\n <button\n (click)=\"showLibraryHours = !showLibraryHours\"\n class=\"hbll-header-wrapper\"\n data-testid=\"hoursBtn\"\n >\n <ng-container *ngTemplateOutlet=\"hoursTextBlock\"></ng-container>\n </button>\n @if (!isScreenSmall() && showLibraryHours) {\n <div\n @libHbllFadeInOut\n id=\"libraryHoursDropdown\"\n data-testid=\"libraryHoursDropdown\"\n >\n <section class=\"hbll-header-section\">\n <h2 class=\"hbll-header-header\">Regular Hours</h2>\n <div class=\"hbll-header-detail\">\n <h3 class=\"hbll-header-item\">Monday - Friday</h3>\n <h3 class=\"hbll-header-item\">Saturday</h3>\n <h3 class=\"hbll-header-item\">Sunday</h3>\n </div>\n <div class=\"hbll-header-hours\">\n <div class=\"hbll-header-item\">7 a.m - midnight</div>\n <div class=\"hbll-header-item\">8 a.m - midnight</div>\n <div class=\"hbll-header-item\">Closed*</div>\n </div>\n <div class=\"hbll-header-hours-note\">\n * Family history ONLY 4 p.m. - 8 p.m\n <ul>\n <li><span>No checkouts after 11:45 p.m.</span></li>\n <li>\n <span>All services closed 10:45 to noon on Tuesdays</span>\n </li>\n </ul>\n </div>\n </section>\n <section class=\"hbll-header-section\">\n <h2 class=\"hbll-header-header\">Upcoming Exceptions</h2>\n @if (hoursExceptions$ | async; as exceptions) {\n <div class=\"hbll-header-detail\" data-testid=\"exceptionsDetail\">\n @for (exception of exceptions; track exception.date) {\n <h3 class=\"hbll-header-item\">\n {{ exception.date | date: 'MMM. d, YYYY' }}\n </h3>\n } @empty {\n No upcoming exceptions\n }\n </div>\n <div class=\"hbll-header-hours\" data-testid=\"exceptionsHours\">\n @for (exception of exceptions; track exception.date) {\n <div class=\"hbll-header-item\">\n {{ exception.exception_title }}\n </div>\n }\n </div>\n } @else {\n <div class=\"lib-spinner\" data-testid=\"exceptionsSpinner\"></div>\n }\n </section>\n <section class=\"hbll-header-section\">\n <h2 class=\"hbll-header-header\">Library Cafe</h2>\n <div class=\"hbll-header-detail\">\n <h3 class=\"hbll-header-item\">Bagel Bubble</h3>\n <h3 class=\"hbll-header-item\">Provecho</h3>\n </div>\n <div class=\"hbll-header-hours\">\n <div class=\"hbll-header-item\">7 a.m - 11 p.m.</div>\n <div class=\"hbll-header-item\">10:30 a.m - 2 p.m.</div>\n </div>\n </section>\n <a [href]=\"mainsitebaseurl + '/about/hours'\"\n >See all hours\n <span class=\"material-symbols-outlined\"> chevron_right </span></a\n >\n </div>\n }\n </div>\n }\n <div id=\"accountInfo\" #accountInfo>\n <button\n (click)=\"isLoggedIn ? (showAccountDropdown = !showAccountDropdown) : login.emit()\"\n class=\"hbll-header-wrapper\"\n id=\"accountBtn\"\n data-testid=\"accountBtn\"\n >\n <span class=\"material-symbols-outlined hbll-header-icon\"> person </span>\n @if (!isScreenSmall()) {\n <span class=\"hbll-header-name\" data-testid=\"name\">{{\n isLoggedIn ? ' ' + name : 'Login'\n }}</span>\n }\n @if (isLoggedIn) {\n <span class=\"material-symbols-outlined\" data-testid=\"loginDropdown\">\n arrow_drop_down\n </span>\n }\n </button>\n @if (isLoggedIn && showAccountDropdown) {\n <div @libHbllFadeInOut id=\"accountDropdown\" data-testid=\"accountDropdown\">\n <a [href]=\"mainsitebaseurl + '/account'\">My Account</a>\n <a [href]=\"mainsitebaseurl + '/account'\">My Items</a>\n <a [href]=\"mainsitebaseurl + '/account/request'\">Request an item</a>\n <a [href]=\"mainsitebaseurl + '/account/saved'\">Saved</a>\n <a [href]=\"mainsitebaseurl + '/account/course'\">Courses</a>\n <a [href]=\"mainsitebaseurl + '/account/rooms'\">Rooms</a>\n <a [href]=\"mainsitebaseurl + '/account/preferences'\">Preferences</a>\n @if (showImpersonateButton()) {\n <button\n (click)=\"openImpersonationModal.emit(); showAccountDropdown = false\"\n class=\"hbll-header-impersonate-btn\"\n >\n Impersonate\n </button>\n }\n <button (click)=\"logout.emit()\" data-testid=\"logout\">Logout</button>\n </div>\n }\n </div>\n @if (isScreenSmall()) {\n <div id=\"mobileNav\">\n <button\n class=\"hbll-header-wrapper\"\n data-testid=\"mobileNavBtn\"\n (click)=\"openSidebarNav()\"\n >\n <span class=\"material-symbols-outlined hbll-header-icon\"> menu </span>\n </button>\n @if (showNavBar) {\n <div\n id=\"navWrapper\"\n data-testid=\"mobileNav\"\n [@libHbllSlideInOutRightLeft]=\"{\n value: '',\n params: { xOffset: '400px' },\n }\"\n >\n <button\n id=\"closeMobileNavBtn\"\n class=\"hbll-header-wrapper\"\n data-testid=\"closeMobileNavBtn\"\n (click)=\"closeSidebarNav()\"\n >\n <span class=\"material-symbols-outlined hbll-header-icon\"> close </span>\n </button>\n <lib-nav-bar\n [mainSiteBaseUrl]=\"mainsitebaseurl\"\n [height]=\"mobileSidebarHeight\"\n />\n </div>\n <div\n @libHbllFadeInOut\n (click)=\"showNavBar = false\"\n class=\"hbll-nav-backdrop\"\n data-testid=\"mobileNavBackdrop\"\n ></div>\n }\n </div>\n }\n </div>\n</header>\n\n@if (!isScreenSmall()) {\n <div id=\"mainNav\">\n <lib-nav-bar [mainSiteBaseUrl]=\"mainsitebaseurl\" />\n </div>\n}\n@if (isScreenSmall()) {\n <a\n id=\"mobileLibraryHours\"\n [href]=\"mainsitebaseurl + '/about/hours'\"\n class=\"hbll-header-wrapper\"\n data-testid=\"mobileHours\"\n >\n <ng-container *ngTemplateOutlet=\"hoursTextBlock\"></ng-container>\n </a>\n}\n\n<ng-template #hoursTextBlock>\n @if (libraryHours()) {\n <span class=\"material-symbols-outlined hbll-header-left-icon\"> schedule </span>\n {{\n libraryHours()?.is_closed\n ? 'CLOSED'\n : \"Today's hours: \" +\n (libraryHours()!.date | libraryHours: libraryHours()!.open_time) +\n ' - ' +\n (libraryHours()!.date | libraryHours: libraryHours()!.close_time)\n }}\n }\n</ng-template>\n", styles: [".lib-spinner{border:.3em solid #dfe9f7;border-top:.3em solid #4070b0;border-radius:100%;width:30px;height:30px;animation:loadingSpinnerAnimate 1s ease infinite;position:relative}@keyframes loadingSpinnerAnimate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}*{box-sizing:border-box;text-decoration:none}*:not(.material-symbols-outlined){font-family:inherit}.hbll-header-wrapper{display:flex;align-items:center;font-size:1em}.hbll-nav-backdrop{background-color:#000;opacity:.3;height:100vh;width:100vw;left:0;top:0;transform:translate(-100vw);position:absolute;z-index:-1}#mobileLibraryHours{color:#141414;background-color:#e6e6e6;font-size:1em;min-height:2em}#mobileLibraryHours.hbll-header-wrapper{width:100%;justify-content:center;padding:.2em}.hbll-header-icon,.hbll-header-left-icon{font-size:1.2em}.hbll-header-left-icon{margin-right:.2em}header{background-color:#002e5d;display:flex;align-items:center;position:relative}header a h1{font-size:100%;margin:0;height:1.8em}header a h1 img{height:100%;padding:0 0 0 .6em}header #libraryInfo{margin-left:auto;color:#fff}header #libraryInfo a,header #libraryInfo button{transition:color .2s ease-in-out;color:#fffc}header #libraryInfo a:hover,header #libraryInfo button:hover{color:#fff}header #libraryInfo #accountInfo button,header #libraryInfo #mobileNav button{padding:.8em .6em}header #libraryInfo #accountBtn .name{margin-left:.4em}header #libraryInfo #mobileNav{position:relative;z-index:11}header #libraryInfo #mobileNav #navWrapper{color:#fff;position:absolute;top:0;right:0}header #libraryInfo #mobileNav #navWrapper #closeMobileNavBtn{background-color:#0047ba;margin-left:auto;padding-left:.9em}header #libraryInfo :last-child button{padding-right:1em!important}header #libraryInfo .hbll-header-icon,header #libraryInfo .hbll-header-left-icon{font-size:1.6em}header #libraryInfo #accountInfo{position:relative}header #libraryInfo #accountInfo #accountDropdown{font-size:1em;text-wrap:nowrap;position:absolute;background-color:#002e5d;top:100%;right:-32px;z-index:11;background-color:#233753}header #libraryInfo #accountInfo #accountDropdown .hbll-header-impersonate-btn{color:#ca7ad1cc}header #libraryInfo #accountInfo #accountDropdown .hbll-header-impersonate-btn:hover{color:#ca7ad1}header #libraryInfo #accountInfo #accountDropdown a,header #libraryInfo #accountInfo #accountDropdown button{display:block;width:100%;text-align:left;padding:.4em 1.2em;font-size:1.1em}header #libraryInfo #accountInfo #accountDropdown a:first-child,header #libraryInfo #accountInfo #accountDropdown button:first-child{margin-bottom:.4em;padding-top:.6em;padding-bottom:.6em;border-bottom:1px solid rgba(255,255,255,.3)}header #libraryInfo #accountInfo #accountDropdown a:last-child,header #libraryInfo #accountInfo #accountDropdown button:last-child{margin-top:.4em;border-top:1px solid rgba(255,255,255,.3);padding-top:.6em;padding-bottom:.6em}header #libraryInfo #accountInfo #accountDropdown:before{content:\"\";width:0;height:0;border-style:solid;border-width:0 .6em .6em .6em;border-color:transparent transparent hsl(214,41%,23%) transparent;position:absolute;bottom:100%;right:50%;transform:translate(50%);z-index:inherit}header.hbll-header-desktop{padding:0 2em}header.hbll-header-desktop #libraryInfo #mainLibraryHours{position:relative;margin-right:1em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown{z-index:11;background-color:#fff;border-radius:4px;border:1px solid #d2d2d2;position:absolute;color:#000;padding:2em;top:100%;max-width:400%;right:50%;transform:translate(50%);margin-top:.6em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section{display:grid;grid-template-columns:repeat(3,9em);grid-template-rows:1fr;grid-column-gap:0px;grid-row-gap:0px;margin-bottom:1em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section h2{margin:0}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours-note{grid-column:2/4;font-size:.8em;margin-top:1em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours-note ul{list-style-type:disc;list-style-position:inside;margin-left:.8em;padding:0}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours-note ul li span{left:-8px;position:relative}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-header{font-weight:600;font-size:1.2em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-detail,header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours{margin-top:.2em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-detail .hbll-header-item+.hbll-header-item,header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours .hbll-header-item+.hbll-header-item{margin-top:.3em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-detail h3,header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours h3{margin:0;font-size:inherit}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-detail{font-weight:600;white-space:nowrap}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours{white-space:nowrap}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown a{color:#4070b0;display:flex;align-items:center;float:right}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown a:hover{color:#6892ca}header.hbll-header-desktop #libraryInfo #accountInfo #accountDropdown{right:auto;left:50%;transform:translate(-50%)}button{background-color:transparent;border:none;cursor:pointer;font-family:inherit;font-size:inherit;color:inherit;padding:0}\n"], dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: LibraryHoursPipe, name: "libraryHours" }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: NavBarComponent, selector: "lib-nav-bar", inputs: ["mainSiteBaseUrl", "height"] }], animations: [libHbllSlideInOutRightLeft, libHbllFadeInOut] }); }
|
|
50
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllHeaderComponent, isStandalone: true, selector: "lib-hbll-header", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { login: "login", logout: "logout" }, viewQueries: [{ propertyName: "accountInfoEl", first: true, predicate: ["accountInfo"], descendants: true, isSignal: true }], ngImport: i0, template: "<header role=\"banner\" class=\"wrapper\">\n <h1>\n <a href=\"https://lib.byu.edu/\">\n <img\n src=\"https://media.lib.byu.edu/web-assets/images/1.0.0/byu-library-logo-full.svg\"\n alt=\"BYU Library Logo\"\n />\n </a>\n </h1>\n <div id=\"libraryInfo\" class=\"wrapper\">\n @if (libraryHours()) {\n <div id=\"libraryHours\">\n <div class=\"wrapper\">\n <span class=\"material-symbols-outlined left-icon\"> schedule </span>\n {{\n libraryHours()?.is_closed\n ? \"CLOSED\"\n : \"Today's hours: \" +\n (libraryHours()!.date\n | libraryHoursDate : libraryHours()!.open_time\n | date : \"ha\"\n | lowercase) +\n \" - \" +\n (libraryHours()!.date\n | libraryHoursDate : libraryHours()!.close_time\n | date : \"ha\"\n | lowercase)\n }}\n </div>\n </div>\n }\n <div id=\"accountInfo\" #accountInfo>\n <button\n (click)=\"\n isLoggedIn()\n ? (showAccountDropdown = !showAccountDropdown)\n : login.emit()\n \"\n class=\"wrapper\"\n id=\"accountBtn\"\n >\n <span class=\"material-symbols-outlined left-icon\"> person </span>\n {{ isLoggedIn() ? name : \"Login\" }}\n @if (isLoggedIn()) {\n <span class=\"material-symbols-outlined\"> arrow_drop_down </span>\n }\n </button>\n @if (isLoggedIn() && showAccountDropdown) {\n <div id=\"accountDropdown\">\n <a class=\"item\">My Account</a>\n <a class=\"item\">Preferences</a>\n <button class=\"item\" (click)=\"logout.emit()\">Logout</button>\n </div>\n }\n </div>\n </div>\n</header>\n<nav></nav>\n", styles: [":host{font-family:Source Sans Pro}.wrapper{display:flex;align-items:center}header{background-color:#002e5d;display:flex;align-items:center;padding:.6rem 1rem}h1{height:2rem}#libraryInfo{margin-left:auto}#libraryHours,#accountInfo{color:#fff;margin:.6rem}.left-icon{margin-right:.4rem}img{height:100%}#accountInfo{position:relative}#accountInfo #accountBtn:hover{opacity:.6}#accountInfo #accountDropdown{font-size:1.1rem;text-wrap:nowrap;position:absolute;background-color:#002e5d;top:100%;right:0;padding:1.2rem}#accountInfo #accountDropdown .item{display:block;padding:.4rem 0;width:100%;text-align:left}#accountInfo #accountDropdown .item:first-child{padding-top:0}#accountInfo #accountDropdown .item:last-child{padding-bottom:0}button{background-color:transparent;border:none;cursor:pointer;font-family:inherit;font-size:inherit;color:inherit;padding:0}\n"], dependencies: [{ kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: LowerCasePipe, name: "lowercase" }, { kind: "pipe", type: LibraryHoursDatePipe, name: "libraryHoursDate" }] }); }
|
|
82
51
|
}
|
|
83
52
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllHeaderComponent, decorators: [{
|
|
84
53
|
type: Component,
|
|
85
|
-
args: [{ selector: 'lib-hbll-header', standalone: true, imports: [
|
|
86
|
-
|
|
87
|
-
LowerCasePipe,
|
|
88
|
-
LibraryHoursPipe,
|
|
89
|
-
CommonModule,
|
|
90
|
-
NavBarComponent,
|
|
91
|
-
ExpandCollapseComponent,
|
|
92
|
-
], animations: [libHbllSlideInOutRightLeft, libHbllFadeInOut], template: "<header\n role=\"banner\"\n class=\"hbll-header-wrapper\"\n #header\n [ngClass]=\"{ 'hbll-header-desktop': !isScreenSmall() }\"\n>\n <a [href]=\"mainsitebaseurl\">\n <h1>\n <img\n src=\"https://media.lib.byu.edu/web-assets/images/2.0.0/byu-hbll-logo-full.svg\"\n alt=\"BYU Library Logo\"\n />\n </h1>\n </a>\n <div id=\"libraryInfo\" class=\"hbll-header-wrapper\">\n @if (!isScreenSmall()) {\n <div #hours id=\"mainLibraryHours\" data-testid=\"desktopHours\">\n <button\n (click)=\"showLibraryHours = !showLibraryHours\"\n class=\"hbll-header-wrapper\"\n data-testid=\"hoursBtn\"\n >\n <ng-container *ngTemplateOutlet=\"hoursTextBlock\"></ng-container>\n </button>\n @if (!isScreenSmall() && showLibraryHours) {\n <div\n @libHbllFadeInOut\n id=\"libraryHoursDropdown\"\n data-testid=\"libraryHoursDropdown\"\n >\n <section class=\"hbll-header-section\">\n <h2 class=\"hbll-header-header\">Regular Hours</h2>\n <div class=\"hbll-header-detail\">\n <h3 class=\"hbll-header-item\">Monday - Friday</h3>\n <h3 class=\"hbll-header-item\">Saturday</h3>\n <h3 class=\"hbll-header-item\">Sunday</h3>\n </div>\n <div class=\"hbll-header-hours\">\n <div class=\"hbll-header-item\">7 a.m - midnight</div>\n <div class=\"hbll-header-item\">8 a.m - midnight</div>\n <div class=\"hbll-header-item\">Closed*</div>\n </div>\n <div class=\"hbll-header-hours-note\">\n * Family history ONLY 4 p.m. - 8 p.m\n <ul>\n <li><span>No checkouts after 11:45 p.m.</span></li>\n <li>\n <span>All services closed 10:45 to noon on Tuesdays</span>\n </li>\n </ul>\n </div>\n </section>\n <section class=\"hbll-header-section\">\n <h2 class=\"hbll-header-header\">Upcoming Exceptions</h2>\n @if (hoursExceptions$ | async; as exceptions) {\n <div class=\"hbll-header-detail\" data-testid=\"exceptionsDetail\">\n @for (exception of exceptions; track exception.date) {\n <h3 class=\"hbll-header-item\">\n {{ exception.date | date: 'MMM. d, YYYY' }}\n </h3>\n } @empty {\n No upcoming exceptions\n }\n </div>\n <div class=\"hbll-header-hours\" data-testid=\"exceptionsHours\">\n @for (exception of exceptions; track exception.date) {\n <div class=\"hbll-header-item\">\n {{ exception.exception_title }}\n </div>\n }\n </div>\n } @else {\n <div class=\"lib-spinner\" data-testid=\"exceptionsSpinner\"></div>\n }\n </section>\n <section class=\"hbll-header-section\">\n <h2 class=\"hbll-header-header\">Library Cafe</h2>\n <div class=\"hbll-header-detail\">\n <h3 class=\"hbll-header-item\">Bagel Bubble</h3>\n <h3 class=\"hbll-header-item\">Provecho</h3>\n </div>\n <div class=\"hbll-header-hours\">\n <div class=\"hbll-header-item\">7 a.m - 11 p.m.</div>\n <div class=\"hbll-header-item\">10:30 a.m - 2 p.m.</div>\n </div>\n </section>\n <a [href]=\"mainsitebaseurl + '/about/hours'\"\n >See all hours\n <span class=\"material-symbols-outlined\"> chevron_right </span></a\n >\n </div>\n }\n </div>\n }\n <div id=\"accountInfo\" #accountInfo>\n <button\n (click)=\"isLoggedIn ? (showAccountDropdown = !showAccountDropdown) : login.emit()\"\n class=\"hbll-header-wrapper\"\n id=\"accountBtn\"\n data-testid=\"accountBtn\"\n >\n <span class=\"material-symbols-outlined hbll-header-icon\"> person </span>\n @if (!isScreenSmall()) {\n <span class=\"hbll-header-name\" data-testid=\"name\">{{\n isLoggedIn ? ' ' + name : 'Login'\n }}</span>\n }\n @if (isLoggedIn) {\n <span class=\"material-symbols-outlined\" data-testid=\"loginDropdown\">\n arrow_drop_down\n </span>\n }\n </button>\n @if (isLoggedIn && showAccountDropdown) {\n <div @libHbllFadeInOut id=\"accountDropdown\" data-testid=\"accountDropdown\">\n <a [href]=\"mainsitebaseurl + '/account'\">My Account</a>\n <a [href]=\"mainsitebaseurl + '/account'\">My Items</a>\n <a [href]=\"mainsitebaseurl + '/account/request'\">Request an item</a>\n <a [href]=\"mainsitebaseurl + '/account/saved'\">Saved</a>\n <a [href]=\"mainsitebaseurl + '/account/course'\">Courses</a>\n <a [href]=\"mainsitebaseurl + '/account/rooms'\">Rooms</a>\n <a [href]=\"mainsitebaseurl + '/account/preferences'\">Preferences</a>\n @if (showImpersonateButton()) {\n <button\n (click)=\"openImpersonationModal.emit(); showAccountDropdown = false\"\n class=\"hbll-header-impersonate-btn\"\n >\n Impersonate\n </button>\n }\n <button (click)=\"logout.emit()\" data-testid=\"logout\">Logout</button>\n </div>\n }\n </div>\n @if (isScreenSmall()) {\n <div id=\"mobileNav\">\n <button\n class=\"hbll-header-wrapper\"\n data-testid=\"mobileNavBtn\"\n (click)=\"openSidebarNav()\"\n >\n <span class=\"material-symbols-outlined hbll-header-icon\"> menu </span>\n </button>\n @if (showNavBar) {\n <div\n id=\"navWrapper\"\n data-testid=\"mobileNav\"\n [@libHbllSlideInOutRightLeft]=\"{\n value: '',\n params: { xOffset: '400px' },\n }\"\n >\n <button\n id=\"closeMobileNavBtn\"\n class=\"hbll-header-wrapper\"\n data-testid=\"closeMobileNavBtn\"\n (click)=\"closeSidebarNav()\"\n >\n <span class=\"material-symbols-outlined hbll-header-icon\"> close </span>\n </button>\n <lib-nav-bar\n [mainSiteBaseUrl]=\"mainsitebaseurl\"\n [height]=\"mobileSidebarHeight\"\n />\n </div>\n <div\n @libHbllFadeInOut\n (click)=\"showNavBar = false\"\n class=\"hbll-nav-backdrop\"\n data-testid=\"mobileNavBackdrop\"\n ></div>\n }\n </div>\n }\n </div>\n</header>\n\n@if (!isScreenSmall()) {\n <div id=\"mainNav\">\n <lib-nav-bar [mainSiteBaseUrl]=\"mainsitebaseurl\" />\n </div>\n}\n@if (isScreenSmall()) {\n <a\n id=\"mobileLibraryHours\"\n [href]=\"mainsitebaseurl + '/about/hours'\"\n class=\"hbll-header-wrapper\"\n data-testid=\"mobileHours\"\n >\n <ng-container *ngTemplateOutlet=\"hoursTextBlock\"></ng-container>\n </a>\n}\n\n<ng-template #hoursTextBlock>\n @if (libraryHours()) {\n <span class=\"material-symbols-outlined hbll-header-left-icon\"> schedule </span>\n {{\n libraryHours()?.is_closed\n ? 'CLOSED'\n : \"Today's hours: \" +\n (libraryHours()!.date | libraryHours: libraryHours()!.open_time) +\n ' - ' +\n (libraryHours()!.date | libraryHours: libraryHours()!.close_time)\n }}\n }\n</ng-template>\n", styles: [".lib-spinner{border:.3em solid #dfe9f7;border-top:.3em solid #4070b0;border-radius:100%;width:30px;height:30px;animation:loadingSpinnerAnimate 1s ease infinite;position:relative}@keyframes loadingSpinnerAnimate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}*{box-sizing:border-box;text-decoration:none}*:not(.material-symbols-outlined){font-family:inherit}.hbll-header-wrapper{display:flex;align-items:center;font-size:1em}.hbll-nav-backdrop{background-color:#000;opacity:.3;height:100vh;width:100vw;left:0;top:0;transform:translate(-100vw);position:absolute;z-index:-1}#mobileLibraryHours{color:#141414;background-color:#e6e6e6;font-size:1em;min-height:2em}#mobileLibraryHours.hbll-header-wrapper{width:100%;justify-content:center;padding:.2em}.hbll-header-icon,.hbll-header-left-icon{font-size:1.2em}.hbll-header-left-icon{margin-right:.2em}header{background-color:#002e5d;display:flex;align-items:center;position:relative}header a h1{font-size:100%;margin:0;height:1.8em}header a h1 img{height:100%;padding:0 0 0 .6em}header #libraryInfo{margin-left:auto;color:#fff}header #libraryInfo a,header #libraryInfo button{transition:color .2s ease-in-out;color:#fffc}header #libraryInfo a:hover,header #libraryInfo button:hover{color:#fff}header #libraryInfo #accountInfo button,header #libraryInfo #mobileNav button{padding:.8em .6em}header #libraryInfo #accountBtn .name{margin-left:.4em}header #libraryInfo #mobileNav{position:relative;z-index:11}header #libraryInfo #mobileNav #navWrapper{color:#fff;position:absolute;top:0;right:0}header #libraryInfo #mobileNav #navWrapper #closeMobileNavBtn{background-color:#0047ba;margin-left:auto;padding-left:.9em}header #libraryInfo :last-child button{padding-right:1em!important}header #libraryInfo .hbll-header-icon,header #libraryInfo .hbll-header-left-icon{font-size:1.6em}header #libraryInfo #accountInfo{position:relative}header #libraryInfo #accountInfo #accountDropdown{font-size:1em;text-wrap:nowrap;position:absolute;background-color:#002e5d;top:100%;right:-32px;z-index:11;background-color:#233753}header #libraryInfo #accountInfo #accountDropdown .hbll-header-impersonate-btn{color:#ca7ad1cc}header #libraryInfo #accountInfo #accountDropdown .hbll-header-impersonate-btn:hover{color:#ca7ad1}header #libraryInfo #accountInfo #accountDropdown a,header #libraryInfo #accountInfo #accountDropdown button{display:block;width:100%;text-align:left;padding:.4em 1.2em;font-size:1.1em}header #libraryInfo #accountInfo #accountDropdown a:first-child,header #libraryInfo #accountInfo #accountDropdown button:first-child{margin-bottom:.4em;padding-top:.6em;padding-bottom:.6em;border-bottom:1px solid rgba(255,255,255,.3)}header #libraryInfo #accountInfo #accountDropdown a:last-child,header #libraryInfo #accountInfo #accountDropdown button:last-child{margin-top:.4em;border-top:1px solid rgba(255,255,255,.3);padding-top:.6em;padding-bottom:.6em}header #libraryInfo #accountInfo #accountDropdown:before{content:\"\";width:0;height:0;border-style:solid;border-width:0 .6em .6em .6em;border-color:transparent transparent hsl(214,41%,23%) transparent;position:absolute;bottom:100%;right:50%;transform:translate(50%);z-index:inherit}header.hbll-header-desktop{padding:0 2em}header.hbll-header-desktop #libraryInfo #mainLibraryHours{position:relative;margin-right:1em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown{z-index:11;background-color:#fff;border-radius:4px;border:1px solid #d2d2d2;position:absolute;color:#000;padding:2em;top:100%;max-width:400%;right:50%;transform:translate(50%);margin-top:.6em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section{display:grid;grid-template-columns:repeat(3,9em);grid-template-rows:1fr;grid-column-gap:0px;grid-row-gap:0px;margin-bottom:1em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section h2{margin:0}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours-note{grid-column:2/4;font-size:.8em;margin-top:1em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours-note ul{list-style-type:disc;list-style-position:inside;margin-left:.8em;padding:0}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours-note ul li span{left:-8px;position:relative}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-header{font-weight:600;font-size:1.2em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-detail,header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours{margin-top:.2em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-detail .hbll-header-item+.hbll-header-item,header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours .hbll-header-item+.hbll-header-item{margin-top:.3em}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-detail h3,header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours h3{margin:0;font-size:inherit}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-detail{font-weight:600;white-space:nowrap}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown .hbll-header-section .hbll-header-hours{white-space:nowrap}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown a{color:#4070b0;display:flex;align-items:center;float:right}header.hbll-header-desktop #libraryInfo #mainLibraryHours #libraryHoursDropdown a:hover{color:#6892ca}header.hbll-header-desktop #libraryInfo #accountInfo #accountDropdown{right:auto;left:50%;transform:translate(-50%)}button{background-color:transparent;border:none;cursor:pointer;font-family:inherit;font-size:inherit;color:inherit;padding:0}\n"] }]
|
|
93
|
-
}], propDecorators: { header: [{
|
|
94
|
-
type: ViewChild,
|
|
95
|
-
args: ['header']
|
|
96
|
-
}], name: [{
|
|
97
|
-
type: Input
|
|
98
|
-
}], mainsitebaseurl: [{
|
|
99
|
-
type: Input
|
|
100
|
-
}], openImpersonationModal: [{
|
|
101
|
-
type: Output
|
|
102
|
-
}], login: [{
|
|
54
|
+
args: [{ selector: 'lib-hbll-header', standalone: true, imports: [DatePipe, LowerCasePipe, LibraryHoursDatePipe], template: "<header role=\"banner\" class=\"wrapper\">\n <h1>\n <a href=\"https://lib.byu.edu/\">\n <img\n src=\"https://media.lib.byu.edu/web-assets/images/1.0.0/byu-library-logo-full.svg\"\n alt=\"BYU Library Logo\"\n />\n </a>\n </h1>\n <div id=\"libraryInfo\" class=\"wrapper\">\n @if (libraryHours()) {\n <div id=\"libraryHours\">\n <div class=\"wrapper\">\n <span class=\"material-symbols-outlined left-icon\"> schedule </span>\n {{\n libraryHours()?.is_closed\n ? \"CLOSED\"\n : \"Today's hours: \" +\n (libraryHours()!.date\n | libraryHoursDate : libraryHours()!.open_time\n | date : \"ha\"\n | lowercase) +\n \" - \" +\n (libraryHours()!.date\n | libraryHoursDate : libraryHours()!.close_time\n | date : \"ha\"\n | lowercase)\n }}\n </div>\n </div>\n }\n <div id=\"accountInfo\" #accountInfo>\n <button\n (click)=\"\n isLoggedIn()\n ? (showAccountDropdown = !showAccountDropdown)\n : login.emit()\n \"\n class=\"wrapper\"\n id=\"accountBtn\"\n >\n <span class=\"material-symbols-outlined left-icon\"> person </span>\n {{ isLoggedIn() ? name : \"Login\" }}\n @if (isLoggedIn()) {\n <span class=\"material-symbols-outlined\"> arrow_drop_down </span>\n }\n </button>\n @if (isLoggedIn() && showAccountDropdown) {\n <div id=\"accountDropdown\">\n <a class=\"item\">My Account</a>\n <a class=\"item\">Preferences</a>\n <button class=\"item\" (click)=\"logout.emit()\">Logout</button>\n </div>\n }\n </div>\n </div>\n</header>\n<nav></nav>\n", styles: [":host{font-family:Source Sans Pro}.wrapper{display:flex;align-items:center}header{background-color:#002e5d;display:flex;align-items:center;padding:.6rem 1rem}h1{height:2rem}#libraryInfo{margin-left:auto}#libraryHours,#accountInfo{color:#fff;margin:.6rem}.left-icon{margin-right:.4rem}img{height:100%}#accountInfo{position:relative}#accountInfo #accountBtn:hover{opacity:.6}#accountInfo #accountDropdown{font-size:1.1rem;text-wrap:nowrap;position:absolute;background-color:#002e5d;top:100%;right:0;padding:1.2rem}#accountInfo #accountDropdown .item{display:block;padding:.4rem 0;width:100%;text-align:left}#accountInfo #accountDropdown .item:first-child{padding-top:0}#accountInfo #accountDropdown .item:last-child{padding-bottom:0}button{background-color:transparent;border:none;cursor:pointer;font-family:inherit;font-size:inherit;color:inherit;padding:0}\n"] }]
|
|
55
|
+
}], propDecorators: { login: [{
|
|
103
56
|
type: Output
|
|
104
57
|
}], logout: [{
|
|
105
58
|
type: Output
|
|
106
|
-
}], onResize: [{
|
|
107
|
-
type: HostListener,
|
|
108
|
-
args: ['window:resize', ['$event']]
|
|
109
59
|
}] } });
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtaGVhZGVyL2hibGwtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLWhlYWRlci9oYmxsLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FB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QUFDLE1BQU0sQ0FBQztnQkFBRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQWNPLFFBQVE7UUFDWixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDOzhHQTdFUSxtQkFBbUI7a0dBQW5CLG1CQUFtQiwrOUJDM0NoQyx5clRBOE1BLHFxTUQ5S1EsUUFBUSx3Q0FFUixnQkFBZ0Isb0RBQ2hCLFlBQVkseVZBQ1osZUFBZSxpRkFLUCxDQUFDLDBCQUEwQixFQUFFLGdCQUFnQixDQUFDOzsyRkFFakQsbUJBQW1CO2tCQWYvQixTQUFTOytCQUNJLGlCQUFpQixjQUNmLElBQUksV0FDUDt3QkFDTCxRQUFRO3dCQUNSLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsdUJBQXVCO3FCQUMxQixjQUdXLENBQUMsMEJBQTBCLEVBQUUsZ0JBQWdCLENBQUM7OEJBU3JDLE1BQU07c0JBQTFCLFNBQVM7dUJBQUMsUUFBUTtnQkFJVixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFHSSxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkEwREMsUUFBUTtzQkFEZixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSwgRGF0ZVBpcGUsIERPQ1VNRU5ULCBMb3dlckNhc2VQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2QmFyQ29tcG9uZW50IH0gZnJvbSAnLi9uYXYtYmFyL25hdi1iYXIuY29tcG9uZW50JztcbmltcG9ydCB7IGxpYkhibGxGYWRlSW5PdXQsIGxpYkhibGxTbGlkZUluT3V0UmlnaHRMZWZ0IH0gZnJvbSAnLi4vYW5pbWF0aW9ucy9hbmltYXRpb25zJztcbmltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgaXNTY3JlZW5TbWFsbFNpZ25hbCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IExpYnJhcnlIb3Vyc1BpcGUgfSBmcm9tICcuL3BpcGVzL2xpYnJhcnktaG91cnMucGlwZSc7XG5pbXBvcnQgeyBtYXAsIG9mLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFeHBhbmRDb2xsYXBzZUNvbXBvbmVudCB9IGZyb20gJy4uL2V4cGFuZC1jb2xsYXBzZS9leHBhbmQtY29sbGFwc2UuY29tcG9uZW50JztcbmltcG9ydCB7IExpYnJhcnlIb3VycyB9IGZyb20gJy4vbW9kZWxzL2xpYnJhcnktaG91cnMnO1xuXG5leHBvcnQgY29uc3QgTElCUkFSWV9IT1VSU19BUElfVVJMID0gJ2h0dHBzOi8vYXBwcy5saWIuYnl1LmVkdS9saWJyYXJ5aG91cnMvYXBpL2hvdXJzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItaGJsbC1oZWFkZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBEYXRlUGlwZSxcbiAgICAgICAgTG93ZXJDYXNlUGlwZSxcbiAgICAgICAgTGlicmFyeUhvdXJzUGlwZSxcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBOYXZCYXJDb21wb25lbnQsXG4gICAgICAgIEV4cGFuZENvbGxhcHNlQ29tcG9uZW50LFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2hibGwtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vaGJsbC1oZWFkZXIuY29tcG9uZW50LnNjc3MnLFxuICAgIGFuaW1hdGlvbnM6IFtsaWJIYmxsU2xpZGVJbk91dFJpZ2h0TGVmdCwgbGliSGJsbEZhZGVJbk91dF0sXG59KVxuZXhwb3J0IGNsYXNzIEhibGxIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgLy8gVE9ETzogZG9lcyB0aGlzIGluY3JlYXNlIGJ1bmRsZSBzaXplIG1vcmUgdGhhbiBpdCdzIHdvcnRoPyB2cyBmZXRjaD9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBibyA9IGluamVjdChCcmVha3BvaW50T2JzZXJ2ZXIpO1xuICAgIHByaXZhdGUgZG9jID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlcicpIGhlYWRlciE6IEVsZW1lbnRSZWY7XG5cbiAgICAvLyAtLS0gQVBJIC0tLVxuICAgIC8vIFRPRE86IENvbnZlcnQgdGhlc2UgdG8gc2lnbmFsIGlucHV0czogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvNTc3NTVcbiAgICBASW5wdXQoKSBuYW1lID0gJyc7XG4gICAgQElucHV0KCkgbWFpbnNpdGViYXNldXJsID0gJ2h0dHBzOi8vbGliLmJ5dS5lZHUnO1xuICAgIC8vIFRPRE86IHRoaXMgaXMgYSBzaW5nYWwgaW5wdXQgY3VycmVudGx5IGJlY2F1c2UgaXQgd29uJ3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgYXBwbGljYXRpb25zIHRoYW4gQW5ndWxhciBvbmVzLlxuICAgIHNob3dJbXBlcnNvbmF0ZUJ1dHRvbiA9IGlucHV0KGZhbHNlKTtcbiAgICBAT3V0cHV0KCkgb3BlbkltcGVyc29uYXRpb25Nb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgbG9naW4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gICAgQE91dHB1dCgpIGxvZ291dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICAvLyAtLS0tLS0tLS0tLVxuICAgIHByaXZhdGUgZm9ybWF0RGF0ZUZvckhvdXJzID0gKGRhdGU6IERhdGUpID0+XG4gICAgICAgIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICBwcml2YXRlIGFjY291bnRJbmZvRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2FjY291bnRJbmZvJyk7XG4gICAgcHJpdmF0ZSBob3Vyc0VsID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdob3VycycpO1xuXG4gICAgcHJvdGVjdGVkIGdldCBpc0xvZ2dlZEluKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgLy8gSG91cnNcbiAgICBwcm90ZWN0ZWQgbGlicmFyeUhvdXJzID0gdG9TaWduYWwodGhpcy5odHRwLmdldDxMaWJyYXJ5SG91cnM+KExJQlJBUllfSE9VUlNfQVBJX1VSTCkpO1xuICAgIHByb3RlY3RlZCBob3Vyc0V4Y2VwdGlvbnMkID0gb2YobnVsbCkucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEdldCBleGNlcHRpb25zIGZyb20gdG9kYXkgdG8gdHdvIG1vbnRocyBvdXRcbiAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5mb3JtYXREYXRlRm9ySG91cnModG9kYXkpO1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBuZXdEYXRlLnNldE1vbnRoKHRvZGF5LmdldE1vbnRoKCkgKyAyKTtcbiAgICAgICAgICAgIGNvbnN0IHN0b3AgPSB0aGlzLmZvcm1hdERhdGVGb3JIb3VycyhuZXdEYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBbc3RhcnQsIHN0b3BdO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKChbc3RhcnQsIHN0b3BdOiBzdHJpbmdbXSkgPT5cbiAgICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAgIC5nZXQ8TGlicmFyeUhvdXJzW10+KGAke0xJQlJBUllfSE9VUlNfQVBJX1VSTH0/c3RhcnQ9JHtzdGFydH0mc3RvcD0ke3N0b3B9YClcbiAgICAgICAgICAgICAgICAucGlwZShtYXAoKHJlcykgPT4gcmVzLmZpbHRlcigoZGF5KSA9PiBkYXkuaGFzX2V4Y2VwdGlvbikuc2xpY2UoMCwgNSkpKSxcbiAgICAgICAgKSxcbiAgICAgICAgc2hhcmVSZXBsYXkoMSksXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCBzaG93QWNjb3VudERyb3Bkb3duID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHNob3dMaWJyYXJ5SG91cnMgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgbW9iaWxlU2lkZWJhckhlaWdodCA9IDA7XG4gICAgcHJvdGVjdGVkIHNob3dOYXZCYXIgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgaXNTY3JlZW5TbWFsbCA9IGlzU2NyZWVuU21hbGxTaWduYWwodGhpcy5ibyk7XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucjIubGlzdGVuKCd3aW5kb3cnLCAnY2xpY2snLCAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hY2NvdW50SW5mb0VsKCk/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FjY291bnREcm9wZG93biA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhvdXJzRWwoKT8ubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCkpIHRoaXMuc2hvd0xpYnJhcnlIb3VycyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZXRNb2JpbGVTaWRlYmFySGVpZ2h0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9wZW5TaWRlYmFyTmF2ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dOYXZCYXIgPSB0cnVlO1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgICAgIHRoaXMucjIuc2V0U3R5bGUodGhpcy5kb2MuYm9keSwgJ292ZXJmbG93JywgJ2hpZGRlbicpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VTaWRlYmFyTmF2ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dOYXZCYXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yMi5yZW1vdmVTdHlsZSh0aGlzLmRvYy5ib2R5LCAnb3ZlcmZsb3cnKTtcbiAgICB9O1xuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gICAgcHJpdmF0ZSBvblJlc2l6ZSgpIHtcbiAgICAgICAgdGhpcy5zZXRNb2JpbGVTaWRlYmFySGVpZ2h0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRNb2JpbGVTaWRlYmFySGVpZ2h0ID0gKCkgPT5cbiAgICAgICAgKHRoaXMubW9iaWxlU2lkZWJhckhlaWdodCA9XG4gICAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmhlYWRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG59XG4iLCI8aGVhZGVyXG4gICAgcm9sZT1cImJhbm5lclwiXG4gICAgY2xhc3M9XCJoYmxsLWhlYWRlci13cmFwcGVyXCJcbiAgICAjaGVhZGVyXG4gICAgW25nQ2xhc3NdPVwieyAnaGJsbC1oZWFkZXItZGVza3RvcCc6ICFpc1NjcmVlblNtYWxsKCkgfVwiXG4+XG4gICAgPGEgW2hyZWZdPVwibWFpbnNpdGViYXNldXJsXCI+XG4gICAgICAgIDxoMT5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL21lZGlhLmxpYi5ieXUuZWR1L3dlYi1hc3NldHMvaW1hZ2VzLzIuMC4wL2J5dS1oYmxsLWxvZ28tZnVsbC5zdmdcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkJZVSBMaWJyYXJ5IExvZ29cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9oMT5cbiAgICA8L2E+XG4gICAgPGRpdiBpZD1cImxpYnJhcnlJbmZvXCIgY2xhc3M9XCJoYmxsLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgIEBpZiAoIWlzU2NyZWVuU21hbGwoKSkge1xuICAgICAgICAgICAgPGRpdiAjaG91cnMgaWQ9XCJtYWluTGlicmFyeUhvdXJzXCIgZGF0YS10ZXN0aWQ9XCJkZXNrdG9wSG91cnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93TGlicmFyeUhvdXJzID0gIXNob3dMaWJyYXJ5SG91cnNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhibGwtaGVhZGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImhvdXJzQnRuXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJob3Vyc1RleHRCbG9ja1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIEBpZiAoIWlzU2NyZWVuU21hbGwoKSAmJiBzaG93TGlicmFyeUhvdXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIEBsaWJIYmxsRmFkZUluT3V0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImxpYnJhcnlIb3Vyc0Ryb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibGlicmFyeUhvdXJzRHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImhibGwtaGVhZGVyLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJoYmxsLWhlYWRlci1oZWFkZXJcIj5SZWd1bGFyIEhvdXJzPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGJsbC1oZWFkZXItZGV0YWlsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImhibGwtaGVhZGVyLWl0ZW1cIj5Nb25kYXkgLSBGcmlkYXk8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJoYmxsLWhlYWRlci1pdGVtXCI+U2F0dXJkYXk8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJoYmxsLWhlYWRlci1pdGVtXCI+U3VuZGF5PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGJsbC1oZWFkZXItaG91cnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhibGwtaGVhZGVyLWl0ZW1cIj43IGEubSAtIG1pZG5pZ2h0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYmxsLWhlYWRlci1pdGVtXCI+OCBhLm0gLSBtaWRuaWdodDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGJsbC1oZWFkZXItaXRlbVwiPkNsb3NlZCo8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGJsbC1oZWFkZXItaG91cnMtbm90ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZhbWlseSBoaXN0b3J5IE9OTFkgNCBwLm0uIC0gOCBwLm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuPk5vIGNoZWNrb3V0cyBhZnRlciAxMTo0NSBwLm0uPC9zcGFuPjwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QWxsIHNlcnZpY2VzIGNsb3NlZCAxMDo0NSB0byBub29uIG9uIFR1ZXNkYXlzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiaGJsbC1oZWFkZXItc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cImhibGwtaGVhZGVyLWhlYWRlclwiPlVwY29taW5nIEV4Y2VwdGlvbnM8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaG91cnNFeGNlcHRpb25zJCB8IGFzeW5jOyBhcyBleGNlcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYmxsLWhlYWRlci1kZXRhaWxcIiBkYXRhLXRlc3RpZD1cImV4Y2VwdGlvbnNEZXRhaWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGV4Y2VwdGlvbiBvZiBleGNlcHRpb25zOyB0cmFjayBleGNlcHRpb24uZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImhibGwtaGVhZGVyLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXhjZXB0aW9uLmRhdGUgfCBkYXRlOiAnTU1NLiBkLCBZWVlZJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gdXBjb21pbmcgZXhjZXB0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhibGwtaGVhZGVyLWhvdXJzXCIgZGF0YS10ZXN0aWQ9XCJleGNlcHRpb25zSG91cnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGV4Y2VwdGlvbiBvZiBleGNlcHRpb25zOyB0cmFjayBleGNlcHRpb24uZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYmxsLWhlYWRlci1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV4Y2VwdGlvbi5leGNlcHRpb25fdGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWItc3Bpbm5lclwiIGRhdGEtdGVzdGlkPVwiZXhjZXB0aW9uc1NwaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImhibGwtaGVhZGVyLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJoYmxsLWhlYWRlci1oZWFkZXJcIj5MaWJyYXJ5IENhZmU8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYmxsLWhlYWRlci1kZXRhaWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiaGJsbC1oZWFkZXItaXRlbVwiPkJhZ2VsIEJ1YmJsZTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImhibGwtaGVhZGVyLWl0ZW1cIj5Qcm92ZWNobzwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhibGwtaGVhZGVyLWhvdXJzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYmxsLWhlYWRlci1pdGVtXCI+NyBhLm0gLSAxMSBwLm0uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYmxsLWhlYWRlci1pdGVtXCI+MTA6MzAgYS5tIC0gMiBwLm0uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJtYWluc2l0ZWJhc2V1cmwgKyAnL2Fib3V0L2hvdXJzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlNlZSBhbGwgaG91cnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2hldnJvbl9yaWdodCA8L3NwYW4+PC9hXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgaWQ9XCJhY2NvdW50SW5mb1wiICNhY2NvdW50SW5mbz5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXNMb2dnZWRJbiA/IChzaG93QWNjb3VudERyb3Bkb3duID0gIXNob3dBY2NvdW50RHJvcGRvd24pIDogbG9naW4uZW1pdCgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhibGwtaGVhZGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgIGlkPVwiYWNjb3VudEJ0blwiXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJhY2NvdW50QnRuXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgaGJsbC1oZWFkZXItaWNvblwiPiBwZXJzb24gPC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoIWlzU2NyZWVuU21hbGwoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhibGwtaGVhZGVyLW5hbWVcIiBkYXRhLXRlc3RpZD1cIm5hbWVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2dnZWRJbiA/ICcmbmJzcDsnICsgbmFtZSA6ICdMb2dpbidcbiAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoaXNMb2dnZWRJbikge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiBkYXRhLXRlc3RpZD1cImxvZ2luRHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93X2Ryb3BfZG93blxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICBAaWYgKGlzTG9nZ2VkSW4gJiYgc2hvd0FjY291bnREcm9wZG93bikge1xuICAgICAgICAgICAgICAgIDxkaXYgQGxpYkhibGxGYWRlSW5PdXQgaWQ9XCJhY2NvdW50RHJvcGRvd25cIiBkYXRhLXRlc3RpZD1cImFjY291bnREcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJtYWluc2l0ZWJhc2V1cmwgKyAnL2FjY291bnQnXCI+TXkgQWNjb3VudDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwibWFpbnNpdGViYXNldXJsICsgJy9hY2NvdW50J1wiPk15IEl0ZW1zPC9hPlxuICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJtYWluc2l0ZWJhc2V1cmwgKyAnL2FjY291bnQvcmVxdWVzdCdcIj5SZXF1ZXN0IGFuIGl0ZW08L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIm1haW5zaXRlYmFzZXVybCArICcvYWNjb3VudC9zYXZlZCdcIj5TYXZlZDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwibWFpbnNpdGViYXNldXJsICsgJy9hY2NvdW50L2NvdXJzZSdcIj5Db3Vyc2VzPC9hPlxuICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJtYWluc2l0ZWJhc2V1cmwgKyAnL2FjY291bnQvcm9vbXMnXCI+Um9vbXM8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIm1haW5zaXRlYmFzZXVybCArICcvYWNjb3VudC9wcmVmZXJlbmNlcydcIj5QcmVmZXJlbmNlczwvYT5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93SW1wZXJzb25hdGVCdXR0b24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSW1wZXJzb25hdGlvbk1vZGFsLmVtaXQoKTsgc2hvd0FjY291bnREcm9wZG93biA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhibGwtaGVhZGVyLWltcGVyc29uYXRlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wZXJzb25hdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvZ291dC5lbWl0KClcIiBkYXRhLXRlc3RpZD1cImxvZ291dFwiPkxvZ291dDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChpc1NjcmVlblNtYWxsKCkpIHtcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJtb2JpbGVOYXZcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGJsbC1oZWFkZXItd3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibW9iaWxlTmF2QnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TaWRlYmFyTmF2KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGhibGwtaGVhZGVyLWljb25cIj4gbWVudSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgQGlmIChzaG93TmF2QmFyKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibmF2V3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1vYmlsZU5hdlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbQGxpYkhibGxTbGlkZUluT3V0UmlnaHRMZWZ0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IHhPZmZzZXQ6ICc0MDBweCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJjbG9zZU1vYmlsZU5hdkJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoYmxsLWhlYWRlci13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImNsb3NlTW9iaWxlTmF2QnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VTaWRlYmFyTmF2KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBoYmxsLWhlYWRlci1pY29uXCI+IGNsb3NlIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1uYXYtYmFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21haW5TaXRlQmFzZVVybF09XCJtYWluc2l0ZWJhc2V1cmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwibW9iaWxlU2lkZWJhckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgQGxpYkhibGxGYWRlSW5PdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93TmF2QmFyID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoYmxsLW5hdi1iYWNrZHJvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cIm1vYmlsZU5hdkJhY2tkcm9wXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L2hlYWRlcj5cblxuQGlmICghaXNTY3JlZW5TbWFsbCgpKSB7XG4gICAgPGRpdiBpZD1cIm1haW5OYXZcIj5cbiAgICAgICAgPGxpYi1uYXYtYmFyIFttYWluU2l0ZUJhc2VVcmxdPVwibWFpbnNpdGViYXNldXJsXCIgLz5cbiAgICA8L2Rpdj5cbn1cbkBpZiAoaXNTY3JlZW5TbWFsbCgpKSB7XG4gICAgPGFcbiAgICAgICAgaWQ9XCJtb2JpbGVMaWJyYXJ5SG91cnNcIlxuICAgICAgICBbaHJlZl09XCJtYWluc2l0ZWJhc2V1cmwgKyAnL2Fib3V0L2hvdXJzJ1wiXG4gICAgICAgIGNsYXNzPVwiaGJsbC1oZWFkZXItd3JhcHBlclwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwibW9iaWxlSG91cnNcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhvdXJzVGV4dEJsb2NrXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9hPlxufVxuXG48bmctdGVtcGxhdGUgI2hvdXJzVGV4dEJsb2NrPlxuICAgIEBpZiAobGlicmFyeUhvdXJzKCkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGhibGwtaGVhZGVyLWxlZnQtaWNvblwiPiBzY2hlZHVsZSA8L3NwYW4+XG4gICAgICAgIHt7XG4gICAgICAgICAgICBsaWJyYXJ5SG91cnMoKT8uaXNfY2xvc2VkXG4gICAgICAgICAgICAgICAgPyAnQ0xPU0VEJ1xuICAgICAgICAgICAgICAgIDogXCJUb2RheSdzIGhvdXJzOiBcIiArXG4gICAgICAgICAgICAgICAgICAobGlicmFyeUhvdXJzKCkhLmRhdGUgfCBsaWJyYXJ5SG91cnM6IGxpYnJhcnlIb3VycygpIS5vcGVuX3RpbWUpICtcbiAgICAgICAgICAgICAgICAgICcgLSAnICtcbiAgICAgICAgICAgICAgICAgIChsaWJyYXJ5SG91cnMoKSEuZGF0ZSB8IGxpYnJhcnlIb3VyczogbGlicmFyeUhvdXJzKCkhLmNsb3NlX3RpbWUpXG4gICAgICAgIH19XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtaGVhZGVyL2hibGwtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLWhlYWRlci9oYmxsLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUVILFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLElBQUksRUFFSixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDOztBQUV2QixNQUFNLHFCQUFxQixHQUFHLGlEQUFpRCxDQUFDO0FBaUJoRixNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLFNBQVMsQ0FBQyxJQUFZLEVBQUUsSUFBWTtRQUNoQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQzs4R0FIUSxvQkFBb0I7NEdBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFKaEMsSUFBSTttQkFBQztvQkFDRixJQUFJLEVBQUUsa0JBQWtCO29CQUN4QixVQUFVLEVBQUUsSUFBSTtpQkFDbkI7O0FBT0Q7Ozs7Ozs7R0FPRztBQVFILE1BQU0sT0FBTyxtQkFBbUI7SUFQaEM7UUFRcUIsT0FBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QixTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTNDLGNBQWM7UUFDSixTQUFJLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVDLGNBQWM7UUFFTixrQkFBYSxHQUFHLFNBQVMsQ0FBYSxhQUFhLENBQUMsQ0FBQztRQUVuRCxlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzQyxpQkFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBZSxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDNUUsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO0tBUXpDO0lBTkcsZUFBZTtRQUNYLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFRLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDdkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBckJRLG1CQUFtQjtrR0FBbkIsbUJBQW1CLHlYQ3hEaEMsbXlEQTBEQSwrNEJETmMsUUFBUSx3Q0FBRSxhQUFhLDZDQWpCeEIsb0JBQW9COzsyRkFxQnBCLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDSSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixDQUFDOzhCQVU5QyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUsIExvd2VyQ2FzZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPdXRwdXQsXG4gICAgUGlwZSxcbiAgICBQaXBlVHJhbnNmb3JtLFxuICAgIFJlbmRlcmVyMixcbiAgICBjb21wdXRlZCxcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuY29uc3QgTElCUkFSWV9IT1VSU19BUElfVVJMID0gJ2h0dHBzOi8vYXBwcy5saWIuYnl1LmVkdS9saWJyYXJ5aG91cnMvYXBpL2hvdXJzJztcblxuaW50ZXJmYWNlIExpYnJhcnlIb3VycyB7XG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIGlzX2Nsb3NlZDogYm9vbGVhbjtcbiAgICBvcGVuX3RpbWU6IHN0cmluZztcbiAgICBjbG9zZV90aW1lOiBzdHJpbmc7XG4gICAgaGFzX2V4Y2VwdGlvbjogYm9vbGVhbjtcbiAgICBleGNlcHRpb25fdGl0bGU6IHN0cmluZztcbiAgICBleGNlcHRpb25fbWVzc2FnZTogc3RyaW5nO1xuICAgIGlzX2N1cnJlbnRseV9vcGVuOiBib29sZWFuO1xufVxuXG5AUGlwZSh7XG4gICAgbmFtZTogJ2xpYnJhcnlIb3Vyc0RhdGUnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIExpYnJhcnlIb3Vyc0RhdGVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gICAgdHJhbnNmb3JtKGRhdGU6IHN0cmluZywgdGltZTogc3RyaW5nKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlICsgJ1QnICsgdGltZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlYWRlciBjb21wb25lbnQgYnVpbHQgdG8gYmUgZXhwb3J0ZWQgYXMgYSBjdXN0b20gZWxlbWVudC5cbiAqIFRoaXMgY29tcG9uZW50IHVzZXMgaWNvbnMgcHJvdmlkZWQgYnkgR29vZ2xlIE1hdGVyaWFsLlxuICogVGhlIGxpbmsgdG8gdGhlc2UgaWNvbnMgc2hvdWxkIGJlIGluY2x1ZGVkIG9uY2UgaW4gdGhlIFxcPGhlYWQ+IG9mIHlvdXIgYmFzZSBodG1sLlxuICpcbiAqIFdoZW4gYSBub24tZW1wdHkgc3RyaW5nIGBuYW1lYCBpcyBwcm92aWRlZCB0byB0aGlzIGNvbXBvbmVudCwgdGhlIHVzZXIgaXMgY29uc2lkZXJlZCBsb2dnZWQgaW4uXG4gKiBUd28gb3V0cHV0cy9ldmVudHMgYXJlIGFjY2Vzc2libGU6IGBsb2dpbmAgYW5kIGBsb2dvdXRgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1oYmxsLWhlYWRlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbRGF0ZVBpcGUsIExvd2VyQ2FzZVBpcGUsIExpYnJhcnlIb3Vyc0RhdGVQaXBlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaGJsbC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9oYmxsLWhlYWRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEhibGxIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHIyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuXG4gICAgLy8gLS0tIEFQSSAtLS1cbiAgICBwcm90ZWN0ZWQgbmFtZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICAgIEBPdXRwdXQoKSBsb2dpbiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgbG9nb3V0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIC8vIC0tLS0tLS0tLS0tXG5cbiAgICBwcml2YXRlIGFjY291bnRJbmZvRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2FjY291bnRJbmZvJyk7XG5cbiAgICBwcm90ZWN0ZWQgaXNMb2dnZWRJbiA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5uYW1lKCkpO1xuICAgIHByb3RlY3RlZCBsaWJyYXJ5SG91cnMgPSB0b1NpZ25hbCh0aGlzLmh0dHAuZ2V0PExpYnJhcnlIb3Vycz4oTElCUkFSWV9IT1VSU19BUElfVVJMKSk7XG4gICAgcHJvdGVjdGVkIHNob3dBY2NvdW50RHJvcGRvd24gPSBmYWxzZTtcblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yMi5saXN0ZW4oJ3dpbmRvdycsICdjbGljaycsIChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFjY291bnRJbmZvRWwoKT8ubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QWNjb3VudERyb3Bkb3duID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIjxoZWFkZXIgcm9sZT1cImJhbm5lclwiIGNsYXNzPVwid3JhcHBlclwiPlxuICA8aDE+XG4gICAgPGEgaHJlZj1cImh0dHBzOi8vbGliLmJ5dS5lZHUvXCI+XG4gICAgICA8aW1nXG4gICAgICAgIHNyYz1cImh0dHBzOi8vbWVkaWEubGliLmJ5dS5lZHUvd2ViLWFzc2V0cy9pbWFnZXMvMS4wLjAvYnl1LWxpYnJhcnktbG9nby1mdWxsLnN2Z1wiXG4gICAgICAgIGFsdD1cIkJZVSBMaWJyYXJ5IExvZ29cIlxuICAgICAgLz5cbiAgICA8L2E+XG4gIDwvaDE+XG4gIDxkaXYgaWQ9XCJsaWJyYXJ5SW5mb1wiIGNsYXNzPVwid3JhcHBlclwiPlxuICAgIEBpZiAobGlicmFyeUhvdXJzKCkpIHtcbiAgICA8ZGl2IGlkPVwibGlicmFyeUhvdXJzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgbGVmdC1pY29uXCI+IHNjaGVkdWxlIDwvc3Bhbj5cbiAgICAgICAge3tcbiAgICAgICAgICBsaWJyYXJ5SG91cnMoKT8uaXNfY2xvc2VkXG4gICAgICAgICAgICA/IFwiQ0xPU0VEXCJcbiAgICAgICAgICAgIDogXCJUb2RheSdzIGhvdXJzOiBcIiArXG4gICAgICAgICAgICAgIChsaWJyYXJ5SG91cnMoKSEuZGF0ZVxuICAgICAgICAgICAgICAgIHwgbGlicmFyeUhvdXJzRGF0ZSA6IGxpYnJhcnlIb3VycygpIS5vcGVuX3RpbWVcbiAgICAgICAgICAgICAgICB8IGRhdGUgOiBcImhhXCJcbiAgICAgICAgICAgICAgICB8IGxvd2VyY2FzZSkgK1xuICAgICAgICAgICAgICBcIiAtIFwiICtcbiAgICAgICAgICAgICAgKGxpYnJhcnlIb3VycygpIS5kYXRlXG4gICAgICAgICAgICAgICAgfCBsaWJyYXJ5SG91cnNEYXRlIDogbGlicmFyeUhvdXJzKCkhLmNsb3NlX3RpbWVcbiAgICAgICAgICAgICAgICB8IGRhdGUgOiBcImhhXCJcbiAgICAgICAgICAgICAgICB8IGxvd2VyY2FzZSlcbiAgICAgICAgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2IGlkPVwiYWNjb3VudEluZm9cIiAjYWNjb3VudEluZm8+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBpc0xvZ2dlZEluKClcbiAgICAgICAgICAgID8gKHNob3dBY2NvdW50RHJvcGRvd24gPSAhc2hvd0FjY291bnREcm9wZG93bilcbiAgICAgICAgICAgIDogbG9naW4uZW1pdCgpXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwid3JhcHBlclwiXG4gICAgICAgIGlkPVwiYWNjb3VudEJ0blwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBsZWZ0LWljb25cIj4gcGVyc29uIDwvc3Bhbj5cbiAgICAgICAge3sgaXNMb2dnZWRJbigpID8gbmFtZSA6IFwiTG9naW5cIiB9fVxuICAgICAgICBAaWYgKGlzTG9nZ2VkSW4oKSkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gYXJyb3dfZHJvcF9kb3duIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9idXR0b24+XG4gICAgICBAaWYgKGlzTG9nZ2VkSW4oKSAmJiBzaG93QWNjb3VudERyb3Bkb3duKSB7XG4gICAgICA8ZGl2IGlkPVwiYWNjb3VudERyb3Bkb3duXCI+XG4gICAgICAgIDxhIGNsYXNzPVwiaXRlbVwiPk15IEFjY291bnQ8L2E+XG4gICAgICAgIDxhIGNsYXNzPVwiaXRlbVwiPlByZWZlcmVuY2VzPC9hPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaXRlbVwiIChjbGljayk9XCJsb2dvdXQuZW1pdCgpXCI+TG9nb3V0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2hlYWRlcj5cbjxuYXY+PC9uYXY+XG4iXX0=
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatAutocompleteModule, } from '@angular/material/autocomplete';
|
|
4
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
5
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
6
|
+
import { COMMA, ENTER } from '@angular/cdk/keycodes';
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
+
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
9
|
+
import { combineLatest } from 'rxjs';
|
|
10
|
+
import { map, startWith } from 'rxjs/operators';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/common";
|
|
13
|
+
import * as i2 from "@angular/material/chips";
|
|
14
|
+
import * as i3 from "@angular/material/form-field";
|
|
15
|
+
import * as i4 from "@angular/material/autocomplete";
|
|
16
|
+
import * as i5 from "@angular/material/core";
|
|
17
|
+
import * as i6 from "@angular/forms";
|
|
18
|
+
export class HbllMultiSelectComponent {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.allOptions = {};
|
|
21
|
+
this.label = '';
|
|
22
|
+
/**
|
|
23
|
+
* An array that indicates which keys are selected.
|
|
24
|
+
*/
|
|
25
|
+
this.selectedKeys = [];
|
|
26
|
+
/**
|
|
27
|
+
* An EventEmitter that emits an array of keys indicating which options are currently selected.
|
|
28
|
+
*/
|
|
29
|
+
this.selectedKeysChange = new EventEmitter();
|
|
30
|
+
this.inputControl = new FormControl('');
|
|
31
|
+
this.filteredOptions$ = combineLatest([
|
|
32
|
+
this.inputControl.valueChanges.pipe(startWith('')),
|
|
33
|
+
this.selectedKeysChange.asObservable().pipe(startWith([])),
|
|
34
|
+
]).pipe(map(([key]) =>
|
|
35
|
+
// Display filtered options if there is a value, else display all options currently not selected.
|
|
36
|
+
key
|
|
37
|
+
? this.filterOptions(key)
|
|
38
|
+
: Object.keys(this.allOptions).filter((key) => !this.selectedKeys.find((selectedOption) => key === selectedOption))));
|
|
39
|
+
this.separatorKeysCodes = [ENTER, COMMA];
|
|
40
|
+
/**
|
|
41
|
+
* Adds an option to the array of selected keys when a user selects from the autocomplete.
|
|
42
|
+
* @param {MatAutocompleteSelectedEvent} event MatAutocompleteSelectedEvent
|
|
43
|
+
*/
|
|
44
|
+
this.selectOption = (event) => {
|
|
45
|
+
this.addOptionToSelectedOptions(event.option.value);
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Filters the options by the supplied value as well as the currently selected values.
|
|
49
|
+
* @param {string} value value to filter by.
|
|
50
|
+
* @returns {string[]} the filtered keys
|
|
51
|
+
*/
|
|
52
|
+
this.filterOptions = (value) => {
|
|
53
|
+
return Object.keys(this.allOptions).filter((key) => this.allOptions[key].toLowerCase().includes(value.toLowerCase()) &&
|
|
54
|
+
!this.selectedKeys.includes(key));
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Adds a key to the selected keys array if the option is truthy and not already in the array.
|
|
58
|
+
* The input is also cleared (if available), and the new selected keys are emitted.
|
|
59
|
+
* @param {key} option key to add
|
|
60
|
+
*/
|
|
61
|
+
this.addOptionToSelectedOptions = (key) => {
|
|
62
|
+
if (key && !this.selectedKeys.includes(key) && this.allOptions[key]) {
|
|
63
|
+
this.selectedKeys.push(key);
|
|
64
|
+
this.inputControl.setValue('');
|
|
65
|
+
this.selectedKeysChange.emit(this.selectedKeys);
|
|
66
|
+
if (this.inputRef)
|
|
67
|
+
this.inputRef.nativeElement.value = '';
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Adds a key from the input to the array of selected key.
|
|
73
|
+
* The value from the input must match a key from the record of all options.
|
|
74
|
+
* @param {MatChipInputEvent} event MatChipInputEvent
|
|
75
|
+
*/
|
|
76
|
+
addOption(event) {
|
|
77
|
+
this.addOptionToSelectedOptions(event.value);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Removes a key from the array of selected options and emits the new selected keys.
|
|
81
|
+
* @param {MultiSelectKeyValPair} key key to remove
|
|
82
|
+
*/
|
|
83
|
+
removeOption(key) {
|
|
84
|
+
const index = this.selectedKeys.indexOf(key);
|
|
85
|
+
if (index >= 0) {
|
|
86
|
+
this.selectedKeys.splice(index, 1);
|
|
87
|
+
this.selectedKeysChange.emit(this.selectedKeys);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllMultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
91
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllMultiSelectComponent, isStandalone: true, selector: "lib-hbll-multi-select", inputs: { allOptions: "allOptions", label: "label", selectedKeys: "selectedKeys" }, outputs: { selectedKeysChange: "selectedKeysChange" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"components-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n @if (allOptions[key]) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined components-icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n }\n </mat-chip-grid>\n <label class=\"components-hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".components-multi-select{font:inherit}.components-multi-select mat-form-field{font:inherit;background-color:#fff;width:100%}.components-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.components-multi-select mat-form-field .mat-mdc-chip-input{font:inherit;margin-left:0}.components-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.components-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.components-multi-select .components-icon{font-size:1em}.components-multi-select .mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{font:inherit}.components-multi-select .components-hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i2.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i2.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i2.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatIconModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
92
|
+
}
|
|
93
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllMultiSelectComponent, decorators: [{
|
|
94
|
+
type: Component,
|
|
95
|
+
args: [{ selector: 'lib-hbll-multi-select', standalone: true, imports: [
|
|
96
|
+
CommonModule,
|
|
97
|
+
MatChipsModule,
|
|
98
|
+
MatFormFieldModule,
|
|
99
|
+
MatAutocompleteModule,
|
|
100
|
+
ReactiveFormsModule,
|
|
101
|
+
MatIconModule,
|
|
102
|
+
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"components-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n @if (allOptions[key]) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined components-icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n }\n </mat-chip-grid>\n <label class=\"components-hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".components-multi-select{font:inherit}.components-multi-select mat-form-field{font:inherit;background-color:#fff;width:100%}.components-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.components-multi-select mat-form-field .mat-mdc-chip-input{font:inherit;margin-left:0}.components-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.components-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.components-multi-select .components-icon{font-size:1em}.components-multi-select .mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{font:inherit}.components-multi-select .components-hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"] }]
|
|
103
|
+
}], propDecorators: { inputRef: [{
|
|
104
|
+
type: ViewChild,
|
|
105
|
+
args: ['input']
|
|
106
|
+
}], allOptions: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], label: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], selectedKeys: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], selectedKeysChange: [{
|
|
113
|
+
type: Output
|
|
114
|
+
}] } });
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2hibGwtbXVsdGktc2VsZWN0L2hibGwtbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9oYmxsLW11bHRpLXNlbGVjdC9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gscUJBQXFCLEdBRXhCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFxQixjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQW9CaEQsTUFBTSxPQUFPLHdCQUF3QjtJQWxCckM7UUFvQmEsZUFBVSxHQUEyQixFQUFFLENBQUM7UUFDeEMsVUFBSyxH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SSxDQUFDLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0wsQ0FBQzs4R0FoRFEsd0JBQXdCO2tHQUF4Qix3QkFBd0IsK1RDekNyQyxxekRBMkNBLDIzQkRoQlEsWUFBWSxnSkFDWixjQUFjLDR1QkFDZCxrQkFBa0IseU9BQ2xCLHFCQUFxQix3MUJBQ3JCLG1CQUFtQix5a0JBQ25CLGFBQWE7OzJGQVNSLHdCQUF3QjtrQkFsQnBDLFNBQVM7K0JBQ0ksdUJBQXVCLGNBQ3JCLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsYUFBYTtxQkFDaEIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTs4QkFLbkIsUUFBUTtzQkFBbkMsU0FBUzt1QkFBQyxPQUFPO2dCQUNULFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUksa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQsIE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzdGFydFdpdGggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWhibGwtbXVsdGktc2VsZWN0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRDaGlwc01vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgXSxcbiAgICAvLyBOZWNlc3NhcnkgdG8gb3ZlcnJpZGUgbWF0ZXJpYWwgZGVzaWduIHN0eWxlcy5cbiAgICAvLyBJTVBPUlRBTlQ6IFRpZ2h0bHkgc2NvcGUgY2xhc3NlcyBhbmQgaWRzIHRvIHRoaXMgY29tcG9uZW50IGlmIHRoZXkgYXJlIG5lY2Vzc2FyeS5cbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oYmxsLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IHtcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcpIHByaXZhdGUgaW5wdXRSZWYhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIEBJbnB1dCgpIGFsbE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBASW5wdXQoKSBsYWJlbCA9ICcnO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHRoYXQgaW5kaWNhdGVzIHdoaWNoIGtleXMgYXJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBBbiBFdmVudEVtaXR0ZXIgdGhhdCBlbWl0cyBhbiBhcnJheSBvZiBrZXlzIGluZGljYXRpbmcgd2hpY2ggb3B0aW9ucyBhcmUgY3VycmVudGx5IHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzZWxlY3RlZEtleXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gICAgcHJvdGVjdGVkIGlucHV0Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gICAgcHJvdGVjdGVkIGZpbHRlcmVkT3B0aW9ucyQ6IE9ic2VydmFibGU8c3RyaW5nW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCgnJykpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkS2V5c0NoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHN0YXJ0V2l0aChbXSkpLFxuICAgIF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW2tleV06IFtzdHJpbmcgfCBudWxsLCB1bmtub3duXSkgPT5cbiAgICAgICAgICAgIC8vIERpc3BsYXkgZmlsdGVyZWQgb3B0aW9ucyBpZiB0aGVyZSBpcyBhIHZhbHVlLCBlbHNlIGRpc3BsYXkgYWxsIG9wdGlvbnMgY3VycmVudGx5IG5vdCBzZWxlY3RlZC5cbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgID8gdGhpcy5maWx0ZXJPcHRpb25zKGtleSlcbiAgICAgICAgICAgICAgICA6IE9iamVjdC5rZXlzKHRoaXMuYWxsT3B0aW9ucykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgIChrZXkpID0+ICF0aGlzLnNlbGVjdGVkS2V5cy5maW5kKChzZWxlY3RlZE9wdGlvbikgPT4ga2V5ID09PSBzZWxlY3RlZE9wdGlvbiksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVIsIENPTU1BXTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBrZXkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIGFycmF5IG9mIHNlbGVjdGVkIGtleS5cbiAgICAgKiBUaGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbXVzdCBtYXRjaCBhIGtleSBmcm9tIHRoZSByZWNvcmQgb2YgYWxsIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtNYXRDaGlwSW5wdXRFdmVudH0gZXZlbnQgTWF0Q2hpcElucHV0RXZlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkT3B0aW9uKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFkZE9wdGlvblRvU2VsZWN0ZWRPcHRpb25zKGV2ZW50LnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEga2V5IGZyb20gdGhlIGFycmF5IG9mIHNlbGVjdGVkIG9wdGlvbnMgYW5kIGVtaXRzIHRoZSBuZXcgc2VsZWN0ZWQga2V5cy5cbiAgICAgKiBAcGFyYW0ge011bHRpU2VsZWN0S2V5VmFsUGFpcn0ga2V5IGtleSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlT3B0aW9uKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEtleXMuaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZEtleXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBvcHRpb24gdG8gdGhlIGFycmF5IG9mIHNlbGVjdGVkIGtleXMgd2hlbiBhIHVzZXIgc2VsZWN0cyBmcm9tIHRoZSBhdXRvY29tcGxldGUuXG4gICAgICogQHBhcmFtIHtNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50fSBldmVudCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlbGVjdE9wdGlvbiA9IChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmFkZE9wdGlvblRvU2VsZWN0ZWRPcHRpb25zKGV2ZW50Lm9wdGlvbi52YWx1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgdGhlIG9wdGlvbnMgYnkgdGhlIHN1cHBsaWVkIHZhbHVlIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIHZhbHVlIHRvIGZpbHRlciBieS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IHRoZSBmaWx0ZXJlZCBrZXlzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaWx0ZXJPcHRpb25zID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFsbE9wdGlvbnMpLmZpbHRlcihcbiAgICAgICAgICAgIChrZXk6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmFsbE9wdGlvbnNba2V5XS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuc2VsZWN0ZWRLZXlzLmluY2x1ZGVzKGtleSksXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBrZXkgdG8gdGhlIHNlbGVjdGVkIGtleXMgYXJyYXkgaWYgdGhlIG9wdGlvbiBpcyB0cnV0aHkgYW5kIG5vdCBhbHJlYWR5IGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGUgaW5wdXQgaXMgYWxzbyBjbGVhcmVkIChpZiBhdmFpbGFibGUpLCBhbmQgdGhlIG5ldyBzZWxlY3RlZCBrZXlzIGFyZSBlbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7a2V5fSBvcHRpb24ga2V5IHRvIGFkZFxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkT3B0aW9uVG9TZWxlY3RlZE9wdGlvbnMgPSAoa2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKGtleSAmJiAhdGhpcy5zZWxlY3RlZEtleXMuaW5jbHVkZXMoa2V5KSAmJiB0aGlzLmFsbE9wdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkS2V5cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFJlZikgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cImNvbXBvbmVudHMtbXVsdGktc2VsZWN0XCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZCBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsICsgJyBzZWxlY3Rpb24nXCI+XG4gICAgICAgICAgICBAZm9yIChrZXkgb2Ygc2VsZWN0ZWRLZXlzOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICAgICAgICBAaWYgKGFsbE9wdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93IChyZW1vdmVkKT1cInJlbW92ZU9wdGlvbihrZXkpXCIgZGF0YS10ZXN0aWQ9XCJtYXRDaGlwUm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhbGxPcHRpb25zW2tleV0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRDaGlwUmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncmVtb3ZlICcgKyBhbGxPcHRpb25zW2tleV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidyZW1vdmUnICsga2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgY29tcG9uZW50cy1pY29uXCI+IGNhbmNlbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbXBvbmVudHMtaGlkZGVuXCIgZm9yPVwiaW5wdXRcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVsIHwgdGl0bGVjYXNlXCJcbiAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgaWQ9XCJpbnB1dFwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW5wdXRDb250cm9sXCJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcEdyaWRcIlxuICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcbiAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxuICAgICAgICAgICAgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZE9wdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiaW5wdXRcIlxuICAgICAgICAvPlxuICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cInNlbGVjdE9wdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgQGZvciAoa2V5IG9mIGZpbHRlcmVkT3B0aW9ucyQgfCBhc3luYzsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImtleVwiIGRhdGEtdGVzdGlkPVwiYXV0b2NvbXBsZXRlT3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGFsbE9wdGlvbnNba2V5XSB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj5cbiJdfQ==
|