blob: 61ea8e40d76a6def05b4577bc04b1c76ec312d55 [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() {
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 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);
46 date_picker.max = window.holiday_list.to_date;
pranav nachnekar27910542019-09-03 12:04:52 +053047}
48
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053049function 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
55function 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
61function 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
74async function get_time_slots(date, timezone) {
75 debugger
76 let slots = (await frappe.call({
pranav nachnekar27910542019-09-03 12:04:52 +053077 method: 'erpnext.www.book-appointment.index.get_appointment_slots',
78 args: {
79 date: date,
80 timezone: timezone
81 }
82 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053083 return slots;
84}
pranav nachnekarc5b2a582019-09-03 14:16:47 +053085
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053086async 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 nachnekar27910542019-09-03 12:04:52 +053092 message_div.innerHTML = "There are no slots available on this date";
93 timeslot_container.appendChild(message_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053094 return
pranav nachnekar27910542019-09-03 12:04:52 +053095 }
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +053096 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 Nachanekar10711dd2019-09-09 15:41:20 +0530103 let start_time = new Date(slot.time)
pranav nachnekar27910542019-09-03 12:04:52 +0530104 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 Nachanekar10711dd2019-09-09 15:41:20 +0530110 timeslot_div.innerHTML = get_slot_layout(start_time);
pranav nachnekar27910542019-09-03 12:04:52 +0530111 timeslot_div.id = slot.time.substr(11, 20);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530112 timeslot_div.addEventListener('click', select_time);
pranav nachnekar27910542019-09-03 12:04:52 +0530113 timeslot_container.appendChild(timeslot_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530114 });
115 set_default_timeslot();
116 show_next_button();
117}
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) {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530141 debugger
pranav nachnekar27910542019-09-03 12:04:52 +0530142 this.classList.add("selected")
143 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530144 window.selected_time = this.id
pranav nachnekar27910542019-09-03 12:04:52 +0530145 selected_element.classList.remove("selected");
146 this.classList.add("selected");
147}
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 Nachanekar10711dd2019-09-09 15:41:20 +0530160function 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 Nachanekar10711dd2019-09-09 15:41:20 +0530165 let date_container = document.getElementsByClassName('date-span')[0];
166 let time_container = document.getElementsByClassName('time-span')[0];
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530167 date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530168 time_container.innerHTML = moment(window.selected_time,"HH:mm:ss").format("LT");
pranav nachnekar27910542019-09-03 12:04:52 +0530169}
170
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530171async function submit() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530172 // form validation here
173 form_validation();
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530174 debugger;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530175 let appointment = (await frappe.call({
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530176 method: 'erpnext.www.book-appointment.index.create_appointment',
177 args: {
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530178 'date': window.selected_date,
179 'time': window.selected_time,
180 'contact': window.contact
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530181 }
182 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530183 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 nachnekar27910542019-09-03 12:04:52 +0530187}
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530188
189function form_validation(){
190 var date = window.selected_date;
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530191 var time = window.selected_time;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530192 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}