@chat21/chat21-ionic 3.0.98-rc.1 → 3.0.98-rc.2

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 (43) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +3 -1
  3. package/package.json +2 -1
  4. package/src/app/app-routing.module.ts +4 -7
  5. package/src/app/app.module.ts +7 -3
  6. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +2 -4
  7. package/src/app/chatlib/conversation-detail/message/text/text.component.scss +12 -0
  8. package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +1 -1
  9. package/src/app/components/authentication/login/login.component.scss +1 -0
  10. package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +6 -6
  11. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +1 -0
  12. package/src/app/modals/maps/maps-routing.module.ts +17 -0
  13. package/src/app/modals/maps/maps.module.ts +22 -0
  14. package/src/app/modals/maps/maps.page.html +83 -0
  15. package/src/app/modals/maps/maps.page.scss +181 -0
  16. package/src/app/modals/maps/maps.page.spec.ts +24 -0
  17. package/src/app/modals/maps/maps.page.ts +189 -0
  18. package/src/app/modals/send-whatsapp-template/send-whatsapp-template.module.ts +6 -1
  19. package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.html +195 -13
  20. package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.scss +341 -70
  21. package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.spec.ts +5 -5
  22. package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.ts +216 -23
  23. package/src/app/pages/conversation-detail/conversation-detail.page.ts +7 -7
  24. package/src/assets/i18n/ar.json +1 -1
  25. package/src/assets/i18n/az.json +1 -1
  26. package/src/assets/i18n/de.json +1 -1
  27. package/src/assets/i18n/en.json +1 -1
  28. package/src/assets/i18n/es.json +1 -1
  29. package/src/assets/i18n/fr.json +1 -1
  30. package/src/assets/i18n/it.json +1 -1
  31. package/src/assets/i18n/kk.json +1 -1
  32. package/src/assets/i18n/pt.json +1 -1
  33. package/src/assets/i18n/ru.json +1 -1
  34. package/src/assets/i18n/sr.json +1 -1
  35. package/src/assets/i18n/sv.json +1 -1
  36. package/src/assets/i18n/tr.json +1 -1
  37. package/src/assets/i18n/uk.json +1 -1
  38. package/src/assets/i18n/uz.json +1 -1
  39. package/src/chat-config-template.json +2 -1
  40. package/src/chat-config.json +2 -1
  41. package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +1 -0
  42. package/src/chat21-core/utils/utils.ts +3 -3
  43. package/src/index.html +2 -1
