<div id={@id} class="w-full overflow-x-auto border border-gray-600 rounded-lg shadow-lg bg-white">
  <table class="min-w-full table-auto text-center bg-white">
    <thead class="border-b border-primary-600">
      <tr>
        <%= for %{key: key, label: label} = column <- @columns do %>
          <%= if column |> Map.get(:sortable, true) do %>
            <th class={["p-2", column[:class]]}>
              <span
                class="cursor-pointer flex justify-center items-center space-x-2"
                phx-click="sort_by"
                phx-value-sort-key={key}
                phx-target={@myself}
              >
                <i class="w-0 float-right fas fa-sm fa-chevron-up opacity-0"></i>
                <span class={if @last_sort_key == key, do: "underline"}><%= label %></span>
                <%= if @last_sort_key == key do %>
                  <%= case @sort_mode do %>
                    <% :asc -> %>
                      <i class="w-0 float-right fas fa-sm fa-chevron-down"></i>
                    <% :desc -> %>
                      <i class="w-0 float-right fas fa-sm fa-chevron-up"></i>
                  <% end %>
                <% else %>
                  <i class="w-0 float-right fas fa-sm fa-chevron-up opacity-0"></i>
                <% end %>
              </span>
            </th>
          <% else %>
            <th class={["p-2 cursor-not-allowed", column[:class]]}>
              <%= label %>
            </th>
          <% end %>
        <% end %>
      </tr>
    </thead>
    <tbody>
      <tr
        :for={{values, i} <- @rows |> Enum.with_index()}
        class={if i |> Integer.is_even(), do: @row_class, else: @alternate_row_class}
      >
        <td :for={%{key: key} = value <- @columns} class={["p-2", value[:class]]}>
          <%= case values |> Map.get(key) do %>
            <% {_custom_sort_value, value} -> %>
              <%= value %>
            <% value -> %>
              <%= value %>
          <% end %>
        </td>
      </tr>
    </tbody>
  </table>
</div>