www/roster/views/pmc/members.js.rb (251 lines of code) (raw):

# # Show PMC members # class PMCMembers < Vue def initialize @committee = {} @committers = [] end def render _h2.pmc! 'PMC (' + roster.length + ')' _p 'Click on column name to sort' _table.table.table_hover do _thead do _tr do _th if @@auth _th 'id', data_sort: 'string' _th 'githubUsername', data_sort: 'string' _th.sorting_asc 'public name', data_sort: 'string-ins' _th 'starting date', data_sort: 'string' _th 'status - click cell for actions', data_sort: 'string' end end _tbody do roster.each do |person| _PMCMember auth: @@auth, person: person, committee: @@committee end end end if @@committee.analysePrivateSubs or @@committee.isPMCMember _h4.crosscheck! 'Cross-check of private@ list subscriptions' _p { _ 'PMC entries above with (*) do not appear to be subscribed to the private list.' _br _ 'This could be because the person is subscribed with an address that is not in their LDAP record' } # separate out the known ASF members and extract any matching committer details unknownSubs = @@committee.unknownSubs asfMembers = @@committee.asfMembers unknownSecSubs = @@committee.unknownSecSubs # Any unknown subscribers? if unknownSubs.length > 0 _p { # We don't use the short-hand name: value syntax here to work-round Eclipse Ruby editor parsing bug _span.glyphicon.glyphicon_lock aria_hidden: true, :class => 'text-primary', 'aria-label' => 'ASF Members and private@ moderators' _ 'The following subscribers to the private list do not match the known emails for any of the existing PMC (or ASF) members.' _br _ 'They could be PMC (or ASF) members whose emails are not listed in their LDAP record.' _br _ 'Or they could be ex-PMC members who are still subscribed.' _br _br _ul { unknownSubs.each do |sub| person = sub['person'] if person _li { _ sub['addr'] _ ' ' _ person['name'] _ ' ' _a person['id'], href: "committer/#{person['id']}" } else _li { _ sub['addr'] _ ' ' _ '(not recognised)' } end end } } end # Any ASF members? if asfMembers.length > 0 _p { # We don't use the short-hand name: value syntax here to work-round Eclipse Ruby editor parsing bug _span.glyphicon.glyphicon_lock aria_hidden: true, :class => 'text-primary', 'aria-label' => 'ASF Members and private@ moderators' _ 'The following ASF members are also subscribed to the list.' _br _br _ul { asfMembers.each do |sub| person = sub['person'] if person _li { _strong { _ sub['addr'] _ ' ' _ person['name'] _ ' ' _a person['id'], href: "committer/#{person['id']}" } } end end } } end # Any unknown security@ subscribers? if unknownSecSubs.length > 0 _h2.crosschecksec! 'Check of security@ list subscriptions' _p { # We don't use the short-hand name: value syntax here to work-round Eclipse Ruby editor parsing bug _span.glyphicon.glyphicon_lock aria_hidden: true, :class => 'text-primary', 'aria-label' => 'ASF Members and private@ moderators' _ 'The following subscribers to the security@ list do not match the known emails for any of the existing PMC (or ASF) members.' _br _ 'They could be PMC (or ASF) members whose emails are not listed in their LDAP record.' _br _ 'Or they could be ex-PMC members who are still subscribed.' _br _br _ul { unknownSecSubs.each do |sub| person = sub['person'] if person _li { _ sub['addr'] _ ' ' _ person['name'] _ ' ' _a person['id'], href: "committer/#{person['id']}" } else _li { _ sub['addr'] _ ' ' _ '(not recognised)' } end end } } end else _h4 'Sorry, you do not have access to show private list subscription checks' end end def mounted() jQuery('.table', $el).stupidtable() end def roster result = [] for id in @@committee.roster if @@committee.members.include?(id) or @@committee.ldap.include?(id) person = @@committee.roster[id] person.id = id result << person end end result.sort_by {|person| person.name} end end # # Show a member of the PMC # class PMCMember < Vue def initialize @state = :closed end def render style = @@person.date ? '' : 'text-decoration: line-through' _tr do if @@auth _td do _input type: 'checkbox', checked: @@person.selected || false, onClick: -> {self.toggleSelect(@@person)} end end if @@person.member == true # full member _td { _b { _a @@person.id, href: "committer/#{@@person.id}", style: style } _a ' (*)', href: "committee/#{@@committee.id}#crosscheck", style: style if @@person.notSubbed } _td @@person.githubUsername, style: style _td { _b @@person.name, style: style } elsif @@person.member _td { _i { _a @@person.id, href: "committer/#{@@person.id}", style: style } _a ' (*)', href: "committee/#{@@committee.id}#crosscheck", style: style if @@person.notSubbed } _td @@person.githubUsername, style: style _td { _i @@person.name, style: style _ ' (' _ @@person.member.sub(%r{( \(Non-voting\))? Member}, '').sub(%r{^Emeritus}, 'ASF Emeritus'), style: style _ ')' } else _td { _a @@person.id, href: "committer/#{@@person.id}", style: style _a ' (*)', href: "committee/#{@@committee.id}#crosscheck", style: style if @@person.notSubbed } _td @@person.githubUsername, style: style _td @@person.name, style: style end _td @@person.date if @state == :open _td data_ids: @@person.id, onDoubleClick: self.select do if not @@person.date # in LDAP but not in committee-info.txt _button.btn.btn_warning 'Remove from LDAP', data_action: 'remove pmc', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Remove #{@@person.name} from LDAP?" unless @@committee.roster.keys().empty? _button.btn.btn_success 'Add to committee-info.txt', data_action: 'add info', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Add to #{@@person.name} committee-info.txt" end elsif not @@person.ldap # in committee-info.txt but not in LDAP _button.btn.btn_success 'Add to LDAP', data_action: 'add pmc', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Add #{@@person.name} to LDAP?" _button.btn.btn_warning 'Remove from committee-info.txt', data_action: 'remove info', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Remove #{@@person.name} from committee-info.txt?" else # in both LDAP and committee-info.txt if @@committee.committers.include? @@person.id _button.btn.btn_warning 'Remove only from PMC', data_action: 'remove pmc info', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Remove #{@@person.name} from the " + "#{@@committee.display_name} PMC but leave as a committer?" _button.btn.btn_warning 'Remove as committer and from PMC', data_action: 'remove pmc info commit', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Remove #{@@person.name} as committer and " + "from the #{@@committee.display_name} PMC?" else _button.btn.btn_warning 'Remove from PMC', data_action: 'remove pmc info', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Remove #{@@person.name} from the " + "#{@@committee.display_name} PMC?" _button.btn.btn_primary 'Add as a committer', data_action: 'add commit', data_target: '#confirm', data_toggle: 'modal', data_confirmation: "Grant #{@@person.name} committer access?" end end end elsif not @@person.date _td.issue.clickable 'not in committee-info.txt', onClick: self.select elsif not @@person.ldap _td.issue.clickable 'not in LDAP', onClick: self.select elsif not @@committee.committers.include? @@person.id _td.issue.clickable 'not in committer list', onClick: self.select elsif @@person.id == @@committee.chair _td.chair.clickable (@@committee.pmc_chair ? 'chair' : 'chair (not in pmc-chairs)'), onClick: self.select else _td.clickable '', onClick: self.select end end end # toggle display of buttons def select() return unless @@auth window.getSelection().removeAllRanges() @state = ( @state == :open ? :closed : :open ) end # toggle checkbox def toggleSelect(person) person.selected = !person.selected @@committee.refresh() end end