diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/audit/index.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/audit/index.html.j2 index 7822b27..f86742d 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/audit/index.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/audit/index.html.j2 @@ -1,60 +1,6 @@ -{% extends "/dashboard/_base.html" %} {% block content %} -
-
-
- -

Audit Log

-
-
-
+{% extends "/base/page.html.j2" %} +{% block title %}Audit{% endblock %} +{% block page_content %}
{% include 'audit/inner.html.j2' %}
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/base.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/base.html.j2 new file mode 100644 index 0000000..fa64416 --- /dev/null +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/base.html.j2 @@ -0,0 +1,50 @@ + + + + + + {% block title %}Sshecret Admin{% endblock %} + + {% block head %} + {% include 'base/partials/stylesheets.html.j2' %} + {% endblock %} + + + + +
+ + + + + +
+ + +
+ {% include "base/partials/navbar.html.j2" %} +
+ + +
+ {% block breadcrumbs %} + {% endblock %} +
+ {% block content %}{% endblock %} +
+
+ +
+
+ + + {% block scripts %} + {% include 'base/partials/scripts.html.j2' %} + {% endblock %} + {% block local_scripts %} + {% endblock %} + + + diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/master-detail-email.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/master-detail-email.html.j2 new file mode 100644 index 0000000..b566597 --- /dev/null +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/master-detail-email.html.j2 @@ -0,0 +1,26 @@ +{% extends 'base/page.html.j2' %} + +{% block page_content %} + + +
+ + + + + + + +
+ +{% endblock %} diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/master-detail.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/master-detail.html.j2 new file mode 100644 index 0000000..a34f100 --- /dev/null +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/master-detail.html.j2 @@ -0,0 +1,27 @@ +{% extends 'base/page.html.j2' %} + + +{% block title %}Clients{% endblock %} + +{% block page_content %} + + +
+ + +
+ {% block master %} +

Master list goes here

+ {% endblock %} +
+ + +
+ {% block detail %} +

Select an item from the list to view details.

+ {% endblock %} +
+ +
+ +{% endblock %} diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/page.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/page.html.j2 new file mode 100644 index 0000000..9a4b170 --- /dev/null +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/page.html.j2 @@ -0,0 +1,40 @@ +{% extends "/base/base.html.j2" %} + + +{% block breadcrumbs %} + +
+ +
+{% endblock %} +{% block content %} + + + + +
+ {% block page_content %} +

This is a generic page.

+ {% endblock %} +
+ +{% endblock %} diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/navbar.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/navbar.html.j2 new file mode 100644 index 0000000..a67d075 --- /dev/null +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/navbar.html.j2 @@ -0,0 +1,68 @@ +
+ + +
+ + + + + + {% if page_title %} +

{{page_title}}

