@chat21/chat21-ionic 3.4.30-rc3 → 3.4.31

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 (69) hide show
  1. package/CHANGELOG.md +7 -122
  2. package/angular.json +0 -1
  3. package/package.json +1 -1
  4. package/src/app/app.component.html +1 -3
  5. package/src/app/app.component.ts +10 -71
  6. package/src/app/components/canned-response/canned-response.component.html +23 -26
  7. package/src/app/components/canned-response/canned-response.component.scss +2 -0
  8. package/src/app/components/canned-response/canned-response.component.ts +1 -3
  9. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +1 -24
  10. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +0 -30
  11. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +7 -29
  12. package/src/app/components/conversation-info/info-content/info-content.component.ts +2 -2
  13. package/src/app/components/conversation-info/info-group/info-group.component.ts +21 -23
  14. package/src/app/components/conversations-list/header-conversations-list/header-conversations-list.component.html +1 -1
  15. package/src/app/components/conversations-list/header-conversations-list/header-conversations-list.component.ts +1 -5
  16. package/src/app/components/navbar/navbar.component.html +3 -3
  17. package/src/app/components/navbar/navbar.component.ts +38 -29
  18. package/src/app/components/project-item/project-item.component.ts +11 -11
  19. package/src/app/components/sidebar/sidebar.component.html +45 -65
  20. package/src/app/components/sidebar/sidebar.component.ts +117 -110
  21. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +2 -2
  22. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +7 -10
  23. package/src/app/directives/html-entities-encode.pipe.ts +20 -5
  24. package/src/app/modals/create-ticket/create-ticket.page.ts +2 -4
  25. package/src/app/pages/conversation-detail/conversation-detail.page.html +3 -7
  26. package/src/app/pages/conversation-detail/conversation-detail.page.ts +5 -89
  27. package/src/app/pages/conversations-list/conversations-list.page.html +0 -2
  28. package/src/app/pages/conversations-list/conversations-list.page.ts +2 -40
  29. package/src/app/services/global-settings/global-settings.service.ts +3 -11
  30. package/src/app/services/nav-proxy.service.ts +1 -0
  31. package/src/app/services/tiledesk/tiledesk.service.ts +16 -0
  32. package/src/app/services/triggerEvents/triggerEvents.ts +0 -28
  33. package/src/app/services/websocket/websocket-js.ts +534 -59
  34. package/src/app/services/websocket/websocket.service.ts +10 -9
  35. package/src/app/shared/shared.module.ts +2 -11
  36. package/src/app/utils/globals.ts +0 -2
  37. package/src/app/utils/project-utils.ts +2 -2
  38. package/src/app/utils/utils.ts +1 -18
  39. package/src/assets/i18n/ar.json +1 -11
  40. package/src/assets/i18n/az.json +1 -11
  41. package/src/assets/i18n/de.json +1 -11
  42. package/src/assets/i18n/en.json +1 -11
  43. package/src/assets/i18n/es.json +1 -11
  44. package/src/assets/i18n/fr.json +1 -11
  45. package/src/assets/i18n/it.json +3 -13
  46. package/src/assets/i18n/kk.json +1 -11
  47. package/src/assets/i18n/pt.json +1 -11
  48. package/src/assets/i18n/ru.json +1 -11
  49. package/src/assets/i18n/sr.json +1 -11
  50. package/src/assets/i18n/sv.json +1 -11
  51. package/src/assets/i18n/tr.json +1 -11
  52. package/src/assets/i18n/uk.json +1 -11
  53. package/src/assets/i18n/uz.json +1 -12
  54. package/src/assets/js/chat21client.js +0 -36
  55. package/src/assets/test.html +2 -5
  56. package/src/chat-config-template.json +0 -1
  57. package/src/chat-config.json +0 -1
  58. package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +1 -1
  59. package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +1 -1
  60. package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +0 -3
  61. package/src/chat21-core/utils/utils.ts +2 -16
  62. package/src/app/services/project_users/project-users.service.spec.ts +0 -16
  63. package/src/app/services/project_users/project-users.service.ts +0 -63
  64. package/src/app/services/websocket/websocket-js_old.ts +0 -578
  65. package/src/app/services/websocket/websocket.worker.ts +0 -242
  66. package/src/app/utils/permissions.constants.ts +0 -138
  67. package/src/assets/js/agentDesktop-sdk.js +0 -55
  68. package/src/assets/js/mqtt-keepalive-worker.js +0 -53
  69. package/src/chat21-core/models/projectUsers.ts +0 -19
