Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Segment additions. #528

Merged
merged 4 commits into from
Jun 16, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/components/spaces/canvas/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import {undo, redo} from 'gModules/checkpoints/actions'
import {hasMetricUpdated} from 'gComponents/metrics/card/updated'
import * as canvasStateProps from 'gModules/canvas_state/prop_type'

import * as segment from 'server/segment'


import './style.css'

Expand Down Expand Up @@ -79,10 +81,12 @@ export default class Canvas extends Component{
}

_handleUndo() {
segment.trackUndo(true)
this.props.dispatch(undo(this.props.denormalizedSpace.id))
}

_handleRedo() {
segment.trackUndo(true)
this.props.dispatch(redo(this.props.denormalizedSpace.id))
}

Expand All @@ -92,6 +96,7 @@ export default class Canvas extends Component{
}

_handleMultipleSelect(corner1, corner2) {
if (!isAtLocation(corner1, corner2)) { segment.trackSelectedRegion() }
this.props.dispatch(selectRegion(corner1, corner2))
}

Expand Down
4 changes: 2 additions & 2 deletions src/components/spaces/show/canvasViewForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {CardListElement} from 'gComponents/utility/card/index.js'
import * as canvasStateActions from 'gModules/canvas_state/actions.js'
import * as canvasStateProps from 'gModules/canvas_state/prop_type.js'

import {trackUsedViewMode} from 'server/segment/index'
import {trackToggledViewMode} from 'server/segment/index'

import debuggingImage from '../../../assets/metric-icons/blue/debugging.png'
import normalImage from '../../../assets/metric-icons/blue/normal.png'
Expand Down Expand Up @@ -46,7 +46,7 @@ export default class CanvasViewForm extends Component {
}

_selectMetricCardView(e) {
trackUsedViewMode(e)
trackToggledViewMode(e)
this.props.dispatch(canvasStateActions.change({metricCardView: e}))
}

Expand Down
46 changes: 32 additions & 14 deletions src/components/spaces/show/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {parseSlurp} from 'lib/slurpParser'
import e from 'gEngine/engine'

import * as elev from 'server/elev/index'
import * as segment from 'server/segment'

import './style.css'
import $ from 'jquery'
Expand Down Expand Up @@ -115,10 +116,12 @@ export default class SpacesShow extends Component {
}

onRedo() {
segment.trackUndo(false)
this.props.dispatch(redo(this._id()))
}

onUndo() {
segment.trackUndo(false)
this.props.dispatch(undo(this._id()))
}

Expand All @@ -127,6 +130,7 @@ export default class SpacesShow extends Component {
}

onImportSlurp(slurpObj) {
segment.trackImportSlurp()
const space = this.props.denormalizedSpace

const spaceUpdates = parseSlurp(slurpObj, space)
Expand All @@ -136,9 +140,11 @@ export default class SpacesShow extends Component {
if (!space.description) {nonGraphUpdates.description = spaceUpdates.description}
this.props.dispatch(spaceActions.update(this._id(), nonGraphUpdates))
}
this.props.dispatch({type: 'ADD_METRICS', items: spaceUpdates.newMetrics, newGuesstimates: spaceUpdates.newGuesstimates})
this.props.dispatch(spaceActions.updateGraph(this._id()))
this.props.dispatch(simulationActions.runSimulations(this._id(), spaceUpdates.newMetrics))
if (!_.isEmpty(spaceUpdates.newMetrics)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this supposed to be part of it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes; if you put an empty JSON object into the Import SLURP window, we don't want to run any of these dispatches. Just a tiny fix I noticed while adding the segment stuff and figured it wasn't worth another PR. Next time I'll be more clear in the PR description.

this.props.dispatch({type: 'ADD_METRICS', items: spaceUpdates.newMetrics, newGuesstimates: spaceUpdates.newGuesstimates})
this.props.dispatch(spaceActions.updateGraph(this._id()))
this.props.dispatch(simulationActions.runSimulations(this._id(), spaceUpdates.newMetrics))
}
}

