context = window rest = context.JK.Rest() logger = context.JK.logger AppStore = context.AppStore LocationActions = context.LocationActions RetailerActions = context.RetailerActions RetailerStore = context.RetailerStore UserStore = context.UserStore profileUtils = context.JK.ProfileUtils @AccountRetailerScreen = React.createClass({ mixins: [ ICheckMixin, Reflux.listenTo(AppStore, "onAppInit"), Reflux.listenTo(RetailerStore, "onRetailerChanged") Reflux.listenTo(UserStore, "onUserChanged") ] shownOnce: false screenVisible: false TILE_ACCOUNT: 'account' TILE_TEACHERS: 'teachers' TILE_SALES: 'sales' TILE_AGREEMENT: 'agreement' TILES: ['account', 'teachers', 'sales', 'agreement'] onAppInit: (@app) -> @app.bindScreen('account/retailer', {beforeShow: @beforeShow, afterShow: @afterShow, beforeHide: @beforeHide}) onRetailerChanged: (retailerState) -> @setState(retailerState) onUserChanged: (userState) -> @noRetailerCheck(userState?.user) @setState({user: userState?.user}) componentDidMount: () -> @checkboxes = [{selector: 'input.slot-decision', stateKey: 'slot-decision'}] @root = $(@getDOMNode()) @iCheckify() componentDidUpdate: () -> @iCheckify() checkboxChanged: (e) -> checked = $(e.target).is(':checked') value = $(e.target).val() #@setState({userSchedulingComm: value}) beforeHide: (e) -> #ProfileActions.viewTeacherProfileDone() @screenVisible = false return true beforeShow: (e) -> LocationActions.load() noRetailerCheck: (user) -> if user?.id? && @screenVisible if !user.owned_retailer_id? window.JK.Banner.showAlert("You are not the owner of a retailer in our systems. If you are, please contact support@jamkazam.com and we'll update your account.") return false else if !@shownOnce @shownOnce = true RetailerActions.refresh(user.owned_retailer_id) return true else return false afterShow: (e) -> @screenVisible = true logger.debug("AccountRetailerScreen: afterShow") logger.debug("after show", @state.user) @noRetailerCheck(@state.user) getInitialState: () -> { retailer: null, user: null, selected: 'account', updateErrors: null, retailerName: null, teacherSplit: null, teacherInvitations: null, updating: false } nameValue: () -> if this.state.retailerName? this.state.retailerName else this.state.retailer.name nameChanged: (e) -> $target = $(e.target) val = $target.val() @setState({retailerName: val}) onCancel: (e) -> e.preventDefault() context.location.href = '/client#/account' onUpdate: (e) -> e.preventDefault() if this.state.updating return name = @root.find('input[name="name"]').val() region = @root.find('select[name="regions"]').val() city = @root.find('select[name="cities"]').val() password = @root.find('input[type="password"]').val() teacherSplit = @teacherSplit() if teacherSplit retailerSplit = Number((100 - teacherSplit).toFixed(2)) @setState(updating: true) rest.updateRetailer({ id: this.state.retailer.id, name: name, state: region, city: city, password:password, split: {teacher: teacherSplit, retailer: retailerSplit} }).done((response) => @onUpdateDone(response)).fail((jqXHR) => @onUpdateFail(jqXHR)) onUpdateDone: (response) -> @setState({retailer: response, retailerName: null, teacherSplit: null, updateErrors: null, updating: false}) @app.layout.notify({title: "update success", text: "Your retailer information has been successfully updated"}) onUpdateFail: (jqXHR) -> handled = false @setState({updating: false}) if jqXHR.status == 422 errors = JSON.parse(jqXHR.responseText) handled = true @setState({updateErrors: errors}) if !handled @app.ajaxError(jqXHR, null, null) inviteTeacher: () -> @app.layout.showDialog('invite-retailer-user', {d1: true}) resendInvitation: (id, e) -> e.preventDefault() rest.resendRetailerInvitation({ id: this.state.retailer.id, invitation_id: id }).done((response) => @resendInvitationDone(response)).fail((jqXHR) => @resendInvitationFail(jqXHR)) resendInvitationDone: (response) -> @app.layout.notify({title: 'invitation resent', text: 'Invitation was resent to ' + response.email}) resendInvitationFail: (jqXHR) -> @app.ajaxError(jqXHR) deleteInvitation: (id, e) -> e.preventDefault() rest.deleteRetailerInvitation({ id: this.state.retailer.id, invitation_id: id }).done((response) => @deleteInvitationDone(id, response)).fail((jqXHR) => @deleteInvitationFail(jqXHR)) deleteInvitationDone: (id, response) -> context.RetailerActions.deleteInvitation(id) deleteInvitationFail: (jqXHR) -> @app.ajaxError(jqXHR) removeFromRetailer: (id, isTeacher, e) -> if isTeacher rest.deleteRetailerTeacher({id: this.state.retailer.id, teacher_id: id}).done((response) => @removeFromRetailerDone(response)).fail((jqXHR) => @removeFromRetailerFail(jqXHR)) removeFromRetailerDone: (retailer) -> context.JK.Banner.showNotice("User removed", "User was removed from your retailer.") context.RetailerActions.updateRetailer(retailer) removeFromRetailerFail: (jqXHR) -> @app.ajaxError(jqXHR) renderUser: (user, isTeacher) -> photo_url = user.photo_url if !photo_url? photo_url = '/assets/shared/avatar_generic.png' `
{user.name}
remove from retailer
` renderInvitation: (invitation) -> `
{invitation.first_name} {invitation.last_name}
has not yet accepted invitation
resend invitation delete
` renderTeachers: () -> teachers = [] if this.state.retailer.teachers? && this.state.retailer.teachers.length > 0 for teacher in this.state.retailer.teachers if teacher.user teachers.push(@renderUser(teacher.user, true)) else teachers = `

No teachers

` teachers renderTeacherInvitations: () -> invitations = [] if this.state.teacherInvitations? && this.state.teacherInvitations.length > 0 for invitation in this.state.teacherInvitations invitations.push(@renderInvitation(invitation)) else invitations = `

No pending invitations

` invitations mainContent: () -> if !@state.user? || !@state.retailer? `
Loading...
` else if @state.selected == @TILE_ACCOUNT @account() else if @state.selected == @TILE_TEACHERS @teachers() else if @state.selected == @TILE_SALES @earnings() else if @state.selected == @TILE_AGREEMENT @agreement() else @account() handleLocationChange: (country, region, city) -> logger.debug("handleLocationChange #{country} #{region} ${city}") @setState({city: city, region: region}) teacherSplitCurrent: () -> if this.state.teacherSplit? console.log("taking state for teacher split") this.state.teacherSplit else this.state.retailer.payment_details.teacher teacherSplitValue: () -> @teacherSplitCurrent() retailerSplitValue: () -> teacherSplit = @teacherSplitCurrent() return (100 - teacherSplit).toFixed(2) onTeacherBlur: () -> teacherSplit = @root.find('input[name="teacher-split"]').val() teacherSplit = Number(teacherSplit) if teacherSplit != teacherSplit #NaN? @setState({teacherSplit: null}) teacherSplit: () -> teacherSplit = @root.find('input[name="teacher-split"]').val() if teacherSplit teacherSplit = Number(teacherSplit) if !teacherSplit console.log("defaulting to 100 because teachersplit is empty") teacherSplit = 100 teacherSplit onTeacherSplitChange: (e) -> $target = $(e.target) # edge cases first teacherSplit = @root.find('input[name="teacher-split"]').val() if teacherSplit == null || teacherSplit == '' @setState({teacherSplit: ''}) return teacherSplit = Number(teacherSplit) if teacherSplit != teacherSplit # NaN? console.log("teacher split is NaN; ignoring") # do nothing; this way junk doesn't start showing up in retail square. Onblur will fix return teacherSplit = @teacherSplit() if teacherSplit > 100 console.log("teacher split is > 100. setting to 100") return if teacherSplit < 0 console.log("teacher split is < 0. setting to 0") return @setState({teacherSplit: teacherSplit}) account: () -> nameErrors = context.JK.reactSingleFieldErrors('name', @state.updateErrors) correspondenceEmailErrors = context.JK.reactSingleFieldErrors('correspondence_email', @state.updateErrors) nameClasses = classNames({name: true, error: nameErrors?, field: true}) cancelClasses = { "button-grey": true, "cancel" : true, disabled: this.state.updating } updateClasses = { "button-orange": true, "update" : true, disabled: this.state.updating } processUrl = context.JK.makeAbsolute("/posa/#{this.state.retailer.slug}") processSaleUrl = `{processUrl}` `
{nameErrors}
{processSaleUrl} (enter Administrator/password to access this page)

Payments

Enter 0-100
This is computed automatically based on the Teacher %
CANCEL UPDATE
` teachers: () -> teachers = @renderTeachers() teacherInvitations = @renderTeacherInvitations() `

teachers:

INVITE TEACHER
{teacherInvitations}
{teachers}
` earnings: () -> `

Coming soon

` agreement: () -> `

The agreement between your retailer and JamKazam is part of JamKazam's terms of service. You can find the complete terms of service here. And you can find the section that is most specific to the retailer terms here.

` selectionMade: (selection, e) -> e.preventDefault() @setState({selected: selection}) createTileLink: (i, tile) -> active = this.state.selected == tile classes = classNames({last: i == @TILES.length - 1, activeTile: active}) return `
{tile}
` onCustomBack: (customBack, e) -> e.preventDefault() context.location = customBack render: () -> mainContent = @mainContent() profileSelections = [] for tile, i in @TILES profileSelections.push(@createTileLink(i, tile, profileSelections)) profileNav = `
{profileSelections}
` `
retailer:
{profileNav}
{mainContent}
` })