@chat21/chat21-ionic 3.0.86-rc.4 → 3.0.86-rc.5

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 (35) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/package.json +1 -1
  3. package/src/app/app.component.scss +2 -0
  4. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +14 -6
  5. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +1 -0
  6. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +23 -5
  7. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +13 -0
  8. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +9 -0
  9. package/src/app/components/conversations-list/header-conversations-list-unassigned/header-conversations-list-unassigned.component.html +11 -0
  10. package/src/app/components/conversations-list/header-conversations-list-unassigned/header-conversations-list-unassigned.component.scss +14 -0
  11. package/src/app/components/conversations-list/header-conversations-list-unassigned/header-conversations-list-unassigned.component.spec.ts +24 -0
  12. package/src/app/components/conversations-list/header-conversations-list-unassigned/header-conversations-list-unassigned.component.ts +25 -0
  13. package/src/app/components/project-item/project-item.component.ts +2 -2
  14. package/src/app/pages/conversation-detail/conversation-detail.page.ts +12 -14
  15. package/src/app/pages/conversations-list/conversations-list.page.html +24 -3
  16. package/src/app/pages/conversations-list/conversations-list.page.ts +20 -2
  17. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.ts +4 -0
  18. package/src/app/shared/shared.module.ts +3 -0
  19. package/src/assets/i18n/ar.json +3 -0
  20. package/src/assets/i18n/az.json +3 -0
  21. package/src/assets/i18n/de.json +3 -0
  22. package/src/assets/i18n/en.json +3 -0
  23. package/src/assets/i18n/es.json +3 -0
  24. package/src/assets/i18n/fr.json +3 -0
  25. package/src/assets/i18n/it.json +3 -0
  26. package/src/assets/i18n/kk.json +3 -0
  27. package/src/assets/i18n/pt.json +3 -0
  28. package/src/assets/i18n/ru.json +3 -0
  29. package/src/assets/i18n/sr.json +3 -0
  30. package/src/assets/i18n/sv.json +3 -0
  31. package/src/assets/i18n/tr.json +3 -0
  32. package/src/assets/i18n/uk.json +3 -0
  33. package/src/assets/i18n/uz.json +3 -0
  34. package/src/chat21-core/utils/convertRequestToConversation.ts +2 -2
  35. package/src/global.scss +10 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ### 3.0.86 in PROD
4
4
 
5
+ ### 3.0.86-rc.6
6
+ - bug-fixed: do not change showSourceInfo status if sourcePage info not exist
7
+ - bug-fixed: last_project is undefined
8
+
9
+ ### 3.0.86-rc.5
10
+ - added: header-conversations-list-unassigned component
11
+ - added: toast after text is copied
12
+ - added: unassigned header to conversations-list page and joinConversation options icon
13
+ - removed: "Open" - "Close info detail" string from close/open info conversation detail
14
+
5
15
  ### 3.0.86-rc.4
6
16
  - bug-fixed: close emoji-picker if focus is on message-text-area
7
17
  - bug-fixed: removed hover background bell icon
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chat21/chat21-ionic",
3
3
  "author": "Tiledesk SRL",
4
- "version": "3.0.86-rc.4",
4
+ "version": "3.0.86-rc.5",
5
5
  "license": "MIT License",
6
6
  "homepage": "https://tiledesk.com/",
