blob: 07355e16ffbf614b97057fb447983b131ed4139f [file] [log] [blame]
Pranav Nachanekarafe52e82019-10-03 16:35:08 +05301frappe.ready(async () => {
2 debugger
3 let isSchedulingEnabled = await frappe.call({
4 method:'erpnext.www.book-appointment.index.is_enabled'
5 })
6 isSchedulingEnabled = isSchedulingEnabled.message
7 if (!isSchedulingEnabled) {
8 frappe.show_alert("This feature is not enabled");
9 window.location.replace('/');
10 return;
11 }
12 initialise_select_date();
pranav nachnekar27910542019-09-03 12:04:52 +053013})
Pranav Nachanekarafe52e82019-10-03 16:35:08 +053014
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053015window.holiday_list = [];
pranav nachnekar27910542019-09-03 12:04:52 +053016
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053017async function initialise_select_date() {
Pranav Nachanekara2dbd392019-09-12 10:48:26 +053018 navigate_to_page(1);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053019 await get_global_variables();
20 setup_date_picker();
21 setup_timezone_selector();
22 hide_next_button();
pranav nachnekar27910542019-09-03 12:04:52 +053023}
24
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053025async function get_global_variables() {
Pranav Nachanekar91a56492019-09-17 16:58:41 +053026 // Using await
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053027 window.appointment_settings = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053028 method: 'erpnext.www.book-appointment.index.get_appointment_settings'
Pranav Nachanekarafe52e82019-10-03 16:35:08 +053029 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053030 window.timezones = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053031 method: 'erpnext.www.book-appointment.index.get_timezones'
32 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053033 window.holiday_list = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053034 method: 'erpnext.www.book-appointment.index.get_holiday_list',
35 args: {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053036 'holiday_list_name': window.appointment_settings.holiday_list
pranav nachnekar27910542019-09-03 12:04:52 +053037 }
38 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053039}
40
41function setup_timezone_selector() {
pranav nachnekar27910542019-09-03 12:04:52 +053042 let timezones_element = document.getElementById('appointment-timezone');
Pranav Nachanekar91a56492019-09-17 16:58:41 +053043 let offset = new Date().getTimezoneOffset();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053044 window.timezones.forEach(timezone => {
Pranav Nachanekar91a56492019-09-17 16:58:41 +053045 let opt = document.createElement('option');
Pranav Nachanekarc6da5fb2019-10-03 11:56:23 +053046 opt.value = timezone;
47 if(timezone == moment.tz.guess()){
48 opt.selected = true;
49 }
50 opt.innerHTML = timezone;
pranav nachnekar27910542019-09-03 12:04:52 +053051 timezones_element.appendChild(opt)
52 });
53}
54
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053055function setup_date_picker() {
pranav nachnekar27910542019-09-03 12:04:52 +053056 let date_picker = document.getElementById('appointment-date');
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053057 let today = new Date();
58 date_picker.min = today.toISOString().substr(0, 10);
Pranav Nachanekar469247b2019-09-12 11:15:42 +053059 today.setDate(today.getDate() + window.appointment_settings.advance_booking_days);
Pranav Nachanekar91a56492019-09-17 16:58:41 +053060 date_picker.max = today.toISOString().substr(0, 10);
pranav nachnekar27910542019-09-03 12:04:52 +053061}
62
Pranav Nachanekar91a56492019-09-17 16:58:41 +053063function hide_next_button() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053064 let next_button = document.getElementById('next-button');
65 next_button.disabled = true;
Pranav Nachanekar91a56492019-09-17 16:58:41 +053066 next_button.onclick = () => frappe.msgprint("Please select a date and time");
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053067}
68
Pranav Nachanekar91a56492019-09-17 16:58:41 +053069function show_next_button() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053070 let next_button = document.getElementById('next-button');
71 next_button.disabled = false;
72 next_button.onclick = setup_details_page;
73}
74
75function on_date_or_timezone_select() {
76 let date_picker = document.getElementById('appointment-date');
77 let timezone = document.getElementById('appointment-timezone');
78 if (date_picker.value === '') {
79 clear_time_slots();
80 hide_next_button();
81 frappe.throw('Please select a date');
82 }
83 window.selected_date = date_picker.value;
84 window.selected_timezone = timezone.value;
85 update_time_slots(date_picker.value, timezone.value);
Pranav Nachanekara322b152019-09-11 14:25:26 +053086 let lead_text = document.getElementById('lead-text');
87 lead_text.innerHTML = "Select Time"
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053088}
89
90async function get_time_slots(date, timezone) {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053091 let slots = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053092 method: 'erpnext.www.book-appointment.index.get_appointment_slots',
93 args: {
94 date: date,
95 timezone: timezone
96 }
97 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053098 return slots;
99}
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530100
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530101async function update_time_slots(selected_date, selected_timezone) {
102 let timeslot_container = document.getElementById('timeslot-container');
103 window.slots = await get_time_slots(selected_date, selected_timezone);
104 clear_time_slots();
105 if (window.slots.length <= 0) {
106 let message_div = document.createElement('p');
pranav nachnekar27910542019-09-03 12:04:52 +0530107 message_div.innerHTML = "There are no slots available on this date";
108 timeslot_container.appendChild(message_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530109 return
pranav nachnekar27910542019-09-03 12:04:52 +0530110 }
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530111 window.slots.forEach((slot, index) => {
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530112 // Get and append timeslot div
113 let timeslot_div = get_timeslot_div_layout(slot)
pranav nachnekar27910542019-09-03 12:04:52 +0530114 timeslot_container.appendChild(timeslot_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530115 });
116 set_default_timeslot();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530117}
118
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530119function get_timeslot_div_layout(timeslot) {
120 let start_time = new Date(timeslot.time)
121 let timeslot_div = document.createElement('div');
122 timeslot_div.classList.add('time-slot');
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530123 if (!timeslot.availability) {
124 timeslot_div.classList.add('unavailable')
125 }
126 timeslot_div.innerHTML = get_slot_layout(start_time);
127 timeslot_div.id = timeslot.time.substr(11, 20);
128 timeslot_div.addEventListener('click', select_time);
129 return timeslot_div
130}
131
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530132function clear_time_slots() {
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530133 // Clear any existing divs in timeslot container
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530134 let timeslot_container = document.getElementById('timeslot-container');
135 while (timeslot_container.firstChild) {
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530136 timeslot_container.removeChild(timeslot_container.firstChild);
pranav nachnekar27910542019-09-03 12:04:52 +0530137 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530138}
139
140function get_slot_layout(time) {
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530141 time = new Date(time);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530142 let start_time_string = moment(time).format("LT");
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530143 let end_time = moment(time).add(window.appointment_settings.appointment_duration, 'minutes');
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530144 let end_time_string = end_time.format("LT");
145 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 +0530146}
147
148function select_time() {
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530149 if (this.classList.contains('unavailable')) {
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530150 return;
pranav nachnekar27910542019-09-03 12:04:52 +0530151 }
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530152 let selected_element = document.getElementsByClassName('selected');
153 if (!(selected_element.length > 0)){
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530154 this.classList.add('selected');
155 show_next_button();
156 return;
pranav nachnekar27910542019-09-03 12:04:52 +0530157 }
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530158 selected_element = selected_element[0]
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530159 window.selected_time = this.id;
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530160 selected_element.classList.remove('selected');
161 this.classList.add('selected');
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530162 show_next_button();
pranav nachnekar27910542019-09-03 12:04:52 +0530163}
164
165function set_default_timeslot() {
166 let timeslots = document.getElementsByClassName('time-slot')
Pranav Nachanekar7323bfd2019-09-18 14:33:10 +0530167 // 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 +0530168 for (let i = 0; i < timeslots.length; i++) {
169 const timeslot = timeslots[i];
170 if (!timeslot.classList.contains('unavailable')) {
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530171 timeslot.classList.add('selected');
pranav nachnekar27910542019-09-03 12:04:52 +0530172 break;
173 }
174 }
175}
176
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530177function navigate_to_page(page_number) {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530178 let page1 = document.getElementById('select-date-time');
179 let page2 = document.getElementById('enter-details');
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530180 switch (page_number) {
181 case 1:
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530182 page1.style.display = 'block';
183 page2.style.display = 'none';
184 break;
185 case 2:
186 page1.style.display = 'none';
187 page2.style.display = 'block';
188 break;
189 default:
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530190 break;
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530191 }
192}
193
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530194function setup_details_page() {
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530195 navigate_to_page(2)
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530196 let date_container = document.getElementsByClassName('date-span')[0];
197 let time_container = document.getElementsByClassName('time-span')[0];
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530198 date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530199 time_container.innerHTML = moment(window.selected_time, "HH:mm:ss").format("LT");
pranav nachnekar27910542019-09-03 12:04:52 +0530200}
201
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530202async function submit() {
Pranav Nachanekarc9cf5ae2019-09-24 12:08:37 +0530203 let form = document.querySelector('#customer-form');
204 if(!form.checkValidity()){
205 form.reportValidity();
206 return;
207 }
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530208 get_form_data();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530209 let appointment = (await frappe.call({
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530210 method: 'erpnext.www.book-appointment.index.create_appointment',
211 args: {
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530212 'date': window.selected_date,
213 'time': window.selected_time,
214 'contact': window.contact
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530215 }
216 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530217 frappe.msgprint(__('Appointment Created Successfully'));
218 let button = document.getElementById('submit-button');
219 button.disabled = true;
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530220 button.onclick = null
221}
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530222
Pranav Nachanekar91a56492019-09-17 16:58:41 +0530223function get_form_data() {
Pranav Nachanekarc9cf5ae2019-09-24 12:08:37 +0530224
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530225 contact = {};
226 contact.name = document.getElementById('customer_name').value;
227 contact.number = document.getElementById('customer_number').value;
228 contact.skype = document.getElementById('customer_skype').value;
229 contact.notes = document.getElementById('customer_notes').value;
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530230 contact.email = document.getElementById('customer_email').value;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530231 window.contact = contact
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530232}