Move time machine visualization from bottom division to yield func node

component

Co-authored-by: Iris Scholten <ischolten.is@gmail.com>
Co-authored-by: Delmer Reed <delmer814+1@gmail.com>
pull/3624/head
Del 2018-06-07 18:04:05 -07:00 committed by Iris Scholten
parent 8edd0b3ff6
commit 1db5de72d1
7 changed files with 126 additions and 76 deletions

View File

@ -3,6 +3,7 @@ import React, {PureComponent} from 'react'
import {FluxContext} from 'src/flux/containers/FluxPage' import {FluxContext} from 'src/flux/containers/FluxPage'
import FuncSelector from 'src/flux/components/FuncSelector' import FuncSelector from 'src/flux/components/FuncSelector'
import FuncNode from 'src/flux/components/FuncNode' import FuncNode from 'src/flux/components/FuncNode'
import YieldFuncNode from 'src/flux/components/YieldFuncNode'
import {Func} from 'src/types/flux' import {Func} from 'src/types/flux'
@ -24,6 +25,7 @@ class ExpressionNode extends PureComponent<Props> {
funcs, funcs,
declarationsFromBody, declarationsFromBody,
} = this.props } = this.props
return ( return (
<FluxContext.Consumer> <FluxContext.Consumer>
{({ {({
@ -33,24 +35,39 @@ class ExpressionNode extends PureComponent<Props> {
onGenerateScript, onGenerateScript,
onToggleYield, onToggleYield,
service, service,
data,
}) => { }) => {
return ( return (
<> <>
{funcs.map((func, i) => ( {funcs.map((func, i) => {
<FuncNode if (func.name === 'yield') {
key={i} return (
index={i} <YieldFuncNode
func={func} index={i}
bodyID={bodyID} key={i}
service={service} func={func}
onChangeArg={onChangeArg} data={data}
onDelete={onDeleteFuncNode} bodyID={bodyID}
onToggleYield={onToggleYield} declarationID={declarationID}
declarationID={declarationID} />
onGenerateScript={onGenerateScript} )
declarationsFromBody={declarationsFromBody} }
/> return (
))} <FuncNode
key={i}
index={i}
func={func}
bodyID={bodyID}
service={service}
onChangeArg={onChangeArg}
onDelete={onDeleteFuncNode}
onToggleYield={onToggleYield}
declarationID={declarationID}
onGenerateScript={onGenerateScript}
declarationsFromBody={declarationsFromBody}
/>
)
})}
<FuncSelector <FuncSelector
bodyID={bodyID} bodyID={bodyID}
funcs={funcNames} funcs={funcNames}

View File

@ -1,8 +1,7 @@
import React, {PureComponent, CSSProperties} from 'react' import React, {PureComponent} from 'react'
import SchemaExplorer from 'src/flux/components/SchemaExplorer' import SchemaExplorer from 'src/flux/components/SchemaExplorer'
import BodyBuilder from 'src/flux/components/BodyBuilder' import BodyBuilder from 'src/flux/components/BodyBuilder'
import TimeMachineEditor from 'src/flux/components/TimeMachineEditor' import TimeMachineEditor from 'src/flux/components/TimeMachineEditor'
import TimeMachineVis from 'src/flux/components/TimeMachineVis'
import Threesizer from 'src/shared/components/threesizer/Threesizer' import Threesizer from 'src/shared/components/threesizer/Threesizer'
import { import {
Suggestion, Suggestion,
@ -10,7 +9,6 @@ import {
OnSubmitScript, OnSubmitScript,
FlatBody, FlatBody,
ScriptStatus, ScriptStatus,
FluxTable,
} from 'src/types/flux' } from 'src/types/flux'
import {Service} from 'src/types' import {Service} from 'src/types'
@ -19,7 +17,6 @@ import {HANDLE_VERTICAL, HANDLE_HORIZONTAL} from 'src/shared/constants'
interface Props { interface Props {
service: Service service: Service
data: FluxTable[]
script: string script: string
body: Body[] body: Body[]
status: ScriptStatus status: ScriptStatus
@ -40,15 +37,14 @@ class TimeMachine extends PureComponent<Props> {
public render() { public render() {
return ( return (
<Threesizer <Threesizer
orientation={HANDLE_HORIZONTAL} orientation={HANDLE_VERTICAL}
divisions={this.mainSplit} divisions={this.verticals}
containerClass="page-contents" containerClass="page-contents"
/> />
) )
} }
private get mainSplit() { private get verticals() {
const {data} = this.props
return [ return [
{ {
handleDisplay: 'none', handleDisplay: 'none',
@ -56,31 +52,40 @@ class TimeMachine extends PureComponent<Props> {
headerButtons: [], headerButtons: [],
render: () => ( render: () => (
<Threesizer <Threesizer
divisions={this.divisions} divisions={this.scriptAndExplorer}
orientation={HANDLE_VERTICAL} orientation={HANDLE_HORIZONTAL}
/> />
), ),
}, },
{ this.builder,
handlePixels: 8,
menuOptions: [],
headerButtons: [],
style: {overflow: 'visible'} as CSSProperties,
render: () => <TimeMachineVis data={data} />,
},
] ]
} }
private get divisions() { private get builder() {
const {body, service, suggestions, onAppendFrom, onAppendJoin} = this.props
return {
name: 'Build',
headerButtons: [],
menuOptions: [],
render: () => (
<BodyBuilder
body={body}
service={service}
suggestions={suggestions}
onAppendFrom={onAppendFrom}
onAppendJoin={onAppendJoin}
/>
),
}
}
private get scriptAndExplorer() {
const { const {
body,
script, script,
status, status,
service, service,
onAnalyze, onAnalyze,
suggestions, suggestions,
onAppendFrom,
onAppendJoin,
onChangeScript, onChangeScript,
onSubmitScript, onSubmitScript,
} = this.props } = this.props
@ -91,9 +96,11 @@ class TimeMachine extends PureComponent<Props> {
headerButtons: [], headerButtons: [],
menuOptions: [], menuOptions: [],
render: () => <SchemaExplorer service={service} />, render: () => <SchemaExplorer service={service} />,
headerOrientation: HANDLE_VERTICAL,
}, },
{ {
name: 'Script', name: 'Script',
headerOrientation: HANDLE_VERTICAL,
headerButtons: [ headerButtons: [
<div <div
key="analyze" key="analyze"
@ -115,20 +122,6 @@ class TimeMachine extends PureComponent<Props> {
/> />
), ),
}, },
{
name: 'Build',
headerButtons: [],
menuOptions: [],
render: () => (
<BodyBuilder
body={body}
service={service}
suggestions={suggestions}
onAppendFrom={onAppendFrom}
onAppendJoin={onAppendJoin}
/>
),
},
] ]
} }
} }

View File

@ -0,0 +1,32 @@
import React, {PureComponent} from 'react'
import _ from 'lodash'
import {ErrorHandling} from '../../shared/decorators/errors'
import {FluxTable} from 'src/types'
import {Func} from 'src/types/flux'
import TimeMachineVis from './TimeMachineVis'
interface Props {
data: FluxTable[]
index: number
bodyID: string
func: Func
declarationID?: string
}
@ErrorHandling
class YieldFuncNode extends PureComponent<Props> {
public render() {
const {data, func} = this.props
const yieldName = _.get(func, 'args.0.value', 'result')
return (
<div style={{width: '1000px', height: '1000px'}}>
<span>{yieldName}</span>
<TimeMachineVis data={data} />
</div>
)
}
}
export default YieldFuncNode

View File

@ -95,7 +95,7 @@ export class FluxPage extends PureComponent<Props, State> {
} }
public render() { public render() {
const {suggestions, data, body, status} = this.state const {suggestions, body, status} = this.state
const {script} = this.props const {script} = this.props
return ( return (
@ -104,7 +104,6 @@ export class FluxPage extends PureComponent<Props, State> {
<div className="page hosts-list-page"> <div className="page hosts-list-page">
{this.header} {this.header}
<TimeMachine <TimeMachine
data={data}
body={body} body={body}
script={script} script={script}
status={status} status={status}
@ -148,6 +147,7 @@ export class FluxPage extends PureComponent<Props, State> {
onGenerateScript: this.handleGenerateScript, onGenerateScript: this.handleGenerateScript,
onToggleYield: this.handleToggleYield, onToggleYield: this.handleToggleYield,
service: this.service, service: this.service,
data: this.state.data,
} }
} }
@ -366,6 +366,7 @@ export class FluxPage extends PureComponent<Props, State> {
const {funcs: bodyFuncs, declarations} = body const {funcs: bodyFuncs, declarations} = body
let funcs = bodyFuncs let funcs = bodyFuncs
if (!_.isEmpty(declarations)) { if (!_.isEmpty(declarations)) {
funcs = _.flatMap(declarations, d => d.funcs) funcs = _.flatMap(declarations, d => d.funcs)
} }

View File

@ -25,6 +25,7 @@ interface Props {
draggable: boolean draggable: boolean
orientation: string orientation: string
activeHandleID: string activeHandleID: string
headerOrientation: string
render: (visibility: string) => ReactElement<any> render: (visibility: string) => ReactElement<any>
onHandleStartDrag: (id: string, e: MouseEvent<HTMLElement>) => void onHandleStartDrag: (id: string, e: MouseEvent<HTMLElement>) => void
onDoubleClick: (id: string) => void onDoubleClick: (id: string) => void
@ -191,8 +192,8 @@ class Division extends PureComponent<Props> {
} }
private get contentsClass(): string { private get contentsClass(): string {
const {orientation, size} = this.props const {headerOrientation, size} = this.props
return classnames(`threesizer--contents ${orientation}`, { return classnames(`threesizer--contents ${headerOrientation}`, {
'no-shadows': !size, 'no-shadows': !size,
}) })
} }

View File

@ -133,28 +133,33 @@ class Threesizer extends Component<Props, State> {
onMouseMove={this.handleDrag} onMouseMove={this.handleDrag}
ref={r => (this.containerRef = r)} ref={r => (this.containerRef = r)}
> >
{divisions.map((d, i) => ( {divisions.map((d, i) => {
<Division const headerOrientation = _.get(d, 'headerOrientation', orientation)
key={d.id}
id={d.id} return (
name={d.name} <Division
size={d.size} key={d.id}
style={d.style} id={d.id}
offset={this.offset} name={d.name}
draggable={i > 0} size={d.size}
orientation={orientation} style={d.style}
handlePixels={d.handlePixels} offset={this.offset}
handleDisplay={d.handleDisplay} draggable={i > 0}
activeHandleID={activeHandleID} orientation={orientation}
onMaximize={this.handleMaximize} handlePixels={d.handlePixels}
onMinimize={this.handleMinimize} handleDisplay={d.handleDisplay}
onDoubleClick={this.handleDoubleClick} activeHandleID={activeHandleID}
render={this.props.divisions[i].render} onMaximize={this.handleMaximize}
onHandleStartDrag={this.handleStartDrag} onMinimize={this.handleMinimize}
menuOptions={this.props.divisions[i].menuOptions} headerOrientation={headerOrientation}
headerButtons={this.props.divisions[i].headerButtons} onDoubleClick={this.handleDoubleClick}
/> render={this.props.divisions[i].render}
))} onHandleStartDrag={this.handleStartDrag}
menuOptions={this.props.divisions[i].menuOptions}
headerButtons={this.props.divisions[i].headerButtons}
/>
)
})}
</div> </div>
) )
} }

View File

@ -30,6 +30,7 @@ export interface Context {
onGenerateScript: OnGenerateScript onGenerateScript: OnGenerateScript
onToggleYield: OnToggleYield onToggleYield: OnToggleYield
service: Service service: Service
data: FluxTable[]
} }
export interface DeleteFuncNodeArgs { export interface DeleteFuncNodeArgs {