pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 1 | |
| 2 | frappe.ready(() => { |
| 3 | initialise_select_date() |
| 4 | }) |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 5 | window.holiday_list = []; |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 6 | |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 7 | async function initialise_select_date() { |
| 8 | document.getElementById('enter-details').style.display = 'none'; |
| 9 | await get_global_variables(); |
| 10 | setup_date_picker(); |
| 11 | setup_timezone_selector(); |
| 12 | hide_next_button(); |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 13 | } |
| 14 | |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 15 | async function get_global_variables() { |
| 16 | window.appointment_settings = (await frappe.call({ |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 17 | method: 'erpnext.www.book-appointment.index.get_appointment_settings' |
| 18 | })).message |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 19 | window.timezones = (await frappe.call({ |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 20 | method: 'erpnext.www.book-appointment.index.get_timezones' |
| 21 | })).message; |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 22 | window.holiday_list = (await frappe.call({ |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 23 | method: 'erpnext.www.book-appointment.index.get_holiday_list', |
| 24 | args: { |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 25 | 'holiday_list_name': window.appointment_settings.holiday_list |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 26 | } |
| 27 | })).message; |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 28 | } |
| 29 | |
| 30 | function setup_timezone_selector() { |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 31 | let timezones_element = document.getElementById('appointment-timezone'); |
| 32 | var offset = new Date().getTimezoneOffset(); |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 33 | window.timezones.forEach(timezone => { |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 34 | 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 Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 42 | function setup_date_picker() { |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 43 | let date_picker = document.getElementById('appointment-date'); |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 44 | let today = new Date(); |
| 45 | date_picker.min = today.toISOString().substr(0, 10); |
| 46 | date_picker.max = window.holiday_list.to_date; |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 47 | } |
| 48 | |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 49 | function hide_next_button(){ |
| 50 | let next_button = document.getElementById('next-button'); |
| 51 | next_button.disabled = true; |
| 52 | next_button.onclick = ()=>{frappe.msgprint("Please select a date and time")}; |
| 53 | } |
| 54 | |
| 55 | function show_next_button(){ |
| 56 | let next_button = document.getElementById('next-button'); |
| 57 | next_button.disabled = false; |
| 58 | next_button.onclick = setup_details_page; |
| 59 | } |
| 60 | |
| 61 | function on_date_or_timezone_select() { |
| 62 | 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 | } |
| 73 | |
| 74 | async function get_time_slots(date, timezone) { |
| 75 | debugger |
| 76 | let slots = (await frappe.call({ |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 77 | method: 'erpnext.www.book-appointment.index.get_appointment_slots', |
| 78 | args: { |
| 79 | date: date, |
| 80 | timezone: timezone |
| 81 | } |
| 82 | })).message; |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 83 | return slots; |
| 84 | } |
pranav nachnekar | c5b2a58 | 2019-09-03 14:16:47 +0530 | [diff] [blame] | 85 | |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 86 | async function update_time_slots(selected_date, selected_timezone) { |
| 87 | let timeslot_container = document.getElementById('timeslot-container'); |
| 88 | window.slots = await get_time_slots(selected_date, selected_timezone); |
| 89 | clear_time_slots(); |
| 90 | if (window.slots.length <= 0) { |
| 91 | let message_div = document.createElement('p'); |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 92 | message_div.innerHTML = "There are no slots available on this date"; |
| 93 | timeslot_container.appendChild(message_div); |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 94 | return |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 95 | } |
Pranav Nachanekar | 5c008ef | 2019-09-10 13:12:07 +0530 | [diff] [blame] | 96 | window.slots.forEach((slot,index) => { |
| 97 | debugger |
| 98 | if(index%8==0){ |
| 99 | let break_element = document.createElement('div'); |
| 100 | break_element.classList.add('w-100'); |
| 101 | timeslot_container.appendChild(break_element); |
| 102 | } |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 103 | let start_time = new Date(slot.time) |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 104 | var timeslot_div = document.createElement('div'); |
| 105 | timeslot_div.classList.add('time-slot'); |
| 106 | timeslot_div.classList.add('col-md'); |
| 107 | if (!slot.availability) { |
| 108 | timeslot_div.classList.add('unavailable') |
| 109 | } |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 110 | timeslot_div.innerHTML = get_slot_layout(start_time); |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 111 | timeslot_div.id = slot.time.substr(11, 20); |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 112 | timeslot_div.addEventListener('click', select_time); |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 113 | timeslot_container.appendChild(timeslot_div); |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 114 | }); |
| 115 | set_default_timeslot(); |
| 116 | show_next_button(); |
| 117 | } |
| 118 | |
| 119 | function clear_time_slots() { |
| 120 | let timeslot_container = document.getElementById('timeslot-container'); |
| 121 | while (timeslot_container.firstChild) { |
| 122 | timeslot_container.removeChild(timeslot_container.firstChild) |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 123 | } |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 124 | } |
| 125 | |
| 126 | function get_slot_layout(time) { |
| 127 | time = new Date(time) |
| 128 | let start_time_string = moment(time).format("LT"); |
Pranav Nachanekar | 5c008ef | 2019-09-10 13:12:07 +0530 | [diff] [blame] | 129 | let end_time = moment(time).add(window.appointment_settings.appointment_duration,'minutes'); |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 130 | 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 nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 132 | } |
| 133 | |
| 134 | function select_time() { |
| 135 | if (this.classList.contains("unavailable")) { |
| 136 | return |
| 137 | } |
| 138 | try { |
| 139 | selected_element = document.getElementsByClassName('selected')[0] |
| 140 | } catch (e) { |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 141 | debugger |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 142 | this.classList.add("selected") |
| 143 | } |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 144 | window.selected_time = this.id |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 145 | selected_element.classList.remove("selected"); |
| 146 | this.classList.add("selected"); |
| 147 | } |
| 148 | |
| 149 | function 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 Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 160 | function setup_details_page(){ |
| 161 | let page1 = document.getElementById('select-date-time'); |
| 162 | let page2 = document.getElementById('enter-details'); |
| 163 | page1.style.display = 'none'; |
| 164 | page2.style.display = 'block'; |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 165 | let date_container = document.getElementsByClassName('date-span')[0]; |
| 166 | let time_container = document.getElementsByClassName('time-span')[0]; |
Pranav Nachanekar | 5c008ef | 2019-09-10 13:12:07 +0530 | [diff] [blame] | 167 | date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY"); |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 168 | time_container.innerHTML = moment(window.selected_time,"HH:mm:ss").format("LT"); |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 169 | } |
| 170 | |
pranav nachnekar | c5b2a58 | 2019-09-03 14:16:47 +0530 | [diff] [blame] | 171 | async function submit() { |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 172 | // form validation here |
| 173 | form_validation(); |
Pranav Nachanekar | db21f86 | 2019-09-09 17:01:40 +0530 | [diff] [blame] | 174 | debugger; |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 175 | let appointment = (await frappe.call({ |
pranav nachnekar | c5b2a58 | 2019-09-03 14:16:47 +0530 | [diff] [blame] | 176 | method: 'erpnext.www.book-appointment.index.create_appointment', |
| 177 | args: { |
Pranav Nachanekar | db21f86 | 2019-09-09 17:01:40 +0530 | [diff] [blame] | 178 | 'date': window.selected_date, |
| 179 | 'time': window.selected_time, |
| 180 | 'contact': window.contact |
pranav nachnekar | c5b2a58 | 2019-09-03 14:16:47 +0530 | [diff] [blame] | 181 | } |
| 182 | })).message; |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 183 | frappe.msgprint(__('Appointment Created Successfully')); |
| 184 | let button = document.getElementById('submit-button'); |
| 185 | button.disabled = true; |
| 186 | button.onclick = () => { console.log('This should never have happened') } |
pranav nachnekar | 2791054 | 2019-09-03 12:04:52 +0530 | [diff] [blame] | 187 | } |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 188 | |
| 189 | function form_validation(){ |
| 190 | var date = window.selected_date; |
Pranav Nachanekar | db21f86 | 2019-09-09 17:01:40 +0530 | [diff] [blame] | 191 | var time = window.selected_time; |
Pranav Nachanekar | 10711dd | 2019-09-09 15:41:20 +0530 | [diff] [blame] | 192 | contact = {}; |
| 193 | contact.name = document.getElementById('customer_name').value; |
| 194 | contact.number = document.getElementById('customer_number').value; |
| 195 | contact.skype = document.getElementById('customer_skype').value; |
| 196 | contact.notes = document.getElementById('customer_notes').value; |
| 197 | window.contact = contact |
| 198 | console.log({ date, time, contact }); |
| 199 | } |