package/CHANGELOG.md CHANGED
@@ -8,118 +8,22 @@
8
8
  ### **Copyrigth**:
9
9
  *Tiledesk SRL*
10
10
 
11
- # 3.4.30-rc3
11
+ # 3.4.31 in PROD
12
+ - **changed**: enhance HTML entities encoding by normalizing line breaks and handling null/undefined inputs
13
+ - **changed**: API for upload a file/image into chat
14
+
15
+ # 3.4.30 in PROD
12
16
  - **changed**: when the app is in background, play a sound whenever a new message arrives.
13
17
 
14
18
  # 3.4.29 in PROD
15
19
  - **bug-fixed**: web (Chrome >= 144) `ion-content` stopped scrolling on some pages (conversation list / contacts directory / unassigned); removed the forced `--overflow: hidden` and handled scrolling on Ionic’s internal scroll container via `ion-content::part(scroll)`
16
20
 
17
- # 3.4.29-rc2
18
- - **changed**: minor updates on API to upload file/image into chat
19
-
20
- # 3.4.29-rc1
21
- - **changed**: API for upload a file/image into chat
22
-
23
-
24
21
  # 3.4.28 in PROD
25
22
  - **bug-fixed**: cannot do project subscription if last_project object is not a project_user obj
26
23
 
27
24
  # 3.4.27 in PROD
28
25
  - **bug-fixed**: cannot find route if userFullname contains /
29
26
 
30
- # 3.4.29-rc1
31
- - **bug-fixed**: web (Chrome >= 144) `ion-content` stopped scrolling on some pages (conversation list / contacts directory / unassigned); removed the forced `--overflow: hidden` and handled scrolling on Ionic’s internal scroll container via `ion-content::part(scroll)`
32
-
33
- # 3.4.28-rc1
34
- - **bug-fixed**: cannot do project subscription if last_project object is not a project_user obj
35
-
36
- # 3.4.27-rc26
37
- - **bug-fixed**: wss push requests twice
38
-
39
- # 3.4.27-rc25
40
- - **bug-fixed**: projectUserService is not initialized
41
-
42
- # 3.4.27-rc24
43
- - **added**: implementation of multiple message in wss onmessage
44
-
45
- # 3.4.27-rc23
46
- - **added**: keepAlive worker for MQTT connection
47
-
48
- # 3.4.27-rc22
49
- - **added**: new WsWorker to manage iframe chrome throttling while tab is in background or hidden
50
-
51
- # 3.4.27-rc21
52
- - **changed**: new wss reconnect and timeout keepalive
53
- - **bug-fixed**: cannot route if senderFullaname contains /
54
-
55
- # 3.4.27-rc20
56
- - **added**: onOpenTicketExternally event in triggerEvents service
57
-
58
- # 3.4.27-rc19
59
- - **added**: window.parent['openTicketOnHDA']
60
-
61
- # 3.4.27-rc18
62
- - **added**: triggerOnUpdateNewConversationBadge to update conversation badge count in parent component
63
-
64
- # 3.4.27-rc17
65
- - **bug-fixed**: setNotification not called when click on a conversation
66
-
67
- # 3.4.27-rc16
68
- - **bug-fixed**: setNotification not called when resolve a conversation
69
-
70
- # 3.4.27-rc15
71
- - **changed**: /images with /img in assets folder
72
-
73
- # 3.4.27-rc14
74
- - **added**: DISPLAY_EDIT_PROFILE brand variable
75
- - **bug-fixed**: emojii is sent also if is not allowed
76
-
77
- # 3.4.27-rc13
78
- - **added**: ability to mantain logout parameter when redirect to dashboard urls from sidebar component
79
-
80
- # 3.4.27-rc12
81
- - **added**: ability to manage logOut option in sidebar-user-detail with tiledesk_logOut url query params
82
-
83
- # 3.4.27-rc11
84
- - **bug-fixed**: fixed infinite loading in contact list
85
-
86
- # 3.4.27-rc10
87
- - **added**: ability to manage header-conversation-list with roles
88
- - **bug-fixed**: members in group list not loaded
89
-
90
- # 3.4.27-rc9
91
- - **bug-fixed**: Scrolling to the last message when opening a conversation
92
- - **bug-fixed**: Loading in the conversation list disabled when removing the last conversation
93
-
94
- # 3.4.27-rc8
95
- - **added**: ability to open ticket to external service
96
- - **added**: ticketSection env var
97
-
98
- # 3.4.27-rc7
99
- - **bug-fixed**: Scrolling to the last message when opening a conversation
100
- - **bug-fixed**: Loading in the conversation list disabled when removing the last conversation
101
-
102
- # 3.4.27-rc6
103
- - **bug-fixed**: user for dashboard app is incorrect
104
-
105
- # 3.4.27-rc5
106
- - **added**: managed roles in sidebar e navbar
107
- - **bug-fixed**: projectId and supportMode url is not saved in localstorage
108
-
109
- # 3.4.27-rc4
110
- - **bug-fixed**: extractUrls function is not able to detect url start with www or without https/http
111
- - **bug-fixed**: if message is sent with keydown, error on domain check is not showed
112
-
113
- # 3.4.27-rc3
114
- - **bug-fixed**: cannot set user availability if supportMode is enabled and tiledesk_projectID url params is set
115
-
116
- # 3.4.27-rc2
117
- - **bug-fixed**: cannede responses role
118
-
119
- # 3.4.27-rc1
120
- - **added**: managed canned responses with roles
121
- - **changed**: name in info mesage
122
-
123
27
  # 3.4.26 in PROD
