blob: 9fbc4e9fce7128bc553b2892a88a11d28eb602b1 [file] [log] [blame]
#
# Routing request based on path and query information in the URL
#
# Additionally provides defaults for color and title, and
# determines what buttons are required.
#
# Returns item, buttons, and options
class Router
# route request based on path and query from the window location (URL)
def self.route(path, query)
options = {}
if not path or path == '.'
item = Agenda
elsif path == 'search'
item = {view: Search, query: query}
elsif path == 'comments'
item = {view: Comments}
elsif path == 'backchannel'
item = {view: Backchannel, title: 'Agenda Backchannel',
online: Server.online}
elsif path == 'queue'
item = {view: Queue, title: 'Queued approvals and comments'}
item.title = 'Queued comments' unless User.role == :director
elsif path == 'flagged'
item = {view: Flagged, title: 'Flagged reports'}
elsif path == 'rejected'
item = {view: Rejected, title: 'Reports which were NOT accepted'}
elsif path == 'missing'
buttons = [{form: InitialReminder}, {button: FinalReminder}]
if Agenda.index.any? {|item| item.nonresponsive}
buttons << {form: ProdReminder}
end
item = {view: Missing, title: 'Missing reports', buttons: buttons}
elsif path =~ %r{^flagged/[-\w]+$}
item = Agenda.find(path[8..-1])
options = {traversal: :flagged}
elsif path =~ %r{^queue/[-\w]+$}
item = Agenda.find(path[6..-1])
options = {traversal: :queue}
elsif path =~ %r{^shepherd/queue/[-\w]+$}
item = Agenda.find(path[15..-1])
options = {traversal: :shepherd}
elsif path =~ %r{^shepherd/\w+$}
shepherd = path[9..-1]
item = {view: Shepherd, shepherd: shepherd, next: nil, prev: nil,
title: "Shepherded by #{shepherd}"}
# determine next/previous links
Agenda.index.each do |i|
if i.shepherd and i.comments
next if i.shepherd.include? ' '
href = "shepherd/#{i.shepherd}"
if i.shepherd > shepherd
if not item.next or item.next.href > href
item.next = {title: i.shepherd, href: href}
end
elsif i.shepherd < shepherd
if not item.prev or item.prev.href < href
item.prev = {title: i.shepherd, href: href}
end
end
end
end
elsif path == 'feedback'
item = {view: Feedback, title: 'Send Feedback'}
elsif path == 'help'
item = {view: Help}
# Progressive Web Application 'Add to Home Screen' support
item.buttons = [{button: Install}] if PageCache.installPrompt
elsif path == 'secrets'
item = {view: InsiderSecrets}
elsif path == 'bootstrap.html'
item = {view: BootStrapPage, title: ' '}
elsif path == 'cache/'
item = {view: CacheStatus}
elsif path =~ %r{^cache/}
item = {view: CachePage}
elsif path == 'Discussion-Items'
item = nil
Agenda.index.each do |i|
if i.attach =~ /^8[.A-Z]/
item = i unless item
end
end
if Agenda.date =~ /^2018-02/
item.next = {title: 'FY23 Budget Worksheet', href: 'fy23'}
end
elsif path == 'fy23'
item = {view: FY23, title: 'FY23 Budget Worksheet', color: 'available',
prev: {title: 'Discussion Items', href: 'Discussion-Items'},
next: {title: 'Action Items', href: 'Action-Items'}}
else
item = Agenda.find(path)
end
# bail unless an item was found
return {} unless item
# provide defaults for required properties
item.color ||= 'blank'
if not item.title
item.title = item.view.options.name.
gsub(/(^|-)\w/) {|c| return c.upcase()}.
gsub('-', ' ').strip()
end
# determine what buttons are required, merging defaults, form provided
# overrides, and any overrides provided by the agenda item itself
buttons = item.buttons
buttons = item.view.buttons().concat(buttons || []) if item.view.buttons
if buttons
buttons = buttons.map do |button|
props = {text: 'button', attrs: {class: 'btn'}, form: button.form}
# form overrides
form = button.form
if form and form.button
form.button.each_pair do |name, override|
if name == 'text'
props.text = form.button.text
elsif name == 'class' or name == 'classname'
props.attrs.class += " #{override.gsub('_', '-')}"
else
props.attrs[name.gsub('_', '-')] = override
end
end
else
# no form or form has no separate button: so this is just a button
props.delete 'text'
props.type = button.button || form
props.attrs = {item: item, server: Server}
end
# item overrides
button.each_pair do |name, override|
if name == 'text'
props.text = button.text
elsif name == 'class' or name == 'classname'
props.attrs.class += " #{override.gsub('_', '-')}"
elsif name != 'form'
props.attrs[name.gsub('_', '-')] = override
end
end
# clear modals
document.body.classList.remove('modal-open') if defined? document
return props
end
end
return {item: item, buttons: buttons, options: options}
end
end