发布

  • v1404 e7215a16e5

    feat(homecore-ui iter 1): Modal + EntityForm + Add Entity flow

    frostbyte_neo 发布于 2026-05-26 18:33:01 +00:00

    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

    下载附件