@chat21/chat21-ionic 3.0.5-9.2 → 3.0.6-2.3

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 (178) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/LICENSE +661 -21
  3. package/README.md +13 -1
  4. package/angular.json +4 -0
  5. package/config.xml +4 -5
  6. package/deploy_pre.sh +44 -5
  7. package/deploy_prod.sh +36 -7
  8. package/env.sample +4 -2
  9. package/package.json +12 -8
  10. package/resources/{Android → android}/icon/drawable-hdpi-icon.png +0 -0
  11. package/resources/{Android → android}/icon/drawable-ldpi-icon.png +0 -0
  12. package/resources/{Android → android}/icon/drawable-mdpi-icon.png +0 -0
  13. package/resources/{Android → android}/icon/drawable-xhdpi-icon.png +0 -0
  14. package/resources/{Android → android}/icon/drawable-xxhdpi-icon.png +0 -0
  15. package/resources/{Android → android}/icon/drawable-xxxhdpi-icon.png +0 -0
  16. package/resources/{Android → android}/icon.png +0 -0
  17. package/resources/{Android → android}/splash/drawable-land-hdpi-screen.png +0 -0
  18. package/resources/{Android → android}/splash/drawable-land-ldpi-screen.png +0 -0
  19. package/resources/{Android → android}/splash/drawable-land-mdpi-screen.png +0 -0
  20. package/resources/{Android → android}/splash/drawable-land-xhdpi-screen.png +0 -0
  21. package/resources/{Android → android}/splash/drawable-land-xxhdpi-screen.png +0 -0
  22. package/resources/{Android → android}/splash/drawable-land-xxxhdpi-screen.png +0 -0
  23. package/resources/{Android → android}/splash/drawable-port-hdpi-screen.png +0 -0
  24. package/resources/{Android → android}/splash/drawable-port-ldpi-screen.png +0 -0
  25. package/resources/{Android → android}/splash/drawable-port-mdpi-screen.png +0 -0
  26. package/resources/{Android → android}/splash/drawable-port-xhdpi-screen.png +0 -0
  27. package/resources/{Android → android}/splash/drawable-port-xxhdpi-screen.png +0 -0
  28. package/resources/{Android → android}/splash/drawable-port-xxxhdpi-screen.png +0 -0
  29. package/resources/{Android → android}/splash.png +0 -0
  30. package/src/app/app-routing.module.ts +15 -0
  31. package/src/app/app.component.html +14 -4
  32. package/src/app/app.component.scss +18 -1
  33. package/src/app/app.component.ts +98 -37
  34. package/src/app/app.module.ts +14 -5
  35. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +36 -25
  36. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +160 -50
  37. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +108 -18
  38. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +21 -36
  39. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.scss +19 -7
  40. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +63 -42
  41. package/src/app/chatlib/conversation-detail/message/message-attachment/message-attachment.component.scss +1 -1
  42. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +7 -2
  43. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +141 -21
  44. package/src/app/chatlib/list-conversations-component/list-conversations/list-conversations.component.ts +13 -10
  45. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +39 -36
  46. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.scss +7 -1
  47. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +148 -63
  48. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +101 -39
  49. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +73 -2
  50. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +168 -98
  51. package/src/app/components/ddp-header/ddp-header.component.html +20 -6
  52. package/src/app/components/ddp-header/ddp-header.component.scss +4 -0
  53. package/src/app/components/ddp-header/ddp-header.component.ts +104 -10
  54. package/src/app/components/image-viewer/image-viewer.component.scss +2 -2
  55. package/src/app/components/project-item/project-item.component.html +141 -118
  56. package/src/app/components/project-item/project-item.component.scss +173 -91
  57. package/src/app/components/project-item/project-item.component.ts +59 -25
  58. package/src/app/components/sidebar/sidebar.component.html +275 -0
  59. package/src/app/components/sidebar/sidebar.component.scss +79 -0
  60. package/src/app/components/sidebar/sidebar.component.spec.ts +24 -0
  61. package/src/app/components/sidebar/sidebar.component.ts +541 -0
  62. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +137 -0
  63. package/src/app/components/sidebar-user-details/sidebar-user-details.component.scss +389 -0
  64. package/src/app/components/sidebar-user-details/sidebar-user-details.component.spec.ts +24 -0
  65. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +530 -0
  66. package/src/app/pages/conversation-detail/conversation-detail.module.ts +9 -2
  67. package/src/app/pages/conversation-detail/conversation-detail.page.html +53 -49
  68. package/src/app/pages/conversation-detail/conversation-detail.page.scss +28 -0
  69. package/src/app/pages/conversation-detail/conversation-detail.page.ts +1254 -753
  70. package/src/app/pages/conversations-list/conversations-list.module.ts +2 -1
  71. package/src/app/pages/conversations-list/conversations-list.page.html +24 -11
  72. package/src/app/pages/conversations-list/conversations-list.page.scss +20 -1
  73. package/src/app/pages/conversations-list/conversations-list.page.ts +687 -420
  74. package/src/app/pages/create-canned-response/create-canned-response-routing.module.ts +17 -0
  75. package/src/app/pages/create-canned-response/create-canned-response.module.ts +30 -0
  76. package/src/app/pages/create-canned-response/create-canned-response.page.html +150 -0
  77. package/src/app/pages/create-canned-response/create-canned-response.page.scss +55 -0
  78. package/src/app/pages/create-canned-response/create-canned-response.page.spec.ts +24 -0
  79. package/src/app/pages/create-canned-response/create-canned-response.page.ts +319 -0
  80. package/src/app/pages/create-requester/create-requester-routing.module.ts +17 -0
  81. package/src/app/pages/create-requester/create-requester.module.ts +28 -0
  82. package/src/app/pages/create-requester/create-requester.page.html +67 -0
  83. package/src/app/pages/create-requester/create-requester.page.scss +30 -0
  84. package/src/app/pages/create-requester/create-requester.page.spec.ts +24 -0
  85. package/src/app/pages/create-requester/create-requester.page.ts +138 -0
  86. package/src/app/pages/create-ticket/create-ticket-routing.module.ts +17 -0
  87. package/src/app/pages/create-ticket/create-ticket.module.ts +28 -0
  88. package/src/app/pages/create-ticket/create-ticket.page.html +171 -0
  89. package/src/app/pages/create-ticket/create-ticket.page.scss +52 -0
  90. package/src/app/pages/create-ticket/create-ticket.page.spec.ts +24 -0
  91. package/src/app/pages/create-ticket/create-ticket.page.ts +432 -0
  92. package/src/app/pages/loader-preview/loader-preview.page.ts +226 -166
  93. package/src/app/pages/profile-info/profile-info.page.html +4 -4
  94. package/src/app/pages/profile-info/profile-info.page.scss +13 -2
  95. package/src/app/pages/profile-info/profile-info.page.ts +23 -21
  96. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.html +16 -11
  97. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.scss +157 -63
  98. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.ts +51 -16
  99. package/src/app/services/app-config.ts +14 -14
  100. package/src/app/services/tiledesk/tiledesk.service.ts +209 -0
  101. package/src/app/shared/shared.module.ts +21 -7
  102. package/src/app/utils/scrollbar-theme.directive.ts +58 -24
  103. package/src/assets/i18n/de.json +266 -0
  104. package/src/assets/i18n/en.json +85 -10
  105. package/src/assets/i18n/es.json +266 -0
  106. package/src/assets/i18n/fr.json +266 -0
  107. package/src/assets/i18n/it.json +104 -37
  108. package/src/assets/i18n/pt.json +266 -0
  109. package/src/assets/i18n/ru.json +266 -0
  110. package/src/assets/i18n/sr.json +266 -0
  111. package/src/assets/i18n/tr.json +266 -0
  112. package/src/assets/images/default-avatar-x-select.png +0 -0
  113. package/src/assets/images/language_flag/ar.png +0 -0
  114. package/src/assets/images/language_flag/bg.png +0 -0
  115. package/src/assets/images/language_flag/ca.png +0 -0
  116. package/src/assets/images/language_flag/cs.png +0 -0
  117. package/src/assets/images/language_flag/da.png +0 -0
  118. package/src/assets/images/language_flag/de.png +0 -0
  119. package/src/assets/images/language_flag/el.png +0 -0
  120. package/src/assets/images/language_flag/en.png +0 -0
  121. package/src/assets/images/language_flag/es.png +0 -0
  122. package/src/assets/images/language_flag/fa.png +0 -0
  123. package/src/assets/images/language_flag/fi.png +0 -0
  124. package/src/assets/images/language_flag/fr.png +0 -0
  125. package/src/assets/images/language_flag/he.png +0 -0
  126. package/src/assets/images/language_flag/hi.png +0 -0
  127. package/src/assets/images/language_flag/hr.png +0 -0
  128. package/src/assets/images/language_flag/hu.png +0 -0
  129. package/src/assets/images/language_flag/id.png +0 -0
  130. package/src/assets/images/language_flag/it.png +0 -0
  131. package/src/assets/images/language_flag/ja.png +0 -0
  132. package/src/assets/images/language_flag/ko.png +0 -0
  133. package/src/assets/images/language_flag/ml-IN.png +0 -0
  134. package/src/assets/images/language_flag/ne-NP.png +0 -0
  135. package/src/assets/images/language_flag/nl.png +0 -0
  136. package/src/assets/images/language_flag/no.png +0 -0
  137. package/src/assets/images/language_flag/pl.png +0 -0
  138. package/src/assets/images/language_flag/pt-BR.png +0 -0
  139. package/src/assets/images/language_flag/pt.png +0 -0
  140. package/src/assets/images/language_flag/ro.png +0 -0
  141. package/src/assets/images/language_flag/ru.png +0 -0
  142. package/src/assets/images/language_flag/sk.png +0 -0
  143. package/src/assets/images/language_flag/sl.png +0 -0
  144. package/src/assets/images/language_flag/sr.png +0 -0
  145. package/src/assets/images/language_flag/sv-SE.png +0 -0
  146. package/src/assets/images/language_flag/ta.png +0 -0
  147. package/src/assets/images/language_flag/th.png +0 -0
  148. package/src/assets/images/language_flag/tr.png +0 -0
  149. package/src/assets/images/language_flag/uk.png +0 -0
  150. package/src/assets/images/language_flag/vi.png +0 -0
  151. package/src/assets/images/language_flag/zh-CN.png +0 -0
  152. package/src/assets/images/language_flag/zh-TW.png +0 -0
  153. package/src/assets/images/no_image_user.png +0 -0
  154. package/src/assets/images/priority_icons/high.svg +3 -0
  155. package/src/assets/images/priority_icons/high_v2.svg +14 -0
  156. package/src/assets/images/priority_icons/low.svg +10 -0
  157. package/src/assets/images/priority_icons/low_v2.svg +14 -0
  158. package/src/assets/images/priority_icons/medium.svg +16 -0
  159. package/src/assets/images/priority_icons/medium_v2.svg +11 -0
  160. package/src/assets/images/priority_icons/urgent.svg +4 -0
  161. package/src/assets/images/priority_icons/urgent_v2.svg +16 -0
  162. package/src/assets/js/chat21client.js +16 -3
  163. package/src/assets/tiledesk-solo-logo.png +0 -0
  164. package/src/chat-config-mqtt.json +27 -17
  165. package/src/chat-config-pre-test.json +5 -1
  166. package/src/chat-config-pre.json +15 -3
  167. package/src/chat-config-template.json +6 -2
  168. package/src/chat-config.json +5 -1
  169. package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +61 -45
  170. package/src/chat21-core/providers/firebase/firebase-conversations-handler.ts +23 -0
  171. package/src/chat21-core/providers/mqtt/mqtt-archivedconversations-handler.ts +1 -1
  172. package/src/chat21-core/utils/constants.ts +8 -1
  173. package/src/chat21-core/utils/utils-message.ts +19 -0
  174. package/src/chat21-core/utils/utils.ts +12 -1
  175. package/src/global.scss +408 -2
  176. package/src/index.html +7 -0
  177. package/publish_pre.sh +0 -33
  178. package/publish_prod.sh +0 -33
