@propmix/profet-common-header 3.0.15-utility-unstable.7 → 3.0.16-cross-tab-session-expiry
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/api-endpoints.def.mjs +2 -3
- package/esm2020/lib/api-gateway.service.mjs +13 -5
- package/esm2020/lib/common-header.interface.mjs +1 -1
- package/esm2020/lib/common-header.service.mjs +2 -34
- package/esm2020/lib/header/header.component.mjs +121 -60
- package/esm2020/lib/session-expiry-info/session-expiry-info.component.mjs +3 -3
- package/esm2020/public-api.mjs +1 -3
- package/fesm2015/propmix-profet-common-header.mjs +161 -140
- package/fesm2015/propmix-profet-common-header.mjs.map +1 -1
- package/fesm2020/propmix-profet-common-header.mjs +159 -132
- package/fesm2020/propmix-profet-common-header.mjs.map +1 -1
- package/lib/api-endpoints.def.d.ts +0 -1
- package/lib/api-gateway.service.d.ts +1 -2
- package/lib/common-header.interface.d.ts +0 -22
- package/lib/common-header.service.d.ts +0 -7
- package/lib/header/header.component.d.ts +19 -16
- package/package.json +1 -1
- package/public-api.d.ts +0 -2
- package/esm2020/lib/appraisal-assistant/appraisal-assistant-chat-widget.component.mjs +0 -179
- package/esm2020/lib/appraisal-assistant/appraisal-assistant.interface.mjs +0 -2
- package/esm2020/lib/base-controller.abstract.mjs +0 -11
- package/esm2020/lib/closable.mixin.mjs +0 -14
- package/esm2020/lib/utility-widget-config.token.mjs +0 -3
- package/esm2020/lib/utils/chat-time.pipe.mjs +0 -35
- package/esm2020/lib/utils/text-to-html.pipe.mjs +0 -42
- package/fesm2015/propmix-profet-common-header-appraisal-assistant-chat-widget.component-56a1672f.mjs +0 -281
- package/fesm2015/propmix-profet-common-header-appraisal-assistant-chat-widget.component-56a1672f.mjs.map +0 -1
- package/fesm2020/propmix-profet-common-header-appraisal-assistant-chat-widget.component-8816b836.mjs +0 -276
- package/fesm2020/propmix-profet-common-header-appraisal-assistant-chat-widget.component-8816b836.mjs.map +0 -1
- package/lib/appraisal-assistant/appraisal-assistant-chat-widget.component.d.ts +0 -37
- package/lib/appraisal-assistant/appraisal-assistant.interface.d.ts +0 -4
- package/lib/base-controller.abstract.d.ts +0 -6
- package/lib/closable.mixin.d.ts +0 -7
- package/lib/utility-widget-config.token.d.ts +0 -2
- package/lib/utils/chat-time.pipe.d.ts +0 -7
- package/lib/utils/text-to-html.pipe.d.ts +0 -21
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
-
import { ApiConfig } from './common-header.interface';
|
|
3
2
|
import * as i0 from "@angular/core";
|
|
4
3
|
export declare class ApiGatewayService {
|
|
5
4
|
private _http;
|
|
6
|
-
doGet(url: string, config?:
|
|
5
|
+
doGet(url: string, config?: any): Observable<any>;
|
|
7
6
|
doPost(url: string, req_body?: any): Observable<any>;
|
|
8
7
|
static ɵfac: i0.ɵɵFactoryDeclaration<ApiGatewayService, never>;
|
|
9
8
|
static ɵprov: i0.ɵɵInjectableDeclaration<ApiGatewayService>;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { HttpHeaders } from "@angular/common/http";
|
|
2
|
-
import { EventEmitter, Type } from "@angular/core";
|
|
3
1
|
import { PROFET_APPS } from "./utils/apps.enum";
|
|
4
2
|
export interface AppMenu {
|
|
5
3
|
appType: PROFET_APPS;
|
|
@@ -19,8 +17,6 @@ export interface HeaderConfig {
|
|
|
19
17
|
portalFrontendUrl?: string;
|
|
20
18
|
signOutUrl: string;
|
|
21
19
|
appType: PROFET_APPS;
|
|
22
|
-
disableUtilityDrawer?: boolean;
|
|
23
|
-
disableAppraisalAssistantApp?: boolean;
|
|
24
20
|
}
|
|
25
21
|
export interface Company {
|
|
26
22
|
id: number;
|
|
@@ -38,21 +34,3 @@ export interface Company {
|
|
|
38
34
|
export interface SessionOutInfo {
|
|
39
35
|
sessionOutTimeInMins?: number;
|
|
40
36
|
}
|
|
41
|
-
export interface UtilityConfig {
|
|
42
|
-
id: string;
|
|
43
|
-
label: string;
|
|
44
|
-
loadComponent?: () => Promise<Type<any>>;
|
|
45
|
-
layout?: 'push' | 'side' | 'over';
|
|
46
|
-
icon: string;
|
|
47
|
-
config?: any;
|
|
48
|
-
}
|
|
49
|
-
export interface UtilityComp {
|
|
50
|
-
outEvent: EventEmitter<boolean>;
|
|
51
|
-
}
|
|
52
|
-
export interface ApiConfig {
|
|
53
|
-
httpHeader?: HttpHeaders;
|
|
54
|
-
isUnauthorized?: boolean;
|
|
55
|
-
additionalParams?: {
|
|
56
|
-
[key: string]: any;
|
|
57
|
-
};
|
|
58
|
-
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { MatDialog } from '@angular/material/dialog';
|
|
2
|
-
import { AppraisalChatRequest } from './appraisal-assistant/appraisal-assistant.interface';
|
|
3
2
|
import { AppMenu, Company, HeaderConfig, SessionOutInfo } from './common-header.interface';
|
|
4
3
|
import * as i0 from "@angular/core";
|
|
5
4
|
export declare class CommonHeaderService {
|
|
@@ -13,9 +12,6 @@ export declare class CommonHeaderService {
|
|
|
13
12
|
activeMenuList$: import("rxjs").Observable<AppMenu[] | null>;
|
|
14
13
|
private companyListSubject;
|
|
15
14
|
companyList$: import("rxjs").Observable<Company[] | null>;
|
|
16
|
-
private utilityContentDrawerSub;
|
|
17
|
-
utilityContentToggle$: import("rxjs").Observable<void>;
|
|
18
|
-
toggleUtilityContentDrawer(): void;
|
|
19
15
|
constructor(config: HeaderConfig);
|
|
20
16
|
setMenuState(data: AppMenu[]): void;
|
|
21
17
|
setCompanyList(data: Company[]): void;
|
|
@@ -34,9 +30,6 @@ export declare class CommonHeaderService {
|
|
|
34
30
|
getCompanyList(): import("rxjs").Observable<{}>;
|
|
35
31
|
getMenuList(): import("rxjs").Observable<{}>;
|
|
36
32
|
updateLastAccessedApplication(reqBody: any): import("rxjs").Observable<any>;
|
|
37
|
-
objectToQueryParams(obj: Record<string, any>): string;
|
|
38
|
-
getCookie(name: string): string | null;
|
|
39
|
-
getQueryResponse(request?: AppraisalChatRequest): import("rxjs").Observable<any>;
|
|
40
33
|
static ɵfac: i0.ɵɵFactoryDeclaration<CommonHeaderService, never>;
|
|
41
34
|
static ɵprov: i0.ɵɵInjectableDeclaration<CommonHeaderService>;
|
|
42
35
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { EventEmitter,
|
|
1
|
+
import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
|
|
2
2
|
import { FormControl } from '@angular/forms';
|
|
3
|
-
import {
|
|
3
|
+
import { MatSidenav } from '@angular/material/sidenav';
|
|
4
4
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
5
5
|
import { Router } from '@angular/router';
|
|
6
|
-
import { AppMenu, Company
|
|
6
|
+
import { AppMenu, Company } from '../common-header.interface';
|
|
7
7
|
import { CommonHeaderService } from '../common-header.service';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
|
-
export declare class HeaderComponent implements OnInit,
|
|
9
|
+
export declare class HeaderComponent implements OnInit, OnDestroy {
|
|
10
10
|
companyProfile: any;
|
|
11
11
|
portalUrl: string;
|
|
12
12
|
userAuthData: any;
|
|
@@ -33,6 +33,7 @@ export declare class HeaderComponent implements OnInit, OnChanges, OnDestroy {
|
|
|
33
33
|
_headerSer: CommonHeaderService;
|
|
34
34
|
_domSanitizer: DomSanitizer;
|
|
35
35
|
private inactivityTimeout;
|
|
36
|
+
private logoutCheckInterval;
|
|
36
37
|
INACTIVITY_LIMIT: number;
|
|
37
38
|
logoutEvent: EventEmitter<void>;
|
|
38
39
|
companyControl: FormControl<any>;
|
|
@@ -44,22 +45,24 @@ export declare class HeaderComponent implements OnInit, OnChanges, OnDestroy {
|
|
|
44
45
|
value: AppMenu[];
|
|
45
46
|
}[];
|
|
46
47
|
activeCompany: Company | undefined;
|
|
47
|
-
utilitySpace: MatDrawer;
|
|
48
|
-
config: UtilityConfig[];
|
|
49
|
-
defaultApps: UtilityConfig[];
|
|
50
|
-
selected?: UtilityConfig;
|
|
51
|
-
componentToLoad: Type<any> | null;
|
|
52
|
-
dynamicInjector: Injector;
|
|
53
|
-
private injector;
|
|
54
|
-
openItem(item: UtilityConfig): Promise<void>;
|
|
55
48
|
constructor();
|
|
56
|
-
ngOnChanges(changes: SimpleChanges): Promise<void>;
|
|
57
49
|
ngOnInit(): Promise<void>;
|
|
58
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Helper to get the root domain (e.g. .mycom.ai) to share cookies across subdomains/ports.
|
|
52
|
+
* If on localhost or an IP, it falls back to the hostname.
|
|
53
|
+
*/
|
|
54
|
+
private getRootDomain;
|
|
55
|
+
private setCookie;
|
|
56
|
+
private getCookie;
|
|
57
|
+
resetTimer(isUserActivity?: boolean): void;
|
|
58
|
+
/**
|
|
59
|
+
* Helper to identify the session expiry in in-active tabs.
|
|
60
|
+
*/
|
|
61
|
+
private startLogoutCheck;
|
|
62
|
+
private handleLogout;
|
|
59
63
|
selectCurrentCompany(): void;
|
|
60
64
|
patchCurrentCompanyInfo(): void;
|
|
61
65
|
sideMenuToggle(): void;
|
|
62
|
-
closeUtilitySpace(): void;
|
|
63
66
|
private groupByAppType;
|
|
64
67
|
menuSelection(menu: AppMenu): void;
|
|
65
68
|
getCompanyList(): void;
|
|
@@ -70,5 +73,5 @@ export declare class HeaderComponent implements OnInit, OnChanges, OnDestroy {
|
|
|
70
73
|
switchCompany(info: any): void;
|
|
71
74
|
ngOnDestroy(): void;
|
|
72
75
|
static ɵfac: i0.ɵɵFactoryDeclaration<HeaderComponent, never>;
|
|
73
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<HeaderComponent, "lib-header", never, { "INACTIVITY_LIMIT": "INACTIVITY_LIMIT";
|
|
76
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HeaderComponent, "lib-header", never, { "INACTIVITY_LIMIT": "INACTIVITY_LIMIT"; }, { "logoutEvent": "logoutEvent"; }, never, ["*"], false, never>;
|
|
74
77
|
}
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
export * from './lib/base-controller.abstract';
|
|
2
1
|
export * from './lib/common-header.interface';
|
|
3
2
|
export * from './lib/common-header.module';
|
|
4
3
|
export * from './lib/common-header.service';
|
|
5
4
|
export * from './lib/header/header.component';
|
|
6
|
-
export * from './lib/utility-widget-config.token';
|
|
7
5
|
export * from './lib/utils/app.constants';
|
|
8
6
|
export * from './lib/utils/apps.enum';
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, inject, ViewChild, ViewChildren } from '@angular/core';
|
|
3
|
-
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
6
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
-
import { MatInputModule } from '@angular/material/input';
|
|
8
|
-
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
9
|
-
import { MatSidenavModule } from '@angular/material/sidenav';
|
|
10
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
11
|
-
import { WithClosable } from '../closable.mixin';
|
|
12
|
-
import { CommonHeaderService } from '../common-header.service';
|
|
13
|
-
import { ChatTimePipe } from '../utils/chat-time.pipe';
|
|
14
|
-
import { TextToHtmlPipe } from "../utils/text-to-html.pipe";
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/material/icon";
|
|
17
|
-
import * as i2 from "@angular/material/button";
|
|
18
|
-
import * as i3 from "@angular/forms";
|
|
19
|
-
import * as i4 from "@angular/common";
|
|
20
|
-
import * as i5 from "@angular/material/progress-spinner";
|
|
21
|
-
import * as i6 from "@angular/material/tooltip";
|
|
22
|
-
class EmptyBase {
|
|
23
|
-
}
|
|
24
|
-
export class AppraisalAssistantChatWidgetComponent extends WithClosable(class {
|
|
25
|
-
}) {
|
|
26
|
-
constructor() {
|
|
27
|
-
super(...arguments);
|
|
28
|
-
this.isOpen = false;
|
|
29
|
-
this.message = '';
|
|
30
|
-
this.messages = [];
|
|
31
|
-
this.isLoading = false;
|
|
32
|
-
this.conversationId = '';
|
|
33
|
-
this.msgControl = new FormControl('');
|
|
34
|
-
this._chatSer = inject(CommonHeaderService);
|
|
35
|
-
this.shouldScroll = false;
|
|
36
|
-
this.welcomeMessage = '';
|
|
37
|
-
}
|
|
38
|
-
ngOnInit() {
|
|
39
|
-
if ((this.messages.length === 0)) {
|
|
40
|
-
this.sendMessage();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
ngAfterViewChecked() {
|
|
44
|
-
if (this.shouldScroll) {
|
|
45
|
-
setTimeout(() => {
|
|
46
|
-
this.scrollToLastMessage();
|
|
47
|
-
this.shouldScroll = false;
|
|
48
|
-
}, 100);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
toggleChat() {
|
|
52
|
-
this.close();
|
|
53
|
-
// this.isOpen = !this.isOpen;
|
|
54
|
-
// if (this.isOpen && (this.messages.length === 0)) {
|
|
55
|
-
// this.sendMessage();
|
|
56
|
-
// }
|
|
57
|
-
}
|
|
58
|
-
sendMessage() {
|
|
59
|
-
this.isLoading = true;
|
|
60
|
-
this.msgControl.disable();
|
|
61
|
-
let req = {
|
|
62
|
-
query: this.msgControl.value?.trim() ? this.msgControl.value.trim() : null,
|
|
63
|
-
};
|
|
64
|
-
if (this.msgControl.value?.trim()?.length > 0) {
|
|
65
|
-
this.messages.push({ response: this.msgControl.value?.trim(), isUser: true, timeStamp: new Date() });
|
|
66
|
-
}
|
|
67
|
-
this.shouldScroll = true;
|
|
68
|
-
if (this.conversationId)
|
|
69
|
-
req.conversationId = this.conversationId;
|
|
70
|
-
this.msgControl.setValue('');
|
|
71
|
-
this._chatSer.getQueryResponse(req)
|
|
72
|
-
.subscribe({
|
|
73
|
-
next: ((res) => {
|
|
74
|
-
if (res) {
|
|
75
|
-
if (res.message) {
|
|
76
|
-
this.messages.push({ response: res.message, timeStamp: new Date() });
|
|
77
|
-
this.welcomeMessage = res.message;
|
|
78
|
-
}
|
|
79
|
-
else if (res.result?.httpCode == 200) {
|
|
80
|
-
if (res.result.data.response) {
|
|
81
|
-
this.conversationId = res.result.data.conversationId;
|
|
82
|
-
res.result.data.timeStamp = new Date();
|
|
83
|
-
this.messages.push(res.result.data);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
else if (res.result?.httpCode == 204) {
|
|
87
|
-
this.messages.push({ response: res.result.message, timeStamp: new Date() });
|
|
88
|
-
}
|
|
89
|
-
this.shouldScroll = true;
|
|
90
|
-
}
|
|
91
|
-
this.isLoading = false;
|
|
92
|
-
this.msgControl.enable();
|
|
93
|
-
this.focusInput();
|
|
94
|
-
}),
|
|
95
|
-
error: ((err) => {
|
|
96
|
-
this.isLoading = false;
|
|
97
|
-
this.msgControl.enable();
|
|
98
|
-
this.focusInput();
|
|
99
|
-
})
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
// scrollToLastMessage() {
|
|
103
|
-
// const container = this.chatContainer?.nativeElement;
|
|
104
|
-
// if (container && container.scrollHeight > container.clientHeight) {
|
|
105
|
-
// container.scrollTop = container.scrollHeight;
|
|
106
|
-
// }
|
|
107
|
-
// }
|
|
108
|
-
scrollToLastMessage() {
|
|
109
|
-
const container = this.chatContainer?.nativeElement;
|
|
110
|
-
if (container && this.lastMessageRefs && this.lastMessageRefs.length > 0) {
|
|
111
|
-
const lastMsg = this.lastMessageRefs.last.nativeElement;
|
|
112
|
-
const lastMsgRect = lastMsg.getBoundingClientRect();
|
|
113
|
-
const containerRect = container.getBoundingClientRect();
|
|
114
|
-
// If last message is below the visible area of the container
|
|
115
|
-
if (lastMsgRect.bottom > containerRect.bottom) {
|
|
116
|
-
const scrollOffset = lastMsg.offsetTop - container.offsetTop;
|
|
117
|
-
container.scrollTop = scrollOffset;
|
|
118
|
-
}
|
|
119
|
-
// If last message is above the visible area of the container
|
|
120
|
-
else if (lastMsgRect.top < containerRect.top) {
|
|
121
|
-
const scrollOffset = lastMsg.offsetTop - container.offsetTop;
|
|
122
|
-
container.scrollTop = scrollOffset;
|
|
123
|
-
}
|
|
124
|
-
// Else, it's already visible; do nothing
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
handleKeyDown(event) {
|
|
128
|
-
if (event.key === 'Enter' && !event.shiftKey) {
|
|
129
|
-
event.preventDefault();
|
|
130
|
-
if (this.msgControl.value?.trim()?.length > 0) {
|
|
131
|
-
this.sendMessage();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
// Shift+Enter will be allowed by default
|
|
135
|
-
}
|
|
136
|
-
focusInput() {
|
|
137
|
-
if (this.msgInputRef) {
|
|
138
|
-
this.msgInputRef.nativeElement.focus();
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
resetChat() {
|
|
142
|
-
let message = [{ response: this.welcomeMessage, timeStamp: new Date() }];
|
|
143
|
-
this.messages = message;
|
|
144
|
-
this.conversationId = '';
|
|
145
|
-
this.msgControl.setValue('');
|
|
146
|
-
this.shouldScroll = false;
|
|
147
|
-
if (this.msgInputRef) {
|
|
148
|
-
this.msgInputRef.nativeElement.focus();
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
AppraisalAssistantChatWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppraisalAssistantChatWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
153
|
-
AppraisalAssistantChatWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AppraisalAssistantChatWidgetComponent, isStandalone: true, selector: "appraisal-assistant-agent", viewQueries: [{ propertyName: "chatContainer", first: true, predicate: ["chatContainer"], descendants: true }, { propertyName: "msgInputRef", first: true, predicate: ["msgInput"], descendants: true }, { propertyName: "lastMessageRefs", predicate: ["lastMessageRef"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div [class]=\"isOpen?'chat-container-wrap':''\">\n <div class=\"chatbot-container\">\n <div class=\"chatbot-sidenav\">\n <div class=\"chat-header\"><span>Appraisal Assistant (Beta)</span>\n <div class=\"chat-header-actions\">\n <button tabindex=\"-1\" mat-button class=\"reset-button small_btn\" [disabled]=\"isLoading\"\n (click)=\"resetChat()\">Reset\n </button>\n <!-- <span>Reset</span> -->\n <!-- <button mat-icon-button matTooltip=\"Collapse\" class=\"d-flex align-item-center\" (click)=\"toggleChat()\">\n <mat-icon>chevron_right</mat-icon>\n </button> -->\n <button matTooltip=\"Collapse\" class=\"d-flex align-item-center collapse_btn\" (click)=\"toggleChat()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"chat-messages\" #chatContainer>\n <div *ngFor=\"let message of messages; let isLast = last\" class=\"message-container\"\n [ngClass]=\"{'user-message': message.isUser, 'bot-message': !message.isUser}\"\n style=\"margin-bottom: 15px;\" #lastMessageRef>\n <div class=\"message-content\">\n <span [innerHTML]=\"message.response | textToHtml\"></span>\n <span class=\"message-time\">{{ message.timeStamp | chatTime }} </span>\n </div>\n </div>\n </div>\n <form class=\"chat-input-container\" (submit)=\"sendMessage()\">\n <textarea class=\"chat-textarea\" [formControl]=\"msgControl\" placeholder=\"Start typing here...\" rows=\"1\"\n (keydown)=\"handleKeyDown($event)\" #msgInput></textarea>\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"24\" strokeWidth=\"3\" color=\"primary\" class=\"position-absolute\"\n style=\"right:22px\"></mat-spinner>\n <button color=\"primary\" [disabled]=\"isLoading || (msgControl.value?.trim()?.length <= 0)\"\n mat-icon-button class=\"d-flex align-items-center\" (click)=\"sendMessage()\">\n <mat-icon *ngIf=\"!isLoading\">send</mat-icon>\n <!-- <mat-spinner *ngIf=\"isLoading\" [diameter]=\"24\" strokeWidth=\"3\"></mat-spinner> -->\n </button>\n </form>\n </div>\n </div>\n <!-- <mat-sidenav-container [hasBackdrop]=\"true\" class=\"chatbot-container\"><mat-sidenav #sidenav position=\"end\"\n mode=\"over\" [(opened)]=\"isOpen\" [disableClose]=\"true\" class=\"chatbot-sidenav\">\n </mat-sidenav></mat-sidenav-container> -->\n</div>\n<!-- <div *ngIf=\"!isOpen\" class=\"chat-launcher\" (click)=\"toggleChat()\">\n <div>\n <div class=\"list-icons-cell\">\n <mat-icon class=\"list-icons\">3p</mat-icon>\n </div>\n </div>\n</div> -->", styles: [":host .chatbot-container{top:0;right:0;height:100vh;background:transparent}:host .chatbot-container .mat-sidenav{z-index:5;pointer-events:auto;width:650px;display:flex;flex-direction:column}:host .chatbot-container .chat-header{display:flex;justify-content:space-between;align-items:center;padding:5px 16px;background:linear-gradient(to right,#3966b6,var(--themelightblue));color:#fff;position:sticky;top:0;z-index:100;box-shadow:0 2px 5px #0000004d;line-height:20px;letter-spacing:normal}:host .chatbot-container .chat-header span{font-size:13.12px;font-weight:550!important;line-height:20px;letter-spacing:normal}:host .chatbot-container .chat-header button:first-child{background-color:#4076d5!important}:host .chatbot-container .chat-messages{flex:1;padding:60px 16px 16px;background-color:#fff;overflow-y:auto;overscroll-behavior:contain;position:relative}:host .chatbot-container .message-container{display:flex;margin-bottom:12px;align-items:flex-start}:host .chat-launcher{background-color:#fff!important;border-radius:3px}:host .chat-launcher span{white-space:nowrap;border-right:1px solid #999999;font-size:13.12px!important;padding-right:5px;color:#fff!important}:host .chat-launcher .list-icons-cell{padding:8px;text-align:center;vertical-align:middle;height:40px;width:40px;cursor:pointer;border-radius:30px;margin-top:10px}:host .chat-launcher .list-icons-cell .list-icons{font-size:25px!important;color:#4b85ea!important}:host .list-icons-cell:hover{background-color:#ccc}:host .chat-header-actions{display:flex;align-items:center;gap:8px}:host .chat-header-actions .reset-button{color:#fff;line-height:20px!important;letter-spacing:.5px!important;font-size:13.12px!important}:host .user-message{justify-content:flex-end}:host .user-message .message-content{background-color:RGB(235,243,255);color:#212121;border:1px solid RGB(220,233,251);padding:10px 14px;border-radius:10px;max-width:70%;margin-left:auto;font-size:13px;line-height:21px!important}:host .user-message .message-time{display:block;font-size:9px;color:#555;margin-top:0;text-align:right}:host .bot-message{justify-content:flex-start}:host .bot-message .message-content{color:#212121;padding:10px 14px;border-radius:10px;width:98%;margin-right:auto;font-size:13px;line-height:21px!important}:host .bot-message .message-time{display:block;font-size:9px;color:#555;margin-top:0;text-align:left}:host .message-content{display:inline-block;word-break:break-word}:host .chat-input-container{display:flex;align-items:center;padding:12px;background-color:#fff;position:sticky;bottom:0;border-top:1px solid #e0e0e0;z-index:10}:host .chat-textarea{flex:1;resize:none;padding:12px 16px;border-radius:20px;font-size:14px;background-color:#f1f1f1;border:none;outline:none;line-height:1.4;max-height:150px;overflow-y:auto}:host .send-button{margin-left:8px;width:40px;height:40px;border-radius:50%;border:none;background-color:#3f51b5;color:#fff;display:flex;align-items:center;justify-content:center}:host .send-button:disabled{background-color:#ccc}:host .chat-container-wrap{position:fixed;inset:0;z-index:99999}:host ::ng-deep .mat-drawer-inner-container{display:flex;flex-direction:column}:host .collapse_btn{width:35px;height:35px;border-radius:50px;display:flex!important;align-items:center;justify-content:center;background-color:transparent!important;border:none}:host .collapse_btn mat-icon{font-size:24px!important;width:24px!important;height:24px!important;color:#fff!important}:host .collapse_btn:hover{background-color:#4076d5!important;transition:all .2s}\n"], dependencies: [{ kind: "ngmodule", type: MatSidenavModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: ChatTimePipe, name: "chatTime" }, { kind: "pipe", type: TextToHtmlPipe, name: "textToHtml" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
154
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppraisalAssistantChatWidgetComponent, decorators: [{
|
|
155
|
-
type: Component,
|
|
156
|
-
args: [{ selector: 'appraisal-assistant-agent', standalone: true, imports: [
|
|
157
|
-
MatSidenavModule,
|
|
158
|
-
MatIconModule,
|
|
159
|
-
MatButtonModule,
|
|
160
|
-
MatFormFieldModule,
|
|
161
|
-
ReactiveFormsModule,
|
|
162
|
-
CommonModule,
|
|
163
|
-
MatInputModule,
|
|
164
|
-
MatProgressSpinnerModule,
|
|
165
|
-
ChatTimePipe,
|
|
166
|
-
TextToHtmlPipe,
|
|
167
|
-
MatTooltipModule
|
|
168
|
-
], template: "<div [class]=\"isOpen?'chat-container-wrap':''\">\n <div class=\"chatbot-container\">\n <div class=\"chatbot-sidenav\">\n <div class=\"chat-header\"><span>Appraisal Assistant (Beta)</span>\n <div class=\"chat-header-actions\">\n <button tabindex=\"-1\" mat-button class=\"reset-button small_btn\" [disabled]=\"isLoading\"\n (click)=\"resetChat()\">Reset\n </button>\n <!-- <span>Reset</span> -->\n <!-- <button mat-icon-button matTooltip=\"Collapse\" class=\"d-flex align-item-center\" (click)=\"toggleChat()\">\n <mat-icon>chevron_right</mat-icon>\n </button> -->\n <button matTooltip=\"Collapse\" class=\"d-flex align-item-center collapse_btn\" (click)=\"toggleChat()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"chat-messages\" #chatContainer>\n <div *ngFor=\"let message of messages; let isLast = last\" class=\"message-container\"\n [ngClass]=\"{'user-message': message.isUser, 'bot-message': !message.isUser}\"\n style=\"margin-bottom: 15px;\" #lastMessageRef>\n <div class=\"message-content\">\n <span [innerHTML]=\"message.response | textToHtml\"></span>\n <span class=\"message-time\">{{ message.timeStamp | chatTime }} </span>\n </div>\n </div>\n </div>\n <form class=\"chat-input-container\" (submit)=\"sendMessage()\">\n <textarea class=\"chat-textarea\" [formControl]=\"msgControl\" placeholder=\"Start typing here...\" rows=\"1\"\n (keydown)=\"handleKeyDown($event)\" #msgInput></textarea>\n <mat-spinner *ngIf=\"isLoading\" [diameter]=\"24\" strokeWidth=\"3\" color=\"primary\" class=\"position-absolute\"\n style=\"right:22px\"></mat-spinner>\n <button color=\"primary\" [disabled]=\"isLoading || (msgControl.value?.trim()?.length <= 0)\"\n mat-icon-button class=\"d-flex align-items-center\" (click)=\"sendMessage()\">\n <mat-icon *ngIf=\"!isLoading\">send</mat-icon>\n <!-- <mat-spinner *ngIf=\"isLoading\" [diameter]=\"24\" strokeWidth=\"3\"></mat-spinner> -->\n </button>\n </form>\n </div>\n </div>\n <!-- <mat-sidenav-container [hasBackdrop]=\"true\" class=\"chatbot-container\"><mat-sidenav #sidenav position=\"end\"\n mode=\"over\" [(opened)]=\"isOpen\" [disableClose]=\"true\" class=\"chatbot-sidenav\">\n </mat-sidenav></mat-sidenav-container> -->\n</div>\n<!-- <div *ngIf=\"!isOpen\" class=\"chat-launcher\" (click)=\"toggleChat()\">\n <div>\n <div class=\"list-icons-cell\">\n <mat-icon class=\"list-icons\">3p</mat-icon>\n </div>\n </div>\n</div> -->", styles: [":host .chatbot-container{top:0;right:0;height:100vh;background:transparent}:host .chatbot-container .mat-sidenav{z-index:5;pointer-events:auto;width:650px;display:flex;flex-direction:column}:host .chatbot-container .chat-header{display:flex;justify-content:space-between;align-items:center;padding:5px 16px;background:linear-gradient(to right,#3966b6,var(--themelightblue));color:#fff;position:sticky;top:0;z-index:100;box-shadow:0 2px 5px #0000004d;line-height:20px;letter-spacing:normal}:host .chatbot-container .chat-header span{font-size:13.12px;font-weight:550!important;line-height:20px;letter-spacing:normal}:host .chatbot-container .chat-header button:first-child{background-color:#4076d5!important}:host .chatbot-container .chat-messages{flex:1;padding:60px 16px 16px;background-color:#fff;overflow-y:auto;overscroll-behavior:contain;position:relative}:host .chatbot-container .message-container{display:flex;margin-bottom:12px;align-items:flex-start}:host .chat-launcher{background-color:#fff!important;border-radius:3px}:host .chat-launcher span{white-space:nowrap;border-right:1px solid #999999;font-size:13.12px!important;padding-right:5px;color:#fff!important}:host .chat-launcher .list-icons-cell{padding:8px;text-align:center;vertical-align:middle;height:40px;width:40px;cursor:pointer;border-radius:30px;margin-top:10px}:host .chat-launcher .list-icons-cell .list-icons{font-size:25px!important;color:#4b85ea!important}:host .list-icons-cell:hover{background-color:#ccc}:host .chat-header-actions{display:flex;align-items:center;gap:8px}:host .chat-header-actions .reset-button{color:#fff;line-height:20px!important;letter-spacing:.5px!important;font-size:13.12px!important}:host .user-message{justify-content:flex-end}:host .user-message .message-content{background-color:RGB(235,243,255);color:#212121;border:1px solid RGB(220,233,251);padding:10px 14px;border-radius:10px;max-width:70%;margin-left:auto;font-size:13px;line-height:21px!important}:host .user-message .message-time{display:block;font-size:9px;color:#555;margin-top:0;text-align:right}:host .bot-message{justify-content:flex-start}:host .bot-message .message-content{color:#212121;padding:10px 14px;border-radius:10px;width:98%;margin-right:auto;font-size:13px;line-height:21px!important}:host .bot-message .message-time{display:block;font-size:9px;color:#555;margin-top:0;text-align:left}:host .message-content{display:inline-block;word-break:break-word}:host .chat-input-container{display:flex;align-items:center;padding:12px;background-color:#fff;position:sticky;bottom:0;border-top:1px solid #e0e0e0;z-index:10}:host .chat-textarea{flex:1;resize:none;padding:12px 16px;border-radius:20px;font-size:14px;background-color:#f1f1f1;border:none;outline:none;line-height:1.4;max-height:150px;overflow-y:auto}:host .send-button{margin-left:8px;width:40px;height:40px;border-radius:50%;border:none;background-color:#3f51b5;color:#fff;display:flex;align-items:center;justify-content:center}:host .send-button:disabled{background-color:#ccc}:host .chat-container-wrap{position:fixed;inset:0;z-index:99999}:host ::ng-deep .mat-drawer-inner-container{display:flex;flex-direction:column}:host .collapse_btn{width:35px;height:35px;border-radius:50px;display:flex!important;align-items:center;justify-content:center;background-color:transparent!important;border:none}:host .collapse_btn mat-icon{font-size:24px!important;width:24px!important;height:24px!important;color:#fff!important}:host .collapse_btn:hover{background-color:#4076d5!important;transition:all .2s}\n"] }]
|
|
169
|
-
}], propDecorators: { chatContainer: [{
|
|
170
|
-
type: ViewChild,
|
|
171
|
-
args: ['chatContainer']
|
|
172
|
-
}], lastMessageRefs: [{
|
|
173
|
-
type: ViewChildren,
|
|
174
|
-
args: ['lastMessageRef']
|
|
175
|
-
}], msgInputRef: [{
|
|
176
|
-
type: ViewChild,
|
|
177
|
-
args: ['msgInput']
|
|
178
|
-
}] } });
|
|
179
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcmFpc2FsLWFzc2lzdGFudC1jaGF0LXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24taGVhZGVyL3NyYy9saWIvYXBwcmFpc2FsLWFzc2lzdGFudC9hcHByYWlzYWwtYXNzaXN0YW50LWNoYXQtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbW1vbi1oZWFkZXIvc3JjL2xpYi9hcHByYWlzYWwtYXNzaXN0YW50L2FwcHJhaXNhbC1hc3Npc3RhbnQtY2hhdC13aWRnZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBb0IsU0FBUyxFQUFjLE1BQU0sRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFN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QkFBd0I7d0JBQ3hCLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCOzhCQVVtQyxhQUFhO3NCQUFoRCxTQUFTO3VCQUFDLGVBQWU7Z0JBQ00sZUFBZTtzQkFBOUMsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBQ1AsV0FBVztzQkFBakMsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5qZWN0LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IE1hdFNpZGVuYXZNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IFdpdGhDbG9zYWJsZSB9IGZyb20gJy4uL2Nsb3NhYmxlLm1peGluJztcbmltcG9ydCB7IENvbW1vbkhlYWRlclNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24taGVhZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhdFRpbWVQaXBlIH0gZnJvbSAnLi4vdXRpbHMvY2hhdC10aW1lLnBpcGUnO1xuaW1wb3J0IHsgVGV4dFRvSHRtbFBpcGUgfSBmcm9tIFwiLi4vdXRpbHMvdGV4dC10by1odG1sLnBpcGVcIjtcbmltcG9ydCB7IEFwcHJhaXNhbENoYXRSZXF1ZXN0IH0gZnJvbSAnLi9hcHByYWlzYWwtYXNzaXN0YW50LmludGVyZmFjZSc7XG5cbmNsYXNzIEVtcHR5QmFzZSB7IH1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwcmFpc2FsLWFzc2lzdGFudC1hZ2VudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHByYWlzYWwtYXNzaXN0YW50LWNoYXQtd2lkZ2V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwcmFpc2FsLWFzc2lzdGFudC1jaGF0LXdpZGdldC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0U2lkZW5hdk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgIENoYXRUaW1lUGlwZSxcbiAgICBUZXh0VG9IdG1sUGlwZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQXBwcmFpc2FsQXNzaXN0YW50Q2hhdFdpZGdldENvbXBvbmVudCBleHRlbmRzIFdpdGhDbG9zYWJsZShjbGFzcyB7fSkgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuICBpc09wZW4gPSBmYWxzZTtcbiAgbWVzc2FnZSA9ICcnO1xuICBtZXNzYWdlczogYW55W10gPSBbXTtcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcgPSAnJztcbiAgbXNnQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICBwdWJsaWMgX2NoYXRTZXIgPSBpbmplY3QoQ29tbW9uSGVhZGVyU2VydmljZSk7XG4gIEBWaWV3Q2hpbGQoJ2NoYXRDb250YWluZXInKSBwcml2YXRlIGNoYXRDb250YWluZXIhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkcmVuKCdsYXN0TWVzc2FnZVJlZicpIGxhc3RNZXNzYWdlUmVmcyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgnbXNnSW5wdXQnKSBtc2dJbnB1dFJlZiE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBzaG91bGRTY3JvbGwgPSBmYWxzZTtcbiAgd2VsY29tZU1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UoKTtcbiAgICB9XG4gIH1cblxuXG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3VsZFNjcm9sbCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9MYXN0TWVzc2FnZSgpO1xuICAgICAgICB0aGlzLnNob3VsZFNjcm9sbCA9IGZhbHNlO1xuICAgICAgfSwgMTAwKTtcblxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUNoYXQoKSB7XG4gICAgdGhpcy5jbG9zZSgpO1xuICAgIC8vIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuICAgIC8vIGlmICh0aGlzLmlzT3BlbiAmJiAodGhpcy5tZXNzYWdlcy5sZW5ndGggPT09IDApKSB7XG4gICAgLy8gICB0aGlzLnNlbmRNZXNzYWdlKCk7XG4gICAgLy8gfVxuICB9XG5cbiAgc2VuZE1lc3NhZ2UoKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMubXNnQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgbGV0IHJlcTogQXBwcmFpc2FsQ2hhdFJlcXVlc3QgPSB7XG4gICAgICBxdWVyeTogdGhpcy5tc2dDb250cm9sLnZhbHVlPy50cmltKCkgPyB0aGlzLm1zZ0NvbnRyb2wudmFsdWUudHJpbSgpIDogbnVsbCxcbiAgICB9XG4gICAgaWYgKHRoaXMubXNnQ29udHJvbC52YWx1ZT8udHJpbSgpPy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goeyByZXNwb25zZTogdGhpcy5tc2dDb250cm9sLnZhbHVlPy50cmltKCksIGlzVXNlcjogdHJ1ZSwgdGltZVN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIH1cbiAgICB0aGlzLnNob3VsZFNjcm9sbCA9IHRydWU7XG4gICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSWQpIHJlcS5jb252ZXJzYXRpb25JZCA9IHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gICAgdGhpcy5tc2dDb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICB0aGlzLl9jaGF0U2VyLmdldFF1ZXJ5UmVzcG9uc2UocmVxKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBpZiAocmVzLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKHsgcmVzcG9uc2U6IHJlcy5tZXNzYWdlLCB0aW1lU3RhbXA6IG5ldyBEYXRlKCkgfSk7XG4gICAgICAgICAgICAgIHRoaXMud2VsY29tZU1lc3NhZ2UgPSByZXMubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlcy5yZXN1bHQ/Lmh0dHBDb2RlID09IDIwMCkge1xuICAgICAgICAgICAgICBpZiAocmVzLnJlc3VsdC5kYXRhLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IHJlcy5yZXN1bHQuZGF0YS5jb252ZXJzYXRpb25JZDtcbiAgICAgICAgICAgICAgICByZXMucmVzdWx0LmRhdGEudGltZVN0YW1wID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2gocmVzLnJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzLnJlc3VsdD8uaHR0cENvZGUgPT0gMjA0KSB7XG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7IHJlc3BvbnNlOiByZXMucmVzdWx0Lm1lc3NhZ2UsIHRpbWVTdGFtcDogbmV3IERhdGUoKSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2hvdWxkU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm1zZ0NvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5tc2dDb250cm9sLmVuYWJsZSgpO1xuICAgICAgICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBzY3JvbGxUb0xhc3RNZXNzYWdlKCkge1xuICAvLyAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY2hhdENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcbiAgLy8gICBpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgPiBjb250YWluZXIuY2xpZW50SGVpZ2h0KSB7XG4gIC8vICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbEhlaWdodDtcbiAgLy8gICB9XG4gIC8vIH1cbiAgc2Nyb2xsVG9MYXN0TWVzc2FnZSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNoYXRDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lciAmJiB0aGlzLmxhc3RNZXNzYWdlUmVmcyAmJiB0aGlzLmxhc3RNZXNzYWdlUmVmcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0TXNnOiBIVE1MRWxlbWVudCA9IHRoaXMubGFzdE1lc3NhZ2VSZWZzLmxhc3QubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGxhc3RNc2dSZWN0ID0gbGFzdE1zZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vIElmIGxhc3QgbWVzc2FnZSBpcyBiZWxvdyB0aGUgdmlzaWJsZSBhcmVhIG9mIHRoZSBjb250YWluZXJcbiAgICAgIGlmIChsYXN0TXNnUmVjdC5ib3R0b20gPiBjb250YWluZXJSZWN0LmJvdHRvbSkge1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXQgPSBsYXN0TXNnLm9mZnNldFRvcCAtIGNvbnRhaW5lci5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBzY3JvbGxPZmZzZXQ7XG4gICAgICB9XG4gICAgICAvLyBJZiBsYXN0IG1lc3NhZ2UgaXMgYWJvdmUgdGhlIHZpc2libGUgYXJlYSBvZiB0aGUgY29udGFpbmVyXG4gICAgICBlbHNlIGlmIChsYXN0TXNnUmVjdC50b3AgPCBjb250YWluZXJSZWN0LnRvcCkge1xuICAgICAgICBjb25zdCBzY3JvbGxPZmZzZXQgPSBsYXN0TXNnLm9mZnNldFRvcCAtIGNvbnRhaW5lci5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBzY3JvbGxPZmZzZXQ7XG4gICAgICB9XG4gICAgICAvLyBFbHNlLCBpdCdzIGFscmVhZHkgdmlzaWJsZTsgZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG5cbiAgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMubXNnQ29udHJvbC52YWx1ZT8udHJpbSgpPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU2hpZnQrRW50ZXIgd2lsbCBiZSBhbGxvd2VkIGJ5IGRlZmF1bHRcbiAgfVxuXG4gIGZvY3VzSW5wdXQoKSB7XG4gICAgaWYgKHRoaXMubXNnSW5wdXRSZWYpIHtcbiAgICAgIHRoaXMubXNnSW5wdXRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0Q2hhdCgpIHtcbiAgICBsZXQgbWVzc2FnZSA9IFt7IHJlc3BvbnNlOiB0aGlzLndlbGNvbWVNZXNzYWdlLCB0aW1lU3RhbXA6IG5ldyBEYXRlKCkgfV1cbiAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZTtcbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gJyc7XG4gICAgdGhpcy5tc2dDb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICB0aGlzLnNob3VsZFNjcm9sbCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLm1zZ0lucHV0UmVmKSB7XG4gICAgICB0aGlzLm1zZ0lucHV0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cImlzT3Blbj8nY2hhdC1jb250YWluZXItd3JhcCc6JydcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2hhdGJvdC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXRib3Qtc2lkZW5hdlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtaGVhZGVyXCI+PHNwYW4+QXBwcmFpc2FsIEFzc2lzdGFudCAoQmV0YSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtaGVhZGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgbWF0LWJ1dHRvbiBjbGFzcz1cInJlc2V0LWJ1dHRvbiBzbWFsbF9idG5cIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldENoYXQoKVwiPlJlc2V0XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuPlJlc2V0PC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQ29sbGFwc2VcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtLWNlbnRlclwiIChjbGljayk9XCJ0b2dnbGVDaGF0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0VG9vbHRpcD1cIkNvbGxhcHNlXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbS1jZW50ZXIgY29sbGFwc2VfYnRuXCIgKGNsaWNrKT1cInRvZ2dsZUNoYXQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtbWVzc2FnZXNcIiAjY2hhdENvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIG1lc3NhZ2VzOyBsZXQgaXNMYXN0ID0gbGFzdFwiIGNsYXNzPVwibWVzc2FnZS1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3VzZXItbWVzc2FnZSc6IG1lc3NhZ2UuaXNVc2VyLCAnYm90LW1lc3NhZ2UnOiAhbWVzc2FnZS5pc1VzZXJ9XCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNXB4O1wiICNsYXN0TWVzc2FnZVJlZj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJtZXNzYWdlLnJlc3BvbnNlIHwgdGV4dFRvSHRtbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVzc2FnZS10aW1lXCI+e3sgbWVzc2FnZS50aW1lU3RhbXAgfCBjaGF0VGltZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImNoYXQtaW5wdXQtY29udGFpbmVyXCIgKHN1Ym1pdCk9XCJzZW5kTWVzc2FnZSgpXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiY2hhdC10ZXh0YXJlYVwiIFtmb3JtQ29udHJvbF09XCJtc2dDb250cm9sXCIgcGxhY2Vob2xkZXI9XCJTdGFydCB0eXBpbmcgaGVyZS4uLlwiIHJvd3M9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQpXCIgI21zZ0lucHV0PjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nXCIgW2RpYW1ldGVyXT1cIjI0XCIgc3Ryb2tlV2lkdGg9XCIzXCIgY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicmlnaHQ6MjJweFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8IChtc2dDb250cm9sLnZhbHVlPy50cmltKCk/Lmxlbmd0aCA8PSAwKVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwic2VuZE1lc3NhZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhaXNMb2FkaW5nXCI+c2VuZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nXCIgW2RpYW1ldGVyXT1cIjI0XCIgc3Ryb2tlV2lkdGg9XCIzXCI+PC9tYXQtc3Bpbm5lcj4gLS0+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gPG1hdC1zaWRlbmF2LWNvbnRhaW5lciBbaGFzQmFja2Ryb3BdPVwidHJ1ZVwiIGNsYXNzPVwiY2hhdGJvdC1jb250YWluZXJcIj48bWF0LXNpZGVuYXYgI3NpZGVuYXYgcG9zaXRpb249XCJlbmRcIlxuICAgICAgICAgICAgbW9kZT1cIm92ZXJcIiBbKG9wZW5lZCldPVwiaXNPcGVuXCIgW2Rpc2FibGVDbG9zZV09XCJ0cnVlXCIgY2xhc3M9XCJjaGF0Ym90LXNpZGVuYXZcIj5cbiAgICAgICAgPC9tYXQtc2lkZW5hdj48L21hdC1zaWRlbmF2LWNvbnRhaW5lcj4gLS0+XG48L2Rpdj5cbjwhLS0gPGRpdiAqbmdJZj1cIiFpc09wZW5cIiBjbGFzcz1cImNoYXQtbGF1bmNoZXJcIiAoY2xpY2spPVwidG9nZ2xlQ2hhdCgpXCI+XG4gICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtaWNvbnMtY2VsbFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibGlzdC1pY29uc1wiPjNwPC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4gLS0+Il19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwcmFpc2FsLWFzc2lzdGFudC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24taGVhZGVyL3NyYy9saWIvYXBwcmFpc2FsLWFzc2lzdGFudC9hcHByYWlzYWwtYXNzaXN0YW50LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBBcHByYWlzYWxDaGF0UmVxdWVzdCB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICBjb252ZXJzYXRpb25JZD86IHN0cmluZztcbn0iXX0=
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { inject } from "@angular/core";
|
|
2
|
-
import { CommonHeaderService } from "./common-header.service";
|
|
3
|
-
export class BaseController {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.commonService = inject(CommonHeaderService);
|
|
6
|
-
}
|
|
7
|
-
close() {
|
|
8
|
-
this.commonService.toggleUtilityContentDrawer();
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb250cm9sbGVyLmFic3RyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uLWhlYWRlci9zcmMvbGliL2Jhc2UtY29udHJvbGxlci5hYnN0cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTlELE1BQU0sT0FBZ0IsY0FBYztJQUVoQztRQURVLGtCQUFhLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVqQixLQUFLO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25IZWFkZXJTZXJ2aWNlIH0gZnJvbSBcIi4vY29tbW9uLWhlYWRlci5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udHJvbGxlciB7XG4gICAgcHJvdGVjdGVkIGNvbW1vblNlcnZpY2UgPSBpbmplY3QoQ29tbW9uSGVhZGVyU2VydmljZSk7XG4gICAgY29uc3RydWN0b3IoKSB7IH1cblxuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1vblNlcnZpY2UudG9nZ2xlVXRpbGl0eUNvbnRlbnREcmF3ZXIoKTtcbiAgICB9XG59Il19
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { inject } from "@angular/core";
|
|
2
|
-
import { CommonHeaderService } from "./common-header.service";
|
|
3
|
-
export function WithClosable(Base) {
|
|
4
|
-
return class extends Base {
|
|
5
|
-
constructor() {
|
|
6
|
-
super(...arguments);
|
|
7
|
-
this._ser = inject(CommonHeaderService);
|
|
8
|
-
}
|
|
9
|
-
close() {
|
|
10
|
-
this._ser.toggleUtilityContentDrawer();
|
|
11
|
-
}
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvc2FibGUubWl4aW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24taGVhZGVyL3NyYy9saWIvY2xvc2FibGUubWl4aW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxNQUFNLFVBQVUsWUFBWSxDQUF1QyxJQUFPO0lBQ3RFLE9BQU8sS0FBTSxTQUFRLElBQUk7UUFBbEI7O1lBQ0gsU0FBSSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBS3ZDLENBQUM7UUFIRyxLQUFLO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQzNDLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb21tb25IZWFkZXJTZXJ2aWNlIH0gZnJvbSBcIi4vY29tbW9uLWhlYWRlci5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBXaXRoQ2xvc2FibGU8VCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IHt9PihCYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgIF9zZXIgPSBpbmplY3QoQ29tbW9uSGVhZGVyU2VydmljZSk7XG5cbiAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXIudG9nZ2xlVXRpbGl0eUNvbnRlbnREcmF3ZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG59Il19
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from "@angular/core";
|
|
2
|
-
export const UTILITY_WIDGET_CONFIG = new InjectionToken('UTILITY_WIDGET_CONFIG');
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0eS13aWRnZXQtY29uZmlnLnRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uLWhlYWRlci9zcmMvbGliL3V0aWxpdHktd2lkZ2V0LWNvbmZpZy50b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFNLHVCQUF1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmV4cG9ydCBjb25zdCBVVElMSVRZX1dJREdFVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48YW55PignVVRJTElUWV9XSURHRVRfQ09ORklHJyk7Il19
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { Pipe } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class ChatTimePipe {
|
|
4
|
-
transform(value) {
|
|
5
|
-
const date = new Date(value);
|
|
6
|
-
const now = new Date();
|
|
7
|
-
const isToday = date.getDate() === now.getDate() &&
|
|
8
|
-
date.getMonth() === now.getMonth() &&
|
|
9
|
-
date.getFullYear() === now.getFullYear();
|
|
10
|
-
const timeString = date.toLocaleTimeString([], {
|
|
11
|
-
hour: '2-digit',
|
|
12
|
-
minute: '2-digit',
|
|
13
|
-
hour12: true,
|
|
14
|
-
});
|
|
15
|
-
if (isToday) {
|
|
16
|
-
return timeString;
|
|
17
|
-
}
|
|
18
|
-
const dateString = date.toLocaleDateString([], {
|
|
19
|
-
year: 'numeric',
|
|
20
|
-
month: 'short',
|
|
21
|
-
day: 'numeric',
|
|
22
|
-
});
|
|
23
|
-
return `${dateString} ${timeString}`;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
ChatTimePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChatTimePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
27
|
-
ChatTimePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: ChatTimePipe, isStandalone: true, name: "chatTime" });
|
|
28
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChatTimePipe, decorators: [{
|
|
29
|
-
type: Pipe,
|
|
30
|
-
args: [{
|
|
31
|
-
name: 'chatTime',
|
|
32
|
-
standalone: true
|
|
33
|
-
}]
|
|
34
|
-
}] });
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC10aW1lLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24taGVhZGVyL3NyYy9saWIvdXRpbHMvY2hhdC10aW1lLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBTXBELE1BQU0sT0FBTyxZQUFZO0lBRXZCLFNBQVMsQ0FBQyxLQUE2QjtRQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXZCLE1BQU0sT0FBTyxHQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFM0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxJQUFJO1NBQ2IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxPQUFPLEVBQUU7WUFDWCxPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxFQUFFLFNBQVM7WUFDZixLQUFLLEVBQUUsT0FBTztZQUNkLEdBQUcsRUFBRSxTQUFTO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUN2QyxDQUFDOzswR0E1QlUsWUFBWTt3R0FBWixZQUFZOzRGQUFaLFlBQVk7a0JBSnhCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQFBpcGUoe1xuICBuYW1lOiAnY2hhdFRpbWUnLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIENoYXRUaW1lUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgY29uc3QgaXNUb2RheSA9XG4gICAgICBkYXRlLmdldERhdGUoKSA9PT0gbm93LmdldERhdGUoKSAmJlxuICAgICAgZGF0ZS5nZXRNb250aCgpID09PSBub3cuZ2V0TW9udGgoKSAmJlxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSBub3cuZ2V0RnVsbFllYXIoKTtcblxuICAgIGNvbnN0IHRpbWVTdHJpbmcgPSBkYXRlLnRvTG9jYWxlVGltZVN0cmluZyhbXSwge1xuICAgICAgaG91cjogJzItZGlnaXQnLFxuICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICBob3VyMTI6IHRydWUsXG4gICAgfSk7XG5cbiAgICBpZiAoaXNUb2RheSkge1xuICAgICAgcmV0dXJuIHRpbWVTdHJpbmc7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZVN0cmluZyA9IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKFtdLCB7XG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICBtb250aDogJ3Nob3J0JywgLy8gbGlrZSBcIk1heVwiXG4gICAgICBkYXk6ICdudW1lcmljJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBgJHtkYXRlU3RyaW5nfSAke3RpbWVTdHJpbmd9YDtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { Pipe } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@angular/platform-browser";
|
|
4
|
-
/**
|
|
5
|
-
* Pipe to convert text with special characters to HTML.
|
|
6
|
-
* It replaces:
|
|
7
|
-
* - \n with <br>
|
|
8
|
-
* - \t with  
|
|
9
|
-
* - \' with '
|
|
10
|
-
* - \" with "
|
|
11
|
-
* - \\ with \
|
|
12
|
-
* - **text** with <strong>text</strong>
|
|
13
|
-
* - _text_ with <em>text</em>
|
|
14
|
-
*/
|
|
15
|
-
export class TextToHtmlPipe {
|
|
16
|
-
constructor(sanitizer) {
|
|
17
|
-
this.sanitizer = sanitizer;
|
|
18
|
-
}
|
|
19
|
-
transform(value) {
|
|
20
|
-
if (!value)
|
|
21
|
-
return '';
|
|
22
|
-
let html = value
|
|
23
|
-
.replace(/\\n|\n/g, '<br>')
|
|
24
|
-
.replace(/\\t|\t/g, ' ');
|
|
25
|
-
// .replace(/\\'/g, `'`)
|
|
26
|
-
// .replace(/\\"/g, '"')
|
|
27
|
-
// .replace(/\\\\/g, `\\`)
|
|
28
|
-
// .replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
|
|
29
|
-
// .replace(/_(.+?)_/g, '<em>$1</em>');
|
|
30
|
-
return this.sanitizer.bypassSecurityTrustHtml(html);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
TextToHtmlPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TextToHtmlPipe, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
34
|
-
TextToHtmlPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: TextToHtmlPipe, isStandalone: true, name: "textToHtml" });
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TextToHtmlPipe, decorators: [{
|
|
36
|
-
type: Pipe,
|
|
37
|
-
args: [{
|
|
38
|
-
name: 'textToHtml',
|
|
39
|
-
standalone: true
|
|
40
|
-
}]
|
|
41
|
-
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } });
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC10by1odG1sLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24taGVhZGVyL3NyYy9saWIvdXRpbHMvdGV4dC10by1odG1sLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7OztBQUdwRDs7Ozs7Ozs7OztHQVVHO0FBTUgsTUFBTSxPQUFPLGNBQWM7SUFFekIsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztJQUFJLENBQUM7SUFFaEQsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUV0QixJQUFJLElBQUksR0FBRyxLQUFLO2FBQ2IsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUM7YUFDMUIsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUMvQix3QkFBd0I7UUFDeEIsd0JBQXdCO1FBQ3hCLDBCQUEwQjtRQUMxQixvREFBb0Q7UUFDcEQsdUNBQXVDO1FBRXZDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDOzs0R0FqQlUsY0FBYzswR0FBZCxjQUFjOzRGQUFkLGNBQWM7a0JBSjFCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuLyoqXG4gKiBQaXBlIHRvIGNvbnZlcnQgdGV4dCB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycyB0byBIVE1MLlxuICogSXQgcmVwbGFjZXM6XG4gKiAtIFxcbiB3aXRoIDxicj5cbiAqIC0gXFx0IHdpdGggJmVtc3A7XG4gKiAtIFxcJyB3aXRoICdcbiAqIC0gXFxcIiB3aXRoIFwiXG4gKiAtIFxcXFwgd2l0aCBcXFxuICogLSAqKnRleHQqKiB3aXRoIDxzdHJvbmc+dGV4dDwvc3Ryb25nPlxuICogLSBfdGV4dF8gd2l0aCA8ZW0+dGV4dDwvZW0+XG4gKi9cblxuQFBpcGUoe1xuICBuYW1lOiAndGV4dFRvSHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgVGV4dFRvSHRtbFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7IH1cblxuICB0cmFuc2Zvcm0odmFsdWU6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG5cbiAgICBsZXQgaHRtbCA9IHZhbHVlXG4gICAgICAucmVwbGFjZSgvXFxcXG58XFxuL2csICc8YnI+JylcbiAgICAgIC5yZXBsYWNlKC9cXFxcdHxcXHQvZywgJyZlbXNwOycpXG4gICAgLy8gLnJlcGxhY2UoL1xcXFwnL2csIGAnYClcbiAgICAvLyAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgLy8gLnJlcGxhY2UoL1xcXFxcXFxcL2csIGBcXFxcYClcbiAgICAvLyAucmVwbGFjZSgvXFwqXFwqKC4rPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC8vIC5yZXBsYWNlKC9fKC4rPylfL2csICc8ZW0+JDE8L2VtPicpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpO1xuICB9XG5cbn1cbiJdfQ==
|