onPublicSelect() {
Expand All @@ -158,25 +164,31 @@ export default class SpacesShow extends Component {
}

hideSidebar() {
segment.trackCloseSidebar()
this.setState({showSidebar: false})
}
openSidebar() {
segment.trackOpenSidebar()
this.setState({showSidebar: true})
}

_handleCopyModel() {
segment.trackCopyModel()
this.props.dispatch(spaceActions.copy(this._id()))
}

onCopy() {
onCopy(via_keyboard) {
segment.trackCopyMetric(via_keyboard)
this.props.dispatch(copiedActions.copy(this._id()))
}

onPaste() {
onPaste(via_keyboard) {
segment.trackPasteMetric(via_keyboard)
this.props.dispatch(copiedActions.paste(this._id()))
}

onCut() {
onCut(via_keyboard) {
segment.trackCutMetric(via_keyboard)
this.props.dispatch(copiedActions.cut(this._id()))
}

Expand Down Expand Up @@ -249,14 +261,20 @@ export default class SpacesShow extends Component {

<SpaceToolbar
editsAllowed={space.canvasState.editsAllowed}
onAllowEdits={() => {this.props.dispatch(allowEdits())}}
onForbidEdits={() => {this.props.dispatch(forbidEdits())}}
onAllowEdits={() => {
segment.trackSwitchToEditMode()
this.props.dispatch(allowEdits())
}}
onForbidEdits={() => {
segment.trackSwitchToViewMode()
this.props.dispatch(forbidEdits())
}}
isLoggedIn={isLoggedIn}
onDestroy={this.destroy.bind(this)}
onCopyModel={this._handleCopyModel.bind(this)}
onCopyMetrics={this.onCopy.bind(this)}
onPasteMetrics={this.onPaste.bind(this)}
onCutMetrics={this.onCut.bind(this)}
onCopyMetrics={this.onCopy.bind(this, false)}
onPasteMetrics={this.onPaste.bind(this, false)}
onCutMetrics={this.onCut.bind(this, false)}
isPrivate={space.is_private}
editableByMe={space.editableByMe}
actionState={space.canvasState.actionState}
Expand All @@ -282,9 +300,9 @@ export default class SpacesShow extends Component {
}
<Canvas
denormalizedSpace={space}
onCopy={this.onCopy.bind(this)}
onPaste={this.onPaste.bind(this)}
onCut={this.onCut.bind(this)}
onCopy={this.onCopy.bind(this, true)}
onPaste={this.onPaste.bind(this, true)}
onCut={this.onCut.bind(this, true)}
/>
</div>
</div>
Expand Down
4 changes: 4 additions & 0 deletions src/server/segment/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,8 @@ export const VIEWED_PRODUCT_ACTION = "Viewed Product"
export const ACCOUNT_MODAL_CLICK = "Clicked account modal"
export const USER_MENU_OPEN = "Opened user menu"
export const USER_MENU_CLOSE = "Closed user menu"
export const COPIED_MODEL = "Copied model"

export const USED_VIEW_MODE = "Used view mode"

export const INTERACTED_WITH_CANVAS = "Interacted with canvas"
63 changes: 59 additions & 4 deletions src/server/segment/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ function segmentPlanType(rawPlanType) {
}
}

function trackCanvasInteraction(interaction, options) {
window.analytics.track(Constants.INTERACTED_WITH_CANVAS, {
interaction,
...options
})
}

function trackAddedProduct(planType) {
window.analytics.track(Constants.ADDED_PRODUCT_ACTION, {
id: planType,
Expand All @@ -38,10 +45,6 @@ function trackViewedAllProducts() {
})
}

export function trackUsedViewMode(mode) {
window.analytics.track(Constants.USED_VIEW_MODE, {mode})
}

const pageEvents = {
"/subscribe/lite": () => {trackAddedProduct(LITE_PLAN)},
"/subscribe/premium": () => {trackAddedProduct(PREMIUM_PLAN)},
Expand All @@ -60,6 +63,10 @@ export function trackUser(userId, info) {
window.analytics.identify(userId, info)
}

export function trackToggledViewMode(mode) {
window.analytics.track(Constants.USED_VIEW_MODE, {mode})
}

export function trackPurchaseSuccess(account, rawPlanType) {
const planType = segmentPlanType(rawPlanType)
const orderId = `${account.id}-${Date.now()}` // The unique order for this account finishing right now.
Expand All @@ -85,3 +92,51 @@ export function trackUserMenuOpen() {
export function trackUserMenuClose() {
window.analytics.track(Constants.USER_MENU_CLOSE)
}

export function trackCopyModel() {
window.analytics.track(Constants.COPIED_MODEL)
}

export function trackUndo(via_keyboard) {
trackCanvasInteraction('undo', {via_keyboard})
}

export function trackRedo(via_keyboard) {
trackCanvasInteraction('redo', {via_keyboard})
}

export function trackCutMetric(via_keyboard) {
trackCanvasInteraction('cut metric', {via_keyboard})
}

export function trackCopyMetric(via_keyboard) {
trackCanvasInteraction('copy metric', {via_keyboard})
}

export function trackPasteMetric(via_keyboard) {
trackCanvasInteraction('paste metric', {via_keyboard})
}

export function trackSelectedRegion() {
trackCanvasInteraction('select region')
}

export function trackOpenSidebar() {
trackCanvasInteraction('open sidebar')
}

export function trackCloseSidebar() {
trackCanvasInteraction('close sidebar')
}

export function trackSwitchToViewMode() {
trackCanvasInteraction('switch to view mode')
}

export function trackSwitchToEditMode() {
trackCanvasInteraction('switch to edit mode')
}

export function trackImportSlurp() {
trackCanvasInteraction('import slurp')
}