ruview @ v1404
integrity
- size
- 60.4 MiB
- downloaded
- last checked
release notes
Automated release from CI pipeline
Changes: feat(homecore-ui iter 1): Modal + EntityForm + Add Entity flow
First CRUD increment. Click "+ Add entity" on the Dashboard toolbar → modal opens → form with entity_id / state / attributes fields → Create validates client-side then POSTs /api/states/ → modal closes, toast confirms, dashboard refreshes.
New components: frontend/src/components/Modal.ts (~110 LOC) — reusable accessible overlay. open property; closes on Escape and backdrop click. Heading prop; default + footer slots.
frontend/src/components/EntityForm.ts (~130 LOC) — three-field form with public requestSubmit()/requestCancel() methods. Client-side validation: - entity_id matches /^[a-z][a-z0-9_].[a-z][a-z0-9_]$/ - state non-empty - attributes parses as a JSON object (rejects array/scalar) Emits hc-entity-submit / hc-entity-cancel events for host to handle. Footer buttons live in the host (modal slot=footer).
frontend/src/pages/Dashboard.ts (+60 LOC) — toolbar with "+ Add entity" button, modal state, POST handler that wraps fetch with bearer token, success toast (3 s), refresh().
Browser-verified end-to-end (real homecore-server :8123):
- Toolbar button visible: Y
- Modal opens: Y
- 3/3 validation paths fire correctly: BadID → "entity_id must match domain.snake_case" blank state → "state must not be empty" [1,2,3] attrs → "attributes must be a JSON object"
- Successful create: light.test_bulb POSTed; modal closes; toast "Created light.test_bulb = on"; grid count went 10 → 11
- Persistence: hard reload, count stays
- 0 console errors (Lit dev-mode notices excluded)
Note: TypeScript caught a name collision — attributes is reserved
on HTMLElement (NamedNodeMap). Renamed the Lit @property to
entityAttrs so the class extends LitElement cleanly.
Co-Authored-By: claude-flow ruv@ruv.net
Docker Image:
ghcr.io/ruvnet/RuView:e7215a16e57656aa1fe6874ba260fc8844dd665c
download
curl -fL -o v1404.zip https://ratatoskr.space/pkg/ruview/v1404.zip
printf '%s %s\n' 'fe1f75c3b4fc7bc5ddfed83de7325ddfaf223a61f172df6eea22cd951ae89ba5' 'v1404.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1404.zip"
$out = "v1404.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "fe1f75c3b4fc7bc5ddfed83de7325ddfaf223a61f172df6eea22cd951ae89ba5") { throw "sha256 mismatch" }
curl -fL -o v1404.tar.gz https://ratatoskr.space/pkg/ruview/v1404.tar.gz
printf '%s %s\n' '2c07df857c141f39c699fe139bd9503239b83ec4f5eeec194781b1d632c1a136' 'v1404.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1404.tar.gz"
$out = "v1404.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "2c07df857c141f39c699fe139bd9503239b83ec4f5eeec194781b1d632c1a136") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v1404.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1404.zip
printf '%s %s\n' 'fe1f75c3b4fc7bc5ddfed83de7325ddfaf223a61f172df6eea22cd951ae89ba5' 'v1404.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1404.zip"
$out = "v1404.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "fe1f75c3b4fc7bc5ddfed83de7325ddfaf223a61f172df6eea22cd951ae89ba5") { throw "sha256 mismatch" }
curl -fL -o v1404.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1404.tar.gz
printf '%s %s\n' '2c07df857c141f39c699fe139bd9503239b83ec4f5eeec194781b1d632c1a136' 'v1404.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1404.tar.gz"
$out = "v1404.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "2c07df857c141f39c699fe139bd9503239b83ec4f5eeec194781b1d632c1a136") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v1404.zip | zip | 60.4 MiB |
blake3-24 ea942e1cbd610d760487422390533c4e7a593b6be5137170
sha256 fe1f75c3b4fc7bc5ddfed83de7325ddfaf223a61f172df6eea22cd951ae89ba5
sha1 4ea8b55a81c135ac3dcacd9cb555fa1ca28652ec
|
| v1404.tar.gz | tar.gz | 58.7 MiB |
blake3-24 e8a5aab74ea277a02950594127ad9918ddc153c27c0d9e6e
sha256 2c07df857c141f39c699fe139bd9503239b83ec4f5eeec194781b1d632c1a136
sha1 ca98c801ea14c06cfc29f939fd3e27c40e6c2e8b
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v1404.tar.gz"],
integrity = "sha256-LAffhXwUHznGmf4Tm9lQMjm4PsT17uwZR4Gx1jLBoTY=",
strip_prefix = "ruview-v1404",
)
.url = "https://ratatoskr.space/pkg/ruview/v1404.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1404.tar.gz"],
integrity = "sha256-LAffhXwUHznGmf4Tm9lQMjm4PsT17uwZR4Gx1jLBoTY=",
strip_prefix = "ruview-v1404",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1404.tar.gz",