@chat21/chat21-ionic 3.0.60 → 3.0.61-rc14

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 (162) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +2 -0
  3. package/angular.json +4 -0
  4. package/config.xml +5 -5
  5. package/deploy_pre.sh +10 -10
  6. package/deploy_prod.sh +5 -1
  7. package/env.sample +3 -1
  8. package/package.json +13 -7
  9. package/resources/{Android → android}/icon/drawable-hdpi-icon.png +0 -0
  10. package/resources/{Android → android}/icon/drawable-ldpi-icon.png +0 -0
  11. package/resources/{Android → android}/icon/drawable-mdpi-icon.png +0 -0
  12. package/resources/{Android → android}/icon/drawable-xhdpi-icon.png +0 -0
  13. package/resources/{Android → android}/icon/drawable-xxhdpi-icon.png +0 -0
  14. package/resources/{Android → android}/icon/drawable-xxxhdpi-icon.png +0 -0
  15. package/resources/{Android → android}/icon.png +0 -0
  16. package/resources/{Android → android}/splash/drawable-land-hdpi-screen.png +0 -0
  17. package/resources/{Android → android}/splash/drawable-land-ldpi-screen.png +0 -0
  18. package/resources/{Android → android}/splash/drawable-land-mdpi-screen.png +0 -0
  19. package/resources/{Android → android}/splash/drawable-land-xhdpi-screen.png +0 -0
  20. package/resources/{Android → android}/splash/drawable-land-xxhdpi-screen.png +0 -0
  21. package/resources/{Android → android}/splash/drawable-land-xxxhdpi-screen.png +0 -0
  22. package/resources/{Android → android}/splash/drawable-port-hdpi-screen.png +0 -0
  23. package/resources/{Android → android}/splash/drawable-port-ldpi-screen.png +0 -0
  24. package/resources/{Android → android}/splash/drawable-port-mdpi-screen.png +0 -0
  25. package/resources/{Android → android}/splash/drawable-port-xhdpi-screen.png +0 -0
  26. package/resources/{Android → android}/splash/drawable-port-xxhdpi-screen.png +0 -0
  27. package/resources/{Android → android}/splash/drawable-port-xxxhdpi-screen.png +0 -0
  28. package/resources/{Android → android}/splash.png +0 -0
  29. package/src/app/app-routing.module.ts +15 -0
  30. package/src/app/app.component.html +14 -4
  31. package/src/app/app.component.scss +18 -1
  32. package/src/app/app.component.ts +50 -16
  33. package/src/app/app.module.ts +12 -3
  34. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +23 -5
  35. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +142 -49
  36. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +101 -18
  37. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +20 -36
  38. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.scss +10 -0
  39. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +35 -40
  40. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +7 -2
  41. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +103 -12
  42. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +39 -36
  43. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.scss +7 -1
  44. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +148 -63
  45. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +59 -22
  46. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.scss +32 -9
  47. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +102 -23
  48. package/src/app/components/ddp-header/ddp-header.component.html +20 -6
  49. package/src/app/components/ddp-header/ddp-header.component.scss +4 -0
  50. package/src/app/components/ddp-header/ddp-header.component.ts +104 -10
  51. package/src/app/components/project-item/project-item.component.html +8 -7
  52. package/src/app/components/project-item/project-item.component.scss +7 -2
  53. package/src/app/components/project-item/project-item.component.ts +15 -2
  54. package/src/app/components/sidebar/sidebar.component.html +275 -0
  55. package/src/app/components/sidebar/sidebar.component.scss +79 -0
  56. package/src/app/components/sidebar/sidebar.component.spec.ts +24 -0
  57. package/src/app/components/sidebar/sidebar.component.ts +539 -0
  58. package/src/app/components/sidebar-user-details/sidebar-user-details.component.html +117 -0
  59. package/src/app/components/sidebar-user-details/sidebar-user-details.component.scss +330 -0
  60. package/src/app/components/sidebar-user-details/sidebar-user-details.component.spec.ts +24 -0
  61. package/src/app/components/sidebar-user-details/sidebar-user-details.component.ts +490 -0
  62. package/src/app/pages/conversation-detail/conversation-detail.module.ts +6 -1
  63. package/src/app/pages/conversation-detail/conversation-detail.page.html +20 -10
  64. package/src/app/pages/conversation-detail/conversation-detail.page.scss +28 -0
  65. package/src/app/pages/conversation-detail/conversation-detail.page.ts +1132 -784
  66. package/src/app/pages/conversations-list/conversations-list.module.ts +2 -1
  67. package/src/app/pages/conversations-list/conversations-list.page.html +18 -9
  68. package/src/app/pages/conversations-list/conversations-list.page.scss +9 -1
  69. package/src/app/pages/conversations-list/conversations-list.page.ts +738 -425
  70. package/src/app/pages/create-canned-response/create-canned-response-routing.module.ts +17 -0
  71. package/src/app/pages/create-canned-response/create-canned-response.module.ts +30 -0
  72. package/src/app/pages/create-canned-response/create-canned-response.page.html +150 -0
  73. package/src/app/pages/create-canned-response/create-canned-response.page.scss +55 -0
  74. package/src/app/pages/create-canned-response/create-canned-response.page.spec.ts +24 -0
  75. package/src/app/pages/create-canned-response/create-canned-response.page.ts +319 -0
  76. package/src/app/pages/create-requester/create-requester-routing.module.ts +17 -0
  77. package/src/app/pages/create-requester/create-requester.module.ts +28 -0
  78. package/src/app/pages/create-requester/create-requester.page.html +67 -0
  79. package/src/app/pages/create-requester/create-requester.page.scss +30 -0
  80. package/src/app/pages/create-requester/create-requester.page.spec.ts +24 -0
  81. package/src/app/pages/create-requester/create-requester.page.ts +138 -0
  82. package/src/app/pages/create-ticket/create-ticket-routing.module.ts +17 -0
  83. package/src/app/pages/create-ticket/create-ticket.module.ts +28 -0
  84. package/src/app/pages/create-ticket/create-ticket.page.html +171 -0
  85. package/src/app/pages/create-ticket/create-ticket.page.scss +52 -0
  86. package/src/app/pages/create-ticket/create-ticket.page.spec.ts +24 -0
  87. package/src/app/pages/create-ticket/create-ticket.page.ts +432 -0
  88. package/src/app/pages/loader-preview/loader-preview.page.ts +226 -166
  89. package/src/app/pages/profile-info/profile-info.page.html +4 -4
  90. package/src/app/pages/profile-info/profile-info.page.scss +13 -2
  91. package/src/app/pages/profile-info/profile-info.page.ts +23 -21
  92. package/src/app/services/tiledesk/tiledesk.service.ts +209 -0
  93. package/src/app/shared/shared.module.ts +14 -1
  94. package/src/app/utils/scrollbar-theme.directive.ts +58 -24
  95. package/src/assets/i18n/de.json +69 -13
  96. package/src/assets/i18n/en.json +62 -6
  97. package/src/assets/i18n/es.json +61 -5
  98. package/src/assets/i18n/fr.json +64 -8
  99. package/src/assets/i18n/it.json +61 -5
  100. package/src/assets/i18n/pt.json +61 -5
  101. package/src/assets/i18n/ru.json +62 -6
  102. package/src/assets/i18n/sr.json +265 -0
  103. package/src/assets/i18n/tr.json +61 -5
  104. package/src/assets/images/default-avatar-x-select.png +0 -0
  105. package/src/assets/images/language_flag/ar.png +0 -0
  106. package/src/assets/images/language_flag/bg.png +0 -0
  107. package/src/assets/images/language_flag/ca.png +0 -0
  108. package/src/assets/images/language_flag/cs.png +0 -0
  109. package/src/assets/images/language_flag/da.png +0 -0
  110. package/src/assets/images/language_flag/de.png +0 -0
  111. package/src/assets/images/language_flag/el.png +0 -0
  112. package/src/assets/images/language_flag/en.png +0 -0
  113. package/src/assets/images/language_flag/es.png +0 -0
  114. package/src/assets/images/language_flag/fa.png +0 -0
  115. package/src/assets/images/language_flag/fi.png +0 -0
  116. package/src/assets/images/language_flag/fr.png +0 -0
  117. package/src/assets/images/language_flag/he.png +0 -0
  118. package/src/assets/images/language_flag/hi.png +0 -0
  119. package/src/assets/images/language_flag/hr.png +0 -0
  120. package/src/assets/images/language_flag/hu.png +0 -0
  121. package/src/assets/images/language_flag/id.png +0 -0
  122. package/src/assets/images/language_flag/it.png +0 -0
  123. package/src/assets/images/language_flag/ja.png +0 -0
  124. package/src/assets/images/language_flag/ko.png +0 -0
  125. package/src/assets/images/language_flag/ml-IN.png +0 -0
  126. package/src/assets/images/language_flag/ne-NP.png +0 -0
  127. package/src/assets/images/language_flag/nl.png +0 -0
  128. package/src/assets/images/language_flag/no.png +0 -0
  129. package/src/assets/images/language_flag/pl.png +0 -0
  130. package/src/assets/images/language_flag/pt-BR.png +0 -0
  131. package/src/assets/images/language_flag/pt.png +0 -0
  132. package/src/assets/images/language_flag/ro.png +0 -0
  133. package/src/assets/images/language_flag/ru.png +0 -0
  134. package/src/assets/images/language_flag/sk.png +0 -0
  135. package/src/assets/images/language_flag/sl.png +0 -0
  136. package/src/assets/images/language_flag/sr.png +0 -0
  137. package/src/assets/images/language_flag/sv-SE.png +0 -0
  138. package/src/assets/images/language_flag/ta.png +0 -0
  139. package/src/assets/images/language_flag/th.png +0 -0
  140. package/src/assets/images/language_flag/tr.png +0 -0
  141. package/src/assets/images/language_flag/uk.png +0 -0
  142. package/src/assets/images/language_flag/vi.png +0 -0
  143. package/src/assets/images/language_flag/zh-CN.png +0 -0
  144. package/src/assets/images/language_flag/zh-TW.png +0 -0
  145. package/src/assets/images/no_image_user.png +0 -0
  146. package/src/assets/images/priority_icons/high.svg +3 -0
  147. package/src/assets/images/priority_icons/high_v2.svg +14 -0
  148. package/src/assets/images/priority_icons/low.svg +10 -0
  149. package/src/assets/images/priority_icons/low_v2.svg +14 -0
  150. package/src/assets/images/priority_icons/medium.svg +16 -0
  151. package/src/assets/images/priority_icons/medium_v2.svg +11 -0
  152. package/src/assets/images/priority_icons/urgent.svg +4 -0
  153. package/src/assets/images/priority_icons/urgent_v2.svg +16 -0
  154. package/src/assets/tiledesk-solo-logo.png +0 -0
  155. package/src/chat-config-pre-test.json +3 -1
  156. package/src/chat-config-template.json +3 -1
  157. package/src/chat-config.json +4 -2
  158. package/src/chat21-core/utils/constants.ts +6 -1
  159. package/src/global.scss +405 -3
  160. package/src/index.html +7 -0
  161. package/publish_pre.sh +0 -33
  162. package/publish_prod.sh +0 -33