@@ -0,0 +1,189 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+ import { ModalController } from '@ionic/angular';
3
+ import { AppConfigProvider } from 'src/app/services/app-config';
4
+
5
+ @Component({
6
+ selector: 'app-maps',
7
+ templateUrl: './maps.page.html',
8
+ styleUrls: ['./maps.page.scss'],
9
+ })
10
+ export class MapsPage implements OnInit {
11
+
12
+ selected_place: any;
13
+
14
+ constructor(
15
+ public viewCtrl: ModalController,
16
+ private appConfigProvider: AppConfigProvider
17
+ ) { }
18
+
19
+ ngOnInit() {
20
+
21
+ }
22
+
23
+ loadScript(){
24
+ const that = this;
25
+ const apiKey = this.appConfigProvider.getConfig().googleMapsApiKey
26
+ const url = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places&v=weekly'`
27
+ let node = document.createElement('script');
28
+ node.src = url;
29
+ node.type = 'text/javascript';
30
+ node.defer = true
31
+ document.getElementsByTagName('head')[0].appendChild(node);
32
+
33
+ node.onload= function(){
34
+ that.initMap();
35
+ }
36
+ }
37
+
38
+ ionViewWillEnter() {
39
+ this.loadScript();
40
+ }
41
+
42
+
43
+ initMap(): void {
44
+ const map = new google.maps.Map(
45
+ document.getElementById("map") as HTMLElement,
46
+ {
47
+ center: { lat: 40.1740762, lng: 18.164999 },
48
+ zoom: 18,
49
+ mapTypeControl: false,
50
+ fullscreenControl: false,
51
+ streetViewControl: false
52
+ }
53
+ );
54
+ console.log("*** MAPS *** ", map);
55
+ const card = document.getElementById("pac-card") as HTMLElement;
56
+ const input = document.getElementById("pac-input") as HTMLInputElement;
57
+
58
+ // const biasInputElement = document.getElementById(
59
+ // "use-location-bias"
60
+ // ) as HTMLInputElement;
61
+ // const strictBoundsInputElement = document.getElementById(
62
+ // "use-strict-bounds"
63
+ // ) as HTMLInputElement;
64
+
65
+ const options = {
66
+ fields: ["formatted_address", "geometry", "name"],
67
+ strictBounds: false,
68
+ types: ["establishment"],
69
+ cache: true
70
+ };
71
+
72
+ //map.controls[google.maps.ControlPosition.TOP_LEFT].push(card);
73
+
74
+ const autocomplete = new google.maps.places.Autocomplete(input, options);
75
+
76
+ // Bind the map's bounds (viewport) property to the autocomplete object,
77
+ // so that the autocomplete requests use the current map bounds for the
78
+ // bounds option in the request.
79
+ autocomplete.bindTo("bounds", map);
80
+
81
+ const infowindow = new google.maps.InfoWindow();
82
+ const infowindowContent = document.getElementById(
83
+ "infowindow-content"
84
+ ) as HTMLElement;
85
+
86
+ infowindow.setContent(infowindowContent);
87
+
88
+ const marker = new google.maps.Marker({
89
+ map,
90
+ anchorPoint: new google.maps.Point(0, -29),
91
+ });
92
+
93
+
94
+ autocomplete.addListener("place_changed", () => {
95
+ infowindow.close();
96
+ marker.setVisible(false);
97
+
98
+ const place = autocomplete.getPlace();
99
+
100
+ console.log("*** MAP *** place: ", place)
101
+
102
+ this.selected_place = {
103
+ name: place.name,
104
+ address: place.formatted_address,
105
+ latitude: place.geometry.location.lat(),
106
+ longitude: place.geometry.location.lng()
107
+ }
108
+
109
+ if (!place.geometry || !place.geometry.location) {
110
+ // User entered the name of a Place that was not suggested and
111
+ // pressed the Enter key, or the Place Details request failed.
112
+ window.alert("No details available for input: '" + place.name + "'");
113
+ return;
114
+ }
115
+
116
+ // If the place has a geometry, then present it on a map.
117
+ if (place.geometry.viewport) {
118
+ map.fitBounds(place.geometry.viewport);
119
+ } else {
120
+ map.setCenter(place.geometry.location);
121
+ map.setZoom(17);
122
+ }
123
+
124
+ marker.setPosition(place.geometry.location);
125
+ marker.setVisible(true);
126
+
127
+ // infowindowContent.children["place-name"].textContent = place.name;
128
+ // infowindowContent.children["place-address"].textContent = place.formatted_address;
129
+ // infowindow.open(map, marker);
130
+ });
131
+
132
+ // Sets a listener on a radio button to change the filter type on Places
133
+ // Autocomplete.
134
+ function setupClickListener(id, types) {
135
+ const radioButton = document.getElementById(id) as HTMLInputElement;
136
+
137
+ radioButton.addEventListener("click", () => {
138
+ autocomplete.setTypes(types);
139
+ input.value = "";
140
+ });
141
+ }
142
+
143
+ setupClickListener("changetype-all", []);
144
+ setupClickListener("changetype-address", ["address"]);
145
+ setupClickListener("changetype-establishment", ["establishment"]);
146
+ setupClickListener("changetype-geocode", ["geocode"]);
147
+ setupClickListener("changetype-cities", ["(cities)"]);
148
+ setupClickListener("changetype-regions", ["(regions)"]);
149
+
150
+ // biasInputElement.addEventListener("change", () => {
151
+ // if (biasInputElement.checked) {
152
+ // autocomplete.bindTo("bounds", map);
153
+ // } else {
154
+ // // User wants to turn off location bias, so three things need to happen:
155
+ // // 1. Unbind from map
156
+ // // 2. Reset the bounds to whole world
157
+ // // 3. Uncheck the strict bounds checkbox UI (which also disables strict bounds)
158
+ // autocomplete.unbind("bounds");
159
+ // autocomplete.setBounds({ east: 180, west: -180, north: 90, south: -90 });
160
+ // strictBoundsInputElement.checked = biasInputElement.checked;
161
+ // }
162
+
163
+ // input.value = "";
164
+ // });
165
+
166
+ // strictBoundsInputElement.addEventListener("change", () => {
167
+ // autocomplete.setOptions({
168
+ // strictBounds: strictBoundsInputElement.checked,
169
+ // });
170
+
171
+ // if (strictBoundsInputElement.checked) {
172
+ // biasInputElement.checked = strictBoundsInputElement.checked;
173
+ // autocomplete.bindTo("bounds", map);
174
+ // }
175
+
176
+ // input.value = "";
177
+ // });
178
+ }
179
+
180
+ shareLocation() {
181
+ console.log("share location called")
182
+ this.viewCtrl.dismiss(this.selected_place);
183
+ }
184
+
185
+ async onClose() {
186
+ this.viewCtrl.dismiss()
187
+ }
188
+
189
+ }
@@ -1,3 +1,4 @@
1
+
1
2
  import { NgModule } from '@angular/core';
