blob: 345e61415424fd543cccfa6e10133549fba240b3 [file] [log] [blame]
pranav nachnekar27910542019-09-03 12:04:52 +05301
2frappe.ready(() => {
3 initialise_select_date()
4})
Pranav Nachanekar10711dd2019-09-09 15:41:20 +05305window.holiday_list = [];
pranav nachnekar27910542019-09-03 12:04:52 +05306
Pranav Nachanekar10711dd2019-09-09 15:41:20 +05307async function initialise_select_date() {
Pranav Nachanekara2dbd392019-09-12 10:48:26 +05308 navigate_to_page(1);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +05309 await get_global_variables();
10 setup_date_picker();
11 setup_timezone_selector();
12 hide_next_button();
pranav nachnekar27910542019-09-03 12:04:52 +053013}
14
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053015async function get_global_variables() {
Pranav Nachanekar91a56492019-09-17 16:58:41 +053016 // Using await
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053017 window.appointment_settings = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053018 method: 'erpnext.www.book-appointment.index.get_appointment_settings'
19 })).message
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053020 window.timezones = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053021 method: 'erpnext.www.book-appointment.index.get_timezones'
22 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053023 window.holiday_list = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053024 method: 'erpnext.www.book-appointment.index.get_holiday_list',
25 args: {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053026 'holiday_list_name': window.appointment_settings.holiday_list
pranav nachnekar27910542019-09-03 12:04:52 +053027 }
28 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053029}
30
31function setup_timezone_selector() {
pranav nachnekar27910542019-09-03 12:04:52 +053032 let timezones_element = document.getElementById('appointment-timezone');
Pranav Nachanekar91a56492019-09-17 16:58:41 +053033 let offset = new Date().getTimezoneOffset();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053034 window.timezones.forEach(timezone => {
Pranav Nachanekar91a56492019-09-17 16:58:41 +053035 let opt = document.createElement('option');
pranav nachnekar27910542019-09-03 12:04:52 +053036 opt.value = timezone.offset;
37 opt.innerHTML = timezone.timezone_name;
38 opt.defaultSelected = (offset == timezone.offset)
39 timezones_element.appendChild(opt)
40 });
41}
42
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053043function setup_date_picker() {
pranav nachnekar27910542019-09-03 12:04:52 +053044 let date_picker = document.getElementById('appointment-date');
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053045 let today = new Date();
46 date_picker.min = today.toISOString().substr(0, 10);
Pranav Nachanekar469247b2019-09-12 11:15:42 +053047 today.setDate(today.getDate() + window.appointment_settings.advance_booking_days);
Pranav Nachanekar91a56492019-09-17 16:58:41 +053048 date_picker.max = today.toISOString().substr(0, 10);
pranav nachnekar27910542019-09-03 12:04:52 +053049}
50
Pranav Nachanekar91a56492019-09-17 16:58:41 +053051function hide_next_button() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053052 let next_button = document.getElementById('next-button');
53 next_button.disabled = true;
Pranav Nachanekar91a56492019-09-17 16:58:41 +053054 next_button.onclick = () => frappe.msgprint("Please select a date and time");
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053055}
56
Pranav Nachanekar91a56492019-09-17 16:58:41 +053057function show_next_button() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053058 let next_button = document.getElementById('next-button');
59 next_button.disabled = false;
60 next_button.onclick = setup_details_page;
61}
62
63function on_date_or_timezone_select() {
64 let date_picker = document.getElementById('appointment-date');
65 let timezone = document.getElementById('appointment-timezone');
66 if (date_picker.value === '') {
67 clear_time_slots();
68 hide_next_button();
69 frappe.throw('Please select a date');
70 }
71 window.selected_date = date_picker.value;
72 window.selected_timezone = timezone.value;
73 update_time_slots(date_picker.value, timezone.value);
Pranav Nachanekara322b152019-09-11 14:25:26 +053074 let lead_text = document.getElementById('lead-text');
75 lead_text.innerHTML = "Select Time"
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053076}
77
78async function get_time_slots(date, timezone) {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053079 let slots = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053080 method: 'erpnext.www.book-appointment.index.get_appointment_slots',
81 args: {
82 date: date,
83 timezone: timezone
84 }
85 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053086 return slots;
87}
pranav nachnekarc5b2a582019-09-03 14:16:47 +053088
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053089async function update_time_slots(selected_date, selected_timezone) {
90 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');
pranav nachnekar27910542019-09-03 12:04:52 +053095 message_div.innerHTML = "There are no slots available on this date";
96 timeslot_container.appendChild(message_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053097 return
pranav nachnekar27910542019-09-03 12:04:52 +053098 }
Pranav Nachanekar91a56492019-09-17 16:58:41 +053099 window.slots.forEach((slot, index) => {
100 // Add a break after each 8 elements
101 if (index % 8 == 0) {
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530102 let break_element = document.createElement('div');
103 break_element.classList.add('w-100');
104 timeslot_container.appendChild(break_element);
105 }
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530106 // Get and append timeslot div
107 let timeslot_div = get_timeslot_div_layout(slot)
pranav nachnekar27910542019-09-03 12:04:52 +0530108 timeslot_container.appendChild(timeslot_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530109 });
110 set_default_timeslot();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530111}
112
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530113function get_timeslot_div_layout(timeslot) {
114 let start_time = new Date(timeslot.time)
115 let timeslot_div = document.createElement('div');
116 timeslot_div.classList.add('time-slot');
117 timeslot_div.classList.add('col-md');
118 if (!timeslot.availability) {
119 timeslot_div.classList.add('unavailable')
120 }
121 timeslot_div.innerHTML = get_slot_layout(start_time);
122 timeslot_div.id = timeslot.time.substr(11, 20);
123 timeslot_div.addEventListener('click', select_time);
124 return timeslot_div
125}
126
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530127function clear_time_slots() {
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530128 // Clear any existing divs in timeslot container
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530129 let timeslot_container = document.getElementById('timeslot-container');
130 while (timeslot_container.firstChild) {
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530131 timeslot_container.removeChild(timeslot_container.firstChild);
pranav nachnekar27910542019-09-03 12:04:52 +0530132 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530133}
134
135function get_slot_layout(time) {
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530136 time = new Date(time);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530137 let start_time_string = moment(time).format("LT");
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530138 let end_time = moment(time).add(window.appointment_settings.appointment_duration, 'minutes');
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530139 let end_time_string = end_time.format("LT");
140 return `<span style="font-size: 1.2em;">${start_time_string}</span><br><span class="text-muted small">to ${end_time_string}</span>`;
pranav nachnekar27910542019-09-03 12:04:52 +0530141}
142
143function select_time() {
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530144 if (this.classList.contains('unavailable')) {
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530145 return;
pranav nachnekar27910542019-09-03 12:04:52 +0530146 }
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530147 let selected_element = document.getElementsByClassName('selected');
148 if (!(selected_element.length > 0)){
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530149 this.classList.add('selected');
150 show_next_button();
151 return;
pranav nachnekar27910542019-09-03 12:04:52 +0530152 }
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530153 selected_element = selected_element[0]
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530154 window.selected_time = this.id;
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530155 selected_element.classList.remove('selected');
156 this.classList.add('selected');
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530157 show_next_button();
pranav nachnekar27910542019-09-03 12:04:52 +0530158}
159
160function set_default_timeslot() {
161 let timeslots = document.getElementsByClassName('time-slot')
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530162 // Can't use a forEach here since, we need to break the loop after a timeslot is selected
pranav nachnekar27910542019-09-03 12:04:52 +0530163 for (let i = 0; i < timeslots.length; i++) {
164 const timeslot = timeslots[i];
165 if (!timeslot.classList.contains('unavailable')) {
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530166 timeslot.classList.add('selected');
pranav nachnekar27910542019-09-03 12:04:52 +0530167 break;
168 }
169 }
170}
171
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530172function navigate_to_page(page_number) {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530173 let page1 = document.getElementById('select-date-time');
174 let page2 = document.getElementById('enter-details');
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530175 switch (page_number) {
176 case 1:
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530177 page1.style.display = 'block';
178 page2.style.display = 'none';
179 break;
180 case 2:
181 page1.style.display = 'none';
182 page2.style.display = 'block';
183 break;
184 default:
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530185 break;
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530186 }
187}
188
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530189function setup_details_page() {
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530190 navigate_to_page(2)
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530191 let date_container = document.getElementsByClassName('date-span')[0];
192 let time_container = document.getElementsByClassName('time-span')[0];
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530193 date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530194 time_container.innerHTML = moment(window.selected_time, "HH:mm:ss").format("LT");
pranav nachnekar27910542019-09-03 12:04:52 +0530195}
196
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530197async function submit() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530198 // form validation here
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530199 get_form_data();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530200 let appointment = (await frappe.call({
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530201 method: 'erpnext.www.book-appointment.index.create_appointment',
202 args: {
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530203 'date': window.selected_date,
204 'time': window.selected_time,
205 'contact': window.contact
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530206 }
207 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530208 frappe.msgprint(__('Appointment Created Successfully'));
209 let button = document.getElementById('submit-button');
210 button.disabled = true;
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530211 button.onclick = null
212}
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530213
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530214function get_form_data() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530215 contact = {};
216 contact.name = document.getElementById('customer_name').value;
217 contact.number = document.getElementById('customer_number').value;
218 contact.skype = document.getElementById('customer_skype').value;
219 contact.notes = document.getElementById('customer_notes').value;
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530220 contact.email = document.getElementById('customer_email').value;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530221 window.contact = contact
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530222}