(function ($) { $(function () { // http://davidwalsh.name/javascript-debounce-function function debounce(func, wait, immediate) { var timeout; return function () { var context = this, args = arguments; var later = function () { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; }; /*____________________________________________________________________________________*/ class People{ constructor(selector, template, data){ this.selector = selector; this.data = data; this.template = template; // this.sample_people = { // login: '01515b52-6936-46b2-a000-9ad4cd7a5b50', // firstname: "first", // lastname: "last", // phone: '041122221', // email: 'abc@gmail.com', // pay: 0, // hour: 12, // OT: 3, // petrol: 50, // rating: 1, // }; this.load_data(this.data); } load_data(data){ var template = $(this.template).html(); var html = Mustache.render(template, data); $(this.selector).html(html); //save it $(this.selector).data(data); //draw rating star this.set_ratings(this.data.rating); this.set_unconfirmed_job(this.data.unconfirmedjob); } set_ratings(num){ for (var i=1; i<= 5; i++){ if (i <=num){ $(this.selector + " div[name='rating'] span:nth-child(" +i+ ")").addClass('checked'); }else{ $(this.selector + " div[name='rating'] span:nth-child(" +i+ ")").removeClass('checked'); } } this.data.rating = num; } set_unconfirmed_job(num){ if( num == 0 ) $(this.selector + " span[name='badge']").hide(); else $(this.selector + " span[name='badge']").show(); this.data.unconfirmedjob = num; } }//end of class People function bts_staff_html(data){ var template = $('#staff_item').html(); var head = '
'; r = head + '
' ; return r; } function bts_client_html(data){ var template = $('#client_item').html(); var head = '
'; r = head + '
' ; return r; } function sample_staff(){ for (var i=1; i<100; i++){ var sample_people = { login: '01515b52-6936-46b2-a000-9ad4cd7a5b50' +i, firstname: "first"+i, lastname: "last", mobile: '041122221' +i, email: 'abc@gmail.com' + i, wages: 0, hour: i, OT: 3, petrol: 50 +i, rating: Math.floor(Math.random() * Math.floor(5)), unconfirmedjob: Math.floor(Math.random() * Math.floor(30)), }; var html = bts_staff_html(sample_people); jQuery('div.stafflist').append(html); new People("#p" + sample_people.login, sample_people); } } function list_staff() { show_loading_staff(); $('div.stafflist div.peopleitem').remove(); $.post(bts().ajax_url, { // POST request _ajax_nonce: bts().nonce, // nonce action: "list_staff", // action }, function(response, status, xhr){ if (response.status =='success'){ hide_loading_staff(); response.users.forEach(function(u){ var html = bts_staff_html(u); jQuery('div.stafflist').append(html); new People("#p" + u.login,'#staff_item', u); }); }else{ alert('error getting staff list'); } }); } function list_clients() { show_loading_client(); $('div.clientlist div.peopleitem').remove(); //clear it $.post(bts().ajax_url, { // POST request _ajax_nonce: bts().nonce, // nonce action: "list_client", // action }, function(response, status, xhr){ if (response.status =='success'){ response.users.forEach(function(u){ hide_loading_client(); var html = bts_client_html(u); jQuery('div.clientlist').append(html); new People("#p" + u.login, '#client_item' ,u); }); }else{ alert('error getting Client list'); } }); } function show_loading_staff(){ jQuery('div.stafflist img').attr('src', bts().load_user_img).show(); } function show_loading_client(){ jQuery('div.clientlist img').attr('src', bts().load_user_img).show(); } function hide_loading_staff(){ jQuery('div.stafflist img').hide();; } function hide_loading_client(){ jQuery('div.clientlist img').hide(); } function xero(t){ if (t) $('div.xero i').show(); else $('div.xero i').hide(); } function wifi(t){ if (t) $('div.wifi i').show(); else $('div.wifi i').hide(); } function init_user_search(){ $('div.b_search input').keyup(debounce(function(e){ filter_user(e.target); }, 500)); } function filter_user(input){ var value = $(input).attr('value'); value = value.toLowerCase(); var selector = get_selector_for_filter_people(input); $.each( $(selector).find('div.peopleitem'), function(index, e){ var html = $(e).find('div[name="title"] a').html(); html = html.toLowerCase(); if (-1 != html.indexOf(value)){//we find it; $(e).show(); }else{ $(e).hide(); } }); } function get_selector_for_filter_people(input){ var selector=''; var role = $(input).attr('placeholder'); if (role == 'staff') //we filter staff selector = 'div.stafflist'; else if (role = 'client') selector = 'div.clientlist'; return selector; } function init_ts(){ list_staff(); list_clients(); xero(false); wifi(false); init_user_search(); ajax_earning_rate(); } function ajax_earning_rate(){ $.post(bts().ajax_url, { // POST request _ajax_nonce: bts().nonce, // nonce action: "earnings_rate", // action }, function(response, status, xhr){ bts().earnings_rate = response; console.log("%o", bts().earnings_rate); }); } init_ts(); $(document).on('click', 'div.divTableHead.bdelete', function(){ for (var i=1; i<10; i++){ var o = new Job({i:i}); } }); $(document).on('click', 'div.divTableCell.bdelete', function(){ if (confirm('delete this job?')) $(this).closest('div.divTable').remove(); }); $(document).on('mouseenter', 'div.divTableCell', function(){ $(this).closest('div.divTable').addClass('highlight'); }); $(document).on('mouseleave', 'div.divTableCell', function(){ $(this).closest('div.divTable').removeClass('highlight'); }); $(document).on('click', 'span.ticon.ticon-save', function(){ var table = $(this).closest('div.divTable') table.data().job.do_save_record(); }); class Job{ //save data for the record, and display it as GUI constructor(data){ var html = jQuery("#job_item").html(); this.el = $(html); jQuery('div.workspace').append(this.el); this.load_data(data); dtp_init(); } load_data(data) { this.set_job_id(data.id); this.set_tos(data.tos); this.set_start(data.start); this.set_finish(data.finish); this.set_rate(data.rate); this.set_staff(data.staff); this.set_client(data.client); this.set_ack(data.ack); //save to html element this.data = data; this.el.data({job:this, data:data}); } get_job_id(){ return this.el.find('input[name="id"]').attr('value'); } set_job_id(val){ return this.el.find('input[name="id"]').attr('value', val); } get_tos() { return this.el.find('div.btos select').children("option:selected").val(); } set_tos(val) { if (typeof(val) =="undefined") return; this.el.find('div.btos select option[value="'+val+'"]').prop('selected',true); } get_start(){ return this.el.find('div.bstart input').attr('value'); } set_start(val) { if (typeof(val) =="undefined") return; this.el.find('div.bstart input').attr('value', val); } get_finish() { return this.el.find('div.bfinish input').attr('value'); } set_finish(val) { if (typeof(val) == "undefined") return; this.el.find('div.bfinish input').attr('value', val); } get_rate() { return this.el.find('div.brate select').children("option:selected").val(); } set_rate(val) { if (typeof(val) =="undefined") return; this.el.find('div.brate select option[value="'+val+'"]').prop('selected',true); } get_staff() { return this.el.find('div.bstaff select').children("option:selected").val(); } set_staff(val) { if (typeof(val) =="undefined") return; this.el.find('div.bstaff select option[value="'+val+'"]').prop('selected',true); } get_client() { return this.el.find('div.bclient select').children("option:selected").val(); } set_client(val) { if (typeof(val) =="undefined") return; this.el.find('div.bclient select option[value="'+val+'"]').prop('selected',true); } get_ack() { return this.el.find('div.bconfirmed input:checked').length > 0; } set_ack(val) { if (typeof(val) =="undefined") return; return this.el.find('div.bconfirmed input').prop('checked', val!=0); } get_record_from_ui(){ var record = {}; record.id = this.get_job_id(); record.tos = this.get_tos(); record.start = this.get_start(); record.finish = this.get_finish(); record.rate = this.get_rate(); record.staff = this.get_staff(); record.client = this.get_client(); record.ack = this.get_ack(); return record; } do_save_record(){ var self = this; $.post(bts().ajax_url, { // POST request _ajax_nonce: bts().nonce, // nonce action: "save_job", // action record: this.get_record_from_ui(), }, function(response, status, xhr){ console.log("response for save %o", response); self.load_data(response.newdata); }); } }//end of class Job //global GUI summary function get_wages() { var txt = $('div.wages div').html(); return parseInt(txt); } function set_wages(num){ $('div.wages div').html(num); } function set_working_hours(num){ $('input#woh').attr('value', num); } function get_working_hours(){ var txt = $('input#woh').attr('value'); return parseFloat(txt); } //modal box function set_modal_title(selector, title){ var s = 'div.'+ selector +' .ult_modal-title'; $(s).html(title); } function set_modal_content(selector, content){ var s = 'div.'+ selector +' div.ult_modal-body.ult-html'; $(s).html(content); } set_modal_title('abcdefg', 'suck title'); set_modal_content('abcdefg', 'fucking details'); /*________________________________________________________________________*/ }); })(jQuery); /*______________scrolling______________________________________________*/ jQuery(document).ready(function(){ var timeoutid =0; jQuery('button.peoplelist[name="down"]').mousedown(function(){ var button = this; timeoutid = setInterval(function(){ //console.log("down scrotop %d ", jQuery(button).parent().find(".userlist").get(0).scrollTop ); jQuery(button).parent().find(".userlist").get(0).scrollTop +=240; }, 100); }).on('mouseup mouseleave', function(){ clearTimeout(timeoutid); }); jQuery('button.peoplelist[name="up"]').mousedown(function(){ var button = this; timeoutid = setInterval(function(){ //console.log("up scrotop %d ", jQuery(button).parent().find(".userlist").get(0).scrollTop ); jQuery(button).parent().find(".userlist").get(0).scrollTop -=240; }, 100); }).on('mouseup mouseleave', function(){ clearTimeout(timeoutid); }); });