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); |