From e00ecbf4c1ec0b89a0bbaad5f7f51d7702d0934b Mon Sep 17 00:00:00 2001
From: Adam Piontek <adam@73k.us>
Date: Mon, 8 Mar 2021 07:39:41 -0500
Subject: [PATCH] continuing improvements

---
 assets/js/app.js                              |   3 +
 .../live/shift_template_live/index.html.leex  | 122 +++++++++++-------
 .../live/shift_template_live/show.ex          |  21 ---
 .../live/shift_template_live/show.html.leex   |  52 --------
 .../live/user_management/index.html.leex      |  10 +-
 lib/shift73k_web/roles.ex                     |   4 +-
 lib/shift73k_web/router.ex                    |   3 -
 .../live/shift_template_live_test.exs         |  72 +++++------
 8 files changed, 121 insertions(+), 166 deletions(-)
 delete mode 100644 lib/shift73k_web/live/shift_template_live/show.ex
 delete mode 100644 lib/shift73k_web/live/shift_template_live/show.html.leex

diff --git a/assets/js/app.js b/assets/js/app.js
index b5943bc8..aeee1e5f 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -37,6 +37,9 @@ import "../node_modules/bootstrap-icons/icons/people.svg"; // users management
 // calendar/event icons
 import "../node_modules/bootstrap-icons/icons/calendar3-event.svg"; // brand
 import "../node_modules/bootstrap-icons/icons/clock-history.svg"; // brand
+import "../node_modules/bootstrap-icons/icons/hourglass.svg"; // brand
+import "../node_modules/bootstrap-icons/icons/geo.svg"; // brand
+import "../node_modules/bootstrap-icons/icons/justify-left.svg"; // brand
 
 // webpack automatically bundles all modules in your
 // entry points. Those entry points can be configured
diff --git a/lib/shift73k_web/live/shift_template_live/index.html.leex b/lib/shift73k_web/live/shift_template_live/index.html.leex
index 779a15b0..860b3439 100644
--- a/lib/shift73k_web/live/shift_template_live/index.html.leex
+++ b/lib/shift73k_web/live/shift_template_live/index.html.leex
@@ -20,59 +20,92 @@
     </div>
 
 
-    <div class="row justify-content-center">
-      <div class="col-12 col-sm-11 col-md-10 col-lg-8 col-xl-7 ">
+    <div class="row">
 
-        <%= for shift <- @shift_templates do %>
+      <%= for shift <- @shift_templates do %>
+
+        <div class="col-12 col-sm-11 col-md-9 col-lg-7 col-xl-6 ">
 
           <div class="card mt-4">
+            <h5 class="card-header">
+              <span class="visually-hidden">Subject:</span>
+              <%= shift.subject %>
+            </h5>
             <div class="card-body">