124
28
 
125
29
  # 3.4.26-rc2
@@ -128,7 +32,6 @@
128
32
  # 3.4.26-rc1
129
33
  - **added**: tiledesk_projectID query param to manage user status
130
34
  - **added**: token to managane ticket feature
131
- - **added**: getOsCode login into utils.ts
132
35
 
133
36
  # 3.4.25 in PROD
134
37
  - **changed**: pipe marked to support malicious text input
@@ -151,24 +54,6 @@
151
54
  # 3.4.22 in PROD
152
55
  - **added**: managed allowed_upload_extentions from project settings
153
56
 
154
- # 3.4.21-rc6
155
- - **added**: managed allowed_upload_extentions from project settings
156
-
157
- # 3.4.21-rc5
158
- - **added**: setConversation as read when agent click on it
159
-
160
- # 3.4.21-rc4
161
- - **added**: ability to init and decrement new conversation count badge
162
-
163
- # 3.4.21-rc3
164
- - **changed**: badge notification for agentDesktop
165
-
166
- # 3.4.21-rc2
167
- - **added**: count in newConversation handler event
168
-
169
- # 3.4.21-rc1
170
- - **added**: implement badge notification for agentDesktop sw when new conversation is assigned to logged agent
171
-
172
57
  # 3.4.21 in PROD
173
58
 
174
59
  # 3.4.20 in PROD
@@ -182,8 +67,8 @@
182
67
  - **bug-fixed**: minor fix on ion-texarea element with allowed url domain
183
68
 
184
69
  # 3.4.19-rc1
185
- - **added**: ability to check for if emoji is allowd to be sent in message textarea
186
- - **added**: ability to check for if url domain is allowd to be sent in message textarea
70
+ - added: ability to check for if emoji is allowd to be sent in message textarea
71
+ - added: ability to check for if url domain is allowd to be sent in message textarea
187
72
 
188
73
  # 3.4.18 in PROD
189
74
 
package/angular.json CHANGED
@@ -32,7 +32,6 @@
32
32
  "src/chat-config-template.json",
33
33
  "src/chat-config.json",
34
34
  "src/chat-config-dev.json",
