www/board/agenda/views/buttons/add-minutes.js.rb (135 lines of code) (raw):

class AddMinutes < Vue def initialize @disabled = false end # default attributes for the button associated with this form def self.button { text: 'add minutes', class: 'btn_primary', data_toggle: 'modal', data_target: '#minute-form' } end def render _ModalDialog.minute_form!.wide_form color: 'commented' do _h4.commented 'Minutes' # either a large text area, or a slightly smaller text area # followed by comments if @@item.comments.empty? _textarea.minute_text!.form_control rows: 17, tabIndex: 1, placeholder: 'minutes', value: @draft else _textarea.minute_text!.form_control rows: 12, tabIndex: 1, placeholder: 'minutes', value: @draft _h3 'Comments' _div.minute_comments! @@item.comments do |comment| _pre.comment comment end end # action items _div.row style: {marginTop: '1em'} do _button.btn.btn_sm.btn_info.col_md_offset_1.col_md_1 '+ AI', onClick: self.addAI, disabled: !@ai_owner || !@ai_text _label.col_md_2 do _select Minutes.attendee_names, value: @ai_owner do |name| _option name end end _textarea.col_md_7 value: @ai_text, rows: 1, cols: 40, tabIndex: 2 end if @@item.attach =~ /^[A-Z]+$/ _input.flag! type: 'checkbox', label: 'report was not accepted', onClick: self.reject, checked: @checked end # variable number of buttons _button.btn_default 'Cancel', type: 'button', data_dismiss: 'modal', onClick:-> {@draft = @base} if @base _button.btn_warning 'Delete', type: 'button', onClick:-> {@draft = ''} end # special buttons for prior months draft minutes if @@item.attach =~ /^3\w/ _button.btn_warning 'Tabled', type: 'button', onClick: self.save, disabled: @disabled _button.btn_success 'Approved', type: 'button', onClick: self.save, disabled: @disabled end _button 'Reflow', class: self.reflow_color(), onClick: self.reflow _button.btn_primary 'Save', type: 'button', onClick: self.save, disabled: @disabled || @base == @draft end end def mounted() # update form to match current item jQuery('#minute-form').on 'show.bs.modal' do self.setup(@@item) end # autofocus on minute text jQuery('#minute-form').on 'shown.bs.modal' do document.getElementById('minute-text').focus() end end # when initially displayed, set various fields to match the item def created() self.setup(@@item) end # reset base, draft minutes, shepherd, default ai_text, and indent def setup(item) @base = draft = Minutes.get(item.title) || '' if item.attach =~ /^(8|9|1\d)\.$/ draft ||= item.text else @ai_text = "pursue a report for #{item.title}" unless item.text end @draft = draft @ai_owner = item.shepherd @indent = (@@item.attach =~ /^\w+$/ ? 8 : 4) @checked = @@item.rejected end # add an additional AI to the draft minutes for this item def addAI(event) @draft += "\n" if @draft @draft += "@#{@ai_owner}: #{@ai_text}" @ai_owner = @@item.shepherd @ai_text = '' end # determine if reflow button should be default or danger color def reflow_color() width = 78 - @indent if not @draft or @draft.split("\n").all? {|line| line.length <= width} return 'btn-default' else return'btn-danger' end end def reflow() @draft = Flow.text(@draft || '', ' ' * @indent) end def save(event) case event.target.textContent when 'Save' text = @draft when 'Tabled' text = 'tabled' when 'Approved' text = 'approved' end data = { agenda: Agenda.file, title: @@item.title, text: text, reject: @checked } @disabled = true post 'minute', data do |minutes| Minutes.load minutes self.setup(@@item) @disabled = false jQuery('#minute-form').modal(:hide) document.body.classList.remove('modal-open') end end def reject(event) @checked = ! @checked data = { agenda: Agenda.file, title: @@item.title, text: @base, reject: @checked } post 'minute', data do |minutes| Minutes.load minutes end end end