blob: 90572fb8918b9a6e94a837d9a2296a81c1bd766c [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);
Pranav Nachanekara322b152019-09-11 14:25:26 +053072 let lead_text = document.getElementById('lead-text');
73 lead_text.innerHTML = "Select Time"
Pranav Nachanekar10711dd2019-09-09 15:41:20 +053074}
75
76async function get_time_slots(date, timezone) {
77 debugger
78 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) => {
99 debugger
100 if(index%8==0){
101 let break_element = document.createElement('div');
102 break_element.classList.add('w-100');
103 timeslot_container.appendChild(break_element);
104 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530105 let start_time = new Date(slot.time)
pranav nachnekar27910542019-09-03 12:04:52 +0530106 var timeslot_div = document.createElement('div');
107 timeslot_div.classList.add('time-slot');
108 timeslot_div.classList.add('col-md');
109 if (!slot.availability) {
110 timeslot_div.classList.add('unavailable')
111 }
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530112 timeslot_div.innerHTML = get_slot_layout(start_time);
pranav nachnekar27910542019-09-03 12:04:52 +0530113 timeslot_div.id = slot.time.substr(11, 20);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530114 timeslot_div.addEventListener('click', select_time);
pranav nachnekar27910542019-09-03 12:04:52 +0530115 timeslot_container.appendChild(timeslot_div);
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530116 });
117 set_default_timeslot();
118 show_next_button();
119}
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");
149}
150
151function set_default_timeslot() {
152 let timeslots = document.getElementsByClassName('time-slot')
153 for (let i = 0; i < timeslots.length; i++) {
154 const timeslot = timeslots[i];
155 if (!timeslot.classList.contains('unavailable')) {
156 timeslot.classList.add("selected");
157 break;
158 }
159 }
160}
161
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530162function setup_details_page(){
163 let page1 = document.getElementById('select-date-time');
164 let page2 = document.getElementById('enter-details');
165 page1.style.display = 'none';
166 page2.style.display = 'block';
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530167 let date_container = document.getElementsByClassName('date-span')[0];
168 let time_container = document.getElementsByClassName('time-span')[0];
Pranav Nachanekar5c008ef2019-09-10 13:12:07 +0530169 date_container.innerHTML = moment(window.selected_date).format("MMM Do YYYY");
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530170 time_container.innerHTML = moment(window.selected_time,"HH:mm:ss").format("LT");
pranav nachnekar27910542019-09-03 12:04:52 +0530171}
172
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530173async function submit() {
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530174 // form validation here
175 form_validation();
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530176 debugger;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530177 let appointment = (await frappe.call({
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530178 method: 'erpnext.www.book-appointment.index.create_appointment',
179 args: {
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530180 'date': window.selected_date,
181 'time': window.selected_time,
182 'contact': window.contact
pranav nachnekarc5b2a582019-09-03 14:16:47 +0530183 }
184 })).message;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530185 frappe.msgprint(__('Appointment Created Successfully'));
186 let button = document.getElementById('submit-button');
187 button.disabled = true;
188 button.onclick = () => { console.log('This should never have happened') }
pranav nachnekar27910542019-09-03 12:04:52 +0530189}
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530190
191function form_validation(){
192 var date = window.selected_date;
Pranav Nachanekardb21f862019-09-09 17:01:40 +0530193 var time = window.selected_time;
Pranav Nachanekar10711dd2019-09-09 15:41:20 +0530194 contact = {};
195 contact.name = document.getElementById('customer_name').value;
196 contact.number = document.getElementById('customer_number').value;
197 contact.skype = document.getElementById('customer_skype').value;
198 contact.notes = document.getElementById('customer_notes').value;
199 window.contact = contact
200 console.log({ date, time, contact });
201}