3 Commits

Author SHA1 Message Date
Sven laptop 89e4f90fc3 Fix monitoring UI 2026-09-23 17:23:04 +02:00
Sven laptop 39b0b07a77 updated docker build to always deplyo 2026-09-23 17:22:14 +02:00
Sven laptop 48c710bfbf Fix admin check on monitoring UI
Build and Push Docker Images / detect-changes (push) Successful in 12s
Build and Push Docker Images / build-auth-api (push) Has been skipped
Build and Push Docker Images / build-employee-api (push) Has been skipped
Build and Push Docker Images / build-transit-api (push) Has been skipped
Build and Push Docker Images / build-error-log-api (push) Has been skipped
Build and Push Docker Images / build-admin-ui (push) Has been skipped
Build and Push Docker Images / build-monitoring-ui (push) Successful in 1m15s
Build and Push Docker Images / deploy-test-node (push) Successful in 3s
2026-09-23 17:12:41 +02:00
2 changed files with 78 additions and 47 deletions
+20 -11
View File
@@ -297,17 +297,26 @@ jobs:
tags: ${{ steps.tags.outputs.tags }} tags: ${{ steps.tags.outputs.tags }}
deploy-test-node: deploy-test-node:
needs: needs: [detect-changes, build-auth-api, build-employee-api, build-transit-api, build-error-log-api, build-admin-ui, build-monitoring-ui]
[ if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && gitea.event_name == 'push' }}
detect-changes, strategy:
build-auth-api, fail-fast: false
build-employee-api, matrix:
build-transit-api, include:
build-error-log-api, - name: auth-api
build-admin-ui, need_job: build-auth-api
build-monitoring-ui, - name: employee-api
] need_job: build-employee-api
if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && gitea.event_name == 'push' && (gitea.ref_name == 'dev' || gitea.ref_name == 'main' || gitea.ref_name == 'develop' || gitea.ref_name == 'auth-api' || gitea.ref_name == 'employee-api' || gitea.ref_name == 'transit-api' || gitea.ref_name == 'error-log-api' || gitea.ref_name == 'admin-ui' || gitea.ref_name == 'monitoring-ui') }} - name: transit-api
need_job: build-transit-api
- name: error-log-api
need_job: build-error-log-api
- name: admin-ui
need_job: build-admin-ui
- name: monitoring-ui
need_job: build-monitoring-ui
if: ${{ needs[matrix.value.need_job].result == 'success' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
+33 -11
View File
@@ -57,7 +57,12 @@ const healthPaths = {
errors: "/health", errors: "/health",
}; };
const testerRoutes = [ const testerRoutes = [
{ service: "auth", method: "POST", path: "/login", label: "Login (userCode + password)" }, {
service: "auth",
method: "POST",
path: "/login",
label: "Login (userCode + password)",
},
{ service: "auth", method: "GET", path: "/me", label: "Current session" }, { service: "auth", method: "GET", path: "/me", label: "Current session" },
{ {
service: "employee", service: "employee",
@@ -108,8 +113,8 @@ function App() {
const [token, setToken] = useState( const [token, setToken] = useState(
() => localStorage.getItem("transit-monitor-token") || "", () => localStorage.getItem("transit-monitor-token") || "",
); );
const [user, setUser] = useState( const [user, setUser] = useState(() =>
() => JSON.parse(localStorage.getItem("transit-monitor-user") || "null"), JSON.parse(localStorage.getItem("transit-monitor-user") || "null"),
); );
const [health, setHealth] = useState({}); const [health, setHealth] = useState({});
const [history, setHistory] = useState({}); const [history, setHistory] = useState({});
@@ -129,7 +134,8 @@ function App() {
const [loginLoading, setLoginLoading] = useState(false); const [loginLoading, setLoginLoading] = useState(false);
const [loginError, setLoginError] = useState(""); const [loginError, setLoginError] = useState("");
const login = useCallback(async (userCode, password) => { const login = useCallback(
async (userCode, password) => {
const url = urls.auth; const url = urls.auth;
if (!url) { if (!url) {
setLoginError("Auth API URL not configured"); setLoginError("Auth API URL not configured");
@@ -157,7 +163,9 @@ function App() {
} finally { } finally {
setLoginLoading(false); setLoginLoading(false);
} }
}, [urls.auth]); },
[urls.auth],
);
const logout = useCallback(() => { const logout = useCallback(() => {
setToken(""); setToken("");
@@ -590,7 +598,9 @@ function Docs() {
<summary>API Routes</summary> <summary>API Routes</summary>
<ul> <ul>
{meta.routes.map((route) => ( {meta.routes.map((route) => (
<li key={route}><code>{route}</code></li> <li key={route}>
<code>{route}</code>
</li>
))} ))}
</ul> </ul>
</details> </details>
@@ -855,7 +865,11 @@ function Connections({ urls, token, user, login, logout, save, loginLoading }) {
/> />
</label> </label>
{loginError && <div className="login-error">{loginError}</div>} {loginError && <div className="login-error">{loginError}</div>}
<button type="submit" className="run-button save-button" disabled={loginLoading}> <button
type="submit"
className="run-button save-button"
disabled={loginLoading}
>
{loginLoading ? "Logging in..." : "Login"} {loginLoading ? "Logging in..." : "Login"}
</button> </button>
</form> </form>
@@ -898,10 +912,18 @@ function Connections({ urls, token, user, login, logout, save, loginLoading }) {
</div> </div>
<div className="user-info"> <div className="user-info">
<h3>Logged in as</h3> <h3>Logged in as</h3>
<p><strong>User Code:</strong> {user?.userCode}</p> <p>
<p><strong>Role:</strong> {user?.job}</p> <strong>User Code:</strong> {user?.userCode}
<p><strong>Admin:</strong> {user?.isAdmin ? "Yes" : "No"}</p> </p>
<button className="ghost-button" onClick={logout}>Logout</button> <p>
<strong>Role:</strong> {user?.job}
</p>
<p>
<strong>Admin:</strong> {user?.isAdmin ? "Yes" : "No"}
</p>
<button className="ghost-button" onClick={logout}>
Logout
</button>
</div> </div>
<button <button
className="run-button save-button" className="run-button save-button"