Skip to content

Commit 58f6643

Browse files
authored
Additions: add clear button in core + add selected item support (#146)
* Additions: add clear button in core + add selected item support * changes after review * remove selected item default value
1 parent a8bb716 commit 58f6643

File tree

15 files changed

+132
-26
lines changed

15 files changed

+132
-26
lines changed

packages/core/src/hooks/use_item_callbacks.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useState } from "react";
22

3-
const useItemCallbacks = onSelect => {
3+
const useItemCallbacks = ({ onSelect }) => {
44
const [currentDepth, setCurrentDepth] = useState(0);
55
const [parents, setParents] = useState([]);
66

packages/core/src/input/input.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ import { jsx } from "@emotion/core";
33
import React from "react";
44

55
export const InputIconRenderer = () => <>🔍</>;
6+
export const ClearIconRenderer = () => <>✘️</>;
67

78
const Input = props => {
89
const {
910
inputRef,
1011
searchTerm,
1112
onInputChange,
1213
getStyles,
13-
inputIconRenderer: InputIcon = InputIconRenderer
14+
inputIconRenderer: InputIcon = InputIconRenderer,
15+
clearIconRenderer: ClearIcon = ClearIconRenderer
1416
} = props;
1517
return (
1618
<div ref={inputRef} css={getStyles("inputWrapper", props)}>
@@ -22,6 +24,11 @@ const Input = props => {
2224
value={searchTerm}
2325
onChange={onInputChange}
2426
/>
27+
{searchTerm !== "" && (
28+
<button css={getStyles("clearInput", props)} onClick={onInputChange}>
29+
<ClearIcon />
30+
</button>
31+
)}
2532
</div>
2633
);
2734
};

packages/core/src/input/inputStyle.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ export const searchIconCss = () => ({
2222
left: "8px"
2323
});
2424

25+
export const clearIconCss = () => ({
26+
position: "absolute",
27+
top: "8px",
28+
right: "8px",
29+
cursor: "pointer"
30+
});
31+
2532
export const wrapperCss = () => ({
2633
position: "relative"
2734
});
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
/** @jsx jsx */
2+
import { jsx } from "@emotion/core";
13
import React from "react";
24

3-
const BasicItem = ({ label = "" }) => {
4-
return <span>{label}</span>;
5+
const BasicItem = props => {
6+
const { label = "", getStyles } = props;
7+
return <span css={getStyles("selectedItem", props)}>{label}</span>;
58
};
69

710
export default BasicItem;

packages/core/src/item/item.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ const ItemRenderer = props => {
1717
currentDepth: 0
1818
},
1919
onClick,
20-
forwardIconRenderer: ForwardIcon = ForwardIconRenderer
20+
forwardIconRenderer: ForwardIcon = ForwardIconRenderer,
21+
selectedItem
2122
} = props;
23+
24+
const isItemSelected = item.toString() === selectedItem?.item?.toString();
2225
const searchIndex = item[item.length - 1]
2326
.toLowerCase()
2427
.indexOf(searchTerm.trim().toLowerCase());
@@ -33,13 +36,18 @@ const ItemRenderer = props => {
3336
searchIndex={searchIndex}
3437
searchTerm={searchTerm.trim()}
3538
getStyles={getStyles}
39+
isSelected={
40+
isItemSelected && item[item.length - 1] === selectedItem.leaf
41+
}
3642
/>
3743
)}
3844
{searchTerm === "" && (
3945
<BasicItem
4046
label={item[currentDepth]}
41-
searchIndex={searchIndex}
42-
searchTerm={searchTerm.trim()}
47+
getStyles={getStyles}
48+
isSelected={
49+
isItemSelected && item[currentDepth] === selectedItem.leaf
50+
}
4351
/>
4452
)}
4553
{hasChild && (

packages/core/src/item/itemStyle.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,7 @@ export const css = props => ({
1818
});
1919

2020
export const forwardIconCss = () => ({});
21+
22+
export const selectedItem = props => ({
23+
fontWeight: props.isSelected ? 600 : 400
24+
});
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
export const initialCss = props => ({
2-
color: "#545769"
2+
color: "#545769",
3+
fontWeight: props.isSelected ? 600 : 400
34
});
45

5-
export const highlightCss = props => ({
6+
export const highlightCss = () => ({
67
fontWeight: 600,
7-
color: "#2020e1"
8+
color: "#268DEC"
89
});
910

10-
export const parentsCss = props => ({
11+
export const parentsCss = () => ({
1112
color: "#98A1B8",
1213
marginTop: "2px"
1314
});

packages/core/src/styles/styles.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ import {
33
wrapperCss as headerWrapperCss,
44
backIconCss as headerBackIconCss
55
} from "../header/headerStyle";
6-
import { css as itemCss, forwardIconCss } from "../item/itemStyle";
6+
import {
7+
css as itemCss,
8+
forwardIconCss,
9+
selectedItem as selectedItemCss
10+
} from "../item/itemStyle";
711
import {
812
highlightCss,
913
initialCss as searchItemInitialCss,
@@ -13,6 +17,7 @@ import itemsCss from "../items/itemsStyle";
1317
import {
1418
css as inputCss,
1519
searchIconCss as inputSearchIconCss,
20+
clearIconCss as clearSearchIconCss,
1621
wrapperCss as inputWrapperCss
1722
} from "../input/inputStyle";
1823
import {
@@ -35,7 +40,9 @@ export const defaultStyles = {
3540
noResultsText: noResultsTextCss,
3641
input: inputCss,
3742
searchInput: inputSearchIconCss,
43+
clearInput: clearSearchIconCss,
3844
forwardIcon: forwardIconCss,
45+
selectedItem: selectedItemCss,
3946
inputWrapper: inputWrapperCss
4047
};
4148

packages/core/src/tree.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ const Tree = props => {
3131
backIconRenderer,
3232
inputRenderer: Input = InputDefault,
3333
inputIconRenderer,
34+
clearIconRenderer,
3435
noResultsRenderer: NoResults = NoResultsDefault,
3536
noResultsIconRenderer,
3637
itemRenderer: Item = ItemDefault,
3738
itemsRenderer: Items = ItemsRenderer,
3839
forwardIconRenderer,
39-
treeContainerRenderer: TreeContainer = TreeContainerRenderer
40+
treeContainerRenderer: TreeContainer = TreeContainerRenderer,
41+
selectedItem
4042
} = props;
4143

4244
const getStyles = (key, props = {}) => {
@@ -53,9 +55,9 @@ const Tree = props => {
5355
itemsHeight
5456
} = useContainerHeight();
5557

56-
const { onClick, onBackClick, currentDepth, parents } = useItemCallbacks(
58+
const { onClick, onBackClick, currentDepth, parents } = useItemCallbacks({
5759
onSelect
58-
);
60+
});
5961

6062
const { searchTerm, onInputChange, leaves } = useLeavesManager({
6163
structure,
@@ -89,6 +91,7 @@ const Tree = props => {
8991
searchTerm={searchTerm}
9092
onInputChange={onInputChange}
9193
inputIconRenderer={inputIconRenderer}
94+
clearIconRenderer={clearIconRenderer}
9295
/>
9396
<Items styles={styles} getStyles={getStyles} height={itemsHeight}>
9497
{leaves &&
@@ -100,6 +103,7 @@ const Tree = props => {
100103
item={item}
101104
onClick={onClick}
102105
forwardIconRenderer={forwardIconRenderer}
106+
selectedItem={selectedItem}
103107
/>
104108
))}
105109
</Items>

packages/docs/stories/core.stories.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
CustomSearchIcon,
99
customStyles
1010
} from "./custom_renderers";
11+
import { MarkSelectedItemTree } from "./mark_selected_items_tree";
1112

1213
const useStyles = makeStyles({
1314
wrapper: {
@@ -90,6 +91,10 @@ export const Basic = () => {
9091
styles={customStyles}
9192
/>
9293
</div>
94+
<div className={classes.item}>
95+
<div className={classes.title}>Mark selected item</div>
96+
<MarkSelectedItemTree structure={structure} treeComponent={Tree} />
97+
</div>
9398
<div className={classes.item}>
9499
<div className={classes.title}>Custom Dimensions</div>
95100
<Tree
@@ -127,6 +132,13 @@ export const MaterialTheme = () => {
127132
inputIconRenderer={CustomSearchIcon}
128133
/>
129134
</div>
135+
<div className={classes.item}>
136+
<div className={classes.title}>Mark selected item</div>
137+
<MarkSelectedItemTree
138+
structure={structure}
139+
treeComponent={MaterialTree}
140+
/>
141+
</div>
130142
<div className={classes.item}>
131143
<div className={classes.title}>Custom Dimensions</div>
132144
<MaterialTree

0 commit comments

Comments
 (0)