rustploy-gui 0.1.2

Rustploy — desktop client (glacier-ui) for the Rustploy PaaS daemon
// Aba Secrets do projeto; a condição de carregamento vai na chamada.
component {
  resources {
    // Estados vazios das abas Secrets e Jobs do projeto (`fallback` do <foreach>).
    component(name = SemSecretsNoProjeto) {
      text(class = muted, content = "Nenhum secret neste projeto ainda.")
    }
  }

  column(class = env_wrap, if = @proj_loading, not_equals = true) {
    column(class = wh_block) {
      text(
        class = muted_fill,
        content = """
          Valores sensíveis (tokens, senhas, chaves de API) cifrados
          com a chave mestre do servidor. Depois de salvo, o valor
          nunca mais é exibido — para trocá-lo, salve um novo com o
          mesmo nome.
        """,
      )

      text(
        class = muted_fill,
        content = """
          Para usar num serviço: na aba Variáveis, ligue "usar secret"
          e escolha o nome; ou escreva <secret:NOME> (ou secret:NOME)
          como valor, no editor .env do projeto ou do serviço. Para
          clonar um repositório Git privado, use o nome do secret
          puro, sem prefixo, no campo Credentials da aba General do
          serviço.
        """,
      )

      text(
        class = muted_fill,
        content = """
          O valor real só é decifrado em memória, na hora do deploy.
        """,
      )
    }

    form(
      name = secret_add,
      on_submit = secret_add,
      on_validation_error = secret_add_apontar,
      width = fill,
      spacing = 8,
    ) {
      row(class = env_add) {
        input(
          class = env_in_key,
          form_control = sec_new_name,
          rules = required,
          msg = "informe um nome",
          placeholder = NOME,
        )
      }

      text(
        class = err,
        if = @erro_sec_new_name,
        not_empty,
        content = "@erro_sec_new_name",
      )

      row(class = env_add) {
        input(
          class = env_in_val,
          form_control = sec_new_val,
          rules = required,
          msg = "informe um valor",
          placeholder = "valor (cifrado ao salvar)",
        )
      }

      text(
        class = err,
        if = @erro_sec_new_val,
        not_empty,
        content = "@erro_sec_new_val",
      )

      row {
        button(
          type = submit,
          class = btn_primary,
          text = "Salvar secret",
        )
      }
    }

    hr

    scrollable(direction = vertical, class = env_list_scroll) {
      column(class = kv_list) {
        each @proj_secrets as s (fallback = SemSecretsNoProjeto) {
          row(class = kv_row) {
            button(
              class = env_del,
              on_click = secret_del:@s.name,
              text = "✕",
            )

            text(class = env_sep)
            text(class = env_key, content = "@s.name_display")
            text(class = kv_val_fill, content = "cifrado")
          }
        }
      }
    }
  }
}