From 188193a22d2b364eb8f7228228ba94d0fe5f1904 Mon Sep 17 00:00:00 2001 From: Jamie Curnow Date: Thu, 25 Sep 2025 00:14:00 +1000 Subject: [PATCH] Streams polish --- backend/internal/stream.js | 2 +- .../Table/Formatter/EventFormatter.tsx | 7 +++- frontend/src/locale/lang/en.json | 9 +++++ frontend/src/locale/src/en.json | 33 +++++++++++++++++-- .../src/pages/Nginx/Streams/TableWrapper.tsx | 25 +++++++++----- 5 files changed, 62 insertions(+), 14 deletions(-) diff --git a/backend/internal/stream.js b/backend/internal/stream.js index bec95b6e..805b6652 100644 --- a/backend/internal/stream.js +++ b/backend/internal/stream.js @@ -348,7 +348,7 @@ const internalStream = { // Add to audit log return internalAuditLog.add(access, { action: "disabled", - object_type: "stream-host", + object_type: "stream", object_id: row.id, meta: _.omit(row, omissions()), }); diff --git a/frontend/src/components/Table/Formatter/EventFormatter.tsx b/frontend/src/components/Table/Formatter/EventFormatter.tsx index 61655ac7..7cd595d3 100644 --- a/frontend/src/components/Table/Formatter/EventFormatter.tsx +++ b/frontend/src/components/Table/Formatter/EventFormatter.tsx @@ -1,4 +1,4 @@ -import { IconBoltOff, IconUser } from "@tabler/icons-react"; +import { IconBoltOff, IconDisc, IconUser } from "@tabler/icons-react"; import type { AuditLog } from "src/api/backend"; import { DateTimeFormat, intl } from "src/locale"; @@ -12,6 +12,8 @@ const getEventValue = (event: AuditLog) => { return event.meta?.name; case "dead-host": return event.meta?.domainNames?.join(", ") || "N/A"; + case "stream": + return event.meta?.incomingPort || "N/A"; default: return `UNKNOWN EVENT TYPE: ${event.objectType}`; } @@ -38,6 +40,9 @@ const getIcon = (row: AuditLog) => { case "dead-host": ico = ; break; + case "stream": + ico = ; + break; } return ico; diff --git a/frontend/src/locale/lang/en.json b/frontend/src/locale/lang/en.json index f6eeab1f..79db31bc 100644 --- a/frontend/src/locale/lang/en.json +++ b/frontend/src/locale/lang/en.json @@ -72,11 +72,15 @@ "error.passwords-must-match": "Passwords must match", "error.required": "This is required", "event.created-dead-host": "Created 404 Host", + "event.created-stream": "Created Stream", "event.created-user": "Created User", "event.deleted-dead-host": "Deleted 404 Host", + "event.deleted-stream": "Deleted Stream", "event.deleted-user": "Deleted User", "event.disabled-dead-host": "Disabled 404 Host", + "event.disabled-stream": "Disabled Stream", "event.enabled-dead-host": "Enabled 404 Host", + "event.enabled-stream": "Enabled Stream", "event.updated-user": "Updated User", "footer.github-fork": "Fork me on Github", "hosts.title": "Hosts", @@ -95,6 +99,9 @@ "notification.host-deleted": "Host has been deleted", "notification.host-disabled": "Host has been disabled", "notification.host-enabled": "Host has been enabled", + "notification.stream-deleted": "Stream has been deleted", + "notification.stream-disabled": "Stream has been disabled", + "notification.stream-enabled": "Stream has been enabled", "notification.success": "Success", "notification.user-deleted": "User has been deleted", "notification.user-disabled": "User has been disabled", @@ -130,6 +137,8 @@ "setup.title": "Welcome!", "sign-in": "Sign in", "ssl-certificate": "SSL Certificate", + "stream.delete.content": "Are you sure you want to delete this Stream?", + "stream.delete.title": "Delete Stream", "stream.forward-host": "Forward Host", "stream.forward-port": "Forward Port", "stream.incoming-port": "Incoming Port", diff --git a/frontend/src/locale/src/en.json b/frontend/src/locale/src/en.json index 2376d19c..7c5afff8 100644 --- a/frontend/src/locale/src/en.json +++ b/frontend/src/locale/src/en.json @@ -215,21 +215,33 @@ "event.created-dead-host": { "defaultMessage": "Created 404 Host" }, + "event.created-stream": { + "defaultMessage": "Created Stream" + }, "event.created-user": { "defaultMessage": "Created User" }, "event.deleted-dead-host": { "defaultMessage": "Deleted 404 Host" }, + "event.deleted-stream": { + "defaultMessage": "Deleted Stream" + }, "event.deleted-user": { "defaultMessage": "Deleted User" }, "event.disabled-dead-host": { "defaultMessage": "Disabled 404 Host" }, + "event.disabled-stream": { + "defaultMessage": "Disabled Stream" + }, "event.enabled-dead-host": { "defaultMessage": "Enabled 404 Host" }, + "event.enabled-stream": { + "defaultMessage": "Enabled Stream" + }, "event.updated-user": { "defaultMessage": "Updated User" }, @@ -281,15 +293,24 @@ "notification.host-deleted": { "defaultMessage": "Host has been deleted" }, - "notification.user-deleted": { - "defaultMessage": "User has been deleted" - }, "notification.host-disabled": { "defaultMessage": "Host has been disabled" }, "notification.host-enabled": { "defaultMessage": "Host has been enabled" }, + "notification.stream-deleted": { + "defaultMessage": "Stream has been deleted" + }, + "notification.stream-disabled": { + "defaultMessage": "Stream has been disabled" + }, + "notification.stream-enabled": { + "defaultMessage": "Stream has been enabled" + }, + "notification.user-deleted": { + "defaultMessage": "User has been deleted" + }, "notification.user-disabled": { "defaultMessage": "User has been disabled" }, @@ -392,6 +413,12 @@ "ssl-certificate": { "defaultMessage": "SSL Certificate" }, + "stream.delete.content": { + "defaultMessage": "Are you sure you want to delete this Stream?" + }, + "stream.delete.title": { + "defaultMessage": "Delete Stream" + }, "stream.forward-host": { "defaultMessage": "Forward Host" }, diff --git a/frontend/src/pages/Nginx/Streams/TableWrapper.tsx b/frontend/src/pages/Nginx/Streams/TableWrapper.tsx index 7fc7f5f6..3b651c26 100644 --- a/frontend/src/pages/Nginx/Streams/TableWrapper.tsx +++ b/frontend/src/pages/Nginx/Streams/TableWrapper.tsx @@ -2,6 +2,7 @@ import { IconSearch } from "@tabler/icons-react"; import { useQueryClient } from "@tanstack/react-query"; import { useState } from "react"; import Alert from "react-bootstrap/Alert"; +import { deleteStream, toggleStream } from "src/api/backend"; import { Button, LoadingPage } from "src/components"; import { useStreams } from "src/hooks"; import { intl } from "src/locale"; @@ -25,22 +26,27 @@ export default function TableWrapper() { } const handleDelete = async () => { - // await deleteDeadHost(deleteId); - showSuccess(intl.formatMessage({ id: "notification.host-deleted" })); + await deleteStream(deleteId); + showSuccess(intl.formatMessage({ id: "notification.stream-deleted" })); }; const handleDisableToggle = async (id: number, enabled: boolean) => { - // await toggleDeadHost(id, enabled); - queryClient.invalidateQueries({ queryKey: ["dead-hosts"] }); - queryClient.invalidateQueries({ queryKey: ["dead-host", id] }); - showSuccess(intl.formatMessage({ id: enabled ? "notification.host-enabled" : "notification.host-disabled" })); + await toggleStream(id, enabled); + queryClient.invalidateQueries({ queryKey: ["streams"] }); + queryClient.invalidateQueries({ queryKey: ["stream", id] }); + showSuccess( + intl.formatMessage({ id: enabled ? "notification.stream-enabled" : "notification.stream-disabled" }), + ); }; let filtered = null; if (search && data) { - filtered = data?.filter((_item) => { - return true; - // return item.domainNames.some((domain: string) => domain.toLowerCase().includes(search)); + filtered = data?.filter((item) => { + return ( + `${item.incomingPort}`.includes(search) || + `${item.forwardingPort}`.includes(search) || + item.forwardingHost.includes(search) + ); }); } else if (search !== "") { // this can happen if someone deletes the last item while searching @@ -82,6 +88,7 @@ export default function TableWrapper() { setEditId(id)} onDelete={(id: number) => setDeleteId(id)} onDisableToggle={handleDisableToggle}