2
3
  import { CommonModule } from '@angular/common';
3
4
  import { FormsModule } from '@angular/forms';
@@ -8,12 +9,15 @@ import { SendWhatsappTemplateModal } from './send-whatsapp-template.page';
8
9
  import { TranslateModule } from '@ngx-translate/core';
9
10
  import { createTranslateLoader } from 'src/chat21-core/utils/utils';
10
11
  import { HttpClient } from '@angular/common/http';
12
+ import { MarkedPipe } from 'src/app/directives/marked.pipe';
13
+ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
11
14
 
12
15
  @NgModule({
13
16
  imports: [
14
17
  CommonModule,
15
18
  FormsModule,
16
19
  IonicModule,
20
+ //MarkedPipe,
17
21
  SendWhatsappTemplatePageRoutingModule,
18
22
  TranslateModule.forChild({
19
23
  loader: {
@@ -23,6 +27,7 @@ import { HttpClient } from '@angular/common/http';
23
27
  }
24
28
  })
25
29
  ],
26
- declarations: [SendWhatsappTemplateModal]
30
+ declarations: [SendWhatsappTemplateModal],
31
+ schemas: [CUSTOM_ELEMENTS_SCHEMA]
27
32
  })
28
33
  export class SendWhatsappTemplateModalModule {}
@@ -10,7 +10,8 @@
10
10
  </ion-toolbar>
11
11
  </ion-header>
12
12
 
13
- <ion-content *ngIf="selectionView" class="content-container">
13
+ <ion-content *ngIf="selectionView && !displayError" class="content-container">
14
+
14
15
 
15
16
  <ion-list lines="full">
16
17
  <ion-item *ngFor="let template of templates" button detail="true" (click)="selectTemplate(template.id)">
@@ -45,60 +46,197 @@
45
46
  </ion-content>
46
47
 
47
48
  <ion-content *ngIf="editTemplateView" class="content-container">
49
+
50
+
48
51
  <div class="preview-container">
52
+
49
53
  <div class="title-back">
50
54
  <ion-button ion-button fill="clear" (click)="backToSelection()">
51
55
  <ion-icon slot="icon-only" name="return-up-back"></ion-icon>
52
56
  </ion-button>
53
57
  <p class="template-name">{{ selected_template.name }}</p>
54
58
  </div>
59
+
60
+ <!-- // Message preview - START -->
55
61
  <div class="message-preview">
56
62
 
57
63
  <div class="message-cloud">
58
64
 
65
+ <!-- // Header -->
59
66
  <div class="header-preview">
60
67
  <span *ngIf="header_component?.format === 'TEXT'">{{ header_component?.text }}</span>
61
68
  <span *ngIf="header_component?.format === 'IMAGE'">
62
- <img [src]="header_component.example.header_handle[0]" />
69
+ <img [src]="header_params[0].image.link" (error)="onHeaderImageError($event)" />
70
+ </span>
71
+ <span *ngIf="header_component?.format === 'DOCUMENT'">
72
+ <div class="pdf-preview">
73
+ <p>PDF</p>
74
+ </div>
75
+ <!-- // doesn't works properly -> check ASAP -->
76
+ <!-- <iframe [src]="sanitizedUrl" frameBorder="0" scrolling="no" height="100%" width="100%" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe> -->
77
+ </span>
78
+ <span *ngIf="header_component?.format === 'LOCATION'">
79
+ <div class="location-preview">
80
+ <p>Location</p>
81
+ </div>
82
+ <!-- <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3047.4846825263085!2d18.16983501538924!3d40.198280279391!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x134423b7392e6d13%3A0x60b481aa8d84673!2sEurofood%20SRL!5e0!3m2!1sit!2sit!4v1685097718757!5m2!1sit!2sit" width="100%" height="100%" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe> -->
83
+
63
84
  </span>
