Compare commits

..

1 Commits

Author SHA1 Message Date
7d32bc1217 add cookies support 2025-07-04 13:48:13 +03:00
5 changed files with 122 additions and 82 deletions

View File

@ -117,7 +117,6 @@
data-sortable="true" data-sortable="true"
data-sort-name="base" data-sort-name="base"
data-sort-order="asc" data-sort-order="asc"
data-toggle="table"
data-toolbar="#toolbar"> data-toolbar="#toolbar">
<thead class="table-primary"> <thead class="table-primary">
<tr> <tr>

View File

@ -80,8 +80,7 @@
data-classes="table table-hover" data-classes="table table-hover"
data-sortable="true" data-sortable="true"
data-sort-name="timestamp" data-sort-name="timestamp"
data-sort-order="desc" data-sort-order="desc">
data-toggle="table">
<thead class="table-primary"> <thead class="table-primary">
<tr> <tr>
<th data-align="right" data-field="timestamp">date</th> <th data-align="right" data-field="timestamp">date</th>
@ -509,6 +508,8 @@
} }
ready(_ => { ready(_ => {
packageInfoEventsTable.bootstrapTable({});
packageInfoEventsUpdateChart = new Chart(packageInfoEventsUpdateChartCanvas, { packageInfoEventsUpdateChart = new Chart(packageInfoEventsUpdateChartCanvas, {
type: "line", type: "line",
data: {}, data: {},
@ -539,5 +540,7 @@
clearInterval(packageInfoAutoReloadTask); clearInterval(packageInfoAutoReloadTask);
packageInfoAutoReloadTask = null; // not really required (?) but lets clear everything packageInfoAutoReloadTask = null; // not really required (?) but lets clear everything
}); });
restoreAutoReloadSettings(packageInfoAutoReloadButton, packageInfoAutoReloadInput);
}); });
</script> </script>

View File

