@chat21/chat21-ionic 3.4.33 → 3.4.34

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/package.json +1 -1
  3. package/src/app/app.component.ts +3 -0
  4. package/src/app/components/canned-response/canned-response.component.html +26 -23
  5. package/src/app/components/canned-response/canned-response.component.scss +0 -2
  6. package/src/app/components/canned-response/canned-response.component.ts +3 -1
  7. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +1 -1
  8. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +3 -0
  9. package/src/app/components/conversation-info/info-group/info-group.component.ts +23 -21
  10. package/src/app/components/conversations-list/header-conversations-list/header-conversations-list.component.html +1 -1
  11. package/src/app/components/conversations-list/header-conversations-list/header-conversations-list.component.ts +5 -1
  12. package/src/app/components/navbar/navbar.component.html +3 -3
  13. package/src/app/components/navbar/navbar.component.ts +29 -39
  14. package/src/app/components/project-item/project-item.component.ts +1 -1
  15. package/src/app/components/sidebar/sidebar.component.html +64 -64
  16. package/src/app/components/sidebar/sidebar.component.ts +110 -119
  17. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +2 -1
  18. package/src/app/modals/create-ticket/create-ticket.page.ts +4 -2
  19. package/src/app/pages/conversation-detail/conversation-detail.page.html +4 -2
  20. package/src/app/pages/conversation-detail/conversation-detail.page.ts +45 -3
  21. package/src/app/pages/conversations-list/conversations-list.page.html +2 -0
  22. package/src/app/pages/conversations-list/conversations-list.page.ts +36 -4
  23. package/src/app/services/project_users/project-users.service.spec.ts +16 -0
  24. package/src/app/services/project_users/project-users.service.ts +63 -0
  25. package/src/app/services/projects/project.service.ts +1 -1
  26. package/src/app/services/tiledesk/tiledesk.service.ts +0 -17
  27. package/src/app/utils/permissions.constants.ts +138 -0
  28. package/src/app/utils/project-utils.ts +2 -2
  29. package/src/app/utils/utils.ts +17 -0
  30. package/src/assets/i18n/ar.json +4 -0
  31. package/src/assets/i18n/az.json +4 -0
  32. package/src/assets/i18n/de.json +4 -0
  33. package/src/assets/i18n/en.json +4 -0
  34. package/src/assets/i18n/es.json +4 -0
  35. package/src/assets/i18n/fr.json +4 -0
  36. package/src/assets/i18n/it.json +4 -0
  37. package/src/assets/i18n/kk.json +4 -0
  38. package/src/assets/i18n/pt.json +4 -0
  39. package/src/assets/i18n/ru.json +4 -0
  40. package/src/assets/i18n/sr.json +4 -0
  41. package/src/assets/i18n/sv.json +4 -0
  42. package/src/assets/i18n/tr.json +4 -0
  43. package/src/assets/i18n/uk.json +4 -0
  44. package/src/assets/i18n/uz.json +4 -0
  45. package/src/chat21-core/models/{project_user.ts → projectUsers.ts} +13 -11
  46. package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +3 -0
@@ -83,7 +83,10 @@ import { WebsocketService } from 'src/app/services/websocket/websocket.service';
83
83
  import { Project } from 'src/chat21-core/models/projects';
84
84
  import { Globals } from 'src/app/utils/globals';
85
85
  import { ProjectService } from 'src/app/services/projects/project.service';
86
- import { getOSCode } from 'src/app/utils/utils';
86
+ import { ProjectUsersService } from 'src/app/services/project_users/project-users.service';
87
+ import { ProjectUser } from 'src/chat21-core/models/projectUsers';
88
+ import { getOSCode, hasRole } from 'src/app/utils/utils';
89
+ import { PERMISSIONS } from 'src/app/utils/permissions.constants';
87
90
  import { UploadService } from 'src/chat21-core/providers/abstract/upload.service';
88
91
 
