@chat21/chat21-ionic 3.0.59-rc2 → 3.0.59-rc21

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 (76) hide show
  1. package/CHANGELOG.md +72 -1
  2. package/README.md +5 -0
  3. package/config.xml +2 -2
  4. package/env.sample +3 -1
  5. package/package.json +1 -1
  6. package/resources/Android/splash/drawable-land-hdpi-screen.png +0 -0
  7. package/resources/Android/splash/drawable-land-ldpi-screen.png +0 -0
  8. package/resources/Android/splash/drawable-land-mdpi-screen.png +0 -0
  9. package/resources/Android/splash/drawable-land-xhdpi-screen.png +0 -0
  10. package/resources/Android/splash/drawable-land-xxhdpi-screen.png +0 -0
  11. package/resources/Android/splash/drawable-land-xxxhdpi-screen.png +0 -0
  12. package/resources/Android/splash/drawable-port-hdpi-screen.png +0 -0
  13. package/resources/Android/splash/drawable-port-ldpi-screen.png +0 -0
  14. package/resources/Android/splash/drawable-port-mdpi-screen.png +0 -0
  15. package/resources/Android/splash/drawable-port-xhdpi-screen.png +0 -0
  16. package/resources/Android/splash/drawable-port-xxhdpi-screen.png +0 -0
  17. package/resources/Android/splash/drawable-port-xxxhdpi-screen.png +0 -0
  18. package/resources/Android/splash.png +0 -0
  19. package/src/app/app-routing.module.ts +21 -17
  20. package/src/app/app.component.scss +10 -5
  21. package/src/app/app.component.ts +339 -65
  22. package/src/app/app.module.ts +16 -8
  23. package/src/app/chatlib/conversation-detail/conversation-content/conversation-content.component.html +1 -1
  24. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +20 -8
  25. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.scss +0 -144
  26. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +14 -17
  27. package/src/app/chatlib/list-conversations-component/list-conversations/list-conversations.component.html +1 -1
  28. package/src/app/components/authentication/login/login.component.html +10 -10
  29. package/src/app/components/authentication/login/login.component.ts +2 -1
  30. package/src/app/components/conversation-detail/bubble-my-message/bubble-my-message.component.ts +1 -1
  31. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +2 -4
  32. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +7 -2
  33. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +20 -15
  34. package/src/app/components/ddp-header/ddp-header.component.html +1 -1
  35. package/src/app/components/ddp-header/ddp-header.component.ts +4 -2
  36. package/src/app/components/project-item/project-item.component.html +147 -0
  37. package/src/app/components/project-item/project-item.component.scss +669 -0
  38. package/src/app/components/project-item/project-item.component.spec.ts +24 -0
  39. package/src/app/components/project-item/project-item.component.ts +317 -0
  40. package/src/app/components/utils/avatar-profile/avatar-profile.component.html +9 -3
  41. package/src/app/pages/authentication/login/login.page.html +1 -2
  42. package/src/app/pages/authentication/login/login.page.ts +1 -1
  43. package/src/app/pages/conversation-detail/conversation-detail.page.ts +26 -22
  44. package/src/app/pages/conversations-list/conversations-list.page.html +45 -23
  45. package/src/app/pages/conversations-list/conversations-list.page.scss +290 -127
  46. package/src/app/pages/conversations-list/conversations-list.page.ts +189 -17
  47. package/src/app/pages/unassigned-conversations/unassigned-conversations-routing.module.ts +17 -0
  48. package/src/app/pages/unassigned-conversations/unassigned-conversations.module.ts +22 -0
  49. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.html +22 -0
  50. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.scss +79 -0
  51. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.spec.ts +24 -0
  52. package/src/app/pages/unassigned-conversations/unassigned-conversations.page.ts +108 -0
  53. package/src/app/services/app-config.ts +77 -5
  54. package/src/app/services/tiledesk/tiledesk.service.ts +22 -1
  55. package/src/app/services/websocket/websocket-js.ts +557 -0
  56. package/src/app/services/websocket/websocket.service.spec.ts +12 -0
  57. package/src/app/services/websocket/websocket.service.ts +274 -0
  58. package/src/app/shared/shared.module.ts +3 -0
  59. package/src/assets/i18n/en.json +9 -1
  60. package/src/assets/i18n/it.json +9 -1
  61. package/src/assets/js/chat21client.js +144 -82
  62. package/src/assets/logo.png +0 -0
  63. package/src/assets/transparent.png +0 -0
  64. package/src/chat-config-pre-test.json +3 -1
  65. package/src/chat-config-template.json +4 -1
  66. package/src/chat-config.json +4 -1
  67. package/src/chat21-core/providers/firebase/firebase-auth-service.ts +2 -2
  68. package/src/chat21-core/providers/firebase/firebase-notifications.ts +31 -23
  69. package/src/chat21-core/providers/mqtt/mqtt-auth-service.ts +27 -27
  70. package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +3 -5
  71. package/src/chat21-core/providers/mqtt/mqtt-conversations-handler.ts +13 -5
  72. package/src/chat21-core/providers/mqtt/mqtt-notifications.ts +101 -11
  73. package/src/chat21-core/providers/tiledesk/tiledesk-auth.service.ts +13 -4
  74. package/src/chat21-core/utils/utils-message.ts +2 -2
  75. package/src/firebase-messaging-sw-template.js +1 -1
  76. package/src/assets/images/tiledesk_logo_50x50.png +0 -0