@ -250,6 +250,12 @@
} }
ready(_ => { ready(_ => {
const onCheckFunction = function () {
if (packageRemoveButton) {
packageRemoveButton.disabled = !getSelection().length;
}
};
document.querySelectorAll("#repositories a").forEach(element => { document.querySelectorAll("#repositories a").forEach(element => {
element.onclick = _ => { element.onclick = _ => {
repository = { repository = {
@ -264,49 +270,53 @@
}; };
}); });
table.on("check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table", _ => { table.bootstrapTable({
if (packageRemoveButton) { onCheck: onCheckFunction,
packageRemoveButton.disabled = !table.bootstrapTable("getSelections").length; onCheckAll: onCheckFunction,
} onClickRow: (data, row, cell) => {
}); if (0 === cell || "base" === cell) {
table.on("click-row.bs.table", (self, data, row, cell) => { const method = data[0] === true ? "uncheckBy" : "checkBy"; // fck javascript
if (0 === cell || "base" === cell) { table.bootstrapTable(method, {field: "id", values: [data.id]});
const method = data[0] === true ? "uncheckBy" : "checkBy"; // fck javascript } else showPackageInfo(data.id);
table.bootstrapTable(method, {field: "id", values: [data.id]}); },
} else showPackageInfo(data.id); onCreatedControls: _ => {
}); new easepick.create({
table.on("created-controls.bs.table", _ => { element: document.querySelector(".bootstrap-table-filter-control-timestamp"),
new easepick.create({ css: [
element: document.querySelector(".bootstrap-table-filter-control-timestamp"), "https://cdn.jsdelivr.net/npm/@easepick/bundle@1.2.1/dist/index.css",
css: [ ],
"https://cdn.jsdelivr.net/npm/@easepick/bundle@1.2.1/dist/index.css", grid: 2,
], calendars: 2,
grid: 2, autoApply: false,
calendars: 2, locale: {
autoApply: false, cancel: "Clear",
locale: { },
cancel: "Clear", RangePlugin: {
}, tooltip: false,
RangePlugin: { },
tooltip: false, plugins: [
}, "RangePlugin",
plugins: [ ],
"RangePlugin", setup: picker => {
], picker.on("select", _ => { table.bootstrapTable("triggerSearch"); });
setup: picker => { // replace "Cancel" behaviour to "Clear"
picker.on("select", _ => { table.bootstrapTable("triggerSearch"); }); picker.onClickCancelButton = element => {
// replace "Cancel" behaviour to "Clear" if (picker.isCancelButton(element)) {
picker.onClickCancelButton = element => { picker.clear();
if (picker.isCancelButton(element)) { picker.hide();
picker.clear(); table.bootstrapTable("triggerSearch");
picker.hide(); }
table.bootstrapTable("triggerSearch"); };
} },
}; });
}, },
}); onPageChange: (_, size) => { Cookies.set(`ahriman-${table.attr("id")}-page-size`, size); },
onUncheck: onCheckFunction,
onUncheckAll: onCheckFunction,
}); });
restoreAutoReloadSettings(tableAutoReloadButton, tableAutoReloadInput);
selectRepository(); selectRepository();
{% if autorefresh_intervals %} {% if autorefresh_intervals %}
toggleTableAutoReload(); toggleTableAutoReload();

View File

@ -53,8 +53,7 @@ SigLevel = Database{% if has_repo_signed %}Required{% else %}Never{% endif %} Pa
data-show-search-clear-button="true" data-show-search-clear-button="true"
data-sortable="true" data-sortable="true"
data-sort-name="base" data-sort-name="base"
data-sort-order="asc" data-sort-order="asc">
data-toggle="table">
<thead class="table-primary"> <thead class="table-primary">
<tr> <tr>
<th data-sortable="true" data-switchable="false" data-field="name" data-filter-control="input" data-filter-control-placeholder="(any package)">package</th> <th data-sortable="true" data-switchable="false" data-field="name" data-filter-control="input" data-filter-control-placeholder="(any package)">package</th>
@ -128,36 +127,38 @@ SigLevel = Database{% if has_repo_signed %}Required{% else %}Never{% endif %} Pa
} }
ready(_ => { ready(_ => {
table.on("created-controls.bs.table", _ => { table.bootstrapTable({
new easepick.create({ onCreatedControls: _ => {
element: document.querySelector(".bootstrap-table-filter-control-timestamp"), new easepick.create({
css: [ element: document.querySelector(".bootstrap-table-filter-control-timestamp"),
"https://cdn.jsdelivr.net/npm/@easepick/bundle@1.2.1/dist/index.css", css: [
], "https://cdn.jsdelivr.net/npm/@easepick/bundle@1.2.1/dist/index.css",
grid: 2, ],
calendars: 2, grid: 2,
autoApply: false, calendars: 2,
locale: { autoApply: false,
cancel: "Clear", locale: {
}, cancel: "Clear",
RangePlugin: { },
tooltip: false, RangePlugin: {
}, tooltip: false,
plugins: [ },
"RangePlugin", plugins: [
], "RangePlugin",
setup: picker => { ],
picker.on("select", _ => { table.bootstrapTable("triggerSearch"); }); setup: picker => {
// replace "Cancel" behaviour to "Clear" picker.on("select", _ => { table.bootstrapTable("triggerSearch"); });
picker.onClickCancelButton = element => { // replace "Cancel" behaviour to "Clear"
if (picker.isCancelButton(element)) { picker.onClickCancelButton = element => {
picker.clear(); if (picker.isCancelButton(element)) {
picker.hide(); picker.clear();
table.bootstrapTable("triggerSearch"); picker.hide();
} table.bootstrapTable("triggerSearch");
}; }
}, };
}); },
});
},
}); });
}); });
</script> </script>

View File

@ -19,6 +19,8 @@
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js" crossorigin="anonymous" type="application/javascript"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js" crossorigin="anonymous" type="application/javascript"></script>
<script src="https://cdn.jsdelivr.net/npm/js-cookie@3.0.5/dist/js.cookie.min.js" crossorigin="anonymous" type="application/javascript"></script>
<script> <script>
async function copyToClipboard(text, button) { async function copyToClipboard(text, button) {
await navigator.clipboard.writeText(text); await navigator.clipboard.writeText(text);
@ -118,6 +120,19 @@
} }
} }
function restoreAutoReloadSettings(toggle, intervalSelector) {
for (let refreshEnabled = Cookies.get(`ahriman-${toggle.id}-refresh-enabled`);
!!refreshEnabled;
refreshEnabled = undefined) {
toggle.checked = refreshEnabled === "true";
}
for (let refreshInterval = Cookies.get(`ahriman-${toggle.id}-refresh-interval`);
!!refreshInterval;
refreshInterval = undefined) {
toggleActiveElement(intervalSelector, "interval", refreshInterval);
}
}
function safe(string) { function safe(string) {
return String(string) return String(string)
.replace(/&/g, "&amp;") .replace(/&/g, "&amp;")
@ -137,6 +152,18 @@
return element; return element;
} }
function toggleActiveElement(selector, dataType, value) {
const targetElement = selector.querySelector(`a[data-${dataType}="${value}"]`);
if (targetElement?.classList?.contains("active")) {
return; // element is already active, skip processing
}
Array.from(selector.children).forEach(il => {
Array.from(il.children).forEach(el => el.classList.remove("active"));
});
targetElement?.classList?.add("active");
}
function toggleAutoReload(toggle, interval, intervalSelector, callback) { function toggleAutoReload(toggle, interval, intervalSelector, callback) {
if (interval) { if (interval) {
toggle.checked = true; // toggle reload toggle.checked = true; // toggle reload
@ -144,21 +171,21 @@
interval = intervalSelector.querySelector(".active")?.dataset?.interval; // find active element interval = intervalSelector.querySelector(".active")?.dataset?.interval; // find active element
} }
let intervalId = null;
if (interval) { if (interval) {
if (toggle.checked) { if (toggle.checked) {
// refresh UI // refresh UI
Array.from(intervalSelector.children).forEach(il => { toggleActiveElement(intervalSelector, "interval", interval);
Array.from(il.children).forEach(el => el.classList.remove("active"));
});
intervalSelector.querySelector(`a[data-interval="${interval}"]`)?.classList?.add("active");
// finally create timer task // finally create timer task
return setInterval(callback, interval); intervalId = setInterval(callback, interval);
} }
} else { } else {
toggle.checked = false; // no active interval found, disable toggle toggle.checked = false; // no active interval found, disable toggle
} }
return null; // return null to assign to keep method sane Cookies.set(`ahriman-${toggle.id}-refresh-enabled`, toggle.checked);
Cookies.set(`ahriman-${toggle.id}-refresh-interval`, interval);
return intervalId;
} }
Date.prototype.toISOStringShort = function() { Date.prototype.toISOStringShort = function() {