blob: 96ad66ace318c086ef32e12c41061afa063c1324 [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) {
78 debugger
79 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 Nachanekar5c008ef2019-09-10 13:12:07 +053099 window.slots.forEach((slot,index) => {
100 debugger
101 if(index%8==0){
102 let break_element = document.createElement('div');
103 break_element.classList.add('w-100');
104 timeslot_container.appendChild(break_element);
105 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530106 let start_time = new Date(slot.time)
pranav nachnekar27910542019-09-03 12:04:52 +0530107 var timeslot_div = document.createElement('div');
108 timeslot_div.classList.add('time-slot');
109 timeslot_div.classList.add('col-md');
110 if (!slot.availability) {
111 timeslot_div.classList.add('unavailable')
112 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530113 timeslot_div.innerHTML = get_slot_layout(start_time);
pranav nachnekar27910542019-09-03 12:04:52 +0530114 timeslot_div.id = slot.time.substr(11, 20);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530115 timeslot_div.addEventListener('click', select_time);
pranav nachnekar27910542019-09-03 12:04:52 +0530116 timeslot_container.appendChild(timeslot_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530117 });
118 set_default_timeslot();
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530119}
120
121function clear_time_slots() {
122 let timeslot_container = document.getElementById('timeslot-container');
123 while (timeslot_container.firstChild) {
124 timeslot_container.removeChild(timeslot_container.firstChild)
pranav nachnekar27910542019-09-03 12:04:52 +0530125 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530126}
127
128function get_slot_layout(time) {
129 time = new Date(time)
130 let start_time_string = moment(time).format("LT");
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530131 let end_time = moment(time).add(window.appointment_settings.appointment_duration,'minutes');
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530132 let end_time_string = end_time.format("LT");
133 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 +0530134}
135
136function select_time() {
137 if (this.classList.contains("unavailable")) {
138 return
139 }
140 try {
141 selected_element = document.getElementsByClassName('selected')[0]
142 } catch (e) {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530143 debugger
pranav nachnekar27910542019-09-03 12:04:52 +0530144 this.classList.add("selected")
145 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530146 window.selected_time = this.id
pranav nachnekar27910542019-09-03 12:04:52 +0530147 selected_element.classList.remove("selected");
148 this.classList.add("selected");
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530149 show_next_button();
pranav nachnekar27910542019-09-03 12:04:52 +0530150}
151
152function set_default_timeslot() {
153 let timeslots = document.getElementsByClassName('time-slot')
154 for (let i = 0; i < timeslots.length; i++) {
155 const timeslot = timeslots[i];
156 if (!timeslot.classList.contains('unavailable')) {
157 timeslot.classList.add("selected");
158 break;
159 }
160 }
161}
162
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530163function navigate_to_page(page_number){
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530164 let page1 = document.getElementById('select-date-time');
165 let page2 = document.getElementById('enter-details');
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530166 switch(page_number){
167 case 1:
168 page1.style.display = 'block';
169 page2.style.display = 'none';
170 break;
171 case 2:
172 page1.style.display = 'none';
173 page2.style.display = 'block';
174 break;
175 default:
176 console.log("That's not a valid page")
177 }
178}
179
180function setup_details_page(){
181 navigate_to_page(2)
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530182 let date_container = document.getElementsByClassName('date-span')[0];
183 let time_container = document.getElementsByClassName('time-span')[0];
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530184 date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530185 time_container.innerHTML = moment(window.selected_time,"HH:mm:ss").format("LT");
pranav nachnekar27910542019-09-03 12:04:52 +0530186}
187
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530188async function submit() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530189 // form validation here
190 form_validation();
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530191 debugger;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530192 let appointment = (await frappe.call({
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530193 method: 'erpnext.www.book-appointment.index.create_appointment',
194 args: {
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530195 'date': window.selected_date,
196 'time': window.selected_time,
197 'contact': window.contact
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530198 }
199 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530200 frappe.msgprint(__('Appointment Created Successfully'));
201 let button = document.getElementById('submit-button');
202 button.disabled = true;
203 button.onclick = () => { console.log('This should never have happened') }
pranav nachnekar27910542019-09-03 12:04:52 +0530204}
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530205
206function form_validation(){
207 var date = window.selected_date;
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530208 var time = window.selected_time;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530209 contact = {};
210 contact.name = document.getElementById('customer_name').value;
211 contact.number = document.getElementById('customer_number').value;
212 contact.skype = document.getElementById('customer_skype').value;
213 contact.notes = document.getElementById('customer_notes').value;
Pranav Nachanekara2dbd392019-09-12 10:48:26 +0530214 contact.email = document.getElementById('customer_email').value;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530215 window.contact = contact
216 console.log({ date, time, contact });
217}