@chat21/chat21-ionic 3.4.29-rc1 → 3.4.29

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 (68) hide show
  1. package/CHANGELOG.md +6 -109
  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/modals/create-ticket/create-ticket.page.ts +2 -4
  24. package/src/app/pages/conversation-detail/conversation-detail.page.html +3 -7
  25. package/src/app/pages/conversation-detail/conversation-detail.page.ts +5 -89
  26. package/src/app/pages/conversations-list/conversations-list.page.html +0 -2
  27. package/src/app/pages/conversations-list/conversations-list.page.ts +2 -40
  28. package/src/app/services/global-settings/global-settings.service.ts +3 -11
  29. package/src/app/services/nav-proxy.service.ts +1 -0
  30. package/src/app/services/tiledesk/tiledesk.service.ts +16 -0
  31. package/src/app/services/triggerEvents/triggerEvents.ts +0 -28
  32. package/src/app/services/websocket/websocket-js.ts +534 -59
  33. package/src/app/services/websocket/websocket.service.ts +10 -9
  34. package/src/app/shared/shared.module.ts +2 -11
  35. package/src/app/utils/globals.ts +0 -2
  36. package/src/app/utils/project-utils.ts +2 -2
  37. package/src/app/utils/utils.ts +1 -18
  38. package/src/assets/i18n/ar.json +1 -11
  39. package/src/assets/i18n/az.json +1 -11
  40. package/src/assets/i18n/de.json +1 -11
  41. package/src/assets/i18n/en.json +1 -11
  42. package/src/assets/i18n/es.json +1 -11
  43. package/src/assets/i18n/fr.json +1 -11
  44. package/src/assets/i18n/it.json +3 -13
  45. package/src/assets/i18n/kk.json +1 -11
  46. package/src/assets/i18n/pt.json +1 -11
  47. package/src/assets/i18n/ru.json +1 -11
  48. package/src/assets/i18n/sr.json +1 -11
  49. package/src/assets/i18n/sv.json +1 -11
  50. package/src/assets/i18n/tr.json +1 -11
  51. package/src/assets/i18n/uk.json +1 -11
  52. package/src/assets/i18n/uz.json +1 -12
  53. package/src/assets/js/chat21client.js +0 -36
  54. package/src/assets/test.html +2 -5
  55. package/src/chat-config-template.json +0 -1
  56. package/src/chat-config.json +0 -1
  57. package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +1 -1
  58. package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +1 -1
  59. package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +0 -3
  60. package/src/chat21-core/utils/utils.ts +2 -16
  61. package/src/app/services/project_users/project-users.service.spec.ts +0 -16
  62. package/src/app/services/project_users/project-users.service.ts +0 -63
  63. package/src/app/services/websocket/websocket-js_old.ts +0 -578
  64. package/src/app/services/websocket/websocket.worker.ts +0 -242
  65. package/src/app/utils/permissions.constants.ts +0 -138
  66. package/src/assets/js/agentDesktop-sdk.js +0 -55
  67. package/src/assets/js/mqtt-keepalive-worker.js +0 -53
  68. package/src/chat21-core/models/projectUsers.ts +0 -19
package/CHANGELOG.md CHANGED
@@ -8,98 +8,14 @@
8
8
  ### **Copyrigth**:
9
9
  *Tiledesk SRL*
10
10
 
