Compare commits

..

1 Commits

Author SHA1 Message Date
808c4e5b1f add cookies support 2025-07-03 18:44:33 +03:00
5 changed files with 66 additions and 66 deletions

View File

@ -80,7 +80,8 @@
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>
@ -508,8 +509,6 @@
} }
ready(_ => { ready(_ => {
packageInfoEventsTable.bootstrapTable({});
packageInfoEventsUpdateChart = new Chart(packageInfoEventsUpdateChartCanvas, { packageInfoEventsUpdateChart = new Chart(packageInfoEventsUpdateChartCanvas, {
type: "line", type: "line",
data: {}, data: {},
@ -541,6 +540,16 @@
packageInfoAutoReloadTask = null; // not really required (?) but lets clear everything packageInfoAutoReloadTask = null; // not really required (?) but lets clear everything
}); });
restoreAutoReloadSettings(packageInfoAutoReloadButton, packageInfoAutoReloadInput); // set refresh interval
for (let refreshEnabled = Cookies.get(`ahriman-${packageInfoAutoReloadButton.id}-refresh-enabled`);
!!refreshEnabled;
refreshEnabled = undefined) {
packageInfoAutoReloadButton.checked = refreshEnabled === "true";
}
for (let refreshInterval = Cookies.get(`ahriman-${packageInfoAutoReloadButton.id}-refresh-interval`);
!!refreshInterval;
refreshInterval = undefined) {
toggleActiveElement(packageInfoAutoReloadInput, "interval", refreshInterval);
}
}); });
</script> </script>

View File

@ -315,7 +315,17 @@
onUncheckAll: onCheckFunction, onUncheckAll: onCheckFunction,
}); });
restoreAutoReloadSettings(tableAutoReloadButton, tableAutoReloadInput); // set refresh interval
for (let refreshEnabled = Cookies.get(`ahriman-${tableAutoReloadButton.id}-refresh-enabled`);
!!refreshEnabled;
refreshEnabled = undefined) {
tableAutoReloadButton.checked = refreshEnabled === "true";
}
for (let refreshInterval = Cookies.get(`ahriman-${tableAutoReloadButton.id}-refresh-interval`);
!!refreshInterval;
refreshInterval = undefined) {
toggleActiveElement(tableAutoReloadInput, "interval", refreshInterval);
}
selectRepository(); selectRepository();
{% if autorefresh_intervals %} {% if autorefresh_intervals %}

View File

@ -53,7 +53,8 @@ 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>
@ -127,38 +128,36 @@ SigLevel = Database{% if has_repo_signed %}Required{% else %}Never{% endif %} Pa
} }
ready(_ => { ready(_ => {
table.bootstrapTable({ table.on("created-controls.bs.table", _ => {
onCreatedControls: _ => { new easepick.create({
new easepick.create({ element: document.querySelector(".bootstrap-table-filter-control-timestamp"),
element: document.querySelector(".bootstrap-table-filter-control-timestamp"), css: [
css: [ "https://cdn.jsdelivr.net/npm/@easepick/bundle@1.2.1/dist/index.css",
"https://cdn.jsdelivr.net/npm/@easepick/bundle@1.2.1/dist/index.css", ],
], grid: 2,
grid: 2, calendars: 2,
calendars: 2, autoApply: false,
autoApply: false, locale: {
locale: { cancel: "Clear",
cancel: "Clear", },
}, RangePlugin: {
RangePlugin: { tooltip: false,
tooltip: false, },
}, plugins: [
plugins: [ "RangePlugin",
"RangePlugin", ],
], setup: picker => {
setup: picker => { picker.on("select", _ => { table.bootstrapTable("triggerSearch"); });
picker.on("select", _ => { table.bootstrapTable("triggerSearch"); }); // replace "Cancel" behaviour to "Clear"
// replace "Cancel" behaviour to "Clear" picker.onClickCancelButton = element => {
picker.onClickCancelButton = element => { if (picker.isCancelButton(element)) {
if (picker.isCancelButton(element)) { picker.clear();
picker.clear(); picker.hide();
picker.hide(); table.bootstrapTable("triggerSearch");
table.bootstrapTable("triggerSearch"); }
} };
}; },
}, });
});
},
}); });
}); });
</script> </script>

View File

@ -120,19 +120,6 @@
} }
} }
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;")
@ -152,18 +139,6 @@
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
@ -188,6 +163,13 @@
return intervalId; return intervalId;
} }
function toggleActiveElement(selector, dataType, value) {
Array.from(selector.children).forEach(il => {
Array.from(il.children).forEach(el => el.classList.remove("active"));
});
selector.querySelector(`a[data-${dataType}="${value}"]`)?.classList?.add("active");
}
Date.prototype.toISOStringShort = function() { Date.prototype.toISOStringShort = function() {
const pad = number => String(number).padStart(2, "0"); const pad = number => String(number).padStart(2, "0");
return `${this.getFullYear()}-${pad(this.getMonth() + 1)}-${pad(this.getDate())} ${pad(this.getHours())}:${pad(this.getMinutes())}:${pad(this.getSeconds())}`; return `${this.getFullYear()}-${pad(this.getMonth() + 1)}-${pad(this.getDate())} ${pad(this.getHours())}:${pad(this.getMinutes())}:${pad(this.getSeconds())}`;

View File

@ -72,7 +72,7 @@ def _create_socket(configuration: Configuration, application: Application) -> so
async def remove_socket(_: Application) -> None: async def remove_socket(_: Application) -> None:
unix_socket.unlink(missing_ok=True) unix_socket.unlink(missing_ok=True)
application.on_shutdown.append(remove_socket) # type: ignore[arg-type] application.on_shutdown.append(remove_socket)
return sock return sock
@ -142,8 +142,8 @@ def setup_server(configuration: Configuration, spawner: Spawn, repositories: lis
InitializeError: if no repositories set InitializeError: if no repositories set
""" """
application = Application(logger=logging.getLogger(__name__)) application = Application(logger=logging.getLogger(__name__))
application.on_shutdown.append(_on_shutdown) # type: ignore[arg-type] application.on_shutdown.append(_on_shutdown)
application.on_startup.append(_on_startup) # type: ignore[arg-type] application.on_startup.append(_on_startup)
application.middlewares.append(normalize_path_middleware(append_slash=False, remove_slash=True)) application.middlewares.append(normalize_path_middleware(append_slash=False, remove_slash=True))
application.middlewares.append(exception_handler(application.logger)) application.middlewares.append(exception_handler(application.logger))