@@ -94,7 +94,8 @@ import { TooltipModule } from 'ng2-tooltip-directive';
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
+ import { UnassignedConversationsPageModule } from './pages/unassigned-conversations/unassigned-conversations.module';
98
99
 
99
100
  // FACTORIES
100
101
  export function createTranslateLoader(http: HttpClient) {
@@ -102,7 +103,7 @@ export function createTranslateLoader(http: HttpClient) {
102
103
 
103
104
  }
104
105
 
105
- export function authenticationFactory(http: HttpClient, appConfig: AppConfigProvider, chat21Service: Chat21Service, appSorage: AppStorageService, network: Network, connectionService:ConnectionService) {
106
+ export function authenticationFactory(http: HttpClient, appConfig: AppConfigProvider, chat21Service: Chat21Service, appSorage: AppStorageService, network: Network, connectionService: ConnectionService) {
106
107
  const config = appConfig.getConfig()
107
108
  if (config.chatEngine === CHAT_ENGINE_MQTT) {
108
109
 
@@ -111,8 +112,13 @@ export function authenticationFactory(http: HttpClient, appConfig: AppConfigProv
111
112
 
112
113
  const auth = new MQTTAuthService(http, chat21Service, appSorage);
113
114
 
114
- auth.setBaseUrl(appConfig.getConfig().apiUrl)
115
-
115
+ auth.setBaseUrl(appConfig.getConfig().apiUrl);
116
+
117
+ if (config.pushEngine = PUSH_ENGINE_MQTT) {
118
+ // FOR PUSH NOTIFICATIONS INIT FIREBASE APP
119
+ FirebaseInitService.initFirebase(config.firebaseConfig);
120
+ }
121
+
116
122
  return auth
117
123
  } else {
118
124
 
@@ -120,7 +126,7 @@ export function authenticationFactory(http: HttpClient, appConfig: AppConfigProv
120
126
  // console.log('[APP-MOD] FirebaseInitService config ', config)
121
127
  const auth = new FirebaseAuthService(http, network, connectionService);
122
128
  auth.setBaseUrl(config.apiUrl)
123
-
129
+
124
130
  return auth
125
131
  }
126
132
  }
@@ -216,12 +222,12 @@ export function uploadFactory(http: HttpClient, appConfig: AppConfigProvider, ap
216
222
  }
217
223
  }
218
224
 
219
- export function notificationsServiceFactory(appConfig: AppConfigProvider) {
225
+ export function notificationsServiceFactory(appConfig: AppConfigProvider, chat21Service: Chat21Service) {
220
226
  const config = appConfig.getConfig()
221
227
  if (config.pushEngine === PUSH_ENGINE_FIREBASE) {
222
228
  return new FirebaseNotifications();
223
229
  } else if (config.pushEngine === PUSH_ENGINE_MQTT) {
224
- return new MQTTNotifications();
230
+ return new MQTTNotifications(chat21Service);
225
231
  } else {
226
232
  return;
227
233
  }
@@ -253,6 +259,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
253
259
  LoginPageModule,
254
260
  ConversationListPageModule,
255
261
  ConversationDetailPageModule,
262
+ UnassignedConversationsPageModule,
256
263
  TranslateModule.forRoot({
257
264
  loader: {
258
265
  provide: TranslateLoader,
@@ -338,7 +345,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
338
345
  {
339
346
  provide: NotificationsService,
340
347
  useFactory: notificationsServiceFactory,
341
- deps: [AppConfigProvider]
348
+ deps: [AppConfigProvider, Chat21Service]
342
349
  },
343
350
  {
344
351
  provide: AppStorageService,
@@ -352,6 +359,7 @@ const appInitializerFn = (appConfig: AppConfigProvider, logger: NGXLogger) => {
352
359
  EventsService,
353
360
  Chooser,
354
361
  Chat21Service,
362
+ WebSocketJs
355
363
  ]
356
364
  })
357
365
  export class AppModule { }
@@ -10,7 +10,7 @@
10
10
  <div class="chat21-bounce1" [ngStyle]="{'background-color': stylesMap.get('themeColor')}"></div>
11
11
  <div class="chat21-bounce2" [ngStyle]="{'background-color': stylesMap.get('themeColor')}"></div>
12
12
  <div class="chat21-bounce3" [ngStyle]="{'background-color': stylesMap.get('themeColor')}"></div>
13
- <span>{{translationMap.get('LABEL_LOADING')}}</span>
13
+ <span>{{translationMap?.get('LABEL_LOADING')}}</span>
14
14
  </div>
15
15
  </span>
16
16
 
@@ -25,7 +25,8 @@
25
25
  <!-- -------------------------------------------------------------------------- -->
26
26
  <!-- New <ion-spinner class="spinner-middle" style="margin-left: 19px;"></ion-spinner> -->
27
27
  <!-- -------------------------------------------------------------------------- -->
28
- <ion-item *ngIf="isOnline === false" button="true" lines="none" class="ion-no-padding waiting-for-connection">
28
+ <!-- <ion-item *ngIf="isOnline === false" button="true" lines="none" class="ion-no-padding waiting-for-connection">
29
+ <div tabindex="0"></div>
29
30
  <ion-avatar item-start>
30
31
  <div class="sk-fading-circle">
31
32
  <div class="sk-circle1 sk-circle"></div>
@@ -43,7 +44,17 @@
43
44
  </div>
44
45
  </ion-avatar>
45
46
  <ion-label part="message-text" class="waiting-for-network-msg"> Waiting for network</ion-label>
46
- </ion-item>
47
+ </ion-item> -->
48
+
49
+ <!-- <ion-item>
50
+ <div tabindex="0"></div>
51
+ <iframe loading="lazy" width="100%" height="70px" style="border: unset;" [src]="PROJECT_FOR_PANEL"></iframe>
52
+ </ion-item> -->
53
+ <!-- <ion-item button="true" (click)="openUnsevedConversationIframe()">
54
+ <app-project-item
55
+ (projectIdEvent)="getLastProjectId($event)"></app-project-item>
56
+ </ion-item> -->
57
+
47
58
 
48
59
  <!-- <ion-item-sliding disabled>
49
60
  <ion-item>
@@ -63,6 +74,7 @@
63
74
  </ion-item-options>
64
75
  </ion-item-sliding> -->
65
76
 
77
+
66
78
  <ion-item button="true" lines="none" class="ion-no-padding" [class.ion-selected]="conversation.uid === uidConvSelected"
67
79
  *ngFor="let conversation of listConversations" (click)="openConversationByID(conversation)" detail=false>
68
80
  <div tabindex="0"></div>
@@ -106,7 +118,8 @@
106
118
  <ion-note *ngIf="!conversation.archived" class="conversation_time">{{conversation.timestamp | amTimeAgo}}</ion-note>
107
119
 
108
120
  <ion-buttons slot="end">
109
- <ion-button *ngIf="!conversation.archived" [ngClass]="{'hide': !isApp, 'button-on-desktop': !isApp, 'button-on-mobile': isApp }"
121
+ <ion-button *ngIf="!conversation.archived"
122
+ [ngClass]="{'hide': !isApp, 'button-on-desktop': !isApp, 'button-on-mobile': isApp }"
110
123
  id="{{ 'close_conversation_button' + conversation.uid }}" class="close-conversation-button" ion-button clear
111
124
  item-end (click)="closeConversation(conversation);$event.stopPropagation();" padding>
112
125
  <ion-icon slot="icon-only" style="display:block;" id="{{ 'close_button_icon' + conversation.uid }}"
@@ -121,21 +134,20 @@
121
134
 
122
135
  <div item-end *ngIf="conversation?.archived" class="achived-icon-wpr">
123
136
  <span *ngIf="(conversation.timestamp | amDateFormat:'YYYY') === currentYear" class="time-in-archived">
124
- {{browserLang === 'it' ? (conversation.timestamp| amDateFormat:'DD MMM') : (conversation.timestamp |
125
- amDateFormat:'MMM DD')}}
137
+ {{browserLang === 'en' ? (conversation.timestamp | amDateFormat:'MMM DD') : (conversation.timestamp| amDateFormat:'DD MMM')}}
126
138
 
127
139
  <!-- {{conversation.timestamp | amDateFormat:'DD MMM'}} -->
128
140
  </span>
129
141
  <span *ngIf="(conversation.timestamp | amDateFormat:'YYYY') !== currentYear" class="time-in-archived">
130
- {{browserLang === 'it' ? (conversation.timestamp| amDateFormat:'DD MMM') : (conversation.timestamp |
131
- amDateFormat:'MMM DD YYYY')}}
142
+ {{browserLang === 'en' ? (conversation.timestamp | amDateFormat:'MMM DD YYYY') : (conversation.timestamp| amDateFormat:'DD MMM YYYY') }}
132
143
  <!-- {{conversation.timestamp | amDateFormat:'DD MMM YYYY'}} -->
133
144
  </span>
134
145
  <i class="material-icons" item-end style="font-size: 15px;font-weight: 400;color: #666666;"> history </i>
135
146
  </div>
136
147
 
137
148
  <!-- && !conversation?.archived -->
138
- <div item-end class="notification_point" [ngClass]="{'notification_point-on-desktop': !isApp, 'notification_point-on-mobile': isApp }"
149
+ <div item-end class="notification_point"
150
+ [ngClass]="{'notification_point-on-desktop': !isApp, 'notification_point-on-mobile': isApp }"
139
151
  *ngIf="conversation.is_new">
140
152
  </div>
141
153
 
@@ -220,147 +220,3 @@ ion-item:hover {
220
220
  }
221
221
 
222
222
 
223
- .waiting-for-connection {
224
- --background: #fdd764;
225
- }
226
-
227
- // -------------------------------
228
- // Spinner
229
- // -------------------------------
230
- .sk-fading-circle {
231
- // margin: 100px auto;
232
- width: 40px;
233
- height: 40px;
234
- position: relative;
235
- margin-left: 5px;
236
- margin-top: 5px;
237
- }
238
-
239
- .sk-fading-circle .sk-circle {
240
- width: 100%;
241
- height: 100%;
242
- position: absolute;
243
- left: 0;
244
- top: 0;
245
- }
246
-
247
- .sk-fading-circle .sk-circle:before {
248
- content: '';
249
- display: block;
250
- margin: 0 auto;
251
- width: 15%;
252
- height: 15%;
253
- background-color: #333;
254
- border-radius: 100%;
255
- -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out both;
256
- animation: sk-circleFadeDelay 1.2s infinite ease-in-out both;
257
- }
258
- .sk-fading-circle .sk-circle2 {
259
- -webkit-transform: rotate(30deg);
260
- -ms-transform: rotate(30deg);
261
- transform: rotate(30deg);
262
- }
263
- .sk-fading-circle .sk-circle3 {
264
- -webkit-transform: rotate(60deg);
265
- -ms-transform: rotate(60deg);
266
- transform: rotate(60deg);
267
- }
268
- .sk-fading-circle .sk-circle4 {
269
- -webkit-transform: rotate(90deg);
270
- -ms-transform: rotate(90deg);
271
- transform: rotate(90deg);
272
- }
273
- .sk-fading-circle .sk-circle5 {
274
- -webkit-transform: rotate(120deg);
275
- -ms-transform: rotate(120deg);
276
- transform: rotate(120deg);
277
- }
278
- .sk-fading-circle .sk-circle6 {
279
- -webkit-transform: rotate(150deg);
280
- -ms-transform: rotate(150deg);
281
- transform: rotate(150deg);
282
- }
283
- .sk-fading-circle .sk-circle7 {
284
- -webkit-transform: rotate(180deg);
285
- -ms-transform: rotate(180deg);
286
- transform: rotate(180deg);
287
- }
288
- .sk-fading-circle .sk-circle8 {
289
- -webkit-transform: rotate(210deg);
290
- -ms-transform: rotate(210deg);
291
- transform: rotate(210deg);
292
- }
293
- .sk-fading-circle .sk-circle9 {
294
- -webkit-transform: rotate(240deg);
295
- -ms-transform: rotate(240deg);
296
- transform: rotate(240deg);
297
- }
298
- .sk-fading-circle .sk-circle10 {
299
- -webkit-transform: rotate(270deg);
300
- -ms-transform: rotate(270deg);
301
- transform: rotate(270deg);
302
- }
303
- .sk-fading-circle .sk-circle11 {
304
- -webkit-transform: rotate(300deg);
305
- -ms-transform: rotate(300deg);
306
- transform: rotate(300deg);
307
- }
308
- .sk-fading-circle .sk-circle12 {
309
- -webkit-transform: rotate(330deg);
310
- -ms-transform: rotate(330deg);
311
- transform: rotate(330deg);
312
- }
313
- .sk-fading-circle .sk-circle2:before {
314
- -webkit-animation-delay: -1.1s;
315
- animation-delay: -1.1s;
316
- }
317
- .sk-fading-circle .sk-circle3:before {
318
- -webkit-animation-delay: -1s;
319
- animation-delay: -1s;
320
- }
321
- .sk-fading-circle .sk-circle4:before {
322
- -webkit-animation-delay: -0.9s;
323
- animation-delay: -0.9s;
324
- }
325
- .sk-fading-circle .sk-circle5:before {
326
- -webkit-animation-delay: -0.8s;
327
- animation-delay: -0.8s;
328
- }
329
- .sk-fading-circle .sk-circle6:before {
330
- -webkit-animation-delay: -0.7s;
331
- animation-delay: -0.7s;
332
- }
333
- .sk-fading-circle .sk-circle7:before {
334
- -webkit-animation-delay: -0.6s;
335
- animation-delay: -0.6s;
336
- }
337
- .sk-fading-circle .sk-circle8:before {
338
- -webkit-animation-delay: -0.5s;
339
- animation-delay: -0.5s;
340
- }
341
- .sk-fading-circle .sk-circle9:before {
342
- -webkit-animation-delay: -0.4s;
343
- animation-delay: -0.4s;
344
- }
345
- .sk-fading-circle .sk-circle10:before {
346
- -webkit-animation-delay: -0.3s;
347
- animation-delay: -0.3s;
348
- }
349
- .sk-fading-circle .sk-circle11:before {
350
- -webkit-animation-delay: -0.2s;
351
- animation-delay: -0.2s;
352
- }
353
- .sk-fading-circle .sk-circle12:before {
354
- -webkit-animation-delay: -0.1s;
355
- animation-delay: -0.1s;
356
- }
357
-
358
- @-webkit-keyframes sk-circleFadeDelay {
359
- 0%, 39%, 100% { opacity: 0; }
360
- 40% { opacity: 1; }
361
- }
362
-
363
- @keyframes sk-circleFadeDelay {
364
- 0%, 39%, 100% { opacity: 0; }
365
- 40% { opacity: 1; }
366
- }
@@ -7,10 +7,13 @@ import { Platform } from '@ionic/angular';
7
7
  import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
8
8
  import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
9
9
  import { TranslateService } from '@ngx-translate/core';
10
+
10
11
  import * as moment from 'moment';
11
12
  // import { EventsService } from 'src/app/services/events-service';
12
13
  // import { TiledeskService } from '../../../services/tiledesk/tiledesk.service';
13
14
  import { NetworkService } from '../../../services/network-service/network.service';
15
+ import { AppConfigProvider } from 'src/app/services/app-config';
16
+ import { DomSanitizer } from '@angular/platform-browser'
14
17
  // import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
15
18
  // import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
16
19
 
@@ -29,8 +32,8 @@ export class IonListConversationsComponent extends ListConversationsComponent im
29
32
  public logger: LoggerService = LoggerInstance.getInstance();
30
33
  public currentYear: any;
31
34
  public browserLang: string;
32
- public isOnline: boolean = true;
33
- public checkInternet: boolean;
35
+
36
+ public PROJECT_FOR_PANEL: any;
34
37
 
35
38
  /**
36
39
  *
@@ -45,7 +48,9 @@ export class IonListConversationsComponent extends ListConversationsComponent im
45
48
  private translate: TranslateService,
46
49
  // private events: EventsService,
47
50
  // private tiledeskService: TiledeskService,
48
- private networkService: NetworkService
51
+ private networkService: NetworkService,
52
+ private appConfigProvider: AppConfigProvider,
53
+ private sanitizer: DomSanitizer,
49
54
  ) {
50
55
  super(iterableDiffers, kvDiffers)
51
56
  this.browserLang = this.translate.getBrowserLang();
@@ -62,31 +67,23 @@ export class IonListConversationsComponent extends ListConversationsComponent im
62
67
 
63
68
  this.currentYear = moment().format('YYYY');
64
69
  this.logger.log('[ION-LIST-CONVS-COMP] - currentYear ', this.currentYear)
70
+
71
+ const DASHBOARD_BASE_URL = this.appConfigProvider.getConfig().dashboardUrl;
72
+
73
+ // console.log('[ION-LIST-CONVS-COMP] - DASHBOARD_BASE_URL ', DASHBOARD_BASE_URL)
74
+ this.PROJECT_FOR_PANEL = this.sanitizer.bypassSecurityTrustResourceUrl(DASHBOARD_BASE_URL + '#/project-for-panel');
65
75
  }
66
76
 
67
77
  ngOnInit() {
68
78
  this.isApp = this.platform.is('ios') || this.platform.is('android')
69
79
  this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - IS-APP ', this.isApp)
70
80
  this.logger.log('[ION-LIST-CONVS-COMP] - ngOnInit - Platform', this.platform.platforms());
71
- this.watchToConnectionStatus();
72
81
  }
73
82
 
83
+
74
84
 
75
- watchToConnectionStatus() {
76
-
77
- this.networkService.checkInternetFunc().subscribe(isOnline => {
78
- this.checkInternet = isOnline
79
- this.logger.log('[ION-LIST-CONVS-COMP] - watchToConnectionStatus - isOnline', this.checkInternet)
80
85
 
81
- // checking internet connection
82
- if (this.checkInternet == true) {
83
86
 
84
- this.isOnline = true;
85
- } else {
86
- this.isOnline = false;
87
- }
88
- });
89
- }
90
87
  // --------------------------------------------------
91
88
  // subdsribe to event
92
89
  // --------------------------------------------------
@@ -34,7 +34,7 @@
34
34
  width="24px" height="24px" viewBox="0 0 24 24">
35
35
  <path fill="none" d="M0 0h24v24H0z"/>
36
36
  <path d="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54.72-1.21-3.5-2.08V8H12z"/>
37
- <title id="altIconTitle">{{ translationMap.get('CLOSED') }}</title>
37
+ <title id="altIconTitle">{{ translationMap?.get('CLOSED') }}</title>
38
38
  </svg>
39
39
  </button>
40
40
  </div>
@@ -8,25 +8,25 @@
8
8
 
9
9
  <div class="signin-title" style="text-align:center">
10
10
  <h2 style="font-family: 'Montserrat', sans-serif; font-weight: 400;">
11
- {{ translationMap.get('LABEL_SIGNIN_TO') }}
11
+ {{ translationMap?.get('LABEL_SIGNIN_TO') }}
12
12
  {{companyName}}
13
13
  </h2>
14
14
  </div>
15
15
  <div class="login-container">
16
16
  <form [formGroup]="userForm" (ngSubmit)="signInWithEmailAndPassword()" novalidate>
17
17
 
18
- <ion-label stacked for="email">{{ translationMap.get('LABEL_EMAIL') }}</ion-label>
18
+ <ion-label stacked for="email">{{ translationMap?.get('LABEL_EMAIL') }}</ion-label>
19
19
  <ion-input #email formControlName="email" type="email" id="email" required autocapitalize="off" spellcheck="false"
20
- placeholder="{{ translationMap.get('LABEL_PLACEHOLDER_EMAIL') }}"
20
+ placeholder="{{ translationMap?.get('LABEL_PLACEHOLDER_EMAIL') }}"
21
21
  [class.invalid]="!userForm.controls.email.valid" ></ion-input>
22
22
  <div *ngIf="formErrors.email" class="is-danger">
23
23
  {{ formErrors.email }}
24
24
  </div>
25
25
 
26
26
 
27
- <ion-label stacked for="password">{{ translationMap.get('LABEL_PASSWORD') }}</ion-label>
27
+ <ion-label stacked for="password">{{ translationMap?.get('LABEL_PASSWORD') }}</ion-label>
28
28
  <ion-input #password formControlName="password" type="password" id="password" required
29
- placeholder="{{ translationMap.get('LABEL_PLACEHOLDER_PASSWORD') }}"
29
+ placeholder="{{ translationMap?.get('LABEL_PLACEHOLDER_PASSWORD') }}"
30
30
  [class.invalid]="!userForm.controls.password.valid"></ion-input>
31
31
 
32
32
  <div *ngIf="formErrors.password" class="is-danger">
@@ -36,23 +36,23 @@
36
36
 
37
37
  <button type="submit" class="btn signin-button ion-activatable ripple-parent" [ngClass]="{'signin-button-is-disabled': !userForm.valid}" [disabled]="!userForm.valid">
38
38
  <span class="signin-button-label" *ngIf="showSpinnerInLoginBtn === false" >
39
- {{ translationMap.get('LABEL_SIGNIN') }}
39
+ {{ translationMap?.get('LABEL_SIGNIN') }}
40
40
  </span>
41
41
  <ion-ripple-effect type="unbounded"></ion-ripple-effect>
42
42
  <ion-spinner *ngIf="showSpinnerInLoginBtn === true" name="bubbles" color="white" duration="2" ></ion-spinner>
43
43
  </button>
44
44
 
45
- <p style="color: #666666; font-size: 1.1em; text-align: center; margin-top: 16px;">
45
+ <!-- <p style="color: #666666; font-size: 1.1em; text-align: center; margin-top: 16px;">
46
46
  {{ translationMap.get('LABEL_DONT_HAVE_AN_ACCOUNT_YET') }}
47
47
  <span style="color: #03a5e8; cursor:pointer" (click)="goToSignupPage()">
48
48
  {{ translationMap.get('LABEL_SIGNUP') }}
49
49
  </span>
50
- </p>
50
+ </p> -->
51
51
 
52
52
  <p style="color: #666666; font-size: 1.1em; text-align: center; margin-top: 16px;">
53
- {{ translationMap.get('LABEL_FORGOT_YOUR_PASSWORD') }}
53
+ {{ translationMap?.get('LABEL_FORGOT_YOUR_PASSWORD') }}
54
54
  <span style="color: #03a5e8; cursor:pointer" (click)="goToResetPsw()">
55
- {{ translationMap.get('LABEL_CLICK_HERE') }}
55
+ {{ translationMap?.get('LABEL_CLICK_HERE') }}
56
56
  </span>
57
57
  </p>
58
58
 
@@ -3,6 +3,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
3
3
  import { ToastController, IonInput } from '@ionic/angular';
4
4
  import { AppConfigProvider } from '../../../services/app-config';
5
5
 
6
+
6
7
  // Logger
7
8
  import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
8
9
  import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
@@ -59,7 +60,7 @@ export class LoginComponent implements OnInit {
59
60
  this.buildForm();
60
61
  this.DASHBOARD_URL = this.appConfig.getConfig().dashboardUrl;
61
62
  this.logger.log('LOGIN-COMP OnInit DASHBOARD_URL', this.DASHBOARD_URL)
62
- this.showSpinnerInLoginBtn = false;
63
+ // this.showSpinnerInLoginBtn = false;
63
64
  }
64
65
  // ngAfterViewChecked() {
65
66
  // this.emailInputEl.setFocus()
@@ -61,7 +61,7 @@ export class BubbleMyMessageComponent implements OnInit {
61
61
  * alla chiusura controllo su quale opzione ho premuto e attivo l'azione corrispondete
62
62
  */
63
63
  presentPopover(event, msg) {
64
- console.log('presentPopover');
64
+ // console.log('presentPopover');
65
65
  // let popover = this.popoverCtrl.create(PopoverPage, { typePopup: TYPE_POPUP_DETAIL_MESSAGE, message: msg });
66
66
  // popover.present({
67
67
  // ev: event
@@ -3,10 +3,8 @@
3
3
  <ion-toolbar>
4
4
 
5
5
  <ion-buttons slot="start">
6
- <!-- (click)="pushPage('conversations-list')" -->
7
- <ion-back-button text="" *ngIf="isMobile"
8
- defaultHref="/conversations-list"
9
- >
6
+ <!-- (click)="pushPage('conversations-list')" defaultHref="/conversations-list" -->
7
+ <ion-back-button style="display: block;" text="" *ngIf="isMobile" (click)="goBackToConversationList()">
10
8
  </ion-back-button>
11
9
  </ion-buttons>
12
10
 
@@ -1,5 +1,5 @@
1
1
  import { Component, OnInit, Input, Output, EventEmitter, OnChanges } from '@angular/core';
2
- import { ActivatedRoute } from '@angular/router';
2
+ import { ActivatedRoute, Router } from '@angular/router';
3
3
  import { ImageRepoService } from 'src/chat21-core/providers/abstract/image-repo.service';
4
4
 
5
5
  // Logger
@@ -43,7 +43,8 @@ export class HeaderConversationDetailComponent implements OnInit, OnChanges {
43
43
  constructor(
44
44
  public imageRepoService: ImageRepoService,
45
45
  private route: ActivatedRoute,
46
- public platform: Platform
46
+ public platform: Platform,
47
+ private router: Router
47
48
  ) {
48
49
  this.route.paramMap.subscribe(params => {
49
50
 
@@ -125,4 +126,8 @@ export class HeaderConversationDetailComponent implements OnInit, OnChanges {
125
126
  /** */
126
127
  pushPage(event) { }
127
128
 
129
+ goBackToConversationList() {
130
+ this.router.navigateByUrl('/conversations-list');
131
+ }
132
+
128
133
  }
@@ -112,8 +112,8 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
112
112
 
113
113
  this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges DROP EVENT ", this.dropEvent);
114
114
  this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] ngOnChanges tagsCannedFilter ", this.tagsCannedFilter);
115
- this.logger.log('[CONVS-DETAIL] - returnChangeTextArea ngOnChanges in [MSG-TEXT-AREA] this.tagsCannedFilter.length ', this.tagsCannedFilter.length )
116
-
115
+ this.logger.log('[CONVS-DETAIL] - returnChangeTextArea ngOnChanges in [MSG-TEXT-AREA] this.tagsCannedFilter.length ', this.tagsCannedFilter.length)
116
+
117
117
  // use case drop
118
118
  if (this.dropEvent) {
119
119
  this.presentModal(this.dropEvent)
@@ -507,7 +507,7 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
507
507
 
508
508
 
509
509
 
510
- const message = e.target.textContent.trim();
510
+ let message = e.target.textContent.trim();
511
511
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - event target textContent (message): ', message);
512
512
  // e.inputType === 'insertLineBreak' &&
513
513
  if (e.inputType === 'insertLineBreak' && message === '') {
@@ -525,17 +525,29 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
525
525
  this.messageString = '';
526
526
  this.sendMessage(text);
527
527
  this.countClicks = 0
528
- } else if (text.includes("/") && pos >= 0 && this.countClicks > 1 && this.tagsCannedFilter.length > 0) {
528
+ } else if (text.includes("/") && pos === 0 && this.countClicks > 1 && this.tagsCannedFilter.length > 0) {
529
529
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - tagsCannedFilter.length 2: ', this.tagsCannedFilter.length);
530
530
  this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 message: ", message);
531
+ this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 2 message value: ', message.value);
531
532
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 2 text: ', text);
532
- var lastChar = message.value.substr(-1); // Selects the last character
533
- if (lastChar === '/') {
534
- message.value = message.value.substring(0, message.value.length() - 1);
535
- }
533
+
534
+ this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 this.tagsCannedFilter.length: ", this.tagsCannedFilter.length);
535
+ this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
536
+ this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
537
+ this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 2 message: ', message);
538
+ this.messageString = '';
539
+
540
+ this.sendMessage(text);
541
+ this.countClicks = 0
542
+ } else if (text.includes("/") && pos > 0 && this.countClicks > 1 && this.tagsCannedFilter.length > 0 && text.substr(-1) !== '/' ) {
543
+ this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - tagsCannedFilter.length 3: ', this.tagsCannedFilter.length);
544
+ this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 3 message: ", message);
545
+ // this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 3 message value: ', message.value);
546
+ this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 3 text: ', text);
536
547
 
537
548
  this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 this.tagsCannedFilter.length: ", this.tagsCannedFilter.length);
538
549
  this.logger.log("[CONVS-DETAIL] replaceTagInMessage onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
550
+ this.logger.log("[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown in msg-texarea SEND MESSAGE 2 this.countClicks: ", this.countClicks);
539
551
  this.logger.log('[CONVS-DETAIL][MSG-TEXT-AREA] onKeydown - SEND MESSAGE 2 message: ', message);
540
552
  this.messageString = '';
541
553
 
@@ -551,13 +563,6 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
551
563
  this.countClicks = 0
552
564
 
553
565
  }
554
-
555
-
556
-
557
-
558
-
559
-
560
- // }
561
566
  }
562
567
  }
563
568
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  <ion-buttons slot="end">
16
16
 
17
- <ion-button *ngIf="!supportMode" ion-button fill="clear" (click)="onOpenContactsDirectory($event)">
17
+ <ion-button *ngIf="supportMode" ion-button fill="clear" (click)="onOpenContactsDirectory($event)">
18
18
  <ion-icon slot="icon-only" name="create-outline"></ion-icon>
19
19
  </ion-button>
20
20
 
@@ -7,14 +7,16 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
7
7
  })
8
8
  export class DdpHeaderComponent implements OnInit {
9
9
  @Input() numberOpenConv: number;
10
- @Input() supportMode = false;
10
+ @Input() supportMode: boolean;
11
11
  @Output() openContactsDirectory = new EventEmitter();
12
12
  @Output() openProfileInfo = new EventEmitter();
13
13
 
14
14
  constructor(
15
15
  ) { }
16
16
 
17
- ngOnInit() {}
17
+ ngOnInit() {
18
+ // console.log('DDP HEADER SUPPORT MODE ', this.supportMode)
19
+ }
18
20
 
19
21
  // START @Output() //
20
22
  /** */