64
85
 
65
86
  </div>
66
87
 
88
+ <!-- // Body -->
67
89
  <div class="body-preview">
90
+ <!-- // doesn't work -->
91
+ <!-- <span [innerHtml]="body_component?.text | marked"></span> -->
68
92
  <span>{{ body_component?.text }}</span>
69
93
  </div>
70
94
 
95
+ <!-- // Footer -->
71
96
  <div class="footer-preview">
72
97
  <span>{{ footer_component?.text }}</span>
73
98
  </div>
74
99
 
100
+ <!-- // Call to action buttons -->
101
+ <div
102
+ *ngIf="buttons_component && (buttons_component.buttons[0].type === 'URL' || buttons_component.buttons[0].type === 'PHONE_NUMBER')"
103
+ class="call-to-action-preview">
104
+
105
+ <hr style="background-color: #eeeeee; margin-bottom: 0px;">
106
+ <ion-button *ngFor="let btn of buttons_component.buttons" ion-button fill="clear"
107
+ class="whatsapp-call-to-action">
108
+ <span *ngIf="btn.type === 'URL'" class="material-icons-outlined call-to-action-icon">open_in_new</span>
109
+ <span *ngIf="btn.type === 'PHONE_NUMBER'" class="material-icons-round call-to-action-icon">phone</span>
110
+ {{ btn.text }}
111
+ </ion-button>
112
+ </div>
113
+
75
114
  </div>
76
115
 
77
- <div *ngIf="buttons_component" class="message-cloud-buttons">
116
+ <!-- // Quick reply -->
117
+ <!-- <div *ngIf="buttons_component && buttons_component.buttons[0].type === 'QUICK_REPLY'"
118
+ class="message-cloud-buttons">
78
119
  <ion-button *ngFor="let btn of buttons_component.buttons" ion-button fill="clear" class="whatsapp-button">{{
79
120
  btn.text }}</ion-button>
121
+ </div> -->
122
+
123
+
124
+ <div class="message-cloud-buttons-container"
125
+ *ngIf="buttons_component && buttons_component.buttons[0].type === 'QUICK_REPLY'">
126
+ <div class="message-cloud-buttons">
127
+ <button *ngFor="let btn of buttons_component.buttons" fill="clear" class="message-cloud-button"><span
128
+ class="_2VWlB">{{btn.text}}</span></button>
129
+ <!-- <button class="vGQwA"><span class="_2VWlB">no sad. asdj asdjh asd asdgahsgda </span></button>
130
+ <button class="vGQwA"><span class="_2VWlB">Non voglio ricevere più messaggi</span></button> -->
131
+ </div>
80
132
  </div>
81
133
 
134
+ <!-- // Quick reply -->
135
+ <!-- <div *ngIf="buttons_component && buttons_component.buttons[0].type === 'QUICK_REPLY'" style="width: 260px; margin-top: 2px;">
136
+
137
+ <ion-grid style="margin: 0px; padding: 0px;">
138
+ <ion-row style="margin: 0px; padding: 0px;">
139
+ <ion-col id="first-button" *ngIf="buttons_component.buttons[0]" class="first-button">
140
+ <ion-button ion-button fill="clear" class="whatsapp-button">{{buttons_component.buttons[0].text}}</ion-button>
141
+ </ion-col>
142
+ <ion-col id="second-button" *ngIf="buttons_component.buttons[1]" class="second-button">
143
+ <ion-button ion-button fill="clear" class="whatsapp-button">Vai ai preferiti lungo</ion-button>
144
+ </ion-col>
145
+ </ion-row>
146
+ <ion-row style="margin: 0px; padding: 0px; margin-top: 1px;" size="12">
147
+ <ion-col *ngIf="buttons_component.buttons[2]" style="margin: 0px; padding: 0px;">
148
+ <ion-button ion-button fill="clear" class="whatsapp-button">{{buttons_component.buttons[2].text}}</ion-button>
149
+ </ion-col>
150
+ </ion-row>
151
+ </ion-grid>
152
+ </div> -->
153
+
82
154
  </div>
