Skip to content

Commit a04b83f

Browse files
committed
add name editing
1 parent 57cae21 commit a04b83f

File tree

5 files changed

+71
-8
lines changed

5 files changed

+71
-8
lines changed

packages/graphql-playground-react/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@
147147
"react-display-name": "^0.2.3",
148148
"react-dom": "^16.2.0",
149149
"react-helmet": "^5.2.0",
150+
"react-input-autosize": "^2.2.1",
150151
"react-modal": "^3.1.11",
151152
"react-redux": "^5.0.6",
152153
"react-router-dom": "^4.2.2",

packages/graphql-playground-react/src/components/Playground/Tab.tsx

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { connect } from 'react-redux'
55
import { closeTab, selectTab } from '../../state/sessions/actions'
66
import * as cn from 'classnames'
77
import { Session } from '../../state/sessions/reducers'
8+
import { editName } from '../../lib'
9+
import AutosizeInput from 'react-input-autosize'
810

911
export interface Props {
1012
session: Session
@@ -15,10 +17,12 @@ export interface Props {
1517
export interface ReduxProps {
1618
selectTab: (sessionId: string) => void
1719
closeTab: (sessionId: string) => void
20+
editName: (name: string) => void
1821
}
1922

2023
export interface State {
2124
overCross: boolean
25+
editingName: boolean
2226
}
2327

2428
class Tab extends React.PureComponent<Props & ReduxProps, State> {
@@ -27,6 +31,7 @@ class Tab extends React.PureComponent<Props & ReduxProps, State> {
2731

2832
this.state = {
2933
overCross: false,
34+
editingName: false,
3035
}
3136
}
3237

@@ -36,6 +41,12 @@ class Tab extends React.PureComponent<Props & ReduxProps, State> {
3641

3742
const active = session.id === selectedSessionId
3843

44+
const name =
45+
session.name ||
46+
session.operationName ||
47+
queryTypes.firstOperationName ||
48+
'New Tab'
49+
3950
return (
4051
<div
4152
className={cn('tab', localTheme, { active })}
@@ -59,6 +70,7 @@ class Tab extends React.PureComponent<Props & ReduxProps, State> {
5970
@p: .bgDarkBlue;
6071
}
6172
border-bottom: 2px solid #172a3a;
73+
font-size: 14px;
6274
}
6375
.tab:first-of-type {
6476
margin-left: 0;
@@ -120,12 +132,22 @@ class Tab extends React.PureComponent<Props & ReduxProps, State> {
120132
@p: .mr10;
121133
}
122134
123-
.operation-name {
135+
.tab .operation-name,
136+
.tab :global(input) {
124137
@p: .o50;
138+
background: transparent !important;
139+
color: white;
140+
font-size: 14px;
141+
margin-left: 2px;
142+
display: inline;
143+
letter-spacing: 0.53px;
125144
&.active {
126145
@p: .o100;
127146
}
128147
}
148+
.tab :global(input) {
149+
opacity: 1 !important;
150+
}
129151
130152
.close {
131153
@p: .ml10, .relative;
@@ -201,12 +223,24 @@ class Tab extends React.PureComponent<Props & ReduxProps, State> {
201223
)}
202224
</div>
203225
</div>
204-
<div className={cn('operation-name', { active })}>
205-
{session.name ||
206-
session.operationName ||
207-
queryTypes.firstOperationName ||
208-
'New Tab'}
209-
</div>
226+
{this.state.editingName ? (
227+
<AutosizeInput
228+
value={session.name}
229+
onChange={this.handleEditName}
230+
onBlur={this.stopEditName}
231+
onKeyDown={this.handleKeyDown}
232+
autoFocus={true}
233+
className="operation-name"
234+
style={{ background: 'transparent' }}
235+
/>
236+
) : (
237+
<div
238+
className={cn('operation-name', { active })}
239+
onDoubleClick={this.startEditName}
240+
>
241+
{name}
242+
</div>
243+
)}
210244
<div
211245
className={cn('close', {
212246
active,
@@ -234,6 +268,20 @@ class Tab extends React.PureComponent<Props & ReduxProps, State> {
234268
)
235269
}
236270

271+
private startEditName = () => {
272+
this.setState({ editingName: true })
273+
}
274+
275+
private stopEditName = () => {
276+
this.setState({ editingName: false })
277+
}
278+
279+
private handleKeyDown = e => {
280+
if (e.keyCode === 13) {
281+
this.setState({ editingName: false })
282+
}
283+
}
284+
237285
private handleMouseOverCross = () => {
238286
this.setState({ overCross: true })
239287
}
@@ -250,6 +298,10 @@ class Tab extends React.PureComponent<Props & ReduxProps, State> {
250298
e.stopPropagation()
251299
this.props.closeTab(this.props.session.id)
252300
}
301+
302+
private handleEditName = e => {
303+
this.props.editName(e.target.value)
304+
}
253305
}
254306

255-
export default connect(null, { closeTab, selectTab })(Tab)
307+
export default connect(null, { closeTab, selectTab, editName })(Tab)

packages/graphql-playground-react/src/state/sessions/actions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export const {
5656
setQueryTypes,
5757
injectHeaders,
5858
openConfigTab,
59+
editName,
5960
} = createActions({
6061
// simple property setting
6162
EDIT_QUERY: simpleAction('query'),
@@ -66,6 +67,7 @@ export const {
6667
SET_VARIABLE_TO_TYPE: simpleAction('variableToType'),
6768
SET_OPERATIONS: simpleAction('operations'),
6869
SET_EDITOR_FLEX: simpleAction('editorFlex'),
70+
EDIT_NAME: simpleAction('name'),
6971

7072
OPEN_QUERY_VARIABLES: () => ({ queryVariablesActive: true }),
7173
CLOSE_QUERY_VARIABLES: () => ({ queryVariablesActive: false }),

packages/graphql-playground-react/src/state/sessions/reducers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
setSubscriptionActive,
1818
startQuery,
1919
setQueryTypes,
20+
editName,
2021
} from './actions'
2122
import { getSelectedSessionId } from './selectors'
2223
import { getDefaultSession, defaultQuery } from '../../constants'
@@ -175,6 +176,7 @@ export default handleActions(
175176
setSubscriptionActive,
176177
startQuery,
177178
setQueryTypes,
179+
editName,
178180
)]: (state, { payload }) => {
179181
const keys = Object.keys(payload)
180182
const keyName = keys.length === 1 ? keys[0] : keys[1]

packages/graphql-playground-react/yarn.lock

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6756,6 +6756,12 @@ react-helmet@^5.2.0:
67566756
prop-types "^15.5.4"
67576757
react-side-effect "^1.1.0"
67586758

6759+
react-input-autosize@^2.2.1:
6760+
version "2.2.1"
6761+
resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.1.tgz#ec428fa15b1592994fb5f9aa15bb1eb6baf420f8"
6762+
dependencies:
6763+
prop-types "^15.5.8"
6764+
67596765
react-modal@^1.6.5:
67606766
version "1.9.7"
67616767
resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-1.9.7.tgz#07ef56790b953e3b98ef1e2989e347983c72871d"

0 commit comments

Comments
 (0)