PluginProbe ʕ •ᴥ•ʔ
Event Tickets with Ticket Scanner / 2.7.8
Event Tickets with Ticket Scanner v2.7.8
3.1.2 3.1.1 3.1.0 3.0.9 3.0.8 3.0.7 3.0.6 3.0.5 3.0.4 trunk 2.6.0 2.7.0 2.7.1 2.7.10 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 2.7.9 2.8.0 2.8.1 2.8.10 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.0 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 2.9.8 2.9.9 3.0.0 3.0.1 3.0.2 3.0.3
event-tickets-with-ticket-scanner / wc_frontend.js
event-tickets-with-ticket-scanner Last commit date
3rd 9 months ago css 9 months ago img 9 months ago languages 9 months ago ticket 9 months ago vendors 9 months ago SASO_EVENTTICKETS.php 9 months ago backend.js 9 months ago changelog.txt 9 months ago db.php 9 months ago index.php 9 months ago init_file.php 9 months ago js_seatingplan.js 9 months ago order_details.js 9 months ago readme.txt 9 months ago saso-eventtickets-validator.js 9 months ago sasoEventtickets_AdminSettings.php 9 months ago sasoEventtickets_Authtoken.php 9 months ago sasoEventtickets_Base.php 9 months ago sasoEventtickets_Core.php 9 months ago sasoEventtickets_Frontend.php 9 months ago sasoEventtickets_Messenger.php 9 months ago sasoEventtickets_Options.php 9 months ago sasoEventtickets_PDF.php 9 months ago sasoEventtickets_Ticket.php 9 months ago sasoEventtickets_TicketBadge.php 9 months ago sasoEventtickets_TicketDesigner.php 9 months ago sasoEventtickets_TicketQR.php 9 months ago ticket_events.js 9 months ago ticket_scanner.js 9 months ago validator.js 9 months ago wc_backend.js 9 months ago wc_frontend.js 9 months ago woocommerce-hooks.php 9 months ago
wc_frontend.js
423 lines
1 function SasoEventticketsValidator_WC_frontend($, phpObject) {
2 const { __, _x, _n, sprintf } = wp.i18n;
3 let _self = this;
4 let inputTypes = [phpObject.inputType, "text", "value"];
5
6 function init() {
7 _addHandlerToTheCodeFields();
8 _addHandlerToAddToCartButtons(); // for shop and product pages
9 }
10
11 function addStyleCode(content) {
12 let c = document.createElement('style');
13 c.innerHTML = content;
14 document.getElementsByTagName("head")[0].appendChild(c);
15 }
16
17 function getPidFromAddToCartButton(btn){
18 return btn.data('product_id') || btn.attr('data-product_id') || btn.val() || null;
19 }
20
21 function _addHandlerToAddToCartButtons() {
22 if (!phpObject.fieldKey) return;
23 if (!phpObject.has_daychooser) return; // only if at least one product has a date picker
24
25 function findDateForPid(pid, $btn){
26 let input_id = phpObject.fieldKey+'_'+pid;
27
28 return $(document.body)
29 .find('input[data-input-type="daychooser"][data-plugin="event"][data-is-shop-page="1"][data-cart-item-id="'+input_id+'"]')
30 .first();
31 }
32
33 function checkDate(btn) {
34 var pid = getPidFromAddToCartButton(btn);
35 if (!pid) return; // manche Themes weichen ab; dann greift serverseitige Prüfung
36
37 var input = findDateForPid(pid, btn);
38 if (!input || !input.length) return; // kein Feld gefunden, dann greift serverseitige Prüfung
39
40 var val = (input && input.val ? (input.val()||'').trim() : '');
41
42 if (!val) {
43 e.preventDefault();
44 e.stopPropagation();
45 e.stopImmediatePropagation();
46 // Kurzes Feedback (ersetze gern durch eigenes Notice-System)
47 alert(phpObject.daychooser_warning ? phpObject.daychooser_warning : __('Please choose a valid date.', 'event-tickets-with-ticket-scanner'));
48 return false;
49 }
50 return true;
51 }
52
53 // product page
54 $(document).on('click', '.single_add_to_cart_button', function(e){
55 var btn = $(this);
56
57 if (!checkDate(btn)) {
58 return false;
59 }
60 });
61
62 // product page with AJAX add to cart
63 var form = document.querySelector('form.cart');
64 if (form) {
65 form.addEventListener('submit', function(e){
66 var btn = $(form).find('.single_add_to_cart_button').first();
67 if (!btn || btn.length == 0) return; // no button found, then server side check
68 if (!checkDate(btn)) {
69 return false;
70 }
71 var pid = getPidFromAddToCartButton(btn);
72 if (!pid) return; // manche Themes weichen ab; dann greift serverseitige Prüfung
73 var $input = findDateForPid(pid, btn);
74 if ($input && $input.length > 0) {
75 var val = ($input && $input.val ? ($input.val()||'').trim() : '');
76 if (val == "") return false;
77 // add hidden input field to the form if not already present
78 var hiddenInput = form.querySelector('input[name="'+phpObject.fieldKey+'"]');
79 if (!hiddenInput) {
80 hiddenInput = document.createElement('input');
81 hiddenInput.type = 'hidden';
82 hiddenInput.name = phpObject.fieldKey;
83 form.appendChild(hiddenInput);
84 }
85 hiddenInput.value = val ? val : '';
86 // indicate that a day chooser was used
87 var hiddenInputIndicator = form.querySelector('input[name="'+phpObject.fieldDayChooserIndicator+'"]');
88 if (!hiddenInputIndicator) {
89 hiddenInputIndicator = document.createElement('input');
90 hiddenInputIndicator.type = 'hidden';
91 hiddenInputIndicator.name = phpObject.fieldDayChooserIndicator;
92 form.appendChild(hiddenInputIndicator);
93 }
94 hiddenInputIndicator.value = 1;
95 }
96 });
97 }
98
99 // shop page
100 $(document.body).on('click', '.add_to_cart_button', function(e){
101 var btn = $(this);
102 if (!btn.hasClass('ajax_add_to_cart')) return; // nur AJAX-Buttons
103
104 if (!checkDate(btn)) {
105 return false;
106 }
107 });
108
109 // shop page with AJAX add to cart
110 $(document.body).on('adding_to_cart', function(e, $button, data){
111 var pid = getPidFromAddToCartButton($button);
112 if (!pid) return;
113
114 var $input = findDateForPid(pid, $button);
115 if ($input && $input.length > 0) {
116 var val = ($input && $input.val ? ($input.val()||'').trim() : '');
117 if (val == "") return false;
118 data[phpObject.fieldKey] = val ? val : '';
119 data[phpObject.fieldDayChooserIndicator] = 1;
120 }
121
122 var nonce = document.querySelector('input[name="'+phpObject.nonceKey+'"]');
123 data[phpObject.nonceKey] = nonce ? nonce.value : '';
124 });
125
126 }
127
128 function _addHandlerToTheCodeFields() {
129 let isStoring = false;
130 let waitingTimeout = null;
131 let isChanged = false;
132
133 function sendCode(elem, code, type) {
134 //clearWaitingTimeout();
135 if (!isStoring) {
136 $('div[class="woocommerce"]').block({
137 //message: '...loading...',
138 message: null,
139 overlayCSS: {
140 background: '#fff',
141 opacity: 0.6
142 }
143 });
144 isStoring = true;
145 let cart_item_id = elem.attr('data-cart-item-id');
146 let cart_item_count = elem.attr('data-cart-item-count');
147 let nonce = phpObject.nonce;
148 $.ajax(
149 {
150 type: 'POST',
151 url: phpObject.ajaxurl,
152 data: {
153 action: phpObject.action,
154 a: 'updateSerialCodeToCartItem',
155 security: nonce,
156 cart_item_id: cart_item_id,
157 cart_item_count: cart_item_count,
158 type: type,
159 code: code
160 },
161 success: function( response ) {
162 $('div[class="woocommerce"]').unblock();
163 $('.cart_totals').unblock();
164 if (response.success) {
165 elem.val(response.code);
166 } else {
167 if (response.msg) alert(response.msg);
168 }
169 isStoring = false;
170 //window.location.reload();
171 }
172 }
173 )
174 }
175 }
176
177 function clearWaitingTimeout() {
178 clearTimeout(waitingTimeout);
179 }
180 function setWaitingTimeout(elem, code) {
181 clearWaitingTimeout();
182 waitingTimeout = setTimeout(()=>{
183 if (isChanged) {
184 isChanged = false;
185 sendCode(elem, code);
186 }
187 }, 2500);
188 }
189
190 // finde die code text inputs
191 // eventcoderrestriction is no longer used, but still in the code
192 $('body').find('input[data-input-type="eventcoderestriction"][data-plugin="event"]')
193 .on('keyup',function(){
194 /*
195 $('.cart_totals').block({
196 message: null,
197 overlayCSS: {
198 background: '#fff',
199 opacity: 0.6
200 }
201 });
202 isStoring = false;
203 isChanged = true;
204 let elem = $(this);
205 let code = elem.val().trim();
206 setWaitingTimeout(elem, code);
207 */
208 })
209 .on('paste', event=>{
210 isStoring = false;
211 let elem = $(event.srcElement);
212 let code = (event.clipboardData || window.clipboardData).getData('text');
213 if (typeof code == "string") {
214 code = code.trim();
215 isChanged = true;
216 sendCode(elem, code, "saso_eventtickets_request_name_per_ticket");
217 } else { alert("no text"); }
218 })
219 .on('change',function(){
220 let elem = $(this);
221 let code = elem.val().trim();
222 //let cart_item_id = elem.data('cart-item-id');
223 //let d = document.querySelector('input[data-cart-item-id="'+cart_item_id+'"]').value
224 isChanged = true;
225 sendCode(elem, code, "saso_eventtickets_request_name_per_ticket");
226 })
227 /*
228 .on('blur',function(){
229 let elem = $(this);
230 let code = elem.val().trim();
231 if (code != "" && isChanged) {
232 let cart_item_id = elem.data('cart-item-id');
233 //let d = document.querySelector('input[data-cart-item-id="'+cart_item_id+'"]').value
234 sendCode(elem, code, "saso_eventtickets_request_name_per_ticket");
235 }
236 })
237 */
238 .removeAttr('disabled');
239
240 $('body').find('input[data-input-type="text"][data-plugin="event"]')
241 .on('paste', event=>{
242 isStoring = false;
243 let elem = $(event.srcElement);
244 let code = (event.clipboardData || window.clipboardData).getData('text');
245 if (typeof code == "string") {
246 code = code.trim();
247 isChanged = true;
248 sendCode(elem, code, "saso_eventtickets_request_name_per_ticket");
249 } else { alert("no text"); }
250 })
251 .on('change',function(){
252 let elem = $(this);
253 let code = elem.val().trim();
254 isChanged = true;
255 sendCode(elem, code, "saso_eventtickets_request_name_per_ticket");
256 })
257 .removeAttr('disabled');
258
259 $('body').find('input[data-input-type="value"][data-plugin="value"]')
260 .on('paste', event=>{
261 isStoring = false;
262 let elem = $(event.srcElement);
263 let code = (event.clipboardData || window.clipboardData).getData('text');
264 if (typeof code == "string") {
265 code = code.trim();
266 isChanged = true;
267 sendCode(elem, code, "saso_eventtickets_request_value_per_ticket");
268 } else { alert("no text"); }
269 })
270 .on('change',function(){
271 let elem = $(this);
272 let code = elem.val().trim();
273 isChanged = true;
274 sendCode(elem, code, "saso_eventtickets_request_value_per_ticket");
275 })
276 .removeAttr('disabled');
277
278 $('body').find('input[data-input-type="daychooser"][data-plugin="event"]')
279 .each((idx, input) => {
280 let elem_intern = $(input);
281 let dateFormat = elem_intern.attr('placeholder');
282 dateFormat = dateFormat != null ? dateFormat.trim() : '';
283 dateFormat = dateFormat ? dateFormat : 'YYYY-MM-DD';
284 dateFormat = 'YYYY-MM-DD';
285 elem_intern.attr('placeholder', __(dateFormat));
286 let data_offset_start = 0;
287 let data_offset_end = 0;
288 try {
289 data_offset_start = parseInt(elem_intern.attr('data-offset-start'));
290 } catch (error) {
291 //console.log(error);
292 }
293 if (elem_intern.attr('min') && elem_intern.attr('min').length > 0) {
294 data_offset_start = elem_intern.attr('min');
295 }
296 try {
297 data_offset_end = parseInt(elem_intern.attr('data-offset-end'));
298 } catch (error) {
299 //console.log(error);
300 }
301 if (elem_intern.attr('max') && elem_intern.attr('max').length > 0) {
302 data_offset_end = elem_intern.attr('max');
303 }
304 //let today = new Date();
305 //let start = new Date(today.getFullYear(), today.getMonth(), today.getDate() + data_offset_start);
306 //let end = new Date(today.getFullYear(), today.getMonth(), today.getDate() + data_offset_end);
307
308 elem_intern.datepicker({
309 dateFormat: 'yy-mm-dd',
310 //dateFormat: dateFormat,
311 showWeek: true,
312 firstDay: 1,
313 hideIfNoPrevNext : true,
314 minDate: data_offset_start,
315 maxDate: data_offset_end,
316 beforeShow: function(input, options) {
317 this._sasoevent_input_field = $(input);
318 },
319 beforeShowDay: function(date) { // https://api.jqueryui.com/datepicker/#option-beforeShow
320 let day = date.getDay();
321 let data_exclude_wdays = this._sasoevent_input_field.attr('data-exclude-wdays');
322 let selectable = true;
323 let cssClass = '';
324 let toolTipp = '';
325 if (data_exclude_wdays && data_exclude_wdays.length > 0) {
326 let excludedDays = data_exclude_wdays.split(',');
327 selectable = excludedDays.indexOf(day.toString()) == -1;
328
329 cssClass = selectable ? '' : 'ui-datepicker-unselectable';
330 toolTipp = selectable ? '' : __('This day is not selectable');
331 }
332 if (selectable) {
333 // check if the date is in the past
334 let today = new Date();
335 let y = date.getFullYear();
336 let m = date.getMonth() + 1;
337 let d = date.getDate();
338 let dateStr = y + '-' + (m < 10 ? '0' : '') + m + '-' + (d < 10 ? '0' : '') + d;
339 let todayStr = today.getFullYear() + '-' + (today.getMonth() + 1 < 10 ? '0' : '') + (today.getMonth() + 1) + '-' + (today.getDate() < 10 ? '0' : '') + today.getDate();
340 if (dateStr < todayStr) {
341 selectable = false;
342 cssClass = 'ui-datepicker-unselectable';
343 toolTipp = __('This day is not selectable');
344 }
345 }
346 if (selectable) {
347 let data_exclude_dates = this._sasoevent_input_field.attr('data-exclude-dates');
348 if (data_exclude_dates && data_exclude_dates.length > 0) {
349 let excludedDates = data_exclude_dates.split(',');
350 let y = date.getFullYear();
351 let m = date.getMonth() + 1;
352 let d = date.getDate();
353 let dateStr = y + '-' + (m < 10 ? '0' : '') + m + '-' + (d < 10 ? '0' : '') + d;
354 selectable = excludedDates.indexOf(dateStr) == -1;
355
356 cssClass = selectable ? '' : 'ui-datepicker-unselectable';
357 toolTipp = selectable ? '' : __('This day is not selectable');
358 }
359 }
360 return [selectable, cssClass, toolTipp];
361 //return [true, ''];
362 }
363 });
364 })
365 .on('change',event=>{
366 let elem_intern = $(event.target);
367
368 if (elem_intern.attr('data-is-shop-page') == "1") return; // only on cart and checkout page
369
370 //console.log('change datepicker', elem_intern.attr('id'));
371 let date_value = elem_intern.val().trim();
372 if (elem_intern.attr('data-previous-value') == date_value) return; // no change
373 elem_intern.attr('data-previous-value', date_value);
374 if (date_value) {
375 sendCode(elem_intern, date_value, "saso_eventtickets_request_daychooser");
376 isChanged = true;
377 let to_be_changed = [];
378 // update the other date pickers if no value is set to use this date
379 let data_cart_item_id = elem_intern.attr('data-cart-item-id');
380 $('body').find('input[data-input-type="daychooser"][data-plugin="event"][id^="saso_eventtickets_request_daychooser['+data_cart_item_id+']"]').each((idx, input_to_update) => {
381 //console.log('update datepicker', input_to_update);
382 let input_elem = $(input_to_update);
383 let v = input_elem.val().trim();
384 if (!v) {
385 //console.log(input_elem.attr("id")+' set value to: '+date_value);
386 input_elem.val(date_value); // is not working somehow, so skip this step for now. The value is shown and send to the server, but on the checkout the other fields are empty
387 to_be_changed.push(input_elem);
388 }
389 });
390
391 // remove the related error message on the cart
392 //let data_cart_item_count = elem.attr('data-cart-item-count');
393 //$('li[data-cart-item-id="'+data_cart_item_id+'"][data-cart-item-count="'+data_cart_item_count+'"]').remove();
394 // send data to the server
395
396 wait = 0;
397 to_be_changed.forEach(input => {
398 //console.log(input.attr("id")+'send code: '+date_value);
399 //console.log(input);
400 window.setTimeout(()=>{
401 sendCode(input, date_value, "saso_eventtickets_request_daychooser");
402 }, wait);
403 if (wait == 0) wait = 250;
404 });
405 } // end date_value
406 })
407 .removeAttr('disabled');
408
409 //addStyleCode('#ui-datepicker-div > table {background-color: white;}');
410 }
411
412 init();
413
414 return {
415 _addHandlerToTheCodeFields: _addHandlerToTheCodeFields,
416 };
417 }
418
419 (function($){
420 $(document).ready(function(){
421 window.SasoEventticketsValidator_WC_frontend = SasoEventticketsValidator_WC_frontend($, SasoEventticketsValidator_phpObject);
422 });
423 })(jQuery);