From c1d6f4eddad5e2da04fc4adfa417f5c54bfd9ab2 Mon Sep 17 00:00:00 2001 From: Nicole Rappe Date: Fri, 28 Nov 2025 20:39:23 -0700 Subject: [PATCH] Standardized Position of Page-Level Action Buttons Across All of Borealis --- .../src/Access_Management/Credential_List.jsx | 88 ++++---- .../src/Access_Management/Users.jsx | 32 ++- .../src/Admin/Log_Management.jsx | 92 ++++---- .../web-interface/src/Admin/Page_Template.jsx | 67 +++--- .../web-interface/src/Admin/Server_Info.jsx | 209 ++++++++++++++---- .../src/Assemblies/Assembly_List.jsx | 55 +++-- .../src/Scheduling/Scheduled_Jobs_List.jsx | 72 +++--- readme.md | 2 +- 8 files changed, 404 insertions(+), 213 deletions(-) diff --git a/Data/Engine/web-interface/src/Access_Management/Credential_List.jsx b/Data/Engine/web-interface/src/Access_Management/Credential_List.jsx index 0e0e5184..1ad69d93 100644 --- a/Data/Engine/web-interface/src/Access_Management/Credential_List.jsx +++ b/Data/Engine/web-interface/src/Access_Management/Credential_List.jsx @@ -8,6 +8,7 @@ import { Paper, Typography, CircularProgress, + Stack, } from "@mui/material"; import MoreVertIcon from "@mui/icons-material/MoreVert"; import AddIcon from "@mui/icons-material/Add"; @@ -310,6 +311,53 @@ export default function CredentialList({ isAdmin = false, onPageMetaChange }) { return ( <> + + + + + + + - - - - - - {loading && ( - - + {/* Page-level action button (floating top-right) */} + + + + diff --git a/Data/Engine/web-interface/src/Admin/Log_Management.jsx b/Data/Engine/web-interface/src/Admin/Log_Management.jsx index 77bc82f0..a71cb88c 100644 --- a/Data/Engine/web-interface/src/Admin/Log_Management.jsx +++ b/Data/Engine/web-interface/src/Admin/Log_Management.jsx @@ -359,8 +359,32 @@ const defaultColDef = useMemo( flexDirection: "column", }} > + + + + + + {!useGlobalHeader && ( - + Log Management - - - - Analyze engine logs and adjust log retention periods for different engine services. )} - {useGlobalHeader && ( - - - - )} {error && ( @@ -425,8 +420,8 @@ const defaultColDef = useMemo( sx={{ width: 360, p: 3, - borderRight: `1px solid ${AURORA_SHELL.border}`, - bgcolor: "rgba(3,7,18,0.7)", + borderRight: "none", + bgcolor: "transparent", display: "flex", flexDirection: "column", gap: 2, @@ -646,9 +641,32 @@ const defaultColDef = useMemo( value={gridMode} onChange={(_, val) => val && setGridMode(val)} sx={{ - backgroundColor: "rgba(0,0,0,0.25)", - borderRadius: 999, - p: 0.2, + background: "rgba(9,14,25,0.9)", + borderRadius: 1, + border: `1px solid ${AURORA_SHELL.border}`, + boxShadow: "0 14px 32px rgba(2,6,23,0.55)", + overflow: "hidden", + "& .MuiToggleButton-root": { + textTransform: "none", + color: "#dce7f5", + border: "none", + px: 2.8, + py: 1, + fontWeight: 700, + fontSize: 13, + letterSpacing: 0.1, + transition: "all 0.18s ease", + backgroundColor: "#0f1627", + "&:hover": { backgroundColor: "rgba(148,163,184,0.14)" }, + "&.Mui-selected": { + color: "#0c1224", + backgroundImage: "linear-gradient(135deg,#7fc9ff 0%,#b195ff 100%)", + boxShadow: "0 10px 24px rgba(124,58,237,0.4)", + }, + "&.Mui-selected:hover": { + backgroundImage: "linear-gradient(135deg,#8bd8ff 0%,#c0a8ff 100%)", + }, + }, }} > @@ -702,8 +720,8 @@ const defaultColDef = useMemo( flexGrow: 1, minHeight: 0, borderRadius: 2, - border: `1px solid ${AURORA_SHELL.border}`, - bgcolor: "rgba(5,7,15,0.85)", + border: "none", + bgcolor: "transparent", overflow: "hidden", }} > diff --git a/Data/Engine/web-interface/src/Admin/Page_Template.jsx b/Data/Engine/web-interface/src/Admin/Page_Template.jsx index 51edace3..dbc6c0e2 100644 --- a/Data/Engine/web-interface/src/Admin/Page_Template.jsx +++ b/Data/Engine/web-interface/src/Admin/Page_Template.jsx @@ -252,6 +252,46 @@ export default function PageTemplate({ onPageMetaChange }) { }} elevation={0} > + + + + + + + + + + + + + + + - - - - - - - - - - diff --git a/Data/Engine/web-interface/src/Admin/Server_Info.jsx b/Data/Engine/web-interface/src/Admin/Server_Info.jsx index c6e2082e..3d0a38d1 100644 --- a/Data/Engine/web-interface/src/Admin/Server_Info.jsx +++ b/Data/Engine/web-interface/src/Admin/Server_Info.jsx @@ -1,8 +1,12 @@ -import React, { useEffect, useState } from "react"; -import { Paper, Box, Typography, Button } from "@mui/material"; +import React, { useEffect, useMemo, useState } from "react"; +import { Paper, Box, Typography, Button, Stack } from "@mui/material"; import { GitHub as GitHubIcon, InfoOutlined as InfoIcon } from "@mui/icons-material"; +import { AgGridReact } from "ag-grid-react"; +import { ModuleRegistry, AllCommunityModule, themeQuartz } from "ag-grid-community"; import { CreditsDialog } from "../Dialogs.jsx"; +ModuleRegistry.registerModules([AllCommunityModule]); + const gradientButtonSx = { backgroundImage: "linear-gradient(135deg,#7dd3fc,#c084fc)", color: "#0b1220", @@ -16,6 +20,19 @@ const gradientButtonSx = { }, }; +const gridTheme = themeQuartz.withParams({ + accentColor: "#7dd3fc", + backgroundColor: "#050915", + browserColorScheme: "dark", + fontFamily: { googleFont: "IBM Plex Sans" }, + foregroundColor: "#e2e8f0", + headerFontSize: 13, +}); + +const themeClassName = gridTheme.themeName || "ag-theme-quartz"; +const gridFontFamily = "\"IBM Plex Sans\", \"Helvetica Neue\", Arial, sans-serif"; +const iconFontFamily = "\"Quartz Regular\""; + export default function ServerInfo({ isAdmin = false, onPageMetaChange }) { const [serverTime, setServerTime] = useState(null); const [error, setError] = useState(null); @@ -51,50 +68,168 @@ export default function ServerInfo({ isAdmin = false, onPageMetaChange }) { return () => onPageMetaChange?.(null); }, [onPageMetaChange]); + const infoRows = useMemo( + () => [ + { + id: "server-time", + field: "Server Time", + value: error ? `Error: ${error}` : (serverTime || "Loading..."), + description: "Internal server clock used for troubleshooting the job scheduling system.", + }, + ], + [error, serverTime] + ); + + const columnDefs = useMemo( + () => [ + { headerName: "Field", field: "field", minWidth: 180, flex: 0.35 }, + { headerName: "Value", field: "value", minWidth: 240, flex: 0.4 }, + { headerName: "Description", field: "description", minWidth: 260, flex: 0.6 }, + ], + [] + ); + if (!isAdmin) return null; return ( - + + + + + + + Basic server information for debug and support. Server time updates automatically every minute. - - Server Time - - {error ? `Error: ${error}` : (serverTime || 'Loading...')} - + + params.data?.id || String(params.rowIndex ?? "")} + suppressCellFocus + animateRows + rowHeight={48} + headerHeight={42} + pagination={false} + theme={gridTheme} + style={{ + width: "100%", + flex: 1, + fontFamily: gridFontFamily, + "--ag-icon-font-family": iconFontFamily, + }} + /> - - Project Links - - - - - setAboutOpen(false)} /> diff --git a/Data/Engine/web-interface/src/Assemblies/Assembly_List.jsx b/Data/Engine/web-interface/src/Assemblies/Assembly_List.jsx index d158f6c5..c68417af 100644 --- a/Data/Engine/web-interface/src/Assemblies/Assembly_List.jsx +++ b/Data/Engine/web-interface/src/Assemblies/Assembly_List.jsx @@ -14,6 +14,7 @@ import { TextField, CircularProgress, Link as MuiLink, + Stack, } from "@mui/material"; import AddIcon from "@mui/icons-material/Add"; import CachedIcon from "@mui/icons-material/Cached"; @@ -633,6 +634,40 @@ export default function AssemblyList({ onOpenWorkflow, onOpenScript, userRole = }} elevation={0} > + {/* Page-level action button (floating top-right) */} + + + + + + ) : null} - - - - - - - - - - - - - - - - - - - + {/* Page-level action buttons (floating top-right) */} + + + + + + + + + + + + + + + diff --git a/readme.md b/readme.md index c053db09..682bbaab 100644 --- a/readme.md +++ b/readme.md @@ -3,7 +3,7 @@ Borealis is a remote management platform with a simple, visual automation layer, enabling you to leverage scripts and advanced nodegraph-based automation workflows. I originally created Borealis to work towards consolidating the core functionality of several standalone automation platforms in my homelab, such as TacticalRMM, Ansible AWX, SemaphoreUI, and a few others. ### A Note on Development Pace -I'm the sole maintainer and still learning as I go, while working a full-time IT job. Progress is sporadic, and parts of the codebase get rebuilt when I discover better or more optimized approaches. Thank you for your patience with the slower cadence. Ko-Fi donations are always welcome and help keep m,me motivated to continue development of Borealis. +I'm the sole maintainer and still learning as I go, while working a full-time IT job. Progress is sporadic, and parts of the codebase get rebuilt when I discover better or more optimized approaches. Thank you for your patience with the slower cadence. Ko-Fi donations are always welcome and help keep me motivated to actively continue development of Borealis. ---