Skip to content

Commit 52ac1fe

Browse files
committed
hotkeys can be enabled or disabled
1 parent 5dfa0db commit 52ac1fe

12 files changed

Lines changed: 162 additions & 29 deletions

File tree

src/components/Container/index.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import Workspace from "react-material-workspace-layout/Workspace"
77

88
export default ({
99
children,
10+
onNext,
11+
onPrev,
1012
currentSampleIndex = 0,
1113
numberOfSamples = 1,
1214
titleContent,
@@ -15,8 +17,11 @@ export default ({
1517
const headerItems = useMemo(
1618
() =>
1719
[
18-
currentSampleIndex > 0 && { name: "Prev" },
19-
numberOfSamples > currentSampleIndex + 1 && { name: "Next" },
20+
(currentSampleIndex > 0 || onPrev) && { name: "Prev", onClick: onPrev },
21+
(numberOfSamples > currentSampleIndex + 1 || onNext) && {
22+
name: "Next",
23+
onClick: onNext
24+
},
2025
{ name: "Done" }
2126
].filter(Boolean),
2227
[currentSampleIndex, numberOfSamples]

src/components/Container/index.story.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import { action } from "@storybook/addon-actions"
66
import Container from "./"
77

88
storiesOf("Container", module).add("Basic", () => (
9-
<Container onClickHeaderItem={action("onClickHeaderItem")}>
9+
<Container
10+
onNext={action("onNext")}
11+
onPrev={action("onPrev")}
12+
onClickHeaderItem={action("onClickHeaderItem")}
13+
>
1014
Some inner content
1115
</Container>
1216
))

src/components/DocumentLabeler/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ export default function DocumentLabeler(props: LabelDocumentProps) {
1919
<div>
2020
<div>
2121
<LabelSelector
22+
hotkeysEnabled={props.hotkeysEnabled}
2223
labels={props.labels}
2324
onSelectLabel={(labelId: string) => {
25+
console.log({ labelId })
2426
if (props.multipleLabels) {
2527
changeSelectedLabels(selectedLabels.concat([labelId]))
2628
props.onChange(selectedLabels.concat([labelId]))
@@ -38,6 +40,7 @@ export default function DocumentLabeler(props: LabelDocumentProps) {
3840
if (!label) return
3941
return (
4042
<LabelButton
43+
key={labelId}
4144
{...label}
4245
small
4346
deletable

src/components/DocumentLabeler/index.story.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import DocumentLabeler from "./"
1111
storiesOf("DocumentLabeler", module)
1212
.add("Basic", () => (
1313
<DocumentLabeler
14+
hotkeysEnabled
1415
type="label-document"
1516
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
1617
labels={[
@@ -25,10 +26,12 @@ storiesOf("DocumentLabeler", module)
2526
displayName: "Proper Noun"
2627
}
2728
]}
29+
onChange={action("onChange")}
2830
/>
2931
))
3032
.add("Basic with Initial Label", () => (
3133
<DocumentLabeler
34+
hotkeysEnabled
3235
type="label-document"
3336
initialLabel="noun"
3437
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
@@ -44,10 +47,12 @@ storiesOf("DocumentLabeler", module)
4447
displayName: "Proper Noun"
4548
}
4649
]}
50+
onChange={action("onChange")}
4751
/>
4852
))
4953
.add("Basic Multi Label", () => (
5054
<DocumentLabeler
55+
hotkeysEnabled
5156
type="label-document"
5257
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
5358
multipleLabels
@@ -64,10 +69,12 @@ storiesOf("DocumentLabeler", module)
6469
displayName: "Proper Noun"
6570
}
6671
]}
72+
onChange={action("onChange")}
6773
/>
6874
))
6975
.add("Basic Nested Labels", () => (
7076
<DocumentLabeler
77+
hotkeysEnabled
7178
type="label-document"
7279
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
7380
labels={[
@@ -124,5 +131,67 @@ storiesOf("DocumentLabeler", module)
124131
parent: "subject"
125132
}
126133
]}
134+
onChange={action("onChange")}
135+
/>
136+
))
137+
.add("Basic Nested Labels without hotkeys", () => (
138+
<DocumentLabeler
139+
type="label-document"
140+
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
141+
labels={[
142+
{
143+
color: colors[0],
144+
id: "intent",
145+
displayName: "Intent"
146+
},
147+
{
148+
color: colors[1],
149+
id: "subject",
150+
displayName: "Subject"
151+
},
152+
{
153+
color: colors[6],
154+
id: "desire",
155+
displayName: "Desire",
156+
parent: "intent"
157+
},
158+
{
159+
color: colors[7],
160+
id: "informative-desire",
161+
displayName: "Informative Desire",
162+
parent: "desire"
163+
},
164+
{
165+
color: colors[2],
166+
id: "wants-information",
167+
displayName: "Wants More Information",
168+
parent: "informative-desire"
169+
},
170+
{
171+
color: colors[3],
172+
id: "cancel",
173+
displayName: "Wants To Cancel",
174+
parent: "desire"
175+
},
176+
{
177+
color: colors[4],
178+
id: "continue",
179+
displayName: "Wants To Continue",
180+
parent: "desire"
181+
},
182+
{
183+
color: colors[5],
184+
id: "person",
185+
displayName: "Person",
186+
parent: "subject"
187+
},
188+
{
189+
color: colors[6],
190+
id: "object",
191+
displayName: "Object",
192+
parent: "subject"
193+
}
194+
]}
195+
onChange={action("onChange")}
127196
/>
128197
))

src/components/LabelButton/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const Label = (props: {
5353
...$Exact<LabelType>,
5454
hasChildren?: boolean,
5555
small?: boolean,
56-
hotkey?: string,
56+
hotkey?: ?string,
5757
deletable?: boolean,
5858
onClick: string => any
5959
}) => {

src/components/LabelSelector/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ const findRouteFromParents = (labelId, labels) => {
1616

1717
export default ({
1818
labels,
19-
onSelectLabel
19+
onSelectLabel,
20+
hotkeysEnabled = false
2021
}: {
2122
labels: Array<LabelType>,
2223
onSelectLabel: string => any
@@ -40,6 +41,7 @@ export default ({
4041
}
4142

4243
useEffect(() => {
44+
if (!hotkeysEnabled) return
4345
const eventFunc = e => {
4446
if (hotkeyLabelMap[e.key]) {
4547
const labelId = hotkeyLabelMap[e.key]
@@ -59,7 +61,7 @@ export default ({
5961
return () => {
6062
window.removeEventListener("keydown", eventFunc)
6163
}
62-
}, [changeParents, onSelectLabel])
64+
}, [changeParents, onSelectLabel, hotkeysEnabled])
6365

6466
return (
6567
<div>
@@ -104,7 +106,7 @@ export default ({
104106
<LabelButton
105107
key={l.id}
106108
{...l}
107-
hotkey={labelHotkeyMap[l.id]}
109+
hotkey={hotkeysEnabled ? labelHotkeyMap[l.id] : null}
108110
onClick={
109111
!l.hasChildren
110112
? onSelectLabel

src/components/LabelSelector/index.story.js

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,44 @@ import colors from "../../colors"
88

99
import LabelSelector from "./"
1010

11-
storiesOf("LabelSelector", module).add("Basic", () => (
12-
<LabelSelector
13-
labels={[
14-
{
15-
displayName: "Label One",
16-
id: "label_one",
17-
description: "The first label",
18-
color: colors[0]
19-
},
20-
{
21-
displayName: "Label Two",
22-
id: "label_two",
23-
description: "The second label",
24-
color: colors[1]
25-
}
26-
]}
27-
onSelectLabel={action("onSelectLabel")}
28-
/>
29-
))
11+
storiesOf("LabelSelector", module)
12+
.add("Basic", () => (
13+
<LabelSelector
14+
hotkeysEnabled
15+
labels={[
16+
{
17+
displayName: "Label One",
18+
id: "label_one",
19+
description: "The first label",
20+
color: colors[0]
21+
},
22+
{
23+
displayName: "Label Two",
24+
id: "label_two",
25+
description: "The second label",
26+
color: colors[1]
27+
}
28+
]}
29+
onSelectLabel={action("onSelectLabel")}
30+
/>
31+
))
32+
.add("Hotkeys Off", () => (
33+
<LabelSelector
34+
hotkeysEnabled={false}
35+
labels={[
36+
{
37+
displayName: "Label One",
38+
id: "label_one",
39+
description: "The first label",
40+
color: colors[0]
41+
},
42+
{
43+
displayName: "Label Two",
44+
id: "label_two",
45+
description: "The second label",
46+
color: colors[1]
47+
}
48+
]}
49+
onSelectLabel={action("onSelectLabel")}
50+
/>
51+
))

src/components/NLPAnnotator/index.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export default function NLPAnnotator(props: NLPAnnotatorProps) {
3333
return () => {
3434
window.removeEventListener("keydown", eventFunc)
3535
}
36-
}, [props.onFinish])
36+
}, [props.onFinish, output])
3737

3838
const onChange = (newOutput: any) => {
3939
if (props.onChange) props.onChange(newOutput)
@@ -51,12 +51,14 @@ export default function NLPAnnotator(props: NLPAnnotatorProps) {
5151
return labels
5252
}, [props.labels])
5353

54-
const isPassingValidation = validator(output).some(msg =>
54+
const isPassingValidation = !validator(output).some(msg =>
5555
msg.toLowerCase().includes("error")
5656
)
5757

58+
console.log({ output })
5859
const onFinish = useEventCallback(() => {
5960
if (!isPassingValidation) return
61+
console.log("onFinish", output)
6062
props.onFinish(output)
6163
})
6264

@@ -90,7 +92,12 @@ export default function NLPAnnotator(props: NLPAnnotatorProps) {
9092
}
9193

9294
return (
93-
<Container onClickHeaderItem={onClickHeaderItem}>
95+
<Container
96+
titleContent={props.titleContent}
97+
onNext={props.onNext}
98+
onPrev={props.onPrev}
99+
onClickHeaderItem={onClickHeaderItem}
100+
>
94101
<div>{annotator}</div>
95102
</Container>
96103
)

src/components/NLPAnnotator/index.story.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ import NLPAnnotator from "./"
1111
storiesOf("NLPAnnotator", module)
1212
.add("Sequence Labeler", () => (
1313
<NLPAnnotator
14+
hotkeysEnabled
1415
onChange={action("onChange")}
16+
onFinish={action("onFinish")}
17+
onNext={action("onNext")}
18+
onPrev={action("onPrev")}
1519
type="label-sequence"
1620
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
1721
labels={[
@@ -30,7 +34,9 @@ storiesOf("NLPAnnotator", module)
3034
))
3135
.add("Document Labeler", () => (
3236
<NLPAnnotator
37+
hotkeysEnabled
3338
onChange={action("onChange")}
39+
onFinish={action("onFinish")}
3440
type="label-document"
3541
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
3642
labels={[
@@ -49,7 +55,9 @@ storiesOf("NLPAnnotator", module)
4955
))
5056
.add("Transcriber", () => (
5157
<NLPAnnotator
58+
hotkeysEnabled
5259
onChange={action("onChange")}
60+
onFinish={action("onFinish")}
5361
type="transcribe"
5462
audio="https://html5tutorial.info/media/vincent.mp3"
5563
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
@@ -58,13 +66,15 @@ storiesOf("NLPAnnotator", module)
5866
))
5967
.add("Transcriber with Finish Handler", () => (
6068
<NLPAnnotator
69+
hotkeysEnabled
6170
type="transcribe"
6271
audio="https://html5tutorial.info/media/vincent.mp3"
6372
document={`Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pharetra ipsum tristique ligula venenatis placerat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce mollis velit nec tellus sollicitudin aliquam. In velit erat, iaculis id consectetur et, tincidunt sit amet mauris. Quisque ultricies, purus eleifend congue malesuada, ipsum erat molestie dolor, in pellentesque lacus purus vel nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla sed vestibulum magna. Quisque ut lorem imperdiet, aliquam velit nec, dictum felis.`}
6473
initialTranscriptionText="Starry starry knight."
6574
validator={(t = "") =>
6675
t.length === 0 ? ["Error: Must be some text"] : []
6776
}
77+
onChange={action("onChange")}
6878
onFinish={action("onFinish")}
6979
/>
7080
))

src/components/SequenceAnnotator/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export default function SequenceAnnotator(props: SequenceAnnotatorProps) {
3131
<div>
3232
<div>
3333
<LabelSelector
34+
hotkeysEnabled={props.hotkeysEnabled}
3435
labels={props.labels}
3536
onSelectLabel={(label: string) => {
3637
const { color } = props.labels.find(({ id }) => label === id) || {}

0 commit comments

Comments
 (0)