$.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); }); });