diff --git a/Dockerfile.dashboard b/Dockerfile.dashboard index 8845e8c..b16f55e 100644 --- a/Dockerfile.dashboard +++ b/Dockerfile.dashboard @@ -2,8 +2,11 @@ FROM rust:1.89-bookworm AS builder RUN cargo install dioxus-cli --version 0.7.3 +ARG DOCS_URL=/docs + WORKDIR /app COPY . . +ENV DOCS_URL=${DOCS_URL} RUN dx build --release --package compliance-dashboard FROM debian:bookworm-slim diff --git a/Dockerfile.docs b/Dockerfile.docs new file mode 100644 index 0000000..4b409d9 --- /dev/null +++ b/Dockerfile.docs @@ -0,0 +1,12 @@ +FROM node:22-alpine AS builder + +WORKDIR /app +COPY docs/package.json docs/package-lock.json ./ +RUN npm ci + +COPY docs/ . +RUN npm run build + +FROM nginx:alpine +COPY --from=builder /app/.vitepress/dist /usr/share/nginx/html +EXPOSE 80 diff --git a/compliance-dashboard/src/components/sidebar.rs b/compliance-dashboard/src/components/sidebar.rs index 42ba63e..e9c3630 100644 --- a/compliance-dashboard/src/components/sidebar.rs +++ b/compliance-dashboard/src/components/sidebar.rs @@ -64,6 +64,8 @@ pub fn Sidebar() -> Element { }, ]; + let docs_url = option_env!("DOCS_URL").unwrap_or("/docs"); + let sidebar_class = if collapsed() { "sidebar collapsed" } else { @@ -106,6 +108,15 @@ pub fn Sidebar() -> Element { } } } + a { + href: "{docs_url}", + target: "_blank", + class: "nav-item", + Icon { icon: BsBook, width: 18, height: 18 } + if !collapsed() { + span { "Docs" } + } + } button { class: "sidebar-toggle", onclick: move |_| collapsed.set(!collapsed()), diff --git a/compliance-dashboard/src/infrastructure/auth.rs b/compliance-dashboard/src/infrastructure/auth.rs index d37b584..fe04a40 100644 --- a/compliance-dashboard/src/infrastructure/auth.rs +++ b/compliance-dashboard/src/infrastructure/auth.rs @@ -75,9 +75,9 @@ pub async fn auth_login( Extension(pending): Extension, Query(params): Query>, ) -> Result { - let kc = state.keycloak.ok_or(DashboardError::Other( - "Keycloak not configured".into(), - ))?; + let kc = state + .keycloak + .ok_or(DashboardError::Other("Keycloak not configured".into()))?; let csrf_state = generate_state(); let code_verifier = generate_code_verifier(); let code_challenge = derive_code_challenge(&code_verifier); @@ -128,9 +128,9 @@ pub async fn auth_callback( Extension(pending): Extension, Query(params): Query>, ) -> Result { - let kc = state.keycloak.ok_or(DashboardError::Other( - "Keycloak not configured".into(), - ))?; + let kc = state + .keycloak + .ok_or(DashboardError::Other("Keycloak not configured".into()))?; let returned_state = params .get("state") @@ -214,9 +214,9 @@ pub async fn logout( session: Session, Extension(state): Extension, ) -> Result { - let kc = state.keycloak.ok_or(DashboardError::Other( - "Keycloak not configured".into(), - ))?; + let kc = state + .keycloak + .ok_or(DashboardError::Other("Keycloak not configured".into()))?; session .flush() diff --git a/compliance-dashboard/src/infrastructure/keycloak_config.rs b/compliance-dashboard/src/infrastructure/keycloak_config.rs index 3fc870b..1a89790 100644 --- a/compliance-dashboard/src/infrastructure/keycloak_config.rs +++ b/compliance-dashboard/src/infrastructure/keycloak_config.rs @@ -52,4 +52,3 @@ impl KeycloakConfig { ) } } -