|
@@ -2591,6 +2591,8 @@
|
|
|
channels: [],
|
|
channels: [],
|
|
|
status: {},
|
|
status: {},
|
|
|
events: {},
|
|
events: {},
|
|
|
|
|
+ eventPage: 1,
|
|
|
|
|
+ eventPageSize: 5,
|
|
|
snapshots: {},
|
|
snapshots: {},
|
|
|
tables: {},
|
|
tables: {},
|
|
|
filters: { quick: "today", start: "", end: "", type: "", scope: "" }
|
|
filters: { quick: "today", start: "", end: "", type: "", scope: "" }
|
|
@@ -2934,6 +2936,7 @@
|
|
|
]);
|
|
]);
|
|
|
view.status[viewKey] = normalizeVideoStatus(status);
|
|
view.status[viewKey] = normalizeVideoStatus(status);
|
|
|
view.events[viewKey] = (events || []).map(normalizeVideoEvent);
|
|
view.events[viewKey] = (events || []).map(normalizeVideoEvent);
|
|
|
|
|
+ view.eventPage = 1;
|
|
|
view.snapshots[viewKey] = {
|
|
view.snapshots[viewKey] = {
|
|
|
items: (snapshots?.items || []).map(normalizeVideoSnapshot),
|
|
items: (snapshots?.items || []).map(normalizeVideoSnapshot),
|
|
|
total: Number(snapshots?.total || 0)
|
|
total: Number(snapshots?.total || 0)
|
|
@@ -3283,6 +3286,39 @@
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ function renderVideoEventPagination(total) {
|
|
|
|
|
+ const footer = document.querySelector("#videoEventPagination");
|
|
|
|
|
+ if (!footer) return;
|
|
|
|
|
+ const view = videoPlatformState();
|
|
|
|
|
+ const pageCount = Math.max(1, Math.ceil(total / view.eventPageSize));
|
|
|
|
|
+ if (!total) {
|
|
|
|
|
+ footer.innerHTML = "";
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ const current = Math.min(Math.max(view.eventPage, 1), pageCount);
|
|
|
|
|
+ view.eventPage = current;
|
|
|
|
|
+ const pageButtons = Array.from({ length: pageCount }, (_, index) => {
|
|
|
|
|
+ const page = index + 1;
|
|
|
|
|
+ return `<button class="${page === current ? "active" : ""}" type="button" data-video-event-page="${page}">${page}</button>`;
|
|
|
|
|
+ }).join("");
|
|
|
|
|
+ footer.innerHTML = `
|
|
|
|
|
+ <span>共 ${formatNumber(total)} 条 · 第 ${current}/${pageCount} 页</span>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <button type="button" data-video-event-page="${current - 1}" ${current <= 1 ? "disabled" : ""}>上一页</button>
|
|
|
|
|
+ ${pageButtons}
|
|
|
|
|
+ <button type="button" data-video-event-page="${current + 1}" ${current >= pageCount ? "disabled" : ""}>下一页</button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ `;
|
|
|
|
|
+ footer.querySelectorAll("[data-video-event-page]").forEach((button) => {
|
|
|
|
|
+ button.addEventListener("click", () => {
|
|
|
|
|
+ const page = Number(button.dataset.videoEventPage);
|
|
|
|
|
+ if (!Number.isFinite(page) || page < 1 || page > pageCount || page === current) return;
|
|
|
|
|
+ videoPlatformState().eventPage = page;
|
|
|
|
|
+ renderVideoEvents();
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
function renderVideoEvents() {
|
|
function renderVideoEvents() {
|
|
|
const list = document.querySelector("#videoEventList");
|
|
const list = document.querySelector("#videoEventList");
|
|
|
const count = document.querySelector("#videoEventCount");
|
|
const count = document.querySelector("#videoEventCount");
|
|
@@ -3290,6 +3326,7 @@
|
|
|
const view = videoPlatformState();
|
|
const view = videoPlatformState();
|
|
|
const events = view.events[state.videoModule] || [];
|
|
const events = view.events[state.videoModule] || [];
|
|
|
if (count) count.textContent = `${formatNumber(events.length)} 条`;
|
|
if (count) count.textContent = `${formatNumber(events.length)} 条`;
|
|
|
|
|
+ renderVideoEventPagination(events.length);
|
|
|
if (!events.length) {
|
|
if (!events.length) {
|
|
|
list.innerHTML = videoEmptyState(
|
|
list.innerHTML = videoEmptyState(
|
|
|
"shield-alert",
|
|
"shield-alert",
|
|
@@ -3298,7 +3335,15 @@
|
|
|
window.injectIcons?.(list);
|
|
window.injectIcons?.(list);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- list.innerHTML = events
|
|
|
|
|
|
|
+ const pageCount = Math.max(1, Math.ceil(events.length / view.eventPageSize));
|
|
|
|
|
+ const current = Math.min(Math.max(view.eventPage, 1), pageCount);
|
|
|
|
|
+ view.eventPage = current;
|
|
|
|
|
+ const pageEvents = events.slice(
|
|
|
|
|
+ (current - 1) * view.eventPageSize,
|
|
|
|
|
+ current * view.eventPageSize
|
|
|
|
|
+ );
|
|
|
|
|
+ list.scrollTop = 0;
|
|
|
|
|
+ list.innerHTML = pageEvents
|
|
|
.map(
|
|
.map(
|
|
|
(item) => `
|
|
(item) => `
|
|
|
<div class="video-event-row ${escapeHtml(item.tone)}">
|
|
<div class="video-event-row ${escapeHtml(item.tone)}">
|
|
@@ -3498,6 +3543,7 @@
|
|
|
button.addEventListener("click", async () => {
|
|
button.addEventListener("click", async () => {
|
|
|
state.videoModule = button.dataset.videoModule || "door";
|
|
state.videoModule = button.dataset.videoModule || "door";
|
|
|
state.videoRecordTab = 0;
|
|
state.videoRecordTab = 0;
|
|
|
|
|
+ videoPlatformState().eventPage = 1;
|
|
|
state.videoSelectedChannel = videoPlatformChannels()[0]?.id || state.videoSelectedChannel;
|
|
state.videoSelectedChannel = videoPlatformChannels()[0]?.id || state.videoSelectedChannel;
|
|
|
renderVideoPlatform();
|
|
renderVideoPlatform();
|
|
|
await ensureVideoModuleLoaded(state.videoModule);
|
|
await ensureVideoModuleLoaded(state.videoModule);
|
|
@@ -3556,6 +3602,7 @@
|
|
|
state.videoSearch = "";
|
|
state.videoSearch = "";
|
|
|
if (search) search.value = "";
|
|
if (search) search.value = "";
|
|
|
state.videoRecordTab = 0;
|
|
state.videoRecordTab = 0;
|
|
|
|
|
+ view.eventPage = 1;
|
|
|
view.filters = { quick: "today", start: "", end: "", type: "", scope: "" };
|
|
view.filters = { quick: "today", start: "", end: "", type: "", scope: "" };
|
|
|
applyVideoDefaultRange({ reset: true });
|
|
applyVideoDefaultRange({ reset: true });
|
|
|
await searchVideoPlatform({ silent: true, fromInputs: false });
|
|
await searchVideoPlatform({ silent: true, fromInputs: false });
|