towerops/lib/towerops_web/live/admin/agent_live/index.html.heex
Graham McIntire 5a7cdc7138 refactor: apply custom color palette across entire codebase
- Replace gray->cool-steel, blue/indigo->cerulean, red->sweet-salmon, yellow/amber->wheat
- Dark sidebar: sidebar/footer use cool-steel-800 bg, text lightened for contrast
- ~11,600 color replacements across ~99 files
- Update tests for new color class names
2026-06-23 10:58:48 -05:00

153 lines
6.4 KiB
Text

<Layouts.admin flash={@flash} timezone={@timezone}>
<div class="space-y-6">
<div>
<h1 class="text-2xl font-bold text-cool-steel-900 dark:text-white">{t("All Agents")}</h1>
<p class="text-cool-steel-600 dark:text-cool-steel-400">
{t("Agents across all organizations and cloud pollers")}
</p>
</div>
<%!-- Cloud Pollers --%>
<%= if @has_cloud_pollers do %>
<div>
<h2 class="text-lg font-semibold text-cool-steel-900 dark:text-white mb-3">
<.icon name="hero-cloud" class="w-5 h-5 inline mr-1" /> Cloud Pollers
</h2>
<.table
id="cloud-pollers-table"
rows={@streams.cloud_pollers}
row_link={fn {_id, agent} -> ~p"/agents/#{agent.id}" end}
>
<:col :let={{_id, agent}} label={t("Name")}>
<div class="flex items-center gap-2">
<span class="font-medium">{agent.name}</span>
<%= if agent.allow_remote_debug do %>
<span class="inline-flex items-center gap-1 rounded-full bg-wheat-50 dark:bg-wheat-900/30 px-2 py-0.5 text-xs font-medium text-wheat-700 dark:text-wheat-300 ring-1 ring-inset ring-wheat-600/20 dark:ring-wheat-400/30">
<.icon name="hero-bug-ant" class="h-3 w-3" /> Debug
</span>
<% end %>
</div>
</:col>
<:col :let={{_id, agent}} label={t("Status")}>
<% {status, label} = agent_status(agent) %>
<span class={"inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium #{status_badge_class(status)}"}>
<span class={"h-1.5 w-1.5 rounded-full #{status_dot_class(status)}"} />
{label}
</span>
</:col>
<:col :let={{_id, agent}} label={t("Devices")}>
<% counts = Map.get(@device_counts, agent.id, %{direct: 0, total: 0}) %>
<div class="text-sm text-cool-steel-900 dark:text-white">
{counts.total} total
</div>
<div class="text-xs text-cool-steel-500 dark:text-cool-steel-400 mt-0.5">
{counts.direct} direct
<%= if counts.total > counts.direct do %>
· {counts.total - counts.direct} inherited
<% end %>
</div>
</:col>
<:col :let={{_id, agent}} label={t("Last Seen")}>
<div class="text-sm text-cool-steel-900 dark:text-white">
<.timestamp datetime={agent.last_seen_at} timezone={@timezone} now={@now} />
</div>
<%= if agent.last_seen_at do %>
<div class="text-xs text-cool-steel-500 dark:text-cool-steel-400 mt-0.5">
<.timestamp
datetime={agent.last_seen_at}
timezone={@timezone}
format="absolute"
/>
</div>
<% end %>
</:col>
<:col :let={{_id, agent}} label={t("Version")}>
<%= if agent.metadata["version"] do %>
<div class="text-sm text-cool-steel-600 dark:text-cool-steel-400 font-mono">
{format_agent_version(agent.metadata["version"])}
</div>
<% end %>
</:col>
</.table>
</div>
<% end %>
<%!-- Organization Agents --%>
<%= if @has_org_agents do %>
<div>
<h2 class="text-lg font-semibold text-cool-steel-900 dark:text-white mb-3">
<.icon name="hero-server" class="w-5 h-5 inline mr-1" /> Organization Agents
</h2>
<.table
id="org-agents-table"
rows={@streams.org_agents}
row_link={fn {_id, agent} -> ~p"/agents/#{agent.id}" end}
>
<:col :let={{_id, agent}} label={t("Name")}>
<div>
<div class="flex items-center gap-2">
<span class="font-medium">{agent.name}</span>
<%= if agent.allow_remote_debug do %>
<span class="inline-flex items-center gap-1 rounded-full bg-wheat-50 dark:bg-wheat-900/30 px-2 py-0.5 text-xs font-medium text-wheat-700 dark:text-wheat-300 ring-1 ring-inset ring-wheat-600/20 dark:ring-wheat-400/30">
<.icon name="hero-bug-ant" class="h-3 w-3" /> Debug
</span>
<% end %>
</div>
<div class="text-xs text-cool-steel-500 dark:text-cool-steel-400 mt-0.5">
{agent.organization.name}
</div>
</div>
</:col>
<:col :let={{_id, agent}} label={t("Status")}>
<% {status, label} = agent_status(agent) %>
<span class={"inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium #{status_badge_class(status)}"}>
<span class={"h-1.5 w-1.5 rounded-full #{status_dot_class(status)}"} />
{label}
</span>
</:col>
<:col :let={{_id, agent}} label={t("Devices")}>
<% counts = Map.get(@device_counts, agent.id, %{direct: 0, total: 0}) %>
<div class="text-sm text-cool-steel-900 dark:text-white">
{counts.total} total
</div>
<div class="text-xs text-cool-steel-500 dark:text-cool-steel-400 mt-0.5">
{counts.direct} direct
<%= if counts.total > counts.direct do %>
· {counts.total - counts.direct} inherited
<% end %>
</div>
</:col>
<:col :let={{_id, agent}} label={t("Last Seen")}>
<div class="text-sm text-cool-steel-900 dark:text-white">
<.timestamp datetime={agent.last_seen_at} timezone={@timezone} now={@now} />
</div>
<%= if agent.last_seen_at do %>
<div class="text-xs text-cool-steel-500 dark:text-cool-steel-400 mt-0.5">
<.timestamp
datetime={agent.last_seen_at}
timezone={@timezone}
format="absolute"
/>
</div>
<% end %>
</:col>
<:col :let={{_id, agent}} label={t("Version")}>
<%= if agent.metadata["version"] do %>
<div class="text-sm text-cool-steel-600 dark:text-cool-steel-400 font-mono">
{format_agent_version(agent.metadata["version"])}
</div>
<% end %>
</:col>
</.table>
</div>
<% end %>
</div>
</Layouts.admin>