@byuhbll/components 4.0.0-alpha.3 → 4.0.0-alpha.30
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 +19 -1
- package/esm2022/lib/checkbox/checkbox.component.mjs +15 -0
- package/esm2022/lib/contact-utils.mjs +41 -0
- package/esm2022/lib/copy-tooltip/copy-tooltip.component.mjs +49 -0
- package/esm2022/lib/expand-collapse/expand-collapse.component.mjs +31 -0
- package/esm2022/lib/hbll-footer/hbll-footer.component.mjs +81 -0
- package/esm2022/lib/hbll-header/hbll-header.component.mjs +81 -31
- package/esm2022/lib/hbll-header/models/library-hours.mjs +2 -0
- package/esm2022/lib/hbll-header/nav-bar/nav-bar.component.mjs +333 -0
- package/esm2022/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.mjs +29 -0
- package/esm2022/lib/hbll-header/pipes/library-hours.pipe.mjs +31 -0
- package/esm2022/lib/header-with-impersonation/header-with-impersonation.component.mjs +38 -0
- package/esm2022/lib/impersonate-modal/impersonate-modal.component.mjs +190 -0
- package/esm2022/lib/impersonation-banner/impersonation-banner.component.mjs +128 -0
- package/esm2022/lib/impersonation-banner/models/application-access.mjs +7 -0
- package/esm2022/lib/impersonation-banner/models/person-summary.mjs +15 -0
- package/esm2022/lib/models/token-payload.mjs +2 -0
- package/esm2022/lib/multi-select/multi-select.component.mjs +115 -0
- package/esm2022/lib/pipes/hbll-item-type-icon.pipe.mjs +128 -0
- package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +5 -5
- package/esm2022/lib/ss-search-bar/date-range/date-range.component.mjs +3 -3
- package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +3 -3
- package/esm2022/lib/utils.mjs +7 -0
- package/esm2022/public-api.mjs +7 -1
- package/fesm2022/byuhbll-components.mjs +1153 -66
- package/fesm2022/byuhbll-components.mjs.map +1 -1
- package/lib/animations/animations.d.ts +1 -0
- package/lib/{hbll-checkbox/hbll-checkbox.component.d.ts → checkbox/checkbox.component.d.ts} +2 -2
- package/lib/contact-utils.d.ts +19 -0
- package/lib/copy-tooltip/copy-tooltip.component.d.ts +12 -0
- package/lib/expand-collapse/expand-collapse.component.d.ts +10 -0
- package/lib/hbll-footer/hbll-footer.component.d.ts +28 -0
- package/lib/hbll-header/hbll-header.component.d.ts +23 -28
- package/lib/hbll-header/models/library-hours.d.ts +10 -0
- package/lib/hbll-header/nav-bar/nav-bar.component.d.ts +30 -0
- package/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.d.ts +12 -0
- package/lib/hbll-header/pipes/library-hours.pipe.d.ts +7 -0
- package/lib/header-with-impersonation/header-with-impersonation.component.d.ts +19 -0
- package/lib/impersonate-modal/impersonate-modal.component.d.ts +60 -0
- package/lib/impersonation-banner/impersonation-banner.component.d.ts +31 -0
- package/lib/impersonation-banner/models/application-access.d.ts +15 -0
- package/lib/impersonation-banner/models/person-summary.d.ts +33 -0
- package/lib/models/token-payload.d.ts +3 -0
- package/lib/{hbll-multi-select/hbll-multi-select.component.d.ts → multi-select/multi-select.component.d.ts} +1 -1
- package/lib/pipes/hbll-item-type-icon.pipe.d.ts +17 -0
- package/lib/ss-search-bar/advanced-search/advanced-search.component.d.ts +4 -1
- package/lib/utils.d.ts +5 -0
- package/package.json +4 -1
- package/public-api.d.ts +6 -0
- package/styles/scss/_mixins.scss +2 -2
- package/styles/scss/_vars.scss +7 -0
- package/styles/scss/base.scss +39 -7
- package/styles/scss/cta-btn.scss +2 -2
- package/styles/scss/pill-btn.scss +2 -2
- package/styles/scss/shared.scss +8 -0
- package/styles/scss/spinner.scss +20 -0
- package/esm2022/lib/hbll-checkbox/hbll-checkbox.component.mjs +0 -17
- package/esm2022/lib/hbll-multi-select/hbll-multi-select.component.mjs +0 -115
|
@@ -2,3 +2,4 @@ export declare const libHbllExpandCollapse: import("@angular/animations").Animat
|
|
|
2
2
|
export declare const libHbllFadeInOut: import("@angular/animations").AnimationTriggerMetadata;
|
|
3
3
|
export declare const libHbllFadeIn: import("@angular/animations").AnimationTriggerMetadata;
|
|
4
4
|
export declare const libHbllFadeOut: import("@angular/animations").AnimationTriggerMetadata;
|
|
5
|
+
export declare const libHbllSlideInOutRightLeft: import("@angular/animations").AnimationTriggerMetadata;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
export declare class HbllCheckboxComponent {
|
|
3
|
-
isChecked: boolean
|
|
3
|
+
isChecked: import("@angular/core").InputSignal<boolean>;
|
|
4
4
|
static ɵfac: i0.ɵɵFactoryDeclaration<HbllCheckboxComponent, never>;
|
|
5
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<HbllCheckboxComponent, "lib-
|
|
5
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HbllCheckboxComponent, "lib-checkbox", never, { "isChecked": { "alias": "isChecked"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
6
6
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { FormBuilder } from '@angular/forms';
|
|
3
|
+
export declare const USER_STATUSES: readonly ["", "Undergraduate", "Graduate", "Faculty", "Staff", "Library Employee", "Other"];
|
|
4
|
+
export type UserStatus = (typeof USER_STATUSES)[number];
|
|
5
|
+
export interface ContactPayload {
|
|
6
|
+
email?: string;
|
|
7
|
+
message: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
status?: UserStatus;
|
|
10
|
+
}
|
|
11
|
+
export declare const createContactForm: (fb: FormBuilder) => import("@angular/forms").FormGroup<{
|
|
12
|
+
name: import("@angular/forms").FormControl<string>;
|
|
13
|
+
email: import("@angular/forms").FormControl<string>;
|
|
14
|
+
message: import("@angular/forms").FormControl<string>;
|
|
15
|
+
status: import("@angular/forms").FormControl<"" | "Other" | "Undergraduate" | "Graduate" | "Faculty" | "Staff" | "Library Employee" | undefined>;
|
|
16
|
+
}>;
|
|
17
|
+
export declare const submitEmail: (payload: ContactPayload, http: HttpClient, apiBaseUrl: string) => import("rxjs").Observable<unknown>;
|
|
18
|
+
export declare const submitFeedback: (payload: ContactPayload, http: HttpClient, apiBaseUrl: string) => import("rxjs").Observable<unknown>;
|
|
19
|
+
export declare const getUserStatusFromRoles: (roles: string[]) => UserStatus;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MatTooltip, TooltipPosition } from '@angular/material/tooltip';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class CopyTooltipComponent {
|
|
4
|
+
position: TooltipPosition;
|
|
5
|
+
copyText?: string;
|
|
6
|
+
tooltip: MatTooltip;
|
|
7
|
+
clipboardCopyMessage: string;
|
|
8
|
+
copyToClipboard: (text?: string) => Promise<void>;
|
|
9
|
+
handleMouseLeave: () => void;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CopyTooltipComponent, never>;
|
|
11
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CopyTooltipComponent, "lib-copy-tooltip", never, { "position": { "alias": "position"; "required": false; }; "copyText": { "alias": "copyText"; "required": false; }; }, {}, never, ["*"], true, never>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export declare class ExpandCollapseComponent {
|
|
3
|
+
private contentRef;
|
|
4
|
+
private _isExpanded;
|
|
5
|
+
set isExpanded(isExpanded: boolean);
|
|
6
|
+
get isExpanded(): boolean;
|
|
7
|
+
protected heightOfContent: number;
|
|
8
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ExpandCollapseComponent, never>;
|
|
9
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ExpandCollapseComponent, "lib-expand-collapse", never, { "isExpanded": { "alias": "isExpanded"; "required": true; }; }, {}, never, ["*"], true, never>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ContactPayload } from '../contact-utils';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class HbllFooterComponent {
|
|
4
|
+
private readonly fb;
|
|
5
|
+
private readonly http;
|
|
6
|
+
mainsitebaseurl: string;
|
|
7
|
+
libraryapibaseuri: string;
|
|
8
|
+
set emailname(name: string);
|
|
9
|
+
set emailemail(email: string);
|
|
10
|
+
set emailmessage(message: string);
|
|
11
|
+
set emailstatus(status: ContactPayload['status']);
|
|
12
|
+
protected date: Date;
|
|
13
|
+
protected isSubmitted: boolean;
|
|
14
|
+
protected isLoading: boolean;
|
|
15
|
+
protected hasConnectionError: boolean;
|
|
16
|
+
protected isEmailSent: boolean;
|
|
17
|
+
protected emailForm: import("@angular/forms").FormGroup<{
|
|
18
|
+
name: import("@angular/forms").FormControl<string>;
|
|
19
|
+
email: import("@angular/forms").FormControl<string>;
|
|
20
|
+
message: import("@angular/forms").FormControl<string>;
|
|
21
|
+
status: import("@angular/forms").FormControl<"" | "Other" | "Undergraduate" | "Graduate" | "Faculty" | "Staff" | "Library Employee" | undefined>;
|
|
22
|
+
}>;
|
|
23
|
+
protected userStatuses: readonly ["", "Undergraduate", "Graduate", "Faculty", "Staff", "Library Employee", "Other"];
|
|
24
|
+
protected sendEmail: () => void;
|
|
25
|
+
protected handleClose: () => void;
|
|
26
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HbllFooterComponent, never>;
|
|
27
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HbllFooterComponent, "lib-hbll-footer", never, { "mainsitebaseurl": { "alias": "mainsitebaseurl"; "required": false; }; "libraryapibaseuri": { "alias": "libraryapibaseuri"; "required": false; }; "emailname": { "alias": "emailname"; "required": false; }; "emailemail": { "alias": "emailemail"; "required": false; }; "emailmessage": { "alias": "emailmessage"; "required": false; }; "emailstatus": { "alias": "emailstatus"; "required": false; }; }, {}, never, never, true, never>;
|
|
28
|
+
}
|
|
@@ -1,40 +1,35 @@
|
|
|
1
|
-
import { AfterViewInit,
|
|
1
|
+
import { AfterViewInit, ElementRef, EventEmitter } from '@angular/core';
|
|
2
|
+
import { LibraryHours } from './models/library-hours';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
|
-
|
|
4
|
-
date: string;
|
|
5
|
-
is_closed: boolean;
|
|
6
|
-
open_time: string;
|
|
7
|
-
close_time: string;
|
|
8
|
-
has_exception: boolean;
|
|
9
|
-
exception_title: string;
|
|
10
|
-
exception_message: string;
|
|
11
|
-
is_currently_open: boolean;
|
|
12
|
-
}
|
|
13
|
-
export declare class LibraryHoursDatePipe implements PipeTransform {
|
|
14
|
-
transform(date: string, time: string): Date;
|
|
15
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<LibraryHoursDatePipe, never>;
|
|
16
|
-
static ɵpipe: i0.ɵɵPipeDeclaration<LibraryHoursDatePipe, "libraryHoursDate", true>;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Header component built to be exported as a custom element.
|
|
20
|
-
* This component uses icons provided by Google Material.
|
|
21
|
-
* The link to these icons should be included once in the \<head> of your base html.
|
|
22
|
-
*
|
|
23
|
-
* When a non-empty string `name` is provided to this component, the user is considered logged in.
|
|
24
|
-
* Two outputs/events are accessible: `login` and `logout`.
|
|
25
|
-
*/
|
|
4
|
+
export declare const LIBRARY_HOURS_API_URL = "https://apps.lib.byu.edu/libraryhours/api/hours";
|
|
26
5
|
export declare class HbllHeaderComponent implements AfterViewInit {
|
|
27
6
|
private readonly r2;
|
|
28
7
|
private readonly http;
|
|
29
|
-
|
|
8
|
+
private readonly bo;
|
|
9
|
+
private doc;
|
|
10
|
+
header: ElementRef;
|
|
11
|
+
name: string;
|
|
12
|
+
mainsitebaseurl: string;
|
|
13
|
+
showImpersonateButton: import("@angular/core").InputSignal<boolean>;
|
|
14
|
+
openImpersonationModal: EventEmitter<void>;
|
|
30
15
|
login: EventEmitter<void>;
|
|
31
16
|
logout: EventEmitter<void>;
|
|
17
|
+
private formatDateForHours;
|
|
32
18
|
private accountInfoEl;
|
|
33
|
-
|
|
19
|
+
private hoursEl;
|
|
20
|
+
protected get isLoggedIn(): boolean;
|
|
34
21
|
protected libraryHours: import("@angular/core").Signal<LibraryHours | undefined>;
|
|
22
|
+
protected hoursExceptions$: import("rxjs").Observable<LibraryHours[]>;
|
|
35
23
|
protected showAccountDropdown: boolean;
|
|
24
|
+
protected showLibraryHours: boolean;
|
|
25
|
+
protected mobileSidebarHeight: number;
|
|
26
|
+
protected showNavBar: boolean;
|
|
27
|
+
protected isScreenSmall: import("@angular/core").Signal<boolean | undefined>;
|
|
36
28
|
ngAfterViewInit(): void;
|
|
29
|
+
protected openSidebarNav: () => void;
|
|
30
|
+
protected closeSidebarNav: () => void;
|
|
31
|
+
private onResize;
|
|
32
|
+
private setMobileSidebarHeight;
|
|
37
33
|
static ɵfac: i0.ɵɵFactoryDeclaration<HbllHeaderComponent, never>;
|
|
38
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<HbllHeaderComponent, "lib-hbll-header", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "login": "login"; "logout": "logout"; }, never, never, true, never>;
|
|
34
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HbllHeaderComponent, "lib-hbll-header", never, { "name": { "alias": "name"; "required": false; }; "mainsitebaseurl": { "alias": "mainsitebaseurl"; "required": false; }; "showImpersonateButton": { "alias": "showImpersonateButton"; "required": false; "isSignal": true; }; }, { "openImpersonationModal": "openImpersonationModal"; "login": "login"; "logout": "logout"; }, never, never, true, never>;
|
|
39
35
|
}
|
|
40
|
-
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Signal } from '@angular/core';
|
|
2
|
+
import { NavBarDropdownComponent } from '../nav-bar-dropdown/nav-bar-dropdown.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
type NavInfo = {
|
|
5
|
+
title: string;
|
|
6
|
+
mainSection?: Section;
|
|
7
|
+
otherSections: Section[];
|
|
8
|
+
};
|
|
9
|
+
type Section = {
|
|
10
|
+
title: string;
|
|
11
|
+
links: Link[];
|
|
12
|
+
auxiliaryLink?: Link;
|
|
13
|
+
};
|
|
14
|
+
type Link = {
|
|
15
|
+
label: string;
|
|
16
|
+
url: string;
|
|
17
|
+
icon?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare class NavBarComponent {
|
|
20
|
+
private bo;
|
|
21
|
+
mainSiteBaseUrl: import("@angular/core").InputSignal<string>;
|
|
22
|
+
height: import("@angular/core").InputSignal<number | null>;
|
|
23
|
+
dropdownComps: NavBarDropdownComponent[];
|
|
24
|
+
protected handleDropdownOpenEvent: (title: string) => void;
|
|
25
|
+
protected isScreenSmall: Signal<boolean | undefined>;
|
|
26
|
+
protected navInfos: Signal<NavInfo[]>;
|
|
27
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NavBarComponent, never>;
|
|
28
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NavBarComponent, "lib-nav-bar", never, { "mainSiteBaseUrl": { "alias": "mainSiteBaseUrl"; "required": true; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class NavBarDropdownComponent {
|
|
4
|
+
title: import("@angular/core").InputSignal<string>;
|
|
5
|
+
isSmallScreen: import("@angular/core").InputSignal<boolean>;
|
|
6
|
+
openEvent: EventEmitter<string>;
|
|
7
|
+
closeDropdown: () => boolean;
|
|
8
|
+
protected isOpen: boolean;
|
|
9
|
+
protected handleClick: () => void;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NavBarDropdownComponent, never>;
|
|
11
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NavBarDropdownComponent, "lib-nav-bar-dropdown", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "isSmallScreen": { "alias": "isSmallScreen"; "required": false; "isSignal": true; }; }, { "openEvent": "openEvent"; }, never, ["*"], true, never>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class LibraryHoursPipe implements PipeTransform {
|
|
4
|
+
transform(date: string, time: string): string | null;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LibraryHoursPipe, never>;
|
|
6
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<LibraryHoursPipe, "libraryHours", true>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { EventEmitter, Signal } from '@angular/core';
|
|
2
|
+
import { TokenPayload } from '../models/token-payload';
|
|
3
|
+
import { JwtPayload } from 'jwt-decode';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class HeaderWithImpersonationComponent {
|
|
6
|
+
accessTokenPayload: import("@angular/core").InputSignal<TokenPayload>;
|
|
7
|
+
oidcBaseUri: import("@angular/core").InputSignal<string>;
|
|
8
|
+
oidcDefaultIdp: import("@angular/core").InputSignal<string>;
|
|
9
|
+
login: EventEmitter<void>;
|
|
10
|
+
logout: EventEmitter<void>;
|
|
11
|
+
endImpersonation: EventEmitter<void>;
|
|
12
|
+
protected parsedToken: Signal<(JwtPayload & Record<string, any>) | null>;
|
|
13
|
+
protected name: Signal<any>;
|
|
14
|
+
protected showImpersonateButton: Signal<boolean>;
|
|
15
|
+
protected showImpersonationModal: boolean;
|
|
16
|
+
private isImpersonating;
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HeaderWithImpersonationComponent, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HeaderWithImpersonationComponent, "lib-header-with-impersonation", never, { "accessTokenPayload": { "alias": "accessTokenPayload"; "required": true; "isSignal": true; }; "oidcBaseUri": { "alias": "oidcBaseUri"; "required": false; "isSignal": true; }; "oidcDefaultIdp": { "alias": "oidcDefaultIdp"; "required": false; "isSignal": true; }; }, { "login": "login"; "logout": "logout"; "endImpersonation": "endImpersonation"; }, never, never, true, never>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EventEmitter, OnDestroy, PipeTransform } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { TokenPayload } from '../models/token-payload';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare const defaultOidcBaseUri = "https://keycloak.lib.byu.edu/";
|
|
6
|
+
export declare const defaultOidcDefaultIdp = "byu-realm";
|
|
7
|
+
export declare class ImpersonateUserPipe implements PipeTransform {
|
|
8
|
+
transform(user: ImpersonateSearchResult): string;
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ImpersonateUserPipe, never>;
|
|
10
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<ImpersonateUserPipe, "impersonateUser", true>;
|
|
11
|
+
}
|
|
12
|
+
export interface ImpersonateSearchResult {
|
|
13
|
+
netId: string;
|
|
14
|
+
institution: string;
|
|
15
|
+
username: string;
|
|
16
|
+
name: string;
|
|
17
|
+
preferredName: string;
|
|
18
|
+
givenName: string;
|
|
19
|
+
surname: string;
|
|
20
|
+
restricted: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class ImpersonateModalComponent implements OnDestroy {
|
|
23
|
+
private readonly http;
|
|
24
|
+
private readonly fb;
|
|
25
|
+
private readonly eref;
|
|
26
|
+
set showModal(open: boolean);
|
|
27
|
+
oidcBaseUri: import("@angular/core").InputSignal<string>;
|
|
28
|
+
oidcDefaultIdp: import("@angular/core").InputSignal<string>;
|
|
29
|
+
accessTokenPayload: import("@angular/core").InputSignal<TokenPayload>;
|
|
30
|
+
dismiss: EventEmitter<void>;
|
|
31
|
+
init: EventEmitter<void>;
|
|
32
|
+
protected isOpen: boolean;
|
|
33
|
+
protected hasError: boolean;
|
|
34
|
+
protected form: import("@angular/forms").FormGroup<{
|
|
35
|
+
search: import("@angular/forms").FormControl<string | null>;
|
|
36
|
+
}>;
|
|
37
|
+
protected selectedUsername?: string;
|
|
38
|
+
protected loading: boolean;
|
|
39
|
+
protected handleSearchSubject: Subject<boolean>;
|
|
40
|
+
protected results: import("@angular/core").Signal<ImpersonateSearchResult[] | null | undefined>;
|
|
41
|
+
private subs;
|
|
42
|
+
outsideClick(event: MouseEvent): void;
|
|
43
|
+
handleKeyDown: (event: KeyboardEvent) => void;
|
|
44
|
+
ngOnDestroy(): void;
|
|
45
|
+
/** Redirect to Keycloak impersonate page, which will redirect back
|
|
46
|
+
* after impersonation begins.
|
|
47
|
+
*/
|
|
48
|
+
protected startImpersonation: (username?: string) => void;
|
|
49
|
+
protected handleSelectUser: (event: Event) => void;
|
|
50
|
+
protected clearSearch: () => void;
|
|
51
|
+
protected close: () => void;
|
|
52
|
+
protected handleFormSubmit: (event: SubmitEvent) => void;
|
|
53
|
+
protected handleSearchKeyPress: (event: KeyboardEvent) => void;
|
|
54
|
+
protected handleResultKeyPress: (event: KeyboardEvent) => void;
|
|
55
|
+
/** Search Keycloak users using a generic search query. */
|
|
56
|
+
private searchUsers;
|
|
57
|
+
private replaceUrl;
|
|
58
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ImpersonateModalComponent, never>;
|
|
59
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImpersonateModalComponent, "lib-impersonate-modal", never, { "showModal": { "alias": "showModal"; "required": false; }; "oidcBaseUri": { "alias": "oidcBaseUri"; "required": false; "isSignal": true; }; "oidcDefaultIdp": { "alias": "oidcDefaultIdp"; "required": false; "isSignal": true; }; "accessTokenPayload": { "alias": "accessTokenPayload"; "required": true; "isSignal": true; }; }, { "dismiss": "dismiss"; "init": "init"; }, never, never, true, never>;
|
|
60
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { EventEmitter, Signal } from '@angular/core';
|
|
2
|
+
import { type ApplicationAccess } from './models/application-access';
|
|
3
|
+
import { TokenPayload } from '../models/token-payload';
|
|
4
|
+
import { JwtPayload } from 'jwt-decode';
|
|
5
|
+
import { PersonSummary } from './models/person-summary';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export declare class ImpersonationBannerComponent {
|
|
8
|
+
private http;
|
|
9
|
+
accessTokenPayload: import("@angular/core").InputSignal<TokenPayload>;
|
|
10
|
+
personBaseUri: import("@angular/core").InputSignal<string>;
|
|
11
|
+
libraryApiBaseUri: import("@angular/core").InputSignal<string>;
|
|
12
|
+
endImpersonation: EventEmitter<void>;
|
|
13
|
+
protected parsedToken: Signal<JwtPayload & Record<string, any>>;
|
|
14
|
+
protected isImpersonating: Signal<boolean>;
|
|
15
|
+
protected libraryId: Signal<any>;
|
|
16
|
+
protected user: Signal<PersonSummary | null | undefined>;
|
|
17
|
+
protected userFullName: Signal<string>;
|
|
18
|
+
protected isRestricted: Signal<boolean | undefined>;
|
|
19
|
+
protected userInfoTabs: Signal<Map<string, any>>;
|
|
20
|
+
protected userPhotoUrl: Signal<string>;
|
|
21
|
+
protected activityStatus: Signal<"retired" | "active" | "inactive" | null>;
|
|
22
|
+
protected employeeStatusDescription: Signal<string | null>;
|
|
23
|
+
protected independentStudyStatus: Signal<boolean | null | undefined>;
|
|
24
|
+
protected accountStatuses: Signal<{
|
|
25
|
+
ok: ApplicationAccess[];
|
|
26
|
+
blocked: ApplicationAccess[];
|
|
27
|
+
none: ApplicationAccess[];
|
|
28
|
+
} | null | undefined>;
|
|
29
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ImpersonationBannerComponent, never>;
|
|
30
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImpersonationBannerComponent, "lib-impersonation-banner", never, { "accessTokenPayload": { "alias": "accessTokenPayload"; "required": true; "isSignal": true; }; "personBaseUri": { "alias": "personBaseUri"; "required": false; "isSignal": true; }; "libraryApiBaseUri": { "alias": "libraryApiBaseUri"; "required": false; "isSignal": true; }; }, { "endImpersonation": "endImpersonation"; }, never, never, true, never>;
|
|
31
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare enum AccessStatus {
|
|
2
|
+
OK = "ok",
|
|
3
|
+
BLOCKED = "blocked",
|
|
4
|
+
NONE = "none"
|
|
5
|
+
}
|
|
6
|
+
export interface ApplicationAccess {
|
|
7
|
+
label: string;
|
|
8
|
+
access: AccessStatus;
|
|
9
|
+
code?: string;
|
|
10
|
+
detail?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AccountsResponse {
|
|
13
|
+
netId: string;
|
|
14
|
+
applications: Record<string, ApplicationAccess>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare enum EmployeePositionType {
|
|
2
|
+
STD = "std",
|
|
3
|
+
SNL = "snl",
|
|
4
|
+
FAC = "fac",
|
|
5
|
+
STF = "stf",
|
|
6
|
+
TMP = "tmp",
|
|
7
|
+
FTC = "ftc"
|
|
8
|
+
}
|
|
9
|
+
export declare enum UndergradGraduateStatus {
|
|
10
|
+
UNDERGRAD = "undergrad",
|
|
11
|
+
GRADUATE = "graduate"
|
|
12
|
+
}
|
|
13
|
+
export interface IndependentStudyResponse {
|
|
14
|
+
library_id: string;
|
|
15
|
+
is_enrolled: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface PersonSummary {
|
|
18
|
+
byu_id?: string;
|
|
19
|
+
email_address?: string;
|
|
20
|
+
first_name: string;
|
|
21
|
+
is_affiliate: boolean;
|
|
22
|
+
is_employee: boolean;
|
|
23
|
+
is_retired?: boolean;
|
|
24
|
+
primary_position_type?: EmployeePositionType;
|
|
25
|
+
primary_position_type_display?: string;
|
|
26
|
+
is_student: boolean;
|
|
27
|
+
undergrad_graduate_status?: UndergradGraduateStatus;
|
|
28
|
+
last_name: string;
|
|
29
|
+
library_id: string;
|
|
30
|
+
preferred_first_name: string;
|
|
31
|
+
restricted: boolean;
|
|
32
|
+
worker_id?: string;
|
|
33
|
+
}
|
|
@@ -48,5 +48,5 @@ export declare class HbllMultiSelectComponent {
|
|
|
48
48
|
*/
|
|
49
49
|
private addOptionToSelectedOptions;
|
|
50
50
|
static ɵfac: i0.ɵɵFactoryDeclaration<HbllMultiSelectComponent, never>;
|
|
51
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<HbllMultiSelectComponent, "lib-
|
|
51
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HbllMultiSelectComponent, "lib-multi-select", never, { "allOptions": { "alias": "allOptions"; "required": false; }; "label": { "alias": "label"; "required": false; }; "selectedKeys": { "alias": "selectedKeys"; "required": false; }; }, { "selectedKeysChange": "selectedKeysChange"; }, never, never, true, never>;
|
|
52
52
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type PipeTransform } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Converts an item type to an icon type to be used with Google Material Icons
|
|
5
|
+
*
|
|
6
|
+
* Intended to be used with an imported font, such as: `<link
|
|
7
|
+
rel="stylesheet"
|
|
8
|
+
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,1,0"
|
|
9
|
+
/>`
|
|
10
|
+
*
|
|
11
|
+
* Reference: https://fonts.google.com/icons?selected=Material+Symbols+Outlined:inventory_2:FILL@0;wght@400;GRAD@0;opsz@24&icon.query=invent&icon.size=24&icon.color=%235f6368
|
|
12
|
+
*/
|
|
13
|
+
export declare class HbllItemTypeIconPipe implements PipeTransform {
|
|
14
|
+
transform(itemType: string): string;
|
|
15
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HbllItemTypeIconPipe, never>;
|
|
16
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<HbllItemTypeIconPipe, "libByuItemTypeIcon", true>;
|
|
17
|
+
}
|
|
@@ -105,7 +105,10 @@ export declare class AdvancedSearchComponent implements OnDestroy {
|
|
|
105
105
|
readonly 'law -- iclrs': "Law & Religion Studies";
|
|
106
106
|
readonly 'law -- main': "Main Collection";
|
|
107
107
|
readonly 'law -- media': "Media";
|
|
108
|
-
readonly 'law -- reserve': "Reserve";
|
|
108
|
+
readonly 'law -- reserve': "Reserve"; /**
|
|
109
|
+
* Takes a `FormGroup` and syncs up the `field` and `qualifier` values.
|
|
110
|
+
* After syncing, when the `field` value changes, the `qualifier` value will update appropriately.
|
|
111
|
+
*/
|
|
109
112
|
readonly 'law -- self_help': "Self Help";
|
|
110
113
|
readonly 'law -- study_guides': "Study Guides";
|
|
111
114
|
};
|
package/lib/utils.d.ts
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@byuhbll/components",
|
|
3
|
-
"version": "4.0.0-alpha.
|
|
3
|
+
"version": "4.0.0-alpha.30",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^18.0.0",
|
|
6
6
|
"@angular/core": "^18.0.0"
|
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
"./pill-btn": {
|
|
26
26
|
"sass": "./styles/scss/pill-btn.scss"
|
|
27
27
|
},
|
|
28
|
+
"./spinner": {
|
|
29
|
+
"sass": "./styles/scss/spinner.scss"
|
|
30
|
+
},
|
|
28
31
|
"./package.json": {
|
|
29
32
|
"default": "./package.json"
|
|
30
33
|
},
|
package/public-api.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export * from './lib/hbll-header/hbll-header.component';
|
|
2
|
+
export * from './lib/pipes/hbll-item-type-icon.pipe';
|
|
3
|
+
export * from './lib/hbll-footer/hbll-footer.component';
|
|
4
|
+
export * from './lib/header-with-impersonation/header-with-impersonation.component';
|
|
5
|
+
export * from './lib/impersonate-modal/impersonate-modal.component';
|
|
6
|
+
export * from './lib/impersonation-banner/impersonation-banner.component';
|
|
2
7
|
export * from './lib/ss-search-bar/ss-search-bar.component';
|
|
3
8
|
export * from './lib/ss-search-bar/models/advanced-search.model';
|
|
4
9
|
export * from './lib/ss-search-bar/models/search-scope.model';
|
|
5
10
|
export * from './lib/ss-search-bar/models/search-config.model';
|
|
11
|
+
export { getUserStatusFromRoles } from './lib/contact-utils';
|
|
6
12
|
export { ADVANCED_SEARCH_QUALIFIER_MAP, ADVANCED_SEARCH_FIELD_MAP, ADVANCED_SEARCH_OPTIONS, } from './lib/ss-search-bar/constants';
|
package/styles/scss/_mixins.scss
CHANGED
package/styles/scss/_vars.scss
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
$navy-blue: #002e5d;
|
|
2
2
|
$royal-blue: #0047ba;
|
|
3
|
+
$royal-blue--hover: #1967e5;
|
|
3
4
|
|
|
4
5
|
$primary-blue: #3a6093;
|
|
5
6
|
|
|
7
|
+
$primary-green: #207215;
|
|
8
|
+
$success-green: #1dce7b;
|
|
9
|
+
|
|
10
|
+
$impersonate-purple: #ca7ad1cc;
|
|
11
|
+
$impersonate-purple--hover: #ca7ad1;
|
|
12
|
+
|
|
6
13
|
$interactive-blue: #4070b0;
|
|
7
14
|
$interactive-blue--hover: #6892ca;
|
|
8
15
|
|
package/styles/scss/base.scss
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@use './
|
|
1
|
+
@use './vars';
|
|
2
2
|
|
|
3
3
|
$sourceSansProVersion: '1.0.0';
|
|
4
4
|
$icomoonVersion: '1.0.1';
|
|
@@ -137,7 +137,6 @@ th,
|
|
|
137
137
|
td,
|
|
138
138
|
article,
|
|
139
139
|
aside,
|
|
140
|
-
dialog,
|
|
141
140
|
figure,
|
|
142
141
|
footer,
|
|
143
142
|
header,
|
|
@@ -157,7 +156,6 @@ aside,
|
|
|
157
156
|
details,
|
|
158
157
|
figcaption,
|
|
159
158
|
figure,
|
|
160
|
-
dialog,
|
|
161
159
|
footer,
|
|
162
160
|
header,
|
|
163
161
|
hgroup,
|
|
@@ -170,6 +168,18 @@ section {
|
|
|
170
168
|
body {
|
|
171
169
|
background: white;
|
|
172
170
|
line-height: 1.5;
|
|
171
|
+
font-size: 1.6rem;
|
|
172
|
+
font-family:
|
|
173
|
+
Source Sans Pro,
|
|
174
|
+
Helvetica Neue,
|
|
175
|
+
Helvetica,
|
|
176
|
+
Arial,
|
|
177
|
+
sans-serif;
|
|
178
|
+
color: #404040;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
html {
|
|
182
|
+
font-size: 62.5%;
|
|
173
183
|
}
|
|
174
184
|
|
|
175
185
|
table {
|
|
@@ -203,8 +213,14 @@ q {
|
|
|
203
213
|
quotes: '' '';
|
|
204
214
|
}
|
|
205
215
|
|
|
206
|
-
a
|
|
216
|
+
a,
|
|
217
|
+
button {
|
|
218
|
+
border: none;
|
|
219
|
+
background: none;
|
|
220
|
+
font-family: inherit;
|
|
221
|
+
font-size: inherit;
|
|
207
222
|
text-decoration: none;
|
|
223
|
+
cursor: pointer;
|
|
208
224
|
}
|
|
209
225
|
|
|
210
226
|
a img {
|
|
@@ -218,8 +234,24 @@ ul {
|
|
|
218
234
|
*,
|
|
219
235
|
*::before,
|
|
220
236
|
*::after {
|
|
221
|
-
-moz-box-sizing: border-box;
|
|
222
|
-
-ms-box-sizing: border-box;
|
|
223
|
-
-webkit-box-sizing: border-box;
|
|
224
237
|
box-sizing: border-box;
|
|
225
238
|
}
|
|
239
|
+
|
|
240
|
+
/* Change site size on bigger browser sizes */
|
|
241
|
+
@media screen and (min-width: 1400px) {
|
|
242
|
+
html {
|
|
243
|
+
font-size: 70%;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
@media screen and (min-width: 1720px) {
|
|
248
|
+
html {
|
|
249
|
+
font-size: 75%;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
@media screen and (min-width: 2000px) {
|
|
254
|
+
html {
|
|
255
|
+
font-size: 80%;
|
|
256
|
+
}
|
|
257
|
+
}
|
package/styles/scss/cta-btn.scss
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
@use 'vars';
|
|
2
|
+
|
|
3
|
+
.lib-spinner {
|
|
4
|
+
border: 0.3em solid #dfe9f7;
|
|
5
|
+
border-top: 0.3em solid vars.$interactive-blue;
|
|
6
|
+
border-radius: 100%;
|
|
7
|
+
width: 30px;
|
|
8
|
+
height: 30px;
|
|
9
|
+
animation: loadingSpinnerAnimate 1s ease infinite;
|
|
10
|
+
position: relative;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@keyframes loadingSpinnerAnimate {
|
|
14
|
+
0% {
|
|
15
|
+
transform: rotate(0deg);
|
|
16
|
+
}
|
|
17
|
+
100% {
|
|
18
|
+
transform: rotate(360deg);
|
|
19
|
+
}
|
|
20
|
+
}
|