This is an automated email from the ASF dual-hosted git repository.

sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/whimsy.git


The following commit(s) were added to refs/heads/master by this push:
     new 9f3ba174 Show existing seconds on form
9f3ba174 is described below

commit 9f3ba17471338ea0a1e2fc2158fe178712bc9e36
Author: Sebb <[email protected]>
AuthorDate: Wed Feb 18 14:16:30 2026 +0000

    Show existing seconds on form
---
 lib/whimsy/asf/member-files.rb | 23 ++++++++++++-----------
 www/members/second_board.cgi   | 24 +++++++++++++++++++++---
 www/members/second_member.cgi  | 24 +++++++++++++++++++++---
 3 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/lib/whimsy/asf/member-files.rb b/lib/whimsy/asf/member-files.rb
index 72520af2..cf3d75a9 100644
--- a/lib/whimsy/asf/member-files.rb
+++ b/lib/whimsy/asf/member-files.rb
@@ -113,7 +113,8 @@ module ASF
           else
             outkey = NAME2OUTPUTKEY[k]
             raise ArgumentError.new "Unexpected regex capture name: #{k}" if 
outkey.nil?
-            v = v.split("\n") if k == 'statement' or k == 'seconds'
+            v = v.split("\n") if k == 'statement'
+            v = v.split(%r{ *[,\n] *}) if k == 'seconds' # split by comma and 
newline, stripping spaces
             nominee[outkey] = v
           end
         end
@@ -121,20 +122,20 @@ module ASF
       end
     end
 
-    # return nomination entry headers
-    def self.nomination_headers()
-      noms = []
-      self.parse_file(NOMINATED_MEMBERS) do |x, _y|
-        noms << x
+    # return member nomination entry headers as hash of nominees and seconds
+    def self.nominated_members()
+      noms = {}
+      self.parse_file(NOMINATED_MEMBERS) do |x, y|
+        noms[x] = y['Seconded by']
       end
       noms
     end
 
-    # return board entry headers
-    def self.board_headers()
-      noms = []
-      self.parse_file(NOMINATED_BOARD) do |x, _y|
-        noms << x
+    # return board nomination entry headers as hash of nominees and seconds
+    def self.nominated_board()
+      noms = {}
+      self.parse_file(NOMINATED_BOARD) do |x, y|
+        noms[x] = y['Seconded by']
       end
       noms
     end
diff --git a/www/members/second_board.cgi b/www/members/second_board.cgi
index fbb77095..f3d5665f 100755
--- a/www/members/second_board.cgi
+++ b/www/members/second_board.cgi
@@ -40,15 +40,18 @@ def find_mesgid(subject)
   nil
 end
 
-def emit_form(title, prev_data)
+def emit_form(title, prev_data, nominees)
   _whimsy_panel(title, style: 'panel-success') do
     _form.form_horizontal method: 'post' do
       field = 'nominee'
       _whimsy_forms_select(label: 'Nominee', name: field,
         multiple: false,
-        options: ASF::MemberFiles.board_headers,
+        options: nominees,
+        selectExtra: {onChange: 'show_seconds()'},
         helptext: 'Select the nominee you are seconding for the ASF Board'
       )
+      _whimsy_forms_input(label: 'Existing Seconds', name: 'seconds', 
readonly: true, value: ''
+      )
       _whimsy_forms_input(label: 'Seconded by', name: 'secby', readonly: true, 
value: $USER
       )
       field = 'statement'
@@ -151,6 +154,7 @@ end
 
 # Produce HTML
 _html do
+  nominations = ASF::MemberFiles.nominated_board
   _body? do
     # Countdown until nominations for current meeting close
     latest_meeting_dir = ASF::MeetingUtil.latest_meeting_dir
@@ -229,10 +233,24 @@ _html do
               _ 'Sorry, no further seconds will be accepted for ballots at 
this meeting.'
             end
           else
-            emit_form('Enter your New Board second', {})
+            emit_form('Enter your New Board second', {}, nominations.keys)
           end
         end
       end
     end
+    # '_' does not work in _script blocks when wunderbar/bootstrap (i.e. 
wunderbar/jquery is included)
+    # so create the JS code as a string
+    jscode = []
+    jscode << 'let map = new Map();'
+    nominations.each do |k,v|
+      jscode << "map.set(#{k.inspect}, #{v.inspect});"
+    end
+    jscode.push <<~'EOJSCODE'
+    function show_seconds() {
+      let nominee = document.getElementById('nominee').value;
+      document.getElementById('seconds').value = map.get(nominee);
+    }
+    EOJSCODE
+    _script jscode.join("\n")
   end
 end
diff --git a/www/members/second_member.cgi b/www/members/second_member.cgi
index 15d182fc..cde1b40c 100755
--- a/www/members/second_member.cgi
+++ b/www/members/second_member.cgi
@@ -40,15 +40,18 @@ def find_mesgid(subject)
   nil
 end
 
-def emit_form(title, prev_data)
+def emit_form(title, prev_data, nominees)
   _whimsy_panel(title, style: 'panel-success') do
     _form.form_horizontal method: 'post' do
       field = 'nominee'
       _whimsy_forms_select(label: 'Nominee', name: field,
         multiple: false,
-        options: ASF::MemberFiles.nomination_headers,
+        options: nominees,
+        selectExtra: {onChange: 'show_seconds()'},
         helptext: 'Select the nominee you are seconding for ASF Membership'
       )
+      _whimsy_forms_input(label: 'Existing Seconds', name: 'seconds', 
readonly: true, value: ''
+      )
       _whimsy_forms_input(label: 'Seconded by', name: 'secby', readonly: true, 
value: $USER
       )
       field = 'statement'
@@ -151,6 +154,7 @@ end
 
 # Produce HTML
 _html do
+  nominations = ASF::MemberFiles.nominated_members
   _body? do
     # Countdown until nominations for current meeting close
     latest_meeting_dir = ASF::MeetingUtil.latest_meeting_dir
@@ -233,10 +237,24 @@ _html do
               # _a 'See existing nominations.', href: 
'/members/check_membernoms.cgi'
             end
           else
-            emit_form('Enter your New Member second', {})
+            emit_form('Enter your New Member second', {}, nominations.keys)
           end
         end
       end
     end
+    # '_' does not work in _script blocks when wunderbar/bootstrap (i.e. 
wunderbar/jquery is included)
+    # so create the JS code as a string
+    jscode = []
+    jscode << 'let map = new Map();'
+    nominations.each do |k,v|
+      jscode << "map.set(#{k.inspect}, #{v.inspect});"
+    end
+    jscode.push <<~'EOJSCODE'
+    function show_seconds() {
+      let nominee = document.getElementById('nominee').value;
+      document.getElementById('seconds').value = map.get(nominee);
+    }
+    EOJSCODE
+    _script jscode.join("\n")
   end
 end

Reply via email to