$.each($.find("table"), function(index, element){
addFilterFields($(element).attr("id"));
});
var OverviewTable = $("#overview_table").DataTable({
dom: '<"container-fluid"<"row"<"col"l><"col"f>>>rt<"container-fluid"<"row"<"col"i><"col"p>>>',
aaData: [],
aoColumns: [
{
data: "case_id",
render: function (data, type, row, meta) {
if (type === 'display') {
data = ``;
} else if (type === 'sort' || type === 'filter') {
data = parseInt(row['case_id']);
}
return data;
}
},
{
"data": "name",
"render": function (data, type, row, meta) {
if (type === 'display') {
if (isWhiteSpace(data)) {
data = '#' + row['case_id'];
} else {
data = sanitizeHTML(data);
}
data = '' + data +'';
} else if (type === 'sort' || type === 'filter') {
data = sanitizeHTML(data);
}
return data;
}
},
{ "data": "client",
"render": function (data, type, row, meta) {
if (type === 'display') {
data = sanitizeHTML(data.customer_name);
} else if (type === 'sort' || type === 'filter') {
data = sanitizeHTML(data.customer_name);
}
return data;
}
},
{
"data": "classification",
"render": function (data, type, row, meta) {
if (type === 'display' && data != null) {
data = sanitizeHTML(data.name);
} else if (data != null && (type === 'sort' || type === 'filter')) {
data = data.name;
}
return data;
}
},
{
"data": "state",
"render": function (data, type, row, meta) {
if (type === 'display' && data != null) {
let datar = sanitizeHTML(data.state_name);
let review_status = row['review_status'] ? row['review_status'].status_name : 'Not reviewed';
datar = `${datar} ${review_status === "Not reviewed"? '' : ' - ' + review_status}`;
if (data.state_name === 'Closed') {
datar = ` Closed - ${review_status}`;
}
return datar;
} else if (data != null && (type === 'sort' || type === 'filter')) {
let datar = sanitizeHTML(data.state_name);
let review_status = row['review_status'] ? row['review_status'].status_name : 'Not reviewed';
datar = `${datar} ${review_status === "Not reviewed"? '' : ' - ' + review_status}`;
if (data.state_name === 'Closed') {
datar = `Closed - ${review_status}`;
}
return datar;
} else {
return data;
}
}
},
{
"data": "tags",
"render": function (data, type, row, meta) {
if (type === 'display' && data != null) {
let output = '';
for (let index in data) {
let tag = sanitizeHTML(data[index].tag_title);
output += `${tag} `;
}
return output;
} else if (type === 'sort' || type === 'filter') {
let output = [];
for (let index in data) {
let tag = sanitizeHTML(data[index].tag_title);
output.push(tag);
}
return output;
}
return data;
}
},
{
"data": "case_open_since_days",
"render": function(data, type, row, meta) {
if (type === 'display') {
title = "You\'re not forgetting me, are you?";
if (data <= 1) {
data = `${data} day`;
}
else if (data <= 7) {
data = `${data} days`;
} else if (7 < data && data < 14) {
data = `${data} days`;
} else {
data = `${data} days`;
}
} else if (type === 'sort' || type === 'filter') {
data = parseInt(data);
}
return data;
}
},
{
"data": "open_date",
"render": function (data, type, row, meta) {
if (type === 'display' && data != null) {
data = sanitizeHTML(data);
}
return data;
}
},
{
"data": "tasks_status",
"render": function (data, type, row, meta) {
if (type === 'display' && data != null) {
now = (data.closed_tasks / (data.closed_tasks + data.open_tasks))*100;
if (data.closed_tasks + data.open_tasks > 1) {
tasks_text = `tasks`;
} else {
tasks_text = `task`;
}
data = `
${data.closed_tasks} / ${data.closed_tasks + data.open_tasks} ${tasks_text} done`;
} else if (data != null && (type === 'sort' || type === 'filter')) {
data = data.closed_tasks / (data.closed_tasks + data.open_tasks);
}
return data;
}
},
{
"data": "owner",
"render": function (data, type, row, meta) {
if (type === 'display' && data != null) {
sdata = sanitizeHTML(data.user_name);
data = `${get_avatar_initials(sdata, false, null, true)} ${sdata}
`;
} else if (type === 'filter' || type === 'sort') {
data = data.user_name;
}
return data;
}
}
],
filter: true,
info: true,
ordering: true,
processing: true,
retrieve: true,
lengthChange: true,
pageLength: 25,
searchBuilder: {
},
language: {
searchBuilder: {
add: "Add filter",
title: {
_: 'Filters (%d)',
0: '',
}
}
},
order: [[ 1, "asc" ]],
buttons: [
{ "extend": 'csvHtml5', "text":'Export',"className": 'btn btn-primary btn-border btn-round btn-sm float-left mr-4 mt-2' },
{ "extend": 'copyHtml5', "text":'Copy',"className": 'btn btn-primary btn-border btn-round btn-sm float-left mr-4 mt-2' },
],
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.childRow,
renderer: $.fn.dataTable.Responsive.renderer.tableAll()
}
},
select: true,
initComplete: function () {
tableFiltering(this.api(), 'overview_table', [0]);
},
drawCallback: function () {
$('.btn-quick-view').off('click').on('click', function() {
show_case_view($(this).data('index'));
});
}
});
OverviewTable.searchBuilder.container().appendTo($('#table_buttons'));
function get_cases_overview(silent, show_full=false) {
show_full = show_full || $('#overviewLoadClosedCase').prop('checked');
$('#overviewTableTitle').text(show_full ? 'All cases' : 'Open cases');
get_raw_request_api('/overview/filter?cid=' + get_caseid() + (show_full ? '&show_closed=true' : ''))
.done((data) => {
if(notify_auto_api(data, silent)) {
overview_list = data.data;
OverviewTable.clear();
OverviewTable.rows.add(overview_list);
OverviewTable.columns.adjust().draw();
$(".truncate").on("click", function() {
var index = $(this).index() + 1;
$('table tr td:nth-child(' + index + ')').toggleClass("truncate");
});
}
});
}
function show_case_view(row_index) {
let case_data = OverviewTable.row(row_index).data();
$('#caseViewModal').find('.modal-title').text(case_data.name);
$('#caseViewModal').find('.modal-subtitle').text(case_data.case_uuid);
let body = $('#caseViewModal').find('.modal-body .container');
body.empty();
// Owner Card
let owner_card = $('').addClass('card mb-3');
let owner_body = $('').addClass('card-body');
owner_body.append($('').addClass('card-title mb-2').text('Metadata'));
let owner_row = $('').addClass('row');
let owner_col1 = $('').addClass('col-md-6');
let owner_col2 = $('').addClass('col-md-6');
let timeSinceLastUpdateStr = '';
let modifications = case_data.modification_history;
if (modifications != null) {
let timestamps = Object.keys(modifications).map(parseFloat);
let lastUpdatedTimestamp = Math.max(...timestamps);
let currentTime = Date.now() / 1000; // convert to seconds
let timeSinceLastUpdate = currentTime - lastUpdatedTimestamp;
let timeSinceLastUpdateInSeconds = currentTime - lastUpdatedTimestamp;
let timeSinceLastUpdateInMinutes = timeSinceLastUpdate / 60;
let timeSinceLastUpdateInHours = timeSinceLastUpdateInMinutes / 60;
let timeSinceLastUpdateInDays = timeSinceLastUpdateInHours / 24;
if (timeSinceLastUpdateInSeconds < 60) {
timeSinceLastUpdateStr = `${Math.round(timeSinceLastUpdateInSeconds)} second(s) ago`;
} else if (timeSinceLastUpdateInMinutes < 60) {
timeSinceLastUpdateStr = `${Math.round(timeSinceLastUpdateInMinutes)} minute(s) ago`;
} else if (timeSinceLastUpdateInHours < 24) {
timeSinceLastUpdateStr = `${Math.round(timeSinceLastUpdateInHours)} hour(s) ago`;
} else {
timeSinceLastUpdateStr = `${Math.round(timeSinceLastUpdateInDays)} day(s) ago`;
}
} else {
timeSinceLastUpdateStr = 'Never';
}
let tagsStr = '';
for (let index in case_data.tags) {
let tag = sanitizeHTML(case_data.tags[index].tag_title);
tagsStr += `${tag} `;
}
let owner_dl1 = $('
');
owner_dl1.append($('').text('Owner:'));
owner_dl1.append($('').text(case_data.owner.user_name));
owner_dl1.append($('').text('Opening User:'));
owner_dl1.append($('').text(case_data.user.user_name));
owner_dl1.append($('').text('Open Date:'));
owner_dl1.append($('').text(case_data.open_date));
if (case_data.close_date != null) {
owner_dl1.append($('').text('Close Date:'));
owner_dl1.append($('').text(case_data.close_date))
}
owner_dl1.append($('').text('Tags:'));
owner_dl1.append($('').html(tagsStr !== ''? tagsStr : 'No tags'));
owner_dl1.append($('').text('State:'));
owner_dl1.append($('').text(case_data.state ? case_data.state.state_description: 'None'));
owner_dl1.append($('').text('Last update:'));
owner_dl1.append($('').text(timeSinceLastUpdateStr));
owner_col1.append(owner_dl1);
let owner_dl2 = $('
');
owner_dl2.append($('').text('Customer Name:'));
owner_dl2.append($('').text(case_data.client.customer_name));
owner_dl2.append($('').text('Classification:'));
owner_dl2.append($('').text(case_data.classification ? case_data.classification.name: 'None'));
owner_dl2.append($('').text('SOC ID:'));
owner_dl2.append($('').text(case_data.soc_id !== '' ? case_data.soc_id : 'None'));
owner_dl2.append($('').text('Related alerts:'));
owner_dl2.append($('').html(`${case_data.alerts.length} related alert(s) `));
owner_dl2.append($('').text('Tasks:'));
if (case_data.tasks_status != null) {
owner_dl2.append($('').html(`${case_data.tasks_status.closed_tasks}/${case_data.tasks_status.open_tasks + case_data.tasks_status.closed_tasks} task(s) `));
} else {
owner_dl2.append($('').text('No tasks'));
}
owner_dl2.append($('').text('Review:'));
if (case_data.review_status != null) {
owner_dl2.append($('').text(case_data.review_status.status_name));
} else {
owner_dl2.append($('').text('No review'));
}
owner_dl2.append($('').text('Reviewer:'));
if (case_data.reviewer != null) {
owner_dl2.append($('').text(case_data.reviewer.user_name));
} else {
owner_dl2.append($('').text('No reviewer'));
}
owner_col2.append(owner_dl2);
owner_row.append(owner_col1);
owner_row.append(owner_col2);
owner_body.append(owner_row);
owner_body.append(` View case`);
owner_card.append(owner_body);
body.append(owner_card);
// Description Card
let desc_card = $('').addClass('card mb-3');
let desc_body = $('').addClass('card-body');
desc_body.append($('').addClass('card-title mb-3').text('Summary'));
let converter = get_showdown_convert();
let html = converter.makeHtml(case_data.description);
desc_body.append($('').addClass('card-text').html(html));
desc_card.append(desc_body);
body.append(desc_card);
$('#caseViewModal').modal('show');
}
$(document).ready(function() {
get_cases_overview(true);
$('#overviewLoadClosedCase').change(function() {
get_cases_overview(true, this.checked);
});
});