-              <h4 class="card-title"><%= shift.subject %></h4>
-              <h5 class="card-subtitle mb-2 text-muted">
-                <%= shift.start_time |> Calendar.strftime("%I:%M %p") %>
-                &mdash;
-                <%=
-                  shift.start_time
-                  |> Time.add((60 * 60 * shift.length_hours) + ((shift.length_minutes || 0) * 60))
-                  |> Calendar.strftime("%I:%M %p")
-                  %>
-                <span class="fs-6">[<%= shift.timezone %>]</span>
-              </h5>
-              <p class="card-text">
-                <table class="table table-borderless table-nonfluid">
-                  <tbody>
-                    <tr>
-                      <th scope="row" class="text-end">Description</th>
-                      <td>
-                        <%= if shift.description do %>
-                          <%= shift.description %>
-                        <% else %>
-                          <span class="text-muted fst-italic">empty</span>
-                        <% end %>
-                      </td>
-                    </tr>
-                    <tr>
-                      <th scope="row" class="text-end">Location</th>
-                      <td>
-                        <%= if shift.location do %>
-                          <%= shift.location %>
-                        <% else %>
-                          <span class="text-muted fst-italic">empty</span>
-                        <% end %>
-                      </td>
-                    </tr>
-                  </tbody>
-                </table>
-              </p>
-              <a href="#" class="card-link">Card link</a>
-              <a href="#" class="card-link">Another link</a>
+
+              <table class="table table-borderless table-nonfluid table-sm">
+                <tbody>
+                  <tr>
+                    <th scope="row" class="text-end">
+                      <%= icon_div @socket, "bi-hourglass", [class: "icon baseline text-muted"] %>
+                      <span class="visually-hidden">Hours</span>
+                    </th>
+                    <td>
+                      <%= shift.start_time |> Calendar.strftime("%I:%M%P") %>
+                      &mdash;
+                      <%=
+                        shift.start_time
+                        |> Time.add((60 * 60 * shift.length_hours) + ((shift.length_minutes || 0) * 60))
+                        |> Calendar.strftime("%I:%M%P")
+                        %>
+                    </td>
+                  </tr>
+
+
+
+
+                  <tr>
+                    <th scope="row" class="text-end">
+                      <%= icon_div @socket, "bi-geo", [class: "icon baseline text-muted"] %>
+                      <span class="visually-hidden">Location</span>
+                    </th>
+                    <td>
+                      <%= if shift.location do %>
+                        <%= shift.location %>
+                      <% else %>
+                        <span class="text-muted fst-italic">none</span>
+                      <% end %>
+                    </td>
+                  </tr>
+                  <tr>
+                    <th scope="row" class="text-end">
+                      <%= icon_div @socket, "bi-justify-left", [class: "icon baseline text-muted"] %>
+                      <span class="visually-hidden">Description</span>
+                    </th>
+                    <td>
+                      <%= if shift.description do %>
+                        <%= shift.description %>
+                      <% else %>
+                        <span class="text-muted fst-italic">none</span>
+                      <% end %>
+                    </td>
+                  </tr>
+                </tbody>
+              </table>
+
+              <div class="text-end">
+
+                <%= if Roles.can?(@current_user, shift, :delete) do %>
+                  <%= link to: "#", phx_click: "delete", phx_value_id: shift.id, data: [confirm: "Are you sure?"], class: "btn btn-outline-danger" do %>
+                    <%= icon_div @socket, "bi-trash", [class: "icon baseline", style: "margin-right:0.125rem;"] %>
+                    Delete
+                  <% end %>
+                <% end %>
+
+                <%= if Roles.can?(@current_user, shift, :edit) do %>
+                  <%= live_patch to: Routes.shift_template_index_path(@socket, :edit, shift), class: "btn btn-primary" do %>
+                    <%= icon_div @socket, "bi-pencil", [class: "icon baseline", style: "margin-right:0.125rem;"] %>
+                    Edit
+                  <% end %>
+                <% end %>
+              </div>
             </div>
           </div>
 
-        <% end %>
+        </div>
 
+      <% end %>
 
-      </div>
     </div>
 
 
@@ -102,7 +135,6 @@
             <td><%= shift.length_hours %>h <%= shift.length_minutes || 0 %>m</td>
 
             <td>
-              <span><%= live_redirect "Show", to: Routes.shift_template_show_path(@socket, :show, shift) %></span>
               <span><%= live_patch "Edit", to: Routes.shift_template_index_path(@socket, :edit, shift) %></span>
               <span><%= link "Delete", to: "#", phx_click: "delete", phx_value_id: shift.id, data: [confirm: "Are you sure?"] %></span>
             </td>
diff --git a/lib/shift73k_web/live/shift_template_live/show.ex b/lib/shift73k_web/live/shift_template_live/show.ex
deleted file mode 100644
index 084a69e9..00000000
--- a/lib/shift73k_web/live/shift_template_live/show.ex
+++ /dev/null
@@ -1,21 +0,0 @@
-defmodule Shift73kWeb.ShiftTemplateLive.Show do
-  use Shift73kWeb, :live_view
-
-  alias Shift73k.ShiftTemplates
-
-  @impl true
-  def mount(_params, _session, socket) do
-    {:ok, socket}
-  end
-
-  @impl true
-  def handle_params(%{"id" => id}, _, socket) do
-    {:noreply,
-     socket
-     |> assign(:page_title, page_title(socket.assigns.live_action))
-     |> assign(:shift_template, ShiftTemplates.get_shift_template!(id))}
-  end
-
-  defp page_title(:show), do: "Show Shift template"
-  defp page_title(:edit), do: "Edit Shift template"
-end
diff --git a/lib/shift73k_web/live/shift_template_live/show.html.leex b/lib/shift73k_web/live/shift_template_live/show.html.leex
deleted file mode 100644
index d663be70..00000000
--- a/lib/shift73k_web/live/shift_template_live/show.html.leex
+++ /dev/null
@@ -1,52 +0,0 @@
-<h1>Show Shift template</h1>
-
-<%= if @live_action in [:edit] do %>
-  <%= live_modal @socket, Shift73kWeb.ShiftTemplateLive.FormComponent,
-    id: @shift_template.id,
-    title: @page_title,
-    action: @live_action,
-    shift_template: @shift_template,
-    return_to: Routes.shift_template_show_path(@socket, :show, @shift_template) %>
-<% end %>
-
-<ul>
-
-  <li>
-    <strong>Subject:</strong>
-    <%= @shift_template.subject %>
-  </li>
-
-  <li>
-    <strong>Description:</strong>
-    <%= @shift_template.description %>
-  </li>
-
-  <li>
-    <strong>Location:</strong>
-    <%= @shift_template.location %>
-  </li>
-
-  <li>
-    <strong>Timezone:</strong>
-    <%= @shift_template.timezone %>
-  </li>
-
-  <li>
-    <strong>Start time:</strong>
-    <%= @shift_template.start_time %>
-  </li>
-
-  <li>
-    <strong>Length hours:</strong>
-    <%= @shift_template.length_hours %>
-  </li>
-
-  <li>
-    <strong>Length minutes:</strong>
-    <%= @shift_template.length_minutes %>
-  </li>
-
-</ul>
-
-<span><%= live_patch "Edit", to: Routes.shift_template_show_path(@socket, :edit, @shift_template), class: "button" %></span>
-<span><%= live_redirect "Back", to: Routes.shift_template_index_path(@socket, :index) %></span>
diff --git a/lib/shift73k_web/live/user_management/index.html.leex b/lib/shift73k_web/live/user_management/index.html.leex
index d36fb7ab..8cdb428e 100644
--- a/lib/shift73k_web/live/user_management/index.html.leex
+++ b/lib/shift73k_web/live/user_management/index.html.leex
@@ -112,18 +112,18 @@
             </td>
             <td class="align-middle text-end text-nowrap">
 
