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