var editors = []; var rows = {}; function initializeRoutes() { router('/login', routes['login']); router('/logout', routes['logout']); router('/sd', routes['sd']); router('/', routes['login']); router('*', routes['login']); } //add a 'firstLoad' setup function into the route's middleware chain var routes = { login: function() { showPage('login'); }, logout: function() { $.post('api/logout.php'); router('/'); }, sd: function() { showPage('sd'); loadAllData(); } }; function showPage(page) { console.log('show page', page); var $page_old = $('.screen.active'); var $page_new = $('#screen-' + page); //do nothing if we are already on the page if($page_old.is($page_new)) return; $('body').attr('class', 'screen-' + page); //put new page on top of old $page_new.insertAfter('.screen.active'); //slide it to the right while crossfading $page_old .one('animationend', function(event) //jshint ignore:line, unused { $(this).hide(); }) //TODO: add detect webkitanimationend or animationend .removeClass('active'); //slide from left while crossfading $page_new .show() .off('animationend') .addClass('active') .focus(); //this needs to be used in conjunction with a "tabindex" field on the html object to maintain keyboard focus } function loadAllData() { console.log('requesting data'); $.get('api/getRows.php', 'json') .done(function(companies) { console.log('received data'); //go through each company and add a tab if one isn't present if(!companies.length) return; for(var c = 0; c < companies.length; c++) { var company = companies[c]; var id_company = company['id_company']; if(company['file_rows']) for(var r = 0; r < company['file_rows'].length; r++) { var id_file_row = company['file_rows'][r]['id_file_row']; rows[id_file_row] = company['file_rows'][r]; } drivers_by_company[id_company] = {} for(var i = 0; company['drivers'] && i < company['drivers'].length; i++) { var driver = company['drivers'][i]; var id_driver = driver['id_driver']; drivers_by_company[id_company][id_driver] = driver; } //if the company's tab doesn't exist, create it if(!tables[id_company]) { //add tab $('
  • ' + company['name'] + '
  • ') .data('id_company', id_company) .insertBefore('#audit-tab-parent'); //add table $('
    ' + '
    ' + '' + '
    ') .appendTo('#screen-sd .tab-content'); $('

    ' + company['name'] + '

    ' + '
    ') .appendTo('#audit-content'); //create the datatable tables[id_company] = createTable(id_company, '#screen-sd #table-' + id_company); table_updates[id_company] = createUpdatesTable(id_company, '#screen-sd #table-updates-' + id_company); } else { tables[id_company].clear(); table_updates[id_company].clear(); } //load the data into the data tables[id_company].rows.add(company['file_rows']).draw(); table_updates[id_company].rows.add(company['row_updates']).draw(); } if($('#screen-sd ul.nav-tabs > li.active').length === 0) $('#screen-sd ul.nav-tabs > li:eq(0) a').click(); }) .fail(function(err, xhr, text) { console.error(err['responseText']); }); } function loadCompanies() { $.post('api/getCompanies.php') .done(function(response) { }) .fail(function(err, xhr, text) { console.error(err.responseText); }); } function createTable(id_company, table_dom) { var table = $(table_dom).DataTable( { 'data': [], 'order': [[0, 'row_number']], 'columns': [ { 'title': 'Division', 'data': 'division', 'defaultContent': '', 'className': 'division' }, { 'title': 'Consignee', 'data': 'consignee', 'defaultContent': '', 'className': 'consignee' }, { 'title': 'Called In', 'data': 'date_called_in', 'defaultContent': '', 'className': 'date_called_in' }, { 'title': 'Dispatch #', 'data': 'dispatch_number', 'defaultContent': '', 'className': 'dispatch_number' }, { 'title': 'Shipper', 'data': 'shipper', 'defaultContent': '', 'className': 'shipper' }, { 'title': 'Ready', 'data': 'date_ready', 'defaultContent': '', 'className': 'date_ready' }, { 'title': 'Driver', 'data': 'id_driver', 'defaultContent': '', 'className': 'id_driver', 'render': function(data, type, row) { var id_driver = row['id_driver']; if(!id_driver) return ''; return drivers_by_company[id_company][id_driver]['name']; } }, { 'title': 'Trailer', 'data': 'trailer', 'defaultContent': '', 'className': 'trailer' }, { 'title': 'Address 1', 'data': 'address_1', 'address_1': '', 'className': 'address_1' }, { 'title': 'Address 2', 'data': 'address_2', 'address_2': '', 'className': 'address_2' }, { 'title': 'City', 'data': 'city', 'defaultContent': '', 'className': 'city' }, { 'title': 'State', 'data': 'state', 'defaultContent': '', 'className': 'state' }, { 'title': 'Zip', 'data': 'zip', 'defaultContent': '', 'className': 'zip' }, { 'title': 'Phone', 'data': 'phone', 'defaultContent': '', 'className': 'phone' }, { 'title': 'Ready Time', 'data': 'time_ready', 'defaultContent': '', 'className': 'time_ready' }, { 'title': 'Close Time', 'data': 'time_close', 'defaultContent': '', 'className': 'time_close' }, { 'title': 'Authorization #', 'data': 'dispatch_reference', 'defaultContent': '', 'className': 'dispatch_reference' }, { 'title': 'Ctns', 'data': 'ctns', 'defaultContent': '', 'className': 'ctns' }, { 'title': 'Weight', 'data': 'weight', 'defaultContent': '', 'className': 'weight' }, { 'title': 'Cube', 'data': 'cube', 'defaultContent': '', 'className': 'cube' }, { 'title': 'Pickup Time', 'data': 'time_pickup', 'defaultContent': ' ', 'className': 'time_pickup' }, { 'title': 'Depart Time', 'data': 'time_depart', 'defaultContent': ' ', 'className': 'time_depart' }, { 'title': 'BOL Delivered', 'data': 'bol_delivered', 'defaultContent': ' ', 'className': 'bol_delivered' }, { 'title': 'Acknowledged', 'data': 'date_processed', 'defaultContent': ' ', 'className': 'date_processed' }, { 'title': '', 'data': 'date_canceled', 'defaultContent': ' ', 'className': 'date_canceled', 'render': function(data, type, row) { //if the row is already completed, then don't show any buttons if(row.time_pickup && row.time_depart && row.bol_delivered) return ''; //if it's been canceled, show the restore button if(row.date_canceled) return ''; //show the cancel button return ''; } } ], 'language': { 'search': '', 'searchPlaceholder': "Search Active" }, 'deferRender': true, 'lengthChange': false, 'scrollX': true, 'fixedColumns': { 'leftColumns': 0, 'rightColumns': 5 }, 'pageLength': 200, /* 'buttons': [{ text: 'Completed', action: function(e, dt, node, config) { $(e.currentTarget).toggleClass('checked'); if($(e.currentTarget).hasClass('checked')) { } dt.draw(); } }], 'dom': 'Bfrtip' */ }); var driver_options = [ { "value": "", "label": "None" }]; for(var id_driver in drivers_by_company[id_company]) { var driver = drivers_by_company[id_company][id_driver]; driver_options.push( { "value": id_driver, "label": driver.name }); } var editor = new $.fn.dataTable.Editor( { idSrc: 'id_file_row', table: table_dom, fields: [{ label: "Pickup Time:", name: "time_pickup", type: "datetime", format: 'MM/DD/YYYY hh:mm A' }, { label: "Depart Time:", name: "time_depart", type: "datetime", format: 'MM/DD/YYYY hh:mm A' }, { label: "BOL Delivered:", name: "bol_delivered", type: "datetime", format: 'MM/DD/YYYY hh:mm A' }, { label: "Trailer:", name: "trailer", type: "text" }, { label: "Driver:", name: "id_driver", type: "select", options: driver_options }], ajax: function(method, url, d, success, error) { if(d['action'] === 'edit') { //just get the first row var id_file_row; for(id_file_row in d['data']); var row_partial = d['data'][id_file_row]; var properties_auditable = ['time_pickup', 'time_depart', 'bol_delivered']; var is_auditable = false; //go thru all the properties on the object for(var property in row_partial) { var value = row_partial[property]; //update our master record rows[id_file_row][property] = value; //check if this is an auditable property if(properties_auditable.indexOf(property) !== -1) is_auditable = true; } if(is_auditable) { //send the update up to the server thru api $.post('api/createRowUpdate.php?id_file_row=' + id_file_row, row_partial) .done(function(response) { console.log(response); //report to the datatable a full updated row success({ "data": [ rows[id_file_row] ] }); }) .fail(function(err, xhr, text) { console.log(err['responseText']); //TODO: handle error }); } else { $.post('api/updateRowImmediate.php?id_file_row=' + id_file_row, row_partial) .done(function(response) { console.log(response); //report to the datatable a full updated row success({ "data": [ rows[id_file_row] ] }); }) .fail(function(err, xhr, text) { console.log(err['responseText']); }); } } } }); //attach the editor $(table_dom).on('click', 'td.time_pickup', function(e) { editor.bubble(this, 'time_pickup'); }); $(table_dom).on('click', 'td.time_depart', function(e) { editor.bubble(this, 'time_depart'); }); $(table_dom).on('click', 'td.bol_delivered', function(e) { editor.bubble(this, 'bol_delivered'); }); $(table_dom).on('click', 'td.id_driver, td.trailer', function(e) { editor.bubble(this, ['trailer', 'id_driver']); }); $(table_dom).on('click', 'td.date_canceled button.cancel', function(e) { var row = table.row($(this).closest('tr')).data(); var id_file_row = row.id_file_row; if(confirm('Are you sure you want to cancel that row?')) { $.post('api/updateRowImmediate.php?id_file_row=' + id_file_row, { date_canceled: 1 }) .done(function(response) { row.date_canceled = new Date(); table.rows().invalidate('data').draw(false); }) .fail(function(err, xhr, text) { console.log(err['responseText']); }); } }); $(table_dom).on('click', 'td.date_canceled button.restore', function(e) { var row = table.row($(this).closest('tr')).data(); var id_file_row = row.id_file_row; if(confirm('Are you sure you want to restore that canceled row?')) { $.post('api/updateRowImmediate.php?id_file_row=' + id_file_row, { date_canceled: 0 }) .done(function(response) { row.date_canceled = null; table.rows().invalidate('data').draw(false); }) .fail(function(err, xhr, text) { console.log(err['responseText']); }); } }); /* $(table_dom).on('click', 'td.time_pickup, td.time_depart, td.bol_delivered', function(e) { editor.bubble(this, [ 'time_pickup', 'time_depart', 'bol_delivered' ]); }); */ return table; } function createUpdatesTable(id_company, table_dom) { var table = $(table_dom).DataTable( { 'data': [], 'order': [[0, 'date_modified']], 'columns': [ { 'title': 'Date', 'data': 'date_modified', 'defaultContent': ' ', 'className': 'date_modified' }, { 'title': 'User', 'data': 'user_name', 'defaultContent': ' ', 'className': 'user_name' }, { 'title': 'Dispatch #', 'data': 'dispatch_number', 'defaultContent': '', 'className': 'dispatch_number' }, { 'title': 'Authorization #', 'data': 'dispatch_reference', 'defaultContent': '', 'className': 'dispatch_reference' }, { 'title': 'Pickup Time', 'data': 'time_pickup', 'defaultContent': ' ', 'className': 'time_pickup' }, { 'title': 'Depart Time', 'data': 'time_depart', 'defaultContent': ' ', 'className': 'time_depart' }, { 'title': 'BOL Delivered', 'data': 'bol_delivered', 'defaultContent': ' ', 'className': 'bol_delivered' } ], 'language': { 'search': '', 'searchPlaceholder': "Search Updates" }, 'deferRender': true, 'lengthChange': false }); return table; }