Skip to content

Commit 4309a70

Browse files
authored
Merge pull request #12706 from influxdata/feat(variables)/add-to-script-from-side-menu
feat(variables): add ability to add a variable to script from side menu
2 parents b796033 + e8ffda2 commit 4309a70

File tree

7 files changed

+124
-7
lines changed

7 files changed

+124
-7
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
1. [12663](https://github.com/influxdata/influxdb/pull/12663): Insert flux function near cursor in flux editor
66
1. [12678](https://github.com/influxdata/influxdb/pull/12678): Enable the use of variables in the Data Explorer and Cell Editor Overlay
77
1. [12655](https://github.com/influxdata/influxdb/pull/12655): Add a variable control bar to dashboards to select values for variables.
8+
1. [12706](https://github.com/influxdata/influxdb/pull/12706): Add ability to add variable to script from the side menu.
89

910
### Bug Fixes
1011

ui/src/timeMachine/components/TimeMachineFluxEditor.tsx

+22-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {Position} from 'codemirror'
77
import FluxEditor from 'src/shared/components/FluxEditor'
88
import Threesizer from 'src/shared/components/threesizer/Threesizer'
99
import FluxFunctionsToolbar from 'src/timeMachine/components/fluxFunctionsToolbar/FluxFunctionsToolbar'
10-
import VariablesToolbar from 'src/timeMachine/components/variableToolbar/VariableToolbar'
10+
import VariableToolbar from 'src/timeMachine/components/variableToolbar/VariableToolbar'
1111
import ToolbarTab from 'src/timeMachine/components/ToolbarTab'
1212

1313
// Actions
@@ -16,7 +16,8 @@ import {saveAndExecuteQueries} from 'src/timeMachine/actions/queries'
1616

1717
// Utils
1818
import {getActiveQuery} from 'src/timeMachine/selectors'
19-
import {insertFluxFunction} from 'src/timeMachine/utils/scriptInsertion'
19+
import {insertFluxFunction} from 'src/timeMachine/utils/insertFunction'
20+
import {insertVariable} from 'src/timeMachine/utils/insertVariable'
2021

2122
// Constants
2223
import {HANDLE_VERTICAL, HANDLE_NONE} from 'src/shared/constants'
@@ -114,13 +115,31 @@ class TimeMachineFluxEditor extends PureComponent<Props, State> {
114115
)
115116
}
116117

117-
return <VariablesToolbar />
118+
return <VariableToolbar onClickVariable={this.handleInsertVariable} />
118119
}
119120

120121
private handleCursorPosition = (position: Position): void => {
121122
this.cursorPosition = position
122123
}
123124

125+
private handleInsertVariable = async (
126+
variableName: string
127+
): Promise<void> => {
128+
const {activeQueryText} = this.props
129+
const {line, ch} = this.cursorPosition
130+
131+
const {updatedScript, cursorPosition} = insertVariable(
132+
line,
133+
ch,
134+
activeQueryText,
135+
variableName
136+
)
137+
138+
await this.props.onSetActiveQueryText(updatedScript)
139+
140+
this.handleCursorPosition(cursorPosition)
141+
}
142+
124143
private handleInsertFluxFunction = async (
125144
functionName: string,
126145
fluxFunction: string

ui/src/timeMachine/components/variableToolbar/VariableItem.tsx

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@ import BoxTooltip from 'src/shared/components/BoxTooltip'
77

88
// Types
99
import {Variable} from '@influxdata/influx'
10+
import VariableLabel from 'src/timeMachine/components/variableToolbar/VariableLabel'
1011

1112
interface Props {
1213
variable: Variable
14+
onClickVariable: (variableName: string) => void
1315
}
1416

15-
const VariableItem: FunctionComponent<Props> = ({variable}) => {
17+
const VariableItem: FunctionComponent<Props> = ({
18+
variable,
19+
onClickVariable,
20+
}) => {
1621
const trigger = useRef<HTMLDivElement>(null)
1722
const [tooltipVisible, setTooltipVisible] = useState(false)
1823

@@ -29,7 +34,7 @@ const VariableItem: FunctionComponent<Props> = ({variable}) => {
2934
onMouseLeave={() => setTooltipVisible(false)}
3035
ref={trigger}
3136
>
32-
<div className="variables-toolbar--label">{variable.name}</div>
37+
<VariableLabel name={variable.name} onClickVariable={onClickVariable} />
3338
{tooltipVisible && (
3439
<BoxTooltip triggerRect={triggerRect as DOMRect}>
3540
<VariableTooltipContents variableID={variable.id} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import React, {FunctionComponent} from 'react'
2+
3+
interface Props {
4+
name: string
5+
onClickVariable: (name: string) => void
6+
}
7+
8+
const VariableLabel: FunctionComponent<Props> = ({onClickVariable, name}) => {
9+
return (
10+
<div
11+
className="variables-toolbar--label"
12+
onClick={() => {
13+
onClickVariable(name)
14+
}}
15+
>
16+
{name}
17+
</div>
18+
)
19+
}
20+
21+
export default VariableLabel

ui/src/timeMachine/components/variableToolbar/VariableToolbar.tsx

+13-2
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,18 @@ import 'src/timeMachine/components/variableToolbar/VariableToolbar.scss'
1818
import {Variable} from '@influxdata/influx'
1919
import {AppState} from 'src/types/v2'
2020

21+
interface OwnProps {
22+
onClickVariable: (variableName: string) => void
23+
}
24+
2125
interface StateProps {
2226
variables: Variable[]
2327
}
2428

25-
const VariableToolbar: FunctionComponent<StateProps> = ({variables}) => {
29+
const VariableToolbar: FunctionComponent<OwnProps & StateProps> = ({
30+
variables,
31+
onClickVariable,
32+
}) => {
2633
const [searchTerm, setSearchTerm] = useState('')
2734

2835
return (
@@ -33,7 +40,11 @@ const VariableToolbar: FunctionComponent<StateProps> = ({variables}) => {
3340
{variables
3441
.filter(v => v.name.includes(searchTerm))
3542
.map(v => (
36-
<VariableItem variable={v} key={v.id} />
43+
<VariableItem
44+
variable={v}
45+
key={v.id}
46+
onClickVariable={onClickVariable}
47+
/>
3748
))}
3849
</div>
3950
</FancyScrollbar>
+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import {Position} from 'codemirror'
2+
3+
const rejoinScript = (scriptLines: string[]): string => {
4+
return scriptLines.join('\n')
5+
}
6+
7+
const getCursorPosition = (
8+
currentLineNumber: number,
9+
currentCharacterNumber: number,
10+
variableName: string
11+
) => {
12+
return {
13+
line: currentLineNumber,
14+
ch: currentCharacterNumber + formatVariable(variableName).length,
15+
}
16+
}
17+
18+
const insertAtCharacter = (
19+
lineNumber: number,
20+
characterNumber: number,
21+
scriptLines: string[],
22+
variableName: string
23+
): string => {
24+
const lineToEdit = scriptLines[lineNumber]
25+
const front = lineToEdit.slice(0, characterNumber)
26+
const back = lineToEdit.slice(characterNumber, lineToEdit.length)
27+
28+
const updatedLine = `${front}${formatVariable(variableName)}${back}`
29+
scriptLines[lineNumber] = updatedLine
30+
31+
return rejoinScript(scriptLines)
32+
}
33+
34+
const formatVariable = (variableName: string): string => {
35+
return `v.${variableName}`
36+
}
37+
38+
export const insertVariable = (
39+
currentLineNumber: number,
40+
currentCharacterNumber: number,
41+
currentScript: string,
42+
variableName: string
43+
): {updatedScript: string; cursorPosition: Position} => {
44+
const scriptLines = currentScript.split('\n')
45+
46+
const updatedScript = insertAtCharacter(
47+
currentLineNumber,
48+
currentCharacterNumber,
49+
scriptLines,
50+
variableName
51+
)
52+
53+
const updatedCursorPosition = getCursorPosition(
54+
currentLineNumber,
55+
currentCharacterNumber,
56+
variableName
57+
)
58+
59+
return {updatedScript, cursorPosition: updatedCursorPosition}
60+
}

0 commit comments

Comments
 (0)