57 | {title ?
{title} : null}
58 | {options.map((option, i) => (
59 |
60 |
66 |
69 |
70 | ))}
71 | {selectButtons ? (
72 |
73 |
76 |
77 |
80 |
81 | ) : null}
82 |
83 | );
84 | }
85 | }
86 |
87 | CheckboxGroup.propTypes = {
88 | options: PropTypes.arrayOf(
89 | PropTypes.shape({
90 | label: PropTypes.string,
91 | id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
92 | checked: PropTypes.bool
93 | })
94 | ).isRequired,
95 | /**
96 | * This function will receive an object with all checkbox values.
97 | */
98 | onChange: PropTypes.func.isRequired,
99 | orientation: PropTypes.oneOf(["vertical", "horizontal"]),
100 | /**
101 | * If true, adds buttons that let the user select and deselect all checkboxes at once.
102 | */
103 | selectButtons: PropTypes.bool,
104 | style: PropTypes.object,
105 | title: PropTypes.string
106 | };
107 |
108 | CheckboxGroup.defaultProps = {
109 | orientation: "vertical",
110 | selectButtons: false
111 | };
112 |
113 | export default CheckboxGroup;
114 |
--------------------------------------------------------------------------------
/packages/components/src/Search/README.md:
--------------------------------------------------------------------------------
1 | # Search
2 |
3 | A simple search box with sensible styles.
4 |
5 | ### Usage
6 |
7 | ```js
8 | import { Search } from "./components/Search";
9 | ```
10 |
11 | ### Properties
12 |
13 | - `onChange` - A function that will be passed the search input value whenever the value changes.
14 | - `placeholder` - The placeholder text for the inside of the search box.
15 | - `className` - Any additional classes to be passed to the search box.
16 | - `style` - Any additional styles to be passed to the search box.
17 |
18 | | propName | propType | defaultValue | isRequired |
19 | |-------------|----------|--------------|------------|
20 | | onChange | func | - | + |
21 | | placeholder | string | "Search..." | - |
22 | | className | string | - | - |
23 | | style | object | - | - |
24 |
--------------------------------------------------------------------------------
/packages/components/src/Search/Search.scss:
--------------------------------------------------------------------------------
1 | .dv-search {
2 | width: 16rem;
3 | padding: 0.5rem 0.5rem 0.5rem 2rem;
4 | margin: 1rem 0;
5 | font-size: 1rem;
6 | color: #111;
7 | background-color: #fff;
8 | background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgaGVpZ2h0PSIzMnB4IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzMiAzMiIgd2lkdGg9IjMycHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48dGl0bGUvPjxkZXNjLz48ZGVmcy8+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSI+PGcgZmlsbD0iIzkyOTI5MiIgaWQ9Imljb24tMTExLXNlYXJjaCI+PHBhdGggZD0iTTE5LjQyNzExNjQsMjEuNDI3MTE2NCBDMTguMDM3MjQ5NSwyMi40MTc0ODAzIDE2LjMzNjY1MjIsMjMgMTQuNSwyMyBDOS44MDU1NzkzOSwyMyA2LDE5LjE5NDQyMDYgNiwxNC41IEM2LDkuODA1NTc5MzkgOS44MDU1NzkzOSw2IDE0LjUsNiBDMTkuMTk0NDIwNiw2IDIzLDkuODA1NTc5MzkgMjMsMTQuNSBDMjMsMTYuMzM2NjUyMiAyMi40MTc0ODAzLDE4LjAzNzI0OTUgMjEuNDI3MTE2NCwxOS40MjcxMTY0IEwyNy4wMTE5MTc2LDI1LjAxMTkxNzYgQzI3LjU2MjExODYsMjUuNTYyMTE4NiAyNy41NTc1MzEzLDI2LjQ0MjQ2ODcgMjcuMDExNzE4NSwyNi45ODgyODE1IEwyNi45ODgyODE1LDI3LjAxMTcxODUgQzI2LjQ0Mzg2NDgsMjcuNTU2MTM1MiAyNS41NTc2MjA0LDI3LjU1NzYyMDQgMjUuMDExOTE3NiwyNy4wMTE5MTc2IEwxOS40MjcxMTY0LDIxLjQyNzExNjQgTDE5LjQyNzExNjQsMjEuNDI3MTE2NCBaIE0xNC41LDIxIEMxOC4wODk4NTExLDIxIDIxLDE4LjA4OTg1MTEgMjEsMTQuNSBDMjEsMTAuOTEwMTQ4OSAxOC4wODk4NTExLDggMTQuNSw4IEMxMC45MTAxNDg5LDggOCwxMC45MTAxNDg5IDgsMTQuNSBDOCwxOC4wODk4NTExIDEwLjkxMDE0ODksMjEgMTQuNSwyMSBMMTQuNSwyMSBaIiBpZD0ic2VhcmNoIi8+PC9nPjwvZz48L3N2Zz4=);
9 | background-size: 1.5rem;
10 | background-repeat: no-repeat;
11 | background-position-y: center;
12 | background-position-x: 0.25rem;
13 | outline: 0;
14 | border: 1px solid #d4d4d4;
15 | }
--------------------------------------------------------------------------------
/packages/components/src/Search/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import "./Search.scss";
4 |
5 | class Search extends React.Component {
6 | constructor(props) {
7 | super(props);
8 | this.state = {
9 | search: ""
10 | };
11 | }
12 |
13 | updateSearch(e) {
14 | this.setState({ search: e.target.value }, () =>
15 | this.props.onChange(this.state.search)
16 | );
17 | }
18 |
19 | render() {
20 | const { placeholder, className, style } = this.props;
21 | return (
22 |