return {items: items}; | return {items: items}; | ||||
} | } | ||||
function columns_v2() { | |||||
return [{ | |||||
name: "id", | |||||
title: "ID", | |||||
style: { | |||||
minWidth: 130, | |||||
overflow: "hidden", | |||||
textOverflow: "ellipsis", | |||||
wordBreak: "break-all", | |||||
whiteSpace: "normal" | |||||
} | |||||
}, { | |||||
name: "ip", | |||||
title: "IP address", | |||||
breakpoints: "xs sm md", | |||||
style: { | |||||
"minWidth": "calc(7.6em + 8px)", | |||||
"word-break": "break-all" | |||||
} | |||||
}, { | |||||
name: "sender_mime", | |||||
title: "[Envelope From] From", | |||||
breakpoints: "xs sm md", | |||||
style: { | |||||
"minWidth": 100, | |||||
"maxWidth": 200, | |||||
"word-wrap": "break-word" | |||||
} | |||||
}, { | |||||
name: "rcpt_mime_short", | |||||
title: "[Envelope To] To/Cc/Bcc", | |||||
breakpoints: "xs sm md", | |||||
filterable: false, | |||||
classes: "d-none d-xl-table-cell", | |||||
style: { | |||||
"minWidth": 100, | |||||
"maxWidth": 200, | |||||
"word-wrap": "break-word" | |||||
} | |||||
}, { | |||||
name: "rcpt_mime", | |||||
title: "[Envelope To] To/Cc/Bcc", | |||||
breakpoints: "all", | |||||
style: {"word-wrap": "break-word"} | |||||
}, { | |||||
name: "subject", | |||||
title: "Subject", | |||||
breakpoints: "xs sm md", | |||||
style: { | |||||
"word-break": "break-all", | |||||
"minWidth": 150 | |||||
} | |||||
}, { | |||||
name: "action", | |||||
title: "Action", | |||||
style: {minwidth: 82} | |||||
}, { | |||||
name: "score", | |||||
title: "Score", | |||||
style: { | |||||
"maxWidth": 110, | |||||
"text-align": "right", | |||||
"white-space": "nowrap" | |||||
}, | |||||
sortValue: function (val) { return Number(val.options.sortValue); } | |||||
}, { | |||||
name: "symbols", | |||||
title: "Symbols" + | |||||
'<div class="sym-order-toggle">' + | |||||
'<br><span style="font-weight:normal;">Sort by:</span><br>' + | |||||
'<div class="btn-group btn-group-xs btn-sym-order-history">' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-history-magnitude">' + | |||||
'<input type="radio" class="btn-check" value="magnitude">Magnitude</label>' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-history-score">' + | |||||
'<input type="radio" class="btn-check" value="score">Value</label>' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-history-name">' + | |||||
'<input type="radio" class="btn-check" value="name">Name</label>' + | |||||
"</div>" + | |||||
"</div>", | |||||
breakpoints: "all", | |||||
style: {width: 550, maxWidth: 550} | |||||
}, { | |||||
name: "size", | |||||
title: "Msg size", | |||||
breakpoints: "xs sm md", | |||||
style: {minwidth: 50}, | |||||
formatter: d3.format(".3~s") | |||||
}, { | |||||
name: "time_real", | |||||
title: "Scan time", | |||||
breakpoints: "xs sm md", | |||||
style: {maxWidth: 72}, | |||||
sortValue: function (val) { return Number(val); } | |||||
}, { | |||||
classes: "history-col-time", | |||||
sorted: true, | |||||
direction: "DESC", | |||||
name: "time", | |||||
title: "Time", | |||||
sortValue: function (val) { return Number(val.options.sortValue); } | |||||
}, { | |||||
name: "user", | |||||
title: "Authenticated user", | |||||
breakpoints: "xs sm md", | |||||
style: { | |||||
"minWidth": 100, | |||||
"maxWidth": 130, | |||||
"word-wrap": "break-word" | |||||
} | |||||
}]; | |||||
} | |||||
function columns_legacy() { | function columns_legacy() { | ||||
return [{ | return [{ | ||||
name: "id", | name: "id", | ||||
} | } | ||||
const columns = { | const columns = { | ||||
2: columns_v2, | |||||
legacy: columns_legacy | |||||
2: libft.columns_v2("history"), | |||||
legacy: columns_legacy() | |||||
}; | }; | ||||
function process_history_data(data) { | function process_history_data(data) { | ||||
} | } | ||||
} | } | ||||
return func(); | |||||
return func; | |||||
} | } | ||||
ui.getHistory = function () { | ui.getHistory = function () { |
/* global FooTable */ | /* global FooTable */ | ||||
define(["jquery", "app/common", "footable"], | |||||
($, common) => { | |||||
define(["jquery", "app/common", "d3", "footable"], | |||||
($, common, d3) => { | |||||
"use strict"; | "use strict"; | ||||
const ui = {}; | const ui = {}; | ||||
// Public functions | // Public functions | ||||
ui.columns_v2 = function (table) { | |||||
return [{ | |||||
name: "id", | |||||
title: "ID", | |||||
style: { | |||||
minWidth: 130, | |||||
overflow: "hidden", | |||||
textOverflow: "ellipsis", | |||||
wordBreak: "break-all", | |||||
whiteSpace: "normal" | |||||
} | |||||
}, { | |||||
name: "ip", | |||||
title: "IP address", | |||||
breakpoints: "xs sm md", | |||||
style: { | |||||
"minWidth": "calc(7.6em + 8px)", | |||||
"word-break": "break-all" | |||||
} | |||||
}, { | |||||
name: "sender_mime", | |||||
title: "[Envelope From] From", | |||||
breakpoints: "xs sm md", | |||||
style: { | |||||
"minWidth": 100, | |||||
"maxWidth": 200, | |||||
"word-wrap": "break-word" | |||||
} | |||||
}, { | |||||
name: "rcpt_mime_short", | |||||
title: "[Envelope To] To/Cc/Bcc", | |||||
breakpoints: "xs sm md", | |||||
filterable: false, | |||||
classes: "d-none d-xl-table-cell", | |||||
style: { | |||||
"minWidth": 100, | |||||
"maxWidth": 200, | |||||
"word-wrap": "break-word" | |||||
} | |||||
}, { | |||||
name: "rcpt_mime", | |||||
title: "[Envelope To] To/Cc/Bcc", | |||||
breakpoints: "all", | |||||
style: {"word-wrap": "break-word"} | |||||
}, { | |||||
name: "subject", | |||||
title: "Subject", | |||||
breakpoints: "xs sm md", | |||||
style: { | |||||
"word-break": "break-all", | |||||
"minWidth": 150 | |||||
} | |||||
}, { | |||||
name: "action", | |||||
title: "Action", | |||||
style: {minwidth: 82} | |||||
}, { | |||||
name: "passthrough_module", | |||||
title: '<div title="The module that has set the pre-result">Pass-through module</div>', | |||||
breakpoints: "xs sm md" | |||||
}, { | |||||
name: "score", | |||||
title: "Score", | |||||
style: { | |||||
"maxWidth": 110, | |||||
"text-align": "right", | |||||
"white-space": "nowrap" | |||||
}, | |||||
sortValue: function (val) { return Number(val.options.sortValue); } | |||||
}, { | |||||
name: "symbols", | |||||
title: "Symbols" + | |||||
'<div class="sym-order-toggle">' + | |||||
'<br><span style="font-weight:normal;">Sort by:</span><br>' + | |||||
'<div class="btn-group btn-group-xs btn-sym-order-' + table + '">' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-' + table + '-magnitude">' + | |||||
'<input type="radio" class="btn-check" value="magnitude">Magnitude</label>' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-' + table + '-score">' + | |||||
'<input type="radio" class="btn-check" value="score">Value</label>' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-' + table + '-name">' + | |||||
'<input type="radio" class="btn-check" value="name">Name</label>' + | |||||
"</div>" + | |||||
"</div>", | |||||
breakpoints: "all", | |||||
style: {width: 550, maxWidth: 550} | |||||
}, { | |||||
name: "size", | |||||
title: "Msg size", | |||||
breakpoints: "xs sm md", | |||||
style: {minwidth: 50}, | |||||
formatter: d3.format(".3~s") | |||||
}, { | |||||
name: "time_real", | |||||
title: "Scan time", | |||||
breakpoints: "xs sm md", | |||||
style: {maxWidth: 72}, | |||||
sortValue: function (val) { return Number(val); } | |||||
}, { | |||||
classes: "history-col-time", | |||||
sorted: true, | |||||
direction: "DESC", | |||||
name: "time", | |||||
title: "Time", | |||||
sortValue: function (val) { return Number(val.options.sortValue); } | |||||
}, { | |||||
name: "user", | |||||
title: "Authenticated user", | |||||
breakpoints: "xs sm md", | |||||
style: { | |||||
"minWidth": 100, | |||||
"maxWidth": 130, | |||||
"word-wrap": "break-word" | |||||
} | |||||
}].filter((col) => { | |||||
switch (table) { | |||||
case "history": | |||||
return (col.name !== "passthrough_module"); | |||||
case "scan": | |||||
return ["ip", "sender_mime", "rcpt_mime_short", "rcpt_mime", "subject", "size", "user"] | |||||
.every((name) => col.name !== name); | |||||
default: | |||||
return null; | |||||
} | |||||
}); | |||||
}; | |||||
ui.set_page_size = function (table, page_size, changeTablePageSize) { | ui.set_page_size = function (table, page_size, changeTablePageSize) { | ||||
const n = parseInt(page_size, 10); // HTML Input elements return string representing a number | const n = parseInt(page_size, 10); // HTML Input elements return string representing a number | ||||
if (n > 0) { | if (n > 0) { |
}); | }); | ||||
} | } | ||||
function columns_v2() { | |||||
return [{ | |||||
name: "id", | |||||
title: "ID", | |||||
style: { | |||||
minWidth: 130, | |||||
overflow: "hidden", | |||||
textOverflow: "ellipsis", | |||||
wordBreak: "break-all", | |||||
whiteSpace: "normal" | |||||
} | |||||
}, { | |||||
name: "action", | |||||
title: "Action", | |||||
style: {minwidth: 82} | |||||
}, { | |||||
name: "passthrough_module", | |||||
title: '<div title="The module that has set the pre-result">Pass-through module</div>', | |||||
breakpoints: "xs sm md" | |||||
}, { | |||||
name: "score", | |||||
title: "Score", | |||||
style: {maxWidth: 110}, | |||||
sortValue: function (val) { return Number(val.options.sortValue); } | |||||
}, { | |||||
name: "symbols", | |||||
title: "Symbols" + | |||||
'<div class="sym-order-toggle">' + | |||||
'<br><span style="font-weight:normal;">Sort by:</span><br>' + | |||||
'<div class="btn-group btn-group-xs btn-sym-order-scan">' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-scan-magnitude">' + | |||||
'<input type="radio" class="btn-check" value="magnitude">Magnitude</label>' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-scan-score">' + | |||||
'<input type="radio" class="btn-check" value="score">Value</label>' + | |||||
'<label type="button" class="btn btn-outline-secondary btn-sym-scan-name">' + | |||||
'<input type="radio" class="btn-check" value="name">Name</label>' + | |||||
"</div>" + | |||||
"</div>", | |||||
breakpoints: "all", | |||||
style: {width: 550, maxWidth: 550} | |||||
}, { | |||||
name: "time_real", | |||||
title: "Scan time", | |||||
breakpoints: "xs sm md", | |||||
style: {maxWidth: 72}, | |||||
sortValue: function (val) { return Number(val); } | |||||
}, { | |||||
classes: "history-col-time", | |||||
sorted: true, | |||||
direction: "DESC", | |||||
name: "time", | |||||
title: "Time", | |||||
sortValue: function (val) { return Number(val.options.sortValue); } | |||||
}]; | |||||
} | |||||
function get_server() { | function get_server() { | ||||
const checked_server = common.getSelector("selSrv"); | const checked_server = common.getSelector("selSrv"); | ||||
return (checked_server === "All SERVERS") ? "local" : checked_server; | return (checked_server === "All SERVERS") ? "local" : checked_server; | ||||
require(["footable"], () => { | require(["footable"], () => { | ||||
// Is there a way to get an event when the table is destroyed? | // Is there a way to get an event when the table is destroyed? | ||||
setTimeout(() => { | setTimeout(() => { | ||||
libft.initHistoryTable(data, items, "scan", columns_v2(), true); | |||||
libft.initHistoryTable(data, items, "scan", libft.columns_v2("scan"), true); | |||||
scrollTop(rows_total); | scrollTop(rows_total); | ||||
}, 200); | }, 200); | ||||
}); | }); |