+ {% endif %} +
+ + +
+ + + + +
+
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/scripts.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/scripts.html.j2 new file mode 100644 index 0000000..db5ecc9 --- /dev/null +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/scripts.html.j2 @@ -0,0 +1,26 @@ +{# #} + + + + + + + + diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/sidebar.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/sidebar.html.j2 new file mode 100644 index 0000000..58326e7 --- /dev/null +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/sidebar.html.j2 @@ -0,0 +1,44 @@ + + + +
+ + + + Sshecret + +
+ + diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/stylesheets.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/stylesheets.html.j2 new file mode 100644 index 0000000..eaa576c --- /dev/null +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/base/partials/stylesheets.html.j2 @@ -0,0 +1,50 @@ + + + + + + + + + + + + diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/change_password/index.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/change_password/index.html.j2 index 2f10a8e..e826bcd 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/change_password/index.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/change_password/index.html.j2 @@ -1,5 +1,9 @@ -{% extends "/dashboard/_base.html" %} {% block content %} -
+{% extends "/base/page.html.j2" %} +{% block title %}Change Password{% endblock %} + +{% block page_content %} + +

Change Password diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/change_password/success.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/change_password/success.html.j2 index 748faec..dd7b081 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/change_password/success.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/change_password/success.html.j2 @@ -1,5 +1,8 @@ -{% extends "/dashboard/_base.html" %} {% block content %} -
+ +{% extends "/base/page.html.j2" %} + + {% block page_content %} +

Password Changed

Your password was changed sucessfully. Next time you log in, use your new password.

@@ -9,4 +12,4 @@
-{% endblock content %} +{% endblock %} diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/client.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/client.html.j2 index 945547b..051235c 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/client.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/client.html.j2 @@ -1,46 +1,24 @@ -{% extends "/dashboard/_base.html" %} {% block content %} -
-
-
- - - -
- -
-
- {% include '/clients/partials/tree.html.j2' %} -
-
-
- {% include '/clients/partials/client_details.html.j2' %} -
-
-
-
- -
-{% include '/clients/partials/drawer_create.html.j2' %} +{% extends 'base/master-detail-email.html.j2' %} +{% block title %}Client {{ client.name }}{% endblock %} +{% block master %} + {% include '/clients/partials/tree.html.j2' %} {% endblock %} + + +{% block detail %} + +
+ {% include '/clients/partials/client_details.html.j2' %} +
+{% endblock %} + +{% include '/clients/partials/drawer_create.html.j2' %} +{% block local_scripts %} + +{% endblock local_scripts %} + + + diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/index.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/index.html.j2 index 6087d1d..7f2ac0e 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/index.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/index.html.j2 @@ -1,41 +1,21 @@ -{% extends "/dashboard/_base.html" %} {% block content %} -
-
-
- - - -
- -
-
- {% include '/clients/partials/tree.html.j2' %} -
-
-
-

Click an item to view details

-
-
-
-
- -
-{% include '/clients/partials/drawer_create.html.j2' %} +{% extends 'base/master-detail-email.html.j2' %} +{% block title %}Clients{% endblock %} +{% block master %} + {% include '/clients/partials/tree.html.j2' %} {% endblock %} + + +{% block detail %} + +
+

Click an item to view details

+
+{% include '/clients/partials/drawer_create.html.j2' %} +{% endblock %} + +{% block local_scripts %} + +{% endblock local_scripts %} diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/client_details.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/client_details.html.j2 index f2b4f90..aa12bf7 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/client_details.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/client_details.html.j2 @@ -38,7 +38,7 @@

- + Client Data Events @@ -47,37 +47,37 @@
-

{{client.name}}

+

{{client.name}}

{% if client.description %} -

{{ client.description }}

+

{{ client.description }}

{% endif %}
-
Client ID
-
{{client.id}}
+
Client ID
+
{{client.id}}
-
Client Description
-
{{client.description}}
+
Client Description
+
{{client.description}}
-
Client Version
-
{{client.version}}
+
Client Version
+
{{client.version}}
-
Public Key
-
{{client.public_key}}
+
Public Key
+
{{client.public_key}}
-
Assigned Secrets
-
{{client.secrets|length}}
+
Assigned Secrets
+
{{client.secrets|length}}
-
Allowed sources
-
{{client.policies|join(', ')}}
+
Allowed sources
+
{{client.policies|join(', ')}}
@@ -86,7 +86,7 @@ - +
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree.html.j2 index 05a82a8..39b3be6 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree.html.j2 @@ -1,67 +1,64 @@ -
-
-
-

Clients

-
-
-
- - Loading... +{# This is the master block #} + +
+
+

Client List

+
+
+
+ + Loading... +
+
+
+ +
+
+
+
+
+ +
+
+ +
+
-
- -
-
-
-
- -
-
- -
- -
-
-
-
- {% include '/clients/partials/tree_items.html.j2' %} -
+
+ {% include '/clients/partials/tree_items.html.j2' %}
- diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree_event.js b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree_event.js index 1e260c9..9cbab6f 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree_event.js +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree_event.js @@ -1,3 +1,16 @@ +function setBreadcrumb(name) { + // Set the current client name as the final breadcrumb + const breadcrumbs = document.getElementById("breadcrumbs"); + const existingNode = document.getElementById("bc-dynamic-client"); + if (existingNode) { + breadcrumbs.removeChild(existingNode); + } + const newCrumb = document.createElement("sl-breadcrumb-item"); + newCrumb.setAttribute("id", "bc-dynamic-client"); + const bcTitle = document.createTextNode(name); + newCrumb.appendChild(bcTitle); + breadcrumbs.appendChild(newCrumb); +} function addTreeListener() { const tree = document.querySelector("sl-tree"); @@ -8,6 +21,8 @@ function addTreeListener() { if (!selectedEl) return; + const masterPane = document.getElementById("master-pane"); + const detailPane = document.getElementById("detail-pane"); const type = selectedEl.dataset.nodeType; const clientId = selectedEl.dataset.clientId; const name = selectedEl.dataset.clientName; @@ -17,11 +32,17 @@ function addTreeListener() { let url = `/clients/client/${encodeURIComponent(clientId)}`; if (url) { - htmx.ajax("GET", url, { - target: "#clientdetails", - //swap: 'OuterHTML', - indicator: "#client-spinner", - }); + htmx + .ajax("GET", url, { + target: "#clientdetails", + //swap: 'OuterHTML', + indicator: "#client-spinner", + }) + .then(() => { + masterPane.classList.add("hidden"); + detailPane.classList.remove("hidden"); + setBreadcrumb(name); + }); } }); } diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree_items.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree_items.html.j2 index bbec2ed..2df44aa 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree_items.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/clients/partials/tree_items.html.j2 @@ -38,5 +38,4 @@ {% include 'clients/partials/pagination.html.j2' %}
{% endif %} -
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/dashboard.html b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/dashboard.html index 800e0c5..840257b 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/dashboard.html +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/dashboard.html @@ -1,4 +1,4 @@ -{% extends "/dashboard/_base.html" %} {% block content %} +{% extends "/base/base.html.j2" %} {% block content %}
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/dashboard/_base.html b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/dashboard/_base.html index 2dddefa..1eb7f2e 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/dashboard/_base.html +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/dashboard/_base.html @@ -13,7 +13,7 @@ {% endif %}
-
+
{% block content %} {% endblock %}
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/login.html b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/login.html index 10143f0..9ff154f 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/login.html +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/login.html @@ -1,4 +1,4 @@ -{% extends "/shared/_base.html" %} {% block content %} {% if login_error %} +{% extends "/base/bare.html.j2" %} {% block content %} {% if login_error %}
- {% endif %} - - {% endblock %} + {% endif %} {% endblock %}
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/index.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/index.html.j2 index 11da617..3c4494a 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/index.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/index.html.j2 @@ -47,85 +47,67 @@ {% endmacro %} -{% extends "/dashboard/_base.html" %} {% block content %} +{% extends 'base/master-detail-email.html.j2' %} -
-
-
- -

Secrets

-
- -
-
+{% block title %}Secrets{% endblock %} -
-
- - - - Ungrouped - {% for entry in groups.ungrouped %} - {{ display_entry(entry) }} - {% endfor %} - - {% for child in groups.groups %} - {{ display_group(child) }} - {% endfor %} - -
-
+
+
+ + -
- {% if group_page | default(false) %} -
- {% include '/secrets/partials/group_detail.html.j2' %} -
- {% elif root_group_page | default(false) %} -
- {% include '/secrets/partials/edit_root.html.j2' %} -
- {% elif secret_page | default(false) %} -
- {% include '/secrets/partials/tree_detail.html.j2' %} -
- {% else %} - {% include '/secrets/partials/default_detail.html.j2' %} + {% if "/" in group_path_nodes %} + expanded="" {% endif %} - -
-
+ {% if selected_group == "/"%} + selected="" + {% endif %} + > + + Ungrouped + {% for entry in groups.ungrouped %} + {{ display_entry(entry) }} + {% endfor %} + + {% for child in groups.groups %} + {{ display_group(child) }} + {% endfor %} +
+ +{% endblock %} + +{% block detail %} + {% if group_page | default(false) %} +
+ {% include '/secrets/partials/group_detail.html.j2' %} +
+ {% elif root_group_page | default(false) %} +
+ {% include '/secrets/partials/edit_root.html.j2' %} +
+ {% elif secret_page | default(false) %} +
+ {% include '/secrets/partials/tree_detail.html.j2' %} +
+ {% else %} + {% include '/secrets/partials/default_detail.html.j2' %} + {% endif %} + +{% endblock %} + + +{% block local_scripts %} {% endblock %} + + diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/client_secret_details.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/client_secret_details.html.j2 index 3586e5c..134af22 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/client_secret_details.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/client_secret_details.html.j2 @@ -1,4 +1,4 @@ -
+
    {% include '/secrets/partials/client_list_inner.html.j2' %}
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/edit_root.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/edit_root.html.j2 index 01f1006..55e5803 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/edit_root.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/edit_root.html.j2 @@ -1,4 +1,4 @@ -
+
+

Group {{group.group_name}}

{% if description %} diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/tree_detail.html.j2 b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/tree_detail.html.j2 index d61d484..f26c159 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/tree_detail.html.j2 +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/tree_detail.html.j2 @@ -1,33 +1,33 @@ -
+
- + -
- - -

{{secret.name}}

@@ -53,65 +53,65 @@
{% if secret.secret %} - -
-
- -
-
-
- -
-
- -
-
-
-
-
- - Loading... -
-
-
- {% if groups.groups %} - - + +
+
+ +
- +
- +
- +
+
+
+ + Loading... +
+
+ {% if groups.groups %} + +
+
+
+ +
+
+ +
+
+ +
+ {% endif %} {% endif %} -{% endif %} - +
Timestamp
diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/tree_event.js b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/tree_event.js index f0b3a29..9aa54a5 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/tree_event.js +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/templates/secrets/partials/tree_event.js @@ -1,4 +1,61 @@ -document.addEventListener("DOMContentLoaded", () => { +function createCrumb(name, url = null) { + // Create a breadcrumb + const crumb = document.createElement("sl-breadcrumb-item"); + crumb.classList.add("page-breadcrumb"); + + if (url) { + var crumbChild = document.createElement("a"); + crumbChild.setAttribute("href", url); + const crumbChildText = document.createTextNode(name); + crumbChild.appendChild(crumbChildText); + } else { + var crumbChild = document.createTextNode(name); + } + + crumb.appendChild(crumbChild); + + return crumb; +} + +function setGroupBreadcrumbs(name, path, secret = null) { + // Set breadcrumbs for a whole group. + const breadcrumbs = document.getElementById("breadcrumbs"); + // First, remove all existing page breadcrumbs + console.log(`setGroupBreadcrumbs: ${name} ${path}`); + let pageCrumbs = document.getElementsByClassName("page-breadcrumb"); + for (let i = 0; i < pageCrumbs.length; i++) { + breadcrumbs.removeChild(pageCrumbs[i]); + } + // Re-create the breadcrumbs + const newcrumbs = [ + ["Secrets", "/secrets/"], + ["Groups", "/secrets/groups/"], + ]; + if (path) { + const pathnodes = path.split("/"); + for (let i = 0; i < pathnodes.length; i++) { + let pathnode = pathnodes[i]; + let nextnode = i + 1; + let groupPathNodes = pathnodes.slice(0, nextnode); + let groupPath = groupPathNodes.join("/"); + newcrumbs.push([pathnode, `/secrets/groups/${groupPath}`]); + } + } else { + newcrumbs.push(["Ungrouped", "/secrets/groups/"]); + } + + if (secret) { + newcrumbs.push([secret, `/secrets/secret/${secret}`]); + } + + for (let i = 0; i < newcrumbs.length; i++) { + let crumbParam = newcrumbs[i]; + let newcrumb = createCrumb(crumbParam[0], crumbParam[1]); + breadcrumbs.appendChild(newcrumb); + } +} + +function addTreeListener() { const tree = document.querySelector("sl-tree"); if (!tree) return; @@ -33,4 +90,12 @@ document.addEventListener("DOMContentLoaded", () => { }); } }); +} + +document.addEventListener("DOMContentLoaded", () => { + addTreeListener(); +}); + +document.addEventListener("htmx:afterSwap", () => { + addTreeListener(); }); diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/views/audit.py b/packages/sshecret-admin/src/sshecret_admin/frontend/views/audit.py index 9c042d3..bbe2853 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/views/audit.py +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/views/audit.py @@ -42,6 +42,7 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: page=page, limit=per_page, total=audit_log.total, offset=offset ) operations = list(Operation) + breadcrumbs = [("Audit", "/audit/")] if request.headers.get("HX-Request"): return templates.TemplateResponse( request, @@ -56,7 +57,8 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: request, "audit/index.html.j2", { - "page_title": "Audit", + "page_title": "Audit Log", + "breadcrumbs": breadcrumbs, "entries": audit_log.results, "user": current_user, "page_info": page_info, diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/views/clients.py b/packages/sshecret-admin/src/sshecret_admin/frontend/views/clients.py index c8c8c8f..fa476c4 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/views/clients.py +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/views/clients.py @@ -93,11 +93,14 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: page=page, limit=per_page, total=results.total_results, offset=offset ) + breadcrumbs = [("clients", "/clients/")] + LOG.info("Results %r", results) return templates.TemplateResponse( request, "clients/index.html.j2", { + "breadcrumbs": breadcrumbs, "page_title": "Clients", "offset": offset, "pages": paginate, @@ -166,6 +169,11 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: ) template = "clients/client.html.j2" + breadcrumbs = [ + ("clients", "/clients/"), + (results.client.name, request.url.path), + ] + headers: dict[str, str] = {} if request.headers.get("HX-Request"): headers["HX-Push-Url"] = request.url.path @@ -176,6 +184,7 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: template, { "page_title": f"Client {results.client.name}", + "breadcrumbs": breadcrumbs, "pages": results.pages, "clients": results.results.clients, "client": results.client, diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/views/index.py b/packages/sshecret-admin/src/sshecret_admin/frontend/views/index.py index edec64c..e9c2c68 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/views/index.py +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/views/index.py @@ -81,7 +81,7 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: request, "dashboard.html", { - "page_title": "sshecret", + "page_title": "Dashboard", "user": current_user, "stats": stats, "last_login_events": last_login_events, diff --git a/packages/sshecret-admin/src/sshecret_admin/frontend/views/secrets.py b/packages/sshecret-admin/src/sshecret_admin/frontend/views/secrets.py index 57592da..1300ac2 100644 --- a/packages/sshecret-admin/src/sshecret_admin/frontend/views/secrets.py +++ b/packages/sshecret-admin/src/sshecret_admin/frontend/views/secrets.py @@ -63,12 +63,15 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: admin: Annotated[AdminBackend, Depends(dependencies.get_admin_backend)], current_user: Annotated[LocalUserInfo, Depends(dependencies.get_user_info)], ): + breadcrumbs = [("secrets", "/secrets/")] groups = await admin.get_secret_groups() return templates.TemplateResponse( request, "secrets/index.html.j2", { + "page_title": "Secrets", "groups": groups, + "breadcrumbs": breadcrumbs, "user": current_user, "selected_group": None, "group_path_nodes": ["/"], @@ -83,8 +86,15 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: ): """Show the root path.""" clients = await admin.get_clients() + + breadcrumbs = [ + ("secrets", "/secrets/"), + ("groups", "/secrets/groups/"), + ("Ungrouped", "/secrets/groups/"), + ] context: dict[str, Any] = { "clients": clients, + "breadcrumbs": breadcrumbs, "root_group_page": True, } headers: dict[str, str] = {} @@ -95,6 +105,7 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: else: groups = await admin.get_secret_groups() template_name = "secrets/index.html.j2" + context["page_title"] = "Secrets" context["user"] = current_user context["groups"] = groups context["group_path_nodes"] = ["/"] @@ -119,11 +130,20 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: ) clients = await admin.get_clients() + breadcrumbs = [("secrets", "/secrets/"), ("groups", "/secrets/groups/")] + path_nodes = group.path.split("/") + for x in range(len(path_nodes)): + next_node = x + 1 + group_path = "/".join(path_nodes[:next_node]) + crumb_path = os.path.join("/secrets", group_path) + breadcrumbs.append((path_nodes[x], crumb_path)) + headers: dict[str, str] = {} context: dict[str, Any] = { "group_page": True, "group": group, "clients": clients, + "breadcrumbs": breadcrumbs, } if request.headers.get("HX-Request"): # This is a HTMX request. @@ -133,6 +153,7 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: template_name = "secrets/index.html.j2" groups = await admin.get_secret_groups() + context["page_title"] = "Secrets" context["user"] = current_user context["groups"] = groups context["group_path_nodes"] = group.path.split("/") @@ -180,6 +201,7 @@ def create_router(dependencies: FrontendDependencies) -> APIRouter: group_path = group.path.split("/") template_name = "secrets/index.html.j2" + context["page_title"] = "Secrets" context["user"] = current_user context["groups"] = groups context["group_path_nodes"] = group_path diff --git a/packages/sshecret-admin/src/sshecret_admin/static/css/main.css b/packages/sshecret-admin/src/sshecret_admin/static/css/main.css index 3317fc3..0fd78ac 100644 --- a/packages/sshecret-admin/src/sshecret_admin/static/css/main.css +++ b/packages/sshecret-admin/src/sshecret_admin/static/css/main.css @@ -382,9 +382,6 @@ .order-1 { order: 1; } - .order-2 { - order: 2; - } .col-span-2 { grid-column: span 2 / span 2; } @@ -457,9 +454,6 @@ .ms-3 { margin-inline-start: calc(var(--spacing) * 3); } - .ms-auto { - margin-inline-start: auto; - } .me-2 { margin-inline-end: calc(var(--spacing) * 2); } @@ -682,15 +676,18 @@ .h-\[12px\] { height: 12px; } - .h-\[16px\] { - height: 16px; - } - .h-\[32px\] { - height: 32px; - } .h-\[36rem\] { height: 36rem; } + .h-\[calc\(100vh-4rem\)\] { + height: calc(100vh - 4rem); + } + .h-\[calc\(100vh-8rem\)\] { + height: calc(100vh - 8rem); + } + .h-\[calc\(100vh-10rem\)\] { + height: calc(100vh - 10rem); + } .h-full { height: 100%; } @@ -1245,9 +1242,6 @@ .border-blue-300 { border-color: var(--color-blue-300); } - .border-blue-700 { - border-color: var(--color-blue-700); - } .border-gray-100 { border-color: var(--color-gray-100); } @@ -1332,9 +1326,6 @@ .bg-blue-600 { background-color: var(--color-blue-600); } - .bg-blue-700 { - background-color: var(--color-blue-700); - } .bg-emerald-500 { background-color: var(--color-emerald-500); } @@ -2175,13 +2166,6 @@ } } } - .hover\:bg-blue-800 { - &:hover { - @media (hover: hover) { - background-color: var(--color-blue-800); - } - } - } .hover\:bg-gray-50 { &:hover { @media (hover: hover) { @@ -2774,11 +2758,6 @@ inset: calc(var(--spacing) * 0); } } - .md\:order-1 { - @media (width >= 48rem) { - order: 1; - } - } .md\:order-2 { @media (width >= 48rem) { order: 2; @@ -2854,6 +2833,21 @@ height: 100vh; } } + .md\:w-64 { + @media (width >= 48rem) { + width: calc(var(--spacing) * 64); + } + } + .md\:w-72 { + @media (width >= 48rem) { + width: calc(var(--spacing) * 72); + } + } + .md\:w-80 { + @media (width >= 48rem) { + width: calc(var(--spacing) * 80); + } + } .md\:w-\[calc\(100\%-256px\)\] { @media (width >= 48rem) { width: calc(100% - 256px); @@ -2879,6 +2873,11 @@ grid-template-columns: repeat(2, minmax(0, 1fr)); } } + .md\:grid-cols-\[300px_1fr\] { + @media (width >= 48rem) { + grid-template-columns: 300px 1fr; + } + } .md\:flex-row { @media (width >= 48rem) { flex-direction: row; @@ -3104,6 +3103,11 @@ width: auto; } } + .lg\:table-fixed { + @media (width >= 64rem) { + table-layout: fixed; + } + } .lg\:grid-cols-2 { @media (width >= 64rem) { grid-template-columns: repeat(2, minmax(0, 1fr)); @@ -3459,11 +3463,6 @@ border-color: var(--color-red-800); } } - .dark\:bg-blue-600 { - &:where(.dark, .dark *) { - background-color: var(--color-blue-600); - } - } .dark\:bg-blue-900 { &:where(.dark, .dark *) { background-color: var(--color-blue-900); @@ -3718,15 +3717,6 @@ } } } - .dark\:hover\:bg-blue-700 { - &:where(.dark, .dark *) { - &:hover { - @media (hover: hover) { - background-color: var(--color-blue-700); - } - } - } - } .dark\:hover\:bg-blue-800 { &:where(.dark, .dark *) { &:hover { diff --git a/packages/sshecret-admin/src/sshecret_admin/static/css/style.css b/packages/sshecret-admin/src/sshecret_admin/static/css/style.css index fb98eea..5fe2654 100644 --- a/packages/sshecret-admin/src/sshecret_admin/static/css/style.css +++ b/packages/sshecret-admin/src/sshecret_admin/static/css/style.css @@ -19,3 +19,11 @@ sl-details.small-details::part(header) { sl-details.small-details::part(base) { font-size: var(--sl-input-font-size-small); } + +@media (prefers-color-scheme: dark) { + sl-details::part(base) { + background-color: var(--color-gray-700); + border: solid 1px var(--color-gray-500); + color: var(--color-gray-50); + } +}