-              <%= live_patch to: Routes.user_management_index_path(@socket, :edit, user.id, Enum.into(@query, [])), class: "btn btn-outline-primary btn-sm text-nowrap" do %>
-                <%= icon_div @socket, "bi-pencil", [class: "icon baseline", style: "margin-right:0.125rem;"] %>
-                Edit
+              <%= if Roles.can?(@current_user, user, :edit) do %>
+                <%= live_patch to: Routes.user_management_index_path(@socket, :edit, user.id, Enum.into(@query, [])), class: "btn btn-outline-primary btn-sm text-nowrap" do %>
+                  <%= icon_div @socket, "bi-pencil", [class: "icon baseline", style: "margin-right:0.125rem;"] %>
+                  Edit
+                <% end %>
               <% end %>
 
               <%= if Roles.can?(@current_user, user, :delete) do %>
-
                 <button class="btn btn-outline-danger btn-sm text-nowrap" phx-click="delete-modal" phx-value-id="<%= user.id %>">
                   <%= icon_div @socket, "bi-trash", [class: "icon baseline", style: "margin-right:0.125rem;"] %>
                   Delete
                 </button>
-
               <% end %>
 
             </td>
diff --git a/lib/shift73k_web/roles.ex b/lib/shift73k_web/roles.ex
index ed8985b3..07751894 100644
--- a/lib/shift73k_web/roles.ex
+++ b/lib/shift73k_web/roles.ex
@@ -16,7 +16,7 @@ defmodule Shift73kWeb.Roles do
   def can?(%User{role: :admin}, %ShiftTemplate{}, _any), do: true
   def can?(%User{}, %ShiftTemplate{}, :index), do: true
   def can?(%User{}, %ShiftTemplate{}, :new), do: true
-  def can?(%User{}, %ShiftTemplate{}, :show), do: true
+  # def can?(%User{}, %ShiftTemplate{}, :show), do: true
   def can?(%User{id: id}, %ShiftTemplate{user_id: id}, :edit), do: true
   def can?(%User{id: id}, %ShiftTemplate{user_id: id}, :delete), do: true
 
@@ -25,7 +25,7 @@ defmodule Shift73kWeb.Roles do
   def can?(%User{role: :manager}, %User{}, :index), do: true
   def can?(%User{role: :manager}, %User{}, :new), do: true
   def can?(%User{role: :manager}, %User{}, :edit), do: true
-  def can?(%User{role: :manager}, %User{}, :show), do: true
+  # def can?(%User{role: :manager}, %User{}, :show), do: true
 
   # Final response
   def can?(_, _, _), do: false
diff --git a/lib/shift73k_web/router.ex b/lib/shift73k_web/router.ex
index 1f929c89..aa244e45 100644
--- a/lib/shift73k_web/router.ex
+++ b/lib/shift73k_web/router.ex
@@ -94,9 +94,6 @@ defmodule Shift73kWeb.Router do
     live "/my_shifts", ShiftTemplateLive.Index, :index
     live "/my_shifts/new", ShiftTemplateLive.Index, :new
     live "/my_shifts/:id/edit", ShiftTemplateLive.Index, :edit