89
92
  @Component({
@@ -109,6 +112,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
109
112
  private subscriptions: Array<any>
110
113
  public tenant: string;
111
114
  public loggedUser: UserModel
115
+ public projectUser: ProjectUser;
112
116
  public conversationWith: string
113
117
  public conversationWithFullname: string
114
118
  public messages: Array<MessageModel> = []
@@ -138,6 +142,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
138
142
  public tagsCannedFilter: Array<any> = [];
139
143
  public SHOW_CANNED_RESPONSES: boolean = false
140
144
  public canShowCanned: boolean = true
145
+ public rolesCanned: { [key: string]: boolean }
141
146
 
142
147
  public SHOW_COPILOT_SUGGESTIONS: boolean = false;
143
148
 
@@ -242,6 +247,7 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
242
247
  public toastController: ToastController,
243
248
  public tiledeskService: TiledeskService,
244
249
  public projectService: ProjectService,
250
+ public projectUsersService: ProjectUsersService,
245
251
  private networkService: NetworkService,
246
252
  private events: EventsService,
247
253
  private webSocketService: WebsocketService,
@@ -538,7 +544,6 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
538
544
  this.logger.log('[CONVS-DETAIL] - GET PROJECTID BY CONV RECIPIENT * COMPLETE *',)
539
545
  })
540
546
  }else {
541
- this.canShowCanned = false;
542
547
  this.offlineMsgEmail = false;
543
548
  }
544
549
 
@@ -549,10 +554,13 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
549
554
  this.logger.log('[CONVS-DETAIL] - GET PROJECTID BY CONV RECIPIENT RES', project)
550
555
  if (project) {
551
556
  const projectId = project.id_project
552
- this.canShowCanned = this.projectPlanUtils.checkPlanIsExpired(project)
557
+ this.projectUser = await this.projectUsersService.getProjectUserByProjectId(project._id)
553
558
  this.offlineMsgEmail = this.checkOfflineMsgEmailIsEnabled(project)
554
559
  this.isCopilotEnabled = this.projectPlanUtils.checkProjectProfileFeature(project, 'copilot');
555
560
  this.fileUploadAccept = this.checkAcceptedUploadFile(project)
561
+ this.rolesCanned = this.checkCannedResponsesRoles()
562
+ this.canShowCanned = this.checkCannedResponses(project)
563
+ this.logger.log('[CONVS-DETAIL] this.rolesCanned ', this.canShowCanned)
556
564
  }
557
565
  }, (error) => {
558
566
  this.logger.error('[CONVS-DETAIL] - GET PROJECTID BY CONV RECIPIENT - ERROR ', error)
@@ -590,6 +598,40 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
590
598
  return this.appConfigProvider.getConfig().fileUploadAccept
591
599
  }
592
600
 
601
+ checkCannedResponses(project: Project): boolean {
602
+ let expires = this.projectPlanUtils.checkPlanIsExpired(project)
603
+ this.logger.log('[CONVS-DETAIL] checkCannedResponses expires ', expires)
604
+ if(expires){
605
+ return false
606
+ }
607
+
608
+ let hasRoleToShowCanned = this.rolesCanned[PERMISSIONS.CANNED_RESPONSES_READ]
609
+ this.logger.log('[CONVS-DETAIL] checkCannedResponses hasRoleToShowCanned ', hasRoleToShowCanned)
610
+ if(!hasRoleToShowCanned){
611
+ return false
612
+ }
613
+
614
+ return true
615
+ }
616
+
617
+ checkCannedResponsesRoles(): { [key: string]: boolean } {
618
+ const permissionKeys = [
619
+ 'CANNED_RESPONSES_CREATE',
620
+ 'CANNED_RESPONSES_READ',
621
+ 'CANNED_RESPONSES_UPDATE',
622
+ 'CANNED_RESPONSES_DELETE',
623
+ ] as const;
624
+
625
+ const roles: { [key: string]: boolean } = {};
626
+ for (const key of permissionKeys) {
627
+ const permission = PERMISSIONS[key];
628
+ roles[permission] = hasRole(this.projectUser, permission);
629
+ }
630
+
631
+ return roles;
632
+
633
+ }
634
+
593
635
  // getProjectIdSelectedConversation(conversationWith: string): string{
594
636
  // const conversationWith_segments = conversationWith.split('-')
595
637
  // // Removes the last element of the array if is = to the separator
@@ -7,6 +7,8 @@
7
7
  [sound_btn]="sound_btn"
8
8
  [isMobile]="isMobile"
9
9
  [isVisibleTKT]="isVisibleTKT"
10
+ [isVisibleCNT]="isVisibleCNT"
11
+ [roles]="rolesHeader"
10
12
  (onSoundChange)="onSoundChange($event)"
11
13
  (openContactsDirectory)=openContactsDirectory($event)
12
14
  (openProfileInfo)=openProfileInfo($event)>
@@ -53,10 +53,12 @@ import { Globals } from 'src/app/utils/globals';
53
53
  import { TriggerEvents } from 'src/app/services/triggerEvents/triggerEvents';
54
54
  import { MessageModel } from 'src/chat21-core/models/message';
