| # |
| # Layout footer consisting of a previous link, any number of buttons, |
| # followed by a next link. |
| # |
| # Overrides previous and next links when traversal is queue, shepherd, or |
| # Flagged. Injects the flagged items into the flow on the meeting day |
| # (last executive officer <-> first flagged/unapproved/missing && |
| # last flagged/unapproved/missing <-> first Special order) |
| # |
| |
| class Footer < Vue |
| def render |
| |
| meeting_day = Minutes.started || Agenda.meeting_day |
| |
| _footer.navbar.navbar_fixed_bottom class: @@item.color do |
| |
| # |
| # Previous link |
| # |
| link = @@item.prev |
| prefix = '' |
| |
| if @@options.traversal == :queue |
| prefix = 'queue/' |
| while link and not link.ready_for_review(User.initials) |
| link = link.prev |
| end |
| link ||= {href: '../queue', title: 'Queue'} |
| elsif @@options.traversal == :shepherd |
| prefix = 'shepherd/queue/' |
| while link and link.shepherd != @@item.shepherd |
| link = link.prev |
| end |
| link ||= {href: "../#{@@item.shepherd}", title: 'Shepherd'} |
| elsif @@options.traversal == :flagged |
| prefix = 'flagged/' |
| while link and link.skippable |
| if link.attach =~ /^\d[A-Z]/ |
| prefix = '' |
| break |
| else |
| link = link.prev |
| end |
| end |
| |
| unless link |
| if meeting_day |
| link = Agenda.index.find do |item| |
| item.next && item.next.attach =~ /^\d+$/ |
| end |
| prefix = '' |
| end |
| |
| link ||= {href: "flagged", title: 'Flagged'} |
| end |
| elsif |
| meeting_day and @@item.attach =~ /\d/ and |
| link and link.attach =~ /^[A-Z]/ |
| then |
| Agenda.index.each do |item| |
| if not item.skippable and item.attach =~ /^([A-Z]|\d+$)/ |
| prefix = 'flagged/' |
| link = item |
| end |
| end |
| end |
| |
| if link |
| _Link.backlink.navbar_brand text: link.title, rel: 'prev', |
| href: "#{prefix}#{link.href}", class: link.color |
| elsif @@item.prev or @@item.next |
| # without this, Chrome will sometimes make the footer too tall |
| _a.navbar_brand |
| end |
| |
| # |
| # Buttons |
| # |
| _span do |
| if @@buttons |
| @@buttons.each do |button| |
| |
| if button.text |
| props = {attrs: button.attrs} |
| if button.attrs.class |
| props.class = button.attrs.class.split(' ') |
| delete button.attrs.class |
| end |
| |
| Vue.createElement('button', props, button.text) |
| elsif button.type |
| Vue.createElement(button.type, {props: button.attrs}) |
| end |
| end |
| end |
| end |
| |
| # |
| # Next link |
| # |
| link = @@item.next |
| |
| if @@options.traversal == :queue |
| while link and not link.ready_for_review(User.initials) |
| link = link.next |
| end |
| link ||= {href: 'queue', title: 'Queue'} |
| elsif @@options.traversal == :shepherd |
| while link and link.shepherd != @@item.shepherd |
| link = link.next |
| end |
| link ||= {href: "shepherd/#{@@item.shepherd}", title: 'shepherd'} |
| elsif @@options.traversal == :flagged |
| prefix = 'flagged/' |
| while link and link.skippable |
| if meeting_day and link.attach !~ /^(\d+|[A-Z]+)$/ |
| prefix = '' |
| break |
| else |
| link = link.next |
| end |
| end |
| link ||= {href: "flagged", title: 'Flagged'} |
| elsif |
| meeting_day and link and |
| @@item.attach =~ /^\d[A-Z]/ and link.attach =~ /^\d/ |
| then |
| while link and link.skippable and link.attach =~ /^([A-Z]|\d+$)/ |
| link = link.next |
| end |
| |
| prefix = 'flagged/' |
| end |
| |
| if link |
| prefix = '' unless link.attach =~ /^([A-Z]|\d+$)/ |
| _Link.nextlink.navbar_brand text: link.title, rel: 'next', |
| href: "#{prefix}#{link.href}", class: link.color |
| elsif @@item.prev or @@item.next |
| # without this, Chrome will sometimes make the footer too tall |
| _a.nextarea.navbar_brand |
| end |
| end |
| end |
| end |