@junyiacademy/ui-test 0.0.8 → 0.0.12

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.
Files changed (38) hide show
  1. package/declarations/libs/ui/src/index.d.ts +8 -0
  2. package/declarations/libs/ui/src/interfaces/index.d.ts +26 -0
  3. package/declarations/libs/ui/src/lib/TopicFilter.d.ts +13 -0
  4. package/declarations/libs/ui/src/lib/button/Button.d.ts +6 -0
  5. package/declarations/libs/ui/src/lib/button-group/ButtonGroup.d.ts +3 -0
  6. package/declarations/libs/ui/src/lib/menu-item/SelectMenuItem.d.ts +9 -0
  7. package/declarations/libs/ui/src/lib/radio/Radio.d.ts +10 -0
  8. package/declarations/libs/ui/src/lib/select/OutlinedSelect.d.ts +3 -0
  9. package/declarations/libs/ui/src/lib/select/Select.d.ts +3 -0
  10. package/declarations/libs/ui/src/lib/select/StandardSelect.d.ts +3 -0
  11. package/declarations/libs/ui/src/lib/text-field/TextField.d.ts +3 -0
  12. package/declarations/libs/ui/src/lib/topic-filter/TopicFilter.d.ts +13 -0
  13. package/dist/libs/ui/src/index.js +22 -0
  14. package/dist/libs/ui/src/interfaces/index.js +2 -0
  15. package/dist/libs/ui/src/lib/TopicFilter.js +120 -0
  16. package/dist/libs/ui/src/lib/button/Button.js +71 -0
  17. package/dist/libs/ui/src/lib/button-group/ButtonGroup.js +33 -0
  18. package/dist/libs/ui/src/lib/menu-item/SelectMenuItem.js +27 -0
  19. package/dist/libs/ui/src/lib/radio/Radio.js +43 -0
  20. package/dist/libs/ui/src/lib/select/OutlinedSelect.js +124 -0
  21. package/dist/libs/ui/src/lib/select/Select.js +16 -0
  22. package/dist/libs/ui/src/lib/select/StandardSelect.js +103 -0
  23. package/dist/libs/ui/src/lib/text-field/TextField.js +75 -0
  24. package/dist/libs/ui/src/lib/topic-filter/TopicFilter.js +120 -0
  25. package/package.json +1 -1
  26. package/src/index.ts +1 -1
  27. package/src/interfaces/index.tsx +25 -0
  28. package/src/lib/select/OutlinedSelect.tsx +37 -44
  29. package/src/lib/select/Select.stories.tsx +421 -0
  30. package/src/lib/select/Select.tsx +13 -0
  31. package/src/lib/select/StandardSelect.tsx +24 -33
  32. package/src/lib/{TopicFilter.stories.tsx → topic-filter/TopicFilter.stories.tsx} +10 -7
  33. package/src/lib/{TopicFilter.tsx → topic-filter/TopicFilter.tsx} +5 -5
  34. package/src/lib/TopicFilter.spec.tsx +0 -10
  35. package/src/lib/menu-item/SelectMenuItem.spec.tsx +0 -10
  36. package/src/lib/select/OutlinedSelect.spec.tsx +0 -10
  37. package/src/lib/select/OutlinedSelect.stories.tsx +0 -245
  38. package/src/lib/select/StandardSelect.stories.tsx +0 -221