155
+ <!-- // Message preview - END -->
83
156
  </div>
84
157
 
85
158
  <div class="parameters-container">
86
159
 
87
-
160
+ <!-- // Header parameters - START -->
88
161
  <div *ngIf="header_component && header_component.example">
89
162
  <p class="parameters-title">Header parameters</p>
163
+ <p *ngIf="header_component.example.header_handle" class="parameters-subtitle">The header contains a Media to
164
+ customize</p>
165
+
166
+ <!-- // header text -->
90
167
  <div *ngFor="let hp of header_component.example.header_text; index as i" class="parameter">
91
168
  <div class="param-number">
92
169
  <span>{{</span> {{ i + 1 }} <span>}}</span>
93
170
  </div>
94
171
  <div class="field-wrapper">
95
- <input type="text" placeholder="{{hp}}"
172
+ <input type="text" placeholder="{{hp}}" (input)="onParamHeaderChange($event.target.value, i+1)">
173
+ </div>
174
+ </div>
175
+
176
+ <!-- // header handle - media -->
177
+ <div *ngFor="let hp of header_component.example.header_handle; index as i" class="parameter">
178
+ <div class="param-number">
179
+ <span>{{</span> {{ i + 1 }} <span>}}</span>
180
+ </div>
181
+ <div class="field-wrapper large">
182
+ <!-- <input type="text" placeholder="{{hp}}" (input)="onParamHeaderChange($event.target.value, i+1)"> -->
183
+ <input *ngIf="!displayFileUploaded" type="text" placeholder="Insert a valid URL or update a file"
96
184
  (input)="onParamHeaderChange($event.target.value, i+1)">
185
+ <input *ngIf="displayFileUploaded" type="text" placeholder="{{ fileUploadedName }}"
186
+ value="{{fileUploadedName}}" disabled>
187
+
97
188
  </div>
98
189
 
190
+ <ion-button *ngIf="!displayFileUploaded" ion-button fill="clear" type="submit" class="icon-only"
191
+ (click)="fileInput.click()">
192
+ <ion-icon name="cloud-upload-outline"></ion-icon>
193
+ <!-- <input #fileInput type="file" accept="image/*" (change)="onFileSelected($event)" capture="camera"
194
+ id="file-input" style="display: none;"> -->
195
+ <input #fileInput type="file" [accept]="fileUploadAccept" (change)="onFileSelected($event)" capture="camera"
196
+ id="file-input" style="display: none;">
197
+
198
+ </ion-button>
199
+
200
+ <ion-button *ngIf="displayFileUploaded" ion-button fill="clear" type="submit" class="icon-only"
201
+ (click)="removeHeaderFile()">
202
+ <ion-icon name="trash-outline" style="color: #e22828;"></ion-icon>
203
+ </ion-button>
204
+
205
+ </div>
206
+
207
+ </div>
208
+
209
+ <div *ngIf="header_component?.format == 'LOCATION'">
210
+ <p class="parameters-title">Header parameters</p>
211
+ <div class="selected-place">
212
+ <!-- <ion-button *ngIf="!header_params[0]?.location?.name" ion-button fill="clear" (click)="displayMap()">
213
+ <ion-icon name="add-circle-outline"></ion-icon>Add location
214
+ </ion-button> -->
215
+
216
+ <!-- <div *ngIf="header_params[0]?.location && header_params[0]?.location?.name"> -->
217
+ <div>
218
+ <div class="share-location-header">
219
+ <div class="share-location-title">
220
+ <ion-icon name="locate"></ion-icon>
221
+ <p>Location</p>
222
+ </div>
223
+ <div>
224
+ <ion-button *ngIf="!header_params[0]?.location?.name" fill="clear" class="small" (click)="displayMap()"><ion-icon name="add-outline"></ion-icon>Add</ion-button>
225
+ <ion-button *ngIf="header_params[0]?.location?.name" fill="clear" class="small" (click)="displayMap()"><ion-icon name="add-outline"></ion-icon>Change</ion-button>
226
+ </div>
227
+ </div>
228
+ <div class="place-info">
229
+ <p class="place-name">{{ header_params[0].location.name }}</p>
230
+ <p class="place-address">{{ header_params[0].location.address }}</p>
231
+ <p class="place-coords">{{ header_params[0].location.latitude }} - {{ header_params[0].location.longitude }}
232
+ </p>
233
+ </div>
234
+ </div>
99
235
  </div>
