blob: 0770d10204683e8b40539b8214da65b89e9d2ac8 [file] [log] [blame]
Pranav Nachanekarafe52e82019-10-03 16:35:08 +05301frappe.ready(async () => {
Ankush Menatec74a5e2024-03-10 19:45:40 +05302 initialise_select_date();
3});
Pranav Nachanekarafe52e82019-10-03 16:35:08 +05304
Pranav Nachanekar10711dd2019-09-09 15:41:20 +05305async function initialise_select_date() {
Ankush Menatec74a5e2024-03-10 19:45:40 +05306 navigate_to_page(1);
7 await get_global_variables();
8 setup_date_picker();
9 setup_timezone_selector();
10 hide_next_button();
pranav nachnekar27910542019-09-03 12:04:52 +053011}
12
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053013async function get_global_variables() {
Ankush Menatec74a5e2024-03-10 19:45:40 +053014 // Using await through this file instead of then.
15 window.appointment_settings = (
16 await frappe.call({
17 method: "erpnext.www.book_appointment.index.get_appointment_settings",
18 })
19 ).message;
20 window.timezones = (
21 await frappe.call({
22 method: "erpnext.www.book_appointment.index.get_timezones",
23 })
24 ).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053025}
26
27function setup_timezone_selector() {
Ankush Menatec74a5e2024-03-10 19:45:40 +053028 let timezones_element = document.getElementById("appointment-timezone");
29 let local_timezone = moment.tz.guess();
30 window.timezones.forEach((timezone) => {
31 let opt = document.createElement("option");
32 opt.value = timezone;
33 if (timezone == local_timezone) {
34 opt.selected = true;
35 }
36 opt.innerHTML = timezone;
37 timezones_element.appendChild(opt);
38 });
pranav nachnekar27910542019-09-03 12:04:52 +053039}
40
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053041function setup_date_picker() {
Ankush Menatec74a5e2024-03-10 19:45:40 +053042 let date_picker = document.getElementById("appointment-date");
43 let today = new Date();
44 date_picker.min = today.toISOString().substr(0, 10);
45 today.setDate(today.getDate() + window.appointment_settings.advance_booking_days);
46 date_picker.max = today.toISOString().substr(0, 10);
pranav nachnekar27910542019-09-03 12:04:52 +053047}
48
Pranav Nachanekar91a56492019-09-17 16:58:41 +053049function hide_next_button() {
Ankush Menatec74a5e2024-03-10 19:45:40 +053050 let next_button = document.getElementById("next-button");
51 next_button.disabled = true;
52 next_button.onclick = () => frappe.msgprint(__("Please select a date and time"));
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053053}
54
Pranav Nachanekar91a56492019-09-17 16:58:41 +053055function show_next_button() {
Ankush Menatec74a5e2024-03-10 19:45:40 +053056 let next_button = document.getElementById("next-button");
57 next_button.disabled = false;
58 next_button.onclick = setup_details_page;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053059}
60
61function on_date_or_timezone_select() {
Ankush Menatec74a5e2024-03-10 19:45:40 +053062 let date_picker = document.getElementById("appointment-date");
63 let timezone = document.getElementById("appointment-timezone");
64 if (date_picker.value === "") {
65 clear_time_slots();
66 hide_next_button();
67 frappe.throw(__("Please select a date"));
68 }
69 window.selected_date = date_picker.value;
70 window.selected_timezone = timezone.value;
71 update_time_slots(date_picker.value, timezone.value);
72 let lead_text = document.getElementById("lead-text");
73 lead_text.innerHTML = __("Select Time");
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053074}
75
76async function get_time_slots(date, timezone) {
Ankush Menatec74a5e2024-03-10 19:45:40 +053077 let slots = (
78 await frappe.call({
79 method: "erpnext.www.book_appointment.index.get_appointment_slots",
80 args: {
81 date: date,
82 timezone: timezone,
83 },
84 })
85 ).message;
86 return slots;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053087}
pranav nachnekarc5b2a582019-09-03 14:16:47 +053088
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053089async function update_time_slots(selected_date, selected_timezone) {
Ankush Menatec74a5e2024-03-10 19:45:40 +053090 let timeslot_container = document.getElementById("timeslot-container");
91 window.slots = await get_time_slots(selected_date, selected_timezone);
92 clear_time_slots();
93 if (window.slots.length <= 0) {
94 let message_div = document.createElement("p");
95 message_div.innerHTML = __("There are no slots available on this date");
96 timeslot_container.appendChild(message_div);
97 return;
98 }
99 window.slots.forEach((slot, index) => {
100 // Get and append timeslot div
101 let timeslot_div = get_timeslot_div_layout(slot);
102 timeslot_container.appendChild(timeslot_div);
103 });
104 set_default_timeslot();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530105}
106
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530107function get_timeslot_div_layout(timeslot) {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530108 let start_time = new Date(timeslot.time);
109 let timeslot_div = document.createElement("div");
110 timeslot_div.classList.add("time-slot");
111 if (!timeslot.availability) {
112 timeslot_div.classList.add("unavailable");
113 }
114 timeslot_div.innerHTML = get_slot_layout(start_time);
115 timeslot_div.id = timeslot.time.substring(11, 19);
116 timeslot_div.addEventListener("click", select_time);
117 return timeslot_div;
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530118}
119
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530120function clear_time_slots() {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530121 // Clear any existing divs in timeslot container
122 let timeslot_container = document.getElementById("timeslot-container");
123 while (timeslot_container.firstChild) {
124 timeslot_container.removeChild(timeslot_container.firstChild);
125 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530126}
127
128function get_slot_layout(time) {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530129 let timezone = document.getElementById("appointment-timezone").value;
130 time = new Date(time);
131 let start_time_string = moment(time).tz(timezone).format("LT");
132 let end_time = moment(time).tz(timezone).add(window.appointment_settings.appointment_duration, "minutes");
133 let end_time_string = end_time.format("LT");
134 return `<span style="font-size: 1.2em;">${start_time_string}</span><br><span class="text-muted small">${__(
135 "to"
136 )} ${end_time_string}</span>`;
pranav nachnekar27910542019-09-03 12:04:52 +0530137}
138
139function select_time() {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530140 if (this.classList.contains("unavailable")) {
141 return;
142 }
143 let selected_element = document.getElementsByClassName("selected");
144 if (!(selected_element.length > 0)) {
145 this.classList.add("selected");
146 show_next_button();
147 return;
148 }
149 selected_element = selected_element[0];
150 window.selected_time = this.id;
151 selected_element.classList.remove("selected");
152 this.classList.add("selected");
153 show_next_button();
pranav nachnekar27910542019-09-03 12:04:52 +0530154}
155
156function set_default_timeslot() {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530157 let timeslots = document.getElementsByClassName("time-slot");
158 // Can't use a forEach here since, we need to break the loop after a timeslot is selected
159 for (let i = 0; i < timeslots.length; i++) {
160 const timeslot = timeslots[i];
161 if (!timeslot.classList.contains("unavailable")) {
162 timeslot.classList.add("selected");
163 break;
164 }
165 }
pranav nachnekar27910542019-09-03 12:04:52 +0530166}
167
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530168function navigate_to_page(page_number) {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530169 let page1 = document.getElementById("select-date-time");
170 let page2 = document.getElementById("enter-details");
171 switch (page_number) {
172 case 1:
173 page1.style.display = "block";
174 page2.style.display = "none";
175 break;
176 case 2:
177 page1.style.display = "none";
178 page2.style.display = "block";
179 break;
180 default:
181 break;
182 }
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530183}
184
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530185function setup_details_page() {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530186 navigate_to_page(2);
187 let date_container = document.getElementsByClassName("date-span")[0];
188 let time_container = document.getElementsByClassName("time-span")[0];
189 setup_search_params();
190 date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
191 time_container.innerHTML = moment(window.selected_time, "HH:mm:ss").format("LT");
pranav nachnekar27910542019-09-03 12:04:52 +0530192}
193
Pranav Nachnekarc1312702020-01-28 12:20:47 +0000194function setup_search_params() {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530195 let search_params = new URLSearchParams(window.location.search);
196 let customer_name = search_params.get("name");
197 let customer_email = search_params.get("email");
198 let detail = search_params.get("details");
199 if (customer_name) {
200 let name_input = document.getElementById("customer_name");
201 name_input.value = customer_name;
202 name_input.disabled = true;
203 }
204 if (customer_email) {
205 let email_input = document.getElementById("customer_email");
206 email_input.value = customer_email;
207 email_input.disabled = true;
208 }
209 if (detail) {
210 let detail_input = document.getElementById("customer_notes");
211 detail_input.value = detail;
212 detail_input.disabled = true;
213 }
Pranav Nachnekarc1312702020-01-28 12:20:47 +0000214}
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530215async function submit() {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530216 let button = document.getElementById("submit-button");
217 button.disabled = true;
218 let form = document.querySelector("#customer-form");
219 if (!form.checkValidity()) {
220 form.reportValidity();
221 button.disabled = false;
222 return;
223 }
224 let contact = get_form_data();
225 let appointment = frappe.call({
226 method: "erpnext.www.book_appointment.index.create_appointment",
227 args: {
228 date: window.selected_date,
229 time: window.selected_time,
230 contact: contact,
231 tz: window.selected_timezone,
232 },
233 callback: (response) => {
234 if (response.message.status == "Unverified") {
235 frappe.show_alert(__("Please check your email to confirm the appointment"));
236 } else {
237 frappe.show_alert(__("Appointment Created Successfully"));
238 }
239 setTimeout(() => {
240 let redirect_url = "/";
241 if (window.appointment_settings.success_redirect_url) {
242 redirect_url += window.appointment_settings.success_redirect_url;
243 }
244 window.location.href = redirect_url;
245 }, 5000);
246 },
247 error: (err) => {
248 frappe.show_alert(__("Something went wrong please try again"));
249 button.disabled = false;
250 },
251 });
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530252}
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530253
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530254function get_form_data() {
Ankush Menatec74a5e2024-03-10 19:45:40 +0530255 let contact = {};
256 let inputs = ["name", "skype", "number", "notes", "email"];
257 inputs.forEach((id) => (contact[id] = document.getElementById(`customer_${id}`).value));
258 return contact;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530259}