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();
}
},
}
};