Merge remote-tracking branch 'origin/master'

0402ff2 · gmorell · 2023-09-22 02:29

7 files +146 -1

Files changed

added lib/lambent_ex_web/live/index/index.ex
+83 −0
@@ -0,0 +1,83 @@
1 +defmodule LambentExWeb.IndexLive.Index do
2 + use LambentExWeb, :live_view
3 +
4 + alias LambentExWeb.IndexLive.Index
5 +
6 + @pubsub_name LambentEx.PubSub
7 +
8 + @impl true
9 + def mount(_params, _session, socket) do
10 + Phoenix.PubSub.subscribe(@pubsub_name, "machines_idx")
11 + Phoenix.PubSub.subscribe(@pubsub_name, "scan-82667777")
12 + Phoenix.PubSub.subscribe(@pubsub_name, "links_idx")
13 +
14 + {:ok, socket
15 + |> assign(:links, %{})
16 + |> assign(:machines, %{})
17 + |> assign(:devices, %{})
18 +
19 + |> assign(:selected_m, nil)
20 + |> assign(:selected_d, [])
21 + }
22 + end
23 +
24 + @impl true
25 + def handle_params(params, _url, socket) do
26 + {:noreply, apply_action(socket, socket.assigns.live_action, params)}
27 + end
28 +
29 + defp apply_action(socket, :index, _params) do
30 + socket
31 + |> assign(:page_link, "LambentEx")
32 + |> assign(:page_title, "LambentEx")
33 + end
34 +
35 + def handle_info({:machines_pub, machine}, socket) do
36 + {:noreply,
37 + socket |> assign(:machines, socket.assigns.machines |> Map.put(machine[:name], machine))}
38 + end
39 +
40 + def handle_info({:links_pub, link}, socket) do
41 + {:noreply, socket |> assign(:links, socket.assigns.links |> Map.put(link[:name], link))}
42 + end
43 +
44 + def handle_info({:devices_pub, device}, socket) do
45 + {:noreply,
46 + socket |> assign(:devices, socket.assigns.devices |> Map.put(device[:mac], device))}
47 + end
48 +
49 + def handle_event("selectm", %{"name" => name}, socket) do
50 + if socket.assigns.selected_m != name do
51 + {:noreply, socket |> assign(:selected_m, name)}
52 + else
53 + {:noreply, socket |> assign(:selected_m, nil)}
54 + end
55 + end
56 +
57 + def handle_event("selectd", %{"name" => name}, socket) do
58 + IO.inspect(Enum.member?(socket.assigns.selected_d, name))
59 + if Enum.member?(socket.assigns.selected_d, name) do
60 + {:noreply, socket |> assign(:selected_d, socket.assigns.selected_d |> List.delete(name))}
61 + else
62 + {:noreply, socket |> assign(:selected_d, socket.assigns.selected_d |> List.insert_at(0, name))}
63 + end
64 + end
65 +
66 + # functions
67 +
68 + def group_links(links) do
69 + links |> Map.values |> Enum.filter(fn x -> x.enabled end) |> Enum.group_by(fn e -> e.source end)
70 + end
71 +
72 + def find_unlinked_machines(links, machines) do
73 + used_machines = links |> Map.values |> Enum.filter(fn x -> x.enabled end) |> Enum.map(fn x -> x.source end) |> Enum.uniq |> MapSet.new |> IO.inspect
74 + machine_ids = machines |> Map.values |> Enum.map(fn x -> x.id end) |> MapSet.new |> IO.inspect
75 + MapSet.difference(machine_ids, used_machines)
76 + end
77 +
78 + def find_unlinked_devices(links, devices) do
79 + used_sources = links |> Map.values |> Enum.map(fn x -> x.target end) |> MapSet.new
80 +# device_ids = devices |> Map.values |> Enum.map(fn x -> x.id end) |> MapSet.new
81 + ["fake4", "fake5", "fake6"]
82 + end
83 +end
added lib/lambent_ex_web/live/index/index.html.heex
+62 −0
@@ -0,0 +1,62 @@
1 +<div class="flex flex-col">
2 + <div>
3 + <div class="font-bold text-xl">Actively Linked Machines and Devices </div>
4 + <%= for {source, links} <- @links |> group_links do %>
5 + <div class="flex justify-between">
6 + <div>
7 + <div class="stats shadow bg-secondary text-secondary-content">
8 + <div class="stat">
9 + <div class="stat-figure text-primary">
10 +
11 + </div>
12 + <div class="stat-title"></div>
13 + <div class="stat-value"><%= source %></div>
14 + <div class="stat-desc"></div>
15 + </div>
16 + </div>
17 + </div>
18 + <div> &rarr;</div>
19 + <div>
20 + <%= for l <- links do %>
21 + <span class="btn btn-xl btn-secondary"><%= l.target %></span>
22 + <% end %>
23 + </div>
24 + </div>
25 + <% end %>
26 + </div>
27 + <hr>
28 + <div class="flex justify-between">
29 + <div>
30 + <div class="font-bold text-xl">Unlinked Machines </div>
31 + <%= for m <- find_unlinked_machines(@links, @machines) do %>
32 + <div class={if @selected_m == m do "stats shadow bg-primary text-primary-content" else "stats shadow bg-secondary text-secondary-content" end} phx-click="selectm" phx-value-name={m}>
33 + <div class="stat">
34 + <div class="stat-figure text-primary">
35 +
36 + </div>
37 + <div class="stat-title"></div>
38 + <div class="stat-value"><%= m %></div>
39 + <div class="stat-desc"></div>
40 + </div>
41 + </div>
42 + <% end %>
43 + </div>
44 + <div>
45 + <%= if !is_nil(@selected_m) and !Enum.empty?(@selected_d) do %>
46 + <span class="btn btn-accent btn-lg">LINK IT</span>
47 + <% end %>
48 + </div>
49 + <div>
50 + <div class="font-bold text-xl">Unlinked Devices </div>
51 + <%= for d <- find_unlinked_devices(@links, @devices) do %>
52 + <%= if Enum.member?(@selected_d, d) do %>
53 + <span class="btn btn-xl btn-primary" phx-click="selectd" phx-value-name={d}><%= d %></span>
54 + <% else %>
55 + <span class="btn btn-xl btn-secondary" phx-click="selectd" phx-value-name={d}><%= d %></span>
56 + <% end %>
57 +
58 + <% end %>
59 + </div>
60 + </div>
61 +
62 +</div>
modified lib/lambent_ex_web/router.ex
+1 −1
@@ -17,7 +17,7 @@ defmodule LambentExWeb.Router do
17 17 scope "/", LambentExWeb do
18 18 pipe_through :browser
19 19
20 − get "/", PageController, :home
20 + live "/", IndexLive.Index, :index
21 21
22 22 live "/cfg/devices", DevicesLive.Index, :index
23 23 live "/cfg/machines", MachinesLive.Index, :index

Parents: 664b307 15b7934