11
- # 3.4.29-rc1
11
+ # 3.4.29 in PROD
12
12
  - **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)`
13
13
 
14
- # 3.4.28-rc1
14
+ # 3.4.28 in PROD
15
15
  - **bug-fixed**: cannot do project subscription if last_project object is not a project_user obj
16
16
 
17
- # 3.4.27-rc26
18
- - **bug-fixed**: wss push requests twice
19
-
20
- # 3.4.27-rc25
21
- - **bug-fixed**: projectUserService is not initialized
22
-
23
- # 3.4.27-rc24
24
- - **added**: implementation of multiple message in wss onmessage
25
-
26
- # 3.4.27-rc23
27
- - **added**: keepAlive worker for MQTT connection
28
-
29
- # 3.4.27-rc22
30
- - **added**: new WsWorker to manage iframe chrome throttling while tab is in background or hidden
31
-
32
- # 3.4.27-rc21
33
- - **changed**: new wss reconnect and timeout keepalive
34
- - **bug-fixed**: cannot route if senderFullaname contains /
35
-
36
- # 3.4.27-rc20
37
- - **added**: onOpenTicketExternally event in triggerEvents service
38
-
39
- # 3.4.27-rc19
40
- - **added**: window.parent['openTicketOnHDA']
41
-
42
- # 3.4.27-rc18
43
- - **added**: triggerOnUpdateNewConversationBadge to update conversation badge count in parent component
44
-
45
- # 3.4.27-rc17
46
- - **bug-fixed**: setNotification not called when click on a conversation
47
-
48
- # 3.4.27-rc16
49
- - **bug-fixed**: setNotification not called when resolve a conversation
50
-
51
- # 3.4.27-rc15
52
- - **changed**: /images with /img in assets folder
53
-
54
- # 3.4.27-rc14
55
- - **added**: DISPLAY_EDIT_PROFILE brand variable
56
- - **bug-fixed**: emojii is sent also if is not allowed
57
-
58
- # 3.4.27-rc13
59
- - **added**: ability to mantain logout parameter when redirect to dashboard urls from sidebar component
60
-
61
- # 3.4.27-rc12
62
- - **added**: ability to manage logOut option in sidebar-user-detail with tiledesk_logOut url query params
63
-
64
- # 3.4.27-rc11
65
- - **bug-fixed**: fixed infinite loading in contact list
66
-
67
- # 3.4.27-rc10
68
- - **added**: ability to manage header-conversation-list with roles
69
- - **bug-fixed**: members in group list not loaded
70
-
71
- # 3.4.27-rc9
72
- - **bug-fixed**: Scrolling to the last message when opening a conversation
73
- - **bug-fixed**: Loading in the conversation list disabled when removing the last conversation
74
-
75
- # 3.4.27-rc8
76
- - **added**: ability to open ticket to external service
77
- - **added**: ticketSection env var
78
-
79
- # 3.4.27-rc7
80
- - **bug-fixed**: Scrolling to the last message when opening a conversation
81
- - **bug-fixed**: Loading in the conversation list disabled when removing the last conversation
82
-
83
- # 3.4.27-rc6
84
- - **bug-fixed**: user for dashboard app is incorrect
85
-
86
- # 3.4.27-rc5
87
- - **added**: managed roles in sidebar e navbar
88
- - **bug-fixed**: projectId and supportMode url is not saved in localstorage
89
-
90
- # 3.4.27-rc4
91
- - **bug-fixed**: extractUrls function is not able to detect url start with www or without https/http
92
- - **bug-fixed**: if message is sent with keydown, error on domain check is not showed
93
-
94
- # 3.4.27-rc3
95
- - **bug-fixed**: cannot set user availability if supportMode is enabled and tiledesk_projectID url params is set
96
-
97
- # 3.4.27-rc2
98
- - **bug-fixed**: cannede responses role
99
-
100
- # 3.4.27-rc1
101
- - **added**: managed canned responses with roles
102
- - **changed**: name in info mesage
17
+ # 3.4.27 in PROD
18
+ - **bug-fixed**: cannot find route if userFullname contains /
103
19
 
104
20
  # 3.4.26 in PROD
105
21
 
@@ -109,7 +25,6 @@
109
25
  # 3.4.26-rc1
110
26
  - **added**: tiledesk_projectID query param to manage user status
111
27
  - **added**: token to managane ticket feature
112
- - **added**: getOsCode login into utils.ts
113
28
 
114
29
  # 3.4.25 in PROD
115
30
  - **changed**: pipe marked to support malicious text input
@@ -132,24 +47,6 @@
132
47
  # 3.4.22 in PROD
133
48
  - **added**: managed allowed_upload_extentions from project settings
134
49
 
135
- # 3.4.21-rc6
136
- - **added**: managed allowed_upload_extentions from project settings
137
-
138
- # 3.4.21-rc5
139
- - **added**: setConversation as read when agent click on it
140
-
141
- # 3.4.21-rc4
142
- - **added**: ability to init and decrement new conversation count badge
143
-
144
- # 3.4.21-rc3
145
- - **changed**: badge notification for agentDesktop
146
-
147
- # 3.4.21-rc2
148
- - **added**: count in newConversation handler event
149
-
150
- # 3.4.21-rc1
151
- - **added**: implement badge notification for agentDesktop sw when new conversation is assigned to logged agent
152
-
153
50
  # 3.4.21 in PROD
154
51
 
155
52
  # 3.4.20 in PROD
@@ -163,8 +60,8 @@
163
60
  - **bug-fixed**: minor fix on ion-texarea element with allowed url domain
164
61
 
165
62
  # 3.4.19-rc1
166
- - **added**: ability to check for if emoji is allowd to be sent in message textarea
167
- - **added**: ability to check for if url domain is allowd to be sent in message textarea
63
+ - added: ability to check for if emoji is allowd to be sent in message textarea
64
+ - added: ability to check for if url domain is allowd to be sent in message textarea
168
65
 
169
66
  # 3.4.18 in PROD
170
67
 
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.29-rc1",
4
+ "version": "3.4.29",
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',
@@ -145,7 +142,6 @@ export class AppComponent implements OnInit {
145
142
  /**TILEDESK SERVICES */
146
143
  private tiledeskService: TiledeskService,
147
144
  private projectService: ProjectService,
148
- private projectUsersService: ProjectUsersService,
149
145
  private contactsService: ContactsService
150
146
  ) {
151
147
 
@@ -172,7 +168,6 @@ export class AppComponent implements OnInit {
172
168
  }, { capture: true });
173
169
  }
174
170
 
175
-
176
171
  listenChatAlreadyOpenWithoutParamsInMobileMode() {
177
172
  this.events.subscribe('noparams:mobile', (isAlreadyOpenInMobileMode) => {
178
173
  // console.log('[APP-COMP] Chat is Already Open In Mobile Mode ', isAlreadyOpenInMobileMode)
@@ -301,10 +296,6 @@ export class AppComponent implements OnInit {
301
296
  this.zone = new NgZone({}); // a cosa serve?
302
297
 
303
298
  this.SUPPORT_MODE = this.g.supportMode
304
- this.logger.info('[APP-COMP] this.SUPPORT_MODE', this.SUPPORT_MODE)
305
-
306
- BRAND_BASE_INFO['LOGOUT_ENABLED'] = this.g.logOut
307
- this.logger.info('[APP-COMP] this.logOut', BRAND_BASE_INFO['LOGOUT_ENABLED'])
308
299
  }
309
300
 
310
301
  });
@@ -341,7 +332,7 @@ export class AppComponent implements OnInit {
341
332
 
342
333
  listenToPostMsgs() {
343
334
  window.addEventListener("message", (event) => {
344
- // this.logger.log("[APP-COMP] message event ", event);
335
+ this.logger.log("[APP-COMP] message event ", event);
345
336
 
346
337
  if (event && event.data && event.data.action && event.data.parameter) {
347
338
  if (event.data.action === 'openJoinConversationModal') {
@@ -543,10 +534,10 @@ export class AppComponent implements OnInit {
543
534
  this.statusBar.styleLightContent();
544
535
  this.navService.init(this.sidebarNav, this.detailNav);
545
536
  this.tiledeskAuthService.initialize(this.appConfigProvider.getConfig().apiUrl);
546
-
537
+ this.messagingAuthService.initialize();
538
+
547
539
  // this.currentUserService.initialize();
548
540
  this.chatManager.initialize();
549
- this.messagingAuthService.initialize();
550
541
  this.presenceService.initialize(this.tenant);
551
542
  this.typingService.initialize(this.tenant);
552
543
 
@@ -873,8 +864,7 @@ export class AppComponent implements OnInit {
873
864
  // console.log('[APP-COMP] PLATFORM', PLATFORM_MOBILE, 'route.snapshot', this.route.snapshot);
874
865
  if (!IDConv) {
875
866
  this.logger.log('[APP-COMP] navigateByUrl -- conversations-list');
876
- const queryString = window.location.search; // restituisce ad es. "?jwt=...&tiledesk_supportMode=false"
877
- this.router.navigateByUrl('conversations-list' + queryString);
867
+ this.router.navigateByUrl('conversations-list')
878
868
  }
879
869
  // this.router.navigateByUrl(pageUrl);
880
870
  // this.navService.setRoot(ConversationListPage, {});
@@ -1125,19 +1115,13 @@ export class AppComponent implements OnInit {
1125
1115
  if (conversation && conversation.is_new === true && this.isInitialized) {
1126
1116
  this.manageTabNotification('conv_added', conversation.sound)
1127
1117
  this.manageEventNewConversation(conversation)
1128
- //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1129
- this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1130
1118
  }
1131
1119
  if(conversation) this.updateConversationsOnStorage()
1132
1120
  });
1133
1121
 
1134
1122
  this.conversationsHandlerService.conversationChanged.subscribe((conversation: ConversationModel) => {
1135
1123
  // console.log('[APP-COMP] ***** subscribeConversationChanged conversation: ', conversation);
1136
- if(conversation){
1137
- this.updateConversationsOnStorage();
1138
- //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1139
- this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1140
- }
1124
+ if(conversation) this.updateConversationsOnStorage();
1141
1125
  });
1142
1126
 
1143
1127
  this.conversationsHandlerService.conversationChangedDetailed.subscribe((changes: {value: ConversationModel, previousValue: ConversationModel}) => {
@@ -1161,8 +1145,6 @@ export class AppComponent implements OnInit {
1161
1145
  if(conversation) {
1162
1146
  this.updateConversationsOnStorage();
1163
1147
  this.segmentResolved(conversation);
1164
- //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1165
- this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1166
1148
  this.router.navigateByUrl('conversation-detail/'); //redirect to basePage
1167
1149
  }
1168
1150
  });
@@ -1196,7 +1178,6 @@ export class AppComponent implements OnInit {
1196
1178
  this.chatManager.setCurrentUser(currentUser);
1197
1179
 
1198
1180
  this.tiledeskService.initialize(serverBaseURL)
1199
- this.projectUsersService.initialize(serverBaseURL)
1200
1181
  this.projectService.initialize(serverBaseURL)
1201
1182
  this.contactsService.initialize(serverBaseURL)
1202
1183
 
@@ -1204,14 +1185,11 @@ export class AppComponent implements OnInit {
1204
1185
  this.events.publish('go:online', true);
1205
1186
  // this.chatManager.startApp();
1206
1187
 
1207
-
1208
- //INIT WEBSOCKET
1209
- this.connetWebsocket(tiledeskToken)
1210
-
1211
1188
  // ----------------------------------------------
1212
1189
  // PUSH NOTIFICATIONS
1213
1190
  // ----------------------------------------------
1214
1191
  const pushEngine = this.appConfigProvider.getConfig().pushEngine
1192
+
1215
1193
  if (currentUser) {
1216
1194
  if (pushEngine && pushEngine !== 'none') {
1217
1195
  this.notificationsService.getNotificationPermissionAndSaveToken(currentUser.uid);
@@ -1233,24 +1211,6 @@ export class AppComponent implements OnInit {
1233
1211
  } catch (err) {
1234
1212
  this.logger.error('[APP-COMP] -> error:', err);
1235
1213
  }
1236
-
1237
- // ----------------------------------------------
1238
- // LAST PROJECT FROM URL
1239
- // ----------------------------------------------
1240
- if(this.g.projectID){
1241
- this.projectService.getProjects().subscribe({ next: (projects: Project[]) => {
1242
- const project = projects.find(prjct => prjct.id_project._id === this.g.projectID)
1243
- if(project){
1244
- this.logger.log('[APP-COMP] - GET PROJECT - project found with this.projectID', project);
1245
- localStorage.setItem('last_project', JSON.stringify(project))
1246
- this.events.publish('storage:last_project', project)
1247
- }
1248
- }, error: (error) => {
1249
- this.logger.log('[APP-COMP] - GET PROJECT - project NOT found with this.projectID', this.g.projectID, error);
1250
- }, complete: () => {
1251
-
1252
- }});
1253
- }
1254
1214
  }
1255
1215
 
1256
1216
 
@@ -1291,21 +1251,9 @@ export class AppComponent implements OnInit {
1291
1251
  }
1292
1252
 
1293
1253
  goToDashboardLogin(){
1294
- // let DASHBOARD_URL = this.appConfigProvider.getConfig().dashboardUrl + '#/login'
1295
- // const myWindow = window.open(DASHBOARD_URL, '_self');
1296
- // myWindow.focus();
1297
- }
1298
-
1299
- connetWebsocket(tiledeskToken) {
1300
-
1301
- this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] tiledeskToken ', tiledeskToken)
1302
- const appconfig = this.appConfigProvider.getConfig();
1303
- this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] wsUrl ', appconfig.wsUrl)
1304
- const WS_URL = appconfig.wsUrl + '?token=' + tiledeskToken
1305
- this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] wsUrl ', WS_URL)
1306
- this.webSocketJs.init(
1307
- WS_URL
1308
- );
1254
+ let DASHBOARD_URL = this.appConfigProvider.getConfig().dashboardUrl + '#/login'
1255
+ const myWindow = window.open(DASHBOARD_URL, '_self');
1256
+ myWindow.focus();
1309
1257
  }
1310
1258
 
1311
1259
 
@@ -1404,8 +1352,7 @@ export class AppComponent implements OnInit {
1404
1352
 
1405
1353
  subscribeConversationSelected= (conversation: ConversationModel) => {
1406
1354
  if(conversation && conversation.is_new){
1407
- this.audio_NewConv.pause();
1408
- this.conversationsHandlerService.setConversationRead(conversation.uid)
1355
+ this.audio_NewConv.pause()
1409
1356
  }
1410
1357
  }
1411
1358
 
@@ -1481,9 +1428,6 @@ export class AppComponent implements OnInit {
1481
1428
  this.logger.debug('[APP-COMP]-CONVS - INIT CONV CONVS 2', conversations)
1482
1429
  this.events.publish('appcompSubscribeToConvs:loadingIsActive', false);
1483
1430
  }
1484
-
1485
- //INIT NOTIFICATION FOR NEW CONVERSATION COUNT
1486
- this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1487
1431
  });
1488
1432
 
1489
1433
  }
@@ -1766,11 +1710,6 @@ export class AppComponent implements OnInit {
1766
1710
  this.triggerEvents.triggerOnInit(detailOBJ)
1767
1711
  }
1768
1712
 
1769
- private triggerOnUpdateNewConversationBadge(count: number){
1770
- const detailOBJ = { event: 'onUpdateNewConversationBadge', count: count.toString() }
1771
- this.triggerEvents.triggerOnUpdateNewConversationBadge(detailOBJ)
1772
- }
1773
-
1774
1713
 
1775
1714
  // @HostListener('mouseenter', ['$event'])
1776
1715
  // 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;
@@ -26,7 +26,6 @@ import { CopilotService } from 'src/app/services/copilot/copilot.service';
26
26
  import { BRAND_BASE_INFO } from 'src/app/utils/utils-resources';
27
27
  import { ProjectService } from 'src/app/services/projects/project.service';
28
28
  import { Project } from 'src/chat21-core/models/projects';
29
- import { ProjectUser } from 'src/chat21-core/models/projectUsers';
30
29
 
31
30
 
32
31
  @Component({
@@ -50,7 +49,6 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
50
49
  @ViewChild('fileInput', { static: false }) fileInput: any;
51
50
 
52
51
  @Input() loggedUser: UserModel;
53
- @Input() projectUser: ProjectUser;
54
52
  @Input() conversationWith: string;
55
53
  @Input() channelType: string;
56
54
  @Input() channel: string;
@@ -63,20 +61,16 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
63
61
  @Input() emailSection: boolean;
64
62
  @Input() offlineMsgEmail: boolean;
65
63
  @Input() whatsappTemplatesSection: boolean;
66
- @Input() ticketSection: boolean
67
64
  @Input() isOpenInfoConversation: boolean;
68
- @Input() cannedSection: boolean;
69
65
  @Input() stylesMap: Map<string, string>;
70
66
  @Input() translationMap: Map<string, string>;
71
67
  @Input() dropEvent: any;
72
68
  @Input() disableTextarea: boolean;
73
- @Input() roles: Array<string>;
74
69
  @Output() eventChangeTextArea = new EventEmitter<{msg: string, offsetHeight: number}>();
75
70
  @Output() eventSendMessage = new EventEmitter<{msg: string, type: string, metadata?: Object, attributes?: Object}>();
76
71
  @Output() onClickOpenCannedResponses = new EventEmitter<boolean>();
77
72
  @Output() onPresentModalScrollToBottom = new EventEmitter<boolean>();
78
73
  @Output() onOpenFooterSection = new EventEmitter<string>();
79
- @Output() onOpenTicket = new EventEmitter<boolean>();
80
74
 
81
75
  public project: Project;
82
76
  public conversationEnabled = false;
@@ -294,17 +288,6 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
294
288
  this.prensentTemplateModal();
295
289
  }
296
290
 
297
- onClickTicket(option: "open" | "close"){
298
- this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] - onClickTicket', option);
299
- switch(option){
300
- case "open":
301
- this.onOpenTicket.emit();
302
- case "close":
303
- this.section = 'chat'
304
- }
305
-
306
- }
307
-
308
291
 
309
292
  /**
310
293
  *
@@ -584,10 +567,8 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
584
567
  if (!text.includes("/")) {
585
568
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 1 message: ', message);
586
569
  this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 1 message: ", message);
587
-
570
+ this.messageString = '';
588
571
  this.sendMessage(text);
589
- // this.messageString = '';
590
-
591
572
  this.countClicks = 0
592
573
  } else if (text.includes("/") && pos === 0 && this.countClicks > 1 && this.tagsCannedFilter.length > 0) {
593
574
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - tagsCannedFilter.length 2: ', this.tagsCannedFilter.length);
@@ -599,10 +580,9 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
599
580
  this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
600
581
  this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
601
582
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 2 message: ', message);
602
-
603
- this.sendMessage(text);
604
- // this.messageString = '';
583
+ this.messageString = '';
605
584
 
585
+ this.sendMessage(text);
606
586
  this.countClicks = 0
607
587
  } else if (text.includes("/") && pos > 0 && this.countClicks > 1 && this.tagsCannedFilter.length > 0 && text.substr(-1) !== '/') {
608
588
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - tagsCannedFilter.length 3: ', this.tagsCannedFilter.length);
@@ -614,19 +594,17 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
614
594
  this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
615
595
  this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
616
596
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 2 message: ', message);
617
-
618
- this.sendMessage(text);
619
- // this.messageString = '';
597
+ this.messageString = '';
620
598
 
599
+ this.sendMessage(text);
621
600
  this.countClicks = 0
622
601
  } else if (text.includes("/") && this.tagsCannedFilter.length === 0) {
623
602
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - tagsCannedFilter.length 3: ', this.tagsCannedFilter.length);
624
603
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 3 message: ', message);
625
604
  this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 3 message: ", message);
626
-
627
- this.sendMessage(text);
628
- // this.messageString = '';
605
+ this.messageString = '';
629
606
 
607
+ this.sendMessage(text);
630
608
  this.countClicks = 0
631
609
 
632
610
  }