7
7
  "repository": {
@@ -46,3 +46,5 @@
46
46
  // display: block; // Safari bug fix
47
47
  // }
48
48
  // }
49
+
50
+
@@ -53,13 +53,21 @@
53
53
  <!-- nk - no tag ionic -->
54
54
  <!-- ----------------------------------------------------------- -->
55
55
  <div class="manage_conversation_info_container" [ngClass]="{'close': !openInfoConversation, 'mobile': isMobile}">
56
- <ion-button fill="clear" *ngIf="openInfoConversation" (click)="onOpenCloseInfoConversationFN()">
56
+ <ion-button fill="clear" *ngIf="openInfoConversation" (click)="onOpenCloseInfoConversationFN()"
57
+ [tooltip]="closeGroupTooltip" [options]="tooltipOptions" placement="bottom" content-type="template">
57
58
  <ion-icon name="arrow-forward-outline"></ion-icon>
58
- {{translationMap.get('LABEL_CLOSE_GROUP')}}
59
+ <!-- {{translationMap.get('LABEL_CLOSE_GROUP')}} -->
60
+ <ng-template #closeGroupTooltip>
61
+ <span> {{ translationMap?.get('LABEL_CLOSE_GROUP')}} </span>
62
+ </ng-template>
59
63
  </ion-button>
60
- <ion-button fill="clear" *ngIf="!openInfoConversation" (click)="onOpenCloseInfoConversationFN()">
64
+ <ion-button fill="clear" *ngIf="!openInfoConversation" (click)="onOpenCloseInfoConversationFN()"
65
+ [tooltip]="openGroupTooltip" [options]="tooltipOptions" placement="bottom" content-type="template">
61
66
  <ion-icon name="arrow-back-outline"></ion-icon>
62
- {{translationMap.get('LABEL_OPEN_INFO_CONVERSATION')}}
67
+ <ng-template #openGroupTooltip>
68
+ <span> {{ translationMap?.get('LABEL_OPEN_INFO_CONVERSATION')}} </span>
69
+ </ng-template>
70
+ <!-- {{translationMap.get('LABEL_OPEN_INFO_CONVERSATION')}} -->
63
71
  </ion-button>
64
72
  </div>
65
73
 
@@ -166,7 +174,7 @@
166
174
  (onBeforeMessageRender)="onBeforeMessageRenderFN($event)"
167
175
  (onAfterMessageRender)="onAfterMessageRenderFN($event)"
168
176
  (onElementRendered)="onElementRenderedFN($event)"
169
- (click)="onBubbleMessageClick($event, i)">
177
+ (click)="onBubbleMessageClick($event, message, i)">
170
178
  </chat-bubble-message>
171
179
 
172
180
  <div class="options-container">
@@ -201,7 +209,7 @@
201
209
 
202
210
  <div class="base_receive sourcePage-container" *ngIf="messageType(MESSAGE_TYPE_OTHERS, message) && message?.attributes?.sourcePage" [class.show]="showSourceInfo && showSourceInfoIndex===i">
203
211
  <svg xmlns="http://www.w3.org/2000/svg" height="15px" width="15px" viewBox="0 0 24 24" fill="none"><path _ngcontent-wrg-c96="" d="M0 0h24v24H0V0z" fill="none"></path><path _ngcontent-wrg-c96="" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-.61.08-1.21.21-1.78L8.99 15v1c0 1.1.9 2 2 2v1.93C7.06 19.43 4 16.07 4 12zm13.89 5.4c-.26-.81-1-1.4-1.9-1.4h-1v-3c0-.55-.45-1-1-1h-6v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41C17.92 5.77 20 8.65 20 12c0 2.08-.81 3.98-2.11 5.4z"></path></svg>
204
- <span title="{{message?.attributes?.sourcePage}}" class="truncate">{{message?.attributes?.sourcePage}}</span>
212
+ <span title="{{message?.attributes?.sourcePage}}" class="truncate"><a target="_blank" href="{{message?.attributes?.sourcePage}}">{{message?.attributes?.sourcePage}}</a></span>
205
213
  </div>
206
214
 
207
215
  <!-- message type:: button && -->
@@ -347,6 +347,7 @@ ion-item {
347
347
  .sourcePage-container{
348
348
  margin: 0 0px 0px 10px;
349
349
  display: none;
350
+ width: 75%;
350
351
  align-items: center;
351
352
  color: rgb(135, 150, 175);
352
353
  font-size: 12px;
@@ -15,7 +15,7 @@ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk
15
15
  import { TranslateService } from '@ngx-translate/core';
16
16
  import * as moment from 'moment';
17
17
  import { AppConfigProvider } from 'src/app/services/app-config';
18
- import { ModalController, PopoverController } from '@ionic/angular';
18
+ import { ModalController, PopoverController, ToastController } from '@ionic/angular';
19
19
  import { CreateCannedResponsePage } from 'src/app/modals/create-canned-response/create-canned-response.page';
20
20
 
21
21
  @Component({
@@ -71,7 +71,8 @@ export class IonConversationDetailComponent extends ConversationContentComponent
71
71
  private translate: TranslateService,
72
72
  public appConfigProvider: AppConfigProvider,
73
73
  public modalController: ModalController,
74
- public popoverController: PopoverController
74
+ public popoverController: PopoverController,
75
+ public toastController: ToastController
75
76
  ) {
76
77
  super(cdref, uploadService)
77
78
 
@@ -158,11 +159,14 @@ export class IonConversationDetailComponent extends ConversationContentComponent
158
159
  onClickCopyMesage(event, message: MessageModel){
159
160
  this.logger.log('[CONVS-DETAIL][ION-CONVS-DETAIL] - onClickCopyMesage');
160
161
  navigator.clipboard.writeText(message.text)
162
+ this.presentToast()
161
163
  }
162
164
 
163
- onBubbleMessageClick(event: any, index: number){
164
- this.showSourceInfo = !this.showSourceInfo
165
- this.showSourceInfoIndex = index
165
+ onBubbleMessageClick(event: any, message: MessageModel, index: number){
166
+ if(message && message.attributes && message.attributes.sourcePage){
167
+ this.showSourceInfo = !this.showSourceInfo
168
+ this.showSourceInfoIndex = index
169
+ }
166
170
  }
167
171
 
168
172
  onElementRenderedFN(event) {
@@ -229,4 +233,18 @@ export class IonConversationDetailComponent extends ConversationContentComponent
229
233
 
230
234
  return await popover.present();
231
235
  }
236
+
237
+ async presentToast(){
238
+ const toast = await this.toastController.create({
239
+ message: '<div style="display: flex">'+
240
+ '<ion-icon name="copy"></ion-icon> '+
241
+ `<span>${this.translationMap.get("COPY_MESSAGE_TOAST")}</span>`+
242
+ '</div>',
243
+ duration: 3000,
244
+ color: 'light',
245
+ position: 'bottom',
246
+ cssClass: 'toast-copy'
247
+ });
248
+ toast.present();
249
+ }
232
250
  }
@@ -167,6 +167,19 @@
167
167
  <span *ngIf="!conversation?.recipient.startsWith('support-group')"> {{ translationsMap?.get('Archive') }} </span>
168
168
  </ng-template>
169
169
  </ion-button>
170
+
171
+ <!-- <ion-button *ngIf="conversation?.recipient.startsWith('support-group') && !conversation.archived" [tooltip]="joinTooltip" [options]="tooltip_options" placement="bottom" content-type="template"
172
+ [ngClass]="{'hide': !isApp, 'button-on-desktop': !isApp, 'button-on-mobile': isApp }"
173
+ id="{{ 'join_conversation_button' + conversation.uid }}" class="close-conversation-button" ion-button clear
174
+ item-end (click)="joinConversation(conversation);$event.stopPropagation();" padding>
175
+ <ion-icon slot="icon-only" style="display:block;" id="{{ 'join_button_icon' + conversation.uid }}" name="link-outline" item-end></ion-icon>
176
+
177
+ <ng-template #joinTooltip>
178
+ <span>{{ translationsMap?.get('JOIN_CONVERSATION')}} </span>
179
+ </ng-template>
180
+ </ion-button> -->
181
+
182
+
170
183
  <!-- <ion-button *ngIf="conversation.archived" class="close-conversation-button" ion-button clear item-end disabled padding>
171
184
  <!- - <ion-icon style="display:block;" id="{{ 'close_button_icon' + conversation.uid }}" color="close-conversation" name="archive-outline" item-end></ion-icon> - ->
172
185
  <i class="material-icons" id="{{ 'close_button_icon' + conversation.uid }}" item-end> history </i>
@@ -30,6 +30,7 @@ export class IonListConversationsComponent extends ListConversationsComponent im
30
30
  @Input() archiveActionNotAllowed: boolean;
31
31
  @Input() uidConvSelected: string;
32
32
  @Output() onCloseConversation = new EventEmitter<ConversationModel>();
33
+ @Output() onJoinConversation = new EventEmitter<ConversationModel>();
33
34
  @Output() onCloseAlert = new EventEmitter();
34
35
 
35
36
  convertMessage = convertMessage;
@@ -129,6 +130,7 @@ export class IonListConversationsComponent extends ListConversationsComponent im
129
130
  const translationKeys = [
130
131
  'Resolve',
131
132
  'Archive',
133
+ 'JOIN_CONVERSATION',
132
134
  'ALERT_TITLE',
133
135
  'ActionNotAllowed',
134
136
  'CLOSE_ALERT_CONFIRM_LABEL',
@@ -219,5 +221,12 @@ export class IonListConversationsComponent extends ListConversationsComponent im
219
221
  let currentIndex = this.listConversations.findIndex(conv => conv.uid === conversation.uid)
220
222
  }
221
223
 
224
+ joinConversation(conversation: ConversationModel) {
225
+ var conversationId = conversation.uid;
226
+ this.logger.log('[ION-LIST-CONVS-COMP] - joinConversation - conversationId ', conversationId)
227
+ this.onJoinConversation.emit(conversation)
228
+ let currentIndex = this.listConversations.findIndex(conv => conv.uid === conversation.uid)
229
+ }
230
+
222
231
 
223
232
  }
@@ -0,0 +1,11 @@
1
+ <ion-toolbar [class.mobile]="isMobile">
2
+
3
+ <ion-buttons slot="start">
4
+ <ion-button ion-button (click)="onBackButtonHandler()">
5
+ <ion-icon slot="icon-only" name="arrow-back-outline"></ion-icon>
6
+ </ion-button>
7
+ </ion-buttons>
8
+
9
+ <ion-title> {{headerTitle}}</ion-title>
10
+
11
+ </ion-toolbar>
@@ -0,0 +1,14 @@
1
+ ion-toolbar {
2
+ height: var(--header-height);
3
+ &:not(.mobile){
4
+ --background: var(--list-bkg-color);
5
+ border: none;
6
+ }
7
+ &.mobile{
8
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
9
+ }
10
+
11
+ ion-button{
12
+ --color: var(--basic-blue);
13
+ }
14
+ }
@@ -0,0 +1,24 @@
1
+ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { IonicModule } from '@ionic/angular';
3
+
4
+ import { HeaderConversationsListUnassigned } from './header-conversations-list-unassigned.component';
5
+
6
+ describe('HeaderConversationsListUnassignedComponent', () => {
7
+ let component: HeaderConversationsListUnassigned;
8
+ let fixture: ComponentFixture<HeaderConversationsListUnassigned>;
9
+
10
+ beforeEach(async(() => {
11
+ TestBed.configureTestingModule({
12
+ declarations: [ HeaderConversationsListUnassigned ],
13
+ imports: [IonicModule.forRoot()]
14
+ }).compileComponents();
15
+
16
+ fixture = TestBed.createComponent(HeaderConversationsListUnassigned);
17
+ component = fixture.componentInstance;
18
+ fixture.detectChanges();
19
+ }));
20
+
21
+ it('should create', () => {
22
+ expect(component).toBeTruthy();
23
+ });
24
+ });
@@ -0,0 +1,25 @@
1
+ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'header-conversations-list-unassigned',
5
+ templateUrl: './header-conversations-list-unassigned.component.html',
6
+ styleUrls: ['./header-conversations-list-unassigned.component.scss'],
7
+ })
8
+ export class HeaderConversationsListUnassigned implements OnInit {
9
+
10
+ @Input() headerTitle: string
11
+ @Input() isMobile: boolean;
12
+ @Output() onBackButton = new EventEmitter<boolean>();
13
+ static UserPresenceComponent: any[] | any;
14
+
15
+ constructor() { }
16
+
17
+ ngOnInit() {
18
+ // console.log('headertitleeee', this.headerTitle)
19
+ }
20
+
21
+ onBackButtonHandler(){
22
+ this.onBackButton.emit(true)
23
+ }
24
+
25
+ }
@@ -87,10 +87,10 @@ export class ProjectItemComponent implements OnInit {
87
87
  }
88
88
 
89
89
  openUnservedConvs() {
90
- this.openUnsevedConvsEvent.emit('notificationsorprjctbtn')
90
+ this.openUnsevedConvsEvent.emit({event: 'notificationsorprjctbtn', data: this.unservedConversations})
91
91
  }
92
92
  openUnservedConvsAndGoToProjectList() {
93
- this.openUnsevedConvsEvent.emit('pinbtn')
93
+ this.openUnsevedConvsEvent.emit({event:'pinbtn', data: this.unservedConversations})
94
94
  }
95
95
 
96
96
  getStoredTokenAndConnectWS() {
@@ -291,19 +291,13 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
291
291
 
292
292
 
293
293
  getStoredProjectAndUserRole() {
294
- const stored_project = localStorage.getItem('last_project')
295
- // console.log('[SIDEBAR] stored_project ', stored_project)
296
- if (stored_project && stored_project !== undefined) {
297
- const project = JSON.parse(stored_project)
298
- // this.logger.log('[CONVS-DETAIL] project ', project)
299
-
300
- // this.project_id = project.id_project.id
301
- // this.logger.log('[CONVS-DETAIL] project_id ', this.project_id)
302
-
303
- this.USER_ROLE = project.role;
304
- // this.USER_ROLE = 'agent';
305
- this.logger.log('[CONVS-DETAIL] USER_ROLE ', this.USER_ROLE)
306
- }
294
+ this.events.subscribe('storage:last_project',project =>{
295
+ this.logger.log('[CONVS-DETAIL] stored_project ', project)
296
+ if (project && project !== 'undefined') {
297
+ this.USER_ROLE = project.role;
298
+ this.logger.log('[CONVS-DETAIL] USER_ROLE ', this.USER_ROLE)
299
+ }
300
+ });
307
301
  }
308
302
 
309
303
  getConversations() {
@@ -636,7 +630,9 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
636
630
  "SEND_EMAIL_SUCCESS",
637
631
  "SEND_EMAIL_ERROR",
638
632
  "SUBJECT_OFFLINE_MESSAGE",
639
- "SEND_EMAIL_SUCCESS_OFFLINE_MESSAGE"
633
+ "SEND_EMAIL_SUCCESS_OFFLINE_MESSAGE",
634
+
635
+
640
636
  ]
641
637
 
642
638
  const keysHeader = [
@@ -657,6 +653,8 @@ export class ConversationDetailPage implements OnInit, OnDestroy, AfterViewInit
657
653
  'LABEL_OPEN_INFO_CONVERSATION',
658
654
  'LABEL_CLOSE_GROUP',
659
655
  'LABEL_IS_WRITING',
656
+ 'COPY',
657
+ 'COPY_MESSAGE_TOAST'
660
658
  ]
661
659
 
662
660
  this.translationsMap = this.customTranslateService.translateLanguage(keys)
@@ -11,11 +11,18 @@
11
11
  (openProfileInfo)=openProfileInfo($event)>
12
12
  </header-conversations-list>
13
13
 
14
- <header-conversations-list-archived *ngIf="conversationType !=='active'"
14
+ <header-conversations-list-archived *ngIf="conversationType ==='archived'"
15
15
  [headerTitle]=headerTitle
16
16
  [isMobile]="isMobile"
17
17
  (onBackButton)=onBackButtonFN($event)>
18
18
  </header-conversations-list-archived>
19
+
20
+ <header-conversations-list-unassigned *ngIf="conversationType ==='unassigned'"
21
+ [headerTitle]=headerTitle
22
+ [isMobile]="isMobile"
23
+ (onBackButton)=onBackButtonFN($event)>
24
+ </header-conversations-list-unassigned>
25
+
19
26
  </ion-header>
20
27
 
21
28
  <!-- appScrollbarTheme -->
@@ -39,7 +46,7 @@
39
46
  </ion-item>
40
47
 
41
48
  <span
42
- *ngIf="(conversations.length > 0 && conversationType ==='active') || (archivedConversations.length > 0 && conversationType ==='archived');then contentConversations else contentMessageWelcome">
49
+ *ngIf="(conversations.length > 0 && conversationType ==='active') || (archivedConversations.length > 0 && conversationType ==='archived') || (unassignedConversations.length > 0 && conversationType ==='unassigned');then contentConversations else contentMessageWelcome">
43
50
  here is ignored
44
51
  </span>
45
52
 
@@ -73,6 +80,20 @@
73
80
  (onImageLoaded)="onImageLoaded($event)"
74
81
  (onConversationLoaded)="onConversationLoaded($event)">
75
82
  </ion-list-conversations>
83
+
84
+ <!-- ---------------------------------- -->
85
+ <!-- UNASSIGNED CONVERSATION LIST -->
86
+ <!-- ---------------------------------- -->
87
+ <ion-list-conversations *ngIf="conversationType ==='unassigned'"
88
+ [listConversations]="unassignedConversations"
89
+ [stylesMap]="stylesMap"
90
+ [translationMap]="translationMapConversation"
91
+ (onConversationSelected)=onConversationSelected($event)
92
+ (onCloseConversation)="onCloseConversation($event)"
93
+ (onJoinConversation) ="onJoinConversation($event)"
94
+ (onImageLoaded)="onImageLoaded($event)"
95
+ (onConversationLoaded)="onConversationLoaded($event)">
96
+ </ion-list-conversations>
76
97
  </ng-template>
77
98
 
78
99
  <ng-template #contentMessageWelcome>
@@ -102,7 +123,7 @@
102
123
  </div>
103
124
 
104
125
  <div id="no-convs-wpr"
105
- *ngIf="(!loadingIsActive && conversations.length === 0) || (!loadingIsActive && archivedConversations.length === 0) ">
126
+ *ngIf="(!loadingIsActive && conversations.length === 0) || (!loadingIsActive && archivedConversations.length === 0) || (!loadingIsActive && unassignedConversations.length === 0)">
106
127
  <ion-item id="no-convs" class="ion-text-center" lines="none">
107
128
  <ion-label class="ion-text-wrap" color="medium">
108
129
  {{ 'LABEL_MSG_PUSH_START_CHAT' | translate }}
@@ -64,6 +64,7 @@ export class ConversationListPage implements OnInit {
64
64
  public loggedUserUid: string
65
65
  public conversations: Array<ConversationModel> = []
66
66
  public archivedConversations: Array<ConversationModel> = []
67
+ public unassignedConversations: Array<ConversationModel> = []
67
68
  public uidConvSelected: string
68
69
  public conversationSelected: ConversationModel
69
70
  public uidReciverFromUrl: string
@@ -253,22 +254,33 @@ export class ConversationListPage implements OnInit {
253
254
  this.lastProjectId = projectid
254
255
  }
255
256
 
256
- openUnsevedConversationIframe(event) {
257
+ openUnsevedConversationIframe(event:{event: string, data: ConversationModel[]}) {
257
258
  this.logger.log('[CONVS-LIST-PAGE] openUnsevedConversationIframe ', event)
258
259
  this.hasClickedOpenUnservedConvIframe = true
260
+ // if(event && event.data){
261
+ // this.conversationType = 'unassigned'
262
+ // this.unassignedConversations = event.data
263
+
264
+ // const keys = ['UnassignedConversations']
265
+ // // const keys = ['History'];
266
+
267
+ // this.headerTitle = this.translateService.translateLanguage(keys).get(keys[0])
268
+ // }
259
269
  this.logger.log('[CONVS-LIST-PAGE] - HAS CLIKED OPEN UNSERVED REQUEST IFRAME',this.hasClickedOpenUnservedConvIframe )
260
270
  const DASHBOARD_BASE_URL = this.appConfigProvider.getConfig().dashboardUrl
261
271
  // http://localhost:4204/#/projects-for-panel
262
272
  this.PROJECTS_FOR_PANEL_URL = DASHBOARD_BASE_URL + '#/projects-for-panel'
263
273
  this.UNASSIGNED_CONVS_URL = DASHBOARD_BASE_URL + '#/project/' + this.lastProjectId + '/unserved-request-for-panel'
264
274
 
265
- if (event === 'pinbtn') {
275
+ if (event.event === 'pinbtn') {
266
276
  this.IFRAME_URL = this.PROJECTS_FOR_PANEL_URL
267
277
  } else {
268
278
  this.IFRAME_URL = this.UNASSIGNED_CONVS_URL
269
279
  }
270
280
  this.logger.log('[CONVS-LIST-PAGE] - HAS CLIKED OPEN UNSERVED REQUEST IFRAME > UNASSIGNED CONVS URL',this.UNASSIGNED_CONVS_URL )
271
281
  this.openUnassignedConversations(this.IFRAME_URL, event)
282
+
283
+
272
284
  }
273
285
 
274
286
  // ---------------------------------------------------------
@@ -649,6 +661,8 @@ export class ConversationListPage implements OnInit {
649
661
  conversationSelected = this.conversations.find((item) => item.uid === this.uidConvSelected)
650
662
  } else if (conversationType === 'archived') {
651
663
  conversationSelected = this.archivedConversations.find((item) => item.uid === this.uidConvSelected)
664
+ } else if (conversationType === 'unassigned') {
665
+ conversationSelected = this.unassignedConversations.find((item) => item.uid === this.uidConvSelected)
652
666
  }
653
667
  if (conversationSelected) {
654
668
  this.logger.log('[CONVS-LIST-PAGE] conversationSelected', conversationSelected)
@@ -873,6 +887,10 @@ export class ConversationListPage implements OnInit {
873
887
  })
874
888
  }
875
889
 
890
+ onJoinConversation(conversation: ConversationModel){
891
+ this.logger.log('[CONVS-LIST-PAGE] onJoinConversation conversation', conversation)
892
+ }
893
+
876
894
  // ----------------------------------------------------------------------------------------------
877
895
  // onCloseConversation
878
896
  // https://github.com/chat21/chat21-cloud-functions/blob/master/docs/api.md#delete-a-conversation
@@ -48,6 +48,10 @@ export class UnassignedConversationsPage implements OnInit {
48
48
  this.hideHotjarFeedbackBtn();
49
49
  }
50
50
 
51
+ ngOnDestroy(){
52
+ this.logger.log('[UNASSIGNED-CONVS-PAGE] - onDestroy called', this.iframe_URL);
53
+ }
54
+
51
55
  hideHotjarFeedbackBtn() {
52
56
  const hotjarFeedbackBtn = <HTMLElement>document.querySelector("#_hj_feedback_container > div > button")
53
57
  if (hotjarFeedbackBtn) {
@@ -1,3 +1,4 @@
1
+ import { HeaderConversationsListUnassigned } from './../components/conversations-list/header-conversations-list-unassigned/header-conversations-list-unassigned.component';
1
2
  import { NavbarComponent } from './../components/navbar/navbar.component';
2
3
  import { FormsModule } from '@angular/forms';
3
4
  import { NgSelectModule } from '@ng-select/ng-select';
@@ -90,6 +91,7 @@ import { SafeHtmlPipe } from '../directives/safe-html.pipe';
90
91
  HtmlEntitiesEncodePipe,
91
92
  SafeHtmlPipe,
92
93
  HeaderConversationsListArchived,
94
+ HeaderConversationsListUnassigned,
93
95
  NetworkOfflineComponent
94
96
  ],
95
97
  exports: [
@@ -123,6 +125,7 @@ import { SafeHtmlPipe } from '../directives/safe-html.pipe';
123
125
  InfoDirectComponent,
124
126
  InfoGroupComponent,
125
127
  HeaderConversationsListArchived,
128
+ HeaderConversationsListUnassigned,
126
129
  NetworkOfflineComponent
127
130
 
128
131
  ],
@@ -240,6 +240,9 @@
240
240
  "Settings": "إعدادات",
241
241
  "Resolve": "حل",
242
242
  "Archive": "أرشيف",
243
+ "JOIN_CONVERSATION":"انضم إلى المحادثة",
244
+ "COPY":"ينسخ",
245
+ "COPY_MESSAGE_TOAST":"<b> تم النسخ إلى الحافظة! </ b> الصقها أينما تريد.",
243
246
  "ActionNotAllowed": "الإجراء غير مسموح به",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation": "لم تعد من بين زملائك في الفريق الذين يديرون هذه المحادثة",
245
248
  "TicketSuccessfullyCreated":"تم إنشاء التذكرة بنجاح",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Parametrlər",
241
241
  "Resolve": "Həll et",
242
242
  "Archive": "Arxiv",
243
+ "JOIN_CONVERSATION":"Söhbətə qoşulun",
244
+ "COPY":"Kopyalayın",
245
+ "COPY_MESSAGE_TOAST":"<b> Buferə kopyalandı!</b> Onu istədiyiniz yerə yapışdırın.",
243
246
  "ActionNotAllowed": "Fəaliyyətə icazə verilmir",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation": "Siz artıq bu söhbəti idarə edən komanda yoldaşları arasında deyilsiniz",
245
248
  "TicketSuccessfullyCreated": "Bilet uğurla yaradıldı",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Einstellungen",
241
241
  "Resolve": "Lösen",
242
242
  "Archive": "Archivieren",
243
+ "JOIN_CONVERSATION":"Nehmen Sie am Gespräch teil",
244
+ "COPY":"Kopieren",
245
+ "COPY_MESSAGE_TOAST":"<b> In die Zwischenablage kopiert!</b> An beliebiger Stelle einfügen.",
243
246
  "ActionNotAllowed": "Aktion nicht erlaubt",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"Sie gehören nicht mehr zu den Teamkollegen, die diese Unterhaltung führen",
245
248
  "TicketSuccessfullyCreated": "Ticket erfolgreich erstellt",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Settings",
241
241
  "Resolve": "Resolve",
242
242
  "Archive": "Archive",
243
+ "JOIN_CONVERSATION":"Join conversation",
244
+ "COPY":"Copy",
245
+ "COPY_MESSAGE_TOAST":"<b> Copied to clipboard!</b> Paste it wherever you like.",
243
246
  "ActionNotAllowed":"Action not allowed",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"You are no longer among the teammates managing this conversation",
245
248
  "TicketSuccessfullyCreated":"Ticket successfully created",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Ajustes",
241
241
  "Resolve": "Resolver",
242
242
  "Archive": "Archivas",
243
+ "JOIN_CONVERSATION":"Unirse a la conversación",
244
+ "COPY":"Copiar",
245
+ "COPY_MESSAGE_TOAST":"<b> Copiado al portapapeles!</b> Pégalo donde quieras.",
243
246
  "ActionNotAllowed":"Acción no permitida",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"Ya no estás entre los compañeros de equipo que gestionan esta conversación",
245
248
  "TicketSuccessfullyCreated":"Ticket creado con éxito",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Réglages",
241
241
  "Resolve": "Résoudre",
242
242
  "Archive": "Archiver",
243
+ "JOIN_CONVERSATION":"Rejoindre la conversation",
244
+ "COPY":"Copie",
245
+ "COPY_MESSAGE_TOAST":"<b> Copié dans le presse-papier !</b> Collez-le où vous le souhaitez.",
243
246
  "ActionNotAllowed":"Action non autorisée",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"Vous n'êtes plus parmi les coéquipiers qui gèrent cette conversation",
245
248
  "TicketSuccessfullyCreated":"Ticket créé avec succès",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Impostazioni",
241
241
  "Resolve": "Risolvi",
242
242
  "Archive": "Archivia",
243
+ "JOIN_CONVERSATION":"Partecipa alla chat",
244
+ "COPY":"Copia",
245
+ "COPY_MESSAGE_TOAST":"<b> Copiato negli appunti!</b> Incollalo dove preferisci.",
243
246
  "ActionNotAllowed":"Azione non permessa",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"Non sei più tra i compagni di squadra che gestiscono questa conversazione",
245
248
  "TicketSuccessfullyCreated":"Ticket creato con successo",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Параметрлер",
241
241
  "Resolve": "Шешіңіз",
242
242
  "Archive": "Мұрағат",
243
+ "JOIN_CONVERSATION":"Әңгімеге қосылу",
244
+ "COPY":"Көшіру",
245
+ "COPY_MESSAGE_TOAST":"<b> Буферге көшірілді!</b> Оны қалаған жеріңізге қойыңыз.",
243
246
  "ActionNotAllowed": "Әрекетке рұқсат етілмейді",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation": "Сіз бұдан былай осы әңгімені басқаратын командаластардың арасында емессіз",
245
248
  "TicketSuccessfullyCreated": "Билет сәтті жасалды",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Configurações",
241
241
  "Resolve": "Resolver",
242
242
  "Archive": "Arquivar",
243
+ "JOIN_CONVERSATION":"Entrar na conversa",
244
+ "COPY":"Cópia",
245
+ "COPY_MESSAGE_TOAST":"<b> Copiado para a área de transferência!</b> Cole onde quiser.",
243
246
  "ActionNotAllowed":"Ação não autorizada",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"Você não está mais entre os colegas de equipe que estão gerenciando esta conversa",
245
248
  "TicketSuccessfullyCreated":"Ticket criado com sucesso",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Настройки",
241
241
  "Resolve": "Pазрешить",
242
242
  "Archive": "Архивировать",
243
+ "JOIN_CONVERSATION":"Присоединиться к беседе",
244
+ "COPY":"Копировать",
245
+ "COPY_MESSAGE_TOAST":"<b> Скопировано в буфер обмена!</b> Вставьте куда хотите.",
243
246
  "ActionNotAllowed":"Действие не разрешено",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"Вы больше не входите в число товарищей по команде, ведущих этот разговор",
245
248
  "TicketSuccessfullyCreated":"Тикет успешно создан",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Подешавања",
241
241
  "Resolve": "Ресолве",
242
242
  "Archive": "Архива",
243
+ "JOIN_CONVERSATION":"Придружите се разговору",
244
+ "COPY":"Копирај",
245
+ "COPY_MESSAGE_TOAST":"<b> Копирано у међуспремник!</b> Налепите где год желите.",
243
246
  "ActionNotAllowed":"Радња није дозвољена",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"Више нисте међу саиграчима који управљају овим разговором",
245
248
  "TicketSuccessfullyCreated":"Улазница је успешно направљена",
@@ -240,6 +240,9 @@
240
240
  "Settings": "inställningar",
241
241
  "Resolve": "Lösa",
242
242
  "Archive": "Arkiv",
243
+ "JOIN_CONVERSATION":"Gå med i konversationen",
244
+ "COPY":"Kopiera",
245
+ "COPY_MESSAGE_TOAST":"<b> Kopierat till urklipp!</b> Klistra in det var du vill.",
243
246
  "ActionNotAllowed": "Åtgärd inte tillåten",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation": "Du är inte längre bland lagkamraterna som hanterar den här konversationen",
245
248
  "TicketSuccessfullyCreated": "Biljetten har skapats",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Ayarlar",
241
241
  "Resolve": "Çözmek",
242
242
  "Archive": "Arşivle",
243
+ "JOIN_CONVERSATION":"Sohbete katıl",
244
+ "COPY":"Kopyala",
245
+ "COPY_MESSAGE_TOAST":"<b> Panoya kopyalandı!</b> İstediğiniz yere yapıştırın.",
243
246
  "ActionNotAllowed":"İşleme izin verilmiyor",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation":"Artık bu konuşmayı yöneten takım arkadaşları arasında değilsiniz",
245
248
  "TicketSuccessfullyCreated":"Bilet başarıyla oluşturuldu",
@@ -240,6 +240,9 @@
240
240
  "Settings": "Налаштування",
241
241
  "Resolve": "Вирішити",
242
242
  "Archive": "Архів",
243
+ "JOIN_CONVERSATION":"Приєднатися до розмови",
244
+ "COPY":"Копія",
245
+ "COPY_MESSAGE_TOAST":"<b> Скопійовано в буфер обміну!</b> Вставте куди завгодно.",
243
246
  "ActionNotAllowed": "Дія не дозволена",
244
247
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation": "Ви більше не серед товаришів по команді, які керують цією розмовою",
245
248
  "TicketSuccessfullyCreated": "Квиток успішно створено",
@@ -241,6 +241,9 @@
241
241
  "Settings": "Sozlamalar",
242
242
  "Resolve": "Yechish",
243
243
  "Archive": "Arxiv",
244
+ "JOIN_CONVERSATION":"Suhbatga qo'shiling",
245
+ "COPY":"Nusxalash",
246
+ "COPY_MESSAGE_TOAST":"<b> Buferga nusxalandi!</b> Uni xohlagan joyga joylashtiring.",
244
247
  "ActionNotAllowed": "Harakatga ruxsat berilmagan",
245
248
  "YouAreNoLongerAmongTheTeammatesManagingThisConversation": "Siz endi bu suhbatni boshqarayotgan jamoadoshlar orasida emassiz",
246
249
  "TicketSuccessfullyCreated": "Chipta muvaffaqiyatli yaratildi",
@@ -19,9 +19,9 @@ export class ConvertRequestToConversation {
19
19
  request.attributes,
20
20
  request.request_id && (request.request_id.startsWith('group-') || request.request_id.startsWith('support-group'))? TYPE_SUPPORT_GROUP: TYPE_DIRECT,
21
21
  request.lead && request.lead.fullname ? request.lead.fullname: null,
22
- request.requester_id,
22
+ request.request_id,
23
+ request.request_id,
23
24
  request.lead && request.lead.fullname ? request.lead.fullname: null,
24
- request.requester_id,
25
25
  '',
26
26
  true,
27
27
  request.first_text,
package/src/global.scss CHANGED
@@ -742,3 +742,13 @@ ul.dropdown-menu > li > a {
742
742
  border-radius: 16px !important;
743
743
  }
744
744
 
745
+
746
+ //TOAST
747
+ .toast-copy{
748
+ --end: 0px;
749
+ --width: auto;
750
+ .toast-message{
751
+ display: flex !important;
752
+ }
753
+ }
754
+