From 59b3d49a4f08db2638044eefc37bd7361e03b9cd Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Mon, 7 Apr 2025 00:17:17 +0200 Subject: [PATCH] chore(webui): iterate on the states page --- pkg/webui/html/states.html | 81 ++++++++++++++++++++++++++++---------- pkg/webui/static/main.css | 68 +++++++++++++++++++++++++------- 2 files changed, 113 insertions(+), 36 deletions(-) diff --git a/pkg/webui/html/states.html b/pkg/webui/html/states.html index fecfdee..4358f3d 100644 --- a/pkg/webui/html/states.html +++ b/pkg/webui/html/states.html @@ -1,10 +1,10 @@ {{ define "main" }}

States

-
-
-

TfStated is currently managing {{ len .States }} states.

+
+
+

TfStated is currently managing {{ len .States }} states.

Use this page to inspect the existing states.

-

You also have the option to upload a state file in order to create a new one. This is equivalent to using the state push command of OpenTofu/Terraform on a brand new state.

+

You also have the option to upload a JSON state file in order to create a new state in TfStated. This is equivalent to using the state push command of OpenTofu/Terraform on a brand new state.

@@ -12,35 +12,74 @@
- {{ if .PathDuplicate }} - This path already exist - {{ else if .PathError }} - A valid URL path beginning with a / is expected. - {{ end }} - +
- + {{ if .PathDuplicate }} + This path already exist. + {{ else if .PathError }} + + Path needs to be a valid + + absolute + + URL path is considered absolute when it starts with a / character. + + + and + + clean + + A URL path is considered clean when it has no relative path elements like ../, repeated // and when it does not end with a /. + + + URL path. + + {{ end }} +
+ +
-
- Path - Updated - Locked - {{ range .States }} - {{ .Path }} - {{ .Updated }} - {{ if eq .Lock nil }}no{{ else }}yes{{ end }} - {{ end }} +
+ + + + + + + + + + {{ range .States }} + + + + + + {{ end }} + +
PathUpdatedLocked
{{ .Path }}{{ .Updated }} + {{ if eq .Lock nil }} + unlocked + {{ else }} + + locked + + {{ .State.Lock }} + + + {{ end }} +
{{ end }} diff --git a/pkg/webui/static/main.css b/pkg/webui/static/main.css index c8f023b..6956316 100644 --- a/pkg/webui/static/main.css +++ b/pkg/webui/static/main.css @@ -67,18 +67,23 @@ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, display: block; } * { - box-sizing: border-box; -webkit-tap-highlight-color: transparent; } - *, *::before, *::after { box-sizing: border-box; } -textarea, -select, +label, input, -progress { - width: fit-content; +progress, +select, +textarea { + min-width: fit-content; + overflow: hidden; + text-overflow: ellipsis; +} +input:not([type=image i], [type=range i], [type=checkbox i], [type=radio i]) { + overflow: clip !important; + overflow-clip-margin: 0 !important; } html { @@ -242,7 +247,7 @@ fieldset { margin: 0px 0px 8px 0px; padding: 8px; } -button { +button, .button { background-color: var(--bg-2); border: 1px solid var(--orange); color: var(--orange); @@ -266,8 +271,8 @@ button:hover { color: var(--red); } .primary { - background-color: var(--orange); - color: var(--fg-1); + background-color: var(--orange) !important; + color: var(--fg-1) !important; } .flex-column { display: flex; @@ -376,19 +381,52 @@ footer a { display: flex; flex-direction: column; } + .flex-row { + flex-wrap: wrap; + } } - - -table tbody a { - display: block; - text-decoration: none; - transition: all 0.25s ease-out; +th { + border-bottom: 1px solid var(--fg-0); } .clickable-rows tbody tr:hover a { background-color: var(--secondary-container); } +.tooltip { + border-bottom: 1px dotted var(--fg-0); + display: inline-block; + position: relative; +} +.tooltip .tooltip-text { + background-color: var(--bg-1); + border: 1px solid var(--fg-0); + border-radius: 4px; + color: var(--fg-0); + left: 50%; + margin-left: -60px; + padding: 5px 0; + position: absolute; + text-align: center; + top: 100%; + visibility: hidden; + width: 120px; + z-index: 1; +} +.tooltip .tooltip-text::after { + border-color: transparent transparent var(--fg-0) transparent; + border-style: solid; + border-width: 5px; + bottom: 100%; /* At the top of the tooltip */ + content: " "; + left: 50%; + margin-left: -5px; + position: absolute; +} +.tooltip:hover .tooltip-text { + visibility: visible; +} + .material-icons { font-size: 16px; }