@ifsworld/granite-components 11.7.2 → 11.8.0
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/index.mjs +12 -1
- package/esm2022/lib/contacts/contact-item/contact-item.component.mjs +30 -0
- package/esm2022/lib/contacts/contact-item-default-status/contact-item-default-status.component.mjs +20 -0
- package/esm2022/lib/contacts/contact-item-title/contact-item-title.component.mjs +15 -0
- package/esm2022/lib/contacts/contacts-profile/contacts-profile.component.mjs +27 -0
- package/esm2022/lib/contacts/contacts-trigger/contacts-trigger-data.mjs +24 -0
- package/esm2022/lib/contacts/contacts-trigger/contacts-trigger-for.directive.mjs +231 -0
- package/esm2022/lib/contacts/contacts-types/contacts.component.private-types.mjs +2 -0
- package/esm2022/lib/contacts/contacts-types/contacts.component.public-types.mjs +9 -0
- package/esm2022/lib/contacts/contacts.component.mjs +69 -0
- package/esm2022/lib/contacts/contacts.module.mjs +52 -0
- package/esm2022/lib/contacts/custom-profile.directive.mjs +16 -0
- package/esm2022/lib/contacts/custom-status.directive.mjs +18 -0
- package/fesm2022/ifsworld-granite-components.mjs +460 -2
- package/fesm2022/ifsworld-granite-components.mjs.map +1 -1
- package/index.d.ts +11 -0
- package/lib/contacts/contact-item/contact-item.component.d.ts +11 -0
- package/lib/contacts/contact-item-default-status/contact-item-default-status.component.d.ts +15 -0
- package/lib/contacts/contact-item-title/contact-item-title.component.d.ts +7 -0
- package/lib/contacts/contacts-profile/contacts-profile.component.d.ts +12 -0
- package/lib/contacts/contacts-trigger/contacts-trigger-data.d.ts +23 -0
- package/lib/contacts/contacts-trigger/contacts-trigger-for.directive.d.ts +69 -0
- package/lib/contacts/contacts-types/contacts.component.private-types.d.ts +5 -0
- package/lib/contacts/contacts-types/contacts.component.public-types.d.ts +24 -0
- package/lib/contacts/contacts.component.d.ts +24 -0
- package/lib/contacts/contacts.module.d.ts +16 -0
- package/lib/contacts/custom-profile.directive.d.ts +8 -0
- package/lib/contacts/custom-status.directive.d.ts +9 -0
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Component, ChangeDetectionStrategy, Input, HostBinding, ContentChildren, NgModule, InjectionToken, Attribute, Inject, Optional, EventEmitter, QueryList, TemplateRef, Directive, ViewChild, Output, Self, HostListener, Pipe, inject
|
|
2
|
+
import { Component, ChangeDetectionStrategy, Input, HostBinding, ContentChildren, NgModule, InjectionToken, Attribute, Inject, Optional, EventEmitter, QueryList, TemplateRef, Directive, ViewChild, Output, Self, HostListener, ContentChild, Pipe, inject } from '@angular/core';
|
|
3
3
|
import * as i1$1 from '@angular/common';
|
|
4
4
|
import { CommonModule, DOCUMENT } from '@angular/common';
|
|
5
5
|
import { coerceNumberProperty, coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
@@ -3926,6 +3926,464 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
|
|
|
3926
3926
|
}]
|
|
3927
3927
|
}] });
|
|
3928
3928
|
|
|
3929
|
+
let contactsPanelUid = 0;
|
|
3930
|
+
class ContactsTriggerDataComponent {
|
|
3931
|
+
constructor() {
|
|
3932
|
+
this.xPosition = 'after';
|
|
3933
|
+
this.yPosition = 'below';
|
|
3934
|
+
/**
|
|
3935
|
+
* Used for locating the panel in tests and setting the aria-control attribute
|
|
3936
|
+
* for the contacts trigger.
|
|
3937
|
+
*/
|
|
3938
|
+
this.panelId = `granite-contacts-panel-${contactsPanelUid++}`;
|
|
3939
|
+
}
|
|
3940
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ContactsTriggerDataComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
3941
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.4", type: ContactsTriggerDataComponent, viewQueries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0 }); }
|
|
3942
|
+
}
|
|
3943
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ContactsTriggerDataComponent, decorators: [{
|
|
3944
|
+
type: Directive,
|
|
3945
|
+
args: [{}]
|
|
3946
|
+
}], propDecorators: { templateRef: [{
|
|
3947
|
+
type: ViewChild,
|
|
3948
|
+
args: [TemplateRef]
|
|
3949
|
+
}] } });
|
|
3950
|
+
|
|
3951
|
+
class GraniteCustomStatusDirective {
|
|
3952
|
+
constructor(templateRef) {
|
|
3953
|
+
this.templateRef = templateRef;
|
|
3954
|
+
}
|
|
3955
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteCustomStatusDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
3956
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.4", type: GraniteCustomStatusDirective, selector: "[graniteCustomStatus]", inputs: { graniteCustomStatus: "graniteCustomStatus" }, ngImport: i0 }); }
|
|
3957
|
+
}
|
|
3958
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteCustomStatusDirective, decorators: [{
|
|
3959
|
+
type: Directive,
|
|
3960
|
+
args: [{
|
|
3961
|
+
selector: '[graniteCustomStatus]',
|
|
3962
|
+
}]
|
|
3963
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { graniteCustomStatus: [{
|
|
3964
|
+
type: Input
|
|
3965
|
+
}] } });
|
|
3966
|
+
|
|
3967
|
+
class GraniteCustomProfileDirective {
|
|
3968
|
+
constructor(templateRef) {
|
|
3969
|
+
this.templateRef = templateRef;
|
|
3970
|
+
}
|
|
3971
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteCustomProfileDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
3972
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.4", type: GraniteCustomProfileDirective, selector: "[graniteCustomProfile]", ngImport: i0 }); }
|
|
3973
|
+
}
|
|
3974
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteCustomProfileDirective, decorators: [{
|
|
3975
|
+
type: Directive,
|
|
3976
|
+
args: [{
|
|
3977
|
+
selector: '[graniteCustomProfile]',
|
|
3978
|
+
}]
|
|
3979
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef }] });
|
|
3980
|
+
|
|
3981
|
+
class GraniteContactsProfileComponent {
|
|
3982
|
+
ngOnChanges(changes) {
|
|
3983
|
+
const profile = changes.profile?.currentValue;
|
|
3984
|
+
if (profile && profile.name && profile.surname) {
|
|
3985
|
+
this.createProfileInitials(profile.name, profile.surname);
|
|
3986
|
+
}
|
|
3987
|
+
}
|
|
3988
|
+
createProfileInitials(name, surname) {
|
|
3989
|
+
this._initials = name[0].toUpperCase() + surname[0].toUpperCase();
|
|
3990
|
+
}
|
|
3991
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsProfileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3992
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: GraniteContactsProfileComponent, selector: "granite-contacts-profile", inputs: { profile: "profile", profileClass: "profileClass" }, host: { classAttribute: "granite-contacts-profile" }, usesOnChanges: true, ngImport: i0, template: "<div [class]=\"profileClass\" data-fnd=\"profile\" class=\"profile\">\n <img\n data-fnd=\"profile-avatar\"\n *ngIf=\"profile?.avatar; else noProfileAvatar\"\n [src]=\"profile?.avatar\"\n alt=\"profile avatar\"\n class=\"profile-avatar\"\n />\n\n <ng-template #noProfileAvatar>\n <div class=\"no-profile-avatar\">\n <span\n data-fnd=\"no-profile-avatar-initials\"\n class=\"no-profile-avatar-initials\"\n >{{ _initials }}</span\n >\n </div>\n </ng-template>\n\n <div>\n <p data-fnd=\"profile-info-names\" class=\"profile-name\">\n {{ profile?.name }} {{ profile?.surname }}\n </p>\n <p data-fnd=\"profile-info-job-title\" class=\"profile-job-title\">\n {{ profile?.jobTitle }}\n </p>\n </div>\n</div>\n", styles: [".profile{display:flex;align-items:center;margin-bottom:var(--granite-spacing-8);gap:var(--granite-spacing-4)}.profile-avatar{width:4.5rem;height:4.5rem;border-radius:50%;object-fit:cover}.profile-name{color:var(--granite-color-text);font-size:var(--granite-font-size-body-small);font-weight:var(--granite-font-weight-regular);margin:0 0 var(--granite-spacing-8)}.profile-job-title{color:var(--granite-color-text-hint);font-size:var(--granite-font-size-micro);font-weight:var(--granite-font-weight-regular);margin:0}.profile-surname{color:var(--granite-color-text-hint);font-size:var(--granite-font-size-body-small);font-weight:var(--granite-font-weight-regular)}.no-profile-avatar{display:flex;width:4.5rem;height:4.5rem;border-radius:360px;background:var(--granite-color-background-info);justify-content:center;align-items:center}.no-profile-avatar-initials{font-size:var(--granite-font-size-micro);color:var(--granite-color-signal-info);font-weight:var(--granite-font-weight-regular)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3993
|
+
}
|
|
3994
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsProfileComponent, decorators: [{
|
|
3995
|
+
type: Component,
|
|
3996
|
+
args: [{ selector: 'granite-contacts-profile', host: {
|
|
3997
|
+
class: 'granite-contacts-profile',
|
|
3998
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"profileClass\" data-fnd=\"profile\" class=\"profile\">\n <img\n data-fnd=\"profile-avatar\"\n *ngIf=\"profile?.avatar; else noProfileAvatar\"\n [src]=\"profile?.avatar\"\n alt=\"profile avatar\"\n class=\"profile-avatar\"\n />\n\n <ng-template #noProfileAvatar>\n <div class=\"no-profile-avatar\">\n <span\n data-fnd=\"no-profile-avatar-initials\"\n class=\"no-profile-avatar-initials\"\n >{{ _initials }}</span\n >\n </div>\n </ng-template>\n\n <div>\n <p data-fnd=\"profile-info-names\" class=\"profile-name\">\n {{ profile?.name }} {{ profile?.surname }}\n </p>\n <p data-fnd=\"profile-info-job-title\" class=\"profile-job-title\">\n {{ profile?.jobTitle }}\n </p>\n </div>\n</div>\n", styles: [".profile{display:flex;align-items:center;margin-bottom:var(--granite-spacing-8);gap:var(--granite-spacing-4)}.profile-avatar{width:4.5rem;height:4.5rem;border-radius:50%;object-fit:cover}.profile-name{color:var(--granite-color-text);font-size:var(--granite-font-size-body-small);font-weight:var(--granite-font-weight-regular);margin:0 0 var(--granite-spacing-8)}.profile-job-title{color:var(--granite-color-text-hint);font-size:var(--granite-font-size-micro);font-weight:var(--granite-font-weight-regular);margin:0}.profile-surname{color:var(--granite-color-text-hint);font-size:var(--granite-font-size-body-small);font-weight:var(--granite-font-weight-regular)}.no-profile-avatar{display:flex;width:4.5rem;height:4.5rem;border-radius:360px;background:var(--granite-color-background-info);justify-content:center;align-items:center}.no-profile-avatar-initials{font-size:var(--granite-font-size-micro);color:var(--granite-color-signal-info);font-weight:var(--granite-font-weight-regular)}\n"] }]
|
|
3999
|
+
}], propDecorators: { profile: [{
|
|
4000
|
+
type: Input
|
|
4001
|
+
}], profileClass: [{
|
|
4002
|
+
type: Input
|
|
4003
|
+
}] } });
|
|
4004
|
+
|
|
4005
|
+
const CONTACT_DEFAULT_STATUS = {
|
|
4006
|
+
AVAILABLE: 'Available',
|
|
4007
|
+
AWAY: 'Away',
|
|
4008
|
+
BE_RIGHT_BACK: 'BeRightBack',
|
|
4009
|
+
BUSY: 'Busy',
|
|
4010
|
+
DO_NOT_DISTURB: 'DoNotDisturb',
|
|
4011
|
+
OFFLINE: 'Offline',
|
|
4012
|
+
};
|
|
4013
|
+
|
|
4014
|
+
class ContactItemDefaultStatusComponent {
|
|
4015
|
+
constructor() {
|
|
4016
|
+
this.CONTACT_STATUS = CONTACT_DEFAULT_STATUS;
|
|
4017
|
+
}
|
|
4018
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ContactItemDefaultStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4019
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: ContactItemDefaultStatusComponent, selector: "granite-contact-item-default-status", inputs: { status: "status" }, host: { classAttribute: "granite-contact-item-default-status" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"status\">\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.AVAILABLE\">\n <svg\n data-fnd=\"available\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"10\"\n viewBox=\"0 0 9 10\"\n fill=\"none\"\n >\n <path\n d=\"M4.085 0.915009C1.83008 0.915009 0 2.74509 0 5.00001C0 7.25493 1.83008 9.08501 4.085 9.08501C6.33992 9.08501 8.17 7.25493 8.17 5.00001C8.17 2.74509 6.33992 0.915009 4.085 0.915009Z\"\n fill=\"#17A511\"\n />\n <path\n d=\"M2.45099 4.82838L3.47224 6.06418L5.51474 4.21048\"\n stroke=\"white\"\n stroke-linecap=\"round\"\n />\n </svg>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.BUSY\">\n <svg\n data-fnd=\"busy\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n >\n <path\n d=\"M4.25504 0.169922C2.00012 0.169922 0.170044 2 0.170044 4.25492C0.170044 6.50984 2.00012 8.33992 4.25504 8.33992C6.50996 8.33992 8.34004 6.50984 8.34004 4.25492C8.34004 2 6.50996 0.169922 4.25504 0.169922Z\"\n fill=\"#D23335\"\n />\n </svg>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.DO_NOT_DISTURB\">\n <svg\n data-fnd=\"doNotDisturb\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n >\n <path\n d=\"M4.085 0C1.83008 0 0 1.83008 0 4.085C0 6.33992 1.83008 8.17 4.085 8.17C6.33992 8.17 8.17 6.33992 8.17 4.085C8.17 1.83008 6.33992 0 4.085 0Z\"\n fill=\"#D23335\"\n />\n <path d=\"M2 4L6 4\" stroke=\"white\" stroke-linecap=\"round\" />\n </svg>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.AWAY\">\n <svg\n data-fnd=\"away\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n >\n <path\n d=\"M4.085 0C1.83008 0 0 1.83008 0 4.085C0 6.33992 1.83008 8.17 4.085 8.17C6.33992 8.17 8.17 6.33992 8.17 4.085C8.17 1.83008 6.33992 0 4.085 0Z\"\n fill=\"#EDA000\"\n />\n <path d=\"M4 2L4 3.875L5.5 5.5\" stroke=\"white\" stroke-linecap=\"round\" />\n </svg>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.OFFLINE\">\n <svg\n data-fnd=\"offline\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n >\n <path\n d=\"M0.5 4.085C0.5 2.10622 2.10622 0.5 4.085 0.5C6.06378 0.5 7.67 2.10622 7.67 4.085C7.67 6.06378 6.06378 7.67 4.085 7.67C2.10622 7.67 0.5 6.06378 0.5 4.085Z\"\n stroke=\"#7D7D7D\"\n />\n <path d=\"M3 3L5 5\" stroke=\"#7D7D7D\" stroke-linecap=\"round\" />\n <path d=\"M5 3L3 5\" stroke=\"#7D7D7D\" stroke-linecap=\"round\" />\n </svg>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4020
|
+
}
|
|
4021
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: ContactItemDefaultStatusComponent, decorators: [{
|
|
4022
|
+
type: Component,
|
|
4023
|
+
args: [{ selector: 'granite-contact-item-default-status', host: {
|
|
4024
|
+
class: 'granite-contact-item-default-status',
|
|
4025
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container [ngSwitch]=\"status\">\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.AVAILABLE\">\n <svg\n data-fnd=\"available\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"10\"\n viewBox=\"0 0 9 10\"\n fill=\"none\"\n >\n <path\n d=\"M4.085 0.915009C1.83008 0.915009 0 2.74509 0 5.00001C0 7.25493 1.83008 9.08501 4.085 9.08501C6.33992 9.08501 8.17 7.25493 8.17 5.00001C8.17 2.74509 6.33992 0.915009 4.085 0.915009Z\"\n fill=\"#17A511\"\n />\n <path\n d=\"M2.45099 4.82838L3.47224 6.06418L5.51474 4.21048\"\n stroke=\"white\"\n stroke-linecap=\"round\"\n />\n </svg>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.BUSY\">\n <svg\n data-fnd=\"busy\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n >\n <path\n d=\"M4.25504 0.169922C2.00012 0.169922 0.170044 2 0.170044 4.25492C0.170044 6.50984 2.00012 8.33992 4.25504 8.33992C6.50996 8.33992 8.34004 6.50984 8.34004 4.25492C8.34004 2 6.50996 0.169922 4.25504 0.169922Z\"\n fill=\"#D23335\"\n />\n </svg>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.DO_NOT_DISTURB\">\n <svg\n data-fnd=\"doNotDisturb\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n >\n <path\n d=\"M4.085 0C1.83008 0 0 1.83008 0 4.085C0 6.33992 1.83008 8.17 4.085 8.17C6.33992 8.17 8.17 6.33992 8.17 4.085C8.17 1.83008 6.33992 0 4.085 0Z\"\n fill=\"#D23335\"\n />\n <path d=\"M2 4L6 4\" stroke=\"white\" stroke-linecap=\"round\" />\n </svg>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.AWAY\">\n <svg\n data-fnd=\"away\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n >\n <path\n d=\"M4.085 0C1.83008 0 0 1.83008 0 4.085C0 6.33992 1.83008 8.17 4.085 8.17C6.33992 8.17 8.17 6.33992 8.17 4.085C8.17 1.83008 6.33992 0 4.085 0Z\"\n fill=\"#EDA000\"\n />\n <path d=\"M4 2L4 3.875L5.5 5.5\" stroke=\"white\" stroke-linecap=\"round\" />\n </svg>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"CONTACT_STATUS.OFFLINE\">\n <svg\n data-fnd=\"offline\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n >\n <path\n d=\"M0.5 4.085C0.5 2.10622 2.10622 0.5 4.085 0.5C6.06378 0.5 7.67 2.10622 7.67 4.085C7.67 6.06378 6.06378 7.67 4.085 7.67C2.10622 7.67 0.5 6.06378 0.5 4.085Z\"\n stroke=\"#7D7D7D\"\n />\n <path d=\"M3 3L5 5\" stroke=\"#7D7D7D\" stroke-linecap=\"round\" />\n <path d=\"M5 3L3 5\" stroke=\"#7D7D7D\" stroke-linecap=\"round\" />\n </svg>\n </ng-container>\n</ng-container>\n" }]
|
|
4026
|
+
}], propDecorators: { status: [{
|
|
4027
|
+
type: Input
|
|
4028
|
+
}] } });
|
|
4029
|
+
|
|
4030
|
+
class GraniteContactItemTitleComponent {
|
|
4031
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactItemTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4032
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: GraniteContactItemTitleComponent, selector: "granite-contact-item-title", inputs: { contact: "contact" }, host: { classAttribute: "granite-contact-item-title" }, ngImport: i0, template: "<button\n tabindex=\"0\"\n data-fnd=\"contact-item-title\"\n [class.title-status-active]=\"!contact.disabled && !contact.options\"\n [class.title-status-disabled]=\"contact.disabled\"\n [class.title-status-parent]=\"!contact.disabled && contact.options\"\n>\n {{ contact.label }}\n</button>\n", styles: [".title-status-parent,.title-status-disabled,.title-status-active{font-size:var(--granite-font-size-micro);font-weight:var(--granite-font-weight-regular)}.title-status-active{color:var(--granite-color-text-link)}.title-status-active:hover{text-decoration:underline;cursor:pointer}.title-status-disabled{color:var(--granite-color-text-hint)}.title-status-parent{color:var(--granite-color-text)}button{all:unset}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4033
|
+
}
|
|
4034
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactItemTitleComponent, decorators: [{
|
|
4035
|
+
type: Component,
|
|
4036
|
+
args: [{ selector: 'granite-contact-item-title', host: {
|
|
4037
|
+
class: 'granite-contact-item-title',
|
|
4038
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n tabindex=\"0\"\n data-fnd=\"contact-item-title\"\n [class.title-status-active]=\"!contact.disabled && !contact.options\"\n [class.title-status-disabled]=\"contact.disabled\"\n [class.title-status-parent]=\"!contact.disabled && contact.options\"\n>\n {{ contact.label }}\n</button>\n", styles: [".title-status-parent,.title-status-disabled,.title-status-active{font-size:var(--granite-font-size-micro);font-weight:var(--granite-font-weight-regular)}.title-status-active{color:var(--granite-color-text-link)}.title-status-active:hover{text-decoration:underline;cursor:pointer}.title-status-disabled{color:var(--granite-color-text-hint)}.title-status-parent{color:var(--granite-color-text)}button{all:unset}\n"] }]
|
|
4039
|
+
}], propDecorators: { contact: [{
|
|
4040
|
+
type: Input
|
|
4041
|
+
}] } });
|
|
4042
|
+
|
|
4043
|
+
class GraniteContactItemComponent {
|
|
4044
|
+
constructor() {
|
|
4045
|
+
this.selectedContact = new EventEmitter();
|
|
4046
|
+
}
|
|
4047
|
+
emitSelectedContact(contact) {
|
|
4048
|
+
if (contact.disabled || contact.options) {
|
|
4049
|
+
return;
|
|
4050
|
+
}
|
|
4051
|
+
this.selectedContact.emit(contact);
|
|
4052
|
+
}
|
|
4053
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4054
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: GraniteContactItemComponent, selector: "granite-contact-item", inputs: { contact: "contact" }, outputs: { selectedContact: "selectedContact" }, host: { classAttribute: "granite-contact-item" }, ngImport: i0, template: "<div class=\"contact-item\" [attr.data-fnd]=\"contact.name\">\n <div class=\"contact-item-main\">\n <ng-container\n *ngTemplateOutlet=\"\n contactItem;\n context: { contact: contact, testName: 'contact' }\n \"\n ></ng-container>\n </div>\n\n <ul *ngIf=\"contact.options\" class=\"contact-item-options\">\n <li\n tabindex=\"0\"\n *ngFor=\"let option of contact.options; let i = index\"\n class=\"option-item\"\n [attr.data-fnd]=\"'contact-option-' + i\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n contactItem;\n context: { contact: option, testName: 'contact-option-' + i }\n \"\n ></ng-container>\n </li>\n </ul>\n</div>\n\n<ng-template let-testName=\"testName\" let-contact=\"contact\" #contactItem>\n <granite-icon\n [attr.data-fnd]=\"testName + '-icon'\"\n fontIcon=\"{{ contact.iconName }}\"\n ></granite-icon>\n\n <granite-contact-item-title\n [attr.data-fnd]=\"testName + '-title'\"\n tabindex=\"0\"\n [contact]=\"contact\"\n (click)=\"emitSelectedContact(contact)\"\n ></granite-contact-item-title>\n\n <ng-container *ngIf=\"contact.statusTemplate; else defaultStatus\">\n <ng-container *ngTemplateOutlet=\"contact.statusTemplate\"></ng-container>\n </ng-container>\n\n <ng-template #defaultStatus>\n <granite-contact-item-default-status\n [attr.data-fnd]=\"testName + '-status'\"\n [status]=\"contact.status\"\n ></granite-contact-item-default-status>\n </ng-template>\n</ng-template>\n", styles: [".contact-item{display:flex;flex-direction:column;gap:var(--granite-spacing-8)}.contact-item-main{display:flex;gap:var(--granite-spacing-8);align-self:stretch;align-items:center}.contact-item-options{display:flex;flex-direction:column;padding-inline-start:var(--granite-spacing-24);gap:var(--granite-spacing-4);list-style:none}.contact-item-options .option-item{display:flex;gap:var(--granite-spacing-8);align-self:stretch;align-items:center}.contact-item granite-contact-item-title,.contact-item granite-contact-item-default-status{display:flex}granite-icon{padding:0;color:var(--granite-color-text-hint);width:var(--granite-size-base-rem);height:var(--granite-size-base-rem)}\n"], dependencies: [{ kind: "component", type: GraniteIconComponent, selector: "granite-icon", inputs: ["fontIcon"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ContactItemDefaultStatusComponent, selector: "granite-contact-item-default-status", inputs: ["status"] }, { kind: "component", type: GraniteContactItemTitleComponent, selector: "granite-contact-item-title", inputs: ["contact"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4055
|
+
}
|
|
4056
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactItemComponent, decorators: [{
|
|
4057
|
+
type: Component,
|
|
4058
|
+
args: [{ selector: 'granite-contact-item', host: {
|
|
4059
|
+
class: 'granite-contact-item',
|
|
4060
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"contact-item\" [attr.data-fnd]=\"contact.name\">\n <div class=\"contact-item-main\">\n <ng-container\n *ngTemplateOutlet=\"\n contactItem;\n context: { contact: contact, testName: 'contact' }\n \"\n ></ng-container>\n </div>\n\n <ul *ngIf=\"contact.options\" class=\"contact-item-options\">\n <li\n tabindex=\"0\"\n *ngFor=\"let option of contact.options; let i = index\"\n class=\"option-item\"\n [attr.data-fnd]=\"'contact-option-' + i\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n contactItem;\n context: { contact: option, testName: 'contact-option-' + i }\n \"\n ></ng-container>\n </li>\n </ul>\n</div>\n\n<ng-template let-testName=\"testName\" let-contact=\"contact\" #contactItem>\n <granite-icon\n [attr.data-fnd]=\"testName + '-icon'\"\n fontIcon=\"{{ contact.iconName }}\"\n ></granite-icon>\n\n <granite-contact-item-title\n [attr.data-fnd]=\"testName + '-title'\"\n tabindex=\"0\"\n [contact]=\"contact\"\n (click)=\"emitSelectedContact(contact)\"\n ></granite-contact-item-title>\n\n <ng-container *ngIf=\"contact.statusTemplate; else defaultStatus\">\n <ng-container *ngTemplateOutlet=\"contact.statusTemplate\"></ng-container>\n </ng-container>\n\n <ng-template #defaultStatus>\n <granite-contact-item-default-status\n [attr.data-fnd]=\"testName + '-status'\"\n [status]=\"contact.status\"\n ></granite-contact-item-default-status>\n </ng-template>\n</ng-template>\n", styles: [".contact-item{display:flex;flex-direction:column;gap:var(--granite-spacing-8)}.contact-item-main{display:flex;gap:var(--granite-spacing-8);align-self:stretch;align-items:center}.contact-item-options{display:flex;flex-direction:column;padding-inline-start:var(--granite-spacing-24);gap:var(--granite-spacing-4);list-style:none}.contact-item-options .option-item{display:flex;gap:var(--granite-spacing-8);align-self:stretch;align-items:center}.contact-item granite-contact-item-title,.contact-item granite-contact-item-default-status{display:flex}granite-icon{padding:0;color:var(--granite-color-text-hint);width:var(--granite-size-base-rem);height:var(--granite-size-base-rem)}\n"] }]
|
|
4061
|
+
}], propDecorators: { contact: [{
|
|
4062
|
+
type: Input
|
|
4063
|
+
}], selectedContact: [{
|
|
4064
|
+
type: Output
|
|
4065
|
+
}] } });
|
|
4066
|
+
|
|
4067
|
+
class GraniteContactsComponent extends ContactsTriggerDataComponent {
|
|
4068
|
+
constructor() {
|
|
4069
|
+
super(...arguments);
|
|
4070
|
+
this.contacts = [];
|
|
4071
|
+
this.defaultShow = false;
|
|
4072
|
+
this.selectedContact = new EventEmitter();
|
|
4073
|
+
this._contactsExtended = [];
|
|
4074
|
+
}
|
|
4075
|
+
ngOnChanges(changes) {
|
|
4076
|
+
if (changes.contacts && !changes.contacts.currentValue) {
|
|
4077
|
+
this.contacts = [];
|
|
4078
|
+
}
|
|
4079
|
+
}
|
|
4080
|
+
ngAfterContentChecked() {
|
|
4081
|
+
this._contactsExtended = this.setProperCustomStatusTemplates(this._customStatuses.toArray(), this.contacts);
|
|
4082
|
+
}
|
|
4083
|
+
onSelectedContact(contact) {
|
|
4084
|
+
this.selectedContact.emit(contact);
|
|
4085
|
+
}
|
|
4086
|
+
setProperCustomStatusTemplates(customStatusDirectives, contacts) {
|
|
4087
|
+
return this.applyTemplates(contacts, customStatusDirectives);
|
|
4088
|
+
}
|
|
4089
|
+
applyTemplates(contacts, directives) {
|
|
4090
|
+
return contacts.map((item) => {
|
|
4091
|
+
const matchingDirective = directives.find((d) => d.graniteCustomStatus === item.status);
|
|
4092
|
+
const result = { ...item };
|
|
4093
|
+
if (matchingDirective) {
|
|
4094
|
+
result.statusTemplate = matchingDirective.templateRef;
|
|
4095
|
+
}
|
|
4096
|
+
if (item.options) {
|
|
4097
|
+
result.options = this.applyTemplates(item.options, directives);
|
|
4098
|
+
}
|
|
4099
|
+
return result;
|
|
4100
|
+
});
|
|
4101
|
+
}
|
|
4102
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
4103
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: GraniteContactsComponent, selector: "granite-contacts", inputs: { contacts: "contacts", profile: "profile", profileClass: "profileClass", defaultShow: "defaultShow" }, outputs: { selectedContact: "selectedContact" }, host: { classAttribute: "granite-contacts" }, queries: [{ propertyName: "customProfileDirective", first: true, predicate: GraniteCustomProfileDirective, descendants: true }, { propertyName: "_customStatuses", predicate: GraniteCustomStatusDirective }], exportAs: ["graniteContacts"], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-template #contactsTemplate>\n <div data-fnd=\"contacts\" class=\"granite-contact\">\n <ng-container *ngIf=\"customProfileDirective; else defaultProfile\">\n <ng-container\n *ngTemplateOutlet=\"customProfileDirective.templateRef\"\n ></ng-container>\n </ng-container>\n\n <ng-template #defaultProfile>\n <granite-contacts-profile\n data-fnd=\"default-profile\"\n [profileClass]=\"profileClass\"\n [profile]=\"profile\"\n ></granite-contacts-profile>\n </ng-template>\n\n <ul class=\"contact-list\">\n <li *ngFor=\"let contact of _contactsExtended\">\n <granite-contact-item\n [contact]=\"contact\"\n (selectedContact)=\"onSelectedContact($event)\"\n ></granite-contact-item>\n </li>\n </ul>\n </div>\n</ng-template>\n\n<ng-container *ngIf=\"defaultShow\">\n <ng-container *ngTemplateOutlet=\"contactsTemplate\"></ng-container>\n</ng-container>\n", styles: [".granite-contact{display:inline-block;font-size:var(--granite-font-size-body);font-family:var(--granite-font-family-default);color:var(--granite-color-text-weak);min-width:10rem;max-width:20rem;padding:var(--granite-spacing-16);box-shadow:var(--granite-shadow-popover);background:var(--granite-color-background-variant)}.granite-contact .contact-list{display:flex;flex-direction:column;align-items:flex-start;gap:var(--granite-spacing-8);list-style-type:none;padding:0;margin:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: GraniteContactsProfileComponent, selector: "granite-contacts-profile", inputs: ["profile", "profileClass"] }, { kind: "component", type: GraniteContactItemComponent, selector: "granite-contact-item", inputs: ["contact"], outputs: ["selectedContact"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4104
|
+
}
|
|
4105
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsComponent, decorators: [{
|
|
4106
|
+
type: Component,
|
|
4107
|
+
args: [{ selector: 'granite-contacts', exportAs: 'graniteContacts', host: {
|
|
4108
|
+
class: 'granite-contacts',
|
|
4109
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #contactsTemplate>\n <div data-fnd=\"contacts\" class=\"granite-contact\">\n <ng-container *ngIf=\"customProfileDirective; else defaultProfile\">\n <ng-container\n *ngTemplateOutlet=\"customProfileDirective.templateRef\"\n ></ng-container>\n </ng-container>\n\n <ng-template #defaultProfile>\n <granite-contacts-profile\n data-fnd=\"default-profile\"\n [profileClass]=\"profileClass\"\n [profile]=\"profile\"\n ></granite-contacts-profile>\n </ng-template>\n\n <ul class=\"contact-list\">\n <li *ngFor=\"let contact of _contactsExtended\">\n <granite-contact-item\n [contact]=\"contact\"\n (selectedContact)=\"onSelectedContact($event)\"\n ></granite-contact-item>\n </li>\n </ul>\n </div>\n</ng-template>\n\n<ng-container *ngIf=\"defaultShow\">\n <ng-container *ngTemplateOutlet=\"contactsTemplate\"></ng-container>\n</ng-container>\n", styles: [".granite-contact{display:inline-block;font-size:var(--granite-font-size-body);font-family:var(--granite-font-family-default);color:var(--granite-color-text-weak);min-width:10rem;max-width:20rem;padding:var(--granite-spacing-16);box-shadow:var(--granite-shadow-popover);background:var(--granite-color-background-variant)}.granite-contact .contact-list{display:flex;flex-direction:column;align-items:flex-start;gap:var(--granite-spacing-8);list-style-type:none;padding:0;margin:0}\n"] }]
|
|
4110
|
+
}], propDecorators: { contacts: [{
|
|
4111
|
+
type: Input
|
|
4112
|
+
}], profile: [{
|
|
4113
|
+
type: Input
|
|
4114
|
+
}], profileClass: [{
|
|
4115
|
+
type: Input
|
|
4116
|
+
}], defaultShow: [{
|
|
4117
|
+
type: Input
|
|
4118
|
+
}], selectedContact: [{
|
|
4119
|
+
type: Output
|
|
4120
|
+
}], _customStatuses: [{
|
|
4121
|
+
type: ContentChildren,
|
|
4122
|
+
args: [GraniteCustomStatusDirective]
|
|
4123
|
+
}], customProfileDirective: [{
|
|
4124
|
+
type: ContentChild,
|
|
4125
|
+
args: [GraniteCustomProfileDirective]
|
|
4126
|
+
}] } });
|
|
4127
|
+
|
|
4128
|
+
class GraniteContactsTriggerForDirective {
|
|
4129
|
+
constructor(_overlay, _element, _viewContainerRef, _outsideClickDispatcher,
|
|
4130
|
+
/** Client input device information */
|
|
4131
|
+
_clientInput,
|
|
4132
|
+
/** Client output device information */
|
|
4133
|
+
_clientOutput, _dir, _focusMonitor) {
|
|
4134
|
+
this._overlay = _overlay;
|
|
4135
|
+
this._element = _element;
|
|
4136
|
+
this._viewContainerRef = _viewContainerRef;
|
|
4137
|
+
this._outsideClickDispatcher = _outsideClickDispatcher;
|
|
4138
|
+
this._clientInput = _clientInput;
|
|
4139
|
+
this._clientOutput = _clientOutput;
|
|
4140
|
+
this._dir = _dir;
|
|
4141
|
+
this._focusMonitor = _focusMonitor;
|
|
4142
|
+
/** Whether the associated contacts is open */
|
|
4143
|
+
this._isContactsOpen = false;
|
|
4144
|
+
this._contactsCloseSubscription = Subscription.EMPTY;
|
|
4145
|
+
this._portal = null;
|
|
4146
|
+
this._overlayRef = null;
|
|
4147
|
+
}
|
|
4148
|
+
ngAfterContentInit() {
|
|
4149
|
+
const selectedContact = this.contacts.selectedContact;
|
|
4150
|
+
this._contactsCloseSubscription = selectedContact.subscribe(() => this.closeContacts());
|
|
4151
|
+
}
|
|
4152
|
+
ngOnDestroy() {
|
|
4153
|
+
if (this._overlayRef) {
|
|
4154
|
+
this._overlayRef.dispose();
|
|
4155
|
+
this._overlayRef = null;
|
|
4156
|
+
}
|
|
4157
|
+
this._contactsCloseSubscription.unsubscribe();
|
|
4158
|
+
}
|
|
4159
|
+
isOpen() {
|
|
4160
|
+
return this._isContactsOpen;
|
|
4161
|
+
}
|
|
4162
|
+
openContacts() {
|
|
4163
|
+
if (this._isContactsOpen) {
|
|
4164
|
+
return;
|
|
4165
|
+
}
|
|
4166
|
+
this.contacts.direction = this._dir.value === 'rtl' ? 'rtl' : 'ltr';
|
|
4167
|
+
this.contacts.clientInput = this._clientInput;
|
|
4168
|
+
this.contacts.clientOutput = this._clientOutput;
|
|
4169
|
+
const panelClass = [];
|
|
4170
|
+
if (this._clientOutput?.device === 'touch') {
|
|
4171
|
+
panelClass.push('granite-overlay-pane-center');
|
|
4172
|
+
}
|
|
4173
|
+
const scrollStrategy = this._clientOutput?.device !== 'touch'
|
|
4174
|
+
? this._overlay.scrollStrategies.reposition()
|
|
4175
|
+
: this._overlay.scrollStrategies.block();
|
|
4176
|
+
const hasBackdrop = this._clientOutput?.device === 'touch';
|
|
4177
|
+
if (!this._overlayRef) {
|
|
4178
|
+
const config = new OverlayConfig({
|
|
4179
|
+
positionStrategy: this._positionStrategy(),
|
|
4180
|
+
backdropClass: 'granite-overlay-dark-glass-backdrop',
|
|
4181
|
+
scrollStrategy,
|
|
4182
|
+
direction: this._dir,
|
|
4183
|
+
panelClass,
|
|
4184
|
+
hasBackdrop,
|
|
4185
|
+
});
|
|
4186
|
+
this._overlayRef = this._overlay.create(config);
|
|
4187
|
+
}
|
|
4188
|
+
if (!this._portal ||
|
|
4189
|
+
this._portal.templateRef !== this.contacts.templateRef) {
|
|
4190
|
+
this._portal = new TemplatePortal(this.contacts.templateRef, this._viewContainerRef);
|
|
4191
|
+
}
|
|
4192
|
+
// Attach portal to overlay ref (which is a portal outlet)
|
|
4193
|
+
this._overlayRef.attach(this._portal);
|
|
4194
|
+
this._outsideClickDispatcher.add(this._overlayRef);
|
|
4195
|
+
this._overlayRef.outsidePointerEvents().subscribe((event) => {
|
|
4196
|
+
event.stopPropagation();
|
|
4197
|
+
this.closeContacts();
|
|
4198
|
+
});
|
|
4199
|
+
this._isContactsOpen = true;
|
|
4200
|
+
}
|
|
4201
|
+
/** Toggles the contacts between the open and closed states. */
|
|
4202
|
+
toggleContacts() {
|
|
4203
|
+
if (this._isContactsOpen) {
|
|
4204
|
+
this.closeContacts();
|
|
4205
|
+
}
|
|
4206
|
+
else {
|
|
4207
|
+
this.openContacts();
|
|
4208
|
+
}
|
|
4209
|
+
}
|
|
4210
|
+
/** Close the associated contacts */
|
|
4211
|
+
closeContacts() {
|
|
4212
|
+
if (!this._overlayRef || !this._isContactsOpen) {
|
|
4213
|
+
return;
|
|
4214
|
+
}
|
|
4215
|
+
this._outsideClickDispatcher.remove(this._overlayRef);
|
|
4216
|
+
this._overlayRef.detach();
|
|
4217
|
+
this._restoreFocus();
|
|
4218
|
+
this._isContactsOpen = false;
|
|
4219
|
+
}
|
|
4220
|
+
/** Handles key presses on the trigger. */
|
|
4221
|
+
_handleKeydown(event) {
|
|
4222
|
+
if (event.key === 'Enter') {
|
|
4223
|
+
event.preventDefault();
|
|
4224
|
+
this.toggleContacts();
|
|
4225
|
+
}
|
|
4226
|
+
}
|
|
4227
|
+
/** Handles click events on the trigger. */
|
|
4228
|
+
_handleClick() {
|
|
4229
|
+
this.toggleContacts();
|
|
4230
|
+
}
|
|
4231
|
+
/**
|
|
4232
|
+
* Restores focus to the element that was focused before the contacts was open.
|
|
4233
|
+
*/
|
|
4234
|
+
_restoreFocus(origin = 'program', options) {
|
|
4235
|
+
if (this._focusMonitor) {
|
|
4236
|
+
this._focusMonitor.focusVia(this._element, origin, options);
|
|
4237
|
+
}
|
|
4238
|
+
else {
|
|
4239
|
+
this._element.nativeElement.focus(options);
|
|
4240
|
+
}
|
|
4241
|
+
}
|
|
4242
|
+
/**
|
|
4243
|
+
* Returns strategy for positioning the overlay for desktop devices:
|
|
4244
|
+
*/
|
|
4245
|
+
_desktopPositionStrategy() {
|
|
4246
|
+
const positionStrategy = this._overlay
|
|
4247
|
+
.position()
|
|
4248
|
+
.flexibleConnectedTo(this._element)
|
|
4249
|
+
.withLockedPosition()
|
|
4250
|
+
.withTransformOriginOn('.granite-contacts')
|
|
4251
|
+
.withPush(false);
|
|
4252
|
+
this._setPosition(positionStrategy);
|
|
4253
|
+
return positionStrategy;
|
|
4254
|
+
}
|
|
4255
|
+
/**
|
|
4256
|
+
* Sets the appropriate positions on a position strategy
|
|
4257
|
+
* so the overlay connects with the trigger correctly.
|
|
4258
|
+
* @param positionStrategy Strategy whose position to update.
|
|
4259
|
+
*/
|
|
4260
|
+
_setPosition(positionStrategy) {
|
|
4261
|
+
const [originX, originFallbackX] = this.contacts.xPosition === 'before'
|
|
4262
|
+
? ['end', 'start']
|
|
4263
|
+
: ['start', 'end'];
|
|
4264
|
+
const [overlayY, overlayFallbackY] = this.contacts.yPosition === 'above'
|
|
4265
|
+
? ['bottom', 'top']
|
|
4266
|
+
: ['top', 'bottom'];
|
|
4267
|
+
let [originY, originFallbackY] = [overlayY, overlayFallbackY];
|
|
4268
|
+
const [overlayX, overlayFallbackX] = [originX, originFallbackX];
|
|
4269
|
+
const offsetY = 0;
|
|
4270
|
+
originY = overlayY === 'top' ? 'bottom' : 'top';
|
|
4271
|
+
originFallbackY = overlayFallbackY === 'top' ? 'bottom' : 'top';
|
|
4272
|
+
positionStrategy.withPositions([
|
|
4273
|
+
{ originX, originY, overlayX, overlayY, offsetY },
|
|
4274
|
+
{
|
|
4275
|
+
originX: originFallbackX,
|
|
4276
|
+
originY,
|
|
4277
|
+
overlayX: overlayFallbackX,
|
|
4278
|
+
overlayY,
|
|
4279
|
+
offsetY,
|
|
4280
|
+
},
|
|
4281
|
+
{
|
|
4282
|
+
originX,
|
|
4283
|
+
originY: originFallbackY,
|
|
4284
|
+
overlayX,
|
|
4285
|
+
overlayY: overlayFallbackY,
|
|
4286
|
+
offsetY: -offsetY,
|
|
4287
|
+
},
|
|
4288
|
+
{
|
|
4289
|
+
originX: originFallbackX,
|
|
4290
|
+
originY: originFallbackY,
|
|
4291
|
+
overlayX: overlayFallbackX,
|
|
4292
|
+
overlayY: overlayFallbackY,
|
|
4293
|
+
offsetY: -offsetY,
|
|
4294
|
+
},
|
|
4295
|
+
]);
|
|
4296
|
+
}
|
|
4297
|
+
/**
|
|
4298
|
+
* Returns strategy for positioning the overlay depending on what type of
|
|
4299
|
+
* device the contacts is being shown on
|
|
4300
|
+
*/
|
|
4301
|
+
_positionStrategy() {
|
|
4302
|
+
if (this._clientOutput?.device !== 'touch') {
|
|
4303
|
+
return this._desktopPositionStrategy();
|
|
4304
|
+
}
|
|
4305
|
+
return this._touchPositionStrategy();
|
|
4306
|
+
}
|
|
4307
|
+
/**
|
|
4308
|
+
* Returns strategy for positioning the overlay for touch devices:
|
|
4309
|
+
* Place centered in the screen.
|
|
4310
|
+
*/
|
|
4311
|
+
_touchPositionStrategy() {
|
|
4312
|
+
return this._overlay.position().global();
|
|
4313
|
+
}
|
|
4314
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsTriggerForDirective, deps: [{ token: i1$2.Overlay }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i1$2.OverlayOutsideClickDispatcher }, { token: GRANITE_CLIENT_INPUT, optional: true }, { token: GRANITE_CLIENT_OUTPUT, optional: true }, { token: i3.Directionality, optional: true }, { token: i1.FocusMonitor }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
4315
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.4", type: GraniteContactsTriggerForDirective, selector: "[graniteContactsTriggerFor]", inputs: { contacts: ["graniteContactsTriggerFor", "contacts"] }, host: { attributes: { "aria-haspopup": "true" }, listeners: { "keydown": "_handleKeydown($event)", "click": "_handleClick($event)" }, properties: { "attr.aria-expanded": "_isContactsOpen || null", "attr.aria-controls": "_isContactsOpen ? contacts.panelId : null" }, classAttribute: "granite-contacts-trigger" }, ngImport: i0 }); }
|
|
4316
|
+
}
|
|
4317
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsTriggerForDirective, decorators: [{
|
|
4318
|
+
type: Directive,
|
|
4319
|
+
args: [{
|
|
4320
|
+
selector: `[graniteContactsTriggerFor]`,
|
|
4321
|
+
host: {
|
|
4322
|
+
class: 'granite-contacts-trigger',
|
|
4323
|
+
'aria-haspopup': 'true',
|
|
4324
|
+
'[attr.aria-expanded]': '_isContactsOpen || null',
|
|
4325
|
+
'[attr.aria-controls]': '_isContactsOpen ? contacts.panelId : null',
|
|
4326
|
+
'(keydown)': '_handleKeydown($event)',
|
|
4327
|
+
'(click)': '_handleClick($event)',
|
|
4328
|
+
},
|
|
4329
|
+
}]
|
|
4330
|
+
}], ctorParameters: () => [{ type: i1$2.Overlay }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i1$2.OverlayOutsideClickDispatcher }, { type: undefined, decorators: [{
|
|
4331
|
+
type: Inject,
|
|
4332
|
+
args: [GRANITE_CLIENT_INPUT]
|
|
4333
|
+
}, {
|
|
4334
|
+
type: Optional
|
|
4335
|
+
}] }, { type: undefined, decorators: [{
|
|
4336
|
+
type: Inject,
|
|
4337
|
+
args: [GRANITE_CLIENT_OUTPUT]
|
|
4338
|
+
}, {
|
|
4339
|
+
type: Optional
|
|
4340
|
+
}] }, { type: i3.Directionality, decorators: [{
|
|
4341
|
+
type: Optional
|
|
4342
|
+
}] }, { type: i1.FocusMonitor }], propDecorators: { contacts: [{
|
|
4343
|
+
type: Input,
|
|
4344
|
+
args: ['graniteContactsTriggerFor']
|
|
4345
|
+
}] } });
|
|
4346
|
+
|
|
4347
|
+
class GraniteContactsModule {
|
|
4348
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
4349
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsModule, declarations: [GraniteContactsComponent,
|
|
4350
|
+
GraniteContactsProfileComponent,
|
|
4351
|
+
GraniteContactItemComponent,
|
|
4352
|
+
ContactItemDefaultStatusComponent,
|
|
4353
|
+
GraniteContactItemTitleComponent,
|
|
4354
|
+
GraniteContactsTriggerForDirective,
|
|
4355
|
+
GraniteCustomStatusDirective,
|
|
4356
|
+
GraniteCustomProfileDirective], imports: [GraniteIconModule, CommonModule], exports: [GraniteContactsComponent,
|
|
4357
|
+
GraniteContactsTriggerForDirective,
|
|
4358
|
+
GraniteContactItemComponent,
|
|
4359
|
+
GraniteCustomStatusDirective,
|
|
4360
|
+
GraniteCustomProfileDirective] }); }
|
|
4361
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsModule, imports: [GraniteIconModule, CommonModule] }); }
|
|
4362
|
+
}
|
|
4363
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: GraniteContactsModule, decorators: [{
|
|
4364
|
+
type: NgModule,
|
|
4365
|
+
args: [{
|
|
4366
|
+
imports: [GraniteIconModule, CommonModule],
|
|
4367
|
+
declarations: [
|
|
4368
|
+
GraniteContactsComponent,
|
|
4369
|
+
GraniteContactsProfileComponent,
|
|
4370
|
+
GraniteContactItemComponent,
|
|
4371
|
+
ContactItemDefaultStatusComponent,
|
|
4372
|
+
GraniteContactItemTitleComponent,
|
|
4373
|
+
GraniteContactsTriggerForDirective,
|
|
4374
|
+
GraniteCustomStatusDirective,
|
|
4375
|
+
GraniteCustomProfileDirective,
|
|
4376
|
+
],
|
|
4377
|
+
exports: [
|
|
4378
|
+
GraniteContactsComponent,
|
|
4379
|
+
GraniteContactsTriggerForDirective,
|
|
4380
|
+
GraniteContactItemComponent,
|
|
4381
|
+
GraniteCustomStatusDirective,
|
|
4382
|
+
GraniteCustomProfileDirective,
|
|
4383
|
+
],
|
|
4384
|
+
}]
|
|
4385
|
+
}] });
|
|
4386
|
+
|
|
3929
4387
|
class GraniteHideOnOverflowDirective {
|
|
3930
4388
|
constructor(_elementRef, renderer) {
|
|
3931
4389
|
this._elementRef = _elementRef;
|
|
@@ -4502,5 +4960,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImpor
|
|
|
4502
4960
|
* Generated bundle index. Do not edit.
|
|
4503
4961
|
*/
|
|
4504
4962
|
|
|
4505
|
-
export { ButtonSelectors, ClientInputDesktopDirective, ClientInputTouchDirective, ClientOutputDesktopDirective, ClientOutputTouchDirective, GRANITE_CLIENT_INPUT, GRANITE_CLIENT_OUTPUT, GraniteAnchorComponent, GraniteArrangeGridComponent, GraniteArrangeGridItemComponent, GraniteArrangeGridModule, GraniteArrangeGridOrientation, GraniteBadgeComponent, GraniteBadgeHarness, GraniteBadgeModule, GraniteButtonComponent, GraniteButtonModule, GraniteCardActionsComponent, GraniteCardAvatarComponent, GraniteCardBodyComponent, GraniteCardComponent, GraniteCardContentComponent, GraniteCardFooterComponent, GraniteCardHeaderComponent, GraniteCardHeaderSubTitleComponent, GraniteCardHeaderTitleComponent, GraniteCardListComponent, GraniteCardListModule, GraniteCheckboxComponent, GraniteCheckboxGroupComponent, GraniteCheckboxModule, GraniteChipComponent, GraniteChipInputDirective, GraniteChipListComponent, GraniteChipSelectionChangeEvent, GraniteChipsModule, GraniteCollapsibleConditionalBodyDirective, GraniteCollapsibleConditionalHeaderDirective, GraniteCollapsibleGroupComponent, GraniteCollapsibleGroupModule, GraniteCoreModule, GraniteDividerDirective, GraniteGridComponent, GraniteGridItemComponent, GraniteGridModule, GraniteHideOnOverflowDirective, GraniteIconComponent, GraniteIconModule, GraniteInputFieldComponent, GraniteInputFieldModule, GraniteLabelComponent, GraniteLabelModule, GraniteMenuComponent, GraniteMenuHarness, GraniteMenuItemComponent, GraniteMenuItemHarness, GraniteMenuModule, GraniteMenuTouchCloseComponent, GraniteMenuTouchTitleItemComponent, GraniteMenuTriggerForDirective, GraniteProgressBarComponent, GraniteProgressBarModule, GraniteRadioButtonComponent, GraniteRadioButtonModule, GraniteRadioGroupComponent, GraniteTitleDirective, GraniteTitlePipe, GraniteToggleSwitchComponent, GraniteToggleSwitchModule, PurePipesModule, deviceDesktop, deviceTouch, disabledMixin, graniteMenuDesktopAnimations, graniteMenuTouchAnimations };
|
|
4963
|
+
export { ButtonSelectors, CONTACT_DEFAULT_STATUS, ClientInputDesktopDirective, ClientInputTouchDirective, ClientOutputDesktopDirective, ClientOutputTouchDirective, ContactItemDefaultStatusComponent, GRANITE_CLIENT_INPUT, GRANITE_CLIENT_OUTPUT, GraniteAnchorComponent, GraniteArrangeGridComponent, GraniteArrangeGridItemComponent, GraniteArrangeGridModule, GraniteArrangeGridOrientation, GraniteBadgeComponent, GraniteBadgeHarness, GraniteBadgeModule, GraniteButtonComponent, GraniteButtonModule, GraniteCardActionsComponent, GraniteCardAvatarComponent, GraniteCardBodyComponent, GraniteCardComponent, GraniteCardContentComponent, GraniteCardFooterComponent, GraniteCardHeaderComponent, GraniteCardHeaderSubTitleComponent, GraniteCardHeaderTitleComponent, GraniteCardListComponent, GraniteCardListModule, GraniteCheckboxComponent, GraniteCheckboxGroupComponent, GraniteCheckboxModule, GraniteChipComponent, GraniteChipInputDirective, GraniteChipListComponent, GraniteChipSelectionChangeEvent, GraniteChipsModule, GraniteCollapsibleConditionalBodyDirective, GraniteCollapsibleConditionalHeaderDirective, GraniteCollapsibleGroupComponent, GraniteCollapsibleGroupModule, GraniteContactItemComponent, GraniteContactItemTitleComponent, GraniteContactsComponent, GraniteContactsModule, GraniteContactsProfileComponent, GraniteContactsTriggerForDirective, GraniteCoreModule, GraniteCustomProfileDirective, GraniteCustomStatusDirective, GraniteDividerDirective, GraniteGridComponent, GraniteGridItemComponent, GraniteGridModule, GraniteHideOnOverflowDirective, GraniteIconComponent, GraniteIconModule, GraniteInputFieldComponent, GraniteInputFieldModule, GraniteLabelComponent, GraniteLabelModule, GraniteMenuComponent, GraniteMenuHarness, GraniteMenuItemComponent, GraniteMenuItemHarness, GraniteMenuModule, GraniteMenuTouchCloseComponent, GraniteMenuTouchTitleItemComponent, GraniteMenuTriggerForDirective, GraniteProgressBarComponent, GraniteProgressBarModule, GraniteRadioButtonComponent, GraniteRadioButtonModule, GraniteRadioGroupComponent, GraniteTitleDirective, GraniteTitlePipe, GraniteToggleSwitchComponent, GraniteToggleSwitchModule, PurePipesModule, deviceDesktop, deviceTouch, disabledMixin, graniteMenuDesktopAnimations, graniteMenuTouchAnimations };
|
|
4506
4964
|
//# sourceMappingURL=ifsworld-granite-components.mjs.map
|