www/project/icla/views/pages/discuss.js.rb (179 lines of code) (raw):
class Discuss < Vue
def initialize
@disabled = true
@alert = nil
console.log('date now: ' + Date.new().toLocaleString())
# initialize form fields
@member = Server.data.member
@token = Server.data.token
@debug = Server.data.debug
console.log('discuss')
console.log('token: ' + @token)
console.log('member: ' + @member)
@progress = Server.data.progress
console.log('progress: ' + @progress.inspect)
if @progress
@phase = @progress[:phase]
else
@phase = 'unknown' # flag
end
console.log('phase: ' + @phase)
if not @token
@alert = 'Token is required for this page'
elsif @phase == 'unknown'
@alert = 'Cannot determine phase: could not read token file'
elsif @phase == 'error'
@alert = @progress[:errorMessage]
elsif @phase != 'discuss'
@alert = 'Wrong phase: ' + @phase + '; should be discuss'
else
@pmc = @progress[:project]
@proposer = @progress[:proposer]
@contributor = @progress[:contributor]
@iclaname = @contributor[:name]
@iclaemail = @contributor[:email]
@comments = @progress[:comments]
@discussBody = ''
@subject = @progress[:subject]
end
end
def render
_p %{
This form allows PMC and PPMC members to
discuss contributors to achieve consensus.
}
if @phase == 'discuss'
_b 'Project: ' + @pmc
_p
_b 'Contributor: ' + @iclaname + ' (' + @iclaemail + ')'
_p
_b 'Proposed by: ' + @proposer
_p
_p 'Subject: ' + @subject
_p
#
# Form fields
#
_div.form_group do
_label 'Comment from ' + @member + ' (required)', :for => 'discussBody'
_textarea.form_control rows: 4,
required: true, placeholder: 'new comment',
id: 'discussBody', value: @discussBody,
onChange: self.setDiscussBody
end
@comments.each {|c|
_b 'From: ' + c.member + ' Date: ' + c.timestamp
_p c.comment
}
#
# Submission buttons
#
_p do
_button.btn.btn_primary 'Submit comment and continue to discuss',
disabled: @disabled,
onClick: self.submitComment
_b ' or '
_button.btn.btn_primary 'Submit comment and start voting',
disabled: @disabled,
onClick: self.startVoting
_b ' or '
_button.btn.btn_primary 'Submit comment and invite contributor to submit ICLA',
disabled: @disabled,
onClick: self.invite
end
end
if @debug
_p 'token: ' + @token.to_s
_p 'comment: ' + @discussBody.inspect
_p 'progress: ' + @progress.inspect
end
# error messages
if @alert
_div.alert.alert_danger do
_b 'Error: '
_span @alert
end
end
#
# Hidden form: preview invite email
#
_div.modal.fade.invitation_preview! do
_div.modal_dialog do
_div.modal_content do
_div.modal_header do
_button.close "\u00d7", type: 'button', data_dismiss: 'modal'
_h4 'Preview Invitation Email'
end
_div.modal_body do
# headers
_div do
_b 'From: '
_span @memberEmail
end
_div do
_b 'To: '
_span "#{@iclaname} <#{@iclaemail}>"
end
_div do
_b 'cc: '
_span @pmcEmail
end
# draft invitation email
_div.form_group do
_label :for => 'invitation'
_textarea.form_control.invitation! value: @invitation, rows: 12,
onChange: self.setInvitation
end
end
_div.modal_footer do
_button.btn.btn_default 'Cancel', data_dismiss: 'modal'
_button.btn.btn_primary 'Mock Send', onClick: self.mockSend
end
end
end
end
end
# when the form is initially loaded, set the focus on the discussBody field
def mounted()
document.getElementById('discussBody').focus() if not @alert
end
#
# field setters
#
def setDiscussBody(event)
@discussBody = event.target.value
checkValidity()
end
def setInvitation(event)
@invitation = event.target.value
checkValidity()
end
def submitComment(event)
console.log('submitComment discussBody: ' + @discussBody.inspect)
updateVoteFile('submitComment')
end
def startVoting(event)
console.log('startVoting discussBody: ' + @discussBody.inspect)
updateVoteFile('startVoting','vote')
end
def invite(event) # does this need to change to 'invite'
console.log('invite discussBody: ' + @discussBody.inspect)
updateVoteFile('invite')
end
def updateVoteFile(action, newPhase)
data = {
action: action,
token: @token,
member: @member,
comment: @discussBody,
expectedPhase: 'discuss',
newPhase: newPhase,
}
console.log('>update: '+ data.inspect) # debug
post 'update', data do |response|
console.log('<update: '+ response.inspect) # debug
@alert = response.error
@comments = response['contents']['comments'] unless @alert
end
end
#
# validation and processing
#
# client side field validations
def checkValidity()
@disabled = !%w(discussBody).all? do |id|
element = document.getElementById(id)
not element.empty?
end
end
# pretend to send an invitation
def mockSend()
# dismiss modal dialog
jQuery('#invitation-preview').modal(:hide)
# save information for later use (for demo purposes, this is client only)
FormData.token = @token
FormData.fullname = @iclaname
FormData.email = @iclaemail
FormData.pmc = @pmc
FormData.votelink = @votelink
FormData.noticelink = @noticelink
# for demo purposes advance to the interview. Note: the below line
# updates the URL in a way that breaks the back button.
history.replaceState({}, nil, "form?token=#@token")
# change the view
Main.navigate(Interview)
end
end