-
-    live "/my_shifts/:id", ShiftTemplateLive.Show, :show
-    live "/my_shifts/:id/show/edit", ShiftTemplateLive.Show, :edit
   end
 
   # scope "/", Shift73kWeb do
diff --git a/test/shift73k_web/live/shift_template_live_test.exs b/test/shift73k_web/live/shift_template_live_test.exs
index 93c959ea..75cd2e34 100644
--- a/test/shift73k_web/live/shift_template_live_test.exs
+++ b/test/shift73k_web/live/shift_template_live_test.exs
@@ -5,9 +5,33 @@ defmodule Shift73kWeb.ShiftTemplateLiveTest do
 
   alias Shift73k.ShiftTemplates
 
-  @create_attrs %{description: "some description", length_hours: 12, length_minutes: 42, location: "some location", start_time: ~T[14:00:00], subject: "some subject", timezone: "some timezone"}
-  @update_attrs %{description: "some updated description", length_hours: 12, length_minutes: 43, location: "some updated location", start_time: ~T[15:01:01], subject: "some updated subject", timezone: "some updated timezone"}
-  @invalid_attrs %{description: nil, length_hours: nil, length_minutes: nil, location: nil, start_time: nil, subject: nil, timezone: nil}
+  @create_attrs %{
+    description: "some description",
+    length_hours: 12,
+    length_minutes: 42,
+    location: "some location",
+    start_time: ~T[14:00:00],
+    subject: "some subject",
+    timezone: "some timezone"
+  }
+  @update_attrs %{
+    description: "some updated description",
+    length_hours: 12,
+    length_minutes: 43,
+    location: "some updated location",
+    start_time: ~T[15:01:01],
+    subject: "some updated subject",
+    timezone: "some updated timezone"
+  }
+  @invalid_attrs %{
+    description: nil,
+    length_hours: nil,
+    length_minutes: nil,
+    location: nil,
+    start_time: nil,
+    subject: nil,
+    timezone: nil
+  }
 
   defp fixture(:shift_template) do
     {:ok, shift_template} = ShiftTemplates.create_shift_template(@create_attrs)
@@ -54,7 +78,9 @@ defmodule Shift73kWeb.ShiftTemplateLiveTest do
     test "updates shift_template in listing", %{conn: conn, shift_template: shift_template} do
       {:ok, index_live, _html} = live(conn, Routes.shift_template_index_path(conn, :index))
 
-      assert index_live |> element("#shift_template-#{shift_template.id} a", "Edit") |> render_click() =~
+      assert index_live
+             |> element("#shift_template-#{shift_template.id} a", "Edit")
+             |> render_click() =~
                "Edit Shift template"
 
       assert_patch(index_live, Routes.shift_template_index_path(conn, :edit, shift_template))
@@ -76,41 +102,11 @@ defmodule Shift73kWeb.ShiftTemplateLiveTest do
     test "deletes shift_template in listing", %{conn: conn, shift_template: shift_template} do
       {:ok, index_live, _html} = live(conn, Routes.shift_template_index_path(conn, :index))
 
-      assert index_live |> element("#shift_template-#{shift_template.id} a", "Delete") |> render_click()
+      assert index_live
+             |> element("#shift_template-#{shift_template.id} a", "Delete")
+             |> render_click()
+
       refute has_element?(index_live, "#shift_template-#{shift_template.id}")
     end
   end
-
-  describe "Show" do
-    setup [:create_shift_template]
-
-    test "displays shift_template", %{conn: conn, shift_template: shift_template} do
-      {:ok, _show_live, html} = live(conn, Routes.shift_template_show_path(conn, :show, shift_template))
-
-      assert html =~ "Show Shift template"
-      assert html =~ shift_template.description
-    end
-
-    test "updates shift_template within modal", %{conn: conn, shift_template: shift_template} do
-      {:ok, show_live, _html} = live(conn, Routes.shift_template_show_path(conn, :show, shift_template))
-
-      assert show_live |> element("a", "Edit") |> render_click() =~
-               "Edit Shift template"
-
-      assert_patch(show_live, Routes.shift_template_show_path(conn, :edit, shift_template))
-
-      assert show_live
-             |> form("#shift_template-form", shift_template: @invalid_attrs)
-             |> render_change() =~ "can&apos;t be blank"
-
-      {:ok, _, html} =
-        show_live
-        |> form("#shift_template-form", shift_template: @update_attrs)
-        |> render_submit()
-        |> follow_redirect(conn, Routes.shift_template_show_path(conn, :show, shift_template))
-
-      assert html =~ "Shift template updated successfully"
-      assert html =~ "some updated description"
-    end
-  end
 end