@@ -0,0 +1,8 @@
1
+ export { default as TopicFilter } from './lib/topic-filter/TopicFilter';
2
+ export { default as SelectMenuItem } from './lib/menu-item/SelectMenuItem';
3
+ export { default as OutlinedSelect } from './lib/select/OutlinedSelect';
4
+ export { default as Button } from './lib/button/Button';
5
+ export { default as ButtonGroup } from './lib/button-group/ButtonGroup';
6
+ export { default as Radio } from './lib/radio/Radio';
7
+ export { default as TextField } from './lib/text-field/TextField';
8
+ export { default as StandardSelect } from './lib/select/StandardSelect';
@@ -0,0 +1,26 @@
1
+ import { ChangeEvent } from 'react';
2
+ import { SelectProps as MuiSelectProp, InputProps as MuiInputProps, OutlinedInputProps } from '@material-ui/core';
3
+ export interface ITopicTreeNode {
4
+ childTopics: ITopicTreeNode[];
5
+ id: string;
6
+ isContentTopic: boolean;
7
+ key: string;
8
+ tags: string[];
9
+ title: string;
10
+ }
11
+ export interface SelectProps extends MuiSelectProp {
12
+ placeholder: string;
13
+ helperText?: string;
14
+ InputProps?: (Partial<OutlinedInputProps> & {
15
+ onChange: (e: ChangeEvent<HTMLInputElement>) => void;
16
+ }) | (object & Partial<MuiInputProps>);
17
+ SelectProps?: object | Partial<MuiSelectProp>;
18
+ color?: 'primary' | 'secondary';
19
+ size?: 'medium' | 'small';
20
+ width?: number | 'auto';
21
+ paperMaxHeight?: number | 'auto';
22
+ error?: boolean;
23
+ hasLabel?: boolean;
24
+ hasShrink?: boolean;
25
+ disabled?: boolean;
26
+ }
@@ -0,0 +1,13 @@
1
+ import type { ITopicTreeNode } from '../interfaces';
2
+ export interface TopicFilterProps {
3
+ topicTree: ITopicTreeNode;
4
+ onTopicSelected: (topic: ITopicTreeNode, selectedInfo: {
5
+ layerNumber: number;
6
+ selectedTopicIds: string[];
7
+ }) => void;
8
+ isLastLayer: (topic: ITopicTreeNode) => boolean;
9
+ hasArrow: boolean;
10
+ initSelectedTopicIds: string[];
11
+ }
12
+ export declare const TopicFilter: ({ topicTree, onTopicSelected, isLastLayer, hasArrow, initSelectedTopicIds, }: TopicFilterProps) => JSX.Element;
13
+ export default TopicFilter;
@@ -0,0 +1,6 @@
1
+ import { ButtonProps as MuiButtonProps } from '@material-ui/core';
2
+ export interface ButtonProps extends MuiButtonProps {
3
+ active?: boolean;
4
+ }
5
+ export declare const Button: ({ active, children, ...otherProps }: ButtonProps) => JSX.Element;
6
+ export default Button;
@@ -0,0 +1,3 @@
1
+ import { ButtonGroupProps as MuiButtonGroupProps } from '@material-ui/core';
2
+ export declare const ButtonGroup: ({ children, ...otherProps }: MuiButtonGroupProps) => JSX.Element;
3
+ export default ButtonGroup;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { MenuItemProps } from '@material-ui/core';
3
+ export interface SelectMenuItemProps extends MenuItemProps {
4
+ width: number | 'auto';
5
+ value?: any;
6
+ disabled?: boolean;
7
+ }
8
+ declare const SelectMenuItem: React.ForwardRefExoticComponent<Pick<React.PropsWithChildren<SelectMenuItemProps>, "classes" | "disabled" | "value" | "onChange" | "children" | "onKeyUp" | "onKeyDown" | "onBlur" | "onFocus" | "defaultValue" | "defaultChecked" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocusCapture" | "onBlurCapture" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "autoFocus" | "innerRef" | "button" | "width" | "alignItems" | "dense" | "key" | "selected" | "ContainerComponent" | "ContainerProps" | "disableGutters" | "divider" | "focusVisibleClassName"> & React.RefAttributes<HTMLLIElement>>;
9
+ export default SelectMenuItem;
@@ -0,0 +1,10 @@
1
+ import { RadioProps as MuiRadioProps, FormControlLabelProps } from '@material-ui/core';
2
+ export interface RadioProps extends FormControlLabelProps {
3
+ color?: 'primary' | 'secondary' | 'default';
4
+ size?: 'medium' | 'small';
5
+ caption?: string;
6
+ formControlLabelProps?: Partial<FormControlLabelProps>;
7
+ radioProps?: Partial<MuiRadioProps>;
8
+ }
9
+ export declare const Radio: ({ checked, disabled, label, labelPlacement, value, formControlLabelProps, radioProps, color, size, caption, }: RadioProps) => JSX.Element;
10
+ export default Radio;
@@ -0,0 +1,3 @@
1
+ import { SelectProps } from '../../interfaces';
2
+ export declare const OutlinedSelect: ({ placeholder, helperText, InputProps, SelectProps, children, color, size, width, paperMaxHeight, error, hasLabel, hasShrink, value, disabled, }: SelectProps) => JSX.Element;
3
+ export default OutlinedSelect;
@@ -0,0 +1,3 @@
1
+ import { SelectProps } from '../../interfaces';
2
+ export declare function Select({ variant, ...props }: SelectProps): JSX.Element;
3
+ export default Select;
@@ -0,0 +1,3 @@
1
+ import { SelectProps } from '../../interfaces';
2
+ export declare function StandardSelect({ placeholder, helperText, InputProps, SelectProps, children, color, size, width, paperMaxHeight, error, hasShrink, value, disabled, }: SelectProps): JSX.Element;
3
+ export default StandardSelect;
@@ -0,0 +1,3 @@
1
+ import { TextFieldProps } from '@material-ui/core';
2
+ export declare const TextField: (props: TextFieldProps) => JSX.Element;
3
+ export default TextField;
@@ -0,0 +1,13 @@
1
+ import type { ITopicTreeNode } from '../../interfaces';
2
+ export interface TopicFilterProps {
3
+ topicTree: ITopicTreeNode;
4
+ onTopicSelected: (topic: ITopicTreeNode, selectedInfo: {
5
+ layerNumber: number;
6
+ selectedTopicIds: string[];
7
+ }) => void;
8
+ isLastLayer: (topic: ITopicTreeNode) => boolean;
9
+ hasArrow: boolean;
10
+ initSelectedTopicIds: string[];
11
+ }
12
+ export declare const TopicFilter: ({ topicTree, onTopicSelected, isLastLayer, hasArrow, initSelectedTopicIds, }: TopicFilterProps) => JSX.Element;
13
+ export default TopicFilter;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StandardSelect = exports.TextField = exports.Radio = exports.ButtonGroup = exports.Button = exports.OutlinedSelect = exports.SelectMenuItem = exports.TopicFilter = void 0;
7
+ var TopicFilter_1 = require("./lib/topic-filter/TopicFilter");
8
+ Object.defineProperty(exports, "TopicFilter", { enumerable: true, get: function () { return __importDefault(TopicFilter_1).default; } });
9
+ var SelectMenuItem_1 = require("./lib/menu-item/SelectMenuItem");
10
+ Object.defineProperty(exports, "SelectMenuItem", { enumerable: true, get: function () { return __importDefault(SelectMenuItem_1).default; } });
11
+ var OutlinedSelect_1 = require("./lib/select/OutlinedSelect");
12
+ Object.defineProperty(exports, "OutlinedSelect", { enumerable: true, get: function () { return __importDefault(OutlinedSelect_1).default; } });
13
+ var Button_1 = require("./lib/button/Button");
14
+ Object.defineProperty(exports, "Button", { enumerable: true, get: function () { return __importDefault(Button_1).default; } });
15
+ var ButtonGroup_1 = require("./lib/button-group/ButtonGroup");
16
+ Object.defineProperty(exports, "ButtonGroup", { enumerable: true, get: function () { return __importDefault(ButtonGroup_1).default; } });
17
+ var Radio_1 = require("./lib/radio/Radio");
18
+ Object.defineProperty(exports, "Radio", { enumerable: true, get: function () { return __importDefault(Radio_1).default; } });
19
+ var TextField_1 = require("./lib/text-field/TextField");
20
+ Object.defineProperty(exports, "TextField", { enumerable: true, get: function () { return __importDefault(TextField_1).default; } });
21
+ var StandardSelect_1 = require("./lib/select/StandardSelect");
22
+ Object.defineProperty(exports, "StandardSelect", { enumerable: true, get: function () { return __importDefault(StandardSelect_1).default; } });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TopicFilter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importStar(require("react"));
6
+ const styles_1 = require("@material-ui/core/styles");
7
+ const ArrowRightRounded_1 = tslib_1.__importDefault(require("@material-ui/icons/ArrowRightRounded"));
8
+ const OutlinedSelect_1 = tslib_1.__importDefault(require("./select/OutlinedSelect"));
9
+ const SelectMenuItem_1 = tslib_1.__importDefault(require("./menu-item/SelectMenuItem"));
10
+ // self-defined-configs
11
+ const PLACEHOLDER = '請選擇';
12
+ // self-defined-components
13
+ const PREFIX = 'JuiTopicFilter';
14
+ const FiltersWrapper = styles_1.styled('div')({
15
+ display: 'flex',
16
+ alignItems: 'center',
17
+ flexWrap: 'wrap',
18
+ });
19
+ const SelectWrapper = styles_1.styled('div')({
20
+ display: 'flex',
21
+ alignItems: 'center',
22
+ });
23
+ const StyledArrowRightRoundedIcon = styles_1.styled(ArrowRightRounded_1.default)(({ theme }) => ({
24
+ margin: theme.spacing(-1, -1.5),
25
+ fontSize: theme.spacing(7),
26
+ color: '#444',
27
+ }));
28
+ const TopicFilter = ({ topicTree, onTopicSelected, isLastLayer, hasArrow, initSelectedTopicIds, }) => {
29
+ const [selectedTopicIds, setSelectedTopicIds] = react_1.useState([]);
30
+ const [layeredTopicList, setLayeredTopicList] = react_1.useState([]);
31
+ const [isFocusedList, setIsFocusedList] = react_1.useState([]);
32
+ const initSelectedLayers = () => {
33
+ const newLayeredTopicList = initSelectedTopicIds.reduce((topicListAccumulator, topicId, index) => {
34
+ var _a, _b;
35
+ const selectedTopic = (_b = (_a = topicListAccumulator[index]) === null || _a === void 0 ? void 0 : _a.childTopics) === null || _b === void 0 ? void 0 : _b.find((childTopic) => childTopic.id === topicId);
36
+ if (!selectedTopic) {
37
+ return topicListAccumulator;
38
+ }
39
+ if (isLastLayer(selectedTopic)) {
40
+ return topicListAccumulator;
41
+ }
42
+ return [...topicListAccumulator, selectedTopic];
43
+ }, [topicTree]);
44
+ setLayeredTopicList(newLayeredTopicList);
45
+ setSelectedTopicIds(initSelectedTopicIds.slice(0, newLayeredTopicList.length));
46
+ setIsFocusedList(Array(newLayeredTopicList.length).fill(false));
47
+ };
48
+ const handleChange = (e, layerNumber, layeredTopic) => {
49
+ const selectedTopic = layeredTopic.childTopics.find((childTopic) => childTopic.id === e.target.value);
50
+ const newSelectedTopicIds = [
51
+ ...selectedTopicIds.slice(0, layerNumber),
52
+ selectedTopic.id,
53
+ ];
54
+ setSelectedTopicIds(newSelectedTopicIds);
55
+ onTopicSelected(selectedTopic, {
56
+ layerNumber,
57
+ selectedTopicIds: newSelectedTopicIds,
58
+ });
59
+ if (isLastLayer(selectedTopic)) {
60
+ setLayeredTopicList((prevTopicList) => prevTopicList.slice(0, layerNumber + 1));
61
+ setIsFocusedList((prevList) => prevList.slice(0, layerNumber + 1));
62
+ }
63
+ else {
64
+ setLayeredTopicList((prevTopicList) => [
65
+ ...prevTopicList.slice(0, layerNumber + 1),
66
+ selectedTopic,
67
+ ]);
68
+ setIsFocusedList((prevList) => [
69
+ ...prevList.slice(0, layerNumber + 1),
70
+ false,
71
+ ]);
72
+ }
73
+ };
74
+ react_1.useEffect(() => {
75
+ if (!topicTree || Object.keys(topicTree).length === 0) {
76
+ return;
77
+ }
78
+ if (initSelectedTopicIds.length !== 0) {
79
+ initSelectedLayers();
80
+ return;
81
+ }
82
+ setLayeredTopicList([topicTree]);
83
+ }, [topicTree]);
84
+ if (layeredTopicList.length === 0) {
85
+ return (react_1.default.createElement(OutlinedSelect_1.default, { size: 'small', width: 220, placeholder: '\u8F09\u5165\u8CC7\u6599\u4E2D...', disabled: true }));
86
+ }
87
+ return (react_1.default.createElement(FiltersWrapper, null, layeredTopicList.map((layeredTopic, layerNumber) => {
88
+ const hasLabel = isFocusedList[layerNumber] || !selectedTopicIds[layerNumber];
89
+ return (react_1.default.createElement(SelectWrapper, { key: layeredTopic.id },
90
+ react_1.default.createElement(OutlinedSelect_1.default, { size: 'small', width: 220, paperMaxHeight: 412, hasLabel: hasLabel, placeholder: PLACEHOLDER, value: (selectedTopicIds === null || selectedTopicIds === void 0 ? void 0 : selectedTopicIds[layerNumber]) || '', SelectProps: {
91
+ 'data-testid': `layered-topic-${layerNumber}`,
92
+ }, OutlinedInputProps: {
93
+ inputProps: {
94
+ 'aria-label': `layered-topic-${layerNumber}`,
95
+ },
96
+ onChange: (e) => {
97
+ handleChange(e, layerNumber, layeredTopic);
98
+ },
99
+ onFocus: () => {
100
+ setIsFocusedList((prevList) => {
101
+ const newList = [...prevList];
102
+ newList[layerNumber] = true;
103
+ return newList;
104
+ });
105
+ },
106
+ onBlur: () => {
107
+ setIsFocusedList((prevList) => {
108
+ const newList = [...prevList];
109
+ newList[layerNumber] = false;
110
+ return newList;
111
+ });
112
+ },
113
+ } },
114
+ react_1.default.createElement(SelectMenuItem_1.default, { width: 220, disabled: true }, PLACEHOLDER),
115
+ layeredTopic.childTopics.map((childTopic) => (react_1.default.createElement(SelectMenuItem_1.default, { width: 220, key: childTopic.id, value: childTopic.id, "data-testid": `layered-menuitem-${layerNumber}`, "data-is-content-topic": childTopic.isContentTopic }, childTopic.title)))),
116
+ hasArrow && layerNumber !== layeredTopicList.length - 1 && (react_1.default.createElement(StyledArrowRightRoundedIcon, { fontSize: 'large', "data-testid": 'topic-filter-arrow' }))));
117
+ })));
118
+ };
119
+ exports.TopicFilter = TopicFilter;
120
+ exports.default = exports.TopicFilter;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Button = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const styles_1 = require("@material-ui/core/styles");
7
+ const core_1 = require("@material-ui/core");
8
+ // self-defined-components
9
+ const PREFIX = 'JuiButton';
10
+ const classes = {
11
+ outlinedPrimary: `${PREFIX}-outlinedPrimary`,
12
+ outlinedSecondary: `${PREFIX}-outlinedSecondary`,
13
+ textPrimary: `${PREFIX}-textPrimary`,
14
+ textSecondary: `${PREFIX}-textSecondary`,
15
+ disabled: `${PREFIX}-disabled`,
16
+ };
17
+ const StyledButton = styles_1.styled((_a) => {
18
+ var { active: _active } = _a, other = tslib_1.__rest(_a, ["active"]);
19
+ return (react_1.default.createElement(core_1.Button, Object.assign({ classes: classes }, other)));
20
+ })(({ active, theme }) => ({
21
+ [`&.${classes.outlinedPrimary}`]: {
22
+ backgroundColor: active
23
+ ? theme.palette.primary.main
24
+ : theme.palette.common.white,
25
+ color: active ? theme.palette.common.white : theme.palette.primary.main,
26
+ borderColor: theme.palette.primary.main,
27
+ '&:hover': {
28
+ backgroundColor: active
29
+ ? theme.palette.primary.main
30
+ : styles_1.fade(theme.palette.primary.main, 0.1),
31
+ },
32
+ [`&.${classes.disabled}`]: {
33
+ backgroundColor: theme.palette.common.white,
34
+ borderColor: theme.palette.action.disabledBackground,
35
+ color: theme.palette.action.disabled,
36
+ },
37
+ },
38
+ [`&.${classes.outlinedSecondary}`]: {
39
+ backgroundColor: active
40
+ ? theme.palette.secondary.main
41
+ : theme.palette.common.white,
42
+ color: active ? theme.palette.common.white : theme.palette.secondary.main,
43
+ borderColor: theme.palette.secondary.main,
44
+ '&:hover': {
45
+ backgroundColor: active
46
+ ? theme.palette.secondary.main
47
+ : styles_1.fade(theme.palette.secondary.main, 0.1),
48
+ },
49
+ [`&.${classes.disabled}`]: {
50
+ backgroundColor: theme.palette.common.white,
51
+ borderColor: theme.palette.action.disabledBackground,
52
+ color: theme.palette.action.disabled,
53
+ },
54
+ },
55
+ [`&.${classes.textPrimary}`]: {
56
+ '&:hover': {
57
+ backgroundColor: styles_1.fade(theme.palette.primary.main, 0.1),
58
+ },
59
+ },
60
+ [`&.${classes.textSecondary}`]: {
61
+ '&:hover': {
62
+ backgroundColor: styles_1.fade(theme.palette.secondary.main, 0.1),
63
+ },
64
+ },
65
+ }));
66
+ const Button = (_a) => {
67
+ var { active, children } = _a, otherProps = tslib_1.__rest(_a, ["active", "children"]);
68
+ return (react_1.default.createElement(StyledButton, Object.assign({ active: active }, otherProps), children));
69
+ };
70
+ exports.Button = Button;
71
+ exports.default = exports.Button;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ButtonGroup = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const styles_1 = require("@material-ui/core/styles");
7
+ const core_1 = require("@material-ui/core");
8
+ const PREFIX = 'JuiButtonGroup';
9
+ const classes = {
10
+ grouped: `${PREFIX}-grouped`,
11
+ groupedOutlinedPrimary: `${PREFIX}-groupedOutlinedPrimary`,
12
+ groupedOutlinedSecondary: `${PREFIX}-groupedOutlinedSecondary`,
13
+ disabled: `${PREFIX}-disabled`,
14
+ };
15
+ const StyledButtonGroup = styles_1.styled((_a) => {
16
+ var props = tslib_1.__rest(_a, []);
17
+ return (react_1.default.createElement(core_1.ButtonGroup, Object.assign({ classes: classes }, props)));
18
+ })(({ theme }) => ({
19
+ [`& .${classes.groupedOutlinedPrimary}.${classes.grouped}.${classes.disabled}`]: {
20
+ borderColor: styles_1.fade(theme.palette.primary.main, 0.5),
21
+ color: styles_1.fade(theme.palette.primary.main, 0.5),
22
+ },
23
+ [`& .${classes.groupedOutlinedSecondary}.${classes.grouped}.${classes.disabled}`]: {
24
+ borderColor: styles_1.fade(theme.palette.secondary.main, 0.5),
25
+ color: styles_1.fade(theme.palette.secondary.main, 0.5),
26
+ },
27
+ }));
28
+ const ButtonGroup = (_a) => {
29
+ var { children } = _a, otherProps = tslib_1.__rest(_a, ["children"]);
30
+ return (react_1.default.createElement(StyledButtonGroup, Object.assign({}, otherProps), children));
31
+ };
32
+ exports.ButtonGroup = ButtonGroup;
33
+ exports.default = exports.ButtonGroup;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const react_1 = tslib_1.__importDefault(require("react"));
5
+ const styles_1 = require("@material-ui/core/styles");
6
+ const core_1 = require("@material-ui/core");
7
+ // self-defined-components
8
+ const PREFIX = 'JuiSelectMenuItem';
9
+ const classes = {
10
+ menuItemSelected: `${PREFIX}-menuItemSelected`,
11
+ };
12
+ const StyledMenuItem = styles_1.styled((_a) => {
13
+ var { width: _width } = _a, props = tslib_1.__rest(_a, ["width"]);
14
+ return (react_1.default.createElement(core_1.MenuItem, Object.assign({ classes: { selected: classes.menuItemSelected } }, props)));
15
+ })(({ width, theme }) => ({
16
+ width: width,
17
+ whiteSpace: 'unset',
18
+ color: theme.palette.text.primary,
19
+ [`& .${classes.menuItemSelected}`]: {
20
+ backgroundColor: theme.palette.grey[300],
21
+ },
22
+ }));
23
+ const SelectMenuItem = react_1.default.forwardRef((_a, ref) => {
24
+ var { width, children, value = '' } = _a, otherProps = tslib_1.__rest(_a, ["width", "children", "value"]);
25
+ return (react_1.default.createElement(StyledMenuItem, Object.assign({ width: width, innerRef: ref, value: value }, otherProps), children));
26
+ });
27
+ exports.default = SelectMenuItem;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Radio = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const styles_1 = require("@material-ui/core/styles");
7
+ const core_1 = require("@material-ui/core");
8
+ const PREFIX = 'JuiRadio';
9
+ const classes = {
10
+ formControlLabel: `${PREFIX}-formControl-label`,
11
+ formControlDisabled: `${PREFIX}-formControl-disabled`,
12
+ radioChecked: `${PREFIX}-radio-checked`,
13
+ };
14
+ const StyledFormControlLabel = styles_1.styled((props) => (react_1.default.createElement(core_1.FormControlLabel, Object.assign({ classes: {
15
+ label: classes.formControlLabel,
16
+ disabled: classes.formControlDisabled,
17
+ } }, props))))(({ theme }) => ({
18
+ [`& .${classes.formControlLabel}`]: {
19
+ color: theme.palette.text.secondary,
20
+ [`&.${classes.formControlDisabled}`]: {
21
+ color: theme.palette.text.disabled,
22
+ },
23
+ },
24
+ [`& .${classes.radioChecked} + .${classes.formControlLabel}`]: {
25
+ color: theme.palette.text.primary,
26
+ },
27
+ }));
28
+ const StyledRadio = styles_1.styled((props) => (react_1.default.createElement(core_1.Radio, Object.assign({ classes: {
29
+ checked: classes.radioChecked,
30
+ } }, props))))(({ theme }) => ({
31
+ color: theme.palette.text.primary,
32
+ }));
33
+ const StyledTypography = styles_1.styled(core_1.Typography)(({ theme }) => ({
34
+ color: theme.palette.text.disabled,
35
+ margin: '0 0 0 30px',
36
+ }));
37
+ const Radio = ({ checked, disabled, label, labelPlacement, value, formControlLabelProps, radioProps, color = 'secondary', size = 'medium', caption = '', }) => {
38
+ return (react_1.default.createElement(react_1.default.Fragment, null,
39
+ react_1.default.createElement(StyledFormControlLabel, Object.assign({ control: react_1.default.createElement(StyledRadio, Object.assign({ color: color, size: size }, radioProps)), checked: checked, disabled: disabled, label: label, labelPlacement: labelPlacement, value: value }, formControlLabelProps)),
40
+ caption && (react_1.default.createElement(StyledTypography, { variant: 'body2' }, caption))));
41
+ };
42
+ exports.Radio = Radio;
43
+ exports.default = exports.Radio;
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OutlinedSelect = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const styles_1 = require("@material-ui/core/styles");
7
+ const core_1 = require("@material-ui/core");
8
+ // self-defined-components
9
+ const PREFIX = 'JuiOutlinedSelect';
10
+ const classes = {
11
+ inputLabelFocused: `${PREFIX}-inputLabelFocused`,
12
+ inputLabelOutlined: `${PREFIX}-inputLabelOutlined`,
13
+ inputLabelMarginDense: `${PREFIX}-inputLabelMarginDense`,
14
+ inputLabelShrink: `${PREFIX}-inputLabelShrink`,
15
+ inputLabelError: `${PREFIX}-inputLabelError`,
16
+ inputLabelDisabled: `${PREFIX}-inputLabelDisabled`,
17
+ outlineInputInput: `${PREFIX}-input`,
18
+ outlineInputRoot: `${PREFIX}-inputRoot`,
19
+ outlineInputInputMarginDense: `${PREFIX}-inputMarginDense`,
20
+ outlineInputNotchedOutline: `${PREFIX}-notchedOutline`,
21
+ outlineInputDisabled: `${PREFIX}-inputDisabled`,
22
+ outlineInputError: `${PREFIX}-outlinedInputError`,
23
+ outlineInputFocused: `${PREFIX}-focused`,
24
+ selectPaper: `${PREFIX}-menuPaper`,
25
+ };
26
+ const StyledFormControl = styles_1.styled((_a) => {
27
+ var { color: _color, width: _width } = _a, props = tslib_1.__rest(_a, ["color", "width"]);
28
+ return react_1.default.createElement(core_1.FormControl, Object.assign({}, props));
29
+ })(({ color, width, theme }) => ({
30
+ margin: theme.spacing(1),
31
+ width: width,
32
+ backgroundColor: 'white',
33
+ '&:hover': {
34
+ [`& :not(.${classes.outlineInputDisabled}):not(.${classes.outlineInputError}) .${classes.outlineInputNotchedOutline}`]: {
35
+ borderColor: theme.palette[color].main,
36
+ },
37
+ },
38
+ [`& .${classes.outlineInputError}.${classes.outlineInputFocused} .${classes.outlineInputNotchedOutline}`]: {
39
+ borderColor: `${theme.palette.error.main}`,
40
+ },
41
+ }));
42
+ const StyledInputLabel = styles_1.styled((_a) => {
43
+ var { color: _color } = _a, props = tslib_1.__rest(_a, ["color"]);
44
+ return (react_1.default.createElement(core_1.InputLabel, Object.assign({ classes: {
45
+ outlined: classes.inputLabelOutlined,
46
+ marginDense: classes.inputLabelMarginDense,
47
+ shrink: classes.inputLabelShrink,
48
+ focused: classes.inputLabelFocused,
49
+ disabled: classes.inputLabelDisabled,
50
+ error: classes.inputLabelError,
51
+ } }, props)));
52
+ })(({ color, theme }) => ({
53
+ color: theme.palette.text.secondary,
54
+ [`&.${classes.inputLabelOutlined}`]: {
55
+ [`&:not(.${classes.inputLabelDisabled}) .${classes.inputLabelFocused}`]: {
56
+ color: theme.palette.action.active,
57
+ },
58
+ [`&.${classes.inputLabelMarginDense}:not(.${classes.inputLabelShrink})`]: {
59
+ transform: 'translate(12px, 16px) scale(1)',
60
+ },
61
+ },
62
+ [`&.${classes.inputLabelShrink}:not(.${classes.inputLabelError}):not(.${classes.inputLabelDisabled}).${classes.inputLabelFocused}`]: {
63
+ color: theme.palette[color].main,
64
+ },
65
+ [`&.${classes.inputLabelShrink}`]: {
66
+ backgroundColor: '#ffffff',
67
+ padding: '0 2px',
68
+ },
69
+ }));
70
+ const StyledOutlinedInput = styles_1.styled((props) => (react_1.default.createElement(core_1.OutlinedInput, Object.assign({ classes: {
71
+ root: classes.outlineInputRoot,
72
+ focused: classes.outlineInputFocused,
73
+ input: classes.outlineInputInput,
74
+ inputMarginDense: classes.outlineInputInputMarginDense,
75
+ notchedOutline: classes.outlineInputNotchedOutline,
76
+ disabled: classes.outlineInputDisabled,
77
+ error: classes.outlineInputError,
78
+ } }, props))))(({ theme }) => ({
79
+ [`&.${classes.outlineInputRoot}.${classes.outlineInputFocused}`]: {
80
+ backgroundColor: theme.palette.action.selected,
81
+ },
82
+ [`& .${classes.outlineInputInput}`]: {
83
+ color: theme.palette.text.primary,
84
+ ['&:focus']: {
85
+ background: 'rgba(0,0,0,0)',
86
+ },
87
+ },
88
+ [`& .${classes.outlineInputInputMarginDense}`]: {
89
+ padding: '14.5px 15px 14.5px 12px',
90
+ },
91
+ }));
92
+ const StyledSelect = styles_1.styled((_a) => {
93
+ var { paperMaxHeight: _paperMaxHeight, hasAdornment: _hasAdornment, className } = _a, props = tslib_1.__rest(_a, ["paperMaxHeight", "hasAdornment", "className"]);
94
+ return (react_1.default.createElement(core_1.Select, Object.assign({ MenuProps: {
95
+ disableAutoFocusItem: true,
96
+ anchorOrigin: {
97
+ vertical: 2,
98
+ horizontal: 'left',
99
+ },
100
+ transformOrigin: {
101
+ vertical: 'top',
102
+ horizontal: 'left',
103
+ },
104
+ getContentAnchorEl: null,
105
+ classes: {
106
+ paper: className,
107
+ },
108
+ } }, props)));
109
+ })(({ hasAdornment, paperMaxHeight }) => ({
110
+ '&': {
111
+ maxHeight: paperMaxHeight,
112
+ left: hasAdornment ? '24px !important' : '70px',
113
+ },
114
+ }));
115
+ const OutlinedSelect = ({ placeholder, helperText, InputProps, SelectProps, children, color = 'primary', size = 'medium', width = 'auto', paperMaxHeight = 'auto', error = false, hasLabel = true, hasShrink = false, value = '', disabled = false, }) => {
116
+ const hasAdornment = !!(InputProps === null || InputProps === void 0 ? void 0 : InputProps.startAdornment);
117
+ const hasHelperText = !!helperText;
118
+ return (react_1.default.createElement(StyledFormControl, { size: size, width: width, disabled: disabled, error: error, color: color },
119
+ hasLabel && (react_1.default.createElement(StyledInputLabel, { color: color, variant: 'outlined', shrink: hasShrink ? true : undefined }, placeholder)),
120
+ react_1.default.createElement(StyledSelect, Object.assign({ value: value, paperMaxHeight: paperMaxHeight, hasAdornment: hasAdornment, input: react_1.default.createElement(StyledOutlinedInput, Object.assign({ color: color, label: hasLabel ? placeholder : undefined, disabled: disabled }, InputProps)) }, SelectProps), children),
121
+ hasHelperText && react_1.default.createElement(core_1.FormHelperText, null, helperText)));
122
+ };
123
+ exports.OutlinedSelect = OutlinedSelect;
124
+ exports.default = exports.OutlinedSelect;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Select = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const OutlinedSelect_1 = require("./OutlinedSelect");
7
+ const StandardSelect_1 = require("./StandardSelect");
8
+ function Select(_a) {
9
+ var { variant } = _a, props = tslib_1.__rest(_a, ["variant"]);
10
+ if (variant === 'outlined') {
11
+ return react_1.default.createElement(OutlinedSelect_1.OutlinedSelect, Object.assign({}, props));
12
+ }
13
+ return react_1.default.createElement(StandardSelect_1.StandardSelect, Object.assign({}, props));
14
+ }
15
+ exports.Select = Select;
16
+ exports.default = Select;