@@ -6,7 +6,10 @@ import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service
6
6
  import { isFile, isFrame, isImage } from 'src/chat21-core/utils/utils-message';
7
7
  import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
8
8
  import { TranslateService } from '@ngx-translate/core';
9
+ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk-auth.service';
9
10
  import * as moment from 'moment';
11
+ import { CreateCannedResponsePage } from 'src/app/pages/create-canned-response/create-canned-response.page'
12
+ import { ModalController } from '@ionic/angular';
10
13
  @Component({
11
14
  selector: 'chat-bubble-message',
12
15
  templateUrl: './bubble-message.component.html',
@@ -16,13 +19,15 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
16
19
 
17
20
  @Input() message: MessageModel;
18
21
  @Input() textColor: string;
22
+ @Input() areVisibleCAR: boolean;
23
+ @Input() support_mode: boolean;
19
24
  @Output() onBeforeMessageRender = new EventEmitter();
20
25
  @Output() onAfterMessageRender = new EventEmitter();
21
26
  @Output() onImageRendered = new EventEmitter<boolean>()
22
27
  isImage = isImage;
23
28
  isFile = isFile;
24
29
  isFrame = isFrame;
25
-
30
+ @Input() addAsCannedResponseTooltipText : string;
26
31
  public browserLang: string;
27
32
 
28
33
  tooltipOptions = {
@@ -36,62 +41,58 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
36
41
  };
37
42
 
38
43
  private logger: LoggerService = LoggerInstance.getInstance()
44
+
39
45
  constructor(
40
46
  public sanitizer: DomSanitizer,
41
- private translate: TranslateService) {
47
+ private translate: TranslateService,
48
+ public tiledeskAuthService: TiledeskAuthService,
49
+ public modalController: ModalController,
50
+ ) {
42
51
  // console.log('BUBBLE-MSG Hello !!!!')
43
52
  }
44
53
 
45
54
  ngOnInit() {
55
+ this.setMomentLocale()
56
+ }
57
+
58
+
59
+ setMomentLocale() {
46
60
  this.browserLang = this.translate.getBrowserLang();
47
- // console.log('BUBBLE-MSG ngOnInit browserLang ', this.browserLang)
48
- if (this.browserLang) {
49
- if (this.browserLang === 'it') {
50
- // console.log('BUBBLE-MSG browserLang ', this.browserLang)
51
- // moment.locale('it')
52
-
53
- moment.locale('it', {
54
- calendar: {
55
- lastDay: '[Ieri alle] LT',
56
- sameDay: '[Oggi alle] LT',
57
- nextDay: '[Domani alle] LT',
58
- lastWeek: '[Ultimo] dddd [alle] LT',
59
- nextWeek: 'dddd [alle] LT',
60
- sameElse: 'lll'
61
- }
62
- });
63
-
64
- } else {
65
- // console.log('BUBBLE-MSG browserLang ', this.browserLang)
66
- // moment.locale('en')
67
-
68
- moment.locale('en', {
69
- calendar: {
70
- lastDay: '[Yesterday at] LT',
71
- sameDay: '[Today at] LT',
72
- nextDay: '[Tomorrow at] LT',
73
- lastWeek: '[last] dddd [at] LT',
74
- nextWeek: 'dddd [at] LT',
75
- sameElse: 'lll'
76
- }
77
- });
78
- }
61
+ const currentUser = this.tiledeskAuthService.getCurrentUser();
62
+ this.logger.log('[BUBBLE-MESSAGE] - ngOnInit - currentUser ', currentUser)
63
+ let currentUserId = ''
64
+ if (currentUser) {
65
+ currentUserId = currentUser.uid
66
+ this.logger.log('[BUBBLE-MESSAGE] - ngOnInit - currentUserId ', currentUserId)
79
67
  }
80
68
 
69
+ const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
70
+ this.logger.log('[BUBBLE-MESSAGE] stored_preferred_lang: ', stored_preferred_lang);
81
71
 
82
72
 
83
- // const yesterday = moment().subtract(1, 'day')
84
- // console.log('BUBBLE-MSG yesterday ', yesterday)
85
-
73
+ let chat_lang = ''
74
+ if (this.browserLang && !stored_preferred_lang) {
75
+ chat_lang = this.browserLang
76
+ } else if (this.browserLang && stored_preferred_lang) {
77
+ chat_lang = stored_preferred_lang
78
+ }
79
+ moment.locale(chat_lang , {
80
+ calendar: {
81
+ sameElse: 'LLLL'
82
+ }
83
+ });
84
+ // this.translate.getTranslation(chat_lang).subscribe((labels: string) => {
85
+ // console.log('[BUBBLE-MESSAGE] translations: ', labels);
86
+ // });
86
87
  }
87
88
 
88
89
  ngOnChanges() {
89
- // console.log('BUBBLE-MSG Hello !!!! this.message ', this.message)
90
+ this.logger.log('BUBBLE-MSG Hello !!!! this.message ', this.message)
91
+ this.logger.log('BUBBLE-MSG ngOnChanges areVisibleCAR', this.areVisibleCAR)
92
+ this.logger.log('BUBBLE-MSG ngOnChanges support_mode', this.support_mode)
90
93
  if (this.message && this.message.metadata && typeof this.message.metadata === 'object') {
91
94
  this.getMetadataSize(this.message.metadata)
92
- // console.log('BUBBLE-MSG ngOnChanges message > metadata', this.message.metadata)
93
95
  }
94
-
95
96
  }
96
97
 
97
98
 
@@ -158,11 +159,11 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
158
159
  const domRepresentation = document.getElementsByClassName('chat-tooltip');
159
160
  if (domRepresentation) {
160
161
  const item = domRepresentation[0] as HTMLInputElement;
161
- if (!item.classList.contains('tooltip-show')) {
162
+ if (item && !item.classList.contains('tooltip-show')) {
162
163
  item.classList.add('tooltip-show');
163
164
  }
164
165
  setTimeout(function () {
165
- if (item.classList.contains('tooltip-show')) {
166
+ if (item && item.classList.contains('tooltip-show')) {
166
167
  item.classList.remove('tooltip-show');
167
168
  }
168
169
  }, that.tooltipOptions['hideDelayAfterClick']);
@@ -198,6 +199,26 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
198
199
  this.onImageRendered.emit(event)
199
200
  }
200
201
 
202
+ async presentCreateCannedResponseModal(): Promise<any> {
203
+ this.logger.log('[BUBBLE-MESSAGE] PRESENT CREATE CANNED RESPONSE MODAL ')
204
+ const attributes = {
205
+ message: this.message,
206
+ }
207
+ const modal: HTMLIonModalElement = await this.modalController.create({
208
+ component: CreateCannedResponsePage,
209
+ componentProps: attributes,
210
+ swipeToClose: false,
211
+ backdropDismiss: false,
212
+ })
213
+ modal.onDidDismiss().then((dataReturned: any) => {
214
+ //
215
+ this.logger.log('[BUBBLE-MESSAGE] ', dataReturned.data)
216
+ })
217
+
218
+ return await modal.present()
219
+ }
220
+
221
+
201
222
  // printMessage(message, messageEl, component) {
202
223
  // const messageOBJ = { message: message, sanitizer: this.sanitizer, messageEl: messageEl, component: component}
203
224
  // this.onBeforeMessageRender.emit(messageOBJ)
@@ -4,7 +4,7 @@
4
4
  margin-top: -6px;
5
5
  margin-bottom: 5px;
6
6
  height: auto;
7
-
7
+ padding-left: 8px;
8
8
 
9
9
  .div-button {
10
10
  display: inline-block;
@@ -118,12 +118,17 @@
118
118
  <ion-note *ngIf="!conversation.archived" class="conversation_time">{{conversation.timestamp | amTimeAgo}}</ion-note>
119
119
 
120
120
  <ion-buttons slot="end">
121
- <ion-button *ngIf="!conversation.archived"
121
+ <ion-button *ngIf="!conversation.archived" [tooltip]="archiveTooltip" [options]="tooltip_options" placement="bottom" content-type="template"
122
122
  [ngClass]="{'hide': !isApp, 'button-on-desktop': !isApp, 'button-on-mobile': isApp }"
123
123
  id="{{ 'close_conversation_button' + conversation.uid }}" class="close-conversation-button" ion-button clear
124
124
  item-end (click)="closeConversation(conversation);$event.stopPropagation();" padding>
125
125
  <ion-icon slot="icon-only" style="display:block;" id="{{ 'close_button_icon' + conversation.uid }}"
126
126
  color="close-conversation" name="archive-outline" item-end></ion-icon>
127
+
128
+ <ng-template #archiveTooltip>
129
+ <span *ngIf="conversation?.recipient.startsWith('support-group')"> {{ resolve_btn_tooltip}} </span>
130
+ <span *ngIf="!conversation?.recipient.startsWith('support-group')"> {{ archive_btn_tooltip }} </span>
131
+ </ng-template>
127
132
  </ion-button>
128
133
  <!-- <ion-button *ngIf="conversation.archived" class="close-conversation-button" ion-button clear item-end disabled padding>
129
134
  <!- - <ion-icon style="display:block;" id="{{ 'close_button_icon' + conversation.uid }}" color="close-conversation" name="archive-outline" item-end></ion-icon> - ->
@@ -142,7 +147,7 @@
142
147
  {{browserLang === 'en' ? (conversation.timestamp | amDateFormat:'MMM DD YYYY') : (conversation.timestamp| amDateFormat:'DD MMM YYYY') }}
143
148
  <!-- {{conversation.timestamp | amDateFormat:'DD MMM YYYY'}} -->
144
149
  </span>
145
- <i class="material-icons" item-end style="font-size: 15px;font-weight: 400;color: #666666;"> history </i>
150
+ <!-- <i class="material-icons" item-end style="font-size: 15px;font-weight: 400;color: #666666;"> history </i> -->
146
151
  </div>
147
152
 
148
153
  <!-- && !conversation?.archived -->
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, Input, IterableDiffers, KeyValueDiffers, OnInit, Output } from '@angular/core';
1
+ import { Component, EventEmitter, Input, IterableDiffers, KeyValueDiffers, OnInit, Output, SimpleChange } from '@angular/core';
2
2
  import { ConversationModel } from 'src/chat21-core/models/conversation';
3
3
  import { ImageRepoService } from 'src/chat21-core/providers/abstract/image-repo.service';
4
4
  import { convertMessage } from 'src/chat21-core/utils/utils';
@@ -9,11 +9,11 @@ import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance'
9
9
  import { TranslateService } from '@ngx-translate/core';
10
10
 
11
11
  import * as moment from 'moment';
12
- // import { EventsService } from 'src/app/services/events-service';
13
- // import { TiledeskService } from '../../../services/tiledesk/tiledesk.service';
14
12
  import { NetworkService } from '../../../services/network-service/network.service';
15
13
  import { AppConfigProvider } from 'src/app/services/app-config';
16
14
  import { DomSanitizer } from '@angular/platform-browser'
15
+ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk-auth.service';
16
+ import { AlertController } from '@ionic/angular';
17
17
  // import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
18
18
  // import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
19
19
 
@@ -24,17 +24,34 @@ import { DomSanitizer } from '@angular/platform-browser'
24
24
  })
25
25
  export class IonListConversationsComponent extends ListConversationsComponent implements OnInit {
26
26
 
27
+ @Input() archiveActionNotAllowed: boolean;
27
28
  @Input() uidConvSelected: string;
28
29
  @Output() onCloseConversation = new EventEmitter<ConversationModel>();
30
+ @Output() onCloseAlert = new EventEmitter();
29
31
 
30
32
  convertMessage = convertMessage;
31
33
  isApp: boolean = false;
32
34
  public logger: LoggerService = LoggerInstance.getInstance();
33
35
  public currentYear: any;
34
36
  public browserLang: string;
35
-
36
- public PROJECT_FOR_PANEL: any;
37
37
 
38
+ public PROJECT_FOR_PANEL: any;
39
+ public archive_btn_tooltip: string;
40
+ public resolve_btn_tooltip: string;
41
+ public alert_lbl: string;
42
+ public actionNotAllowed_lbl: string;
43
+ public youAreNoLongerAmongTheTeammatesManagingThisConversation_lbl: string;
44
+ public ok_lbl: string;
45
+
46
+ tooltip_options = {
47
+ 'show-delay': 0,
48
+ 'tooltip-class': 'chat-tooltip',
49
+ 'theme': 'light',
50
+ 'shadow': false,
51
+ 'hide-delay-mobile': 0,
52
+ 'hideDelayAfterClick': 3000,
53
+ 'hide-delay': 100
54
+ };
38
55
  /**
39
56
  *
40
57
  * @param iterableDiffers
@@ -46,24 +63,29 @@ export class IonListConversationsComponent extends ListConversationsComponent im
46
63
  public kvDiffers: KeyValueDiffers,
47
64
  public platform: Platform,
48
65
  private translate: TranslateService,
49
- // private events: EventsService,
50
- // private tiledeskService: TiledeskService,
51
66
  private networkService: NetworkService,
52
67
  private appConfigProvider: AppConfigProvider,
53
68
  private sanitizer: DomSanitizer,
69
+ public tiledeskAuthService: TiledeskAuthService,
70
+ public alertController: AlertController
71
+
54
72
  ) {
55
73
  super(iterableDiffers, kvDiffers)
56
- this.browserLang = this.translate.getBrowserLang();
57
- if (this.browserLang) {
58
- if (this.browserLang === 'it') {
59
- // this.translate.use('it');
60
- moment.locale('it')
61
-
62
- } else {
63
- // this.translate.use('en');
64
- moment.locale('en')
65
- }
66
- }
74
+ this.setMomentLocale();
75
+
76
+
77
+ // if (this.browserLang) {
78
+
79
+ // moment.locale(this.browserLang)
80
+ // // if (this.browserLang === 'it') {
81
+ // // // this.translate.use('it');
82
+ // // moment.locale('it')
83
+
84
+ // // } else {
85
+ // // // this.translate.use('en');
86
+ // // moment.locale('en')
87
+ // // }
88
+ // }
67
89
 
68
90
  this.currentYear = moment().format('YYYY');
69
91
  this.logger.log('[ION-LIST-CONVS-COMP] - currentYear ', this.currentYear)
@@ -72,15 +94,111 @@ export class IonListConversationsComponent extends ListConversationsComponent im
72
94
 
73
95
  // console.log('[ION-LIST-CONVS-COMP] - DASHBOARD_BASE_URL ', DASHBOARD_BASE_URL)
74
96
  this.PROJECT_FOR_PANEL = this.sanitizer.bypassSecurityTrustResourceUrl(DASHBOARD_BASE_URL + '#/project-for-panel');
75
- }
97
+ this.translateLbls();
76
98
 
99
+ }
77
100
  ngOnInit() {
78
101
  this.isApp = this.platform.is('ios') || this.platform.is('android')
79
102
  this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - IS-APP ', this.isApp)
80
103
  this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - Platform', this.platform.platforms());
104
+
105
+ }
106
+
107
+ ngOnChanges(changes: { [property: string]: SimpleChange }) {
108
+ // Extract changes to the input property by its name
109
+ let change: SimpleChange = changes['archiveActionNotAllowed'];
110
+ this.logger.log('[ION-LIST-CONVS-COMP] - ngOnChanges change ', change);
111
+ // console.log('[ION-LIST-CONVS-COMP] - ngOnChanges change currentValue ', change.currentValue)
112
+ if (change && change.currentValue === true) {
113
+ this.pesentAlertActionNotAllowed()
114
+ }
115
+ // Whenever the data in the parent changes, this method gets triggered. You
116
+ // can act on the changes here. You will have both the previous value and the
117
+ // current value here.
81
118
  }
82
119
 
83
-
120
+
121
+ translateLbls() {
122
+ this.translate.get('Resolve')
123
+ .subscribe((text: string) => {
124
+ this.resolve_btn_tooltip = text;
125
+ });
126
+
127
+ this.translate.get('Archive')
128
+ .subscribe((text: string) => {
129
+ this.archive_btn_tooltip = text;
130
+ });
131
+
132
+ this.translate.get('ALERT_TITLE')
133
+ .subscribe((text: string) => {
134
+ this.alert_lbl = text;
135
+ });
136
+
137
+ this.translate.get('ActionNotAllowed')
138
+ .subscribe((text: string) => {
139
+ this.actionNotAllowed_lbl = text;
140
+ });
141
+
142
+ this.translate.get('YouAreNoLongerAmongTheTeammatesManagingThisConversation')
143
+ .subscribe((text: string) => {
144
+ this.youAreNoLongerAmongTheTeammatesManagingThisConversation_lbl = text;
145
+ });
146
+
147
+ this.translate.get('CLOSE_ALERT_CONFIRM_LABEL')
148
+ .subscribe((text: string) => {
149
+ this.ok_lbl = text;
150
+ });
151
+ }
152
+
153
+ setMomentLocale() {
154
+ this.browserLang = this.translate.getBrowserLang();
155
+ const currentUser = this.tiledeskAuthService.getCurrentUser();
156
+ this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - currentUser ', currentUser)
157
+ let currentUserId = ''
158
+ if (currentUser) {
159
+ currentUserId = currentUser.uid
160
+ this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - currentUserId ', currentUserId)
161
+ }
162
+
163
+ const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
164
+ this.logger.log('[ION-LIST-CONVS-COMP] stored_preferred_lang: ', stored_preferred_lang);
165
+
166
+
167
+ let chat_lang = ''
168
+ if (this.browserLang && !stored_preferred_lang) {
169
+ chat_lang = this.browserLang
170
+ } else if (this.browserLang && stored_preferred_lang) {
171
+ chat_lang = stored_preferred_lang
172
+ }
173
+ moment.locale(chat_lang)
174
+ }
175
+
176
+
177
+
178
+ async pesentAlertActionNotAllowed() {
179
+
180
+ const alert = await this.alertController.create({
181
+ cssClass: 'my-custom-class',
182
+ header: this.alert_lbl,
183
+ subHeader: this.actionNotAllowed_lbl,
184
+ message: this.youAreNoLongerAmongTheTeammatesManagingThisConversation_lbl,
185
+ buttons: [
186
+ {
187
+ text: this.ok_lbl,
188
+ handler: () => {
189
+ this.alertClosed();
190
+ // console.log('Confirm Okay');
191
+ },
192
+ },
193
+ ],
194
+ });
195
+
196
+ await alert.present();
197
+
198
+
199
+ }
200
+
201
+
84
202
 
85
203
 
86
204
 
@@ -101,7 +219,9 @@ export class IonListConversationsComponent extends ListConversationsComponent im
101
219
  // });
102
220
  // }
103
221
 
104
-
222
+ alertClosed() {
223
+ this.onCloseAlert.emit(true)
224
+ }
105
225
 
106
226
  closeConversation(conversation: ConversationModel) {
107
227
  var conversationId = conversation.uid;
@@ -15,7 +15,7 @@ export class ListConversationsComponent implements OnInit {
15
15
  @Input() listConversations: ConversationModel[];
16
16
  @Input() limit?: number
17
17
  @Input() stylesMap: Map<string, string>;
18
- @Input() translationMap: Map< string, string>;
18
+ @Input() translationMap: Map<string, string>;
19
19
  @Output() onConversationSelected = new EventEmitter<ConversationModel>();
20
20
  @Output() onImageLoaded = new EventEmitter<ConversationModel>();
21
21
  @Output() onConversationLoaded = new EventEmitter<ConversationModel>();
@@ -29,9 +29,11 @@ export class ListConversationsComponent implements OnInit {
29
29
  arrayDiffer: any;
30
30
 
31
31
  uidConvSelected: string;
32
- constructor(public iterableDiffers: IterableDiffers,
33
- public kvDiffers: KeyValueDiffers) {
34
- this.iterableDifferListConv = this.iterableDiffers.find([]).create(null);
32
+ constructor(
33
+ public iterableDiffers: IterableDiffers,
34
+ public kvDiffers: KeyValueDiffers
35
+ ) {
36
+ this.iterableDifferListConv = this.iterableDiffers.find([]).create(null);
35
37
  }
36
38
 
37
39
  ngOnInit() {
@@ -44,7 +46,7 @@ export class ListConversationsComponent implements OnInit {
44
46
  // })
45
47
  }
46
48
 
47
- ngOnChanges(changes: SimpleChanges){
49
+ ngOnChanges(changes: SimpleChanges) {
48
50
  // console.log('empDifferMap:: 1111' + JSON.stringify(this.listConversations[1]))
49
51
  // console.log('empDifferMap:: 1111', this.listConversations)
50
52
  // this.listConversations.forEach(emp => {
@@ -56,7 +58,8 @@ export class ListConversationsComponent implements OnInit {
56
58
 
57
59
  public openConversationByID(conversation) {
58
60
  this.logger.log('[LISTCONVERSATIONS-W] openConversationByID: ', conversation);
59
- if ( conversation ) {
61
+ if (conversation) {
62
+ this.logger.log(conversation.recipient_fullname)
60
63
  // this.conversationsService.updateIsNew(conversation);
61
64
  // this.conversationsService.updateConversationBadge();
62
65
  this.uidConvSelected = conversation.uid
@@ -67,10 +70,10 @@ export class ListConversationsComponent implements OnInit {
67
70
  ngAfterViewInit() {
68
71
  this.logger.log('[LISTCONVERSATIONS-W] ---ngAfterViewInit---: listConversations ', this.listConversations);
69
72
  }
70
-
73
+
71
74
  ngDoCheck() {
72
75
  let changesListConversation = this.iterableDifferListConv.diff(this.listConversations);
73
- if(changesListConversation){
76
+ if (changesListConversation) {
74
77
  // changesListConversation.forEachAddedItem(element => {
75
78
  // console.log('itemmmm 1111 added ', element)
76
79
  // let conv = element.item
@@ -104,7 +107,7 @@ export class ListConversationsComponent implements OnInit {
104
107
  // console.log('... Array changes ...', empArrayChanges);
105
108
  // empArrayChanges.forEachAddedItem((record) => {
106
109
  // console.log('1111 Added ', record.currentValue);
107
-
110
+
108
111
  // });
109
112
  // empArrayChanges.forEachRemovedItem((record) => {
110
113
  // console.log('1111 Removed ' + record.previousValue);
@@ -128,7 +131,7 @@ export class ListConversationsComponent implements OnInit {
128
131
  // });
129
132
  // }
130
133
  // }
131
-
134
+
132
135
  }
133
136
 
134
137
 
@@ -1,50 +1,40 @@
1
-
2
1
  <ion-header no-border class="ion-no-border">
3
- <ion-toolbar>
4
-
5
- <ion-buttons slot="start">
2
+ <ion-toolbar style="height:60px">
3
+ <ion-buttons slot="start" style="height:60px">
6
4
  <!-- (click)="pushPage('conversations-list')" defaultHref="/conversations-list" -->
7
5
  <ion-back-button style="display: block;" text="" *ngIf="isMobile" (click)="goBackToConversationList()">
8
- </ion-back-button>
6
+ </ion-back-button>
9
7
  </ion-buttons>
10
8
 
11
9
  <ion-title [class.info-open]="openInfoConversation || openInfoMessage">
12
10
 
13
- <div *ngIf="conversationAvatar" class="avatar-and-typing-wpr">
11
+ <div *ngIf="conversationAvatar" class="avatar-and-typing-wpr" >
14
12
  <!-- [ngStyle] = "{ 'left': platformName === 'ios' ? '55px' : '' }" -->
15
- <div *ngIf="conversationAvatar" class="avatar-container" [ngClass] = "{ 'avatar-container-ios': platformName === 'ios' }">
16
- <app-avatar-profile
17
- [itemAvatar] = conversationAvatar
18
- ></app-avatar-profile>
13
+ <div *ngIf="conversationAvatar" class="avatar-container" (click)="onOpenCloseInfoConversation()" style="cursor: pointer"
14
+ [ngClass]="{ 'avatar-container-ios': platformName === 'ios' }">
15
+ <app-avatar-profile [itemAvatar]=conversationAvatar></app-avatar-profile>
19
16
  </div>
20
17
  <!-- [ngStyle] = "{ 'left': platformName === 'ios' ? '63px' : '' }" -->
21
- <div *ngIf="isDirect" class="user-presence" [ngClass] = "{ 'user-presence-ios': platformName === 'ios' }">
22
- <app-user-presence
23
- [idUser] = conversationAvatar.conversation_with
24
- [translationMap] = translationMap
25
- [borderColor] = borderColor
26
- [fontColor] = fontColor>
18
+ <div *ngIf="isDirect" class="user-presence" [ngClass]="{ 'user-presence-ios': platformName === 'ios' }">
19
+ <app-user-presence [idUser]=conversationAvatar.conversation_with [translationMap]=translationMap
20
+ [borderColor]=borderColor [fontColor]=fontColor>
27
21
  </app-user-presence>
28
22
  </div>
29
23
 
30
24
  <div *ngIf="conversationAvatar" class="user-typing">
31
- <app-user-typing
32
- [idConversation] = conversationAvatar.uid
33
- [idCurrentUser] = idLoggedUser
34
- [isDirect] = isDirect
35
- [translationMap] = translationMap
36
- [color] = fontColor
37
- [membersConversation] = membersConversation
38
- ></app-user-typing>
25
+ <app-user-typing [idConversation]=conversationAvatar.uid [idCurrentUser]=idLoggedUser [isDirect]=isDirect
26
+ [translationMap]=translationMap [color]=fontColor [membersConversation]=membersConversation>
27
+ </app-user-typing>
39
28
  </div>
40
29
 
41
30
  </div>
42
31
  <!-- [ngClass] = "{ 'tile-info-with-ios': platformName === 'ios' ? '82px' : ''82px'' }" -->
43
- <div *ngIf="conversationAvatar" class="tile-info-with" (click)="onOpenCloseInfoConversation()"
44
- [ngClass] = "{ 'tile-info-with-ios': platformName === 'ios' }">
32
+ <!-- (click)="onOpenCloseInfoConversation()" -->
33
+ <div *ngIf="conversationAvatar" class="tile-info-with"
34
+ [ngClass]="{ 'tile-info-with-ios': platformName === 'ios' }">
45
35
  <!-- <span class="tile-username">{{ conversationAvatar.conversation_with_fullname }} </span> -->
46
36
  <span class="tile-username">{{ conversation_with_fullname }} </span>
47
-
37
+
48
38
  </div>
49
39
 
50
40
  <!-- <div *ngIf="conversationWithFullname" class="tile-info-with" (click)="onOpenCloseInfoConversation()">
@@ -55,15 +45,28 @@
55
45
  <!-- openInfoConversation {{openInfoConversation}} -->
56
46
  <ion-buttons slot="end">
57
47
 
58
- <ion-button *ngIf="!openInfoConversation" ion-button fill="clear" (click)="onOpenCloseInfoConversation()">
59
- <!-- <ion-icon slot="icon-only" name="alert-circle-outline"></ion-icon> -->
60
- <ion-icon slot="icon-only" name="information-circle-outline"></ion-icon>
61
- <!-- <ion-icon slot="icon-only" name="information-outline"></ion-icon> -->
62
-
63
- </ion-button>
64
- <ion-button *ngIf="openInfoConversation" ion-button fill="clear" (click)="onOpenCloseInfoConversation()">
65
- <ion-icon slot="icon-only" name="close-circle-outline"></ion-icon>
66
- </ion-button>
48
+ <!-- <ion-button ion-button fill="clear" color="primary" size="small" (click)="presentCreateTicketModal()" [ngClass]="{'resolve-conv-margin-right': !isMobile}">
49
+ <ion-icon name="ticket-outline"></ion-icon>
50
+ <span style="text-transform: capitalize; margin-left: 5px;"> {{ 'Crea ticket' | translate}} </span>
51
+ </ion-button> -->
52
+
53
+ <ion-button *ngIf="idConv.startsWith('support-group') && conv_type !== 'archived'" ion-button fill="clear" color="primary" size="small"
54
+ (click)="closeConversation()" [ngClass]="{'resolve-conv-margin-right': !isMobile}" [disabled]="conv_closed === true">
55
+ <!-- <ion-icon slot="icon-only" name="alert-circle-outline"></ion-icon> -->
56
+ <ion-icon name="archive-outline"></ion-icon>
57
+ <!-- <ion-icon slot="icon-only" name="information-outline"></ion-icon> -->
58
+ <span style="text-transform: capitalize; margin-left: 5px;"> {{ 'Resolve' | translate}} </span>
59
+ </ion-button>
60
+
61
+ <ion-button *ngIf="!openInfoConversation" ion-button fill="clear" (click)="onOpenCloseInfoConversation()">
62
+ <!-- <ion-icon slot="icon-only" name="alert-circle-outline"></ion-icon> -->
63
+ <ion-icon slot="icon-only" name="information-circle-outline"></ion-icon>
64
+ <!-- <ion-icon slot="icon-only" name="information-outline"></ion-icon> -->
65
+
66
+ </ion-button>
67
+ <ion-button *ngIf="openInfoConversation" ion-button fill="clear" (click)="onOpenCloseInfoConversation()">
68
+ <ion-icon slot="icon-only" name="close-circle-outline"></ion-icon>
69
+ </ion-button>
67
70
 
68
71
  </ion-buttons>
69
72
 
@@ -58,7 +58,7 @@ ion-header {
58
58
  top: 0;
59
59
  left: 50px;
60
60
  vertical-align: middle;
61
- cursor: pointer;
61
+ // cursor: pointer;
62
62
  }
63
63
  .tile-point {
64
64
  width: 10px;
@@ -150,6 +150,7 @@ ion-header {
150
150
 
151
151
  .tile-info-with-ios {
152
152
  left: 82px !important;
153
+ top: 10px!important;
153
154
  }
154
155
 
155
156
  .user-presence-ios {
@@ -158,4 +159,9 @@ ion-header {
158
159
 
159
160
  .avatar-container-ios {
160
161
  left: 55px;
162
+ top: 10px;
163
+ }
164
+
165
+ .resolve-conv-margin-right {
166
+ margin-right: 52px;
161
167
  }