From 78e80ac169ac2408292f83510321ef4ec6d6bb7c Mon Sep 17 00:00:00 2001 From: Finn Bacall Date: Tue, 12 May 2026 11:05:49 +0100 Subject: [PATCH 1/2] Fix person form UX issues: - Fix indexes for unsaved people. Fixes #1295 - Ensure delete button works on newly-added people. Fixes #1304 - Ensure autocomplete works on existing people. Fixes #1305 --- app/assets/javascripts/people.js | 35 +++++++++++++++++--------- app/views/common/_people_form.html.erb | 2 +- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/people.js b/app/assets/javascripts/people.js index 752d70188..abaf31c02 100644 --- a/app/assets/javascripts/people.js +++ b/app/assets/javascripts/people.js @@ -13,8 +13,21 @@ const People = { // Replace the placeholder index with the actual index newForm = $(newForm.replace(/replace-me/g, index + 1)); newForm.appendTo(list); - const nameInput = newForm.find('.person-name'); - const orcidInput = newForm.find('.person-orcid'); + + People.bind(newForm); + + return newForm; + }, + + delete: function () { + $(this).parents('.person-form').fadeOut('fast', function() { + $(this).remove(); + }); + }, + + bind: function (element) { + const nameInput = element.find('.person-name'); + const orcidInput = element.find('.person-orcid'); const opts = { orientation: 'top', triggerSelectOnValidInput: false, @@ -32,19 +45,11 @@ const People = { formatResult: Autocompleters.formatResultWithHint } - opts.serviceUrl = list.parents('[data-role="people-form"]').data('autocompleteUrl'); + opts.serviceUrl = element.parents('[data-role="people-form"]').data('autocompleteUrl'); opts.dataType = 'json'; opts.deferRequestBy = 100; nameInput.autocomplete(opts); - - return newForm; - }, - - delete: function () { - $(this).parents('.person-form').fadeOut('fast', function() { - $(this).remove(); - }); }, init: function () { @@ -70,8 +75,14 @@ const People = { nextItem.find('input.form-control:first').focus(); } }); + + // Set up autocomplete on any existing fields + form.find('.person-form').each(function (node) { + People.bind($(this)); + }); + + $(form).on('change', '.delete-person-btn input.destroy-attribute', People.delete); }); - $('.delete-person-btn input.destroy-attribute').change(People.delete); } }; diff --git a/app/views/common/_people_form.html.erb b/app/views/common/_people_form.html.erb index d8a5cb76f..b6cb1b97c 100644 --- a/app/views/common/_people_form.html.erb +++ b/app/views/common/_people_form.html.erb @@ -22,7 +22,7 @@
<% f.object.send(field_name).each_with_index do |person, index| %> <%= render partial: 'common/person_form', - locals: { field_prefix: "#{model_name}[#{field_name}]", index: person.id, person: person, role: role } %> + locals: { field_prefix: "#{model_name}[#{field_name}]", index: person.id || (index + 1), person: person, role: role } %> <% end %>
From 7c72308f31060942578eda7ac65c7d3bee8bfe77 Mon Sep 17 00:00:00 2001 From: Finn Bacall Date: Tue, 12 May 2026 13:28:55 +0100 Subject: [PATCH 2/2] Ensure index will be unique --- app/views/common/_people_form.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/common/_people_form.html.erb b/app/views/common/_people_form.html.erb index b6cb1b97c..155b2ebdb 100644 --- a/app/views/common/_people_form.html.erb +++ b/app/views/common/_people_form.html.erb @@ -20,9 +20,10 @@ " value=""/>
+ <% id_offset = Person.maximum(:id) || 0 # Prevent collision with real IDs %> <% f.object.send(field_name).each_with_index do |person, index| %> <%= render partial: 'common/person_form', - locals: { field_prefix: "#{model_name}[#{field_name}]", index: person.id || (index + 1), person: person, role: role } %> + locals: { field_prefix: "#{model_name}[#{field_name}]", index: person.id || (index + id_offset + 1), person: person, role: role } %> <% end %>