100
236
  </div>
237
+ <!-- // Header parameters - END -->
101
238
 
239
+ <!-- // Body parameters - START -->
102
240
  <div *ngIf="body_component.example">
103
241
  <p class="parameters-title">Body parameters</p>
104
242
  <div *ngFor="let bp of body_component.example.body_text[0]; index as i" class="parameter">
@@ -106,18 +244,60 @@
106
244
  <span>{{</span> {{ i + 1 }} <span>}}</span>
107
245
  </div>
108
246
  <div class="field-wrapper">
109
- <input type="text" placeholder="{{bp}}"
110
- (input)="onParamBodyChange($event.target.value, i+1)">
247
+ <input type="text" placeholder="{{bp}}" (input)="onParamBodyChange($event.target.value, i+1)">
111
248
  </div>
112
249
  </div>
113
250
  </div>
251
+ <!-- // Body parameters - END -->
114
252
 
115
253
 
116
- <div *ngIf="!body_component.example">
254
+ <div *ngIf="body_params.length == 0 && header_params.length == 0 && url_button_params.length == 0">
117
255
  <p style="font-style: italic; color: #a3a3a3;">No parameters</p>
118
256
  </div>
119
257
 
258
+ <!-- // Buttons parameters - START -->
259
+ <div *ngIf="url_button_component && url_button_component.example">
260
+ <p class="parameters-title">Buttons parameters</p>
261
+ <div *ngFor="let param of url_button_component.example; index as i" class="parameter">
262
+ <div class="param-number">
263
+ <span>{{</span> {{ i + 1 }} <span>}}</span>
264
+ </div>
265
+ <div class="field-wrapper large">
266
+ <input type="text" placeholder="Insert a valid URL" (input)="onParamButtonChange($event.target.value, i+1)">
267
+ </div>
120
268
 
269
+ </div>
270
+ <div class="url-button-previsioning">
271
+ <div *ngIf="url_button_component && url_button_component.type === 'URL'" class="call-to-action-preview">
272
+
273
+ <ion-button ion-button fill="clear" class="whatsapp-call-to-action">
274
+ <span class="material-icons-outlined call-to-action-icon">open_in_new</span>
275
+ {{ url_button_component.text }}
276
+ </ion-button>
277
+ </div>
278
+ <p class="previsioning-url">{{ previsioning_url }}</p>
279
+ </div>
280
+ </div>
281
+ <!-- // Buttons parameters - END -->
282
+
283
+
284
+
285
+ <!-- <div *ngIf="buttons_component">
286
+ <div *ngFor="let btn of buttons_component.buttons; index as i">
287
+ <div *ngIf="btn.type === 'URL'">
288
+ <p class="parameters-title">Buttons parameters</p>
289
+ <div class="parameter">
290
+ <div class="param-number">
291
+ <span>{{</span> {{ i + 1 }} <span>}}</span>
292
+ </div>
293
+ <div class="field-wrapper">
294
+ <input type="text" placeholder="{{bp}}" (input)="onParamButtonChange($event.target.value, i+1)">
295
+ </div>
296
+ </div>
297
+ {{ btn.url }}
298
+ </div>
299
+ </div>
300
+ </div> -->
121
301
 
122
302
 
123
303
 
@@ -125,15 +305,17 @@
125
305
  </ion-content>
126
306
 
127
307
  <ion-content *ngIf="displayError" class="content-container">
128
- <div class="error-container">
129
- <p class="error-message">{{labelError}}</p>
130
- </div>
308
+ <div class="error-container">
309
+ <p class="error-message">{{labelError}}</p>
310
+ </div>
131
311
  </ion-content>
132
312
 
133
313
 
134
314
 
135
315
  <ion-footer *ngIf="editTemplateView">
136
316
  <ion-button [disabled]="sendButtonDisabled" ion-button fill="clear" type="submit" (click)="sendTemplate()"><ion-icon
137
- name="send-sharp"></ion-icon>{{translationMap?.get('LABEL_SEND')}}
317
+ name="send-sharp"></ion-icon>{{translationMap?.get('LABEL_SEND')}}
138
318
  </ion-button>
139
- </ion-footer>
319
+ </ion-footer>
320
+
321
+ <app-maps *ngIf="displayMapModal"></app-maps>