blob: b23639a87a4fbfc693ed449fcda7f6f06f363666 [file] [log] [blame]
class CommitterSearch < Vue
def initialize
@list = []
@ready = false
@search = ''
@committers = []
end
def mounted()
if @@notinavail
local_var = 'roster-committers-notinavail'
url = 'committer2/index.json'
else
local_var = 'roster-committers'
url = 'committer/index.json'
end
# start with (possibly stale) data from local storage when available
ls_committers = localStorage.getItem(local_var)
if ls_committers
@committers = JSON.parse(ls_committers)
@ready = true
self.change(target: {value: @search}) unless @search.empty?
end
# load fresh data from the server
Polyfill.require(%w(Promise fetch)) do
fetch(url, credentials: 'include').then {|response|
response.json().then do |committers|
@committers = committers
@ready = true
self.change(target: {value: @search}) unless @search.empty?
localStorage.setItem(local_var, @committers.inspect)
end
}.catch {|error|
console.log error
}
end
end
def change(event)
@search = event.target.value
search = @search.downcase().split(' ')
list = []
@list = list
@committers.each do |person|
if
search.all? {|part|
if person.id
person.id.include? part or
person.name.downcase().include? part or
person.mail.any? {|mail| mail.include? part} or
person.githubUsername.any? {|ghun| ghun.downcase().include? part}
else
person.name.downcase().include? part or
person.mail.include? part
end
}
then
unless @@exclude and @@exclude.include? person.id
if not @@include or @@include.empty? or @@include.include? person.id
list << person
end
end
end
end
end
def render
_div.form_group do
_label.control_label.col_sm_3 'Search for', for: 'search-text'
_div.col_sm_9 do
_div.input_group do
_input.form_control autofocus: true, value: @search,
onInput: self.change
_span.input_group_addon do
_span.glyphicon.glyphicon_user aria_label: "Committer ID or name"
end
end
end
end
if @search.length
if not @ready
_p 'loading...'
else
search = @search.downcase().split(' ')
list = @list
if list.length == 0
_p 'none found'
elsif list.length > 99
_p "#{list.length} entries match"
else
_table.table.table_hover do
_thead do
_tr do
_th
_th 'id'
_th 'public name'
_th 'email'
_th 'githubUsername'
if @@notinavail
_th 'ICLA'
end
end
end
_tbody do
list.each do |person|
_tr do
if person.id
_td "\u2795", data_id: person.id, onClick: self.select
_td {_a person.id, href: "committer/#{person.id}"}
else
_td "\u2795"
_td 'notinavail'
end
if person.member
_td {_b person.name}
else
_td person.name
end
if person.id
_td person.mail.first
else
_td person.mail
end
if person.githubUsername
_td person.githubUsername.join(', ')
else
_td ''
end
if @@notinavail
# iclapath already ends in /
_td { _a person.claRef, href: "#{@@iclapath}#{person.iclaFile}" }
end
end
end
if @@add
_tr do
_td "Click on \u2795 to add.", colspan: 4
end
end
end
end
end
end
end
end
def select(event)
if @@add
id = event.currentTarget.dataset.id
person = @list.find {|person| person.id == id}
@@add.call(person)
@search = ''
end
end
end