@chat21/chat21-ionic 3.4.27-rc3 → 3.4.27-rc5
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/CHANGELOG.md +8 -0
- package/package.json +1 -1
- package/src/app/app.component.ts +8 -1
- package/src/app/components/canned-response/canned-response.component.scss +0 -2
- package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +12 -7
- package/src/app/components/navbar/navbar.component.html +3 -3
- package/src/app/components/navbar/navbar.component.ts +29 -38
- package/src/app/components/sidebar/sidebar.component.html +65 -45
- package/src/app/components/sidebar/sidebar.component.ts +92 -117
- package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +2 -2
- package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +7 -7
- package/src/app/services/global-settings/global-settings.service.ts +5 -2
- package/src/app/shared/shared.module.ts +11 -0
- package/src/app/utils/permissions.constants.ts +14 -11
- package/src/assets/i18n/ar.json +4 -0
- package/src/assets/i18n/az.json +4 -0
- package/src/assets/i18n/de.json +4 -0
- package/src/assets/i18n/en.json +4 -0
- package/src/assets/i18n/es.json +4 -0
- package/src/assets/i18n/fr.json +4 -0
- package/src/assets/i18n/it.json +4 -0
- package/src/assets/i18n/kk.json +4 -0
- package/src/assets/i18n/pt.json +4 -0
- package/src/assets/i18n/ru.json +4 -0
- package/src/assets/i18n/sr.json +4 -0
- package/src/assets/i18n/sv.json +4 -0
- package/src/assets/i18n/tr.json +4 -0
- package/src/assets/i18n/uk.json +4 -0
- package/src/assets/i18n/uz.json +4 -0
- package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +1 -0
- package/src/chat21-core/utils/utils.ts +10 -2
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,14 @@
|
|
|
8
8
|
### **Copyrigth**:
|
|
9
9
|
*Tiledesk SRL*
|
|
10
10
|
|
|
11
|
+
# 3.4.27-rc5
|
|
12
|
+
- **added**: managed roles in sidebar e navbar
|
|
13
|
+
- **bug-fixed**: projectId and supportMode url is not saved in localstorage
|
|
14
|
+
|
|
15
|
+
# 3.4.27-rc4
|
|
16
|
+
- **bug-fixed**: extractUrls function is not able to detect url start with www or without https/http
|
|
17
|
+
- **bug-fixed**: if message is sent with keydown, error on domain check is not showed
|
|
18
|
+
|
|
11
19
|
# 3.4.27-rc3
|
|
12
20
|
- **bug-fixed**: cannot set user availability if supportMode is enabled and tiledesk_projectID url params is set
|
|
13
21
|
|
package/package.json
CHANGED
package/src/app/app.component.ts
CHANGED
|
@@ -300,6 +300,7 @@ export class AppComponent implements OnInit {
|
|
|
300
300
|
this.zone = new NgZone({}); // a cosa serve?
|
|
301
301
|
|
|
302
302
|
this.SUPPORT_MODE = this.g.supportMode
|
|
303
|
+
this.logger.info('[APP-COMP] this.SUPPORT_MODE', this.SUPPORT_MODE)
|
|
303
304
|
}
|
|
304
305
|
|
|
305
306
|
});
|
|
@@ -868,7 +869,8 @@ export class AppComponent implements OnInit {
|
|
|
868
869
|
// console.log('[APP-COMP] PLATFORM', PLATFORM_MOBILE, 'route.snapshot', this.route.snapshot);
|
|
869
870
|
if (!IDConv) {
|
|
870
871
|
this.logger.log('[APP-COMP] navigateByUrl -- conversations-list');
|
|
871
|
-
|
|
872
|
+
const queryString = window.location.search; // restituisce ad es. "?jwt=...&tiledesk_supportMode=false"
|
|
873
|
+
this.router.navigateByUrl('conversations-list' + queryString);
|
|
872
874
|
}
|
|
873
875
|
// this.router.navigateByUrl(pageUrl);
|
|
874
876
|
// this.navService.setRoot(ConversationListPage, {});
|
|
@@ -892,6 +894,11 @@ export class AppComponent implements OnInit {
|
|
|
892
894
|
if (IDConv && FullNameConv) {
|
|
893
895
|
pageUrl += IDConv + '/' + FullNameConv + '/' + Convtype
|
|
894
896
|
}
|
|
897
|
+
|
|
898
|
+
const queryParams = this.route.snapshot.queryParams;
|
|
899
|
+
const queryString = new URLSearchParams(queryParams).toString();
|
|
900
|
+
pageUrl += queryString ? `?${queryString}` : '';
|
|
901
|
+
|
|
895
902
|
// replace(/\(/g, '%28').replace(/\)/g, '%29') -> used for the encoder of any round brackets
|
|
896
903
|
this.router.navigateByUrl(pageUrl.replace(/\(/g, '%28').replace(/\)/g, '%29').replace( /#/g, "%23" ));
|
|
897
904
|
|
package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts
CHANGED
|
@@ -566,8 +566,10 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
|
|
|
566
566
|
if (!text.includes("/")) {
|
|
567
567
|
this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 1 message: ', message);
|
|
568
568
|
this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 1 message: ", message);
|
|
569
|
-
|
|
569
|
+
|
|
570
570
|
this.sendMessage(text);
|
|
571
|
+
// this.messageString = '';
|
|
572
|
+
|
|
571
573
|
this.countClicks = 0
|
|
572
574
|
} else if (text.includes("/") && pos === 0 && this.countClicks > 1 && this.tagsCannedFilter.length > 0) {
|
|
573
575
|
this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - tagsCannedFilter.length 2: ', this.tagsCannedFilter.length);
|
|
@@ -579,9 +581,10 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
|
|
|
579
581
|
this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
|
|
580
582
|
this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
|
|
581
583
|
this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 2 message: ', message);
|
|
582
|
-
|
|
583
|
-
|
|
584
|
+
|
|
584
585
|
this.sendMessage(text);
|
|
586
|
+
// this.messageString = '';
|
|
587
|
+
|
|
585
588
|
this.countClicks = 0
|
|
586
589
|
} else if (text.includes("/") && pos > 0 && this.countClicks > 1 && this.tagsCannedFilter.length > 0 && text.substr(-1) !== '/') {
|
|
587
590
|
this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - tagsCannedFilter.length 3: ', this.tagsCannedFilter.length);
|
|
@@ -593,17 +596,19 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
|
|
|
593
596
|
this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
|
|
594
597
|
this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
|
|
595
598
|
this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 2 message: ', message);
|
|
596
|
-
|
|
597
|
-
|
|
599
|
+
|
|
598
600
|
this.sendMessage(text);
|
|
601
|
+
// this.messageString = '';
|
|
602
|
+
|
|
599
603
|
this.countClicks = 0
|
|
600
604
|
} else if (text.includes("/") && this.tagsCannedFilter.length === 0) {
|
|
601
605
|
this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - tagsCannedFilter.length 3: ', this.tagsCannedFilter.length);
|
|
602
606
|
this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 3 message: ', message);
|
|
603
607
|
this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 3 message: ", message);
|
|
604
|
-
|
|
605
|
-
|
|
608
|
+
|
|
606
609
|
this.sendMessage(text);
|
|
610
|
+
// this.messageString = '';
|
|
611
|
+
|
|
607
612
|
this.countClicks = 0
|
|
608
613
|
|
|
609
614
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
</div>
|
|
6
6
|
<div class="navbar-right">
|
|
7
7
|
<!-- test site -->
|
|
8
|
-
<ng-container *ngIf="project">
|
|
8
|
+
<ng-container *ngIf="project && roles?.[PERMISSIONS.SIMULATE_CONV]">
|
|
9
9
|
<button class="btn simulate-visitor-btn" (click)="testWidgetPage()">
|
|
10
10
|
<i class="material-icons">play_arrow</i>
|
|
11
11
|
<!-- {{translationsMap?.get('NAVBAR.SIMULATE_VISITOR')}} -->
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
</ng-container>
|
|
24
24
|
|
|
25
25
|
<!-- ------ PROJECTS DROPDOWN ------ -->
|
|
26
|
-
<ng-container *ngIf="project">
|
|
26
|
+
<ng-container *ngIf="project && roles?.[PERMISSIONS.CHANGE_PROJECT]">
|
|
27
27
|
<li>
|
|
28
28
|
<button class="btn dropdown-toggle project-dropdown" (click)="openDropdownProjects = !openDropdownProjects">
|
|
29
29
|
<span class="project-dropdown" style="text-transform: none"> {{ project?.id_project?.name }} </span>
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
</li>
|
|
50
50
|
|
|
51
51
|
<!-- ADD PROJECT -->
|
|
52
|
-
<li id="navbar_create_prjct" *ngIf="
|
|
52
|
+
<li id="navbar_create_prjct" *ngIf="isVisibleMT" (click)="onClickDropdownOption('addProject')" class="add-project">
|
|
53
53
|
<a>
|
|
54
54
|
<i class="material-icons">add_circle_outline </i>
|
|
55
55
|
{{translationsMap?.get('NAVBAR.ADD_PROJECT')}}
|
|
@@ -7,6 +7,10 @@ import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service
|
|
|
7
7
|
import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
|
|
8
8
|
import { Project } from 'src/chat21-core/models/projects';
|
|
9
9
|
import { CustomTranslateService } from 'src/chat21-core/providers/custom-translate.service';
|
|
10
|
+
import { ProjectUsersService } from 'src/app/services/project_users/project-users.service';
|
|
11
|
+
import { ProjectUser } from 'src/chat21-core/models/projectUsers';
|
|
12
|
+
import { PERMISSIONS } from 'src/app/utils/permissions.constants';
|
|
13
|
+
import { getOSCode, hasRole } from 'src/app/utils/utils';
|
|
10
14
|
|
|
11
15
|
@Component({
|
|
12
16
|
selector: 'app-navbar',
|
|
@@ -30,10 +34,14 @@ export class NavbarComponent implements OnInit {
|
|
|
30
34
|
public openDropdownProjects: boolean = false
|
|
31
35
|
private public_Key: string;
|
|
32
36
|
public isVisible: boolean;
|
|
33
|
-
public
|
|
37
|
+
public isVisibleMT: boolean;
|
|
34
38
|
|
|
39
|
+
public projectUser: ProjectUser;
|
|
40
|
+
public roles: { [key: string]: boolean }
|
|
41
|
+
PERMISSIONS = PERMISSIONS;
|
|
35
42
|
constructor(
|
|
36
43
|
private projectService: ProjectService,
|
|
44
|
+
public projectUsersService: ProjectUsersService,
|
|
37
45
|
private tiledeskAuthService: TiledeskAuthService,
|
|
38
46
|
private appConfigProvider: AppConfigProvider,
|
|
39
47
|
private translateService: CustomTranslateService,
|
|
@@ -96,11 +104,14 @@ export class NavbarComponent implements OnInit {
|
|
|
96
104
|
}
|
|
97
105
|
|
|
98
106
|
getStoredProjectAndUserRole() {
|
|
99
|
-
this.events.subscribe('storage:last_project',project =>{
|
|
107
|
+
this.events.subscribe('storage:last_project',async (project) =>{
|
|
100
108
|
this.logger.log('[NAVBAR] stored_project ', project)
|
|
101
109
|
if (project && project !== 'undefined') {
|
|
102
110
|
this.project = project;
|
|
103
111
|
this.USER_ROLE = project.role;
|
|
112
|
+
this.projectUser = await this.projectUsersService.getProjectUserByProjectId(project.id_project.id)
|
|
113
|
+
this.roles = this.checkRoles()
|
|
114
|
+
console.log('[SIDEBAR] roles ', this.roles)
|
|
104
115
|
}
|
|
105
116
|
})
|
|
106
117
|
}
|
|
@@ -108,44 +119,24 @@ export class NavbarComponent implements OnInit {
|
|
|
108
119
|
getOSCODE() {
|
|
109
120
|
this.public_Key = this.appConfigProvider.getConfig().t2y12PruGU9wUtEGzBJfolMIgK;
|
|
110
121
|
this.logger.log('[NAVBAR] AppConfigService getAppConfig public_Key', this.public_Key)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
// this.logger.log('PUBLIC-KEY (Navbar) - pay key&value', pay);
|
|
122
|
-
if (pay[1] === "F") {
|
|
123
|
-
this.isVisible = false;
|
|
124
|
-
// this.logger.log('PUBLIC-KEY (Navbar) - pay isVisible', this.isVisible);
|
|
125
|
-
} else {
|
|
126
|
-
this.isVisible = true;
|
|
127
|
-
// this.logger.log('PUBLIC-KEY (Navbar) - pay isVisible', this.isVisible);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (key.includes("MTT")) {
|
|
132
|
-
// this.logger.log('PUBLIC-KEY (Navbar) - key', key);
|
|
133
|
-
let mt = key.split(":");
|
|
134
|
-
// this.logger.log('PUBLIC-KEY (Navbar) - mt key&value', mt);
|
|
135
|
-
if (mt[1] === "F") {
|
|
136
|
-
this.MT = false;
|
|
137
|
-
// this.logger.log('PUBLIC-KEY (Navbar) - mt is', this.MT);
|
|
138
|
-
} else {
|
|
139
|
-
this.MT = true;
|
|
140
|
-
// this.logger.log('PUBLIC-KEY (Navbar) - mt is', this.MT);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
});
|
|
122
|
+
|
|
123
|
+
this.isVisibleMT = getOSCode("MTT", this.public_Key);
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
checkRoles(): { [key: string]: boolean } {
|
|
128
|
+
const permissionKeys = [
|
|
129
|
+
'CHANGE_PROJECT',
|
|
130
|
+
'SIMULATE_CONV',
|
|
131
|
+
] as const;
|
|
144
132
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
133
|
+
const roles: { [key: string]: boolean } = {};
|
|
134
|
+
for (const key of permissionKeys) {
|
|
135
|
+
const permission = PERMISSIONS[key];
|
|
136
|
+
roles[permission] = hasRole(this.projectUser, permission);
|
|
148
137
|
}
|
|
138
|
+
|
|
139
|
+
return roles;
|
|
149
140
|
|
|
150
141
|
}
|
|
151
142
|
|
|
@@ -57,25 +57,27 @@
|
|
|
57
57
|
<!-- ------------------------------------------- -->
|
|
58
58
|
<!-- HOME (click)="goToHome()"" -->
|
|
59
59
|
<!-- ------------------------------------------- -->
|
|
60
|
-
<
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
<
|
|
64
|
-
<
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
60
|
+
<ng-container *ngIf="roles?.[PERMISSIONS.HOME_READ]">
|
|
61
|
+
<div matTooltip="Home" #tooltip="matTooltip" matTooltipPosition='right'
|
|
62
|
+
matTooltipHideDelay="100" matTooltipClass="custom-mat-tooltip">
|
|
63
|
+
<a target="_self" href="{{ URLS.HOME }}" class="customAncor">
|
|
64
|
+
<span>
|
|
65
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" width="24px" height="24px" fill="none">
|
|
66
|
+
<path d="M240-200h120v-240h240v240h120v-360L480-740 240-560v360Zm-80 80v-480l320-240 320 240v480H520v-240h-80v240H160Zm320-350Z" />
|
|
67
|
+
</svg>
|
|
68
|
+
</span>
|
|
69
|
+
</a>
|
|
70
|
+
</div>
|
|
71
|
+
</ng-container>
|
|
70
72
|
|
|
71
73
|
<!-- -------------------------------------------------------- -->
|
|
72
74
|
<!-- @ Knowledge Bases -->
|
|
73
75
|
<!-- -------------------------------------------------------- -->
|
|
74
|
-
<ng-container *ngIf="USER_ROLE !== 'agent' && isVisibleKNB">
|
|
76
|
+
<ng-container *ngIf="USER_ROLE !== 'agent' && isVisibleKNB && roles?.[PERMISSIONS.KB_READ]">
|
|
75
77
|
<div id="bot-anchor-wpr" matTooltipClass="custom-mat-tooltip"
|
|
76
|
-
matTooltip="
|
|
78
|
+
matTooltip="{{translationsMap?.get('Knowledgebases')}}" #tooltip="matTooltip" matTooltipPosition='right'
|
|
77
79
|
matTooltipHideDelay="100" routerLinkActive="item-active">
|
|
78
|
-
<a target="_self" href="{{
|
|
80
|
+
<a target="_self" href="{{ URLS.KNOWLEDGEBASE }}" class="customAncor">
|
|
79
81
|
<span>
|
|
80
82
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" width="24px" height="24px" fill="none">
|
|
81
83
|
<path d="M390-120q-51 0-88-35.5T260-241q-60-8-100-53t-40-106q0-21 5.5-41.5T142-480q-11-18-16.5-38t-5.5-42q0-61 40-105.5t99-52.5q3-51 41-86.5t90-35.5q26 0 48.5 10t41.5 27q18-17 41-27t49-10q52 0 89.5 35t40.5 86q59 8 99.5 53T840-560q0 22-5.5 42T818-480q11 18 16.5 38.5T840-400q0 62-40.5 106.5T699-241q-5 50-41.5 85.5T570-120q-25 0-48.5-9.5T480-156q-19 17-42 26.5t-48 9.5Zm130-590v460q0 21 14.5 35.5T570-200q20 0 34.5-16t15.5-36q-21-8-38.5-21.5T550-306q-10-14-7.5-30t16.5-26q14-10 30-7.5t26 16.5q11 16 28 24.5t37 8.5q33 0 56.5-23.5T760-400q0-5-.5-10t-2.5-10q-17 10-36.5 15t-40.5 5q-17 0-28.5-11.5T640-440q0-17 11.5-28.5T680-480q33 0 56.5-23.5T760-560q0-33-23.5-56T680-640q-11 18-28.5 31.5T613-587q-16 6-31-1t-20-23q-5-16 1.5-31t22.5-20q15-5 24.5-18t9.5-30q0-21-14.5-35.5T570-760q-21 0-35.5 14.5T520-710Zm-80 460v-460q0-21-14.5-35.5T390-760q-21 0-35.5 14.5T340-710q0 16 9 29.5t24 18.5q16 5 23 20t2 31q-6 16-21 23t-31 1q-21-8-38.5-21.5T279-640q-32 1-55.5 24.5T200-560q0 33 23.5 56.5T280-480q17 0 28.5 11.5T320-440q0 17-11.5 28.5T280-400q-21 0-40.5-5T203-420q-2 5-2.5 10t-.5 10q0 33 23.5 56.5T280-320q20 0 37-8.5t28-24.5q10-14 26-16.5t30 7.5q14 10 16.5 26t-7.5 30q-14 19-32 33t-39 22q1 20 16 35.5t35 15.5q21 0 35.5-14.5T440-250Zm40-230Z" />
|
|
@@ -89,10 +91,10 @@
|
|
|
89
91
|
<!-- ---------------------------------- -->
|
|
90
92
|
<!-- Bot (click)="goToBots()" -->
|
|
91
93
|
<!-- ---------------------------------- -->
|
|
92
|
-
<ng-container *ngIf="USER_ROLE !== 'agent'">
|
|
93
|
-
<div id="bot-anchor-wpr" matTooltipClass="custom-mat-tooltip" matTooltip="
|
|
94
|
+
<ng-container *ngIf="USER_ROLE !== 'agent' && roles?.[PERMISSIONS.FLOWS_READ]">
|
|
95
|
+
<div id="bot-anchor-wpr" matTooltipClass="custom-mat-tooltip" matTooltip="{{translationsMap?.get('Flows')}}"
|
|
94
96
|
#tooltip="matTooltip" matTooltipPosition='right' matTooltipHideDelay="100">
|
|
95
|
-
<a target="_self" href="{{
|
|
97
|
+
<a target="_self" href="{{ URLS.BOTS }}" id="bot-anchor" #botbtn class="customAncor">
|
|
96
98
|
<span class="bot-icon-wpr">
|
|
97
99
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"width="24px" height="24px" fill="none">
|
|
98
100
|
<path d="M12,21.9c-1,0-1.8-0.3-2.5-1c-0.7-0.7-1-1.5-1-2.5c0-0.8,0.3-1.6,0.8-2.2c0.5-0.6,1.2-1,1.9-1.2v-2.3H5.5V9H3 V2.5h6.4V9H7v2.3h10V8.9c-0.8-0.2-1.4-0.6-1.9-1.2c-0.5-0.6-0.8-1.3-0.8-2.2c0-1,0.3-1.8,1-2.5c0.7-0.7,1.5-1,2.5-1 c1,0,1.8,0.3,2.5,1c0.7,0.7,1,1.5,1,2.5c0,0.8-0.3,1.6-0.8,2.2c-0.5,0.6-1.2,1-1.9,1.2v3.9h-5.7v2.3c0.8,0.2,1.4,0.6,1.9,1.2 c0.5,0.6,0.8,1.3,0.8,2.2c0,1-0.3,1.8-1,2.5C13.8,21.6,13,21.9,12,21.9z M17.8,7.5c0.5,0,1-0.2,1.4-0.6c0.4-0.4,0.6-0.8,0.6-1.4 c0-0.5-0.2-1-0.6-1.4c-0.4-0.4-0.8-0.6-1.4-0.6c-0.5,0-1,0.2-1.4,0.6C16,4.5,15.8,5,15.8,5.5c0,0.5,0.2,1,0.6,1.4S17.2,7.5,17.8,7.5 z M4.5,7.5H8V4H4.5C4.5,4,4.5,7.5,4.5,7.5z M12,20.4c0.5,0,1-0.2,1.4-0.6S14,19,14,18.5s-0.2-1-0.6-1.4c-0.4-0.4-0.8-0.6-1.4-0.6 c-0.5,0-1,0.2-1.4,0.6S10,17.9,10,18.5s0.2,1,0.6,1.4C11,20.2,11.5,20.4,12,20.4z" />
|
|
@@ -105,10 +107,10 @@
|
|
|
105
107
|
<!-- ------------------------------------------- -->
|
|
106
108
|
<!-- Conversations (MONITOR) (click)="goToConversations()" -->
|
|
107
109
|
<!-- ------------------------------------------- -->
|
|
108
|
-
<ng-container *ngIf="isVisibleMON">
|
|
109
|
-
<div matTooltipClass="custom-mat-tooltip" matTooltip="Monitor"
|
|
110
|
+
<ng-container *ngIf="isVisibleMON && roles?.[PERMISSIONS.INBOX_READ]">
|
|
111
|
+
<div matTooltipClass="custom-mat-tooltip" matTooltip="{{translationsMap?.get('Monitor')}}"
|
|
110
112
|
#tooltip="matTooltip" matTooltipPosition='right' matTooltipHideDelay="100">
|
|
111
|
-
<a target="_self" href="{{
|
|
113
|
+
<a target="_self" href="{{ URLS.MONITOR }}" class="customAncor">
|
|
112
114
|
<!-- <i class="material-icons sidebar-icons">forum</i> -->
|
|
113
115
|
<span>
|
|
114
116
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" width="24px" height="24px" fill="none">
|
|
@@ -123,13 +125,27 @@
|
|
|
123
125
|
|
|
124
126
|
<div class="nav-custom sidebar-bottom">
|
|
125
127
|
|
|
128
|
+
<!-- ----------------------------- -->
|
|
129
|
+
<!-- WA broadcasts -->
|
|
130
|
+
<!-- ----------------------------- -->
|
|
131
|
+
<ng-container *ngIf="USER_ROLE !== 'agent' && roles?.[PERMISSIONS.AUTOMATIONSLOG_READ]">
|
|
132
|
+
<div matTooltipClass="custom-mat-tooltip" matTooltip="{{translationsMap?.get('WhatsAppBroadcasts')}}"
|
|
133
|
+
#tooltip="matTooltip" matTooltipPosition='right' matTooltipHideDelay="100">
|
|
134
|
+
<a target="_self" href="{{ URLS.WHATSAPP }}" class="customAncor">
|
|
135
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 48 48" height="24" width="24">
|
|
136
|
+
<path fill="none" fill-rule="evenodd" d="M40.6666 7.3156c-2.1744 -2.1755 -4.7577 -3.8995 -7.6012 -5.0726C30.222 1.0699 27.1745 0.4708 24.0986 0.4801 11.1899 0.4801 0.6816 10.936 0.6763 23.79c-0.0057 4.093 1.0733 8.1145 3.1269 11.655L0.48 47.52l12.4163 -3.2413c3.4367 1.8619 7.2841 2.8363 11.193 2.835h0.0094c12.9076 0 23.415 -10.4569 23.4212 -23.31 0.0078 -3.0653 -0.594 -6.1017 -1.7706 -8.9324 -1.1766 -2.8306 -2.9043 -5.399 -5.0827 -7.5557ZM24.0987 43.1794h-0.0084c-3.4845 0.001 -6.9057 -0.9315 -9.9078 -2.7007l-0.7109 -0.42 -7.3678 1.9236 1.9666 -7.1494 -0.463 -0.735C5.659 31.0132 4.6267 27.4386 4.6306 23.79c0 -10.6815 8.7371 -19.3724 19.4754 -19.3724 5.1513 -0.0092 10.0953 2.0281 13.7446 5.6638 3.6493 3.6357 5.705 8.572 5.715 13.7233 -0.0041 10.6827 -8.737 19.3747 -19.4669 19.3747Zm10.6774 -14.51c-0.5849 -0.2919 -3.465 -1.701 -3.9984 -1.8952 -0.5334 -0.1943 -0.9271 -0.292 -1.3167 0.2919 -0.3895 0.5837 -1.512 1.89 -1.8532 2.2837 -0.3413 0.3938 -0.6826 0.4368 -1.2675 0.1449 -0.5847 -0.2918 -2.4716 -0.9062 -4.707 -2.8906 -1.7399 -1.5446 -2.9137 -3.4513 -3.255 -4.0341 -0.3413 -0.5828 -0.0368 -0.8988 0.2561 -1.1886 0.2636 -0.2614 0.5849 -0.6804 0.8779 -1.0206 0.2929 -0.3403 0.3906 -0.5839 0.5848 -0.9723 0.1943 -0.3885 0.0976 -0.7288 -0.0483 -1.0195 -0.1459 -0.2909 -1.3167 -3.1585 -1.8039 -4.325 -0.4757 -1.1361 -0.9576 -0.9818 -1.3167 -0.9996 -0.3413 -0.0168 -0.7349 -0.021 -1.1225 -0.021 -0.2961 0.0077 -0.5875 0.0765 -0.856 0.2018 -0.2685 0.1253 -0.5081 0.3048 -0.7043 0.5269 -0.5364 0.5838 -2.0485 1.995 -2.0485 4.8594s2.1001 5.6364 2.3898 6.0248c0.2899 0.3886 4.1265 6.2717 9.997 8.7948 1.0901 0.4669 2.204 0.8763 3.337 1.2264 1.4017 0.4431 2.6775 0.3812 3.6854 0.2311 1.1246 -0.167 3.4651 -1.4092 3.9512 -2.7699 0.4862 -1.3608 0.4872 -2.5263 0.3413 -2.7689 -0.146 -0.2426 -0.5366 -0.3895 -1.1225 -0.6804Z" clip-rule="evenodd" stroke-width="1"></path>
|
|
137
|
+
</svg>
|
|
138
|
+
</a>
|
|
139
|
+
</div>
|
|
140
|
+
</ng-container>
|
|
141
|
+
|
|
126
142
|
<!-- ------------------------------------------- -->
|
|
127
143
|
<!-- CONTACTS (LEADS) (click)="goToContacts()" -->
|
|
128
144
|
<!-- ------------------------------------------- -->
|
|
129
|
-
<ng-container *ngIf="isVisibleCNT">
|
|
130
|
-
<div matTooltipClass="custom-mat-tooltip" matTooltip="{{
|
|
145
|
+
<ng-container *ngIf="isVisibleCNT && roles?.[PERMISSIONS.LEADS_READ]">
|
|
146
|
+
<div matTooltipClass="custom-mat-tooltip" matTooltip="{{translationsMap?.get('LABEL_CONTACTS')}}"
|
|
131
147
|
#tooltip="matTooltip" matTooltipPosition='right' matTooltipHideDelay="100">
|
|
132
|
-
<a target="_self" href="{{
|
|
148
|
+
<a target="_self" href="{{ URLS.CONTACTS }}" class="customAncor">
|
|
133
149
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" width="24px" height="24px" fill="none">
|
|
134
150
|
<path d="M160-40v-80h640v80H160Zm0-800v-80h640v80H160Zm320 400q50 0 85-35t35-85q0-50-35-85t-85-35q-50 0-85 35t-35 85q0 50 35 85t85 35ZM160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm70-80q45-56 109-88t141-32q77 0 141 32t109 88h70v-480H160v480h70Zm118 0h264q-29-20-62.5-30T480-280q-36 0-69.5 10T348-240Zm132-280q-17 0-28.5-11.5T440-560q0-17 11.5-28.5T480-600q17 0 28.5 11.5T520-560q0 17-11.5 28.5T480-520Zm0 40Z" />
|
|
135
151
|
</svg>
|
|
@@ -141,10 +157,10 @@
|
|
|
141
157
|
<!-- ------------------------------------------- -->
|
|
142
158
|
<!-- ANALYTICS (click)="goToAnalytics()" -->
|
|
143
159
|
<!-- ------------------------------------------- -->
|
|
144
|
-
<ng-container *ngIf="
|
|
145
|
-
<div matTooltipClass="custom-mat-tooltip" matTooltip="{{
|
|
160
|
+
<ng-container *ngIf="USER_ROLE !== 'agent' && isVisibleANA && roles?.[PERMISSIONS.ANALYTICS_READ]">
|
|
161
|
+
<div matTooltipClass="custom-mat-tooltip" matTooltip="{{translationsMap?.get('Analytics')}}"
|
|
146
162
|
#tooltip="matTooltip" matTooltipPosition='right' matTooltipHideDelay="100" >
|
|
147
|
-
<a target="_self" href="{{
|
|
163
|
+
<a target="_self" href="{{ URLS.ANALYTICS }}" class="customAncor">
|
|
148
164
|
<!-- <i class="material-icons sidebar-icons">trending_up</i> -->
|
|
149
165
|
<!-- <i class="material-icons sidebar-icons"> analytics </i> -->
|
|
150
166
|
<!-- <i class="material-icons sidebar-icons"> bar_chart </i> -->
|
|
@@ -160,10 +176,10 @@
|
|
|
160
176
|
<!-- ------------------------------------------- -->
|
|
161
177
|
<!-- ACTIVITIES (click)="goToActivities()" -->
|
|
162
178
|
<!-- ------------------------------------------- -->
|
|
163
|
-
<ng-container *ngIf="isVisibleACT">
|
|
179
|
+
<ng-container *ngIf="isVisibleACT && roles?.[PERMISSIONS.ACTIVITIES_READ]">
|
|
164
180
|
<div *ngIf="USER_ROLE !== 'agent'" matTooltipClass="custom-mat-tooltip"
|
|
165
|
-
matTooltip="{{
|
|
166
|
-
<a target="_self" href="{{
|
|
181
|
+
matTooltip="{{translationsMap?.get('Activities')}}" #tooltip="matTooltip" matTooltipPosition='right' matTooltipHideDelay="100">
|
|
182
|
+
<a target="_self" href="{{ URLS.ACTIVITIES }}" class="customAncor">
|
|
167
183
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" width="24px" height="24px" fill="none">
|
|
168
184
|
<path d="M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h168q13-36 43.5-58t68.5-22q38 0 68.5 22t43.5 58h168q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm80-80h280v-80H280v80Zm0-160h400v-80H280v80Zm0-160h400v-80H280v80Zm200-190q13 0 21.5-8.5T510-820q0-13-8.5-21.5T480-850q-13 0-21.5 8.5T450-820q0 13 8.5 21.5T480-790ZM200-200v-560 560Z" />
|
|
169
185
|
</svg>
|
|
@@ -174,26 +190,30 @@
|
|
|
174
190
|
<!-- ------------------------------------------- -->
|
|
175
191
|
<!-- REQUESTS HISTORY (click)="goToHistory()" -->
|
|
176
192
|
<!-- ------------------------------------------- -->
|
|
177
|
-
<
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
<
|
|
181
|
-
<
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
193
|
+
<ng-container *ngIf="roles?.[PERMISSIONS.HISTORY_READ]">
|
|
194
|
+
<div matTooltipClass="custom-mat-tooltip" matTooltip="{{translationsMap?.get('History')}}"
|
|
195
|
+
#tooltip="matTooltip" matTooltipPosition='right' matTooltipHideDelay="100">
|
|
196
|
+
<a target="_self" href="{{URLS.HISTORY}}" class="customAncor">
|
|
197
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" width="24px" height="24px" fill="none">
|
|
198
|
+
<path d="M480-120q-138 0-240.5-91.5T122-440h82q14 104 92.5 172T480-200q117 0 198.5-81.5T760-480q0-117-81.5-198.5T480-760q-69 0-129 32t-101 88h110v80H120v-240h80v94q51-64 124.5-99T480-840q75 0 140.5 28.5t114 77q48.5 48.5 77 114T840-480q0 75-28.5 140.5t-77 114q-48.5 48.5-114 77T480-120Zm112-192L440-464v-216h80v184l128 128-56 56Z" />
|
|
199
|
+
</svg>
|
|
200
|
+
</a>
|
|
201
|
+
</div>
|
|
202
|
+
</ng-container>
|
|
185
203
|
|
|
186
204
|
<!-- ----------------------------------------------------------------------------------- -->
|
|
187
205
|
<!-- SETTINGS // old: goToSettings_CannedResponses() *ngIf="USER_ROLE !== 'agent'" (click)="goToWidgetSetUpOrToCannedResponses()" -->
|
|
188
206
|
<!-- ----------------------------------------------------------------------------------- -->
|
|
189
|
-
<
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
<
|
|
193
|
-
<
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
207
|
+
<ng-container *ngIf="roles?.[PERMISSIONS.SETTINGS_READ]">
|
|
208
|
+
<div *ngIf="USER_ROLE !== 'agent'" matTooltipClass="custom-mat-tooltip"
|
|
209
|
+
matTooltip="{{translationsMap?.get('Settings')}}" #tooltip="matTooltip" matTooltipPosition='right' matTooltipHideDelay="100">
|
|
210
|
+
<a target="_self" href="{{URLS.SETTINGS}}" class="customAncor">
|
|
211
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -960 960 960" width="24px" height="24px" fill="none">
|
|
212
|
+
<path d="m370-80-16-128q-13-5-24.5-12T307-235l-119 50L78-375l103-78q-1-7-1-13.5v-27q0-6.5 1-13.5L78-585l110-190 119 50q11-8 23-15t24-12l16-128h220l16 128q13 5 24.5 12t22.5 15l119-50 110 190-103 78q1 7 1 13.5v27q0 6.5-2 13.5l103 78-110 190-118-50q-11 8-23 15t-24 12L590-80H370Zm70-80h79l14-106q31-8 57.5-23.5T639-327l99 41 39-68-86-65q5-14 7-29.5t2-31.5q0-16-2-31.5t-7-29.5l86-65-39-68-99 42q-22-23-48.5-38.5T533-694l-13-106h-79l-14 106q-31 8-57.5 23.5T321-633l-99-41-39 68 86 64q-5 15-7 30t-2 32q0 16 2 31t7 30l-86 65 39 68 99-42q22 23 48.5 38.5T427-266l13 106Zm42-180q58 0 99-41t41-99q0-58-41-99t-99-41q-59 0-99.5 41T342-480q0 58 40.5 99t99.5 41Zm-2-140Z" />
|
|
213
|
+
</svg>
|
|
214
|
+
</a>
|
|
215
|
+
</div>
|
|
216
|
+
</ng-container>
|
|
197
217
|
|
|
198
218
|
<div class="sidebar-separator">
|
|
199
219
|
<!-- <i class="material-symbols-outlined sidebar-icons">
|
|
@@ -210,7 +230,7 @@
|
|
|
210
230
|
<!-- ------------------------------------------- -->
|
|
211
231
|
<!-- LOGO BRAND (click)="goToOfficialSite()" -->
|
|
212
232
|
<!-- ------------------------------------------- -->
|
|
213
|
-
<a target="_blank" href="{{
|
|
233
|
+
<a target="_blank" href="{{ URLS.TILEDESK }}" class="customAncor">
|
|
214
234
|
<img [src]="LOGOS_ITEMS['COMPANY_LOGO_NO_TEXT'].icon">
|
|
215
235
|
</a>
|
|
216
236
|
</div>
|
|
@@ -15,7 +15,10 @@ import { tranlatedLanguage } from '../../../chat21-core/utils/constants';
|
|
|
15
15
|
// utils
|
|
16
16
|
import { avatarPlaceholder, getColorBck } from 'src/chat21-core/utils/utils-user';
|
|
17
17
|
import { BRAND_BASE_INFO, LOGOS_ITEMS } from 'src/app/utils/utils-resources';
|
|
18
|
-
import { getOSCode } from 'src/app/utils/utils';
|
|
18
|
+
import { getOSCode, hasRole } from 'src/app/utils/utils';
|
|
19
|
+
import { PERMISSIONS } from 'src/app/utils/permissions.constants';
|
|
20
|
+
import { ProjectUser } from 'src/chat21-core/models/projectUsers';
|
|
21
|
+
import { ProjectUsersService } from 'src/app/services/project_users/project-users.service';
|
|
19
22
|
|
|
20
23
|
@Component({
|
|
21
24
|
selector: 'app-sidebar',
|
|
@@ -31,7 +34,7 @@ export class SidebarComponent implements OnInit {
|
|
|
31
34
|
IS_AVAILABLE: boolean = false;
|
|
32
35
|
IS_INACTIVE: boolean = true;
|
|
33
36
|
IS_BUSY: boolean;
|
|
34
|
-
isVisibleAPP: boolean;
|
|
37
|
+
// isVisibleAPP: boolean;
|
|
35
38
|
isVisibleANA: boolean;
|
|
36
39
|
isVisibleACT: boolean;
|
|
37
40
|
isVisibleMON: boolean;
|
|
@@ -41,9 +44,10 @@ export class SidebarComponent implements OnInit {
|
|
|
41
44
|
project_id: string;
|
|
42
45
|
DASHBOARD_URL: string;
|
|
43
46
|
// HAS_CLICKED_OPEN_USER_DETAIL: boolean = false
|
|
44
|
-
public
|
|
47
|
+
public translationsMap: Map<string, string>;
|
|
45
48
|
public_Key: any;
|
|
46
49
|
conversations_lbl: string;
|
|
50
|
+
whatsappbroadcast_lbl: string;
|
|
47
51
|
contacts_lbl: string;
|
|
48
52
|
apps_lbl: string;
|
|
49
53
|
analytics_lbl: string;
|
|
@@ -53,19 +57,14 @@ export class SidebarComponent implements OnInit {
|
|
|
53
57
|
countClickOnOpenUserDetailSidebar: number = 0
|
|
54
58
|
USER_PHOTO_PROFILE_EXIST: boolean;
|
|
55
59
|
currentUser: any;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
dashboard_app_url: string;
|
|
62
|
-
dashboard_analytics_url: string;
|
|
63
|
-
dashboard_activities_url: string;
|
|
64
|
-
dashboard_history_url: string;
|
|
65
|
-
dashboard_settings_url: string;
|
|
66
|
-
tiledesk_url: string;
|
|
60
|
+
URLS: { [key: string]: string} = {};
|
|
61
|
+
|
|
62
|
+
public projectUser: ProjectUser;
|
|
63
|
+
public roles: { [key: string]: boolean }
|
|
64
|
+
|
|
67
65
|
LOGOS_ITEMS = LOGOS_ITEMS;
|
|
68
66
|
BRAND_BASE_INFO = BRAND_BASE_INFO;
|
|
67
|
+
PERMISSIONS = PERMISSIONS;
|
|
69
68
|
constructor(
|
|
70
69
|
public imageRepoService: ImageRepoService,
|
|
71
70
|
public appStorageService: AppStorageService,
|
|
@@ -75,12 +74,13 @@ export class SidebarComponent implements OnInit {
|
|
|
75
74
|
public wsService: WebsocketService,
|
|
76
75
|
public appConfigProvider: AppConfigProvider,
|
|
77
76
|
private translate: TranslateService,
|
|
77
|
+
public projectUsersService: ProjectUsersService,
|
|
78
78
|
public events: EventsService,
|
|
79
79
|
|
|
80
80
|
) { }
|
|
81
81
|
|
|
82
82
|
ngOnInit() {
|
|
83
|
-
this.
|
|
83
|
+
this.URLS.TILEDESK = BRAND_BASE_INFO['COMPANY_SITE_URL'] as string
|
|
84
84
|
|
|
85
85
|
this.DASHBOARD_URL = this.appConfig.getConfig().dashboardUrl + '#/project/';
|
|
86
86
|
this.getStoredProjectAndUserRole()
|
|
@@ -92,33 +92,36 @@ export class SidebarComponent implements OnInit {
|
|
|
92
92
|
|
|
93
93
|
|
|
94
94
|
getStoredProjectAndUserRole() {
|
|
95
|
-
this.events.subscribe('storage:last_project',project =>{
|
|
95
|
+
this.events.subscribe('storage:last_project',async (project) =>{
|
|
96
96
|
this.logger.log('[SIDEBAR] stored_project ', project)
|
|
97
97
|
if (project && project !== 'undefined') {
|
|
98
98
|
this.project_id = project.id_project.id
|
|
99
99
|
this.USER_ROLE = project.role;
|
|
100
100
|
this.buildURLs(this.USER_ROLE)
|
|
101
|
+
this.projectUser = await this.projectUsersService.getProjectUserByProjectId(project.id_project.id)
|
|
102
|
+
this.roles = this.checkRoles()
|
|
103
|
+
this.logger.log('[SIDEBAR] roles ', this.roles)
|
|
101
104
|
}
|
|
102
105
|
})
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
buildURLs(USER_ROLE) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
this.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
109
|
+
const base = this.DASHBOARD_URL + this.project_id;
|
|
110
|
+
|
|
111
|
+
this.URLS = {
|
|
112
|
+
HOME: `${base}/home`,
|
|
113
|
+
KNOWLEDGEBASE: `${base}/knowledge-bases`,
|
|
114
|
+
BOTS: `${base}/bots`,
|
|
115
|
+
MONITOR: `${base}/wsrequests`,
|
|
116
|
+
WHATSAPP: `${base}/automations`,
|
|
117
|
+
CONTACTS: `${base}/contacts`,
|
|
118
|
+
APPSTORE: `${base}/app-store`,
|
|
119
|
+
ANALYTICS: `${base}/analytics`,
|
|
120
|
+
ACTIVITIES: `${base}/activities`,
|
|
121
|
+
HISTORY: `${base}/history`,
|
|
122
|
+
SETTINGS: USER_ROLE !== 'agent' ? `${base}/widget-set-up` : `${base}/cannedresponses`,
|
|
123
|
+
TILEDESK: 'https://www.tiledesk.com'
|
|
124
|
+
};
|
|
122
125
|
|
|
123
126
|
}
|
|
124
127
|
|
|
@@ -240,6 +243,7 @@ export class SidebarComponent implements OnInit {
|
|
|
240
243
|
this.logger.error('[SIDEBAR] - ngOnInit - currentUser not found in storage ')
|
|
241
244
|
}
|
|
242
245
|
this.translateLabels()
|
|
246
|
+
this.translations()
|
|
243
247
|
}
|
|
244
248
|
|
|
245
249
|
|
|
@@ -256,6 +260,7 @@ export class SidebarComponent implements OnInit {
|
|
|
256
260
|
|
|
257
261
|
this.translate.get(keys).subscribe((text: string) => {
|
|
258
262
|
this.conversations_lbl = text['Conversations'];
|
|
263
|
+
this.whatsappbroadcast_lbl = text['WhatsAppBroadcasts']
|
|
259
264
|
this.contacts_lbl = text['LABEL_CONTACTS']
|
|
260
265
|
this.apps_lbl = text['Apps']
|
|
261
266
|
this.analytics_lbl = text['Analytics']
|
|
@@ -271,13 +276,55 @@ export class SidebarComponent implements OnInit {
|
|
|
271
276
|
|
|
272
277
|
this.isVisibleANA = getOSCode("ANA", this.public_Key);
|
|
273
278
|
this.isVisibleACT = getOSCode("ACT", this.public_Key);
|
|
274
|
-
this.isVisibleAPP = getOSCode("APP", this.public_Key);
|
|
275
279
|
this.isVisibleMON = getOSCode("MON", this.public_Key);
|
|
276
280
|
this.isVisibleCNT = getOSCode("CNT", this.public_Key);
|
|
277
281
|
this.isVisibleKNB = getOSCode("KNB", this.public_Key);
|
|
278
|
-
|
|
282
|
+
|
|
279
283
|
}
|
|
280
284
|
|
|
285
|
+
|
|
286
|
+
checkRoles(): { [key: string]: boolean } {
|
|
287
|
+
const permissionKeys = [
|
|
288
|
+
'HOME_READ',
|
|
289
|
+
'KB_READ',
|
|
290
|
+
'FLOWS_READ',
|
|
291
|
+
'INBOX_READ',
|
|
292
|
+
'AUTOMATIONSLOG_READ',
|
|
293
|
+
'LEADS_READ',
|
|
294
|
+
'ANALYTICS_READ',
|
|
295
|
+
'ACTIVITIES_READ',
|
|
296
|
+
'HISTORY_READ',
|
|
297
|
+
'PROJECTSETTINGS_GENERAL_READ',
|
|
298
|
+
'PROJECTSETTINGS_DEVELOPER_READ',
|
|
299
|
+
'PROJECTSETTINGS_SMARTASSIGNMENT_READ',
|
|
300
|
+
'PROJECTSETTINGS_NOTIFICATION_READ',
|
|
301
|
+
'PROJECTSETTINGS_SECURITY_READ',
|
|
302
|
+
'PROJECTSETTINGS_BANNED_READ',
|
|
303
|
+
'PROJECTSETTINGS_ADVANCED_READ'
|
|
304
|
+
] as const;
|
|
305
|
+
|
|
306
|
+
const roles: { [key: string]: boolean } = {};
|
|
307
|
+
for (const key of permissionKeys) {
|
|
308
|
+
const permission = PERMISSIONS[key];
|
|
309
|
+
roles[permission] = hasRole(this.projectUser, permission);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
let settingRoleKEys = [
|
|
314
|
+
'PROJECTSETTINGS_GENERAL_READ',
|
|
315
|
+
'PROJECTSETTINGS_DEVELOPER_READ',
|
|
316
|
+
'PROJECTSETTINGS_SMARTASSIGNMENT_READ',
|
|
317
|
+
'PROJECTSETTINGS_NOTIFICATION_READ',
|
|
318
|
+
'PROJECTSETTINGS_SECURITY_READ',
|
|
319
|
+
'PROJECTSETTINGS_BANNED_READ',
|
|
320
|
+
'PROJECTSETTINGS_ADVANCED_READ'
|
|
321
|
+
] as const;
|
|
322
|
+
roles[PERMISSIONS.SETTINGS_READ] = settingRoleKEys.some(settingKey => roles[PERMISSIONS[settingKey]]);
|
|
323
|
+
|
|
324
|
+
return roles;
|
|
325
|
+
|
|
326
|
+
}
|
|
327
|
+
|
|
281
328
|
listenTocurrentProjectUserUserAvailability$() {
|
|
282
329
|
this.wsService.currentProjectUserAvailability$.subscribe((data) => {
|
|
283
330
|
this.logger.log('[SIDEBAR] - $UBSC TO WS USER AVAILABILITY & BUSY STATUS RES ', data);
|
|
@@ -327,92 +374,20 @@ export class SidebarComponent implements OnInit {
|
|
|
327
374
|
}
|
|
328
375
|
}
|
|
329
376
|
|
|
330
|
-
goToHome() {
|
|
331
|
-
let url = this.DASHBOARD_URL + this.project_id + '/home'
|
|
332
|
-
this.dashboard_home_url = url;
|
|
333
|
-
const myWindow = window.open(url, '_self');
|
|
334
|
-
myWindow.focus();
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
goToBots() {
|
|
338
|
-
let url = this.DASHBOARD_URL + this.project_id + '/bots/my-chatbots/all'
|
|
339
|
-
const myWindow = window.open(url, '_self');
|
|
340
|
-
myWindow.focus();
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
goToConversations() {
|
|
344
|
-
let url = this.DASHBOARD_URL + this.project_id + '/wsrequests'
|
|
345
|
-
const myWindow = window.open(url, '_self');
|
|
346
|
-
myWindow.focus();
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
goToContacts() {
|
|
350
|
-
let url = this.DASHBOARD_URL + this.project_id + '/contacts'
|
|
351
|
-
const myWindow = window.open(url, '_self');
|
|
352
|
-
myWindow.focus();
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
goToAppStore() {
|
|
356
|
-
let url = this.DASHBOARD_URL + this.project_id + '/app-store'
|
|
357
|
-
const myWindow = window.open(url, '_self');
|
|
358
|
-
myWindow.focus();
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
goToAnalytics() {
|
|
362
|
-
let url = this.DASHBOARD_URL + this.project_id + '/analytics'
|
|
363
|
-
const myWindow = window.open(url, '_self');
|
|
364
|
-
myWindow.focus();
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
goToActivities() {
|
|
368
|
-
let url = this.DASHBOARD_URL + this.project_id + '/activities'
|
|
369
|
-
const myWindow = window.open(url, '_self');
|
|
370
|
-
myWindow.focus();
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
goToHistory() {
|
|
374
|
-
let url = this.DASHBOARD_URL + this.project_id + '/history'
|
|
375
|
-
const myWindow = window.open(url, '_self');
|
|
376
|
-
myWindow.focus();
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
goToWidgetSetUpOrToCannedResponses() {
|
|
380
|
-
if (this.USER_ROLE !== 'agent') {
|
|
381
|
-
this.goToWidgetSetUp()
|
|
382
|
-
} else if (this.USER_ROLE === 'agent') {
|
|
383
|
-
this.goToSettings_CannedResponses()
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
goToWidgetSetUp() {
|
|
388
|
-
let url = this.DASHBOARD_URL + this.project_id + '/widget-set-up'
|
|
389
|
-
const myWindow = window.open(url, '_self');
|
|
390
|
-
myWindow.focus();
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
goToSettings_CannedResponses() {
|
|
394
|
-
let url = this.DASHBOARD_URL + this.project_id + '/cannedresponses'
|
|
395
|
-
const myWindow = window.open(url, '_self');
|
|
396
|
-
myWindow.focus();
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
377
|
public translations() {
|
|
402
378
|
const keys = [
|
|
403
|
-
'
|
|
404
|
-
'
|
|
405
|
-
'
|
|
406
|
-
'
|
|
407
|
-
'
|
|
408
|
-
'
|
|
409
|
-
'
|
|
410
|
-
'
|
|
411
|
-
'
|
|
412
|
-
|
|
413
|
-
"CHANGE_TO_YOUR_STATUS_TO_UNAVAILABLE"
|
|
379
|
+
'Monitor',
|
|
380
|
+
'Flows',
|
|
381
|
+
'Knowledgebases',
|
|
382
|
+
'WhatsAppBroadcasts',
|
|
383
|
+
'LABEL_CONTACTS',
|
|
384
|
+
'Apps',
|
|
385
|
+
'Analytics',
|
|
386
|
+
'Activities',
|
|
387
|
+
'History',
|
|
388
|
+
'Settings'
|
|
414
389
|
];
|
|
415
|
-
this.
|
|
390
|
+
this.translationsMap = this.translateService.translateLanguage(keys);
|
|
416
391
|
}
|
|
417
392
|
|
|
418
393
|
|
|
@@ -81,11 +81,11 @@
|
|
|
81
81
|
[searchable]="false">
|
|
82
82
|
<ng-template ng-label-tmp let-item="item">
|
|
83
83
|
<img style="width: 15px;height: 15px;position: relative; top: 1px;" height="15" width="15" [src]="item?.avatar" />
|
|
84
|
-
<span id="sidebaravatar_{{item.name}}" style="text-transform: capitalize; margin-left:8px"> {{item.label}} </span>
|
|
84
|
+
<span id="sidebaravatar_{{item.name}}" style="text-transform: capitalize; margin-left:8px"> {{item.label | translate}} </span>
|
|
85
85
|
</ng-template>
|
|
86
86
|
<ng-template ng-option-tmp let-item="item" let-index="index">
|
|
87
87
|
<img style="width: 15px;height: 15px;position: relative; top: 1px;" height="15" width="15" [src]="item?.avatar" />
|
|
88
|
-
<span id="sidebaravatar_{{item.name}}" style="text-transform: capitalize; margin-left:8px"> {{item.label}} </span>
|
|
88
|
+
<span id="sidebaravatar_{{item.name}}" style="text-transform: capitalize; margin-left:8px"> {{item.label | translate}} </span>
|
|
89
89
|
</ng-template>
|
|
90
90
|
</ng-select>
|
|
91
91
|
</section>
|
|
@@ -242,9 +242,9 @@ export class SidebarUserDetailsComponent implements OnInit, OnChanges {
|
|
|
242
242
|
.set('SubscriptionPaymentProblem', text['SubscriptionPaymentProblem'])
|
|
243
243
|
.set('ThePlanHasExpired', text['ThePlanHasExpired'])
|
|
244
244
|
|
|
245
|
-
this.teammateStatus.forEach(element => {
|
|
246
|
-
|
|
247
|
-
});
|
|
245
|
+
// this.teammateStatus.forEach(element => {
|
|
246
|
+
// element.label = this.translationsMap.get(element.label)
|
|
247
|
+
// });
|
|
248
248
|
|
|
249
249
|
});
|
|
250
250
|
}
|
|
@@ -261,7 +261,7 @@ export class SidebarUserDetailsComponent implements OnInit, OnChanges {
|
|
|
261
261
|
listenToCurrentStoredProject() {
|
|
262
262
|
this.events.subscribe('storage:last_project', projectObjct => {
|
|
263
263
|
if (projectObjct && projectObjct !== 'undefined') {
|
|
264
|
-
|
|
264
|
+
this.logger.log('[SIDEBAR-USER-DETAILS] - GET STORED PROJECT ', projectObjct)
|
|
265
265
|
|
|
266
266
|
//TODO: recuperare info da root e non da id_project
|
|
267
267
|
this.project = {
|
|
@@ -331,14 +331,14 @@ export class SidebarUserDetailsComponent implements OnInit, OnChanges {
|
|
|
331
331
|
// this.logger.log('teammateStatus ', this.teammateStatus)
|
|
332
332
|
this.selectedStatus = this.teammateStatus[2].id;
|
|
333
333
|
this.logger.debug('[SIDEBAR-USER-DETAILS] - PROFILE_STATUS selected option', this.teammateStatus[2].name);
|
|
334
|
-
this.teammateStatus = this.teammateStatus.slice(0)
|
|
334
|
+
// this.teammateStatus = this.teammateStatus.slice(0)
|
|
335
335
|
} else if (projectUser['user_available'] === false && (projectUser['profileStatus'] === '' || !projectUser['profileStatus'])) {
|
|
336
336
|
this.selectedStatus = this.teammateStatus[1].id;
|
|
337
337
|
this.logger.debug('[SIDEBAR-USER-DETAILS] - PROFILE_STATUS selected option', this.teammateStatus[1].name);
|
|
338
|
-
this.teammateStatus = this.teammateStatus.slice(0)
|
|
338
|
+
// this.teammateStatus = this.teammateStatus.slice(0)
|
|
339
339
|
} else if (projectUser['user_available'] === true && (projectUser['profileStatus'] === '' || !projectUser['profileStatus'])) {
|
|
340
340
|
this.selectedStatus = this.teammateStatus[0].id
|
|
341
|
-
this.teammateStatus = this.teammateStatus.slice(0)
|
|
341
|
+
// this.teammateStatus = this.teammateStatus.slice(0)
|
|
342
342
|
this.logger.debug('[SIDEBAR-USER-DETAILS] - PROFILE_STATUS selected option', this.teammateStatus[0].name);
|
|
343
343
|
}
|
|
344
344
|
this.IS_BUSY = projectUser['isBusy']
|
|
@@ -88,8 +88,8 @@ export class GlobalSettingsService {
|
|
|
88
88
|
this.logger.debug('[GLOBAL-SET] setVariableFromStorage :::::::: SET VARIABLE ---------->', Object.keys(globals));
|
|
89
89
|
for (const key of Object.keys(globals)) {
|
|
90
90
|
const val = this.appStorageService.getItem(key);
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
this.logger.debug('[GLOBAL-SET] setVariableFromStorage SET globals KEY ---------->', key);
|
|
92
|
+
this.logger.debug('[GLOBAL-SET] setVariableFromStorage SET globals VAL ---------->', val);
|
|
93
93
|
if (val && val !== null) {
|
|
94
94
|
// globals.setParameter(key, val);
|
|
95
95
|
globals[key] = stringToBoolean(val);
|
|
@@ -111,8 +111,10 @@ export class GlobalSettingsService {
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
TEMP = getParameterByName(windowContext, 'tiledesk_supportMode');
|
|
114
|
+
console.log('TEMP supportMode', TEMP);
|
|
114
115
|
if (TEMP) {
|
|
115
116
|
globals.supportMode = stringToBoolean(TEMP);
|
|
117
|
+
this.appStorageService.setItem('supportMode', String(globals.supportMode))
|
|
116
118
|
}
|
|
117
119
|
|
|
118
120
|
TEMP = getParameterByName(windowContext, 'tiledesk_lang');
|
|
@@ -138,6 +140,7 @@ export class GlobalSettingsService {
|
|
|
138
140
|
TEMP = getParameterByName(windowContext, 'tiledesk_projectID');
|
|
139
141
|
if (TEMP) {
|
|
140
142
|
globals.projectID = TEMP;
|
|
143
|
+
this.appStorageService.setItem('projectID', TEMP)
|
|
141
144
|
}
|
|
142
145
|
|
|
143
146
|
}
|
|
@@ -22,6 +22,9 @@ import { MatTooltipModule } from '@angular/material/tooltip';
|
|
|
22
22
|
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
|
23
23
|
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
24
24
|
import { SafeHtmlPipe } from '../directives/safe-html.pipe';
|
|
25
|
+
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
|
26
|
+
import { createTranslateLoader } from 'src/chat21-core/utils/utils';
|
|
27
|
+
import { HttpClient } from '@angular/common/http';
|
|
25
28
|
|
|
26
29
|
// import { MessageTextAreaComponent } from '../components/conversation-detail/message-text-area/message-text-area.component'; // MessageTextAreaComponent is part of the declarations ConversationDetailPageModule
|
|
27
30
|
|
|
@@ -140,6 +143,14 @@ import { SafeHtmlPipe } from '../directives/safe-html.pipe';
|
|
|
140
143
|
NgSelectModule,
|
|
141
144
|
FormsModule,
|
|
142
145
|
|
|
146
|
+
TranslateModule.forChild({
|
|
147
|
+
loader: {
|
|
148
|
+
provide: TranslateLoader,
|
|
149
|
+
useFactory: (createTranslateLoader),
|
|
150
|
+
deps: [HttpClient]
|
|
151
|
+
}
|
|
152
|
+
})
|
|
153
|
+
|
|
143
154
|
],
|
|
144
155
|
schemas: [
|
|
145
156
|
CUSTOM_ELEMENTS_SCHEMA,
|
|
@@ -4,6 +4,8 @@ export const PERMISSIONS = {
|
|
|
4
4
|
REQUEST_READ_GROUP: 'request_read_group',
|
|
5
5
|
REQUEST_READ_MY: 'request_read_my',
|
|
6
6
|
|
|
7
|
+
HOME_READ: 'home_read',
|
|
8
|
+
|
|
7
9
|
INBOX_READ: 'inbox_read',
|
|
8
10
|
REQUEST_UPDATE: 'request_update',
|
|
9
11
|
REQUEST_SEND: 'request_send',
|
|
@@ -25,6 +27,8 @@ export const PERMISSIONS = {
|
|
|
25
27
|
|
|
26
28
|
HISTORY_READ: 'history_read',
|
|
27
29
|
|
|
30
|
+
RATING_READ:'rating_read',
|
|
31
|
+
|
|
28
32
|
AUTOMATIONSLOG_READ: "automationslog_read",
|
|
29
33
|
AUTOMATIONSLOG_CREATE: "automationslog_create",
|
|
30
34
|
|
|
@@ -70,18 +74,21 @@ export const PERMISSIONS = {
|
|
|
70
74
|
WIDGETSETUP_READ: 'widgetsetup_read',
|
|
71
75
|
INSTALLATION_READ: 'installation_read',
|
|
72
76
|
TRANSLATIONS_READ: 'translations_read',
|
|
77
|
+
WIDGETSETUP_UPDATE: 'widgetsetup_update',
|
|
78
|
+
|
|
79
|
+
|
|
73
80
|
|
|
74
81
|
DEPARTMENTS_LIST_READ: 'department_list_read',
|
|
75
82
|
DEPARTMENT_DETAIL_READ: 'department_detail_read',
|
|
76
83
|
DEPARTMENT_CREATE_READ: 'department_create_read',
|
|
77
84
|
|
|
78
85
|
TEAMMATES_READ: 'teammates_read',
|
|
79
|
-
|
|
86
|
+
TEAMMATE_UPDATE: 'teammate_update',
|
|
80
87
|
TEAMMATES_CREATE: 'teammates_create',
|
|
81
88
|
ROLES_READ: 'roles_read',
|
|
82
89
|
GROUPS_READ: 'groups_read',
|
|
83
90
|
|
|
84
|
-
|
|
91
|
+
|
|
85
92
|
|
|
86
93
|
EMAIL_TICKETING_READ:'email_ticketing_read',
|
|
87
94
|
EMAIL_TICKETING_UPDATE:'email_ticketing_update',
|
|
@@ -107,29 +114,25 @@ export const PERMISSIONS = {
|
|
|
107
114
|
APPS_READ:'apps_read',
|
|
108
115
|
APPS_UPDATE:'apps_update',
|
|
109
116
|
|
|
117
|
+
SETTINGS_READ: 'settings_read',
|
|
110
118
|
PROJECTSETTINGS_GENERAL_READ: 'projectsettings_general_read',
|
|
111
119
|
PROJECTSETTINGS_GENERAL_UPDATE: 'projectsettings_general_update',
|
|
112
|
-
|
|
113
120
|
PROJECTSETTINGS_SUBSCRIPTION_READ: 'projectsettings_subscription_read',
|
|
114
|
-
|
|
115
121
|
PROJECTSETTINGS_DEVELOPER_READ: 'projectsettings_developer_read',
|
|
116
122
|
PROJECTSETTINGS_DEVELOPER_UPDATE: 'projectsettings_developer_update',
|
|
117
|
-
|
|
118
123
|
PROJECTSETTINGS_SMARTASSIGNMENT_READ: 'projectsettings_smartassignment_read',
|
|
119
124
|
PROJECTSETTINGS_SMARTASSIGNMENT_UPDATE: 'projectsettings_smartassignment_update',
|
|
120
|
-
|
|
121
125
|
PROJECTSETTINGS_NOTIFICATION_READ: 'projectsettings_notification_read',
|
|
122
|
-
|
|
123
126
|
PROJECTSETTINGS_SECURITY_READ: 'projectsettings_security_read',
|
|
124
|
-
|
|
125
127
|
PROJECTSETTINGS_BANNED_READ: 'projectsettings_banned_read',
|
|
126
|
-
|
|
127
128
|
PROJECTSETTINGS_ADVANCED_READ: 'projectsettings_advanced_read',
|
|
128
129
|
|
|
129
|
-
|
|
130
130
|
ACCESS_LISTS: 'accessLists',
|
|
131
131
|
PROFILE_PAGES: 'profilePages',
|
|
132
132
|
LEAD_DATA: 'leadData',
|
|
133
133
|
IMPORT_DATA: 'importData',
|
|
134
|
-
MANAGE_TAGS: 'manageTags'
|
|
134
|
+
MANAGE_TAGS: 'manageTags',
|
|
135
|
+
|
|
136
|
+
CHANGE_PROJECT:'change_project',
|
|
137
|
+
SIMULATE_CONV:'simulate_conv',
|
|
135
138
|
};
|
package/src/assets/i18n/ar.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "مدير",
|
|
226
226
|
"agent": "وكيل",
|
|
227
227
|
"Conversations": "المحادثات",
|
|
228
|
+
"Monitor": "شاشة",
|
|
229
|
+
"Flows": "التدفّقات",
|
|
230
|
+
"Knowledgebases": "قواعد المعرفة",
|
|
231
|
+
"Whatsappbroadcasts": "نشرات WhatsApp",
|
|
228
232
|
"Apps": "تطبيقات",
|
|
229
233
|
"Analytics": "تحليلات",
|
|
230
234
|
"Activities": "أنشطة",
|
package/src/assets/i18n/az.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Administrator",
|
|
226
226
|
"agent": "Agent",
|
|
227
227
|
"Conversations": "Söhbətlər",
|
|
228
|
+
"Monitor": "Monitor",
|
|
229
|
+
"Flows": "Axınlar",
|
|
230
|
+
"Knowledgebases": "Bilik bazaları",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp Yayınları",
|
|
228
232
|
"Apps": "Proqramlar",
|
|
229
233
|
"Analytics": "Analitika",
|
|
230
234
|
"Activities": "Fəaliyyətlər",
|
package/src/assets/i18n/de.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Administrator",
|
|
226
226
|
"agent": "Agent",
|
|
227
227
|
"Conversations": "Gespräche",
|
|
228
|
+
"Monitor": "Monitor",
|
|
229
|
+
"Flows": "Flows",
|
|
230
|
+
"Knowledgebases": "Wissensdatenbanken",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp-Broadcasts",
|
|
228
232
|
"Apps": "Anwendungen",
|
|
229
233
|
"Analytics": "Analytik",
|
|
230
234
|
"Activities": "Aktivitäten",
|
package/src/assets/i18n/en.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Administrator",
|
|
226
226
|
"agent": "Agent",
|
|
227
227
|
"Conversations": "Conversations",
|
|
228
|
+
"Monitor":"Monitor",
|
|
229
|
+
"Flows": "Flows",
|
|
230
|
+
"Knowledgebases": "Knowledge Bases",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp Broadcasts",
|
|
228
232
|
"Apps": "Apps",
|
|
229
233
|
"Analytics": "Analytics",
|
|
230
234
|
"Activities": "Activities",
|
package/src/assets/i18n/es.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Administrador",
|
|
226
226
|
"agent": "Agente",
|
|
227
227
|
"Conversations": "Conversaciones",
|
|
228
|
+
"Monitor": "Monitor",
|
|
229
|
+
"Flows": "Flujos",
|
|
230
|
+
"Knowledgebases": "Bases de Conocimiento",
|
|
231
|
+
"Whatsappbroadcasts": "Difusiones de WhatsApp",
|
|
228
232
|
"Apps":"Aplicaciones",
|
|
229
233
|
"Analytics":"Analíticas",
|
|
230
234
|
"Activities": "Actividades",
|
package/src/assets/i18n/fr.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Administrateur",
|
|
226
226
|
"agent": "Agent",
|
|
227
227
|
"Conversations": "Conversations",
|
|
228
|
+
"Monitor": "Moniteur",
|
|
229
|
+
"Flows": "Flux",
|
|
230
|
+
"Knowledgebases": "Bases de Connaissances",
|
|
231
|
+
"Whatsappbroadcasts": "Diffusions WhatsApp",
|
|
228
232
|
"Apps":"Applications",
|
|
229
233
|
"Analytics":"Analytique",
|
|
230
234
|
"Activities": "Activités",
|
package/src/assets/i18n/it.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Amministratore",
|
|
226
226
|
"agent": "Agente",
|
|
227
227
|
"Conversations": "Conversazioni",
|
|
228
|
+
"Monitor": "Monitor",
|
|
229
|
+
"Flows": "Flussi",
|
|
230
|
+
"Knowledgebases": "Basi di Conoscenza",
|
|
231
|
+
"Whatsappbroadcasts": "Trasmissioni WhatsApp",
|
|
228
232
|
"Apps":"App",
|
|
229
233
|
"Analytics":"Analitica",
|
|
230
234
|
"Activities": "Attività",
|
package/src/assets/i18n/kk.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Әкімші",
|
|
226
226
|
"agent": "Агент",
|
|
227
227
|
"Conversations": "Әңгімелер",
|
|
228
|
+
"Monitor": "Монитор",
|
|
229
|
+
"Flows": "Ағындар",
|
|
230
|
+
"Knowledgebases": "Білім базалары",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp хабарламалары",
|
|
228
232
|
"Apps": "Қолданбалар",
|
|
229
233
|
"Analytics": "Аналитика",
|
|
230
234
|
"Activities": "Іс-шаралар",
|
package/src/assets/i18n/pt.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Administrador",
|
|
226
226
|
"agent": "Agente",
|
|
227
227
|
"Conversations": "Conversas",
|
|
228
|
+
"Monitor": "Monitor",
|
|
229
|
+
"Flows": "Fluxos",
|
|
230
|
+
"Knowledgebases": "Bases de Conhecimento",
|
|
231
|
+
"Whatsappbroadcasts": "Transmissões do WhatsApp",
|
|
228
232
|
"Apps":"Aplicativos",
|
|
229
233
|
"Analytics":"Análise",
|
|
230
234
|
"Activities": "Atividades",
|
package/src/assets/i18n/ru.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Администратор",
|
|
226
226
|
"agent": "Агент",
|
|
227
227
|
"Conversations": "Разговоры",
|
|
228
|
+
"Monitor": "Монитор",
|
|
229
|
+
"Flows": "Потоки",
|
|
230
|
+
"Knowledgebases": "Базы знаний",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp-рассылки",
|
|
228
232
|
"Apps":"Приложения",
|
|
229
233
|
"Analytics":"Аналитика",
|
|
230
234
|
"Activities": "Виды деятельности",
|
package/src/assets/i18n/sr.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Aдминистратор",
|
|
226
226
|
"agent": "Агент",
|
|
227
227
|
"Conversations": "Разговори",
|
|
228
|
+
"Monitor": "Монитор",
|
|
229
|
+
"Flows": "Токови",
|
|
230
|
+
"Knowledgebases": "Baze znanja",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp emitovanja",
|
|
228
232
|
"Apps":"Аппс",
|
|
229
233
|
"Analytics":"Аналитика",
|
|
230
234
|
"Activities": "Активности",
|
package/src/assets/i18n/sv.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Administratör",
|
|
226
226
|
"agent": "Ombud",
|
|
227
227
|
"Conversations": "Samtal",
|
|
228
|
+
"Monitor": "Monitor",
|
|
229
|
+
"Flows": "Flöden",
|
|
230
|
+
"Knowledgebases": "Kunskapsbaser",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp-sändningar",
|
|
228
232
|
"Apps": "Appar",
|
|
229
233
|
"Analytics": "Analytics",
|
|
230
234
|
"Activities": "Aktiviteter",
|
package/src/assets/i18n/tr.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Yönetici",
|
|
226
226
|
"agent": "Ajan",
|
|
227
227
|
"Conversations": "Konuşmalar",
|
|
228
|
+
"Monitor": "Monitör",
|
|
229
|
+
"Flows": "Akışlar",
|
|
230
|
+
"Knowledgebases": "Bilgi Tabanları",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp Yayınları",
|
|
228
232
|
"Apps":"Uygulamalar",
|
|
229
233
|
"Analytics":"Analitik",
|
|
230
234
|
"Activities": "Faaliyetler",
|
package/src/assets/i18n/uk.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Адміністратор",
|
|
226
226
|
"agent": "Агент",
|
|
227
227
|
"Conversations": "Бесіди",
|
|
228
|
+
"Monitor": "Монітор",
|
|
229
|
+
"Flows": "Потоки",
|
|
230
|
+
"Knowledgebases": "Бази знань",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp-розсилки",
|
|
228
232
|
"Apps": "Програми",
|
|
229
233
|
"Analytics": "Аналітика",
|
|
230
234
|
"Activities": "Діяльність",
|
package/src/assets/i18n/uz.json
CHANGED
|
@@ -225,6 +225,10 @@
|
|
|
225
225
|
"admin": "Administrator",
|
|
226
226
|
"agent": "Agent",
|
|
227
227
|
"Conversations": "Suhbatlar",
|
|
228
|
+
"Monitor": "Monitor",
|
|
229
|
+
"Flows": "Oqimlar",
|
|
230
|
+
"Knowledgebases": "Bilim bazalari",
|
|
231
|
+
"Whatsappbroadcasts": "WhatsApp efirlarini yuborish",
|
|
228
232
|
"Apps": "Ilovalar",
|
|
229
233
|
"Analytics": "Analitika",
|
|
230
234
|
"Activities": "Faoliyatlar",
|
|
@@ -177,6 +177,7 @@ export class TiledeskAuthService {
|
|
|
177
177
|
this.currentUser = member;
|
|
178
178
|
this.logger.log('[TILEDESK-AUTH] - createCompleteUser member ', member);
|
|
179
179
|
this.appStorage.setItem('currentUser', JSON.stringify(this.currentUser));
|
|
180
|
+
localStorage.setItem('user', JSON.stringify(this.currentUser));
|
|
180
181
|
|
|
181
182
|
} catch (err) {
|
|
182
183
|
this.logger.error('[TILEDESK-AUTH]- createCompleteUser ERR ', err)
|
|
@@ -1018,6 +1018,14 @@ export function isAllowedUrlInText(text: string, allowedUrls: string[]) {
|
|
|
1018
1018
|
}
|
|
1019
1019
|
|
|
1020
1020
|
function extractUrls(text: string): string[] {
|
|
1021
|
-
|
|
1022
|
-
|
|
1021
|
+
// Rileva URL con o senza protocollo (http/https)
|
|
1022
|
+
const urlRegex = /\b((https?:\/\/)?(www\.)?[a-z0-9.-]+\.[a-z]{2,})(\/[^\s]*)?/gi;
|
|
1023
|
+
const matches = text.match(urlRegex) || [];
|
|
1024
|
+
// Normalizza: aggiunge https:// se manca, così il parsing con new URL() funziona
|
|
1025
|
+
return matches.map((url) => {
|
|
1026
|
+
if (!/^https?:\/\//i.test(url)) {
|
|
1027
|
+
return 'https://' + url;
|
|
1028
|
+
}
|
|
1029
|
+
return url;
|
|
1030
|
+
});
|
|
1023
1031
|
}
|