@chat21/chat21-ionic 3.4.27-rc2 → 3.4.27-rc20

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 (151) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/angular.json +1 -0
  3. package/package.json +1 -1
  4. package/src/app/app.component.html +3 -1
  5. package/src/app/app.component.ts +68 -18
  6. package/src/app/chatlib/conversation-detail/conversation-content/conversation-content.component.scss +3 -3
  7. package/src/app/chatlib/conversation-detail/conversation-content/conversation-content.component.ts +1 -1
  8. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +1 -1
  9. package/src/app/chatlib/conversation-detail/message/avatar/avatar.component.html +1 -1
  10. package/src/app/chatlib/conversation-detail/message/avatar/avatar.component.ts +4 -4
  11. package/src/app/chatlib/conversation-detail/message/return-receipt/return-receipt.component.scss +3 -3
  12. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +9 -9
  13. package/src/app/components/bubbleMessageInfo-popover/bubbleinfo-popover.component.html +1 -1
  14. package/src/app/components/canned-response/canned-response.component.html +2 -2
  15. package/src/app/components/canned-response/canned-response.component.scss +0 -2
  16. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +8 -8
  17. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +23 -0
  18. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +30 -0
  19. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +35 -7
  20. package/src/app/components/conversation-info/info-group/info-group.component.ts +23 -21
  21. package/src/app/components/conversations-list/header-conversations-list/header-conversations-list.component.html +1 -1
  22. package/src/app/components/conversations-list/header-conversations-list/header-conversations-list.component.ts +5 -1
  23. package/src/app/components/copilot-popover/copilot-popover.component.html +1 -1
  24. package/src/app/components/navbar/navbar.component.html +3 -3
  25. package/src/app/components/navbar/navbar.component.ts +29 -38
  26. package/src/app/components/project-item/project-item.component.ts +11 -11
  27. package/src/app/components/sidebar/sidebar.component.html +67 -47
  28. package/src/app/components/sidebar/sidebar.component.ts +110 -117
  29. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +4 -4
  30. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +17 -14
  31. package/src/app/modals/create-ticket/create-ticket.page.html +6 -6
  32. package/src/app/modals/create-ticket/create-ticket.page.ts +4 -4
  33. package/src/app/modals/loader-preview/loader-preview.page.ts +1 -1
  34. package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.scss +1 -1
  35. package/src/app/pages/conversation-detail/conversation-detail.page.html +3 -1
  36. package/src/app/pages/conversation-detail/conversation-detail.page.scss +1 -1
  37. package/src/app/pages/conversation-detail/conversation-detail.page.ts +45 -3
  38. package/src/app/pages/conversations-list/conversations-list.page.html +2 -0
  39. package/src/app/pages/conversations-list/conversations-list.page.ts +46 -6
  40. package/src/app/pages/profile-info/profile-info.page.ts +3 -3
  41. package/src/app/services/brand/brand.service.ts +5 -5
  42. package/src/app/services/global-settings/global-settings.service.ts +12 -3
  43. package/src/app/services/triggerEvents/triggerEvents.ts +28 -0
  44. package/src/app/shared/shared.module.ts +11 -0
  45. package/src/app/utils/globals.ts +2 -0
  46. package/src/app/utils/permissions.constants.ts +14 -11
  47. package/src/app/utils/utils-resources.ts +8 -7
  48. package/src/assets/i18n/ar.json +11 -1
  49. package/src/assets/i18n/az.json +11 -1
  50. package/src/assets/i18n/de.json +11 -1
  51. package/src/assets/i18n/en.json +11 -1
  52. package/src/assets/i18n/es.json +11 -1
  53. package/src/assets/i18n/fr.json +11 -1
  54. package/src/assets/i18n/it.json +13 -3
  55. package/src/assets/i18n/kk.json +11 -1
  56. package/src/assets/i18n/pt.json +11 -1
  57. package/src/assets/i18n/ru.json +11 -1
  58. package/src/assets/i18n/sr.json +11 -1
  59. package/src/assets/i18n/sv.json +11 -1
  60. package/src/assets/i18n/tr.json +11 -1
  61. package/src/assets/i18n/uk.json +11 -1
  62. package/src/assets/i18n/uz.json +12 -1
  63. package/src/assets/js/agentDesktop-sdk.js +55 -0
  64. package/src/chat-config-template.json +1 -0
  65. package/src/chat-config.json +1 -0
  66. package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +3 -0
  67. package/src/chat21-core/utils/constants.ts +2 -2
  68. package/src/chat21-core/utils/utils.ts +16 -2
  69. /package/src/assets/{images → img}/channel_icons/chat21.svg +0 -0
  70. /package/src/assets/{images → img}/channel_icons/direct.svg +0 -0
  71. /package/src/assets/{images → img}/channel_icons/email-logo.svg +0 -0
  72. /package/src/assets/{images → img}/channel_icons/form-logo_v2.svg +0 -0
  73. /package/src/assets/{images → img}/channel_icons/group.svg +0 -0
  74. /package/src/assets/{images → img}/channel_icons/messenger-logo.svg +0 -0
  75. /package/src/assets/{images → img}/channel_icons/telegram-logo.svg +0 -0
  76. /package/src/assets/{images → img}/channel_icons/voice.svg +0 -0
  77. /package/src/assets/{images → img}/channel_icons/whatsapp-logo.svg +0 -0
  78. /package/src/assets/{images → img}/default-avatar-x-select.png +0 -0
  79. /package/src/assets/{images → img}/f21ico-done.svg +0 -0
  80. /package/src/assets/{images → img}/f21ico-done_all.svg +0 -0
  81. /package/src/assets/{images → img}/f21ico-schedule.svg +0 -0
  82. /package/src/assets/{images → img}/file-alt-solid.png +0 -0
  83. /package/src/assets/{images → img}/icons/copilot.svg +0 -0
  84. /package/src/assets/{images → img}/json-file.svg +0 -0
  85. /package/src/assets/{images → img}/language_flag/ar.png +0 -0
  86. /package/src/assets/{images → img}/language_flag/az.png +0 -0
  87. /package/src/assets/{images → img}/language_flag/bg.png +0 -0
  88. /package/src/assets/{images → img}/language_flag/ca.png +0 -0
  89. /package/src/assets/{images → img}/language_flag/cs.png +0 -0
  90. /package/src/assets/{images → img}/language_flag/da.png +0 -0
  91. /package/src/assets/{images → img}/language_flag/de.png +0 -0
  92. /package/src/assets/{images → img}/language_flag/el.png +0 -0
  93. /package/src/assets/{images → img}/language_flag/en.png +0 -0
  94. /package/src/assets/{images → img}/language_flag/es.png +0 -0
  95. /package/src/assets/{images → img}/language_flag/fa.png +0 -0
  96. /package/src/assets/{images → img}/language_flag/fi.png +0 -0
  97. /package/src/assets/{images → img}/language_flag/fr.png +0 -0
  98. /package/src/assets/{images → img}/language_flag/he.png +0 -0
  99. /package/src/assets/{images → img}/language_flag/hi.png +0 -0
  100. /package/src/assets/{images → img}/language_flag/hr.png +0 -0
  101. /package/src/assets/{images → img}/language_flag/hu.png +0 -0
  102. /package/src/assets/{images → img}/language_flag/id.png +0 -0
  103. /package/src/assets/{images → img}/language_flag/it.png +0 -0
  104. /package/src/assets/{images → img}/language_flag/ja.png +0 -0
  105. /package/src/assets/{images → img}/language_flag/kk.png +0 -0
  106. /package/src/assets/{images → img}/language_flag/ko.png +0 -0
  107. /package/src/assets/{images → img}/language_flag/ml-IN.png +0 -0
  108. /package/src/assets/{images → img}/language_flag/ne-NP.png +0 -0
  109. /package/src/assets/{images → img}/language_flag/nl.png +0 -0
  110. /package/src/assets/{images → img}/language_flag/no.png +0 -0
  111. /package/src/assets/{images → img}/language_flag/pl.png +0 -0
  112. /package/src/assets/{images → img}/language_flag/pt-BR.png +0 -0
  113. /package/src/assets/{images → img}/language_flag/pt.png +0 -0
  114. /package/src/assets/{images → img}/language_flag/ro.png +0 -0
  115. /package/src/assets/{images → img}/language_flag/ru.png +0 -0
  116. /package/src/assets/{images → img}/language_flag/sk.png +0 -0
  117. /package/src/assets/{images → img}/language_flag/sl.png +0 -0
  118. /package/src/assets/{images → img}/language_flag/sr.png +0 -0
  119. /package/src/assets/{images → img}/language_flag/sv.png +0 -0
  120. /package/src/assets/{images → img}/language_flag/ta.png +0 -0
  121. /package/src/assets/{images → img}/language_flag/th.png +0 -0
  122. /package/src/assets/{images → img}/language_flag/tr.png +0 -0
  123. /package/src/assets/{images → img}/language_flag/uk.png +0 -0
  124. /package/src/assets/{images → img}/language_flag/uz.png +0 -0
  125. /package/src/assets/{images → img}/language_flag/vi.png +0 -0
  126. /package/src/assets/{images → img}/language_flag/zh-CN.png +0 -0
  127. /package/src/assets/{images → img}/language_flag/zh-TW.png +0 -0
  128. /package/src/assets/{logos → img/logos}/chat21-logo.png +0 -0
  129. /package/src/assets/{logos → img/logos}/logo.png +0 -0
  130. /package/src/assets/{logos → img/logos}/tiledesk-logo_new_white.svg +0 -0
  131. /package/src/assets/{logos → img/logos}/tiledesk-solo-logo.png +0 -0
  132. /package/src/assets/{logos → img/logos}/tiledesk_logo.svg +0 -0
  133. /package/src/assets/{logos → img/logos}/tiledesk_logo_no_text.svg +0 -0
  134. /package/src/assets/{logos → img/logos}/tiledesk_logo_white_small.svg +0 -0
  135. /package/src/assets/{images → img}/no_conversation.jpg +0 -0
  136. /package/src/assets/{images → img}/no_image.png +0 -0
  137. /package/src/assets/{images → img}/no_image_user.png +0 -0
  138. /package/src/assets/{images → img}/pin.svg +0 -0
  139. /package/src/assets/{images → img}/pinned.svg +0 -0
  140. /package/src/assets/{images → img}/priority_icons/high.svg +0 -0
  141. /package/src/assets/{images → img}/priority_icons/high_v2.svg +0 -0
  142. /package/src/assets/{images → img}/priority_icons/low.svg +0 -0
  143. /package/src/assets/{images → img}/priority_icons/low_v2.svg +0 -0
  144. /package/src/assets/{images → img}/priority_icons/medium.svg +0 -0
  145. /package/src/assets/{images → img}/priority_icons/medium_v2.svg +0 -0
  146. /package/src/assets/{images → img}/priority_icons/urgent.svg +0 -0
  147. /package/src/assets/{images → img}/priority_icons/urgent_v2.svg +0 -0
  148. /package/src/assets/{images → img}/teammate-status/avaible.svg +0 -0
  149. /package/src/assets/{images → img}/teammate-status/inactive.svg +0 -0
  150. /package/src/assets/{images → img}/teammate-status/unavaible.svg +0 -0
  151. /package/src/assets/{images → img}/whatsapp_background.png +0 -0
