@dhis2-ui/selector-bar 7.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/build/cjs/index.js +21 -0
- package/build/cjs/locales/en/translations.json +3 -0
- package/build/cjs/locales/index.js +27 -0
- package/build/cjs/selector-bar/__stories__/common.js +252 -0
- package/build/cjs/selector-bar/__stories__/keep-org-unit-expanded.js +71 -0
- package/build/cjs/selector-bar/__stories__/with-multiple-rows.js +108 -0
- package/build/cjs/selector-bar/__stories__/with-right-hand-side-content.js +79 -0
- package/build/cjs/selector-bar/__stories__/with-some-inputs.js +68 -0
- package/build/cjs/selector-bar/index.js +13 -0
- package/build/cjs/selector-bar/selector-bar.js +78 -0
- package/build/cjs/selector-bar/selector-bar.stories.js +43 -0
- package/build/cjs/selector-bar/selector-bar.test.js +78 -0
- package/build/cjs/selector-bar-item/features/toggle-children/index.js +24 -0
- package/build/cjs/selector-bar-item/features/toggle-children.feature +11 -0
- package/build/cjs/selector-bar-item/index.js +13 -0
- package/build/cjs/selector-bar-item/selector-bar-item.js +100 -0
- package/build/cjs/selector-bar-item/selector-bar-item.stories.e2e.js +98 -0
- package/build/es/index.js +2 -0
- package/build/es/locales/en/translations.json +3 -0
- package/build/es/locales/index.js +13 -0
- package/build/es/selector-bar/__stories__/common.js +213 -0
- package/build/es/selector-bar/__stories__/keep-org-unit-expanded.js +54 -0
- package/build/es/selector-bar/__stories__/with-multiple-rows.js +92 -0
- package/build/es/selector-bar/__stories__/with-right-hand-side-content.js +64 -0
- package/build/es/selector-bar/__stories__/with-some-inputs.js +54 -0
- package/build/es/selector-bar/index.js +1 -0
- package/build/es/selector-bar/selector-bar.js +60 -0
- package/build/es/selector-bar/selector-bar.stories.js +7 -0
- package/build/es/selector-bar/selector-bar.test.js +64 -0
- package/build/es/selector-bar-item/features/toggle-children/index.js +21 -0
- package/build/es/selector-bar-item/features/toggle-children.feature +11 -0
- package/build/es/selector-bar-item/index.js +1 -0
- package/build/es/selector-bar-item/selector-bar-item.js +77 -0
- package/build/es/selector-bar-item/selector-bar-item.stories.e2e.js +79 -0
- package/package.json +59 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import _JSXStyle from "styled-jsx/style";
|
|
2
|
+
import { Card } from '@dhis2-ui/card';
|
|
3
|
+
import { Layer } from '@dhis2-ui/layer';
|
|
4
|
+
import { Popper } from '@dhis2-ui/popper';
|
|
5
|
+
import { colors, spacers } from '@dhis2/ui-constants';
|
|
6
|
+
import { IconChevronUp24, IconChevronDown24 } from '@dhis2/ui-icons';
|
|
7
|
+
import PropTypes from 'prop-types';
|
|
8
|
+
import React, { useRef } from 'react';
|
|
9
|
+
const offsetModifier = {
|
|
10
|
+
name: 'offset',
|
|
11
|
+
options: {
|
|
12
|
+
offset: [0, 2]
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* The reason this component expects the "open" state and "setOpen" function is
|
|
17
|
+
* because certain actions inside the props.children might have to set "open"
|
|
18
|
+
* to false as well.
|
|
19
|
+
* A good example is selecting a value (which is not a click outside) and this
|
|
20
|
+
* component neither has any control over that component nor does it have a way
|
|
21
|
+
* to "observe" that behavior. Especially for selection bar items that allow
|
|
22
|
+
* "multiple" selections, this would be more or less impossible to predict
|
|
23
|
+
* inside this component
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
export const SelectorBarItem = ({
|
|
27
|
+
open,
|
|
28
|
+
setOpen,
|
|
29
|
+
children,
|
|
30
|
+
disabled,
|
|
31
|
+
label,
|
|
32
|
+
value,
|
|
33
|
+
noValueMessage
|
|
34
|
+
}) => {
|
|
35
|
+
const buttonRef = useRef();
|
|
36
|
+
const Icon = open ? IconChevronUp24 : IconChevronDown24;
|
|
37
|
+
return /*#__PURE__*/React.createElement("button", {
|
|
38
|
+
ref: buttonRef,
|
|
39
|
+
disabled: disabled,
|
|
40
|
+
onClick: () => setOpen(true),
|
|
41
|
+
className: _JSXStyle.dynamic([["3065814091", [
|
|
42
|
+
/*
|
|
43
|
+
* The arrow icon has ~4px empty space on the sides,
|
|
44
|
+
* that's why the padding on the right is only 8px.
|
|
45
|
+
*/
|
|
46
|
+
'', spacers.dp8, spacers.dp12, colors.grey400, colors.grey600, spacers.dp8, spacers.dp4]]]) + " " + "selector-bar-item"
|
|
47
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
48
|
+
className: _JSXStyle.dynamic([["3065814091", ['', spacers.dp8, spacers.dp12, colors.grey400, colors.grey600, spacers.dp8, spacers.dp4]]]) + " " + "label"
|
|
49
|
+
}, label), !disabled && /*#__PURE__*/React.createElement("span", {
|
|
50
|
+
className: _JSXStyle.dynamic([["3065814091", ['', spacers.dp8, spacers.dp12, colors.grey400, colors.grey600, spacers.dp8, spacers.dp4]]]) + " " + "value"
|
|
51
|
+
}, value || noValueMessage), /*#__PURE__*/React.createElement("span", {
|
|
52
|
+
className: _JSXStyle.dynamic([["3065814091", ['', spacers.dp8, spacers.dp12, colors.grey400, colors.grey600, spacers.dp8, spacers.dp4]]]) + " " + "toggle-icon"
|
|
53
|
+
}, /*#__PURE__*/React.createElement(Icon, {
|
|
54
|
+
className: _JSXStyle.dynamic([["3065814091", ['', spacers.dp8, spacers.dp12, colors.grey400, colors.grey600, spacers.dp8, spacers.dp4]]])
|
|
55
|
+
})), open && /*#__PURE__*/React.createElement(Layer, {
|
|
56
|
+
onClick: (_, evt) => {
|
|
57
|
+
evt.stopPropagation();
|
|
58
|
+
setOpen(false);
|
|
59
|
+
}
|
|
60
|
+
}, /*#__PURE__*/React.createElement(Popper, {
|
|
61
|
+
reference: buttonRef,
|
|
62
|
+
placement: "bottom-end",
|
|
63
|
+
modifiers: [offsetModifier]
|
|
64
|
+
}, /*#__PURE__*/React.createElement(Card, null, children))), /*#__PURE__*/React.createElement(_JSXStyle, {
|
|
65
|
+
id: "3065814091",
|
|
66
|
+
dynamic: ['', spacers.dp8, spacers.dp12, colors.grey400, colors.grey600, spacers.dp8, spacers.dp4]
|
|
67
|
+
}, [`.selector-bar-item.__jsx-style-dynamic-selector{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;cursor:pointer;background:none;height:40px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;${''} padding:0 ${spacers.dp8} 0 ${spacers.dp12};font-size:14px;line-height:16px;border:none;box-shadow:0px 0px 0px 1px ${colors.grey400};}`, ".selector-bar-item.__jsx-style-dynamic-selector:disabled{cursor:not-allowed;}", `.label.__jsx-style-dynamic-selector{color:${colors.grey600};}`, `.value.__jsx-style-dynamic-selector{padding-left:${spacers.dp8};}`, `.toggle-icon.__jsx-style-dynamic-selector{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:${spacers.dp4};height:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}`]));
|
|
68
|
+
};
|
|
69
|
+
SelectorBarItem.propTypes = {
|
|
70
|
+
children: PropTypes.any.isRequired,
|
|
71
|
+
label: PropTypes.string.isRequired,
|
|
72
|
+
noValueMessage: PropTypes.string.isRequired,
|
|
73
|
+
open: PropTypes.bool.isRequired,
|
|
74
|
+
setOpen: PropTypes.func.isRequired,
|
|
75
|
+
disabled: PropTypes.bool,
|
|
76
|
+
value: PropTypes.string
|
|
77
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { SingleSelectField, SingleSelectOption } from '@dhis2-ui/select';
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { SelectorBarItem } from './selector-bar-item.js';
|
|
4
|
+
const options = [{
|
|
5
|
+
value: 'value 1',
|
|
6
|
+
label: 'label 1'
|
|
7
|
+
}, {
|
|
8
|
+
value: 'value 2',
|
|
9
|
+
label: 'label 2'
|
|
10
|
+
}, {
|
|
11
|
+
value: 'value 3',
|
|
12
|
+
label: 'label 3'
|
|
13
|
+
}];
|
|
14
|
+
|
|
15
|
+
const createStateDecorator = args => {
|
|
16
|
+
return fn => {
|
|
17
|
+
const [selected, setSelected] = useState((args === null || args === void 0 ? void 0 : args.selected) || '');
|
|
18
|
+
const [open, setOpen] = useState((args === null || args === void 0 ? void 0 : args.open) || false);
|
|
19
|
+
return fn({
|
|
20
|
+
selected,
|
|
21
|
+
open,
|
|
22
|
+
setSelected,
|
|
23
|
+
setOpen
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const createStory = () => (_, {
|
|
29
|
+
open,
|
|
30
|
+
setOpen,
|
|
31
|
+
selected,
|
|
32
|
+
setSelected
|
|
33
|
+
}) => {
|
|
34
|
+
var _options$find;
|
|
35
|
+
|
|
36
|
+
return /*#__PURE__*/React.createElement(SelectorBarItem, {
|
|
37
|
+
label: "Selection bar item",
|
|
38
|
+
noValueMessage: "No value message",
|
|
39
|
+
open: open,
|
|
40
|
+
setOpen: setOpen,
|
|
41
|
+
value: ((_options$find = options.find(({
|
|
42
|
+
value
|
|
43
|
+
}) => value === selected)) === null || _options$find === void 0 ? void 0 : _options$find.label) || ''
|
|
44
|
+
}, /*#__PURE__*/React.createElement(SingleSelectField, {
|
|
45
|
+
selected: selected,
|
|
46
|
+
onChange: ({
|
|
47
|
+
selected: nextSelected
|
|
48
|
+
}) => {
|
|
49
|
+
setSelected(nextSelected);
|
|
50
|
+
setOpen(false);
|
|
51
|
+
}
|
|
52
|
+
}, options.map(({
|
|
53
|
+
value,
|
|
54
|
+
label
|
|
55
|
+
}) => /*#__PURE__*/React.createElement(SingleSelectOption, {
|
|
56
|
+
key: value,
|
|
57
|
+
value: value,
|
|
58
|
+
label: label
|
|
59
|
+
}))));
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export default {
|
|
63
|
+
title: 'SelectorBarItem'
|
|
64
|
+
};
|
|
65
|
+
export const ClosedNoValue = createStory();
|
|
66
|
+
ClosedNoValue.decorators = [createStateDecorator()];
|
|
67
|
+
export const OpenNoValue = createStory();
|
|
68
|
+
OpenNoValue.decorators = [createStateDecorator({
|
|
69
|
+
open: true
|
|
70
|
+
})];
|
|
71
|
+
export const ClosedWithValue = createStory();
|
|
72
|
+
ClosedWithValue.decorators = [createStateDecorator({
|
|
73
|
+
selected: 'value 1'
|
|
74
|
+
})];
|
|
75
|
+
export const OpenWithValue = createStory();
|
|
76
|
+
OpenWithValue.decorators = [createStateDecorator({
|
|
77
|
+
open: true,
|
|
78
|
+
selected: 'value 1'
|
|
79
|
+
})];
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dhis2-ui/selector-bar",
|
|
3
|
+
"version": "7.10.0",
|
|
4
|
+
"description": "UI Select",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/dhis2/ui.git",
|
|
8
|
+
"directory": "components/selector-bar"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/dhis2/ui#readme",
|
|
11
|
+
"license": "BSD-3-Clause",
|
|
12
|
+
"private": false,
|
|
13
|
+
"main": "./build/cjs/index.js",
|
|
14
|
+
"module": "./build/es/index.js",
|
|
15
|
+
"exports": {
|
|
16
|
+
"import": "./build/es/index.js",
|
|
17
|
+
"require": "./build/cjs/index.js"
|
|
18
|
+
},
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"start": "start-storybook -c ../../storybook/config --port 5000",
|
|
25
|
+
"build": "d2-app-scripts build",
|
|
26
|
+
"test": "d2-app-scripts test --jestConfig ../../jest.config.shared.js"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@dhis2/d2-i18n": "^1",
|
|
30
|
+
"react": "^16.8",
|
|
31
|
+
"react-dom": "^16.8",
|
|
32
|
+
"styled-jsx": "^4"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@dhis2-ui/button": "7.10.0",
|
|
36
|
+
"@dhis2-ui/card": "7.10.0",
|
|
37
|
+
"@dhis2-ui/popper": "7.10.0",
|
|
38
|
+
"@dhis2-ui/layer": "7.10.0",
|
|
39
|
+
"@dhis2/ui-constants": "7.10.0",
|
|
40
|
+
"@dhis2/ui-icons": "7.10.0",
|
|
41
|
+
"@testing-library/react": "^12.1.2",
|
|
42
|
+
"classnames": "^2.3.1",
|
|
43
|
+
"prop-types": "^15.7.2"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@dhis2-ui/css": "7.10.0",
|
|
47
|
+
"@dhis2-ui/menu": "7.10.0",
|
|
48
|
+
"@dhis2-ui/organisation-unit-tree": "7.10.0",
|
|
49
|
+
"@dhis2-ui/select": "7.10.0",
|
|
50
|
+
"@dhis2/d2-i18n": "^1.1.0",
|
|
51
|
+
"@testing-library/jest-dom": "^5.16.1",
|
|
52
|
+
"react": "16.13",
|
|
53
|
+
"react-dom": "16.13",
|
|
54
|
+
"styled-jsx": "^4.0.1"
|
|
55
|
+
},
|
|
56
|
+
"files": [
|
|
57
|
+
"build"
|
|
58
|
+
]
|
|
59
|
+
}
|