Skip to content

Commit f7c7917

Browse files
fix(webapp): tag selector overflow (#1055)
* fix(webapp): query input overflow * fix(webapp): snapshots * chore: ChangeEvent<HTMLTextAreaElement> * chore: query form ctrl+enter submit * fix: deleted uncontrolled operations
1 parent a4dd7f6 commit f7c7917

File tree

4 files changed

+77
-20
lines changed

4 files changed

+77
-20
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@
230230
"react-svg-loader": "^3.0.3",
231231
"react-svg-spinner": "^1.0.4",
232232
"react-tabs": "^3.2.3",
233+
"react-textarea-autosize": "8.3.0",
233234
"redux": "^4.0.5",
234235
"redux-devtools-extension": "^2.13.8",
235236
"redux-localstorage": "^0.4.1",

webapp/javascript/components/TagsBar.tsx

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import React, { useState, useEffect, useRef } from 'react';
22
import Button from '@webapp/ui/Button';
33
import 'react-dom';
4+
import { useWindowWidth } from '@react-hook/window-size';
45
import { TagsState } from '@webapp/redux/reducers/continuous';
56
import Dropdown, {
67
SubMenu,
78
MenuItem,
89
FocusableItem,
910
MenuGroup,
1011
} from '@webapp/ui/Dropdown';
12+
import TextareaAutosize from 'react-textarea-autosize';
1113
import { Prism } from '@webapp/util/prism';
1214
import { Query, brandQuery } from '@webapp/models/query';
1315
import styles from './TagsBar.module.css';
@@ -87,8 +89,11 @@ interface QueryInputProps {
8789
}
8890

8991
function QueryInput({ initialQuery, onSubmit }: QueryInputProps) {
92+
const windowWidth = useWindowWidth();
9093
const [query, setQuery] = useState(initialQuery);
9194
const codeRef = useRef<HTMLElement>(null);
95+
const textareaRef = useRef<any>(null);
96+
const [textAreaSize, setTextAreaSize] = useState({ width: 0, height: 0 });
9297

9398
// If query updated upstream, most likely the application changed
9499
// So we prefer to use it
@@ -102,28 +107,49 @@ function QueryInput({ initialQuery, onSubmit }: QueryInputProps) {
102107
}
103108
}, [query]);
104109

110+
useEffect(() => {
111+
setTextAreaSize({
112+
width: textareaRef?.current?.['offsetWidth'] || 0,
113+
height: textareaRef?.current?.['offsetHeight'] || 0,
114+
});
115+
}, [query, windowWidth, onSubmit]);
116+
117+
const onFormSubmit = (
118+
e:
119+
| React.FormEvent<HTMLFormElement>
120+
| React.KeyboardEvent<HTMLTextAreaElement>
121+
) => {
122+
e.preventDefault();
123+
onSubmit(query);
124+
};
125+
126+
const handleTextareaKeyDown = (
127+
e: React.KeyboardEvent<HTMLTextAreaElement>
128+
) => {
129+
if ((e.keyCode === 10 || e.keyCode === 13) && e.ctrlKey) {
130+
onFormSubmit(e);
131+
}
132+
};
133+
105134
return (
106-
<form
107-
className="tags-query"
108-
onSubmit={(e) => {
109-
e.preventDefault();
110-
onSubmit(query);
111-
}}
112-
>
135+
<form className="tags-query" onSubmit={onFormSubmit}>
113136
<pre className="tags-highlighted language-promql" aria-hidden="true">
114137
<code
115138
className="language-promql"
116139
id="highlighting-content"
117140
ref={codeRef}
141+
style={textAreaSize}
118142
>
119143
{query}
120144
</code>
121145
</pre>
122-
<input
146+
<TextareaAutosize
123147
className="tags-input"
124-
type="text"
148+
ref={textareaRef}
125149
value={query}
150+
spellCheck="false"
126151
onChange={(e) => setQuery(brandQuery(e.target.value))}
152+
onKeyDown={handleTextareaKeyDown}
127153
/>
128154
<Button
129155
type="submit"

webapp/sass/components/tagsbar.scss

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44

55
.tags-bar {
66
display: flex;
7-
7+
align-items: flex-start;
88
padding: 5px 0 15px;
99

1010
.tags-query {
1111
flex-grow: 1;
1212
display: flex;
13-
align-items: center;
13+
align-items: flex-start;
14+
position: relative;
1415
}
1516
.tags-app-name {
1617
position: relative;
@@ -31,10 +32,21 @@
3132
border-right: none;
3233
caret-color: var(--ps-c-white);
3334
color: var(--ps-c-gray-light-3);
34-
// color: red;
35-
letter-spacing: 0;
36-
font-family: arial;
35+
letter-spacing: 0px;
36+
font-family: monospace;
3737
font-size: 16px;
38+
border: 1px solid #4d4d4d;
39+
padding: 0.25em 0.375em;
40+
resize: none;
41+
word-break: break-all;
42+
box-sizing: border-box;
43+
line-height: 27px;
44+
white-space: break-spaces;
45+
overflow: hidden;
46+
47+
&:focus {
48+
outline: none;
49+
}
3850
}
3951
.tags-query-execute {
4052
flex-grow: 1;
@@ -56,22 +68,31 @@
5668
.tags-highlighted {
5769
height: 0;
5870
width: 0;
59-
margin-top: -17px;
60-
margin-right: -7px;
6171
z-index: 1;
62-
margin-left: 5px;
6372
pointer-events: none;
6473
overflow: inherit;
6574
background: none;
6675
padding: 0;
76+
position: absolute;
77+
margin: 0;
78+
top: 0;
79+
6780
code {
6881
font-size: 16px;
69-
font-family: arial;
82+
font-family: monospace;
7083
background: none;
71-
border: none;
84+
border: 1px solid transparent;
7285
box-shadow: none;
73-
padding: 0;
86+
padding: 0.25em 0.375em;
7487
margin: 0;
88+
line-height: 27px;
89+
position: absolute;
90+
top: 0px;
91+
left: 0px;
92+
word-break: break-all;
93+
white-space: break-spaces;
94+
letter-spacing: 0px;
95+
border-right: none;
7596
}
7697
}
7798

yarn.lock

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18624,6 +18624,15 @@ react-test-renderer@^16.0.0-0:
1862418624
react-is "^16.8.6"
1862518625
scheduler "^0.19.1"
1862618626

18627+
18628+
version "8.3.0"
18629+
resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.0.tgz#e6e2fd186d9f61bb80ac6e2dcb4c55504f93c2fa"
18630+
integrity sha512-3GLWFAan2pbwBeoeNDoqGmSbrShORtgWfaWX0RJDivsUrpShh01saRM5RU/i4Zmf+whpBVEY5cA90Eq8Ub1N3w==
18631+
dependencies:
18632+
"@babel/runtime" "^7.10.2"
18633+
use-composed-ref "^1.0.0"
18634+
use-latest "^1.0.0"
18635+
1862718636
react-textarea-autosize@^8.3.0:
1862818637
version "8.3.3"
1862918638
resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8"

0 commit comments

Comments
 (0)