package/CHANGELOG.md CHANGED
@@ -8,6 +8,67 @@
8
8
  ### **Copyrigth**:
9
9
  *Tiledesk SRL*
10
10
 
11
+ # 3.4.27-rc20
12
+ - **added**: onOpenTicketExternally event in triggerEvents service
13
+
14
+ # 3.4.27-rc19
15
+ - **added**: window.parent['openTicketOnHDA']
16
+
17
+ # 3.4.27-rc18
18
+ - **added**: triggerOnUpdateNewConversationBadge to update conversation badge count in parent component
19
+
20
+ # 3.4.27-rc17
21
+ - **bug-fixed**: setNotification not called when click on a conversation
22
+
23
+ # 3.4.27-rc16
24
+ - **bug-fixed**: setNotification not called when resolve a conversation
25
+
26
+ # 3.4.27-rc15
27
+ - **changed**: /images with /img in assets folder
28
+
29
+ # 3.4.27-rc14
30
+ - **added**: DISPLAY_EDIT_PROFILE brand variable
31
+ - **bug-fixed**: emojii is sent also if is not allowed
32
+
33
+ # 3.4.27-rc13
34
+ - **added**: ability to mantain logout parameter when redirect to dashboard urls from sidebar component
35
+
36
+ # 3.4.27-rc12
37
+ - **added**: ability to manage logOut option in sidebar-user-detail with tiledesk_logOut url query params
38
+
39
+ # 3.4.27-rc11
40
+ - **bug-fixed**: fixed infinite loading in contact list
41
+
42
+ # 3.4.27-rc10
43
+ - **added**: ability to manage header-conversation-list with roles
44
+ - **bug-fixed**: members in group list not loaded
45
+
46
+ # 3.4.27-rc9
47
+ - **bug-fixed**: Scrolling to the last message when opening a conversation
48
+ - **bug-fixed**: Loading in the conversation list disabled when removing the last conversation
49
+
50
+ # 3.4.27-rc8
51
+ - **added**: ability to open ticket to external service
52
+ - **added**: ticketSection env var
53
+
54
+ # 3.4.27-rc7
55
+ - **bug-fixed**: Scrolling to the last message when opening a conversation
56
+ - **bug-fixed**: Loading in the conversation list disabled when removing the last conversation
57
+
58
+ # 3.4.27-rc6
59
+ - **bug-fixed**: user for dashboard app is incorrect
60
+
61
+ # 3.4.27-rc5
62
+ - **added**: managed roles in sidebar e navbar
63
+ - **bug-fixed**: projectId and supportMode url is not saved in localstorage
64
+
65
+ # 3.4.27-rc4
66
+ - **bug-fixed**: extractUrls function is not able to detect url start with www or without https/http
67
+ - **bug-fixed**: if message is sent with keydown, error on domain check is not showed
68
+
69
+ # 3.4.27-rc3
70
+ - **bug-fixed**: cannot set user availability if supportMode is enabled and tiledesk_projectID url params is set
71
+
11
72
  # 3.4.27-rc2
