var evacjs = { getLastPartOfUrl: function () { return location.href.substr(location.href.lastIndexOf("/") + 1); }, getUrlParameters: function (isInitialLoad) { var accountedValues = (function () { var a = ''; $(".accounted-check:checked").each(function () { a += this.value + ','; }); return a; })(); var attendanceValues = (function () { var a = ''; $(".attendancetype-check:checked").each(function () { a += this.value + ','; }); return a; })(); var groupDataValues = (function () { var a = ''; $(".groupdata-check:checked").each(function () { a += this.value + ','; }); return a; })(); groupDataValues = groupDataValues.replace(/,\s*$/, ""); var urlParameters = '' + '?id=' + evacjs.getLastPartOfUrl() + '&showPhotos= ' + $('.chkShowPhotos').prop('checked') + '&accounted=' + accountedValues + '&attendanceTypes=' + attendanceValues + '&groupData=' + groupDataValues + '&isInitialLoad=' + isInitialLoad; return urlParameters; }, run: function () { var urlParameters = evacjs.getUrlParameters(false); if (urlParameters) { var url = '/evac/data' + urlParameters; var table = $('#evac').DataTable(); table.ajax.url(url).load(); evacjs.home.reloadTable(); } }, findOne: function (haystack, arr) { return arr.some(function (v) { return haystack.indexOf(v) >= 0; }); }, onlyUnique: function (value, index, self) { return self.indexOf(value) === index; }, home: { attendanceTypes: [], groupDatas: [], templateattendancetype: $('#templateattendancetype').html(), modalattendancetype$: $('#modalattendancetype'), templatecompany: $('#templatecompany').html(), modalcompany$: $('#modalcompany'), evacStartup: function () { toastr.options = { "preventDuplicates": true }; $('#accounted-header').click(function () { $('#accounted-modal').modal('show'); }); $('#attendancetype-header').click(function () { $('#attendancetype-modal').modal('show'); }); $('#company-header').click(function () { $('#groupdata-modal').modal('show'); }); $('.chkShowPhotos').change(function () { evacjs.run(); }); $('#select_allGroup').click(function () { var c = this.checked; $('.groupdata-check').prop('checked', c); if (c) { $("#company-header").removeClass('filteredColumnHeader'); } else { $("#company-header").addClass('filteredColumnHeader'); } evacjs.run(); }); $('#select_allAttendanceType').click(function () { var c = this.checked; $('.attendancetype-check').prop('checked', c); if (c) { $("#attendancetype-header").removeClass('filteredColumnHeader'); } else { $("#attendancetype-header").addClass('filteredColumnHeader'); } evacjs.run(); }); var url = "/evac/data" + evacjs.getUrlParameters(true); evacjs.home.table = $('#evac').DataTable({ language: { "emptyTable": "No data", "processing": "Loading..." }, dom: '<"row"<"col-md-9"B><"col-md-3"f>><"row"<"col-md-12"t>>', bInfo: false, bPaginate: false, pageLength: 9999, serverSide: true, processing: true, ajax: { url: url, type: 'POST' }, initComplete: evacjs.home.initialLoadComplete, drawCallback: evacjs.home.addEvents, deferRender: true, order: [2, 'asc'], rowId: 'EvacuationRegisterID', "createdRow": function (row, data, dataIndex) { if (data['AccountedOn'] != null) { $(row).addClass('bg-success'); } else { $(row).removeClass('bg-success'); } }, columns: [ { data: "Thumb", searchable: false, render: function (data, type, attendance) { var imgTag = ""; if (attendance.Thumb == null) { imgTag = ""; } return imgTag; } }, { data: "FirstName", render: function (data, type, row) { return "
" + row.FirstName + "
"; } }, { data: "LastName", render: function (data, type, row) { return "
" + row.LastName + "
"; } }, { data: "DateTimeIn", render: function (data, type, row) { return moment(row.DateTimeIn).format('HH:mm'); } }, { data: 'VehicleRegistration' }, { data: 'ContactNumber' }, { data: 'Visiting' }, { data: 'GroupData' }, { data: 'AttendanceType' }, { data: "AccountedOn", render: function (data, type, row) { return "" } }, ], columnDefs: [ { targets: 0, width: '60px', sorting: false, orderable: false }, { targets: 1, width: '15%' }, { targets: 2, width: '15%' }, { targets: 3, width: '45px' }, { targets: 4, width: '45px' }, { targets: 5, width: '45px' }, { targets: 6, width: '80px' }, { targets: 7, width: '80px', sorting: false, orderable: false }, { targets: 8, width: '80px', sorting: false, orderable: false }, { targets: 9, width: '85px', sorting: false, orderable: false } ], buttons: [ { text: 'Show photos', action: function (e, dt, node, config) { $('.chkShowPhotos').click(); var showPhotos = $('.chkShowPhotos').prop('checked'); if (showPhotos) { $('.btn-showphoto').removeClass('btn-success'); $('.btn-showphoto').addClass('btn-danger'); $('.btn-showphoto').text('Hide photos'); } else { $('.btn-showphoto').removeClass('btn-danger'); $('.btn-showphoto').addClass('btn-success'); $('.btn-showphoto').text('Show photos'); } }, className: 'btn btn-spaced btn-sm btn-showphoto btn-success btn-filter' }, { text: 'Clear filters', action: function (e, dt, node, config) { evacjs.home.clearFilters(); }, className: 'btn btn-danger btn-spaced btn-sm btn-filter btn-clearfilter' }, { text: 'Simple', action: function (e, dt, node, config) { var url = window.location.toString(); window.location = url.replace('Report', 'Simple'); }, className: 'btn btn-primary btn-spaced btn-sm' } ] }); console.log("evacStartup() running"); var hub = $.connection.signalRHub; console.log("SignalR hub proxy:", hub ? "OK" : "MISSING"); // Function that the hub can call back. hub.client.refreshDataTables = function () { console.log("SignalR: refreshDataTables received"); evacjs.home.table.ajax.reload(evacjs.home.reloadTable); }; hub.client.logFromServer = function (msg) { console.log("SERVER:", msg); }; hub.client.refreshDataTables = function () { console.log("RECEIVED refreshDataTables"); evacjs.home.table.ajax.reload(evacjs.home.reloadTable); }; // Start the connection. $.connection.hub.start() .done(function () { var siteID = evacjs.getLastPartOfUrl().toLowerCase(); console.log("SignalR: connected; joining group:", siteID); hub.server.joinGroup(siteID) .done(function () { console.log("SignalR: joined group:", siteID); }) .fail(function (e) { console.error("SignalR: joinGroup failed:", e); }) }) .fail(function (err) { console.error("SignalR start failed:", err); console.error("SignalR: start failed:", err); }); //$.connection.hub.start(function () { // var siteID = evacjs.getLastPartOfUrl(); // hub.server.joinGroup(siteID); //}).done(); }, initialLoadComplete: function () { evacjs.home.reloadTable(); $('#select_allGroup').prop('checked', true); $('#select_allAttendanceType').prop('checked', true); $('.attendancetype-check').prop('checked', true); $('.groupdata-check').prop('checked', true); $('.accounted-check').prop('checked', true); $("#company-header").removeClass('filteredColumnHeader'); $("#accounted-header").removeClass('filteredColumnHeader'); $("#attendancetype-header").removeClass('filteredColumnHeader'); $('.accounted-check').change(function () { evacjs.home.checkSelectAllAccountedStatus(); evacjs.run(); }); $('.attendancetype-check').change(function () { evacjs.home.checkSelectAllAttendanceStatus(); evacjs.run(); }); $('.groupdata-check').change(function () { evacjs.home.checkSelectAllGroupStatus(); evacjs.run(); }); $('.btn-clearfilter').prop('disabled', true); }, addEvents: function () { $('.cbUpdate').on('click', function (e) { e.stopPropagation(); var id = this.id; evacjs.home.rowUpdate(id, this.checked); }); $('#evac tbody tr').on('click', function () { let accountedCb = $(this).find('.cbUpdate'); accountedCb.prop('checked', !accountedCb.prop("checked")); evacjs.home.rowUpdate(accountedCb.prop('id'), accountedCb.prop("checked")); }); }, rowUpdate: function (id, checked) { // instant visual changes compared to createdRow if (checked) { $('#' + id).addClass('bg-success'); } else { $('#' + id).removeClass('bg-success'); } $.ajax({ url: "/api/evac/update?id=" + id + "&flag=" + checked, method: "post", traditional: true }).done(function () { evacjs.home.updateCounts(); }).fail(function (e) { toastr.error("Something unexpected happened"); }); }, reloadTable: function () { evacjs.home.updateCounts(); evacjs.home.updateModals(); }, clearFilters: function () { $('#select_allGroup').prop('checked', true); $('#select_allAttendanceType').prop('checked', true); $('.attendancetype-check').prop('checked', true); $('.accounted-check').prop('checked', true); $('.groupdata-check').prop('checked', true); $("#company-header").removeClass('filteredColumnHeader'); $("#accounted-header").removeClass('filteredColumnHeader'); $("#attendancetype-header").removeClass('filteredColumnHeader'); $('.btn-clearfilter').prop('disabled', true); evacjs.run(); }, updateCounts: function () { var counts; $.ajax({ url: '/api/evac/getevacinfo?siteid=' + evacjs.getLastPartOfUrl(), type: "GET", async: false, success: function (result) { counts = result; $('#totalCount').text(counts.total); $('#accountedCount').text(counts.accounted); $('#missingCount').text(counts.missing); }, error: function (result) { console.log(result); } }); }, checkSelectAllAccountedStatus: function () { var accountedLength = $('.accounted-check').filter(':checked').length; if (accountedLength == $('.accounted-check').length || accountedLength == 0) { $('#accounted').prop('checked', true); $('#missing').prop('checked', true); $("#accounted-header").removeClass('filteredColumnHeader'); $('.btn-clearfilter').addClass('btn-danger'); } else { $("#accounted-header").addClass('filteredColumnHeader'); $('.btn-clearfilter').attr('disabled', false); } }, checkSelectAllAttendanceStatus: function () { if ($('.attendancetype-check').filter(':checked').length == $('.attendancetype-check').length) { $('#select_allAttendanceType').prop('checked', true); $("#attendancetype-header").removeClass('filteredColumnHeader'); $('.btn-clearfilter').addClass('btn-danger'); } else { $('#select_allAttendanceType').prop('checked', false); $("#attendancetype-header").addClass('filteredColumnHeader'); $('.btn-clearfilter').attr('disabled', false); } }, checkSelectAllGroupStatus: function () { if ($('.groupdata-check').filter(':checked').length == $('.groupdata-check').length) { $('#select_allGroup').prop('checked', true); $("#company-header").removeClass('filteredColumnHeader'); $('.btn-clearfilter').attr('disabled', true); $('.btn-clearfilter').addClass('btn-danger'); } else { $('#select_allGroup').prop('checked', false); $("#company-header").addClass('filteredColumnHeader'); $('.btn-clearfilter').attr('disabled', false); } }, updateModals: function () { $.ajax({ url: '/api/evac/getdistinctgroupdata?siteid=' + evacjs.getLastPartOfUrl(), type: "GET", async: false, success: function (result) { evacjs.home.groupDatas = result; }, error: function (result) { console.log(result); } }); $.ajax({ url: '/api/evac/getdistinctattendancetypedata?siteid=' + evacjs.getLastPartOfUrl(), type: "GET", async: false, success: function (result) { evacjs.home.attendanceTypes = result; } }); // get current check status of modal items var attendanceTypeChecked = $(".attendancetype-check:checked").map(function () { return $(this).val(); }).toArray(); var attendanceTypeNotChecked = $(".attendancetype-check:not(:checked)").map(function () { return $(this).val(); }).toArray(); var groupDataNotChecked = $(".groupdata-check:not(:checked)").map(function () { return $(this).val(); }).toArray(); var groupDataChecked = $(".groupdata-check:checked").map(function () { return $(this).val(); }).toArray(); evacjs.home.modalattendancetype$.empty(); evacjs.home.modalcompany$.empty(); // add new var dataAT = evacjs.home.table.column(8).data().unique(); dataAT = dataAT.filter(function (e) { return e }); var currentAttendanceTypes = dataAT; for (var c = 0; c < evacjs.home.attendanceTypes.length; c++) { var temp = evacjs.home.templateattendancetype; var attendanceTypeName = evacjs.home.attendanceTypes[c]; var attendanceTypeID = attendanceTypeName.replace(/[^A-Z0-9]/ig, "_"); temp = temp.replace(/¬AttendanceTypeLabel/g, attendanceTypeName); temp = temp.replace(/¬AttendanceTypeID/g, 'AT_' + attendanceTypeID); evacjs.home.modalattendancetype$.append(temp); } var needsRefresh = false; for (var c = 0; c < evacjs.home.attendanceTypes.length; c++) { var attendanceTypeName = evacjs.home.attendanceTypes[c]; var attendanceTypeID = attendanceTypeName.replace(/[^A-Z0-9]/ig, "_"); if ($.inArray(attendanceTypeName, attendanceTypeChecked) > -1) { $("#AT_" + attendanceTypeID).attr('checked', true); } else { if ($.inArray(attendanceTypeName, currentAttendanceTypes) < 0) { if ($.inArray(attendanceTypeName, attendanceTypeNotChecked) < 0) { $("#AT_" + attendanceTypeID).attr('checked', true); needsRefresh = true; } else { $("#AT_" + attendanceTypeID).removeAttr('checked'); } } else { $("#AT_" + attendanceTypeID).removeAttr('checked'); } } } var currentGroupDatas = ["---Blank---"]; var data = evacjs.home.table.column(7).data().unique(); data = data.filter(function (e) { return e }); currentGroupDatas.push.apply(currentGroupDatas, data); for (var c = 0; c < evacjs.home.groupDatas.length; c++) { var temp = evacjs.home.templatecompany; var companyName = evacjs.home.groupDatas[c]; var companyID = companyName.replace(/[^A-Z0-9]/ig, "_"); temp = temp.replace(/¬CompanyLabel/g, companyName); temp = temp.replace(/¬CompanyID/g, 'GD_' + companyID); evacjs.home.modalcompany$.append(temp); } for (var c = 0; c < evacjs.home.groupDatas.length; c++) { var companyName = evacjs.home.groupDatas[c]; var companyID = companyName.replace(/[^A-Z0-9]/ig, "_"); if ($.inArray(companyName, groupDataChecked) > -1) { $("#GD_" + companyID).attr('checked', true); } else { if ($.inArray(companyName, currentGroupDatas) < 0) { if ($.inArray(companyName, groupDataNotChecked) < 0) { $("#GD_" + companyID).attr('checked', true); needsRefresh = true; } else { $("#GD_" + companyID).removeAttr('checked'); } } else { $("#GD_" + companyID).removeAttr('checked'); } } } $('.attendancetype-check').change(function () { evacjs.home.checkSelectAllAttendanceStatus(); evacjs.run(); }); $('.groupdata-check').change(function () { evacjs.home.checkSelectAllGroupStatus(); evacjs.run(); }); if (needsRefresh) { evacjs.run(); evacjs.home.checkSelectAllAttendanceStatus(); evacjs.home.checkSelectAllGroupStatus(); } }, } };