@chat21/chat21-ionic 3.0.97 → 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.
- package/CHANGELOG.md +8 -0
- package/README.md +3 -1
- package/package.json +2 -1
- package/src/app/app-routing.module.ts +4 -7
- package/src/app/app.module.ts +7 -3
- package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +2 -4
- package/src/app/chatlib/conversation-detail/message/text/text.component.scss +12 -0
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +6 -6
- package/src/app/components/authentication/login/login.component.scss +1 -0
- package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +6 -6
- package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +1 -0
- package/src/app/modals/maps/maps-routing.module.ts +17 -0
- package/src/app/modals/maps/maps.module.ts +22 -0
- package/src/app/modals/maps/maps.page.html +83 -0
- package/src/app/modals/maps/maps.page.scss +181 -0
- package/src/app/modals/maps/maps.page.spec.ts +24 -0
- package/src/app/modals/maps/maps.page.ts +189 -0
- package/src/app/modals/send-whatsapp-template/send-whatsapp-template.module.ts +6 -1
- package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.html +195 -13
- package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.scss +341 -70
- package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.spec.ts +5 -5
- package/src/app/modals/send-whatsapp-template/send-whatsapp-template.page.ts +216 -23
- package/src/app/pages/conversation-detail/conversation-detail.page.ts +14 -10
- package/src/assets/i18n/ar.json +1 -1
- package/src/assets/i18n/az.json +1 -1
- package/src/assets/i18n/de.json +1 -1
- package/src/assets/i18n/en.json +1 -1
- package/src/assets/i18n/es.json +1 -1
- package/src/assets/i18n/fr.json +1 -1
- package/src/assets/i18n/it.json +1 -1
- package/src/assets/i18n/kk.json +1 -1
- package/src/assets/i18n/pt.json +1 -1
- package/src/assets/i18n/ru.json +1 -1
- package/src/assets/i18n/sr.json +1 -1
- package/src/assets/i18n/sv.json +1 -1
- package/src/assets/i18n/tr.json +1 -1
- package/src/assets/i18n/uk.json +1 -1
- package/src/assets/i18n/uz.json +1 -1
- package/src/chat-config-template.json +2 -1
- package/src/chat-config.json +2 -1
- package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +1 -0
- package/src/chat21-core/utils/utils.ts +3 -3
- package/src/index.html +2 -1
- package/tsconfig.json +1 -0
|
@@ -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]="
|
|
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
|
-
|
|
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="
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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>
|