@@ -0,0 +1,17 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { Routes, RouterModule } from '@angular/router';
3
+
4
+ import { CreateCannedResponsePage } from './create-canned-response.page';
5
+
6
+ const routes: Routes = [
7
+ {
8
+ path: '',
9
+ component: CreateCannedResponsePage
10
+ }
11
+ ];
12
+
13
+ @NgModule({
14
+ imports: [RouterModule.forChild(routes)],
15
+ exports: [RouterModule],
16
+ })
17
+ export class CreateCannedResponsePageRoutingModule {}
@@ -0,0 +1,30 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule ,ReactiveFormsModule} from '@angular/forms';
4
+
5
+ import { IonicModule } from '@ionic/angular';
6
+
7
+ import { CreateCannedResponsePageRoutingModule } from './create-canned-response-routing.module';
8
+
9
+ import { CreateCannedResponsePage } from './create-canned-response.page';
10
+ import { TranslateLoader, TranslateModule} from '@ngx-translate/core';
11
+ import { createTranslateLoader } from '../../../chat21-core/utils/utils';
12
+ import { HttpClient } from '@angular/common/http';
13
+ @NgModule({
14
+ imports: [
15
+ CommonModule,
16
+ FormsModule,
17
+ ReactiveFormsModule,
18
+ IonicModule,
19
+ CreateCannedResponsePageRoutingModule,
20
+ TranslateModule.forChild({
21
+ loader: {
22
+ provide: TranslateLoader,
23
+ useFactory: (createTranslateLoader),
24
+ deps: [HttpClient]
25
+ }
26
+ })
27
+ ],
28
+ declarations: [CreateCannedResponsePage]
29
+ })
30
+ export class CreateCannedResponsePageModule {}
@@ -0,0 +1,150 @@
1
+ <ion-header>
2
+ <ion-toolbar>
3
+ <ion-title>{{'AddNewCannedResponse' | translate}}</ion-title>
4
+
5
+ <ion-buttons slot="end">
6
+ <ion-button ion-button fill="clear" (click)="closeModalCreateCannedResponseModal()">
7
+ <ion-icon slot="icon-only" name="close"></ion-icon>
8
+ </ion-button>
9
+ </ion-buttons>
10
+ </ion-toolbar>
11
+ </ion-header>
12
+
13
+ <ion-menu side="start" menu-id="custom" content-id="main" class="my-custom-menu">
14
+ <!-- <ion-header>
15
+ <ion-toolbar color="tertiary">
16
+ <ion-title>Custom Menu</ion-title>
17
+ </ion-toolbar>
18
+ </ion-header> -->
19
+ <ion-content>
20
+ <ion-list>
21
+ <ion-item button (click)="addRecipientNamePlaceholderToTheMsg()"
22
+ (mouseover)="onOverBtnAddRecipientNamePlaceholder()"
23
+ (mouseout)="onOutBtnAddRecipientNamePlaceholder()">
24
+ <ion-label>
25
+ {{'First_name_of_recipient' | translate}}
26
+ </ion-label>
27
+ </ion-item>
28
+ <ion-item button (click)="addAgentNamePlaceholderToTheMsg()"
29
+ (mouseover)="onOverBtnAddAgentNamePlaceholder()"
30
+ (mouseout)="onOutBtnAddAgentNamePlaceholder()">
31
+ <ion-label>
32
+ {{'First_name_of_agent' | translate}}
33
+ </ion-label>
34
+ </ion-item>
35
+
36
+ </ion-list>
37
+ <!-- <ion-note> </ion-note> -->
38
+ <ion-grid>
39
+ <ion-row>
40
+ <ion-col class="ion-padding">
41
+ <div class="ion-text-center">
42
+ <h6
43
+ *ngIf="mouseOverBtnAddRecipientNamePlaceholder === false && mouseOverBtnAddAgentNamePlaceholder === false"
44
+ ion-text class="note-text">
45
+ <!-- Seleziona una valore personalizzato da aggiungere al messaggio. -->
46
+ {{'SelectACustomizationToAddToYourMessage' | translate}}
47
+ </h6>
48
+ <h6
49
+ *ngIf="mouseOverBtnAddRecipientNamePlaceholder === true && mouseOverBtnAddAgentNamePlaceholder === false"
50
+ ion-text class="note-text">
51
+ <!-- Il nome della persona a cui l'agente sta rispondendo verrà aggiunto al messaggio. -->
52
+ {{'recipient_name_desc' | translate}}
53
+ </h6>
54
+
55
+ <h6
56
+ *ngIf="mouseOverBtnAddRecipientNamePlaceholder === false && mouseOverBtnAddAgentNamePlaceholder === true"
57
+ ion-text class="note-text">
58
+ <!-- Il nome dell'agente che sta rispondendo verrà aggiunto al messaggio. -->
59
+ {{'agent_name_desc' | translate }}
60
+ </h6>
61
+
62
+ </div>
63
+ </ion-col>
64
+ </ion-row>
65
+ </ion-grid>
66
+
67
+ </ion-content>
68
+ </ion-menu>
69
+ <!-- <ion-router-outlet id="menuContent"></ion-router-outlet> -->
70
+
71
+ <ion-content id="create-canned-response-content">
72
+ <form [formGroup]="validations_form" (ngSubmit)="onSubmit(validations_form.value)">
73
+ <ion-grid>
74
+ <ion-row>
75
+ <ion-col size="12">
76
+ <!-- ---------------------------------------------- -->
77
+ <!-- Canned response title -->
78
+ <!-- ---------------------------------------------- -->
79
+ <ion-item>
80
+ <ion-label class="custom-label-size" for="title" position="stacked" color="primary">
81
+ {{'Title' | translate}} *
82
+ </ion-label>
83
+ <ion-input placeholder="{{'EnterCannedResponseTitle' | translate}}" id="title" type="text" formControlName="title">
84
+ </ion-input>
85
+ </ion-item>
86
+ <div class="validation-errors">
87
+ <ng-container *ngFor="let validation of validation_messages.title">
88
+ <div class="error-message"
89
+ *ngIf="validations_form.get('title').hasError(validation.type) && (validations_form.get('title').dirty || validations_form.get('title').touched)">
90
+ <ion-icon name="information-circle-outline"></ion-icon>
91
+ <span class="validation-message"> {{ validation.message }} </span>
92
+ </div>
93
+ </ng-container>
94
+ </div>
95
+ </ion-col>
96
+
97
+ <!-- ---------------------------------------------- -->
98
+ <!-- Canned response Message -->
99
+ <!-- ---------------------------------------------- -->
100
+ <ion-col size="12">
101
+ <ion-item>
102
+ <ion-label class="custom-label-size" for="message" position="stacked" color="primary">
103
+ {{'Message' | translate}} *
104
+ </ion-label>
105
+ <ion-textarea placeholder="{{'WriteMsgToSendToYourVisitors' | translate}}"
106
+ (ngModelChange)="cannedResponseMessageChanged($event)" class="canned-response-texarea" rows="4"
107
+ id="message" type="text" formControlName="message"></ion-textarea>
108
+ </ion-item>
109
+ <div class="validation-errors">
110
+ <ng-container *ngFor="let validation of validation_messages.message">
111
+ <div class="error-message"
112
+ *ngIf="validations_form.get('message').hasError(validation.type) && (validations_form.get('message').dirty || validations_form.get('message').touched)">
113
+ <ion-icon name="information-circle-outline"></ion-icon>
114
+ <span class="validation-message"> {{ validation.message }} </span>
115
+
116
+ </div>
117
+ </ng-container>
118
+ </div>
119
+ </ion-col>
120
+
121
+ <!-- ---------------------------------------------- -->
122
+ <!-- Button Add personalisation -->
123
+ <!-- ---------------------------------------------- -->
124
+ <ion-col size="12" style="text-align: right;">
125
+ <ion-button ion-button fill="clear" size="small" (click)="openAddPersonalisationMenu()">
126
+ <span style="color:#999999">
127
+ <!-- Aggiungi personalizzazione -->
128
+ {{'AddCustomization' | translate}}
129
+ </span>
130
+ </ion-button>
131
+ </ion-col>
132
+
133
+ <!-- ---------------------------------------------- -->
134
+ <!-- Button Subbmit -->
135
+ <!-- ---------------------------------------------- -->
136
+ <ion-col size="12" style="text-align: center;">
137
+ <ion-button color="primary" class="submit-btn" type="submit" [disabled]="!validations_form.valid">
138
+ <ion-icon *ngIf="showSpinnerCreateCannedResponse === false" style="font-size: 1.9em;" slot="start"
139
+ name="add-circle-outline"></ion-icon>
140
+ <ion-spinner *ngIf="showSpinnerCreateCannedResponse === true"
141
+ style="color: #fff; margin: 0px 0.3em 0px -0.3em;" name="bubbles" duration="2"></ion-spinner>
142
+ {{'Add' | translate}}
143
+ </ion-button>
144
+ </ion-col>
145
+ </ion-row>
146
+ </ion-grid>
147
+ </form>
148
+
149
+
150
+ </ion-content>
@@ -0,0 +1,55 @@
1
+ #create-canned-response-content {
2
+ .validation-errors {
3
+ height: 20px;
4
+ // margin-bottom: 16px;
5
+ }
6
+
7
+ .error-message {
8
+ // color: red;
9
+ // font-size: 14px;
10
+ // margin-left: 10px;
11
+ // margin-top: 10px;
12
+ ion-icon {
13
+ color: red;
14
+ font-size: 16px;
15
+ margin-left: 15px;
16
+ margin-right: 3px;
17
+ position: relative;
18
+ top: 3px;
19
+ }
20
+ .validation-message {
21
+ color: red;
22
+ font-size: 14px;
23
+ margin-top: 1px;
24
+ }
25
+ }
26
+
27
+ .submit-btn {
28
+ margin: 48px 12px 12px;
29
+ min-width: 150px;
30
+ }
31
+
32
+ ion-textarea {
33
+ --placeholder-color: #d3d3d3;
34
+ --placeholder-opacity: 1;
35
+ }
36
+ ion-input {
37
+ --placeholder-color: #d3d3d3;
38
+ --placeholder-opacity: 1;
39
+ }
40
+ }
41
+
42
+ .my-custom-menu {
43
+ --width: 500px;
44
+ margin-top: 57px;
45
+ }
46
+
47
+ .note-text {
48
+ color: #a6a6a6;
49
+ }
50
+
51
+ .custom-label-size {
52
+ font-size: 1.2em;
53
+ }
54
+
55
+
@@ -0,0 +1,24 @@
1
+ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { IonicModule } from '@ionic/angular';
3
+
4
+ import { CreateCannedResponsePage } from './create-canned-response.page';
5
+
6
+ describe('CreateCannedResponsePage', () => {
7
+ let component: CreateCannedResponsePage;
8
+ let fixture: ComponentFixture<CreateCannedResponsePage>;
9
+
10
+ beforeEach(async(() => {
11
+ TestBed.configureTestingModule({
12
+ declarations: [ CreateCannedResponsePage ],
13
+ imports: [IonicModule.forRoot()]
14
+ }).compileComponents();
15
+
16
+ fixture = TestBed.createComponent(CreateCannedResponsePage);
17
+ component = fixture.componentInstance;
18
+ fixture.detectChanges();
19
+ }));
20
+
21
+ it('should create', () => {
22
+ expect(component).toBeTruthy();
23
+ });
24
+ });
@@ -0,0 +1,319 @@
1
+ import { Component, Input, OnInit } from '@angular/core';
2
+ import { ModalController } from '@ionic/angular';
3
+ import { Validators, FormBuilder, FormGroup, FormControl } from '@angular/forms';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import { LoggerService } from 'src/chat21-core/providers/abstract/logger.service';
6
+ import { LoggerInstance } from 'src/chat21-core/providers/logger/loggerInstance';
7
+ import { TiledeskAuthService } from 'src/chat21-core/providers/tiledesk/tiledesk-auth.service';
8
+ import { TiledeskService } from 'src/app/services/tiledesk/tiledesk.service';
9
+ import { MenuController } from '@ionic/angular';
10
+ import { EventsService } from 'src/app/services/events-service';
11
+ import { ActivatedRoute } from '@angular/router';
12
+
13
+ @Component({
14
+ selector: 'app-create-canned-response',
15
+ templateUrl: './create-canned-response.page.html',
16
+ styleUrls: ['./create-canned-response.page.scss'],
17
+ })
18
+ export class CreateCannedResponsePage implements OnInit {
19
+
20
+ public canned_response_title: string;
21
+ public canned_response_message: string;
22
+ validations_form: FormGroup;
23
+ @Input() message: any
24
+ @Input() conversationWith: string;
25
+ logger: LoggerService = LoggerInstance.getInstance();
26
+
27
+ prjctID: string;
28
+ tiledeskToken: string;
29
+ showSpinnerCreateCannedResponse: boolean = false;
30
+ addWhiteSpaceBefore: boolean;
31
+ mouseOverBtnAddRecipientNamePlaceholder: boolean = false;
32
+ mouseOverBtnAddAgentNamePlaceholder: boolean = false;
33
+ conversation_id: string
34
+ // public conversationWith: string;
35
+ constructor(
36
+ public modalController: ModalController,
37
+ private formBuilder: FormBuilder,
38
+ private translate: TranslateService,
39
+ public tiledeskAuthService: TiledeskAuthService,
40
+ public tiledeskService: TiledeskService,
41
+ private menu: MenuController,
42
+ public events: EventsService,
43
+ private route: ActivatedRoute,
44
+ ) {
45
+ // this.route.paramMap.subscribe((params) => {
46
+ // console.log('[CONVS-DETAIL] - constructor -> params: ', params)
47
+ // this.conversationWith = params.get('IDConv')
48
+
49
+
50
+ // })
51
+ }
52
+
53
+
54
+
55
+ ngOnInit() {
56
+ // this.getCurrentProjectId();
57
+ // console.log('[CREATE-CANNED-RES] - conversationWith ', this.conversationWith)
58
+ // console.log('[CREATE-CANNED-RES] - message ', this.message)
59
+ if (this.message) {
60
+ this.conversation_id = this.message.recipient
61
+ this.logger.log('[CREATE-CANNED-RES] - conversationWith get from @input message (passed by bubble-message)', this.conversation_id)
62
+ } else {
63
+ this.logger.log('[CREATE-CANNED-RES] - @input message is UNDEFINED')
64
+ }
65
+ if (this.conversationWith) {
66
+ this.conversation_id = this.conversationWith;
67
+ this.logger.log('[CREATE-CANNED-RES] - conversationWith get from @input conversationWith (passed by conversation detail) ', this.conversation_id)
68
+ } else {
69
+ this.logger.log('[CREATE-CANNED-RES] - @input conversationWith is UNDEFINED')
70
+ }
71
+
72
+ this.tiledeskToken = this.tiledeskAuthService.getTiledeskToken()
73
+ this.logger.log('[CREATE-CANNED-RES] tiledeskToken ', this.tiledeskToken)
74
+ this.getCurrentProjectId(this.conversation_id, this.tiledeskToken);
75
+
76
+ // const stored_project = localStorage.getItem('last_project')
77
+ // const storedPrjctObjct = JSON.parse(stored_project)
78
+ // this.logger.log('[CREATE-CANNED-RES] storedPrjctObjct ', storedPrjctObjct)
79
+ // if (storedPrjctObjct) {
80
+ // this.prjctID = storedPrjctObjct.id_project.id
81
+ // this.logger.log('[CREATE-CANNED-RES] this.prjctID ', this.prjctID)
82
+ // }
83
+
84
+
85
+
86
+ this.buildForm()
87
+ }
88
+
89
+ getCurrentProjectId(conversation_id, tiledeskToken) {
90
+ const conversationWith_segments = conversation_id.split('-')
91
+ // Removes the last element of the array if is = to the separator
92
+ if (
93
+ conversationWith_segments[conversationWith_segments.length - 1] === ''
94
+ ) {
95
+ conversationWith_segments.pop()
96
+ }
97
+
98
+ if (conversationWith_segments.length === 4) {
99
+ const lastArrayElement = conversationWith_segments[conversationWith_segments.length - 1]
100
+ this.logger.log('[CREATE-CANNED-RES] - lastArrayElement ', lastArrayElement)
101
+ this.logger.log('[CREATE-CANNED-RES]- lastArrayElement length', lastArrayElement.length)
102
+ if (lastArrayElement.length !== 32) {
103
+ conversationWith_segments.pop()
104
+ }
105
+ }
106
+
107
+ this.logger.log('[CREATE-CANNED-RES] - loadTagsCanned conversationWith_segments ', conversationWith_segments)
108
+ // let projectId = ''
109
+
110
+ if (conversationWith_segments.length === 4) {
111
+ this.prjctID = conversationWith_segments[2]
112
+ this.logger.log('[CREATE-CANNED-RES] - loadTagsCanned projectId ', this.prjctID)
113
+ } else {
114
+ this.getProjectIdByConversationWith(conversation_id, tiledeskToken)
115
+ }
116
+ }
117
+
118
+ getProjectIdByConversationWith(conversationWith: string, tiledeskToken: string) {
119
+ // const tiledeskToken = this.tiledeskAuthService.getTiledeskToken()
120
+
121
+ this.tiledeskService
122
+ .getProjectIdByConvRecipient(tiledeskToken, conversationWith)
123
+ .subscribe(
124
+ (res) => {
125
+ this.logger.log('[CREATE-CANNED-RES] - GET PROJECTID BY CONV RECIPIENT RES', res)
126
+ if (res) {
127
+ this.prjctID = res.id_project
128
+ this.logger.log('[CREATE-CANNED-RES] - GET PROJECTID BY CONV RECIPIENT projectId ', this.prjctID)
129
+
130
+ }
131
+ },
132
+ (error) => {
133
+ this.logger.error('[CREATE-CANNED-RES] - GET PROJECTID BY CONV RECIPIENT - ERROR ', error)
134
+ },
135
+ () => {
136
+ this.logger.log('[CREATE-CANNED-RES] - GET PROJECTID BY CONV RECIPIENT * COMPLETE *',)
137
+ },
138
+ )
139
+ }
140
+
141
+
142
+ buildForm() {
143
+ this.validations_form = this.formBuilder.group({
144
+ title: new FormControl('', Validators.required),
145
+ message: new FormControl('', Validators.required),
146
+ });
147
+
148
+ this.setValues()
149
+ }
150
+
151
+ setValues() {
152
+ if (this.message && this.message.text) {
153
+ let cannedTitle = ''
154
+ const titleMaxCharacters = 37
155
+ if (this.message.text.length > titleMaxCharacters) {
156
+ cannedTitle = this.message.text.substring(0, titleMaxCharacters) + '...'
157
+ } else {
158
+ cannedTitle = this.message.text
159
+ }
160
+ this.logger.log('[CREATE-CANNED-RES] - cannedTitle ', cannedTitle.trim())
161
+ this.logger.log('[CREATE-CANNED-RES] - cannedMsg ', this.message.text.trim())
162
+ this.validations_form.controls['title'].setValue(cannedTitle);
163
+ this.validations_form.controls['message'].setValue(this.message.text);
164
+ }
165
+ }
166
+
167
+
168
+ validation_messages = {
169
+ 'title': [
170
+ { type: 'required', message: this.translate.instant('TitleIsRequired') }
171
+ ],
172
+ 'message': [
173
+ { type: 'required', message: this.translate.instant('MessageIsRequired') }
174
+ ],
175
+ };
176
+
177
+ onSubmit(values) {
178
+ this.logger.log('[CREATE-CANNED-RES] ON SUBMIT VALUES', values);
179
+ this.canned_response_title = values.title
180
+ this.canned_response_message = values.message
181
+ this.logger.log('[CREATE-CANNED-RES] ON SUBMIT canned_response_title', this.canned_response_title);
182
+ this.logger.log('[CREATE-CANNED-RES] ON SUBMIT canned_response_title', this.canned_response_message);
183
+ this.createResponse(this.canned_response_message, this.canned_response_title)
184
+ }
185
+
186
+ createResponse(canned_response_message, canned_response_title) {
187
+ this.showSpinnerCreateCannedResponse = true;
188
+ this.logger.log('[CREATE-CANNED-RES] - CREATE CANNED RESP - MSG ', canned_response_message);
189
+ this.logger.log('[CREATE-CANNED-RES] - CREATE CANNED RESP - TITLE ', canned_response_title);
190
+
191
+ this.tiledeskService.createCannedResponse(canned_response_message.trim(), canned_response_title.trim(), this.prjctID, this.tiledeskToken)
192
+ .subscribe((responses: any) => {
193
+ this.logger.log('[CREATE-CANNED-RES] - CREATE CANNED RESP - RES ', responses);
194
+
195
+ }, (error) => {
196
+ this.logger.error('[CREATE-CANNED-RES]- CREATE CANNED RESP - ERROR ', error);
197
+ this.showSpinnerCreateCannedResponse = false;
198
+ }, () => {
199
+ this.logger.log('[CREATE-CANNED-RES] - CREATE CANNED RESP * COMPLETE *');
200
+ this.showSpinnerCreateCannedResponse = false;
201
+ this.closeModalCreateCannedResponseModal()
202
+ this.events.publish('newcannedresponse:created', true);
203
+ });
204
+ }
205
+
206
+ openAddPersonalisationMenu() {
207
+ this.menu.enable(true, 'custom');
208
+ this.menu.open('custom');
209
+ }
210
+
211
+ addRecipientNamePlaceholderToTheMsg() {
212
+ this.menu.close('custom')
213
+ this.menu.enable(false, 'custom');
214
+ this.insertCustomField('$recipient_name')
215
+ }
216
+
217
+ onOverBtnAddRecipientNamePlaceholder() {
218
+ this.mouseOverBtnAddRecipientNamePlaceholder = true;
219
+ this.logger.log('[CREATE-CANNED-RES] - isOverRecipientName ', this.mouseOverBtnAddRecipientNamePlaceholder);
220
+ }
221
+
222
+ onOutBtnAddRecipientNamePlaceholder() {
223
+ this.mouseOverBtnAddRecipientNamePlaceholder = false;
224
+ this.logger.log('[CREATE-CANNED-RES] - isOutRecipientName ', this.mouseOverBtnAddRecipientNamePlaceholder);
225
+ }
226
+
227
+ addAgentNamePlaceholderToTheMsg() {
228
+ this.menu.close('custom')
229
+ this.menu.enable(false, 'custom');
230
+ this.insertCustomField('$agent_name')
231
+ }
232
+
233
+ onOverBtnAddAgentNamePlaceholder() {
234
+ this.mouseOverBtnAddAgentNamePlaceholder = true;
235
+ this.logger.log('[CREATE-CANNED-RES] - isOverAgentName ', this.mouseOverBtnAddAgentNamePlaceholder);
236
+ }
237
+
238
+ onOutBtnAddAgentNamePlaceholder() {
239
+ this.mouseOverBtnAddAgentNamePlaceholder = false;
240
+ this.logger.log('[CREATE-CANNED-RES] - isOutAgentName ', this.mouseOverBtnAddAgentNamePlaceholder);
241
+ }
242
+
243
+
244
+
245
+
246
+
247
+ cannedResponseMessageChanged($event) {
248
+ this.logger.log('[CREATE-CANNED-RES] - ON MSG CHANGED ', $event);
249
+
250
+ if (/\s$/.test($event)) {
251
+ this.logger.log('[CREATE-CANNED-RES] - ON MSG CHANGED - string contains space at last');
252
+ this.addWhiteSpaceBefore = false;
253
+ } else {
254
+ this.logger.log('[CREATE-CANNED-RES] - ON MSG CHANGED - string does not contain space at last');
255
+ // IS USED TO ADD A WHITE SPACE TO THE 'PERSONALIZATION' VALUE IF THE STRING DOES NOT CONTAIN SPACE AT LAST
256
+ this.addWhiteSpaceBefore = true;
257
+ }
258
+
259
+ }
260
+
261
+ insertCustomField(customfieldValue: string) {
262
+ const elTextarea = <HTMLElement>document.querySelector('.canned-response-texarea');
263
+ this.logger.log('[CREATE-CANNED-RES] - GET TEXT AREA - elTextarea ', elTextarea);
264
+ if (elTextarea) {
265
+ this.insertAtCursor(elTextarea, customfieldValue)
266
+ }
267
+ }
268
+ insertAtCursor(myField, myValue) {
269
+ this.logger.log('[CREATE-CANNED-RES] - insertAtCursor - myValue ', myValue);
270
+
271
+ if (this.addWhiteSpaceBefore === true) {
272
+ myValue = ' ' + myValue;
273
+ this.logger.log('[CREATE-CANNED-RES] - GET TEXT AREA - QUI ENTRO myValue ', myValue);
274
+ }
275
+
276
+ //IE support
277
+ if (myField.selection) {
278
+ myField.focus();
279
+ let sel = myField.selection.createRange();
280
+ sel.text = myValue;
281
+ // this.cannedResponseMessage = sel.text;
282
+ }
283
+ //MOZILLA and others
284
+ else if (myField.selectionStart || myField.selectionStart == '0') {
285
+ var startPos = myField.selectionStart;
286
+ this.logger.log('[CREATE-CANNED-RES] - insertAtCursor - startPos ', startPos);
287
+
288
+ var endPos = myField.selectionEnd;
289
+ this.logger.log('[CREATE-CANNED-RES] - insertAtCursor - endPos ', endPos);
290
+
291
+ myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);
292
+
293
+ // place cursor at end of text in text input element
294
+ myField.focus();
295
+ var val = myField.value; //store the value of the element
296
+ myField.value = ''; //clear the value of the element
297
+ myField.value = val + ' '; //set that value back.
298
+
299
+ // this.cannedResponseMessage = myField.value;
300
+
301
+ // this.texareaIsEmpty = false;
302
+ // myField.select();
303
+ } else {
304
+ myField.value += myValue;
305
+ // this.cannedResponseMessage = myField.value;
306
+ }
307
+ }
308
+
309
+
310
+ async closeModalCreateCannedResponseModal() {
311
+ if (this.menu) {
312
+ this.menu.close('custom')
313
+ this.menu.enable(false, 'custom');
314
+ }
315
+ await this.modalController.getTop()
316
+ this.modalController.dismiss({ confirmed: true })
317
+ }
318
+
319
+ }
@@ -0,0 +1,17 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { Routes, RouterModule } from '@angular/router';
3
+
4
+ import { CreateRequesterPage } from './create-requester.page';
5
+
6
+ const routes: Routes = [
7
+ {
8
+ path: '',
9
+ component: CreateRequesterPage
10
+ }
11
+ ];
12
+
13
+ @NgModule({
14
+ imports: [RouterModule.forChild(routes)],
15
+ exports: [RouterModule],
16
+ })
17
+ export class CreateRequesterPageRoutingModule {}
@@ -0,0 +1,28 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule ,ReactiveFormsModule} from '@angular/forms';
4
+ import { IonicModule } from '@ionic/angular';
5
+ import { CreateRequesterPageRoutingModule } from './create-requester-routing.module';
6
+ import { CreateRequesterPage } from './create-requester.page';
7
+ import { TranslateLoader, TranslateModule} from '@ngx-translate/core';
8
+ import { createTranslateLoader } from '../../../chat21-core/utils/utils';
9
+ import { HttpClient } from '@angular/common/http';
10
+
11
+ @NgModule({
12
+ imports: [
13
+ CommonModule,
14
+ FormsModule,
15
+ ReactiveFormsModule,
16
+ IonicModule,
17
+ CreateRequesterPageRoutingModule,
18
+ TranslateModule.forChild({
19
+ loader: {
20
+ provide: TranslateLoader,
21
+ useFactory: (createTranslateLoader),
22
+ deps: [HttpClient]
23
+ }
24
+ })
25
+ ],
26
+ declarations: [CreateRequesterPage]
27
+ })
28
+ export class CreateRequesterPageModule {}