This commit is contained in:
Haoming
2025-07-28 14:52:53 +08:00
parent bd3892b084
commit dd1c14350b
26 changed files with 1658 additions and 1287 deletions
+51 -53
View File
@@ -1,21 +1,20 @@
function createRow(table, cellName, items) {
var tr = document.createElement('tr');
var res = [];
let tr = document.createElement("tr");
let res = [];
items.forEach(function(x, i) {
items.forEach(function (x, i) {
if (x === undefined) {
res.push(null);
return;
}
var td = document.createElement(cellName);
let td = document.createElement(cellName);
td.textContent = x;
tr.appendChild(td);
res.push(td);
var colspan = 1;
for (var n = i + 1; n < items.length; n++) {
let colspan = 1;
for (let n = i + 1; n < items.length; n++) {
if (items[n] !== undefined) {
break;
}
@@ -34,67 +33,67 @@ function createRow(table, cellName, items) {
}
function createVisualizationTable(data, cutoff = 0, sort = "") {
var table = document.createElement('table');
table.className = 'popup-table';
let table = document.createElement("table");
table.className = "popup-table";
var keys = Object.keys(data);
let keys = Object.keys(data);
if (sort === "number") {
keys = keys.sort(function(a, b) {
keys = keys.sort(function (a, b) {
return data[b] - data[a];
});
} else {
keys = keys.sort();
}
var items = keys.map(function(x) {
return {key: x, parts: x.split('/'), value: data[x]};
let items = keys.map(function (x) {
return { key: x, parts: x.split("/"), value: data[x] };
});
var maxLength = items.reduce(function(a, b) {
let maxLength = items.reduce(function (a, b) {
return Math.max(a, b.parts.length);
}, 0);
var cols = createRow(
table,
'th',
[
cutoff === 0 ? 'key' : 'record',
cutoff === 0 ? 'value' : 'seconds'
]
);
let cols = createRow(table, "th", [
cutoff === 0 ? "key" : "record",
cutoff === 0 ? "value" : "seconds",
]);
cols[0].colSpan = maxLength;
function arraysEqual(a, b) {
return !(a < b || b < a);
}
var addLevel = function(level, parent, hide) {
var matching = items.filter(function(x) {
return x.parts[level] && !x.parts[level + 1] && arraysEqual(x.parts.slice(0, level), parent);
let addLevel = function (level, parent, hide) {
let matching = items.filter(function (x) {
return (
x.parts[level] &&
!x.parts[level + 1] &&
arraysEqual(x.parts.slice(0, level), parent)
);
});
if (sort === "number") {
matching = matching.sort(function(a, b) {
matching = matching.sort(function (a, b) {
return b.value - a.value;
});
} else {
matching = matching.sort();
}
var othersTime = 0;
var othersList = [];
var othersRows = [];
var childrenRows = [];
matching.forEach(function(x) {
var visible = (cutoff === 0 && !hide) || (x.value >= cutoff && !hide);
let othersTime = 0;
let othersList = [];
let othersRows = [];
let childrenRows = [];
matching.forEach(function (x) {
let visible = (cutoff === 0 && !hide) || (x.value >= cutoff && !hide);
var cells = [];
for (var i = 0; i < maxLength; i++) {
let cells = [];
for (let i = 0; i < maxLength; i++) {
cells.push(x.parts[i]);
}
cells.push(cutoff === 0 ? x.value : x.value.toFixed(3));
var cols = createRow(table, 'td', cells);
let cols = createRow(table, "td", cells);
for (i = 0; i < level; i++) {
cols[i].className = 'muted';
cols[i].className = "muted";
}
var tr = cols[0].parentNode;
let tr = cols[0].parentNode;
if (!visible) {
tr.classList.add("hidden");
}
@@ -107,13 +106,13 @@ function createVisualizationTable(data, cutoff = 0, sort = "") {
othersRows.push(tr);
}
var children = addLevel(level + 1, parent.concat([x.parts[level]]), true);
let children = addLevel(level + 1, parent.concat([x.parts[level]]), true);
if (children.length > 0) {
var cell = cols[level];
var onclick = function() {
let cell = cols[level];
let onclick = function () {
cell.classList.remove("link");
cell.removeEventListener("click", onclick);
children.forEach(function(x) {
children.forEach(function (x) {
x.classList.remove("hidden");
});
};
@@ -123,24 +122,24 @@ function createVisualizationTable(data, cutoff = 0, sort = "") {
});
if (othersTime > 0) {
var cells = [];
for (var i = 0; i < maxLength; i++) {
let cells = [];
for (let i = 0; i < maxLength; i++) {
cells.push(parent[i]);
}
cells.push(othersTime.toFixed(3));
cells[level] = 'others';
var cols = createRow(table, 'td', cells);
cells[level] = "others";
let cols = createRow(table, "td", cells);
for (i = 0; i < level; i++) {
cols[i].className = 'muted';
cols[i].className = "muted";
}
var cell = cols[level];
var tr = cell.parentNode;
var onclick = function() {
let cell = cols[level];
let tr = cell.parentNode;
let onclick = function () {
tr.classList.add("hidden");
cell.classList.remove("link");
cell.removeEventListener("click", onclick);
othersRows.forEach(function(x) {
othersRows.forEach(function (x) {
x.classList.remove("hidden");
});
};
@@ -165,10 +164,9 @@ function createVisualizationTable(data, cutoff = 0, sort = "") {
}
function showProfile(path, cutoff = 0.05) {
requestGet(path, {}, function(data) {
data.records['total'] = data.total;
requestGet(path, {}, function (data) {
data.records["total"] = data.total;
const table = createVisualizationTable(data.records, cutoff, "number");
popup(table);
});
}