12
73
  - **bug-fixed**: cannede responses role
13
74
 
package/angular.json CHANGED
@@ -32,6 +32,7 @@
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",
35
36
  {
36
37
  "glob": "**/*",
37
38
  "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.27-rc2",
4
+ "version": "3.4.27-rc20",
5
5
  "license": "MIT License",
6
6
  "homepage": "https://tiledesk.com/",
7
7
  "repository": {
@@ -21,7 +21,9 @@
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> </app-sidebar-user-details>
24
+ <app-sidebar-user-details
25
+ [logOut]="g?.logOut">
26
+ </app-sidebar-user-details>
25
27
  </div>
26
28
 
27
29
  <ion-split-pane when="md" contentId="main" [ngClass]="{'mobile': IS_ON_MOBILE_DEVICE, 'sidebar-hidden': IS_ON_MOBILE_DEVICE || SUPPORT_MODE === false}">
@@ -44,6 +44,8 @@ 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';
47
49
  import { ProjectUsersService } from './services/project_users/project-users.service';
48
50
 
49
51
  @Component({
@@ -299,6 +301,10 @@ export class AppComponent implements OnInit {
299
301
  this.zone = new NgZone({}); // a cosa serve?
300
302
 
301
303
  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'])
302
308
  }
303
309
 
304
310
  });
@@ -867,7 +873,8 @@ export class AppComponent implements OnInit {
867
873
  // console.log('[APP-COMP] PLATFORM', PLATFORM_MOBILE, 'route.snapshot', this.route.snapshot);
868
874
  if (!IDConv) {
869
875
  this.logger.log('[APP-COMP] navigateByUrl -- conversations-list');
870
- this.router.navigateByUrl('conversations-list')
876
+ const queryString = window.location.search; // restituisce ad es. "?jwt=...&tiledesk_supportMode=false"
877
+ this.router.navigateByUrl('conversations-list' + queryString);
871
878
  }
872
879
  // this.router.navigateByUrl(pageUrl);
873
880
  // this.navService.setRoot(ConversationListPage, {});
@@ -891,6 +898,11 @@ export class AppComponent implements OnInit {
891
898
  if (IDConv && FullNameConv) {
892
899
  pageUrl += IDConv + '/' + FullNameConv + '/' + Convtype
893
900
  }
901
+
902
+ const queryParams = this.route.snapshot.queryParams;
903
+ const queryString = new URLSearchParams(queryParams).toString();
904
+ pageUrl += queryString ? `?${queryString}` : '';
905
+
894
906
  // replace(/\(/g, '%28').replace(/\)/g, '%29') -> used for the encoder of any round brackets
895
907
  this.router.navigateByUrl(pageUrl.replace(/\(/g, '%28').replace(/\)/g, '%29').replace( /#/g, "%23" ));
896
908
 
@@ -1113,14 +1125,19 @@ export class AppComponent implements OnInit {
1113
1125
  if (conversation && conversation.is_new === true && this.isInitialized) {
1114
1126
  this.manageTabNotification('conv_added', conversation.sound)
1115
1127
  this.manageEventNewConversation(conversation)
1116
- this.setNotification();
1128
+ //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1129
+ this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1117
1130
  }
1118
1131
  if(conversation) this.updateConversationsOnStorage()
1119
1132
  });
1120
1133
 
1121
1134
  this.conversationsHandlerService.conversationChanged.subscribe((conversation: ConversationModel) => {
1122
1135
  // console.log('[APP-COMP] ***** subscribeConversationChanged conversation: ', conversation);
1123
- if(conversation) this.updateConversationsOnStorage();
1136
+ if(conversation){
1137
+ this.updateConversationsOnStorage();
1138
+ //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1139
+ this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1140
+ }
1124
1141
  });
1125
1142
 
1126
1143
  this.conversationsHandlerService.conversationChangedDetailed.subscribe((changes: {value: ConversationModel, previousValue: ConversationModel}) => {
@@ -1144,6 +1161,8 @@ export class AppComponent implements OnInit {
1144
1161
  if(conversation) {
1145
1162
  this.updateConversationsOnStorage();
1146
1163
  this.segmentResolved(conversation);
1164
+ //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1165
+ this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1147
1166
  this.router.navigateByUrl('conversation-detail/'); //redirect to basePage
1148
1167
  }
1149
1168
  });
@@ -1182,11 +1201,14 @@ export class AppComponent implements OnInit {
1182
1201
  this.contactsService.initialize(serverBaseURL)
1183
1202
  // this.chatManager.startApp();
1184
1203
 
1204
+
1205
+ //INIT WEBSOCKET
1206
+ this.connetWebsocket(tiledeskToken)
1207
+
1185
1208
  // ----------------------------------------------
1186
1209
  // PUSH NOTIFICATIONS
1187
1210
  // ----------------------------------------------
1188
1211
  const pushEngine = this.appConfigProvider.getConfig().pushEngine
1189
-
1190
1212
  if (currentUser) {
1191
1213
  if (pushEngine && pushEngine !== 'none') {
1192
1214
  this.notificationsService.getNotificationPermissionAndSaveToken(currentUser.uid);
@@ -1208,6 +1230,24 @@ export class AppComponent implements OnInit {
1208
1230
  } catch (err) {
1209
1231
  this.logger.error('[APP-COMP] -> error:', err);
1210
1232
  }
1233
+
1234
+ // ----------------------------------------------
1235
+ // LAST PROJECT FROM URL
1236
+ // ----------------------------------------------
1237
+ if(this.g.projectID){
1238
+ this.projectService.getProjects().subscribe({ next: (projects: Project[]) => {
1239
+ const project = projects.find(prjct => prjct.id_project._id === this.g.projectID)
1240
+ if(project){
1241
+ this.logger.log('[APP-COMP] - GET PROJECT - project found with this.projectID', project);
1242
+ localStorage.setItem('last_project', JSON.stringify(project))
1243
+ this.events.publish('storage:last_project', project)
1244
+ }
1245
+ }, error: (error) => {
1246
+ this.logger.log('[APP-COMP] - GET PROJECT - project NOT found with this.projectID', this.g.projectID, error);
1247
+ }, complete: () => {
1248
+
1249
+ }});
1250
+ }
1211
1251
  }
1212
1252
 
1213
1253
 
@@ -1248,9 +1288,24 @@ export class AppComponent implements OnInit {
1248
1288
  }
1249
1289
 
1250
1290
  goToDashboardLogin(){
1251
- let DASHBOARD_URL = this.appConfigProvider.getConfig().dashboardUrl + '#/login'
1252
- const myWindow = window.open(DASHBOARD_URL, '_self');
1253
- myWindow.focus();
1291
+ // let DASHBOARD_URL = this.appConfigProvider.getConfig().dashboardUrl + '#/login'
1292
+ // const myWindow = window.open(DASHBOARD_URL, '_self');
1293
+ // myWindow.focus();
1294
+ }
1295
+
1296
+ connetWebsocket(tiledeskToken) {
1297
+
1298
+ this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] tiledeskToken ', tiledeskToken)
1299
+ const appconfig = this.appConfigProvider.getConfig();
1300
+ this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] wsUrl ', appconfig.wsUrl)
1301
+ const WS_URL = appconfig.wsUrl + '?token=' + tiledeskToken
1302
+ this.logger.log('[WEBSOCKET-JS] connetWebsocket called in [PROJECT-ITEM] wsUrl ', WS_URL)
1303
+ this.webSocketJs.init(
1304
+ WS_URL,
1305
+ undefined,
1306
+ undefined,
1307
+ undefined
1308
+ );
1254
1309
  }
1255
1310
 
1256
1311
 
@@ -1351,8 +1406,6 @@ export class AppComponent implements OnInit {
1351
1406
  if(conversation && conversation.is_new){
1352
1407
  this.audio_NewConv.pause();
1353
1408
  this.conversationsHandlerService.setConversationRead(conversation.uid)
1354
- //UPDATE NOTIFICATION FOR NEW CONVERSATION COUNT
1355
- this.setNotification();
1356
1409
  }
1357
1410
  }
1358
1411
 
@@ -1430,7 +1483,7 @@ export class AppComponent implements OnInit {
1430
1483
  }
1431
1484
 
1432
1485
  //INIT NOTIFICATION FOR NEW CONVERSATION COUNT
1433
- this.setNotification();
1486
+ this.triggerOnUpdateNewConversationBadge(this.conversationsHandlerService.countIsNew());
1434
1487
  });
1435
1488
 
1436
1489
  }
@@ -1647,14 +1700,6 @@ export class AppComponent implements OnInit {
1647
1700
  this.triggerEvents.triggerOnNewConversationInit(conversation)
1648
1701
  }
1649
1702
 
1650
- private setNotification() {
1651
- this.logger.log('[APP-COMP] setNotification for NEW CONVERSATION');
1652
- if(window['AGENTDESKTOP']){
1653
- this.logger.log('[APP-COMP] manageNotification AGENTDESKTOP exist', window['AGENTDESKTOP']);
1654
- window['AGENTDESKTOP']['TAB'].Badge(this.conversationsHandlerService.countIsNew().toString())
1655
- }
1656
- }
1657
-
1658
1703
 
1659
1704
  @HostListener('document:visibilitychange', [])
1660
1705
  visibilitychange() {
@@ -1721,6 +1766,11 @@ export class AppComponent implements OnInit {
1721
1766
  this.triggerEvents.triggerOnInit(detailOBJ)
1722
1767
  }
1723
1768
 
1769
+ private triggerOnUpdateNewConversationBadge(count: number){
1770
+ const detailOBJ = { event: 'onUpdateNewConversationBadge', count: count.toString() }
1771
+ this.triggerEvents.triggerOnUpdateNewConversationBadge(detailOBJ)
1772
+ }
1773
+
1724
1774
 
1725
1775
  // @HostListener('mouseenter', ['$event'])
1726
1776
  // onMouseEnter(event: any) {
@@ -205,13 +205,13 @@
205
205
  // overflow-x: hidden;
206
206
  // }
207
207
  // .c21-ico-schedule {
208
- // background-image: url("src/assets/images/f21ico-schedule.svg");
208
+ // background-image: url("src/assets/img/f21ico-schedule.svg");
209
209
  // }
210
210
  // .c21-ico-done {
211
- // background-image: url("src/assets/images/f21ico-done.svg");
211
+ // background-image: url("src/assets/img/f21ico-done.svg");
212
212
  // }
213
213
  // .c21-ico-done_all {
214
- // background-image: url("src/assets/images/f21ico-done_all.svg");
214
+ // background-image: url("src/assets/img/f21ico-done_all.svg");
215
215
  // }
216
216
  // }
217
217
 
@@ -58,7 +58,7 @@ export class ConversationContentComponent implements OnInit {
58
58
  MESSAGE_TYPE_OTHERS = MESSAGE_TYPE_OTHERS;
59
59
  // ========== end:: check message type functions ======= //
60
60
 
61
- urlBOTImage = 'https://s3.eu-west-1.amazonaws.com/tiledesk-widget/dev/2.0.4-beta.7/assets/images/avatar_bot_tiledesk.svg'
61
+ urlBOTImage = 'https://s3.eu-west-1.amazonaws.com/tiledesk-widget/dev/2.0.4-beta.7/assets/img/avatar_bot_tiledesk.svg'
62
62
  uploadProgress: number;
63
63
  showUploadProgress: boolean = false;
64
64
  fileType: string;
@@ -184,7 +184,7 @@
184
184
  <ng-container *ngIf="isCopilotEnabled">
185
185
  <ion-button shape="round" size="small" class="btn-info-msg btn-copilot" ion-button fill="clear"
186
186
  (click)="onClickOptionsCopilot(message, i)">
187
- <ion-icon id="copilot" src="assets/images/icons/copilot.svg"></ion-icon>
187
+ <ion-icon id="copilot" src="assets/img/icons/copilot.svg"></ion-icon>
188
188
  </ion-button>
189
189
  </ng-container>
190
190
 
@@ -1,6 +1,6 @@
1
1
  <div class="c21-icon-avatar">
2
2
  <div class="c21-avatar-image profile_image">
3
- <!-- <img src="getUrlImgProfile(message.sender) {{getUrlImgProfile(message.sender)}}" onError="this.src = 'https://s3.eu-west-1.amazonaws.com/tiledesk-widget/v2/assets/images/line_avatar_male_tiledesk.svg'" /> -->
3
+ <!-- <img src="getUrlImgProfile(message.sender) {{getUrlImgProfile(message.sender)}}" onError="this.src = 'https://s3.eu-west-1.amazonaws.com/tiledesk-widget/v2/assets/img/line_avatar_male_tiledesk.svg'" /> -->
4
4
  <!-- <img [src]="url" (error)="onBotImgError($event)" /> -->
5
5
  <img *ngIf="senderID?.indexOf('bot_') !== -1 || senderFullname === 'Bot'" [src]="url" (error)="onBotImgError($event)" (load)="onLoadedBot($event)"/>
6
6
  <!-- is a HUMAN -->
@@ -17,18 +17,18 @@ export class AvatarComponent implements OnInit {
17
17
  if(this.senderID){
18
18
  this.url = this.imageRepoService.getImagePhotoUrl(this.senderID)
19
19
  if(!this.url && (this.senderID.indexOf('bot_') !== -1 || this.senderFullname === 'Bot')){
20
- this.url = this.baseLocation +'/assets/images/avatar_bot_tiledesk.svg'
20
+ this.url = this.baseLocation +'/assets/img/avatar_bot_tiledesk.svg'
21
21
  }else if(!this.url && this.senderID.indexOf('bot_') == -1){
22
- this.url = this.baseLocation +'/assets/images/light_avatar_placeholder.svg'
22
+ this.url = this.baseLocation +'/assets/img/light_avatar_placeholder.svg'
23
23
  }
24
24
  }
25
25
  }
26
26
 
27
27
  onBotImgError(event){
28
- event.target.src = this.baseLocation +'/assets/images/avatar_bot_tiledesk.svg'
28
+ event.target.src = this.baseLocation +'/assets/img/avatar_bot_tiledesk.svg'
29
29
  }
30
30
  onHumanImgError(event) {
31
- event.target.src = this.baseLocation + "/assets/images/light_avatar_placeholder.svg"
31
+ event.target.src = this.baseLocation + "/assets/img/light_avatar_placeholder.svg"
32
32
  }
33
33
 
34
34
  onLoadedBot(event){
@@ -16,12 +16,12 @@
16
16
  }
17
17
 
18
18
  .c21-ico-schedule {
19
- background-image: url("/src/assets/images/f21ico-schedule.svg");
19
+ background-image: url("/src/assets/img/f21ico-schedule.svg");
20
20
  }
21
21
  .c21-ico-done {
22
- background-image: url("/src/assets/images/f21ico-done.svg");
22
+ background-image: url("/src/assets/img/f21ico-done.svg");
23
23
  }
24
24
  .c21-ico-done_all {
25
- background-image: url("/src/assets/images/f21ico-done_all.svg");
25
+ background-image: url("/src/assets/img/f21ico-done_all.svg");
26
26
  }
27
27
  }
@@ -96,23 +96,23 @@
96
96
  <div class="conversation_project truncate">
97
97
  <!-- DIRECT CONV -->
98
98
  <div *ngIf="conversation.channel_type === CHANNEL_TYPE.DIRECT">
99
- <img class="channel-icon" src="assets/images/channel_icons/direct.svg">
99
+ <img class="channel-icon" src="assets/img/channel_icons/direct.svg">
100
100
  <span class="truncate">{{translationsMap.get('DIRECT_CHAT')}}</span>
101
101
  </div>
102
102
  <!-- GROUP CONV -->
103
103
  <div *ngIf="conversation.uid.startsWith(CHANNEL_TYPE.GROUP)">
104
- <img class="channel-icon" src="assets/images/channel_icons/group.svg">
104
+ <img class="channel-icon" src="assets/img/channel_icons/group.svg">
105
105
  <span class="truncate">{{translationsMap.get('GROUP_CHAT')}}</span>
106
106
  </div>
107
107
  <!-- SUPPORT-GROUP CONV -->
108
108
  <div *ngIf="conversation.uid.startsWith(CHANNEL_TYPE.SUPPORT_GROUP) && !IS_ON_MOBILE_DEVICE">
109
- <img class="channel-icon" src="assets/images/channel_icons/chat21.svg" *ngIf="conversation?.attributes && ( (conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.CHAT21) || !conversation?.attributes?.request_channel) " >
110
- <img class="channel-icon" src="assets/images/channel_icons/email-logo.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.EMAIL" >
111
- <img class="channel-icon" src="assets/images/channel_icons/form-logo_v2.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.FORM" >
112
- <img class="channel-icon" src="assets/images/channel_icons/messenger-logo.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.MESSENGER" >
113
- <img class="channel-icon" src="assets/images/channel_icons/whatsapp-logo.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.WHATSAPP" >
114
- <img class="channel-icon" src="assets/images/channel_icons/telegram-logo.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.TELEGRAM" >
115
- <img class="channel-icon" src="assets/images/channel_icons/voice.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel.startsWith(CHANNEL_TYPE.VOICE)" >
109
+ <img class="channel-icon" src="assets/img/channel_icons/chat21.svg" *ngIf="conversation?.attributes && ( (conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.CHAT21) || !conversation?.attributes?.request_channel) " >
110
+ <img class="channel-icon" src="assets/img/channel_icons/email-logo.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.EMAIL" >
111
+ <img class="channel-icon" src="assets/img/channel_icons/form-logo_v2.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.FORM" >
112
+ <img class="channel-icon" src="assets/img/channel_icons/messenger-logo.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.MESSENGER" >
113
+ <img class="channel-icon" src="assets/img/channel_icons/whatsapp-logo.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.WHATSAPP" >
114
+ <img class="channel-icon" src="assets/img/channel_icons/telegram-logo.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel === CHANNEL_TYPE.TELEGRAM" >
115
+ <img class="channel-icon" src="assets/img/channel_icons/voice.svg" *ngIf="conversation?.attributes && conversation?.attributes?.request_channel && conversation?.attributes?.request_channel.startsWith(CHANNEL_TYPE.VOICE)" >
116
116
  <span *ngIf="conversation?.attributes?.project_name" class="truncate">{{conversation?.attributes?.project_name}}</span>
117
117
  <span *ngIf="!conversation?.attributes?.project_name" class="truncate">{{conversation?.attributes?.projectId}}</span>
118
118
  </div>
@@ -9,7 +9,7 @@
9
9
  <ion-label>{{translationsMap?.get('AddAsCannedResponse')}}</ion-label>
10
10
  </ion-item>
11
11
  <ion-item button="true" *ngIf="logLevel >= LogLevel.DEBUG" (click)="onClickOption('jsonInfo')">
12
- <ion-icon src="assets/images/json-file.svg" slot="start"></ion-icon>
12
+ <ion-icon src="assets/img/json-file.svg" slot="start"></ion-icon>
13
13
  <ion-label>{{translationsMap?.get('JSON_RESPONSE')}}</ion-label>
14
14
  </ion-item>
15
15
  </ion-list>
@@ -9,8 +9,8 @@
9
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
10
  <ion-input [class.readonly]="canned?.disabled" [readonly]="canned?.disabled" type="text" [(ngModel)]="canned.text" class="text truncate"></ion-input>
11
11
  </div>
12
- <!-- <ion-icon class="canned-item-icon" name="pin" src="assets/images/pin.svg" slot=end *ngIf="canned.pinned" (click)="onPinCanned(canned, $event)"></ion-icon>
13
- <ion-icon class="canned-item-icon" name="pin" src="assets/images/pinned.svg" slot=end (click)="onUnPinCanned(canned, $event)"></ion-icon> -->
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
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
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
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>
@@ -278,7 +278,5 @@ ion-item {
278
278
  display: flex;
279
279
  justify-content: center;
280
280
  flex-direction: column;
281
- align-items: center;
282
-
283
281
  }
284
282
  }
@@ -47,13 +47,13 @@
47
47
  </div>
48
48
  <!-- SUPPORT-GROUP CONV -->
49
49
  <div *ngIf="conversationUid?.startsWith(CHANNEL_TYPE.SUPPORT_GROUP) && !IS_ON_MOBILE_DEVICE">
50
- <img class="channel-icon" src="assets/images/channel_icons/chat21.svg" *ngIf="( (conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.CHAT21) || !conversationAvatar?.request_channel) " >
51
- <img class="channel-icon" src="assets/images/channel_icons/email-logo.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.EMAIL" >
52
- <img class="channel-icon" src="assets/images/channel_icons/form-logo_v2.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.FORM" >
53
- <img class="channel-icon" src="assets/images/channel_icons/messenger-logo.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.MESSENGER" >
54
- <img class="channel-icon" src="assets/images/channel_icons/whatsapp-logo.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.WHATSAPP" >
55
- <img class="channel-icon" src="assets/images/channel_icons/telegram-logo.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.TELEGRAM" >
56
- <img class="channel-icon" src="assets/images/channel_icons/voice.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel.startsWith(CHANNEL_TYPE.VOICE)" >
50
+ <img class="channel-icon" src="assets/img/channel_icons/chat21.svg" *ngIf="( (conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.CHAT21) || !conversationAvatar?.request_channel) " >
51
+ <img class="channel-icon" src="assets/img/channel_icons/email-logo.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.EMAIL" >
52
+ <img class="channel-icon" src="assets/img/channel_icons/form-logo_v2.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.FORM" >
53
+ <img class="channel-icon" src="assets/img/channel_icons/messenger-logo.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.MESSENGER" >
54
+ <img class="channel-icon" src="assets/img/channel_icons/whatsapp-logo.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.WHATSAPP" >
55
+ <img class="channel-icon" src="assets/img/channel_icons/telegram-logo.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel === CHANNEL_TYPE.TELEGRAM" >
56
+ <img class="channel-icon" src="assets/img/channel_icons/voice.svg" *ngIf="conversationAvatar?.request_channel && conversationAvatar?.request_channel.startsWith(CHANNEL_TYPE.VOICE)" >
57
57
  <span *ngIf="conversationAvatar?.project_name" class="truncate">{{conversationAvatar?.project_name}}</span>
58
58
  <span *ngIf="!conversationAvatar?.project_name" class="truncate">{{conversationAvatar?.projectId}}</span>
59
59
  </div>
@@ -65,7 +65,7 @@
65
65
  <!-- COPILOT-OPTION -->
66
66
  <div *ngIf="isCopilotEnabled" class="copilot-container" id="copilot">
67
67
  <ion-button id="copilot" fill="clear" (click)="onOpenSection('copilot')">
68
- <ion-icon class="channel-icon" src="assets/images/icons/copilot.svg"></ion-icon>
68
+ <ion-icon class="channel-icon" src="assets/img/icons/copilot.svg"></ion-icon>
69
69
  {{translationsMap?.get('COPILOT.SOLVE_WITH_AI')}}
70
70
  </ion-button>
71
71
  </div>
@@ -22,6 +22,13 @@
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>
25
32
  </div>
26
33
 
27
34
  <div class="footerContainerAlert">
@@ -50,6 +57,22 @@
50
57
  </ion-col>
51
58
  </ion-row>
52
59
 
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
+
53
76
  <ion-row id="message-text-area" [style.display]="section==='chat' || section ==='templates' || section ==='copilot'? 'flex': 'none'">
54
77
 
55
78
  <ion-col col-auto style="display: flex;">
@@ -183,6 +183,36 @@
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
+
186
216
  #fileInput {
187
217
  position: absolute;
188
218
  opacity: 0;