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