context = window
rest = context.JK.Rest()
logger = context.JK.logger
AppStore = context.AppStore
UserStore = context.UserStore
profileUtils = context.JK.ProfileUtils
@AccountOnboarderScreen = React.createClass({
mixins: [
Reflux.listenTo(AppStore, "onAppInit"),
Reflux.listenTo(UserStore, "onUserChanged")
]
shownOnce: false
screenVisible: false
updates: []
onAppInit: (@app) ->
@app.bindScreen('account/onboarder', {beforeShow: @beforeShow, afterShow: @afterShow, beforeHide: @beforeHide})
onRetailerChanged: (retailerState) ->
@setState(retailerState)
onUserChanged: (userState) ->
@getOnboardings(userState?.user)
@setState({user: userState?.user})
componentDidMount: () ->
@root = $(@getDOMNode())
componentDidUpdate: () ->
datePicked = @datePicked.bind(this)
@sessionDate = @root.find('.date-picker')
@sessionDate.each(() ->
$this = $(this)
id = $this.attr('data-id')
day = $this.attr('data-date')
$this.datepicker({
dateFormat: "D M d yy",
onSelect: ((e, inst) ->
datePicked(id, 'onboarding_test_session_at')
)
})
# initialize day
if(day)
$this.datepicker("setDate", new Date(day))
)
toggleDate: (dateText, inst) ->
console.log("THIS", this)
console.log("IDID ID #{$(this).attr('data-id')}")
'onboarding_test_session_at'
beforeHide: (e) ->
@screenVisible = false
return true
beforeShow: (e) ->
LocationActions.load()
getOnboardings: (user) ->
if user?.id? && @screenVisible
@setState({fetchingOnboardings: true})
rest.listOnboardings(context.JK.currentUserId).done((onboardings) =>
@setState({onboardings: onboardings, fetchingOnboardings: false})
)
.fail(() =>
@setState({fetchingOnboardings: false})
@app.layout.notify({
title: "onboarding list failure",
text: "Unable to list out your onboarders. Please contact support@jamkazam.com"
})
)
afterShow: (e) ->
@screenVisible = true
logger.debug("AccountOnboardingScreen: afterShow")
logger.debug("after show", @state.user)
@getOnboardings(@state.user)
getInitialState: () ->
{
onboardings: [],
user: null,
updating: false
}
onCancel: (e) ->
e.preventDefault()
context.location.href = '/client#/account'
onUpdate: (e) ->
if e?
e.preventDefault()
if this.state.updating
return
if @updates.length == 0
return
update = @updates.pop()
@setState({updating: true})
rest.updateOnboarding(update).done((response) => @onUpdateDone(response)).fail((jqXHR) => @onUpdateFail(jqXHR))
updateRow: (onboarding) ->
for match in this.state.onboardings
if match.id == onboarding.id
$.extend(match, onboarding)
break
this.setState({onboardings: this.state.onboardings})
onUpdateDone: (response) ->
this.setState({updating: false})
@updateRow(response)
if @updates.length > 0
@onUpdate()
onUpdateFail: (jqXHR) ->
this.setState({updating: false})
@app.layout.notify({
title: "update failure",
text: "Unable to update user. Please let us know which user and field you can not update."
})
if @updates.length > 0
@onUpdate()
updateField: (id, field, e) ->
if(e)
e.preventDefault()
console.log("Update Field Called for ", field)
$target = $(e.target)
console.log("TARGET", $target)
value = true
if $target.is('select')
value = $target.val()
options = {id: id}
options[field] = value
@postUpdate(field, value)
@queueUpdate(options)
postUpdate: (field, value) ->
if field == 'onboarding_onboarded_at'
console.log("onboarding onboarded at set")
context.JK.Banner.showAlert({title: "One Last Thing", html: "Please send this student Email #5 right now.
This is a critical email, and if you don't send it now, you'll forget. Thanks!"});
queueUpdate: (update) ->
@updates.push(update)
@onUpdate()
createLinkField: (id, onboarding, field, display, timeLabel = null) ->
if onboarding[field]
email = `{timeLabel} {onboarding[field]}`
else
email = `{display}`
email
showLostBanner: (id, field) ->
lostHtml = 'Please choose a reason why the user was lost:
' +
''
$item = context.JK.Banner.showAlert(
{buttons: [{name: 'CANCEL', click: () -> console.log('cancel clicked')}], html: lostHtml});
$item.find('select').change((e)=> @updateField(id, field, e); context.JK.Banner.hide())
showEscalationBanner: (id, field) ->
lostHtml = 'Please choose a reason why the user needs escalating:
' +
''
$item = context.JK.Banner.showAlert(
{buttons: [{name: 'CANCEL', click: () -> console.log('cancel clicked')}], html: lostHtml});
$item.find('select').change((e)=> @updateField(id, field, e); context.JK.Banner.hide())
createLostField: (id, onboarding) ->
field = 'onboarding_lost_reason'
if onboarding[field]
field = `{
onboarding[field]
}`
else
field = `lost student`
field
createEscalatedField: (id, onboarding) ->
field = 'onboarding_escalation_reason'
if onboarding[field]
field = `{
onboarding[field]
}`
else
field = `escalate
student`
field
createOnboardingField: (onboarding) ->
@createLinkField(onboarding.id, onboarding, 'onboarding_onboarded_at', 'onboarded successfully')
watchTextArea: (id, field, e) ->
$text = $(e.target)
if @textTimeout
clearTimeout(@textTimeout)
@textTimeout = null
@textTimeout = setTimeout(() =>
data = {id: id}
data[field] = $text.val()
@queueUpdate(data)
@textTimeout = null
, 3000)
datePicked: (id, field) ->
$tr = @root.find("tr[data-id='" + id + "']")
picker = $tr.find(".date-picker")
hour = $tr.find('.hour').val()
minute = $tr.find('.minute').val()
am_pm = $tr.find('.am_pm').val()
if hour? and hour != ''
hour = new Number(hour)
if am_pm == 'PM'
hour += 12
else
hour = null
if minute? and minute != ''
minute = new Number(minute)
else
minute = null
date = picker.datepicker("getDate")
if date?
date.setHours(hour)
date.setMinutes(minute)
data = {id: id}
data[field] = date.toString()
@queueUpdate(data)
mainContent: () ->
cancelClasses = {"button-orange": true, "update": true}
onboardings = []
if @state.fetchingOnboardings
onboardings.push(`
| User | Test Session | Problems | Onboarded | Notes |
|---|