55
55
  import { Project } from 'src/chat21-core/models/projects';
56
- import { getOSCode } from 'src/app/utils/utils';
57
- import { ProjectService } from 'src/app/services/projects/project.service';
58
-
56
+ import { getOSCode, hasRole } from 'src/app/utils/utils';
57
+ import { PERMISSIONS } from 'src/app/utils/permissions.constants';
58
+ import { ProjectUser } from 'src/chat21-core/models/projectUsers';
59
+ import { ProjectUsersService } from 'src/app/services/project_users/project-users.service';
59
60
  import { PROJECTS_STORAGE_KEY } from 'src/chat21-core/utils/constants';
61
+ import { ProjectService } from 'src/app/services/projects/project.service';
60
62
 
61
63
  @Component({
62
64
  selector: 'app-conversations-list',
@@ -85,6 +87,7 @@ export class ConversationListPage implements OnInit {
85
87
  public archived_btn: boolean
86
88
  public sound_btn: string
87
89
  public isVisibleTKT: boolean = true;
90
+ public isVisibleCNT: boolean = true;;
88
91
  public convertMessage = convertMessage
89
92
  private isShowMenuPage = false
90
93
  private logger: LoggerService = LoggerInstance.getInstance()
@@ -107,6 +110,9 @@ export class ConversationListPage implements OnInit {
107
110
  public isMobile: boolean = false;
108
111
  public isInitialized: boolean = false;
109
112
 
113
+ public projectUser: ProjectUser;
114
+ public rolesHeader: { [key: string]: boolean }
115
+
110
116
  // PROJECT AVAILABILITY INFO: start
111
117
  project: Project
112
118
  profile_name_translated: string;
@@ -133,6 +139,7 @@ export class ConversationListPage implements OnInit {
133
139
  private translateService: CustomTranslateService,
134
140
  public tiledeskService: TiledeskService,
135
141
  public tiledeskAuthService: TiledeskAuthService,
142
+ public projectUsersService: ProjectUsersService,
136
143
  public projectService: ProjectService,
137
144
  public appConfigProvider: AppConfigProvider,
138
145
  public platform: Platform,
@@ -516,7 +523,7 @@ export class ConversationListPage implements OnInit {
516
523
  }
517
524
 
518
525
  listenToCurrentStoredProject() {
519
- this.events.subscribe('storage:last_project', projectObjct => {
526
+ this.events.subscribe('storage:last_project', async(projectObjct) => {
520
527
  if (projectObjct && projectObjct !== 'undefined') {
521
528
  this.logger.log('[CONVS-LIST-PAGE] - GET STORED PROJECT ', projectObjct)
522
529
 
@@ -541,6 +548,10 @@ export class ConversationListPage implements OnInit {
541
548
  } else if (this.project.profile.type === 'payment' && this.project.profile.name === 'enterprise') {
542
549
  this.profile_name_translated = this.translationMapHeader.get('PaydPlanNameEnterprise');
543
550
  }
551
+
552
+ this.projectUser = await this.projectUsersService.getProjectUserByProjectId(this.project._id)
553
+ this.rolesHeader = this.checkCannedResponsesRoles();
554
+ this.logger.log('[CONVS-LIST-PAGE] - GET PROJECT USER ROLES ', this.rolesHeader)
544
555
  }
545
556
  })
546
557
  }
@@ -676,8 +687,24 @@ export class ConversationListPage implements OnInit {
676
687
  const public_Key = this.appConfigProvider.getConfig().t2y12PruGU9wUtEGzBJfolMIgK
677
688
  this.logger.log('[CONVS-LIST-PAGE] AppConfigService getAppConfig public_Key', public_Key)
678
689
  this.isVisibleTKT = getOSCode("TKT", public_Key);
690
+ this.isVisibleCNT = getOSCode("CNT", public_Key);
679
691
  }
680
692
 
693
+ checkCannedResponsesRoles(): { [key: string]: boolean } {
694
+ const permissionKeys = [
695
+ 'LEADS_READ',
696
+ ] as const;
697
+
698
+ const roles: { [key: string]: boolean } = {};
699
+ for (const key of permissionKeys) {
700
+ const permission = PERMISSIONS[key];
701
+ roles[permission] = hasRole(this.projectUser, permission);
702
+ }
703
+
704
+ return roles;
705
+
706
+ }
707
+
681
708
  onBackButtonFN(event) {
682
709
  this.conversationType = 'active'
683
710
 
@@ -939,6 +966,10 @@ export class ConversationListPage implements OnInit {
939
966
 
940
967
  this.logger.log('[CONVS-LIST-PAGE] navigateByUrl this.uidConvSelected ', this.uidConvSelected)
941
968
 
969
+ const queryParams = this.route.snapshot.queryParams;
970
+ const queryString = new URLSearchParams(queryParams).toString();
971
+
972
+
942
973
  this.setUidConvSelected(uidConvSelected, converationType)
943
974
  if (checkPlatformIsMobile()) {
944
975
  this.logger.log('[CONVS-LIST-PAGE] checkPlatformIsMobile(): ', checkPlatformIsMobile())
@@ -956,6 +987,7 @@ export class ConversationListPage implements OnInit {
956
987
  if (this.conversationSelected && this.conversationSelected.conversation_with_fullname) {
957
988
  pageUrl = 'conversation-detail/' + this.uidConvSelected + '/' + encodeURIComponent(this.conversationSelected.conversation_with_fullname) + '/' + converationType
958
989
  }
990
+ pageUrl += queryString ? `?${queryString}` : '';
959
991
  this.logger.log('[CONVS-LIST-PAGE] setUidConvSelected navigateByUrl--->: ', pageUrl)
960
992
  // replace(/\(/g, '%28').replace(/\)/g, '%29') -> used for the encoder of any round brackets
961
993
  this.router.navigateByUrl(pageUrl.replace(/\(/g, '%28').replace(/\)/g, '%29'), {replaceUrl: true})
@@ -0,0 +1,16 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+
3
+ import { ProjectUsersService } from './project-users.service';
4
+
5
+ describe('ProjectUsersService', () => {
6
+ let service: ProjectUsersService;
7
+
8
+ beforeEach(() => {
9
+ TestBed.configureTestingModule({});
10
+ service = TestBed.inject(ProjectUsersService);
11
+ });
12
+
13
+ it('should be created', () => {
14
+ expect(service).toBeTruthy();
15
+ });
16
+ });
@@ -0,0 +1,63 @@
1
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { Observable } from 'rxjs';
4
+ import { map } from 'rxjs/operators';
5
+ import { ProjectUser } from 'src/chat21-core/models/projectUsers';
6
+ import { AppStorageService } from 'src/chat21-core/providers/abstract/app-storage.service';
7
+ import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
8
+ import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
9
+
10
+ @Injectable({
11
+ providedIn: 'root'
12
+ })
13
+ export class ProjectUsersService {
14
+
15
+ private SERVER_BASE_URL: string;
16
+ private tiledeskToken: string;
17
+
18
+ private logger: LoggerService = LoggerInstance.getInstance();
19
+ constructor(
20
+ public http: HttpClient,
21
+ public appStorageService: AppStorageService
22
+ ) {}
23
+
24
+ initialize(serverBaseUrl: string) {
25
+ this.logger.log('[TILEDESK-PROJECT_USERS-SERV] - initialize serverBaseUrl', serverBaseUrl);
26
+ this.SERVER_BASE_URL = serverBaseUrl;
27
+ this.tiledeskToken = this.appStorageService.getItem('tiledeskToken')
28
+ }
29
+
30
+ public getProjectUsersByProjectId(project_id: string): Observable<ProjectUser[]> {
31
+ const url = this.SERVER_BASE_URL + project_id + '/project_users/';
32
+ this.logger.log('[TILEDESK-SERVICE] - GET PROJECT-USER URL', url);
33
+
34
+ const httpOptions = {
35
+ headers: new HttpHeaders({
36
+ 'Content-Type': 'application/json',
37
+ Authorization: this.tiledeskToken
38
+ })
39
+ };
40
+ return this.http.get(url, httpOptions).pipe(map((res: any) => {
41
+ this.logger.log('[TILEDESK-SERVICE] - GET PROJECT-USER RES ', res);
42
+ return res
43
+ }))
44
+ }
45
+
46
+ public getProjectUserByProjectId(project_id: string): Promise<ProjectUser> {
47
+ const url = this.SERVER_BASE_URL + project_id + '/project_users/me';
48
+ this.logger.log('[TILEDESK-SERVICE]- GET PROJECT-USER BY USER-ID - URL', url);
49
+
50
+ const httpOptions = {
51
+ headers: new HttpHeaders({
52
+ 'Content-Type': 'application/json',
53
+ Authorization: this.tiledeskToken
54
+ })
55
+ };
56
+
57
+ return this.http.get(url, httpOptions).pipe(map((res: any) => {
58
+ this.logger.log('[TILEDESK-SERVICE] - GET PROJECT-USER RES ', res);
59
+ return res[0]
60
+ })).toPromise();
61
+ }
62
+
63
+ }
@@ -7,7 +7,7 @@ import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance'
7
7
  import { AppConfigProvider } from '../app-config';
8
8
  import { Observable } from 'rxjs';
9
9
  import { AppStorageService } from 'src/chat21-core/providers/abstract/app-storage.service';
10
- import { ProjectUser } from 'src/chat21-core/models/project_user';
10
+ import { ProjectUser } from 'src/chat21-core/models/projectUsers';
11
11
 
12
12
  @Injectable({
13
13
  providedIn: 'root'
@@ -95,23 +95,6 @@ export class TiledeskService {
95
95
  }))
96
96
  }
97
97
 
98
-
99
- public getProjectUsersByProjectId(project_id: string) {
100
- const url = this.SERVER_BASE_URL + project_id + '/project_users/';
101
- this.logger.log('[TILEDESK-SERVICE] - GET PROJECT-USER URL', url);
102
-
103
- const httpOptions = {
104
- headers: new HttpHeaders({
105
- 'Content-Type': 'application/json',
106
- Authorization: this.tiledeskToken
107
- })
108
- };
109
- return this.http.get(url, httpOptions).pipe(map((res: any) => {
110
- this.logger.log('[TILEDESK-SERVICE] - GET PROJECT-USER RES ', res);
111
- return res
112
- }))
113
- }
114
-
115
98
  public getAllLeadsActiveWithLimit(project_id: string, limit: number) {
116
99
  const url = this.SERVER_BASE_URL + project_id + '/leads?limit=' + limit + '&with_fullname=true';
117
100
  this.logger.log('[TILEDESK-SERVICE] - GET ALL ACTIVE LEADS (LIMIT 10000) - URL', url);
@@ -0,0 +1,138 @@
1
+
2
+ export const PERMISSIONS = {
3
+ REQUEST_READ_ALL: 'request_read_all',
4
+ REQUEST_READ_GROUP: 'request_read_group',
5
+ REQUEST_READ_MY: 'request_read_my',
6
+
7
+ HOME_READ: 'home_read',
8
+
9
+ INBOX_READ: 'inbox_read',
10
+ REQUEST_UPDATE: 'request_update',
11
+ REQUEST_SEND: 'request_send',
12
+ REQUEST_CREATE_TICKET: 'request_create_ticket',
13
+ REQUEST_CLOSE: 'request_close',
14
+ REQUEST_JOIN: 'request_join',
15
+ REQUEST_REOPEN: 'request_reopen',
16
+ REQUEST_DELETE: 'request_delete',
17
+ REQUEST_UPDATE_STATUS: 'request_update_status',
18
+ REQUEST_UPDATE_PRIORITY: 'request_update_priority',
19
+ REQUEST_UPDATE_FOLLOWERS: 'request_update_followers',
20
+ REQUEST_UPDATE_SMART_ASSIGNMENT: 'request_update_smart_assignment',
21
+ REQUEST_UPDATE_TAGS: 'request_update_tags',
22
+ REQUEST_UPDATE_NOTES: 'request_update_notes',
23
+ REQUEST_REASSIGN:'request_reassign',
24
+ REQUEST_ADD:'request_add',
25
+ REQUEST_LEFT: 'request_left',
26
+ REQUEST_TRANSCRIPT_SEND: 'request_transcript_send',
27
+
28
+ HISTORY_READ: 'history_read',
29
+
30
+ RATING_READ:'rating_read',
31
+
32
+ AUTOMATIONSLOG_READ: "automationslog_read",
33
+ AUTOMATIONSLOG_CREATE: "automationslog_create",
34
+
35
+ KB_READ: 'kb_read',
36
+ KB_CONTENTS_ADD:'kb_contents_add',
37
+ KB_CONTENT_UPDATE: 'kb_content_update',
38
+ KB_CONTENT_REINDEX: 'kb_content_reindex',
39
+ KB_CONTENT_CHECK_STATUS: 'kb_content_check_status',
40
+ KB_NAMESPACE_ADD:'kb_namespace_add',
41
+ KB_SETTINGS_EDIT:'kb_settings_edit',
42
+ KB_DELETE: 'kb_delete',
43
+ KB_CONTENTS_EXPORT: 'kb_contents_export',
44
+ // KB_NAMESPACE_DELETE:'kb_namespace_delete',
45
+ // KB_CONTENTS_DELETE:'kb_contents_delete',
46
+
47
+
48
+
49
+ FLOWS_READ: 'flows_read',
50
+ FLOW_ADD: 'flow_add',
51
+ FLOW_EDIT: 'flow_edit',
52
+ FLOW_TEST: 'flow_test',
53
+ FLOW_DUPLICATE: 'flow_duplicate',
54
+ FLOW_DELETE: 'flow_delete',
55
+ FLOW_SHARE: 'flow_share',
56
+ FLOW_EXPORT: 'flow_export',
57
+ FLOW_WEBHOOK_COPY:"flow_webhook_copy",
58
+ FLOW_WEBHOOK_EDIT:"flow_webhook_edit",
59
+ FLOW_WEBHOOK_DELETE:"flow_webhook_delete",
60
+ // FLOW_VIEW_MESSAGE_GRAPH: 'flow_view_message_graph',
61
+
62
+ LEADS_READ: 'leads_read',
63
+ LEAD_UPDATE: 'lead_update',
64
+ LEAD_RESTORE: 'lead_restore',
65
+ LEAD_TRASH: 'lead_trash',
66
+ LEAD_DELETE: 'lead_delete',
67
+ LEADS_EXPORT: 'leads_export',
68
+ LEAD_BAN: 'lead_ban',
69
+ LEAD_UNBAN: 'lead_unban',
70
+
71
+ ANALYTICS_READ: 'analytics_read',
72
+ ACTIVITIES_READ: 'activities_read',
73
+
74
+ WIDGETSETUP_READ: 'widgetsetup_read',
75
+ INSTALLATION_READ: 'installation_read',
76
+ TRANSLATIONS_READ: 'translations_read',
77
+ WIDGETSETUP_UPDATE: 'widgetsetup_update',
78
+
79
+
80
+
81
+ DEPARTMENTS_LIST_READ: 'department_list_read',
82
+ DEPARTMENT_DETAIL_READ: 'department_detail_read',
83
+ DEPARTMENT_CREATE_READ: 'department_create_read',
84
+
85
+ TEAMMATES_READ: 'teammates_read',
86
+ TEAMMATE_UPDATE: 'teammate_update',
87
+ TEAMMATES_CREATE: 'teammates_create',
88
+ ROLES_READ: 'roles_read',
89
+ GROUPS_READ: 'groups_read',
90
+
91
+
92
+
93
+ EMAIL_TICKETING_READ:'email_ticketing_read',
94
+ EMAIL_TICKETING_UPDATE:'email_ticketing_update',
95
+
96
+ CANNED_RESPONSES_READ:'canned_responses_read',
97
+ CANNED_RESPONSES_UPDATE:'canned_responses_update',
98
+ CANNED_RESPONSES_CREATE:'canned_responses_create',
99
+ CANNED_RESPONSES_DELETE:'canned_responses_delete',
100
+
101
+ TAGS_READ:'tags_read',
102
+ TAG_CREATE:'tag_create',
103
+ TAG_DELETE:'tag_delete',
104
+ TAG_UPDATE:'tag_update',
105
+
106
+ HOURS_READ: 'hours_read',
107
+ HOURS_UPDATE: 'hours_update',
108
+ HOURS_DELETE: 'hours_delete',
109
+ HOURS_CREATE: 'hours_create',
110
+
111
+ INTEGRATIONS_READ: 'integrations_read',
112
+ INTEGRATIONS_UPDATE: 'integrations_update',
113
+
114
+ APPS_READ:'apps_read',
115
+ APPS_UPDATE:'apps_update',
116
+
117
+ SETTINGS_READ: 'settings_read',
118
+ PROJECTSETTINGS_GENERAL_READ: 'projectsettings_general_read',
119
+ PROJECTSETTINGS_GENERAL_UPDATE: 'projectsettings_general_update',
120
+ PROJECTSETTINGS_SUBSCRIPTION_READ: 'projectsettings_subscription_read',
121
+ PROJECTSETTINGS_DEVELOPER_READ: 'projectsettings_developer_read',
122
+ PROJECTSETTINGS_DEVELOPER_UPDATE: 'projectsettings_developer_update',
123
+ PROJECTSETTINGS_SMARTASSIGNMENT_READ: 'projectsettings_smartassignment_read',
124
+ PROJECTSETTINGS_SMARTASSIGNMENT_UPDATE: 'projectsettings_smartassignment_update',
125
+ PROJECTSETTINGS_NOTIFICATION_READ: 'projectsettings_notification_read',
126
+ PROJECTSETTINGS_SECURITY_READ: 'projectsettings_security_read',
127
+ PROJECTSETTINGS_BANNED_READ: 'projectsettings_banned_read',
128
+ PROJECTSETTINGS_ADVANCED_READ: 'projectsettings_advanced_read',
129
+
130
+ ACCESS_LISTS: 'accessLists',
131
+ PROFILE_PAGES: 'profilePages',
132
+ LEAD_DATA: 'leadData',
133
+ IMPORT_DATA: 'importData',
134
+ MANAGE_TAGS: 'manageTags',
135
+
136
+ CHANGE_PROJECT:'change_project',
137
+ SIMULATE_CONV:'simulate_conv',
138
+ };
@@ -129,9 +129,9 @@ export class ProjectPlanUtils {
129
129
 
130
130
  //case PAYMENT plan
131
131
  if(project && project.isActiveSubscription && project.profile.type=== 'payment'){
132
- check = true
133
- }else if(project && !project.isActiveSubscription && project.profile.type=== 'payment'){
134
132
  check = false
133
+ }else if(project && !project.isActiveSubscription && project.profile.type=== 'payment'){
134
+ check = true
135
135
  }
136
136
 
137
137
  return check
@@ -1,3 +1,5 @@
1
+ import { ProjectUser } from "src/chat21-core/models/projectUsers";
2
+
1
3
  export function getOSCode(key: string, token: string): boolean {
2
4
 
3
5
  if (token) {
@@ -20,4 +22,19 @@ export function getOSCode(key: string, token: string): boolean {
20
22
  }
21
23
 
22
24
  return false
25
+ }
26
+
27
+
28
+ export function hasRole(projectUser: ProjectUser, role: string ): boolean {
29
+ let roles = ['owner', 'admin', 'agent'];
30
+ if(roles.includes(projectUser.role)){
31
+ return true
32
+ }
33
+
34
+ if(Array.isArray(projectUser.rolePermissions) && projectUser.rolePermissions.includes(role)){
35
+ return true
36
+ }
37
+
38
+ return false
39
+
23
40
  }
@@ -226,6 +226,10 @@
226
226
  "admin": "مدير",
227
227
  "agent": "وكيل",
228
228
  "Conversations": "المحادثات",
229
+ "Monitor": "شاشة",
230
+ "Flows": "التدفّقات",
231
+ "Knowledgebases": "قواعد المعرفة",
232
+ "Whatsappbroadcasts": "نشرات WhatsApp",
229
233
  "Apps": "تطبيقات",
230
234
  "Analytics": "تحليلات",
231
235
  "Activities": "أنشطة",
@@ -226,6 +226,10 @@
226
226
  "admin": "Administrator",
227
227
  "agent": "Agent",
228
228
  "Conversations": "Söhbətlər",
229
+ "Monitor": "Monitor",
230
+ "Flows": "Axınlar",
231
+ "Knowledgebases": "Bilik bazaları",
232
+ "Whatsappbroadcasts": "WhatsApp Yayınları",
229
233
  "Apps": "Proqramlar",
230
234
  "Analytics": "Analitika",
231
235
  "Activities": "Fəaliyyətlər",
@@ -226,6 +226,10 @@
226
226
  "admin": "Administrator",
227
227
  "agent": "Agent",
228
228
  "Conversations": "Gespräche",
229
+ "Monitor": "Monitor",
230
+ "Flows": "Flows",
231
+ "Knowledgebases": "Wissensdatenbanken",
232
+ "Whatsappbroadcasts": "WhatsApp-Broadcasts",
229
233
  "Apps": "Anwendungen",
230
234
  "Analytics": "Analytik",
231
235
  "Activities": "Aktivitäten",
@@ -226,6 +226,10 @@
226
226
  "admin": "Administrator",
227
227
  "agent": "Agent",
228
228
  "Conversations": "Conversations",
229
+ "Monitor":"Monitor",
230
+ "Flows": "Flows",
231
+ "Knowledgebases": "Knowledge Bases",
232
+ "Whatsappbroadcasts": "WhatsApp Broadcasts",
229
233
  "Apps": "Apps",
230
234
  "Analytics": "Analytics",
231
235
  "Activities": "Activities",
@@ -226,6 +226,10 @@
226
226
  "admin": "Administrador",
227
227
  "agent": "Agente",
228
228
  "Conversations": "Conversaciones",
229
+ "Monitor": "Monitor",
230
+ "Flows": "Flujos",
231
+ "Knowledgebases": "Bases de Conocimiento",
232
+ "Whatsappbroadcasts": "Difusiones de WhatsApp",
229
233
  "Apps":"Aplicaciones",
230
234
  "Analytics":"Analíticas",
231
235
  "Activities": "Actividades",
@@ -226,6 +226,10 @@
226
226
  "admin": "Administrateur",
227
227
  "agent": "Agent",
228
228
  "Conversations": "Conversations",
229
+ "Monitor": "Moniteur",
230
+ "Flows": "Flux",
231
+ "Knowledgebases": "Bases de Connaissances",
232
+ "Whatsappbroadcasts": "Diffusions WhatsApp",
229
233
  "Apps":"Applications",
230
234
  "Analytics":"Analytique",
231
235
  "Activities": "Activités",
@@ -226,6 +226,10 @@
226
226
  "admin": "Amministratore",
227
227
  "agent": "Agente",
228
228
  "Conversations": "Conversazioni",
229
+ "Monitor": "Monitor",
230
+ "Flows": "Flussi",
231
+ "Knowledgebases": "Basi di Conoscenza",
232
+ "Whatsappbroadcasts": "Trasmissioni WhatsApp",
229
233
  "Apps":"App",
230
234
  "Analytics":"Analitica",
231
235
  "Activities": "Attività",
@@ -226,6 +226,10 @@
226
226
  "admin": "Әкімші",
227
227
  "agent": "Агент",
228
228
  "Conversations": "Әңгімелер",
229
+ "Monitor": "Монитор",
230
+ "Flows": "Ағындар",
231
+ "Knowledgebases": "Білім базалары",
232
+ "Whatsappbroadcasts": "WhatsApp хабарламалары",
229
233
  "Apps": "Қолданбалар",
230
234
  "Analytics": "Аналитика",
231
235
  "Activities": "Іс-шаралар",
@@ -226,6 +226,10 @@
226
226
  "admin": "Administrador",
227
227
  "agent": "Agente",
228
228
  "Conversations": "Conversas",
229
+ "Monitor": "Monitor",
230
+ "Flows": "Fluxos",
231
+ "Knowledgebases": "Bases de Conhecimento",
232
+ "Whatsappbroadcasts": "Transmissões do WhatsApp",
229
233
  "Apps":"Aplicativos",
230
234
  "Analytics":"Análise",
231
235
  "Activities": "Atividades",
@@ -226,6 +226,10 @@
226
226
  "admin": "Администратор",
227
227
  "agent": "Агент",
228
228
  "Conversations": "Разговоры",
229
+ "Monitor": "Монитор",
230
+ "Flows": "Потоки",
231
+ "Knowledgebases": "Базы знаний",
232
+ "Whatsappbroadcasts": "WhatsApp-рассылки",
229
233
  "Apps":"Приложения",
230
234
  "Analytics":"Аналитика",
231
235
  "Activities": "Виды деятельности",
@@ -226,6 +226,10 @@
226
226
  "admin": "Aдминистратор",
227
227
  "agent": "Агент",
228
228
  "Conversations": "Разговори",
229
+ "Monitor": "Монитор",
230
+ "Flows": "Токови",
231
+ "Knowledgebases": "Baze znanja",
232
+ "Whatsappbroadcasts": "WhatsApp emitovanja",
229
233
  "Apps":"Аппс",
230
234
  "Analytics":"Аналитика",
231
235
  "Activities": "Активности",
@@ -226,6 +226,10 @@
226
226
  "admin": "Administratör",
227
227
  "agent": "Ombud",
228
228
  "Conversations": "Samtal",
229
+ "Monitor": "Monitor",
230
+ "Flows": "Flöden",
231
+ "Knowledgebases": "Kunskapsbaser",
232
+ "Whatsappbroadcasts": "WhatsApp-sändningar",
229
233
  "Apps": "Appar",
230
234
  "Analytics": "Analytics",
231
235
  "Activities": "Aktiviteter",
@@ -226,6 +226,10 @@
226
226
  "admin": "Yönetici",
227
227
  "agent": "Ajan",
228
228
  "Conversations": "Konuşmalar",
229
+ "Monitor": "Monitör",
230
+ "Flows": "Akışlar",
231
+ "Knowledgebases": "Bilgi Tabanları",
232
+ "Whatsappbroadcasts": "WhatsApp Yayınları",
229
233
  "Apps":"Uygulamalar",
230
234
  "Analytics":"Analitik",
231
235
  "Activities": "Faaliyetler",