tas-uell-sdk 0.3.0 → 0.3.2
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/components/tas-btn/tas-btn.component.mjs +12 -5
- package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +37 -11
- package/esm2020/lib/tas-uell-sdk.module.mjs +1 -6
- package/esm2020/public-api.mjs +1 -2
- package/fesm2015/tas-uell-sdk.mjs +59 -183
- package/fesm2015/tas-uell-sdk.mjs.map +1 -1
- package/fesm2020/tas-uell-sdk.mjs +58 -181
- package/fesm2020/tas-uell-sdk.mjs.map +1 -1
- package/lib/components/tas-btn/tas-btn.component.d.ts +1 -0
- package/lib/components/tas-videocall/tas-videocall.component.d.ts +9 -1
- package/lib/tas-uell-sdk.module.d.ts +5 -6
- package/package.json +1 -1
- package/public-api.d.ts +0 -1
- package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +0 -160
- package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +0 -53
|
@@ -20,6 +20,7 @@ export declare class TasButtonComponent implements OnInit, OnDestroy {
|
|
|
20
20
|
isStatusError: boolean;
|
|
21
21
|
statusErrorMessage: string;
|
|
22
22
|
isJoinable: boolean;
|
|
23
|
+
isWaitingRoomAvailable: boolean;
|
|
23
24
|
shouldShowButton: boolean;
|
|
24
25
|
private subscriptions;
|
|
25
26
|
private currentModalRef;
|
|
@@ -36,6 +36,7 @@ export declare class TasVideocallComponent implements OnInit, OnDestroy, AfterVi
|
|
|
36
36
|
waitingRoomUsers: WaitingRoomUser[];
|
|
37
37
|
ownerHasJoined: boolean;
|
|
38
38
|
hasVideoStream: boolean;
|
|
39
|
+
hasSubscriberConnected: boolean;
|
|
39
40
|
dismissedUsers: number[];
|
|
40
41
|
showLocationPanel: boolean;
|
|
41
42
|
userHasLocation: boolean;
|
|
@@ -49,6 +50,7 @@ export declare class TasVideocallComponent implements OnInit, OnDestroy, AfterVi
|
|
|
49
50
|
devModeEnabled: boolean;
|
|
50
51
|
private geoPanelDismissed;
|
|
51
52
|
private feedbackShown;
|
|
53
|
+
private previousAllGeoGranted;
|
|
52
54
|
private subscriptions;
|
|
53
55
|
constructor(activeModal: NgbActiveModal, tasService: TasService, geolocationService: GeolocationService, sanitizer: DomSanitizer, modalService: NgbModal);
|
|
54
56
|
ngOnInit(): void;
|
|
@@ -77,7 +79,13 @@ export declare class TasVideocallComponent implements OnInit, OnDestroy, AfterVi
|
|
|
77
79
|
get shouldShowLocationPanel(): boolean;
|
|
78
80
|
/** Check if any user has denied geo */
|
|
79
81
|
get hasAnyDenied(): boolean;
|
|
80
|
-
/** Show user geo panel for owners when
|
|
82
|
+
/** Show user geo panel for owners when:
|
|
83
|
+
* - User can admit (is owner/backoffice)
|
|
84
|
+
* - Panel was not manually dismissed by owner
|
|
85
|
+
* - Panel is not in hidden state
|
|
86
|
+
* - Another user has actually connected their video stream
|
|
87
|
+
* - Not all geo is granted
|
|
88
|
+
*/
|
|
81
89
|
get shouldShowUserGeoPanel(): boolean;
|
|
82
90
|
/** Set user geo view state (for dev controls or close button) */
|
|
83
91
|
setUserGeoViewState(state: UserGeoViewState): void;
|
|
@@ -6,11 +6,10 @@ import * as i2 from "./components/tas-videocall/tas-videocall.component";
|
|
|
6
6
|
import * as i3 from "./components/tas-floating-call/tas-floating-call.component";
|
|
7
7
|
import * as i4 from "./components/tas-waiting-room/tas-waiting-room.component";
|
|
8
8
|
import * as i5 from "./components/tas-avatar/tas-avatar.component";
|
|
9
|
-
import * as i6 from "./components/tas-
|
|
10
|
-
import * as i7 from "
|
|
11
|
-
import * as i8 from "@angular/
|
|
12
|
-
import * as i9 from "@
|
|
13
|
-
import * as i10 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
+
import * as i6 from "./components/tas-feedback-modal/tas-feedback-modal.component";
|
|
10
|
+
import * as i7 from "@angular/common";
|
|
11
|
+
import * as i8 from "@angular/forms";
|
|
12
|
+
import * as i9 from "@ng-bootstrap/ng-bootstrap";
|
|
14
13
|
export declare class TasUellSdkModule {
|
|
15
14
|
/**
|
|
16
15
|
* Use forRoot() to configure the TAS SDK module with required dependencies.
|
|
@@ -46,6 +45,6 @@ export declare class TasUellSdkModule {
|
|
|
46
45
|
httpClient: new (...args: any[]) => TasHttpClient;
|
|
47
46
|
}): ModuleWithProviders<TasUellSdkModule>;
|
|
48
47
|
static ɵfac: i0.ɵɵFactoryDeclaration<TasUellSdkModule, never>;
|
|
49
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<TasUellSdkModule, [typeof i1.TasButtonComponent, typeof i2.TasVideocallComponent, typeof i3.TasFloatingCallComponent, typeof i4.TasWaitingRoomComponent, typeof i5.TasAvatarComponent, typeof i6.
|
|
48
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<TasUellSdkModule, [typeof i1.TasButtonComponent, typeof i2.TasVideocallComponent, typeof i3.TasFloatingCallComponent, typeof i4.TasWaitingRoomComponent, typeof i5.TasAvatarComponent, typeof i6.TasFeedbackModalComponent], [typeof i7.CommonModule, typeof i8.FormsModule, typeof i9.NgbTooltipModule], [typeof i1.TasButtonComponent, typeof i2.TasVideocallComponent, typeof i3.TasFloatingCallComponent, typeof i4.TasWaitingRoomComponent, typeof i5.TasAvatarComponent, typeof i6.TasFeedbackModalComponent]>;
|
|
50
49
|
static ɵinj: i0.ɵɵInjectorDeclaration<TasUellSdkModule>;
|
|
51
50
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tas-uell-sdk",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "TAS (Telemedicine Assistance Service) SDK for Angular applications - Video call functionality using TokBox/Vonage",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0",
|
package/public-api.d.ts
CHANGED
|
@@ -8,6 +8,5 @@ export * from './lib/components/tas-waiting-room/tas-waiting-room.component';
|
|
|
8
8
|
export * from './lib/components/tas-videocall/tas-videocall.component';
|
|
9
9
|
export * from './lib/components/tas-floating-call/tas-floating-call.component';
|
|
10
10
|
export * from './lib/components/tas-avatar/tas-avatar.component';
|
|
11
|
-
export * from './lib/components/tas-incoming-appointment/tas-incoming-appointment.component';
|
|
12
11
|
export * from './lib/components/tas-feedback-modal/tas-feedback-modal.component';
|
|
13
12
|
export * from './lib/tas-uell-sdk.module';
|
package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, } from '@angular/core';
|
|
2
|
-
import { Subscription } from 'rxjs';
|
|
3
|
-
import { AppointmentStatus, TasRoomType, TasBusinessRole, } from '../../interfaces/tas.interfaces';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../../services/tas.service";
|
|
6
|
-
import * as i2 from "../tas-avatar/tas-avatar.component";
|
|
7
|
-
import * as i3 from "../tas-btn/tas-btn.component";
|
|
8
|
-
import * as i4 from "@angular/common";
|
|
9
|
-
export class TasIncomingAppointmentComponent {
|
|
10
|
-
constructor(tasService) {
|
|
11
|
-
this.tasService = tasService;
|
|
12
|
-
// Passthrough inputs for tas-btn
|
|
13
|
-
this.roomType = TasRoomType.TAS;
|
|
14
|
-
this.businessRole = TasBusinessRole.USER;
|
|
15
|
-
this.enterCall = new EventEmitter();
|
|
16
|
-
this.appointments = [];
|
|
17
|
-
this.isLoading = true;
|
|
18
|
-
this.hasError = false;
|
|
19
|
-
// The appointmentId from status API - only this appointment shows tas-btn
|
|
20
|
-
this.activeAppointmentId = null;
|
|
21
|
-
this.subscriptions = new Subscription();
|
|
22
|
-
}
|
|
23
|
-
ngOnInit() {
|
|
24
|
-
this.loadAppointments();
|
|
25
|
-
this.checkStatus();
|
|
26
|
-
}
|
|
27
|
-
ngOnDestroy() {
|
|
28
|
-
this.subscriptions.unsubscribe();
|
|
29
|
-
}
|
|
30
|
-
loadAppointments() {
|
|
31
|
-
this.subscriptions.add(this.tasService
|
|
32
|
-
.getAppointments({
|
|
33
|
-
fromDate: this.fromDate,
|
|
34
|
-
toDate: this.toDate,
|
|
35
|
-
entityId: this.entityId
|
|
36
|
-
})
|
|
37
|
-
.subscribe({
|
|
38
|
-
next: (response) => {
|
|
39
|
-
// Handle both array response and wrapped response (e.g., { content: [...] })
|
|
40
|
-
const appointments = Array.isArray(response)
|
|
41
|
-
? response
|
|
42
|
-
: response?.content || [];
|
|
43
|
-
// Deduplicate by id and sort by date and startTime ascending (earliest first)
|
|
44
|
-
const uniqueAppointments = appointments.filter((appt, index, self) => index === self.findIndex((a) => a.id === appt.id));
|
|
45
|
-
this.appointments = uniqueAppointments.sort((a, b) => {
|
|
46
|
-
const dateTimeA = `${a.date}T${a.startTime}`;
|
|
47
|
-
const dateTimeB = `${b.date}T${b.startTime}`;
|
|
48
|
-
return dateTimeB.localeCompare(dateTimeA);
|
|
49
|
-
});
|
|
50
|
-
this.isLoading = false;
|
|
51
|
-
},
|
|
52
|
-
error: () => {
|
|
53
|
-
this.hasError = true;
|
|
54
|
-
this.isLoading = false;
|
|
55
|
-
},
|
|
56
|
-
}));
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Check status endpoint to get the active appointmentId
|
|
60
|
-
*/
|
|
61
|
-
checkStatus() {
|
|
62
|
-
if (!this.tenant || !this.entityId) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
this.subscriptions.add(this.tasService
|
|
66
|
-
.getProxyVideoStatus({
|
|
67
|
-
roomType: this.roomType,
|
|
68
|
-
entityId: this.entityId,
|
|
69
|
-
tenant: this.tenant,
|
|
70
|
-
businessRole: this.businessRole,
|
|
71
|
-
})
|
|
72
|
-
.subscribe({
|
|
73
|
-
next: (response) => {
|
|
74
|
-
// Store the appointmentId from status - tas-btn only shows for this one
|
|
75
|
-
this.activeAppointmentId = response?.content?.appointmentId ?? null;
|
|
76
|
-
},
|
|
77
|
-
error: () => {
|
|
78
|
-
this.activeAppointmentId = null;
|
|
79
|
-
},
|
|
80
|
-
}));
|
|
81
|
-
}
|
|
82
|
-
onEnterCall(appointment) {
|
|
83
|
-
this.enterCall.emit(appointment);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Check if tas-btn should be shown for an appointment.
|
|
87
|
-
* Only shows when appointment.id matches the activeAppointmentId from status API.
|
|
88
|
-
* tas-btn handles its own polling for joinable state.
|
|
89
|
-
*/
|
|
90
|
-
shouldShowTasBtn(appointment) {
|
|
91
|
-
const hasValidStatus = appointment.status === AppointmentStatus.CONFIRMED ||
|
|
92
|
-
appointment.status === AppointmentStatus.ACTIVE;
|
|
93
|
-
// Only show for the appointment that matches status API response
|
|
94
|
-
return hasValidStatus && appointment.id === this.activeAppointmentId;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* TrackBy function for ngFor
|
|
98
|
-
*/
|
|
99
|
-
trackByAppointmentId(index, appointment) {
|
|
100
|
-
return appointment.id;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Format date to Spanish format: "Lunes 8 de diciembre"
|
|
104
|
-
*/
|
|
105
|
-
formatAppointmentDate(appointment) {
|
|
106
|
-
const [year, month, day] = appointment.date.split('-').map(Number);
|
|
107
|
-
const date = new Date(year, month - 1, day);
|
|
108
|
-
const dayNames = [
|
|
109
|
-
'Domingo', 'Lunes', 'Martes', 'Miércoles',
|
|
110
|
-
'Jueves', 'Viernes', 'Sábado'
|
|
111
|
-
];
|
|
112
|
-
const monthNames = [
|
|
113
|
-
'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
|
|
114
|
-
'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'
|
|
115
|
-
];
|
|
116
|
-
const dayName = dayNames[date.getDay()];
|
|
117
|
-
const dayNum = date.getDate();
|
|
118
|
-
const monthName = monthNames[date.getMonth()];
|
|
119
|
-
return `${dayName} ${dayNum} de ${monthName}`;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Format time range: "9:00 - 9:30"
|
|
123
|
-
*/
|
|
124
|
-
formatTimeRange(appointment) {
|
|
125
|
-
return `${appointment.startTime} - ${appointment.endTime}`;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Get the other participant in the call (not the current user)
|
|
129
|
-
*/
|
|
130
|
-
getOtherParticipant(appointment) {
|
|
131
|
-
if (!appointment.participants || appointment.participants.length === 0) {
|
|
132
|
-
return appointment.title;
|
|
133
|
-
}
|
|
134
|
-
const otherParticipant = appointment.participants.find(p => p.userId !== this.currentUser?.id);
|
|
135
|
-
return otherParticipant?.name || appointment.title;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
TasIncomingAppointmentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, deps: [{ token: i1.TasService }], target: i0.ɵɵFactoryTarget.Component });
|
|
139
|
-
TasIncomingAppointmentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasIncomingAppointmentComponent, selector: "tas-incoming-appointment", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", fromDate: "fromDate", toDate: "toDate" }, outputs: { enterCall: "enterCall" }, ngImport: i0, template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"], components: [{ type: i2.TasAvatarComponent, selector: "tas-avatar", inputs: ["name", "size"] }, { type: i3.TasButtonComponent, selector: "tas-btn", inputs: ["roomType", "entityId", "tenant", "businessRole", "currentUser", "variant", "buttonLabel"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
140
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasIncomingAppointmentComponent, decorators: [{
|
|
141
|
-
type: Component,
|
|
142
|
-
args: [{ selector: 'tas-incoming-appointment', template: "<div class=\"incoming-appointment-card\">\n <h3 class=\"card-title\">Pr\u00F3ximo turno</h3>\n\n <!-- Loading state -->\n <div class=\"card-content\" *ngIf=\"isLoading\">\n <div class=\"loading-spinner\"></div>\n </div>\n\n <!-- Empty state -->\n <div class=\"card-content empty-state\" *ngIf=\"!isLoading && appointments.length === 0\">\n <div class=\"icon-container\">\n <div class=\"icon-circle\">\n <i class=\"fa fa-calendar\" aria-hidden=\"true\"></i>\n </div>\n <span class=\"sparkle sparkle-1\">\u2726</span>\n <span class=\"sparkle sparkle-2\">\u2726</span>\n <span class=\"sparkle sparkle-3\">\u2726</span>\n <span class=\"sparkle sparkle-4\">\u2726</span>\n </div>\n <h4 class=\"empty-title\">Todav\u00EDa no ten\u00E9s turnos agendados</h4>\n <p class=\"empty-subtitle\">\n En caso de que Medicina Laboral requiera una consulta, lo ver\u00E1s en esta secci\u00F3n.\n </p>\n </div>\n\n <!-- Appointments list -->\n <div class=\"card-content appointment-state\" *ngIf=\"!isLoading && appointments.length > 0\">\n <div class=\"appointment-card\" *ngFor=\"let appt of appointments; trackBy: trackByAppointmentId\">\n <div class=\"appointment-header\">\n <tas-avatar [name]=\"getOtherParticipant(appt)\" [size]=\"48\"></tas-avatar>\n <span class=\"doctor-name\">{{ getOtherParticipant(appt) }}</span>\n </div>\n <div class=\"appointment-details\">\n <div class=\"date-time\">\n <span class=\"date\">{{ formatAppointmentDate(appt) }}</span>\n <span class=\"time\">{{ formatTimeRange(appt) }}</span>\n </div>\n <tas-btn\n *ngIf=\"shouldShowTasBtn(appt)\"\n variant=\"teal\"\n buttonLabel=\"Ingresar\"\n [roomType]=\"appt.roomType\"\n [entityId]=\"appt.entityId\"\n [tenant]=\"tenant\"\n [businessRole]=\"businessRole\"\n [currentUser]=\"currentUser\"\n ></tas-btn>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [":host{display:block}.incoming-appointment-card{background:#ffffff;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:24px;min-width:360px}.card-title{font-size:16px;font-weight:400;color:#6b7280;margin:0 0 24px}.card-content{display:flex;flex-direction:column;align-items:center}.loading-spinner{width:40px;height:40px;border:3px solid #e0f7fa;border-top-color:#0097a7;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{text-align:center;padding:20px 0}.icon-container{position:relative;width:120px;height:120px;margin-bottom:24px}.icon-circle{width:100%;height:100%;background:#e0f7fa;border-radius:50%;display:flex;align-items:center;justify-content:center}.icon-circle i{font-size:40px;color:#0097a7}.sparkle{position:absolute;color:#0097a7;font-size:12px}.sparkle-1{top:10px;right:5px}.sparkle-2{top:0;right:30px}.sparkle-3{top:25px;left:0}.sparkle-4{bottom:20px;right:0}.empty-title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 12px}.empty-subtitle{font-size:14px;color:#6b7280;margin:0;max-width:320px;line-height:1.5}.appointment-state{align-items:stretch;gap:16px}.appointment-card{border-radius:12px;border:1px solid var(--Primary-White-Uell50, #8ED1D8);background:#F1FAFA;padding:1.5rem}.appointment-header{display:flex;align-items:center;gap:12px;margin-bottom:16px}.doctor-name{overflow:hidden;color:var(--Neutral-GreyDark, #383E52);text-overflow:ellipsis;font-size:16px;font-style:normal;font-weight:600;line-height:24px;letter-spacing:.016px}.appointment-details{display:flex;justify-content:space-between;align-items:flex-end}.date-time{display:flex;flex-direction:column;gap:4px}.date{color:var(--Neutral-GreyDark, #383E52);font-size:12px;font-style:normal;font-weight:600;line-height:16px;letter-spacing:.06px}.time{font-size:14px;color:var(--Neutral-GreyDark, #383E52);font-family:Inter;font-size:10px;font-style:normal;font-weight:400;line-height:14px;letter-spacing:.04px}\n"] }]
|
|
143
|
-
}], ctorParameters: function () { return [{ type: i1.TasService }]; }, propDecorators: { roomType: [{
|
|
144
|
-
type: Input
|
|
145
|
-
}], entityId: [{
|
|
146
|
-
type: Input
|
|
147
|
-
}], tenant: [{
|
|
148
|
-
type: Input
|
|
149
|
-
}], businessRole: [{
|
|
150
|
-
type: Input
|
|
151
|
-
}], currentUser: [{
|
|
152
|
-
type: Input
|
|
153
|
-
}], fromDate: [{
|
|
154
|
-
type: Input
|
|
155
|
-
}], toDate: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}], enterCall: [{
|
|
158
|
-
type: Output
|
|
159
|
-
}] } });
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWluY29taW5nLWFwcG9pbnRtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rhcy11ZWxsLXNkay9zcmMvbGliL2NvbXBvbmVudHMvdGFzLWluY29taW5nLWFwcG9pbnRtZW50L3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC90YXMtaW5jb21pbmctYXBwb2ludG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLGVBQWUsR0FFaEIsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBT3pDLE1BQU0sT0FBTywrQkFBK0I7SUF1QjFDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF0QjFDLGlDQUFpQztRQUN4QixhQUFRLEdBQWdCLFdBQVcsQ0FBQyxHQUFHLENBQUM7UUFHeEMsaUJBQVksR0FBb0IsZUFBZSxDQUFDLElBQUksQ0FBQztRQU9wRCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFbEQsaUJBQVksR0FBcUIsRUFBRSxDQUFDO1FBQ3BDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUV4QiwwRUFBMEU7UUFDbkUsd0JBQW1CLEdBQWtCLElBQUksQ0FBQztRQUV6QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFF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b250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQge1xuICBUYXNBcHBvaW50bWVudCxcbiAgQXBwb2ludG1lbnRTdGF0dXMsXG4gIFRhc1Jvb21UeXBlLFxuICBUYXNCdXNpbmVzc1JvbGUsXG4gIFRhc0N1cnJlbnRVc2VyLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Rhcy5pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFzLWluY29taW5nLWFwcG9pbnRtZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1pbmNvbWluZy1hcHBvaW50bWVudC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNJbmNvbWluZ0FwcG9pbnRtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyBQYXNzdGhyb3VnaCBpbnB1dHMgZm9yIHRhcy1idG5cbiAgQElucHV0KCkgcm9vbVR5cGU6IFRhc1Jvb21UeXBlID0gVGFzUm9vbVR5cGUuVEFTO1xuICBASW5wdXQoKSBlbnRpdHlJZCE6IG51bWJlcjtcbiAgQElucHV0KCkgdGVuYW50ITogc3RyaW5nO1xuICBASW5wdXQoKSBidXNpbmVzc1JvbGU6IFRhc0J1c2luZXNzUm9sZSA9IFRhc0J1c2luZXNzUm9sZS5VU0VSO1xuICBASW5wdXQoKSBjdXJyZW50VXNlciE6IFRhc0N1cnJlbnRVc2VyO1xuICBcbiAgLy8gRGF0ZSByYW5nZSBpbnB1dHMgZm9yIGZldGNoaW5nIGFwcG9pbnRtZW50c1xuICBASW5wdXQoKSBmcm9tRGF0ZSE6IHN0cmluZzsgLy8gWVlZWS1NTS1ERCBmb3JtYXRcbiAgQElucHV0KCkgdG9EYXRlITogc3RyaW5nOyAgIC8vIFlZWVktTU0tREQgZm9ybWF0XG5cbiAgQE91dHB1dCgpIGVudGVyQ2FsbCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFzQXBwb2ludG1lbnQ+KCk7XG5cbiAgcHVibGljIGFwcG9pbnRtZW50czogVGFzQXBwb2ludG1lbnRbXSA9IFtdO1xuICBwdWJsaWMgaXNMb2FkaW5nID0gdHJ1ZTtcbiAgcHVibGljIGhhc0Vycm9yID0gZmFsc2U7XG5cbiAgLy8gVGhlIGFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgQVBJIC0gb25seSB0aGlzIGFwcG9pbnRtZW50IHNob3dzIHRhcy1idG5cbiAgcHVibGljIGFjdGl2ZUFwcG9pbnRtZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQXBwb2ludG1lbnRzKCk7XG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRBcHBvaW50bWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZVxuICAgICAgICAuZ2V0QXBwb2ludG1lbnRzKHsgXG4gICAgICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbURhdGUsIFxuICAgICAgICAgIHRvRGF0ZTogdGhpcy50b0RhdGUsIFxuICAgICAgICAgIGVudGl0eUlkOiB0aGlzLmVudGl0eUlkIFxuICAgICAgICB9KVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggYXJyYXkgcmVzcG9uc2UgYW5kIHdyYXBwZWQgcmVzcG9uc2UgKGUuZy4sIHsgY29udGVudDogWy4uLl0gfSlcbiAgICAgICAgICAgIGNvbnN0IGFwcG9pbnRtZW50cyA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UpXG4gICAgICAgICAgICAgID8gcmVzcG9uc2VcbiAgICAgICAgICAgICAgOiByZXNwb25zZT8uY29udGVudCB8fCBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRGVkdXBsaWNhdGUgYnkgaWQgYW5kIHNvcnQgYnkgZGF0ZSBhbmQgc3RhcnRUaW1lIGFzY2VuZGluZyAoZWFybGllc3QgZmlyc3QpXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVBcHBvaW50bWVudHMgPSBhcHBvaW50bWVudHMuZmlsdGVyKFxuICAgICAgICAgICAgICAoYXBwdDogVGFzQXBwb2ludG1lbnQsIGluZGV4OiBudW1iZXIsIHNlbGY6IFRhc0FwcG9pbnRtZW50W10pID0+XG4gICAgICAgICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KChhOiBUYXNBcHBvaW50bWVudCkgPT4gYS5pZCA9PT0gYXBwdC5pZClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFwcG9pbnRtZW50cyA9IHVuaXF1ZUFwcG9pbnRtZW50cy5zb3J0KChhOiBUYXNBcHBvaW50bWVudCwgYjogVGFzQXBwb2ludG1lbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVBID0gYCR7YS5kYXRlfVQke2Euc3RhcnRUaW1lfWA7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lQiA9IGAke2IuZGF0ZX1UJHtiLnN0YXJ0VGltZX1gO1xuICAgICAgICAgICAgICByZXR1cm4gZGF0ZVRpbWVCLmxvY2FsZUNvbXBhcmUoZGF0ZVRpbWVBKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBnZXQgdGhlIGFjdGl2ZSBhcHBvaW50bWVudElkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50ZW5hbnQgfHwgIXRoaXMuZW50aXR5SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlXG4gICAgICAgIC5nZXRQcm94eVZpZGVvU3RhdHVzKHtcbiAgICAgICAgICByb29tVHlwZTogdGhpcy5yb29tVHlwZSxcbiAgICAgICAgICBlbnRpdHlJZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgICAgICB0ZW5hbnQ6IHRoaXMudGVuYW50LFxuICAgICAgICAgIGJ1c2luZXNzUm9sZTogdGhpcy5idXNpbmVzc1JvbGUsXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgLSB0YXMtYnRuIG9ubHkgc2hvd3MgZm9yIHRoaXMgb25lXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUFwcG9pbnRtZW50SWQgPSByZXNwb25zZT8uY29udGVudD8uYXBwb2ludG1lbnRJZCA/PyBudWxsO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQXBwb2ludG1lbnRJZCA9IG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG9uRW50ZXJDYWxsKGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IHZvaWQge1xuICAgIHRoaXMuZW50ZXJDYWxsLmVtaXQoYXBwb2ludG1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRhcy1idG4gc2hvdWxkIGJlIHNob3duIGZvciBhbiBhcHBvaW50bWVudC5cbiAgICogT25seSBzaG93cyB3aGVuIGFwcG9pbnRtZW50LmlkIG1hdGNoZXMgdGhlIGFjdGl2ZUFwcG9pbnRtZW50SWQgZnJvbSBzdGF0dXMgQVBJLlxuICAgKiB0YXMtYnRuIGhhbmRsZXMgaXRzIG93biBwb2xsaW5nIGZvciBqb2luYWJsZSBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBzaG91bGRTaG93VGFzQnRuKGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc1ZhbGlkU3RhdHVzID0gYXBwb2ludG1lbnQuc3RhdHVzID09PSBBcHBvaW50bWVudFN0YXR1cy5DT05GSVJNRUQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwb2ludG1lbnQuc3RhdHVzID09PSBBcHBvaW50bWVudFN0YXR1cy5BQ1RJVkU7XG4gICAgXG4gICAgLy8gT25seSBzaG93IGZvciB0aGUgYXBwb2ludG1lbnQgdGhhdCBtYXRjaGVzIHN0YXR1cyBBUEkgcmVzcG9uc2VcbiAgICByZXR1cm4gaGFzVmFsaWRTdGF0dXMgJiYgYXBwb2ludG1lbnQuaWQgPT09IHRoaXMuYWN0aXZlQXBwb2ludG1lbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBuZ0ZvclxuICAgKi9cbiAgcHVibGljIHRyYWNrQnlBcHBvaW50bWVudElkKGluZGV4OiBudW1iZXIsIGFwcG9pbnRtZW50OiBUYXNBcHBvaW50bWVudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFwcG9pbnRtZW50LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBkYXRlIHRvIFNwYW5pc2ggZm9ybWF0OiBcIkx1bmVzIDggZGUgZGljaWVtYnJlXCJcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRBcHBvaW50bWVudERhdGUoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBhcHBvaW50bWVudC5kYXRlLnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcblxuICAgIGNvbnN0IGRheU5hbWVzID0gW1xuICAgICAgJ0RvbWluZ28nLCAnTHVuZXMnLCAnTWFydGVzJywgJ01pw6lyY29sZXMnLFxuICAgICAgJ0p1ZXZlcycsICdWaWVybmVzJywgJ1PDoWJhZG8nXG4gICAgXTtcbiAgICBjb25zdCBtb250aE5hbWVzID0gW1xuICAgICAgJ2VuZXJvJywgJ2ZlYnJlcm8nLCAnbWFyem8nLCAnYWJyaWwnLCAnbWF5bycsICdqdW5pbycsXG4gICAgICAnanVsaW8nLCAnYWdvc3RvJywgJ3NlcHRpZW1icmUnLCAnb2N0dWJyZScsICdub3ZpZW1icmUnLCAnZGljaWVtYnJlJ1xuICAgIF07XG5cbiAgICBjb25zdCBkYXlOYW1lID0gZGF5TmFtZXNbZGF0ZS5nZXREYXkoKV07XG4gICAgY29uc3QgZGF5TnVtID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhOYW1lID0gbW9udGhOYW1lc1tkYXRlLmdldE1vbnRoKCldO1xuXG4gICAgcmV0dXJuIGAke2RheU5hbWV9ICR7ZGF5TnVtfSBkZSAke21vbnRoTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aW1lIHJhbmdlOiBcIjk6MDAgLSA5OjMwXCJcbiAgICovXG4gIHB1YmxpYyBmb3JtYXRUaW1lUmFuZ2UoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7YXBwb2ludG1lbnQuc3RhcnRUaW1lfSAtICR7YXBwb2ludG1lbnQuZW5kVGltZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3RoZXIgcGFydGljaXBhbnQgaW4gdGhlIGNhbGwgKG5vdCB0aGUgY3VycmVudCB1c2VyKVxuICAgKi9cbiAgcHVibGljIGdldE90aGVyUGFydGljaXBhbnQoYXBwb2ludG1lbnQ6IFRhc0FwcG9pbnRtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoIWFwcG9pbnRtZW50LnBhcnRpY2lwYW50cyB8fCBhcHBvaW50bWVudC5wYXJ0aWNpcGFudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYXBwb2ludG1lbnQudGl0bGU7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG90aGVyUGFydGljaXBhbnQgPSBhcHBvaW50bWVudC5wYXJ0aWNpcGFudHMuZmluZChcbiAgICAgIHAgPT4gcC51c2VySWQgIT09IHRoaXMuY3VycmVudFVzZXI/LmlkXG4gICAgKTtcbiAgICBcbiAgICByZXR1cm4gb3RoZXJQYXJ0aWNpcGFudD8ubmFtZSB8fCBhcHBvaW50bWVudC50aXRsZTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiaW5jb21pbmctYXBwb2ludG1lbnQtY2FyZFwiPlxuICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlXCI+UHLDs3hpbW8gdHVybm88L2gzPlxuXG4gIDwhLS0gTG9hZGluZyBzdGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctc3Bpbm5lclwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEVtcHR5IHN0YXRlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50IGVtcHR5LXN0YXRlXCIgKm5nSWY9XCIhaXNMb2FkaW5nICYmIGFwcG9pbnRtZW50cy5sZW5ndGggPT09IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS0xXCI+4pymPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGFya2xlIHNwYXJrbGUtMlwiPuKcpjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3BhcmtsZSBzcGFya2xlLTNcIj7inKY8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNwYXJrbGUgc3BhcmtsZS00XCI+4pymPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxoNCBjbGFzcz1cImVtcHR5LXRpdGxlXCI+VG9kYXbDrWEgbm8gdGVuw6lzIHR1cm5vcyBhZ2VuZGFkb3M8L2g0PlxuICAgIDxwIGNsYXNzPVwiZW1wdHktc3VidGl0bGVcIj5cbiAgICAgIEVuIGNhc28gZGUgcXVlIE1lZGljaW5hIExhYm9yYWwgcmVxdWllcmEgdW5hIGNvbnN1bHRhLCBsbyB2ZXLDoXMgZW4gZXN0YSBzZWNjacOzbi5cbiAgICA8L3A+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQXBwb2ludG1lbnRzIGxpc3QgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgYXBwb2ludG1lbnQtc3RhdGVcIiAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgYXBwb2ludG1lbnRzLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYXBwb2ludG1lbnQtY2FyZFwiICpuZ0Zvcj1cImxldCBhcHB0IG9mIGFwcG9pbnRtZW50czsgdHJhY2tCeTogdHJhY2tCeUFwcG9pbnRtZW50SWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhcHBvaW50bWVudC1oZWFkZXJcIj5cbiAgICAgICAgPHRhcy1hdmF0YXIgW25hbWVdPVwiZ2V0T3RoZXJQYXJ0aWNpcGFudChhcHB0KVwiIFtzaXplXT1cIjQ4XCI+PC90YXMtYXZhdGFyPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3Rvci1uYW1lXCI+e3sgZ2V0T3RoZXJQYXJ0aWNpcGFudChhcHB0KSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImFwcG9pbnRtZW50LWRldGFpbHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtdGltZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZVwiPnt7IGZvcm1hdEFwcG9pbnRtZW50RGF0ZShhcHB0KSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWVcIj57eyBmb3JtYXRUaW1lUmFuZ2UoYXBwdCkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dGFzLWJ0blxuICAgICAgICAgICpuZ0lmPVwic2hvdWxkU2hvd1Rhc0J0bihhcHB0KVwiXG4gICAgICAgICAgdmFyaWFudD1cInRlYWxcIlxuICAgICAgICAgIGJ1dHRvbkxhYmVsPVwiSW5ncmVzYXJcIlxuICAgICAgICAgIFtyb29tVHlwZV09XCJhcHB0LnJvb21UeXBlXCJcbiAgICAgICAgICBbZW50aXR5SWRdPVwiYXBwdC5lbnRpdHlJZFwiXG4gICAgICAgICAgW3RlbmFudF09XCJ0ZW5hbnRcIlxuICAgICAgICAgIFtidXNpbmVzc1JvbGVdPVwiYnVzaW5lc3NSb2xlXCJcbiAgICAgICAgICBbY3VycmVudFVzZXJdPVwiY3VycmVudFVzZXJcIlxuICAgICAgICA+PC90YXMtYnRuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { OnInit, OnDestroy, EventEmitter } from '@angular/core';
|
|
2
|
-
import { TasService } from '../../services/tas.service';
|
|
3
|
-
import { TasAppointment, TasRoomType, TasBusinessRole, TasCurrentUser } from '../../interfaces/tas.interfaces';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export declare class TasIncomingAppointmentComponent implements OnInit, OnDestroy {
|
|
6
|
-
private tasService;
|
|
7
|
-
roomType: TasRoomType;
|
|
8
|
-
entityId: number;
|
|
9
|
-
tenant: string;
|
|
10
|
-
businessRole: TasBusinessRole;
|
|
11
|
-
currentUser: TasCurrentUser;
|
|
12
|
-
fromDate: string;
|
|
13
|
-
toDate: string;
|
|
14
|
-
enterCall: EventEmitter<TasAppointment>;
|
|
15
|
-
appointments: TasAppointment[];
|
|
16
|
-
isLoading: boolean;
|
|
17
|
-
hasError: boolean;
|
|
18
|
-
activeAppointmentId: number | null;
|
|
19
|
-
private subscriptions;
|
|
20
|
-
constructor(tasService: TasService);
|
|
21
|
-
ngOnInit(): void;
|
|
22
|
-
ngOnDestroy(): void;
|
|
23
|
-
private loadAppointments;
|
|
24
|
-
/**
|
|
25
|
-
* Check status endpoint to get the active appointmentId
|
|
26
|
-
*/
|
|
27
|
-
private checkStatus;
|
|
28
|
-
onEnterCall(appointment: TasAppointment): void;
|
|
29
|
-
/**
|
|
30
|
-
* Check if tas-btn should be shown for an appointment.
|
|
31
|
-
* Only shows when appointment.id matches the activeAppointmentId from status API.
|
|
32
|
-
* tas-btn handles its own polling for joinable state.
|
|
33
|
-
*/
|
|
34
|
-
shouldShowTasBtn(appointment: TasAppointment): boolean;
|
|
35
|
-
/**
|
|
36
|
-
* TrackBy function for ngFor
|
|
37
|
-
*/
|
|
38
|
-
trackByAppointmentId(index: number, appointment: TasAppointment): number;
|
|
39
|
-
/**
|
|
40
|
-
* Format date to Spanish format: "Lunes 8 de diciembre"
|
|
41
|
-
*/
|
|
42
|
-
formatAppointmentDate(appointment: TasAppointment): string;
|
|
43
|
-
/**
|
|
44
|
-
* Format time range: "9:00 - 9:30"
|
|
45
|
-
*/
|
|
46
|
-
formatTimeRange(appointment: TasAppointment): string;
|
|
47
|
-
/**
|
|
48
|
-
* Get the other participant in the call (not the current user)
|
|
49
|
-
*/
|
|
50
|
-
getOtherParticipant(appointment: TasAppointment): string;
|
|
51
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<TasIncomingAppointmentComponent, never>;
|
|
52
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TasIncomingAppointmentComponent, "tas-incoming-appointment", never, { "roomType": "roomType"; "entityId": "entityId"; "tenant": "tenant"; "businessRole": "businessRole"; "currentUser": "currentUser"; "fromDate": "fromDate"; "toDate": "toDate"; }, { "enterCall": "enterCall"; }, never, never>;
|
|
53
|
-
}
|