From ffa842aee10b7f1bcd9c2be24d97b19b8b2046ef Mon Sep 17 00:00:00 2001
From: Felix Eckhofer <felix@eckhofer.com>
Date: Mon, 6 Jan 2025 16:07:05 +0100
Subject: [PATCH] Remove already assigned users from unassigned list

This functionality was lost when moving to a template-based approach for
the list of all translators.

Fixes #32
---
 app/javascript/controllers/filteredlist_controller.js | 6 +++++-
 app/javascript/controllers/session_controller.js      | 2 +-
 app/views/assignments/_filteredlist.html.erb          | 2 +-
 app/views/assignments/_user_avatar.html.erb           | 2 +-
 app/views/candidates/_user_avatar.html.erb            | 2 +-
 app/views/sessions/_session.html.erb                  | 2 +-
 6 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/app/javascript/controllers/filteredlist_controller.js b/app/javascript/controllers/filteredlist_controller.js
index 2cabbaf..72026ab 100644
--- a/app/javascript/controllers/filteredlist_controller.js
+++ b/app/javascript/controllers/filteredlist_controller.js
@@ -51,9 +51,13 @@ export default class extends Controller {
       this.clearTarget.classList.add("hidden");
     }
 
+    const filter = document.querySelector(this.element.dataset.filterSelector);
+
     // Filter options by the `data-filteredlist-match` attribute
     for (const option of this.listTarget.children) {
-      if (option.dataset.filteredlistMatch.includes(query)) {
+      const uid = option.querySelector("a.add_button").dataset.user;
+      const unavailable = filter && filter.querySelector(`a[data-uid="${uid}"]`);
+      if (!unavailable && option.dataset.filteredlistMatch.includes(query)) {
         option.classList.remove("hidden");
       } else {
         option.classList.add("hidden");
diff --git a/app/javascript/controllers/session_controller.js b/app/javascript/controllers/session_controller.js
index 2be5137..6f16c2f 100644
--- a/app/javascript/controllers/session_controller.js
+++ b/app/javascript/controllers/session_controller.js
@@ -13,7 +13,7 @@ export default class extends Controller {
 
   connect() {
     const uid = document.body.dataset.loggedinUid;
-    const isCandidate = this.candidatesTarget.querySelector(`a.candidate[data-candidate-uid="${uid}"]`);
+    const isCandidate = this.candidatesTarget.querySelector(`a.candidate[data-uid="${uid}"]`);
     const isShiftcoordinator = document.body.dataset.isShiftcoordinator;
 
     this.element.querySelectorAll('.only-loggedin').forEach(el => {
diff --git a/app/views/assignments/_filteredlist.html.erb b/app/views/assignments/_filteredlist.html.erb
index be2746c..f6c3d2e 100644
--- a/app/views/assignments/_filteredlist.html.erb
+++ b/app/views/assignments/_filteredlist.html.erb
@@ -1,4 +1,4 @@
-<div data-controller="filteredlist" data-conference="<%= session.conference.slug %>" data-session="<%= session.ref_id %>">
+<div data-controller="filteredlist" data-conference="<%= session.conference.slug %>" data-session="<%= session.ref_id %>" data-filter-selector="#<%= dom_id(session) %> .assigned">
   <div class="relative">
     <input
       type="text"
diff --git a/app/views/assignments/_user_avatar.html.erb b/app/views/assignments/_user_avatar.html.erb
index bfc7e8d..02537db 100644
--- a/app/views/assignments/_user_avatar.html.erb
+++ b/app/views/assignments/_user_avatar.html.erb
@@ -2,7 +2,7 @@
 <span class="inline-flex items-center gap-x-0.5 rounded-md bg-gray-50 px-2 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10" style="background-color: <%= user.avatar_color %>" title="<%= user.name %>">
   <span style="color: <%= user.text_color %>"><%= user.name %></span>
   <button type="button" class="only-shiftcoordinator hidden group relative -mr-1 size-3.5 rounded-sm hover:bg-gray-500/20">
-    <%= link_to conference_session_assignment_path(assignment.session.conference, assignment.session, assignment), data: { turbo_method: :delete, confirm: 'Are you sure?' }, method: :delete do %>
+    <%= link_to conference_session_assignment_path(assignment.session.conference, assignment.session, assignment), data: { turbo_method: :delete, confirm: 'Are you sure?', uid: user.id }, method: :delete do %>
       <span class="sr-only">Remove</span>
       <svg viewBox="0 0 14 14" class="size-3.5 stroke-gray-600/50 group-hover:stroke-gray-600/75" style="stroke: <%= user.text_color %>">
         <path d="M4 4l6 6m0-6l-6 6" />
diff --git a/app/views/candidates/_user_avatar.html.erb b/app/views/candidates/_user_avatar.html.erb
index 12e8acb..a40fc17 100644
--- a/app/views/candidates/_user_avatar.html.erb
+++ b/app/views/candidates/_user_avatar.html.erb
@@ -3,7 +3,7 @@
 <span class="gap-x-0.5 rounded-md bg-gray-50 px-2 py-1 text-xs font-medium text-gray-600 ring-1 ring-inset ring-gray-500/10" style="background-color: <%= user.avatar_color %>" title="<%= user.name %>">
   <span style="color: <%= user.text_color %>"><%= user.name %></span>
   <button type="button" class="only-shiftcoordinator hidden group relative -mr-1 size-3.5 rounded-sm hover:bg-gray-500/20">
-    <%= link_to conference_session_assignments_path(session.conference, session, user_id: user.id), class: "candidate", data: { turbo_method: :post, turbo_frame: dom_id(session), candidate_uid: user.id } do %>
+    <%= link_to conference_session_assignments_path(session.conference, session, user_id: user.id), class: "candidate", data: { turbo_method: :post, turbo_frame: dom_id(session), uid: user.id } do %>
       <span class="sr-only">Add</span>
       <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 16 16" stroke-width="1" class="size-3.5 stroke-gray-600/50 group-hover:stroke-gray-600/75 fill-gray-600/50" style="stroke: <%= user.text_color %>; fill: <%= user.text_color %>">
         <path d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z" />
diff --git a/app/views/sessions/_session.html.erb b/app/views/sessions/_session.html.erb
index b0584be..f145ef1 100644
--- a/app/views/sessions/_session.html.erb
+++ b/app/views/sessions/_session.html.erb
@@ -73,7 +73,7 @@
     <% end %>
 
     <small>assigned (<%= session.assignments.length %>)</small>
-    <ul class="inline-flex flex-wrap gap-1 my-1">
+    <ul class="assigned inline-flex flex-wrap gap-1 my-1">
       <% session.assignments.each do |assignment| %>
         <li>
           <span class="assigned-user"><%= render partial: 'assignments/user_avatar', locals: { assignment: assignment } %></span>
-- 
GitLab