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(` FETCHING STUDENTS `) else if @state.onboardings.length > 0 for onboarding in @state.onboardings hours = [] for hour in ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'] if hour == '12' key = '00' else key = hour hours.push(``) minutes = [] for minute in ['00', '15', '30', '45'] minutes.push(``) am_pm = [``, ``] email1 = @createLinkField(onboarding.id, onboarding, 'onboarding_email_1_sent_at', 'sent email 1', 'email 1:') email2 = @createLinkField(onboarding.id, onboarding, 'onboarding_email_2_sent_at', 'sent email 2', 'email 2:') email3 = @createLinkField(onboarding.id, onboarding, 'onboarding_email_3_sent_at', 'sent email 3', 'email 3:') email4 = @createLinkField(onboarding.id, onboarding, 'onboarding_email_4_sent_at', 'sent email 4', 'email 4:') email5 = @createLinkField(onboarding.id, onboarding, 'onboarding_email_5_sent_at', 'sent email 5', 'email 5:') scheduledSession = @createLinkField(onboarding.id, onboarding, 'onboarding_test_session_scheduled_at', 'scheduled session', 'scheduled session:') sessionOutcomes = ['', "Successful", "Setup Wizard Failure", "No Audio Stream in Session", "No Video Stream In Session", "Other"] sessionOutcomesJSX = [] for sessionOutcome in sessionOutcomes sessionOutcomesJSX.push(``) selectSessionOutcome = `` session_at = onboarding.onboarding_test_session_at amOrPm = 'AM' currentHours = '01' currentMinutes = '00' if session_at sessionTime = new Date(session_at) session_at = sessionTime.toLocaleDateString() currentHours = sessionTime.getHours() if sessionTime.getHours() > 11 amOrPm = 'PM' currentHours -= 12 currentMinutes = sessionTime.getMinutes() active = onboarding.onboarding_status == 'Emailed' || onboarding.onboarding_status == 'Assigned' if active activeClass = 'active-row' else activeClass = 'inactive-row' columns = [] if active columns.push(`
{email1}
{email2}
{email3}
{email4}
{email5}
`) columns.push(`
{scheduledSession}
:
{selectSessionOutcome}
`) columns.push(`
{this.createLostField(onboarding.id, onboarding)}
{this.createEscalatedField(onboarding.id, onboarding)}
`) columns.push(`
{this.createOnboardingField(onboarding)}
`) else columns.push(` {onboarding.onboarding_status}

This student will drop off your list now next time you visit this page. `) onboarding = `
Name: {onboarding.name}
Email: {onboarding.email}
Assigned on {onboarding.onboarder_assigned_at}
{columns}
` onboardings.push(onboarding) else onboardings.push(` NO STUDENTS ASSIGNED `) `
Manage the users here that you are responsible for onboarding.

All links in the table below, when clicked, will immediately mark that item as done. For example, once you send your first email to the user, click the sent email 1 link.

All other fields will automatically save as you use them, such as the Session Outcome dropdown, and the Notes text box.
{onboardings}
User Email Test Session Problems Onboarded Notes
BACK
` render: () -> mainContent = @mainContent() `
{mainContent}
` })