35
- "src/chat-config-native-ar.json",
36
35
  {
37
36
  "glob": "**/*",
38
37
  "input": "src/assets",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chat21/chat21-ionic",
3
3
  "author": "Tiledesk SRL",
4
- "version": "3.4.30-rc3",
4
+ "version": "3.4.31",
5
5
  "license": "MIT License",
6
6
  "homepage": "https://tiledesk.com/",
7
7
  "repository": {
@@ -21,9 +21,7 @@
21
21
  </div> -->
22
22
 
23
23
  <div class="user-details-sidebar" [ngClass]="{'hide-sidebar': IS_ONLINE === false || IS_ON_MOBILE_DEVICE || SUPPORT_MODE === false}">
24
- <app-sidebar-user-details
25
- [logOut]="g?.logOut">
26
- </app-sidebar-user-details>
24
+ <app-sidebar-user-details> </app-sidebar-user-details>
27
25
  </div>
28
26
 
29
27
  <ion-split-pane when="md" contentId="main" [ngClass]="{'mobile': IS_ON_MOBILE_DEVICE, 'sidebar-hidden': IS_ON_MOBILE_DEVICE || SUPPORT_MODE === false}">
@@ -44,9 +44,6 @@ import { conversationToMessage } from 'src/chat21-core/utils/utils-message';
44
44
  import { ProjectService } from './services/projects/project.service';
45
45
  import { ContactsService } from './services/contacts/contacts.service';
46
46
  import { TiledeskService } from './services/tiledesk/tiledesk.service';
47
- import { Project } from 'src/chat21-core/models/projects';
48
- import { BRAND_BASE_INFO } from './utils/utils-resources';
49
- import { ProjectUsersService } from './services/project_users/project-users.service';
50
47
 
51
48
  @Component({
52
49
  selector: 'app-root',
@@ -144,7 +141,6 @@ export class AppComponent implements OnInit {
144
141
  /**TILEDESK SERVICES */
145
142
  private tiledeskService: TiledeskService,
146
143
  private projectService: ProjectService,
147
- private projectUsersService: ProjectUsersService,
148
144
  private contactsService: ContactsService
149
145
  ) {
150
146
 
@@ -171,7 +167,6 @@ export class AppComponent implements OnInit {
171
167
  }, { capture: true });
172
168
  }
173
169
 
174
-
175
170
  listenChatAlreadyOpenWithoutParamsInMobileMode() {
176
171
  this.events.subscribe('noparams:mobile', (isAlreadyOpenInMobileMode) => {
177
172
  // console.log('[APP-COMP] Chat is Already Open In Mobile Mode ', isAlreadyOpenInMobileMode)
@@ -300,10 +295,6 @@ export class AppComponent implements OnInit {
300
295
  this.zone = new NgZone({}); // a cosa serve?
301
296
 
302
297
  this.SUPPORT_MODE = this.g.supportMode
303
- this.logger.info('[APP-COMP] this.SUPPORT_MODE', this.SUPPORT_MODE)
304
-
305
- BRAND_BASE_INFO['LOGOUT_ENABLED'] = this.g.logOut
306
- this.logger.info('[APP-COMP] this.logOut', BRAND_BASE_INFO['LOGOUT_ENABLED'])
307
298
  }
308
299
 
309
300
  });
@@ -340,7 +331,7 @@ export class AppComponent implements OnInit {
340
331
 
341
332
  listenToPostMsgs() {
342
333
  window.addEventListener("message", (event) => {
343
- // this.logger.log("[APP-COMP] message event ", event);
334
+ this.logger.log("[APP-COMP] message event ", event);
344
335
 
345
336
  if (event && event.data && event.data.action && event.data.parameter) {
346
337
  if (event.data.action === 'openJoinConversationModal') {
@@ -542,10 +533,10 @@ export class AppComponent implements OnInit {
542
533
  this.statusBar.styleLightContent();
543
534
  this.navService.init(this.sidebarNav, this.detailNav);
544
535
  this.tiledeskAuthService.initialize(this.appConfigProvider.getConfig().apiUrl);
545
-
536
+ this.messagingAuthService.initialize();
537
+
546
538
  // this.currentUserService.initialize();
547
539
  this.chatManager.initialize();
548
- this.messagingAuthService.initialize();
549
540
  this.presenceService.initialize(this.tenant);
550
541
  this.typingService.initialize(this.tenant);
551
542
 
@@ -871,8 +862,7 @@ export class AppComponent implements OnInit {
871
862
  // console.log('[APP-COMP] PLATFORM', PLATFORM_MOBILE, 'route.snapshot', this.route.snapshot);
872
863
  if (!IDConv) {
873
864
  this.logger.log('[APP-COMP] navigateByUrl -- conversations-list');
874
- const queryString = window.location.search; // restituisce ad es. "?jwt=...&tiledesk_supportMode=false"
875
- this.router.navigateByUrl('conversations-list' + queryString);
865
+ this.router.navigateByUrl('conversations-list')
876
866
  }
877
867
  // this.router.navigateByUrl(pageUrl);
878
868
  // this.navService.setRoot(ConversationListPage, {});
@@ -1123,19 +1113,13 @@ export class AppComponent implements OnInit {
1123
1113
  if (conversation && conversation.is_new === true && this.isInitialized) {
1124
1114
  this.manageTabNotification('conv_added', conversation.sound)
1125
1115
  this.manageEventNewConversation(conversation)
1126
- //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1127
- this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1128
1116
  }
1129
1117
  if(conversation) this.updateConversationsOnStorage()
1130
1118
  });
1131
1119
 
1132
1120
  this.conversationsHandlerService.conversationChanged.subscribe((conversation: ConversationModel) => {
1133
1121
  // console.log('[APP-COMP] ***** subscribeConversationChanged conversation: ', conversation);
1134
- if(conversation){
1135
- this.updateConversationsOnStorage();
1136
- //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1137
- this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1138
- }
1122
+ if(conversation) this.updateConversationsOnStorage();
1139
1123
  });
1140
1124
 
1141
1125
  this.conversationsHandlerService.conversationChangedDetailed.subscribe((changes: {value: ConversationModel, previousValue: ConversationModel}) => {
@@ -1163,8 +1147,6 @@ export class AppComponent implements OnInit {
1163
1147
  if(conversation) {
1164
1148
  this.updateConversationsOnStorage();
1165
1149
  this.segmentResolved(conversation);
1166
- //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1167
- this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1168
1150
  this.router.navigateByUrl('conversation-detail/'); //redirect to basePage
1169
1151
  }
1170
1152
  });
@@ -1198,7 +1180,6 @@ export class AppComponent implements OnInit {
1198
1180
  this.chatManager.setCurrentUser(currentUser);
1199
1181
 
1200
1182
  this.tiledeskService.initialize(serverBaseURL)
1201
- this.projectUsersService.initialize(serverBaseURL)
1202
1183
  this.projectService.initialize(serverBaseURL)
1203
1184
  this.contactsService.initialize(serverBaseURL)
1204
1185
 
@@ -1206,14 +1187,11 @@ export class AppComponent implements OnInit {
1206
1187
  this.events.publish('go:online', true);
1207
1188
  // this.chatManager.startApp();
1208
1189
 
1209
-
1210
- //INIT WEBSOCKET
1211
- this.connetWebsocket(tiledeskToken)
1212
-
1213
1190
  // ----------------------------------------------
1214
1191
  // PUSH NOTIFICATIONS
1215
1192
  // ----------------------------------------------
1216
1193
  const pushEngine = this.appConfigProvider.getConfig().pushEngine
1194
+
1217
1195
  if (currentUser) {
1218
1196
  if (pushEngine && pushEngine !== 'none') {
1219
1197
  this.notificationsService.getNotificationPermissionAndSaveToken(currentUser.uid);
@@ -1235,24 +1213,6 @@ export class AppComponent implements OnInit {
1235
1213
  } catch (err) {
1236
1214
  this.logger.error('[APP-COMP] -> error:', err);
1237
1215
  }
1238
-
1239
- // ----------------------------------------------
1240
- // LAST PROJECT FROM URL
1241
- // ----------------------------------------------
1242
- if(this.g.projectID){
1243
- this.projectService.getProjects().subscribe({ next: (projects: Project[]) => {
1244
- const project = projects.find(prjct => prjct.id_project._id === this.g.projectID)
1245
- if(project){
1246
- this.logger.log('[APP-COMP] - GET PROJECT - project found with this.projectID', project);
1247
- localStorage.setItem('last_project', JSON.stringify(project))
1248
- this.events.publish('storage:last_project', project)
1249
- }
1250
- }, error: (error) => {
1251
- this.logger.log('[APP-COMP] - GET PROJECT - project NOT found with this.projectID', this.g.projectID, error);
1252
- }, complete: () => {
1253
-
1254
- }});
1255
- }
1256
1216
  }
1257
1217
 
1258
1218
 
@@ -1293,21 +1253,9 @@ export class AppComponent implements OnInit {
1293
1253
  }
1294
1254
 
1295
1255
  goToDashboardLogin(){
1296
- // let DASHBOARD_URL = this.appConfigProvider.getConfig().dashboardUrl + '#/login'
1297
- // const myWindow = window.open(DASHBOARD_URL, '_self');
1298
- // myWindow.focus();
1299
- }
1300
-
1301
- connetWebsocket(tiledeskToken) {
1302
-
1303
- this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] tiledeskToken ', tiledeskToken)
1304
- const appconfig = this.appConfigProvider.getConfig();
1305
- this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] wsUrl ', appconfig.wsUrl)
1306
- const WS_URL = appconfig.wsUrl + '?token=' + tiledeskToken
1307
- this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] wsUrl ', WS_URL)
1308
- this.webSocketJs.init(
1309
- WS_URL
1310
- );
1256
+ let DASHBOARD_URL = this.appConfigProvider.getConfig().dashboardUrl + '#/login'
1257
+ const myWindow = window.open(DASHBOARD_URL, '_self');
1258
+ myWindow.focus();
1311
1259
  }
1312
1260
 
1313
1261
 
@@ -1406,8 +1354,7 @@ export class AppComponent implements OnInit {
1406
1354
 
1407
1355
  subscribeConversationSelected= (conversation: ConversationModel) => {
1408
1356
  if(conversation && conversation.is_new){
1409
- this.audio_NewConv.pause();
1410
- this.conversationsHandlerService.setConversationRead(conversation.uid)
1357
+ this.audio_NewConv.pause()
1411
1358
  }
1412
1359
  }
1413
1360
 
@@ -1483,9 +1430,6 @@ export class AppComponent implements OnInit {
1483
1430
  this.logger.debug('[APP-COMP]-CONVS - INIT CONV CONVS 2', conversations)
1484
1431
  this.events.publish('appcompSubscribeToConvs:loadingIsActive', false);
1485
1432
  }
1486
-
1487
- //INIT NOTIFICATION FOR NEW CONVERSATION COUNT
1488
- this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1489
1433
  });
1490
1434
 
1491
1435
  }
@@ -1768,11 +1712,6 @@ export class AppComponent implements OnInit {
1768
1712
  this.triggerEvents.triggerOnInit(detailOBJ)
1769
1713
  }
1770
1714
 
1771
- private triggerOnUpdateNewConversationBadge(count: number){
1772
- const detailOBJ = { event: 'onUpdateNewConversationBadge', count: count.toString() }
1773
- this.triggerEvents.triggerOnUpdateNewConversationBadge(detailOBJ)
1774
- }
1775
-
1776
1715
 
1777
1716
  // @HostListener('mouseenter', ['$event'])
1778
1717
  // onMouseEnter(event: any) {
@@ -1,30 +1,20 @@
1
1
  <div>
2
- <div class="canned-list" *ngIf="!showLoading">
3
- <span *ngIf="tagsCannedFilter.length > 0">
4
- <ion-item button="true" [ngClass]="{'is_active_item': i == arrowkeyLocation}" lines="none"
5
- class="canned-item no-ripple border" id="{{'canned-item_'+ i }}"
6
- *ngFor="let canned of tagsCannedFilter; let i = index;"
7
- (click)="onClickCannedFN(canned, $event)">
8
- <div class="cannedContent">
9
- <ion-input [class.readonly]="canned?.disabled" [readonly]="canned?.disabled" type="text" [(ngModel)]="canned.title" class="title" id="{{'titleCanned_'+canned._id}}" #title></ion-input>
10
- <ion-input [class.readonly]="canned?.disabled" [readonly]="canned?.disabled" type="text" [(ngModel)]="canned.text" class="text truncate"></ion-input>
11
- </div>
12
- <!-- <ion-icon class="canned-item-icon" name="pin" src="assets/img/pin.svg" slot=end *ngIf="canned.pinned" (click)="onPinCanned(canned, $event)"></ion-icon>
13
- <ion-icon class="canned-item-icon" name="pin" src="assets/img/pinned.svg" slot=end (click)="onUnPinCanned(canned, $event)"></ion-icon> -->
14
- <ion-icon class="canned-item-icon" name="checkmark-sharp" slot=end *ngIf="(canned.createdBy === loggedUser.uid && !canned.disabled) && roles[PERMISSIONS.CANNED_RESPONSES_UPDATE]" (click)="onConfirmEditCanned(canned, $event)"></ion-icon>
15
- <ion-icon class="canned-item-icon" name="pencil-sharp" slot=end *ngIf="(canned.createdBy === loggedUser.uid && canned.disabled) && roles[PERMISSIONS.CANNED_RESPONSES_UPDATE]" (click)="onEditCanned(canned, $event)"></ion-icon>
16
- <ion-icon class="canned-item-icon" name="trash-bin-outline" slot=end *ngIf="(canned.createdBy === loggedUser.uid) && roles[PERMISSIONS.CANNED_RESPONSES_DELETE]" (click)="onDeleteCanned(canned, $event)"></ion-icon>
17
- </ion-item>
18
- </span>
19
- <div class="no-data" *ngIf="tagsCannedFilter.length === 0">
20
- <div class="container">
21
- <ion-item button="false" lines="none" class="canned-item no-ripple border">
22
- <ion-icon name="cloud-offline" slot="start"></ion-icon>
23
- <ion-label>{{translationMap.get('THERE_ARE_NO_CANNED_RESPONSES_AVAILABLE')}}</ion-label>
24
- </ion-item>
2
+ <div class="canned-list" *ngIf="tagsCannedFilter.length > 0">
3
+ <ion-item button="true" [ngClass]="{'is_active_item': i == arrowkeyLocation}" lines="none"
4
+ class="canned-item no-ripple border" id="{{'canned-item_'+ i }}"
5
+ *ngFor="let canned of tagsCannedFilter; let i = index;"
6
+ (click)="onClickCannedFN(canned, $event)">
7
+ <div class="cannedContent">
8
+ <ion-input [class.readonly]="canned?.disabled" [readonly]="canned?.disabled" type="text" [(ngModel)]="canned.title" class="title" id="{{'titleCanned_'+canned._id}}" #title></ion-input>
9
+ <ion-input [class.readonly]="canned?.disabled" [readonly]="canned?.disabled" type="text" [(ngModel)]="canned.text" class="text truncate"></ion-input>
25
10
  </div>
26
- </div>
27
- <ion-item *ngIf="roles[PERMISSIONS.CANNED_RESPONSES_CREATE]" class="canned-item add-canned-response-wpr" button="true" lines="none" (click)="onClickAddCannedResponseFN()">
11
+ <!-- <ion-icon class="canned-item-icon" name="pin" src="assets/img/pin.svg" slot=end *ngIf="canned.pinned" (click)="onPinCanned(canned, $event)"></ion-icon>
12
+ <ion-icon class="canned-item-icon" name="pin" src="assets/img/pinned.svg" slot=end (click)="onUnPinCanned(canned, $event)"></ion-icon> -->
13
+ <ion-icon class="canned-item-icon" name="checkmark-sharp" slot=end *ngIf="canned.createdBy === loggedUser.uid && !canned.disabled" (click)="onConfirmEditCanned(canned, $event)"></ion-icon>
14
+ <ion-icon class="canned-item-icon" name="pencil-sharp" slot=end *ngIf="canned.createdBy === loggedUser.uid && canned.disabled" (click)="onEditCanned(canned, $event)"></ion-icon>
15
+ <ion-icon class="canned-item-icon" name="trash-bin-outline" slot=end *ngIf="canned.createdBy === loggedUser.uid" (click)="onDeleteCanned(canned, $event)"></ion-icon>
16
+ </ion-item>
17
+ <ion-item class="canned-item add-canned-response-wpr" button="true" lines="none" (click)="onClickAddCannedResponseFN()">
28
18
  <ion-icon class="add-canned-response-icon" name="flash-outline"></ion-icon>
29
19
  <span class="add-canned-response-add-icon">+</span>
30
20
  <label class="add-canned-response-label" >{{translationMap?.get('AddNewCannedResponse')}}</label>
@@ -43,5 +33,12 @@
43
33
  <div class="label">{{translationMap.get('LABEL_LOADING')}}</div>
44
34
  </div>
45
35
  </div>
46
-
36
+ <div class="no-data" *ngIf="tagsCannedFilter.length === 0 && !showLoading">
37
+ <div class="container">
38
+ <ion-item button="false" lines="none" class="canned-item no-ripple border">
39
+ <ion-icon name="cloud-offline" slot="start"></ion-icon>
40
+ <ion-label>{{translationMap.get('THERE_ARE_NO_CANNED_RESPONSES_AVAILABLE')}}</ion-label>
41
+ </ion-item>
42
+ </div>
43
+ </div>
47
44
  </div>
@@ -278,5 +278,7 @@ ion-item {
278
278
  display: flex;
279
279
  justify-content: center;
280
280
  flex-direction: column;
281
+ align-items: center;
282
+
281
283
  }
282
284
  }
@@ -9,7 +9,6 @@ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk
9
9
  import { compareValues, htmlEntities } from 'src/chat21-core/utils/utils';
10
10
  import { getProjectIdSelectedConversation } from 'src/chat21-core/utils/utils-message';
11
11
  import { PLAN_NAME } from 'src/chat21-core/utils/constants';
12
- import { PERMISSIONS } from 'src/app/utils/permissions.constants';
13
12
 
14
13
  @Component({
15
14
  selector: 'app-canned-response',
@@ -22,7 +21,7 @@ export class CannedResponseComponent implements OnInit {
22
21
  @Input() conversationWith: string;
23
22
  @Input() conversationWithFullname: string;
24
23
  @Input() currentString: string;
25
- @Input() roles: Array<string>;
24
+ @Input() canShowCanned: boolean = true;
26
25
  @Input() stylesMap: Map<string, string>;
27
26
  @Input() translationMap: Map<string, string>;
28
27
  @Output() onLoadedCannedResponses = new EventEmitter<[any]>();
@@ -37,7 +36,6 @@ export class CannedResponseComponent implements OnInit {
37
36
 
38
37
  public arrowkeyLocation = -1
39
38
 
40
- PERMISSIONS = PERMISSIONS
41
39
 
42
40
  private logger: LoggerService = LoggerInstance.getInstance();
43
41
  constructor(
@@ -22,13 +22,6 @@
22
22
  {{translationMap?.get('WHATSAPP.LABEL_TEMPLATES')}}
23
23
  </ion-button>
24
24
  </div>
25
- <!-- OPEN TICKET -->
26
- <div *ngIf="ticketSection" class="section-option" id="template" tooltip="{{translationMap?.get('TICKET.OPEN_TICKET')}}" placement="top">
27
- <ion-button fill="clear" [class.active]="section==='ticket'" (click)="onOpenSection('ticket')" [disabled]="channelType === 'direct'">
28
- <ion-icon name="ticket"></ion-icon>
29
- {{translationMap?.get('TICKET.OPEN_TICKET')}}
30
- </ion-button>
31
- </div>
32
25
  </div>
33
26
 
34
27
  <div class="footerContainerAlert">
@@ -57,22 +50,6 @@
57
50
  </ion-col>
58
51
  </ion-row>
59
52
 
60
- <ion-row id="ticket" [style.display]="section==='ticket'? 'flex': 'none'">
61
- <ion-col col-auto>
62
- <div class="placeholder">{{translationMap.get('TICKET.DESCRIPTION')}}</div>
63
- <div class="buttons-container">
64
- <ion-button name="add" size="small" (click)="onClickTicket('open')">
65
- <ion-icon name="add"></ion-icon>
66
- {{translationMap?.get('TICKET.CONFIRM')}}
67
- </ion-button>
68
- <ion-button size="small" color="danger" (click)="onClickTicket('close')">
69
- <ion-icon name="close"></ion-icon>
70
- {{translationMap?.get('TICKET.CLOSE')}}
71
- </ion-button>
72
- </div>
73
- </ion-col>
74
- </ion-row>
75
-
76
53
  <ion-row id="message-text-area" [style.display]="section==='chat' || section ==='templates' || section ==='copilot'? 'flex': 'none'">
77
54
 
78
55
  <ion-col col-auto style="display: flex;">
@@ -80,7 +57,7 @@
80
57
  <div class="buttons-left">
81
58
 
82
59
  <!-- CANNED RESPONSES -->
83
- <ng-container *ngIf="areVisibleCAR && supportMode && cannedSection">
60
+ <ng-container *ngIf="areVisibleCAR && supportMode">
84
61
  <div class="canned-responses-btn-wpr" tooltip="{{translationMap?.get('CANNED_RESPONSES')}}" placement="top">
85
62
  <ion-button ion-button fill="clear" class="canned-responses-btn" (click)="openCannedResponses()"
86
63
  [disabled]="!conversationWith?.startsWith(CHANNEL_TYPE.SUPPORT_GROUP) || disableTextarea">
@@ -183,36 +183,6 @@
183
183
  }
184
184
  }
185
185
 
186
- #ticket{
187
- text-align: center;
188
- font-size: 12px;
189
-
190
- .buttons-container{
191
- display: flex;
192
- justify-content: center;
193
- gap: 10px;
194
-
195
- ion-button{
196
- font-size: 12px;
197
- --padding-top: 4px;
198
- --padding-bottom: 4px;
199
- --padding-start: 6px;
200
- --padding-end: 6px;
201
- --ripple-color: transparent;
202
- text-transform: unset;
203
- height: auto;
204
-
205
- ion-icon{
206
- margin-right: 4px;
207
- }
208
-
209
- &[name="add"]{
210
- --background: var(--basic-blue);
211
- }
212
- }
213
- }
214
- }
215
-
216
186
  #fileInput {
217
187
  position: absolute;
218
188
  opacity: 0;