blob: 5302d1b626b05188145bb4c8040993d3b350d283 [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() {
16 window.appointment_settings = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053017 method: 'erpnext.www.book-appointment.index.get_appointment_settings'
18 })).message
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053019 window.timezones = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053020 method: 'erpnext.www.book-appointment.index.get_timezones'
21 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053022 window.holiday_list = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053023 method: 'erpnext.www.book-appointment.index.get_holiday_list',
24 args: {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053025 'holiday_list_name': window.appointment_settings.holiday_list
pranav nachnekar27910542019-09-03 12:04:52 +053026 }
27 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053028}
29
30function setup_timezone_selector() {
pranav nachnekar27910542019-09-03 12:04:52 +053031 let timezones_element = document.getElementById('appointment-timezone');
32 var offset = new Date().getTimezoneOffset();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053033 window.timezones.forEach(timezone => {
pranav nachnekar27910542019-09-03 12:04:52 +053034 var opt = document.createElement('option');
35 opt.value = timezone.offset;
36 opt.innerHTML = timezone.timezone_name;
37 opt.defaultSelected = (offset == timezone.offset)
38 timezones_element.appendChild(opt)
39 });
40}
41
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053042function setup_date_picker() {
pranav nachnekar27910542019-09-03 12:04:52 +053043 let date_picker = document.getElementById('appointment-date');
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053044 let today = new Date();
45 date_picker.min = today.toISOString().substr(0, 10);
Pranav Nachanekar469247b2019-09-12 11:15:42 +053046 today.setDate(today.getDate() + window.appointment_settings.advance_booking_days);
47 date_picker.max = today.toISOString().substr(0,10);
pranav nachnekar27910542019-09-03 12:04:52 +053048}
49
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053050function hide_next_button(){
51 let next_button = document.getElementById('next-button');
52 next_button.disabled = true;
53 next_button.onclick = ()=>{frappe.msgprint("Please select a date and time")};
54}
55
56function show_next_button(){
57 let next_button = document.getElementById('next-button');
58 next_button.disabled = false;
59 next_button.onclick = setup_details_page;
60}
61
62function on_date_or_timezone_select() {
63 let date_picker = document.getElementById('appointment-date');
64 let timezone = document.getElementById('appointment-timezone');
65 if (date_picker.value === '') {
66 clear_time_slots();
67 hide_next_button();
68 frappe.throw('Please select a date');
69 }
70 window.selected_date = date_picker.value;
71 window.selected_timezone = timezone.value;
72 update_time_slots(date_picker.value, timezone.value);
Pranav Nachanekara322b152019-09-11 14:25:26 +053073 let lead_text = document.getElementById('lead-text');
74 lead_text.innerHTML = "Select Time"
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053075}
76
77async function get_time_slots(date, timezone) {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053078 let slots = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053079 method: 'erpnext.www.book-appointment.index.get_appointment_slots',
80 args: {
81 date: date,
82 timezone: timezone
83 }
84 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053085 return slots;
86}
pranav nachnekarc5b2a582019-09-03 14:16:47 +053087
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053088async function update_time_slots(selected_date, selected_timezone) {
89 let timeslot_container = document.getElementById('timeslot-container');
90 window.slots = await get_time_slots(selected_date, selected_timezone);
91 clear_time_slots();
92 if (window.slots.length <= 0) {
93 let message_div = document.createElement('p');
pranav nachnekar27910542019-09-03 12:04:52 +053094 message_div.innerHTML = "There are no slots available on this date";
95 timeslot_container.appendChild(message_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053096 return
pranav nachnekar27910542019-09-03 12:04:52 +053097 }
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +053098 window.slots.forEach((slot,index) => {
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +053099 if(index%8==0){
100 let break_element = document.createElement('div');
101 break_element.classList.add('w-100');
102 timeslot_container.appendChild(break_element);
103 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530104 let start_time = new Date(slot.time)
pranav nachnekar27910542019-09-03 12:04:52 +0530105 var timeslot_div = document.createElement('div');
106 timeslot_div.classList.add('time-slot');
107 timeslot_div.classList.add('col-md');
108 if (!slot.availability) {
109 timeslot_div.classList.add('unavailable')
110 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530111 timeslot_div.innerHTML = get_slot_layout(start_time);
pranav nachnekar27910542019-09-03 12:04:52 +0530112 timeslot_div.id = slot.time.substr(11, 20);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530113 timeslot_div.addEventListener('click', select_time);
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
119function clear_time_slots() {
120 let timeslot_container = document.getElementById('timeslot-container');
121 while (timeslot_container.firstChild) {
122 timeslot_container.removeChild(timeslot_container.firstChild)
pranav nachnekar27910542019-09-03 12:04:52 +0530123 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530124}
125
126function get_slot_layout(time) {
127 time = new Date(time)
128 let start_time_string = moment(time).format("LT");
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530129 let end_time = moment(time).add(window.appointment_settings.appointment_duration,'minutes');
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530130 let end_time_string = end_time.format("LT");
131 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 +0530132}
133
134function select_time() {
135 if (this.classList.contains("unavailable")) {
136 return
137 }
138 try {
139 selected_element = document.getElementsByClassName('selected')[0]
140 } catch (e) {
141 this.classList.add("selected")
142 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530143 window.selected_time = this.id
pranav nachnekar27910542019-09-03 12:04:52 +0530144 selected_element.classList.remove("selected");
145 this.classList.add("selected");
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530146 show_next_button();
pranav nachnekar27910542019-09-03 12:04:52 +0530147}
148
149function set_default_timeslot() {
150 let timeslots = document.getElementsByClassName('time-slot')
151 for (let i = 0; i < timeslots.length; i++) {
152 const timeslot = timeslots[i];
153 if (!timeslot.classList.contains('unavailable')) {
154 timeslot.classList.add("selected");
155 break;
156 }
157 }
158}
159
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530160function navigate_to_page(page_number){
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530161 let page1 = document.getElementById('select-date-time');
162 let page2 = document.getElementById('enter-details');
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530163 switch(page_number){
164 case 1:
165 page1.style.display = 'block';
166 page2.style.display = 'none';
167 break;
168 case 2:
169 page1.style.display = 'none';
170 page2.style.display = 'block';
171 break;
172 default:
173 console.log("That's not a valid page")
174 }
175}
176
177function setup_details_page(){
178 navigate_to_page(2)
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530179 let date_container = document.getElementsByClassName('date-span')[0];
180 let time_container = document.getElementsByClassName('time-span')[0];
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530181 date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530182 time_container.innerHTML = moment(window.selected_time,"HH:mm:ss").format("LT");
pranav nachnekar27910542019-09-03 12:04:52 +0530183}
184
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530185async function submit() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530186 // form validation here
187 form_validation();
188 let appointment = (await frappe.call({
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530189 method: 'erpnext.www.book-appointment.index.create_appointment',
190 args: {
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530191 'date': window.selected_date,
192 'time': window.selected_time,
193 'contact': window.contact
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530194 }
195 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530196 frappe.msgprint(__('Appointment Created Successfully'));
197 let button = document.getElementById('submit-button');
198 button.disabled = true;
199 button.onclick = () => { console.log('This should never have happened') }
pranav nachnekar27910542019-09-03 12:04:52 +0530200}
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530201
202function form_validation(){
203 var date = window.selected_date;
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530204 var time = window.selected_time;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530205 contact = {};
206 contact.name = document.getElementById('customer_name').value;
207 contact.number = document.getElementById('customer_number').value;
208 contact.skype = document.getElementById('customer_skype').value;
209 contact.notes = document.getElementById('customer_notes').value;
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530210 contact.email = document.getElementById('customer_email').value;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530211 window.contact = contact
212 console.log({ date, time, contact });
213}