www/board/agenda/views/pages/adjournment.js.rb (258 lines of code) (raw):
#
# Secretary version of Adjournment section: shows todos
#
class Adjournment < Vue
def initialize
@add = []
@remove = []
@change = []
@terminate = []
@establish = []
@feedback = []
@minutes = {}
@loading = true
@fetched = false
end
# export self as shared state
def created()
if defined? global
global.Todos = self
else
window.Todos = self
end
end
# update state
def set(values)
values.each_pair do |attr, value|
Todos[attr] = value
end
end
# find corresponding agenda item
def link(title)
link = nil
Agenda.index.each do |item|
link = item.href if item.title == title
end
return link
end
def render
_section.flexbox do
_section do
_pre.report @@item.text
if not Todos.loading or Todos.fetched
_h3 'Post Meeting actions'
if
Todos.add.empty? and Todos.remove.empty? and
Todos.change.empty? and Todos.establish.empty?
then
if Todos.loading
_em 'Loading...'
else
_p.comment 'complete'
end
end
end
unless
Todos.add.empty? and Todos.change.empty? and Todos.establish.empty?
then
_PMCActions
end
unless Todos.remove.empty?
_TodoRemove
end
unless Todos.feedback.empty?
_FeedbackReminder
end
# display a list of completed actions
completed = Todos.minutes.todos
if
completed and completed.keys().length > 0 and (
(completed.added and not completed.added.empty?) or
(completed.changed and not completed.changed.empty?) or
(completed.removed and not completed.removed.empty?) or
(completed.established and not completed.established.empty?) or
(completed.feedback_sent and not completed.feedback_sent.empty?))
then
_h3 'Completed actions'
if completed.added and not completed.added.empty?
_p 'Added to PMC chairs'
_ul completed.added do |id|
_li {_a id, href: "../../../roster/committer/#{id}"}
end
end
if completed.changed and not completed.changed.empty?
_p 'Changed PMC chairs'
_ul completed.changed do |pmc|
_li {_a pmc, href: "../../../roster/committee/#{pmc}"}
end
end
if completed.removed and not completed.removed.empty?
_p 'Removed from PMC chairs'
_ul completed.removed do |id|
_li {_a id, href: "../../../roster/committer/#{id}"}
end
end
if completed.established and not completed.established.empty?
_p 'Established PMCs'
_ul completed.established do |pmc|
_li {_a pmc, href: "../../../roster/committee/#{pmc}"}
end
end
if completed.terminated and not completed.terminated.empty?
_p 'Terminated PMCs'
_ul completed.terminated do |pmc|
_li {_a pmc.downcase(),
href: "../../../roster/committee/#{pmc.downcase()}"}
end
end
if completed.feedback_sent and not completed.feedback_sent.empty?
_p 'Sent feedback'
_ul completed.feedback_sent do |pmc|
_li {_Link text: pmc, href: pmc.gsub(/\s+/, '-')}
end
end
end
end
_section do
minutes = Minutes.get(@@item.title)
if minutes
_h3 'Minutes'
_pre.comment minutes
end
end
end
end
# fetch secretary todos once the minutes are complete
def load()
if Minutes.complete and not Todos.fetched
Todos.loading = true
Todos.fetched = true
retrieve "secretary-todos/#{Agenda.title}", :json do |todos|
Todos.set todos
Todos.loading = false
end
end
end
def mounted()
self.load() if Todos.loading
end
end
class PMCActions < Vue
def initialize
@resolutions = []
end
def render
_ul.checklist @resolutions do |item|
_li do
_input type: 'checkbox', checked: item.checked,
onClick:-> { item.checked = !item.checked; self.refresh() }
_Link text: item.title, href: Todos.link(item.title)
if item.minutes
_ ' - '
_Link text: item.minutes, href: Todos.link(item.title)
end
end
end
_button.checklist.btn.btn_default 'Submit', disabled: @disabled,
onClick: self.submit
end
# gather a list of resolutions
def created()
@resolutions = []
Agenda.index.each do |item|
%w(change establish terminate).each do |todo_type|
Todos[todo_type].each do |todo|
if todo.resolution == item.title
minutes = Minutes.get(item.title)
resolution = {
action: todo_type,
name: todo.name,
display_name: item.title.sub(/^#{escapeRegExp(todo_type)} /i, '').
sub(/ Chair$/i, ''),
title: item.title,
minutes: minutes,
checked: (not minutes.include? 'tabled')
}
resolution.chair = todo.chair if todo.chair
resolution.people = todo.people if todo.people
@resolutions << resolution
end
end
end
end
self.refresh()
end
def refresh()
@disabled = @resolutions.all? {|item| not item.checked}
end
def submit()
data = {
change: [],
establish: [],
terminate: []
}
@resolutions.each do |resolution|
data[resolution.action] << resolution if resolution.checked
end
data.change = nil if data.change.empty?
data.establish = nil if data.establish.empty?
data.terminate = nil if data.terminate.empty?
@disabled = true
post "secretary-todos/#{Agenda.title}", data do |todos|
@disabled = false
Todos.set todos
end
end
end
########################################################################
# Remove chairs #
########################################################################
class TodoRemove < Vue
def initialize
@checked = {}
@disabled = false
end
# update check marks based on current Todo list
def created()
Todos.remove.each do |person|
if @checked[person.id] == undefined
if not person.resolution or Minutes.get(person.resolution) != 'tabled'
@checked[person.id] = true
end
end
end
end
def render
people = Todos.remove
_p 'Remove from pmc-chairs:'
_ul.checklist people do |person|
_li do
_input type: 'checkbox', checked: @checked[person.id],
onClick:-> {
@checked[person.id] = !@checked[person.id]
}
_a person.id,
href: "/roster/committer/#{person.id}"
_ " (#{person.name})"
end
end
_button.checklist.btn.btn_default 'Submit', onClick: self.submit,
disabled: (@disabled or people.length == 0 or
not people.any? {|person| @checked[person.id]})
end
def submit()
@disabled = true
remove = []
@checked.each_pair do |id, checked|
remove << id if checked
end
post "secretary-todos/#{Agenda.title}", remove: remove do |todos|
@disabled = false
Todos.set todos
# uncheck people who were removed
@checked.each_key do |id|
unless Todos.remove.any? {|person| person.id == id}
@checked[id] = false
end
end
end
end
end
########################################################################
# Reminder to draft feedback #
########################################################################
class FeedbackReminder < Vue
def render
_p 'Draft feedback:'
_ul.list_group.row Todos.feedback do |pmc|
_li.list_group_item.col_xs_6.col_sm_4.col_md_3.col_lg_2 do
_Link text: pmc, href: pmc.gsub(/\s+/, '-')
end
end
_button.checklist.btn.btn_default 'Submit',
onClick:-> {Main.navigate 'feedback'}
end
end