Files
ubicloud/views/project/dashboard.erb
2025-08-08 11:31:11 -07:00

150 lines
5.3 KiB
Plaintext

<% @page_title = "#{@project.name} Dashboard"
check_perms =
lambda do |a|
perm = a[-1]
perm = has_project_permission(perm) if perm.is_a?(String)
a[-1] = perm
end
tiles = [
["Virtual Machines", @project.vms_dataset.count, "#{@project.path}/vm", "Vm:create"],
["Databases", @project.postgres_resources_dataset.count, "#{@project.path}/postgres", "Postgres:create"],
[
"Load Balancers",
@project.load_balancers_dataset.count,
"#{@project.path}/load-balancer",
"LoadBalancer:create"
],
["Firewalls", @project.firewalls_dataset.count, "#{@project.path}/firewall", "Firewall:create"],
[
"GitHub Runners",
@project.github_runners_dataset.count,
"#{@project.path}/github",
("Project:github" if Config.github_app_name)
],
["Users", @project.accounts_dataset.count, "#{@project.path}/user", "Project:user"]
]
# Use .each.partition so that hidden rows are shuffled to the end.
# That's done because the visual display if you have missing elements is not good.
# Ideally, we would remove elements without permission instead, but I cannot figure
# out how to make that look good visually using tailwind.
tiles = tiles.each(&check_perms).partition(&:last)
# rubocop:disable Performance/Sum
# Rubocop is stupid here, assuming that elements are numeric, and trying to convert reduce(:+) to sum.
# sum does not work correctly if the elements are arrays.
tiles = tiles.reduce(:+)
# rubocop:enable Performance/Sum
cards = [
[
"hero-server-stack",
"Create Virtual Machine",
"Linux-based virtual machines that run on top of virtualized hardware. Comprehensive, cost-effective computing.",
"#{@project.path}/vm/create",
"Vm:create"
],
[
"github",
"Use GitHub Runners",
"10x cost-effective managed GitHub Actions runners. Install our GitHub app and change one line in your workflow file.",
"#{@project.path}/github",
("Project:github" if Config.github_app_name)
],
[
"hero-circle-stack",
"Create Managed Database",
"Fully managed PostgreSQL database. Handles backup / restore, health monitoring, high availability, and more for you.",
"#{@project.path}/postgres",
"Postgres:create"
],
[
"hero-users",
"Add User to Project",
"Get started by adding other users to your project to be able to share resources and collaborate with them.",
"#{@project.path}/user",
"Project:user"
],
[
"hero-arrows-pointing-out",
"Load Balance Your Traffic",
"Create a load balancer to distribute your traffic across multiple VMs. Ensure high availability for your apps.",
"#{@project.path}/load-balancer",
"LoadBalancer:create"
],
[
"hero-key",
"Create Access Token",
"Create as many personal access tokens as you want and manage your resources programmatically.",
"#{@project.path}/token",
"Project:token"
],
[
"hero-document-text",
"Documentation",
"Learn more about our managed services and detailed architecture by exploring our documentation.",
"https://www.ubicloud.com/docs",
true
],
[
"hero-envelope",
"Get Support",
"If you need any help with Ubicloud, reach out to our support team for help at support@ubicloud.com.",
"https://www.ubicloud.com/docs/about/support",
true
]
].select(&check_perms) %>
<%== part("components/page_header", title: "Hi, #{current_account.name}") %>
<div id="tiles" class="grid gap-6">
<div
class="mb-5 grid grid-cols-2 divide-x divide-y divide-gray-200 overflow-hidden rounded-lg bg-white shadow lg:grid-cols-3 xl:grid-cols-6 xl:divide-y-0"
>
<% tiles.each do |title, count, link, perm| %>
<% if perm %>
<a href="<%= link %>">
<div class="px-4 py-5 sm:p-6">
<dt class="truncate text-sm font-medium text-gray-900"><%= title %></dt>
<dd class="mt-1 text-3xl font-semibold tracking-tight text-orange-600">
<%= count %></dd>
</div>
</a>
<% else %>
<div></div>
<% end %>
<% end %>
</div>
<h2 class="text-xl font-bold leading-7 text-gray-900 sm:truncate sm:text-2xl sm:tracking-tight">Getting Started with your Project</h2>
<div id="cards" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 md:gap-6 lg:gap-8">
<% cards.each do |icon, title, description, link| %>
<div
class="rounded-lg shadow group relative bg-white p-6 focus-within:ring-2 focus-within:ring-inset focus-within:ring-orange-600"
>
<div>
<span class="inline-flex rounded-lg p-3 bg-orange-50 text-orange-700 ring-4 ring-white">
<%== part("components/icon", name: icon) %>
</span>
</div>
<div class="mt-8">
<h3 class="text-base font-semibold leading-6 text-gray-900">
<a href="<%= link %>" class="focus:outline-none">
<!-- Extend touch target to entire panel -->
<span class="absolute inset-0" aria-hidden="true"></span>
<%= title %>
</a>
</h3>
<p class="mt-2 text-sm text-gray-500"><%= description %></p>
</div>
<span class="pointer-events-none absolute right-6 top-6 text-gray-300 group-hover:text-gray-400">
<%== part("components/icon", name: "hero-arrow-up-right") %>
</span>
</div>
<% end %>
</div>
</div>