- Sites schema with hierarchical parent-child relationships
- CRUD operations for sites
- Sites context with helper functions
- LiveView pages:
- /orgs/:slug/sites - List all sites
- /orgs/:slug/sites/new - Create new site
- /orgs/:slug/sites/:id - View site details
- /orgs/:slug/sites/:id/edit - Edit site
- Support for site locations and descriptions
- Site tree builder for hierarchy visualization
2. Equipment Management
- Equipment schema with monitoring fields
- IP address validation (IPv4 & IPv6)
- Equipment status tracking (up/down/unknown)
- Customizable check intervals per equipment
- Equipment context with CRUD operations
- LiveView pages:
- /orgs/:slug/equipment - List all equipment
- /orgs/:slug/equipment/new - Add equipment
- /orgs/:slug/equipment/:id - View equipment details
- /orgs/:slug/equipment/:id/edit - Edit equipment
- Equipment can be added from site pages
- Status badges and last checked timestamps
3. Database Schema
- sites table with self-referencing parent_site_id
- equipment table with status tracking
- All migrations run successfully
- Proper indexes on foreign keys and status
4. Features Implemented
- ✅ IP address validation using :inet.parse_address
- ✅ Site hierarchy with parent-child relationships
- ✅ Equipment linked to sites
- ✅ Monitoring enabled/disabled per equipment
- ✅ Customizable check intervals (30s - 3600s)
- ✅ Status tracking (up/down/unknown)
- ✅ Timestamps for last check and last status change
- ✅ Organization-scoped data (users only see their org's data)
33 lines
1,004 B
Text
33 lines
1,004 B
Text
<.header>
|
|
{@page_title}
|
|
<:subtitle>
|
|
{if @live_action == :new,
|
|
do: "Add a new site to your organization",
|
|
else: "Update site details"}
|
|
</:subtitle>
|
|
</.header>
|
|
|
|
<div class="max-w-2xl mt-8">
|
|
<.form for={@form} id="site-form" phx-change="validate" phx-submit="save">
|
|
<div class="space-y-4">
|
|
<.input field={@form[:name]} type="text" label="Site Name" required />
|
|
|
|
<.input
|
|
field={@form[:parent_site_id]}
|
|
type="select"
|
|
label="Parent Site (optional)"
|
|
prompt="No parent site"
|
|
options={Enum.map(@available_parent_sites, &{&1.name, &1.id})}
|
|
/>
|
|
|
|
<.input field={@form[:location]} type="text" label="Location" />
|
|
|
|
<.input field={@form[:description]} type="textarea" label="Description" />
|
|
|
|
<div class="flex gap-2">
|
|
<.button phx-disable-with="Saving...">Save Site</.button>
|
|
<.link navigate={~p"/orgs/#{@organization.slug}/sites"} class="btn">Cancel</.link>
|
|
</div>
|
|
</div>
|
|
</.form>
|
|
</div>
|