@chat21/chat21-ionic 3.0.60-rc6 → 3.0.61-rc2
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.
- package/CHANGELOG.md +44 -0
- package/LICENSE +661 -21
- package/README.md +2 -0
- package/angular.json +2 -0
- package/env.sample +3 -1
- package/package.json +5 -1
- package/src/app/app.component.html +11 -2
- package/src/app/app.component.scss +13 -1
- package/src/app/app.component.ts +70 -23
- package/src/app/app.module.ts +3 -2
- package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +62 -36
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +2 -2
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +64 -14
- package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +2 -3
- package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +5 -2
- package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +4 -0
- package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +2 -2
- package/src/app/components/conversation-info/info-content/info-content.component.html +2 -2
- package/src/app/components/ddp-header/ddp-header.component.html +14 -7
- package/src/app/components/ddp-header/ddp-header.component.scss +4 -0
- package/src/app/components/ddp-header/ddp-header.component.ts +21 -2
- package/src/app/components/project-item/project-item.component.html +37 -14
- package/src/app/components/project-item/project-item.component.scss +35 -15
- package/src/app/components/project-item/project-item.component.ts +17 -4
- package/src/app/components/sidebar/sidebar.component.html +210 -0
- package/src/app/components/sidebar/sidebar.component.scss +11 -0
- package/src/app/components/sidebar/sidebar.component.spec.ts +24 -0
- package/src/app/components/sidebar/sidebar.component.ts +400 -0
- package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +102 -0
- package/src/app/components/sidebar-user-details/sidebar-user-details.component.scss +310 -0
- package/src/app/components/sidebar-user-details/sidebar-user-details.component.spec.ts +24 -0
- package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +423 -0
- package/src/app/pages/conversation-detail/conversation-detail.page.html +34 -45
- package/src/app/pages/conversation-detail/conversation-detail.page.ts +154 -84
- package/src/app/pages/conversations-list/conversations-list.page.html +11 -7
- package/src/app/pages/conversations-list/conversations-list.page.ts +34 -9
- package/src/app/pages/profile-info/profile-info.page.html +2 -2
- package/src/app/pages/profile-info/profile-info.page.ts +23 -21
- package/src/app/pages/unassigned-conversations/unassigned-conversations.page.html +3 -3
- package/src/app/shared/shared.module.ts +16 -2
- package/src/assets/i18n/de.json +226 -0
- package/src/assets/i18n/en.json +25 -4
- package/src/assets/i18n/es.json +26 -5
- package/src/assets/i18n/fr.json +226 -0
- package/src/assets/i18n/it.json +26 -5
- package/src/assets/i18n/pt.json +226 -0
- package/src/assets/i18n/ru.json +226 -0
- package/src/assets/i18n/tr.json +227 -0
- package/src/assets/images/language_flag/ar.png +0 -0
- package/src/assets/images/language_flag/bg.png +0 -0
- package/src/assets/images/language_flag/ca.png +0 -0
- package/src/assets/images/language_flag/cs.png +0 -0
- package/src/assets/images/language_flag/da.png +0 -0
- package/src/assets/images/language_flag/de.png +0 -0
- package/src/assets/images/language_flag/el.png +0 -0
- package/src/assets/images/language_flag/en.png +0 -0
- package/src/assets/images/language_flag/es.png +0 -0
- package/src/assets/images/language_flag/fa.png +0 -0
- package/src/assets/images/language_flag/fi.png +0 -0
- package/src/assets/images/language_flag/fr.png +0 -0
- package/src/assets/images/language_flag/he.png +0 -0
- package/src/assets/images/language_flag/hi.png +0 -0
- package/src/assets/images/language_flag/hu.png +0 -0
- package/src/assets/images/language_flag/id.png +0 -0
- package/src/assets/images/language_flag/it.png +0 -0
- package/src/assets/images/language_flag/ja.png +0 -0
- package/src/assets/images/language_flag/ko.png +0 -0
- package/src/assets/images/language_flag/ml-IN.png +0 -0
- package/src/assets/images/language_flag/ne-NP.png +0 -0
- package/src/assets/images/language_flag/nl.png +0 -0
- package/src/assets/images/language_flag/no.png +0 -0
- package/src/assets/images/language_flag/pl.png +0 -0
- package/src/assets/images/language_flag/pt-BR.png +0 -0
- package/src/assets/images/language_flag/pt.png +0 -0
- package/src/assets/images/language_flag/ro.png +0 -0
- package/src/assets/images/language_flag/ru.png +0 -0
- package/src/assets/images/language_flag/sk.png +0 -0
- package/src/assets/images/language_flag/sl.png +0 -0
- package/src/assets/images/language_flag/sv-SE.png +0 -0
- package/src/assets/images/language_flag/ta.png +0 -0
- package/src/assets/images/language_flag/th.png +0 -0
- package/src/assets/images/language_flag/tr.png +0 -0
- package/src/assets/images/language_flag/uk.png +0 -0
- package/src/assets/images/language_flag/vi.png +0 -0
- package/src/assets/images/language_flag/zh-CN.png +0 -0
- package/src/assets/images/language_flag/zh-TW.png +0 -0
- package/src/assets/images/no_image_user.png +0 -0
- package/src/assets/js/chat21client.js +16 -3
- package/src/assets/tiledesk-solo-logo.png +0 -0
- package/src/chat-config-pre-test.json +3 -0
- package/src/chat-config-template.json +4 -1
- package/src/chat-config.json +4 -1
- package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +54 -43
- package/src/chat21-core/providers/firebase/firebase-conversations-handler.ts +23 -0
- package/src/chat21-core/providers/mqtt/mqtt-archivedconversations-handler.ts +1 -1
- package/src/chat21-core/utils/constants.ts +2 -0
- package/src/chat21-core/utils/utils.ts +12 -1
- package/src/global.scss +451 -3
- package/src/index.html +7 -0
package/README.md
CHANGED
package/angular.json
CHANGED
package/env.sample
CHANGED
|
@@ -3,7 +3,7 @@ DASHBOARD_URL=https://YOUR_DASHBOARD_URL
|
|
|
3
3
|
WS_URL=wss://YOUR_TILEDESK_SERVER_URL?token=
|
|
4
4
|
WS_URL_RELATIVE=********
|
|
5
5
|
SERVER_BASE_URL=http://localhost:3000/
|
|
6
|
-
|
|
6
|
+
FEATURES_TOKEN=CAR:F-PAY:F-ANA:F-ACT:F-APP:F
|
|
7
7
|
CHAT21_ENGINE=mqtt
|
|
8
8
|
UPLOAD_ENGINE=native
|
|
9
9
|
PUSH_ENGINE=none
|
|
@@ -11,6 +11,8 @@ FILE_UPLOAD_ACCEPT=*/*
|
|
|
11
11
|
TENANT=tilechat
|
|
12
12
|
LOG_LEVEL=INFO
|
|
13
13
|
SUPPORT_MODE=false
|
|
14
|
+
TEAMMATES_BUTTON=false,
|
|
15
|
+
ARCHIVED_BUTTON=false,
|
|
14
16
|
|
|
15
17
|
# For MQTT Chat Engine
|
|
16
18
|
MQTT_APPID=tilechat
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chat21/chat21-ionic",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.61-rc2",
|
|
4
4
|
"author": "Tiledesk SRL",
|
|
5
5
|
"homepage": "https://ionicframework.com/",
|
|
6
6
|
"scripts": {
|
|
@@ -13,10 +13,13 @@
|
|
|
13
13
|
},
|
|
14
14
|
"private": false,
|
|
15
15
|
"dependencies": {
|
|
16
|
+
"@angular/animations": "^8.2.14",
|
|
17
|
+
"@angular/cdk": "^8.2.3",
|
|
16
18
|
"@angular/common": "~8.2.14",
|
|
17
19
|
"@angular/core": "~8.2.14",
|
|
18
20
|
"@angular/forms": "~8.2.14",
|
|
19
21
|
"@angular/http": "^7.2.16",
|
|
22
|
+
"@angular/material": "^8.2.3",
|
|
20
23
|
"@angular/platform-browser": "~8.2.14",
|
|
21
24
|
"@angular/platform-browser-dynamic": "~8.2.14",
|
|
22
25
|
"@angular/router": "~8.2.14",
|
|
@@ -59,6 +62,7 @@
|
|
|
59
62
|
"ngx-logger": "^4.2.1",
|
|
60
63
|
"ngx-perfect-scrollbar": "^9.0.0",
|
|
61
64
|
"perfect-scrollbar": "^1.5.0",
|
|
65
|
+
"roboto-fontface": "^0.10.0",
|
|
62
66
|
"rxjs": "~6.5.1",
|
|
63
67
|
"tslib": "^1.9.0",
|
|
64
68
|
"zone.js": "~0.9.1"
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
<ion-app>
|
|
2
2
|
<div>
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
<app-image-viewer></app-image-viewer>
|
|
5
|
+
|
|
6
|
+
<div class="sidebar" [ngClass]="{'hide-sidebar': IS_ONLINE === false || IS_ON_MOBILE_DEVICE === true || SUPPORT_MODE === false}">
|
|
7
|
+
<app-sidebar></app-sidebar>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<div class="user-details-sidebar" [ngClass]="{'hide-sidebar': IS_ONLINE === false || IS_ON_MOBILE_DEVICE === true || SUPPORT_MODE === false}">
|
|
11
|
+
<app-sidebar-user-details> </app-sidebar-user-details>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
5
14
|
<ion-split-pane when="md" contentId="main">
|
|
6
15
|
|
|
7
|
-
<ion-nav #sidebarNav [root]="sidebarPage"></ion-nav>
|
|
16
|
+
<ion-nav #sidebarNav [root]="sidebarPage" [ngClass]="{'sidebar-visible': IS_ONLINE === true && SUPPORT_MODE === true, 'sidebar-hidden': IS_ON_MOBILE_DEVICE === true || SUPPORT_MODE === false}"></ion-nav>
|
|
8
17
|
<!-- our side menu -->
|
|
9
18
|
<!-- <ion-router-outlet id="sidebar" name='sidebar' animated="false" #masterNav> -->
|
|
10
19
|
<!-- <app-conversations-list></app-conversations-list> -->
|
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
.split-pane-md.split-pane-visible > .split-pane-side {
|
|
1
|
+
.split-pane-md.split-pane-visible > .split-pane-side {
|
|
2
2
|
min-width: 312px;
|
|
3
3
|
display: block; // Safari bug fix
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
+
.sidebar-visible {
|
|
7
|
+
margin-left: 60px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.sidebar-hidden {
|
|
11
|
+
margin-left: 0px;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.hide-sidebar {
|
|
15
|
+
display: none;
|
|
16
|
+
}
|
|
17
|
+
|
|
6
18
|
// @media (min-width: 768px) {
|
|
7
19
|
// .split-pane-md.split-pane-visible > .split-pane-side {
|
|
8
20
|
// min-width: 312px;
|
package/src/app/app.component.ts
CHANGED
|
@@ -58,6 +58,7 @@ import * as PACKAGE from 'package.json';
|
|
|
58
58
|
import { filter } from 'rxjs/operators'
|
|
59
59
|
import { WebSocketJs } from './services/websocket/websocket-js';
|
|
60
60
|
import { Location } from '@angular/common'
|
|
61
|
+
|
|
61
62
|
// import { filter } from 'rxjs/operators';
|
|
62
63
|
|
|
63
64
|
@Component({
|
|
@@ -98,7 +99,9 @@ export class AppComponent implements OnInit {
|
|
|
98
99
|
public missingConnectionToast: any
|
|
99
100
|
public executedInitializeAppByWatchConnection: boolean = false;
|
|
100
101
|
private version: string;
|
|
101
|
-
|
|
102
|
+
IS_ONLINE: boolean;
|
|
103
|
+
IS_ON_MOBILE_DEVICE: boolean;
|
|
104
|
+
SUPPORT_MODE: boolean;
|
|
102
105
|
// private isOnline: boolean = false;
|
|
103
106
|
|
|
104
107
|
wsService: WebSocketJs;
|
|
@@ -145,11 +148,20 @@ export class AppComponent implements OnInit {
|
|
|
145
148
|
|
|
146
149
|
this.saveInStorageNumberOfOpenedChatTab();
|
|
147
150
|
this.listenChatAlreadyOpenWithoutParamsInMobileMode()
|
|
148
|
-
|
|
151
|
+
this.isOnMobileDevice()
|
|
149
152
|
// this.listenToUrlChanges();
|
|
150
153
|
// this.getPageState();
|
|
151
154
|
}
|
|
152
155
|
|
|
156
|
+
isOnMobileDevice() {
|
|
157
|
+
this.IS_ON_MOBILE_DEVICE = false;
|
|
158
|
+
if (/Android|iPhone/i.test(window.navigator.userAgent)) {
|
|
159
|
+
this.IS_ON_MOBILE_DEVICE = true;
|
|
160
|
+
}
|
|
161
|
+
console.log('[APP-COMP] IS_ON_MOBILE_DEVICE', this.IS_ON_MOBILE_DEVICE)
|
|
162
|
+
return this.IS_ON_MOBILE_DEVICE;
|
|
163
|
+
}
|
|
164
|
+
|
|
153
165
|
|
|
154
166
|
|
|
155
167
|
listenChatAlreadyOpenWithoutParamsInMobileMode() {
|
|
@@ -286,6 +298,13 @@ export class AppComponent implements OnInit {
|
|
|
286
298
|
*/
|
|
287
299
|
ngOnInit() {
|
|
288
300
|
const appconfig = this.appConfigProvider.getConfig();
|
|
301
|
+
console.log('[APP-COMP] appconfig', appconfig)
|
|
302
|
+
if (appconfig && appconfig.supportMode) {
|
|
303
|
+
this.SUPPORT_MODE = appconfig.supportMode
|
|
304
|
+
console.log('[APP-COMP] appconfig > SUPPORT_MODE', this.SUPPORT_MODE)
|
|
305
|
+
} else {
|
|
306
|
+
this.SUPPORT_MODE = false;
|
|
307
|
+
}
|
|
289
308
|
this.persistence = appconfig.authPersistence;
|
|
290
309
|
this.appStorageService.initialize(environment.storage_prefix, this.persistence, '')
|
|
291
310
|
// this.logger.log('[APP-COMP] HELLO ngOnInit !!!!!!!')
|
|
@@ -416,9 +435,9 @@ export class AppComponent implements OnInit {
|
|
|
416
435
|
// this.logger.log('[APP-COMP] - X - initializeApp !!! CALLED-BY: ', calledby);
|
|
417
436
|
// console.log('[APP-COMP] appconfig platform is cordova: ', this.platform.is('cordova'))
|
|
418
437
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
438
|
+
if (!this.platform.is('cordova')) {
|
|
439
|
+
this.splashScreen.show();
|
|
440
|
+
}
|
|
422
441
|
this.tabTitle = document.title;
|
|
423
442
|
|
|
424
443
|
this.getRouteParamsAndSetLoggerConfig();
|
|
@@ -443,11 +462,11 @@ export class AppComponent implements OnInit {
|
|
|
443
462
|
// console.log("Check platform");
|
|
444
463
|
this.getPlatformName();
|
|
445
464
|
|
|
446
|
-
this.setLanguage();
|
|
465
|
+
// this.setLanguage();
|
|
447
466
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
467
|
+
if (this.splashScreen) {
|
|
468
|
+
this.splashScreen.hide();
|
|
469
|
+
}
|
|
451
470
|
this.statusBar.styleDefault();
|
|
452
471
|
this.navService.init(this.sidebarNav, this.detailNav);
|
|
453
472
|
// this.persistence = appconfig.authPersistence;
|
|
@@ -521,19 +540,42 @@ export class AppComponent implements OnInit {
|
|
|
521
540
|
}
|
|
522
541
|
|
|
523
542
|
/** */
|
|
524
|
-
setLanguage() {
|
|
543
|
+
setLanguage(currentUser) {
|
|
544
|
+
// const currentUser = JSON.parse(this.appStorageService.getItem('currentUser'));
|
|
545
|
+
this.logger.log('[APP-COMP] - setLanguage current_user uid: ', currentUser);
|
|
546
|
+
|
|
547
|
+
let currentUserId = ''
|
|
548
|
+
if (currentUser) {
|
|
549
|
+
currentUserId = currentUser.uid;
|
|
550
|
+
this.logger.log('[APP-COMP] - setLanguage current_user uid: ', currentUserId);
|
|
551
|
+
}
|
|
525
552
|
this.translate.setDefaultLang('en');
|
|
526
553
|
this.translate.use('en');
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
554
|
+
|
|
555
|
+
const browserLang = this.translate.getBrowserLang();
|
|
556
|
+
this.logger.log('[APP-COMP] browserLang: ', browserLang);
|
|
557
|
+
const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
|
|
558
|
+
this.logger.log('[APP-COMP] stored_preferred_lang: ', stored_preferred_lang);
|
|
559
|
+
|
|
560
|
+
let chat_lang = ''
|
|
561
|
+
if (browserLang && !stored_preferred_lang) {
|
|
562
|
+
chat_lang = browserLang
|
|
563
|
+
} else if (browserLang && stored_preferred_lang) {
|
|
564
|
+
chat_lang = stored_preferred_lang
|
|
535
565
|
}
|
|
536
|
-
|
|
566
|
+
|
|
567
|
+
this.translate.use(chat_lang);
|
|
568
|
+
|
|
569
|
+
// this.logger.debug('[APP-COMP] navigator.language: ', navigator.language);
|
|
570
|
+
// let language;
|
|
571
|
+
// if (navigator.language.indexOf('-') !== -1) {
|
|
572
|
+
// language = navigator.language.substring(0, navigator.language.indexOf('-'));
|
|
573
|
+
// } else if (navigator.language.indexOf('_') !== -1) {
|
|
574
|
+
// language = navigator.language.substring(0, navigator.language.indexOf('_'));
|
|
575
|
+
// } else {
|
|
576
|
+
// language = navigator.language;
|
|
577
|
+
// }
|
|
578
|
+
// this.translate.use(language);
|
|
537
579
|
}
|
|
538
580
|
|
|
539
581
|
|
|
@@ -624,7 +666,7 @@ export class AppComponent implements OnInit {
|
|
|
624
666
|
})
|
|
625
667
|
} else {
|
|
626
668
|
this.logger.warn('[APP-COMP] >>> I AM NOT LOGGED IN <<<')
|
|
627
|
-
|
|
669
|
+
this.IS_ONLINE = false;
|
|
628
670
|
// clearTimeout(this.timeModalLogin);
|
|
629
671
|
// this.timeModalLogin = setTimeout(() => {
|
|
630
672
|
if (!this.hadBeenCalledOpenModal) {
|
|
@@ -802,15 +844,19 @@ export class AppComponent implements OnInit {
|
|
|
802
844
|
.pipe(filter((state) => state !== null))
|
|
803
845
|
.subscribe((state: any) => {
|
|
804
846
|
this.logger.log('initialize FROM [APP-COMP] - [APP-COMP] ***** BSAuthStateChanged state', state);
|
|
805
|
-
|
|
847
|
+
|
|
806
848
|
if (state && state === AUTH_STATE_ONLINE) {
|
|
807
849
|
// const user = this.tiledeskAuthService.getCurrentUser();
|
|
808
850
|
// if (this.isOnline === false) {
|
|
809
851
|
// if (AUTH_STATE_ONLINE) {
|
|
852
|
+
this.IS_ONLINE = true;
|
|
853
|
+
console.log('[APP-COMP] IS_ONLINE', this.IS_ONLINE)
|
|
810
854
|
this.goOnLine();
|
|
811
855
|
// }
|
|
812
856
|
} else if (state === AUTH_STATE_OFFLINE) {
|
|
813
857
|
// this.checkTokenAndGoOffline() //se c'è un tiledeskToken salvato, allora aspetta, altrimenti vai offline
|
|
858
|
+
this.IS_ONLINE = false;
|
|
859
|
+
console.log('[APP-COMP] IS_ONLINE', this.IS_ONLINE)
|
|
814
860
|
this.goOffLine()
|
|
815
861
|
}
|
|
816
862
|
}, error => {
|
|
@@ -868,6 +914,7 @@ export class AppComponent implements OnInit {
|
|
|
868
914
|
// }
|
|
869
915
|
this.events.publish('go:online', true);
|
|
870
916
|
const currentUser = this.tiledeskAuthService.getCurrentUser();
|
|
917
|
+
this.setLanguage(currentUser);
|
|
871
918
|
// this.logger.printDebug('APP-COMP - goOnLine****', currentUser);
|
|
872
919
|
this.logger.log('[APP-COMP] - GO-ONLINE - currentUser ', currentUser);
|
|
873
920
|
this.chatManager.setTiledeskToken(tiledeskToken);
|
|
@@ -907,7 +954,7 @@ export class AppComponent implements OnInit {
|
|
|
907
954
|
const supportmode = this.appConfigProvider.getConfig().supportMode;
|
|
908
955
|
this.logger.log('[APP-COMP] - GO-OFFINE - supportmode ', supportmode);
|
|
909
956
|
if (supportmode === true) {
|
|
910
|
-
|
|
957
|
+
this.webSocketClose()
|
|
911
958
|
}
|
|
912
959
|
// this.isOnline = false;
|
|
913
960
|
// this.conversationsHandlerService.conversations = [];
|
|
@@ -1088,7 +1135,7 @@ export class AppComponent implements OnInit {
|
|
|
1088
1135
|
}
|
|
1089
1136
|
|
|
1090
1137
|
private initConversationsHandler(userId: string) {
|
|
1091
|
-
const keys = ['YOU'];
|
|
1138
|
+
const keys = ['YOU', 'INFO_A_NEW_SUPPORT_REQUEST_HAS_BEEN_ASSIGNED_TO_YOU'];
|
|
1092
1139
|
const translationMap = this.translateService.translateLanguage(keys);
|
|
1093
1140
|
|
|
1094
1141
|
this.logger.log('[APP-COMP] initConversationsHandler ------------->', userId, this.tenant);
|
package/src/app/app.module.ts
CHANGED
|
@@ -90,13 +90,13 @@ import { ConversationInfoModule } from 'src/app/components/conversation-info/con
|
|
|
90
90
|
|
|
91
91
|
|
|
92
92
|
// Directives
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
|
|
95
95
|
import { Network } from '@ionic-native/network/ngx';
|
|
96
96
|
import { ConnectionService } from 'ng-connection-service';
|
|
97
97
|
import { WebSocketJs } from './services/websocket/websocket-js';
|
|
98
98
|
import { UnassignedConversationsPageModule } from './pages/unassigned-conversations/unassigned-conversations.module';
|
|
99
|
-
|
|
99
|
+
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
|
100
100
|
// FACTORIES
|
|
101
101
|
export function createTranslateLoader(http: HttpClient) {
|
|
102
102
|
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
|
@@ -251,6 +251,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
|
|
|
251
251
|
],
|
|
252
252
|
imports: [
|
|
253
253
|
BrowserModule,
|
|
254
|
+
BrowserAnimationsModule,
|
|
254
255
|
FormsModule,
|
|
255
256
|
ReactiveFormsModule,
|
|
256
257
|
IonicModule.forRoot(),
|
package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts
CHANGED
|
@@ -6,6 +6,7 @@ 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';
|
|
10
11
|
@Component({
|
|
11
12
|
selector: 'chat-bubble-message',
|
|
@@ -36,53 +37,78 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
|
|
|
36
37
|
};
|
|
37
38
|
|
|
38
39
|
private logger: LoggerService = LoggerInstance.getInstance()
|
|
40
|
+
|
|
39
41
|
constructor(
|
|
40
42
|
public sanitizer: DomSanitizer,
|
|
41
|
-
private translate: TranslateService
|
|
43
|
+
private translate: TranslateService,
|
|
44
|
+
public tiledeskAuthService: TiledeskAuthService
|
|
45
|
+
|
|
46
|
+
) {
|
|
42
47
|
// console.log('BUBBLE-MSG Hello !!!!')
|
|
43
48
|
}
|
|
44
49
|
|
|
45
50
|
ngOnInit() {
|
|
51
|
+
|
|
52
|
+
this.setMomentLocale()
|
|
53
|
+
// this.browserLang = this.translate.getBrowserLang();
|
|
54
|
+
|
|
55
|
+
// if (this.browserLang) {
|
|
56
|
+
// if (this.browserLang === 'it') {
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
// moment.locale('it', {
|
|
60
|
+
// calendar: {
|
|
61
|
+
// lastDay: '[Ieri alle] LT',
|
|
62
|
+
// sameDay: '[Oggi alle] LT',
|
|
63
|
+
// nextDay: '[Domani alle] LT',
|
|
64
|
+
// lastWeek: '[Ultimo] dddd [alle] LT',
|
|
65
|
+
// nextWeek: 'dddd [alle] LT',
|
|
66
|
+
// sameElse: 'lll'
|
|
67
|
+
// }
|
|
68
|
+
// });
|
|
69
|
+
|
|
70
|
+
// } else {
|
|
71
|
+
// moment.locale('en', {
|
|
72
|
+
// calendar: {
|
|
73
|
+
// lastDay: '[Yesterday at] LT',
|
|
74
|
+
// sameDay: '[Today at] LT',
|
|
75
|
+
// nextDay: '[Tomorrow at] LT',
|
|
76
|
+
// lastWeek: '[last] dddd [at] LT',
|
|
77
|
+
// nextWeek: 'dddd [at] LT',
|
|
78
|
+
// sameElse: 'lll'
|
|
79
|
+
// }
|
|
80
|
+
// });
|
|
81
|
+
// }
|
|
82
|
+
// }
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
setMomentLocale() {
|
|
46
88
|
this.browserLang = this.translate.getBrowserLang();
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
}
|
|
89
|
+
const currentUser = this.tiledeskAuthService.getCurrentUser();
|
|
90
|
+
this.logger.log('[BUBBLE-MESSAGE] - ngOnInit - currentUser ', currentUser)
|
|
91
|
+
let currentUserId = ''
|
|
92
|
+
if (currentUser) {
|
|
93
|
+
currentUserId = currentUser.uid
|
|
94
|
+
this.logger.log('[BUBBLE-MESSAGE] - ngOnInit - currentUserId ', currentUserId)
|
|
79
95
|
}
|
|
80
96
|
|
|
97
|
+
const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
|
|
98
|
+
this.logger.log('[BUBBLE-MESSAGE] stored_preferred_lang: ', stored_preferred_lang);
|
|
81
99
|
|
|
82
100
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
101
|
+
let chat_lang = ''
|
|
102
|
+
if (this.browserLang && !stored_preferred_lang) {
|
|
103
|
+
chat_lang = this.browserLang
|
|
104
|
+
} else if (this.browserLang && stored_preferred_lang) {
|
|
105
|
+
chat_lang = stored_preferred_lang
|
|
106
|
+
}
|
|
107
|
+
moment.locale(chat_lang , {
|
|
108
|
+
calendar: {
|
|
109
|
+
sameElse: 'LLLL'
|
|
110
|
+
}
|
|
111
|
+
});
|
|
86
112
|
}
|
|
87
113
|
|
|
88
114
|
ngOnChanges() {
|
|
@@ -118,7 +118,7 @@
|
|
|
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="{{ archive_btn_tooltip }}" [options]="tooltipOptions" placement="bottom"
|
|
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>
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
{{browserLang === 'en' ? (conversation.timestamp | amDateFormat:'MMM DD YYYY') : (conversation.timestamp| amDateFormat:'DD MMM YYYY') }}
|
|
143
143
|
<!-- {{conversation.timestamp | amDateFormat:'DD MMM YYYY'}} -->
|
|
144
144
|
</span>
|
|
145
|
-
<i class="material-icons" item-end style="font-size: 15px;font-weight: 400;color: #666666;"> history </i>
|
|
145
|
+
<!-- <i class="material-icons" item-end style="font-size: 15px;font-weight: 400;color: #666666;"> history </i> -->
|
|
146
146
|
</div>
|
|
147
147
|
|
|
148
148
|
<!-- && !conversation?.archived -->
|
|
@@ -14,6 +14,7 @@ import * as moment from 'moment';
|
|
|
14
14
|
import { NetworkService } from '../../../services/network-service/network.service';
|
|
15
15
|
import { AppConfigProvider } from 'src/app/services/app-config';
|
|
16
16
|
import { DomSanitizer } from '@angular/platform-browser'
|
|
17
|
+
import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk-auth.service';
|
|
17
18
|
// import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
|
|
18
19
|
// import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
|
|
19
20
|
|
|
@@ -32,9 +33,19 @@ export class IonListConversationsComponent extends ListConversationsComponent im
|
|
|
32
33
|
public logger: LoggerService = LoggerInstance.getInstance();
|
|
33
34
|
public currentYear: any;
|
|
34
35
|
public browserLang: string;
|
|
35
|
-
|
|
36
|
-
public PROJECT_FOR_PANEL: any;
|
|
37
36
|
|
|
37
|
+
public PROJECT_FOR_PANEL: any;
|
|
38
|
+
public archive_btn_tooltip: string;
|
|
39
|
+
|
|
40
|
+
tooltipOptions = {
|
|
41
|
+
'show-delay': 1500,
|
|
42
|
+
'tooltip-class': 'chat-tooltip',
|
|
43
|
+
'theme': 'light',
|
|
44
|
+
'shadow': false,
|
|
45
|
+
'hide-delay-mobile': 0,
|
|
46
|
+
'hideDelayAfterClick': 3000,
|
|
47
|
+
'hide-delay': 200
|
|
48
|
+
};
|
|
38
49
|
/**
|
|
39
50
|
*
|
|
40
51
|
* @param iterableDiffers
|
|
@@ -51,21 +62,24 @@ export class IonListConversationsComponent extends ListConversationsComponent im
|
|
|
51
62
|
private networkService: NetworkService,
|
|
52
63
|
private appConfigProvider: AppConfigProvider,
|
|
53
64
|
private sanitizer: DomSanitizer,
|
|
65
|
+
public tiledeskAuthService: TiledeskAuthService
|
|
54
66
|
) {
|
|
55
67
|
super(iterableDiffers, kvDiffers)
|
|
56
|
-
this.
|
|
57
|
-
if (this.browserLang) {
|
|
68
|
+
this.setMomentLocale();
|
|
58
69
|
|
|
59
|
-
moment.locale(this.browserLang)
|
|
60
|
-
// if (this.browserLang === 'it') {
|
|
61
|
-
// // this.translate.use('it');
|
|
62
|
-
// moment.locale('it')
|
|
63
70
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
// if (this.browserLang) {
|
|
72
|
+
|
|
73
|
+
// moment.locale(this.browserLang)
|
|
74
|
+
// // if (this.browserLang === 'it') {
|
|
75
|
+
// // // this.translate.use('it');
|
|
76
|
+
// // moment.locale('it')
|
|
77
|
+
|
|
78
|
+
// // } else {
|
|
79
|
+
// // // this.translate.use('en');
|
|
80
|
+
// // moment.locale('en')
|
|
81
|
+
// // }
|
|
82
|
+
// }
|
|
69
83
|
|
|
70
84
|
this.currentYear = moment().format('YYYY');
|
|
71
85
|
this.logger.log('[ION-LIST-CONVS-COMP] - currentYear ', this.currentYear)
|
|
@@ -74,6 +88,42 @@ export class IonListConversationsComponent extends ListConversationsComponent im
|
|
|
74
88
|
|
|
75
89
|
// console.log('[ION-LIST-CONVS-COMP] - DASHBOARD_BASE_URL ', DASHBOARD_BASE_URL)
|
|
76
90
|
this.PROJECT_FOR_PANEL = this.sanitizer.bypassSecurityTrustResourceUrl(DASHBOARD_BASE_URL + '#/project-for-panel');
|
|
91
|
+
this.translateLbl();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
translateLbl() {
|
|
95
|
+
this.translate.get('Resolve')
|
|
96
|
+
.subscribe((text: string) => {
|
|
97
|
+
// this.deleteContact_msg = text;
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
this.archive_btn_tooltip = text;
|
|
101
|
+
console.log('[ION-LIST-CONVS-COMP] getTranslations Resolve : ', text)
|
|
102
|
+
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
setMomentLocale() {
|
|
107
|
+
this.browserLang = this.translate.getBrowserLang();
|
|
108
|
+
const currentUser = this.tiledeskAuthService.getCurrentUser();
|
|
109
|
+
this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - currentUser ', currentUser)
|
|
110
|
+
let currentUserId = ''
|
|
111
|
+
if (currentUser) {
|
|
112
|
+
currentUserId = currentUser.uid
|
|
113
|
+
this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - currentUserId ', currentUserId)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const stored_preferred_lang = localStorage.getItem(currentUserId + '_lang');
|
|
117
|
+
this.logger.log('[ION-LIST-CONVS-COMP] stored_preferred_lang: ', stored_preferred_lang);
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
let chat_lang = ''
|
|
121
|
+
if (this.browserLang && !stored_preferred_lang) {
|
|
122
|
+
chat_lang = this.browserLang
|
|
123
|
+
} else if (this.browserLang && stored_preferred_lang) {
|
|
124
|
+
chat_lang = stored_preferred_lang
|
|
125
|
+
}
|
|
126
|
+
moment.locale(chat_lang)
|
|
77
127
|
}
|
|
78
128
|
|
|
79
129
|
ngOnInit() {
|
|
@@ -82,7 +132,7 @@ export class IonListConversationsComponent extends ListConversationsComponent im
|
|
|
82
132
|
this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - Platform', this.platform.platforms());
|
|
83
133
|
}
|
|
84
134
|
|
|
85
|
-
|
|
135
|
+
|
|
86
136
|
|
|
87
137
|
|
|
88
138
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
<ion-header no-border class="ion-no-border">
|
|
3
|
-
<ion-toolbar>
|
|
4
|
-
|
|
5
|
-
<ion-buttons slot="start">
|
|
3
|
+
<ion-toolbar style="height:60px">
|
|
4
|
+
<ion-buttons slot="start" style="height:60px">
|
|
6
5
|
<!-- (click)="pushPage('conversations-list')" defaultHref="/conversations-list" -->
|
|
7
6
|
<ion-back-button style="display: block;" text="" *ngIf="isMobile" (click)="goBackToConversationList()">
|
|
8
7
|
</ion-back-button>
|
package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html
CHANGED
|
@@ -39,7 +39,8 @@
|
|
|
39
39
|
<ion-col col-auto>
|
|
40
40
|
|
|
41
41
|
<div class="start-buttons" style="position: absolute;display: flex;">
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
<ng-container *ngIf="areVisibleCAR">
|
|
43
44
|
<div class="canned-responses-btn-wpr" style="margin-left: -5px;" tooltip="{{translationMap?.get('CANNED_RESPONSES')}}" [options]="tooltipOptions" placement="top">
|
|
44
45
|
<ion-button ion-button fill="clear" class="canned-responses-btn" (click)="openCannedResponses()" [disabled]="!IS_SUPPORT_GROUP_CONVERSATION">
|
|
45
46
|
<ion-icon slot="icon-only" lazy="true" name="flash-outline" style="font-size: 24px;"></ion-icon>
|
|
@@ -51,6 +52,8 @@
|
|
|
51
52
|
<div *ngIf="IS_SUPPORT_GROUP_CONVERSATION && tagsCannedCount > 0" tooltip="{{translationMap?.get('YES_CANNED_RESPONSES')}}" [options]="tooltipOptions" placement="top" class="canned-responses-btn-badge">
|
|
52
53
|
<ion-icon name="information-sharp" style="vertical-align: middle;"></ion-icon>
|
|
53
54
|
</div>
|
|
55
|
+
</ng-container>
|
|
56
|
+
|
|
54
57
|
|
|
55
58
|
<div class="upload-image-btn-wpr" tooltip="{{translationMap?.get('UPLOAD')}}" [options]="tooltipOptions" placement="top">
|
|
56
59
|
<ion-button ion-button fill="clear" class="upload-image-btn">
|
|
@@ -64,7 +67,7 @@
|
|
|
64
67
|
</div>
|
|
65
68
|
</div>
|
|
66
69
|
|
|
67
|
-
<div class="text-message">
|
|
70
|
+
<div class="text-message" [ngClass]="{'text-message-no-cr': areVisibleCAR === false}">
|
|
68
71
|
<ion-textarea id="ion-textarea" #messageTextArea #message_text_area #textArea rows="1"
|
|
69
72
|
[placeholder]="TEXAREA_PLACEHOLDER" autosize="false" auto-grow="true" autofocus="true" [value]=""
|
|
70
73
|
[(ngModel)]="messageString" (ionChange)="ionChange($event);"
|
package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts
CHANGED
|
@@ -44,7 +44,7 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
|
|
|
44
44
|
@Input() conversationWith: string;
|
|
45
45
|
@Input() tagsCannedFilter: any = [];
|
|
46
46
|
@Input() tagsCannedCount: number;
|
|
47
|
-
|
|
47
|
+
@Input() areVisibleCAR: boolean;
|
|
48
48
|
@Input() events: Observable<void>;
|
|
49
49
|
@Input() fileUploadAccept: string
|
|
50
50
|
@Input() isOpenInfoConversation: boolean;
|
|
@@ -133,7 +133,7 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
|
|
|
133
133
|
|
|
134
134
|
this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges DROP EVENT ", this.dropEvent);
|
|
135
135
|
this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges tagsCannedFilter ", this.tagsCannedFilter);
|
|
136
|
-
|
|
136
|
+
this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges areVisibleCAR; ", this.areVisibleCAR);
|
|
137
137
|
|
|
138
138
|
|
|
139
139
|
this.logger.log('[CONVS-DETAIL] - returnChangeTextArea ngOnChanges in [MSG-TEXT-AREA] this.tagsCannedFilter.length ', this.tagsCannedFilter.length)
|