@hitachivantara/uikit-react-core 5.50.1 → 5.52.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/dist/cjs/DropDownMenu/DropDownMenu.cjs +1 -1
- package/dist/cjs/FilterGroup/Counter/Counter.cjs.map +1 -1
- package/dist/cjs/FilterGroup/FilterContent/FilterContent.cjs.map +1 -1
- package/dist/cjs/FilterGroup/FilterGroup.cjs.map +1 -1
- package/dist/cjs/FilterGroup/FilterGroupContext.cjs.map +1 -1
- package/dist/cjs/FilterGroup/LeftPanel/LeftPanel.cjs.map +1 -1
- package/dist/cjs/FilterGroup/RightPanel/RightPanel.cjs +22 -15
- package/dist/cjs/FilterGroup/RightPanel/RightPanel.cjs.map +1 -1
- package/dist/cjs/Select/Option.cjs +53 -0
- package/dist/cjs/Select/Option.cjs.map +1 -0
- package/dist/cjs/Select/OptionGroup.cjs +34 -0
- package/dist/cjs/Select/OptionGroup.cjs.map +1 -0
- package/dist/cjs/Select/Select.cjs +214 -0
- package/dist/cjs/Select/Select.cjs.map +1 -0
- package/dist/cjs/Select/Select.styles.cjs +44 -0
- package/dist/cjs/Select/Select.styles.cjs.map +1 -0
- package/dist/cjs/Select/SelectButton.cjs +92 -0
- package/dist/cjs/Select/SelectButton.cjs.map +1 -0
- package/dist/cjs/index.cjs +10 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/DropDownMenu/DropDownMenu.js +1 -1
- package/dist/esm/FilterGroup/Counter/Counter.js.map +1 -1
- package/dist/esm/FilterGroup/FilterContent/FilterContent.js.map +1 -1
- package/dist/esm/FilterGroup/FilterGroup.js.map +1 -1
- package/dist/esm/FilterGroup/FilterGroupContext.js.map +1 -1
- package/dist/esm/FilterGroup/LeftPanel/LeftPanel.js.map +1 -1
- package/dist/esm/FilterGroup/RightPanel/RightPanel.js +22 -15
- package/dist/esm/FilterGroup/RightPanel/RightPanel.js.map +1 -1
- package/dist/esm/Select/Option.js +53 -0
- package/dist/esm/Select/Option.js.map +1 -0
- package/dist/esm/Select/OptionGroup.js +34 -0
- package/dist/esm/Select/OptionGroup.js.map +1 -0
- package/dist/esm/Select/Select.js +213 -0
- package/dist/esm/Select/Select.js.map +1 -0
- package/dist/esm/Select/Select.styles.js +44 -0
- package/dist/esm/Select/Select.styles.js.map +1 -0
- package/dist/esm/Select/SelectButton.js +92 -0
- package/dist/esm/Select/SelectButton.js.map +1 -0
- package/dist/esm/index.js +224 -214
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts +564 -450
- package/package.json +6 -6
|
@@ -27,17 +27,20 @@ const HvFilterGroupRightPanel = ({
|
|
|
27
27
|
setFilterValues,
|
|
28
28
|
activeGroup
|
|
29
29
|
} = useContext(HvFilterGroupContext);
|
|
30
|
-
const
|
|
31
|
-
|
|
30
|
+
const { all: allActiveGroupOptions, enabled: enabledActiveGroupOptions } = useMemo(() => {
|
|
31
|
+
const filteredOptions = filterOptions[activeGroup]?.data.filter(
|
|
32
32
|
(option) => option.name.toLowerCase().includes(searchStr.toLowerCase())
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
);
|
|
34
|
+
return {
|
|
35
|
+
all: filteredOptions.map((option) => option.id) || [],
|
|
36
|
+
enabled: filteredOptions.filter((option) => !option.disabled).map((option) => option.id) || []
|
|
37
|
+
};
|
|
38
|
+
}, [filterOptions, activeGroup, searchStr]);
|
|
36
39
|
const activeFilterValues = useMemo(
|
|
37
40
|
() => filterValues[activeGroup]?.filter(
|
|
38
|
-
(value) =>
|
|
41
|
+
(value) => allActiveGroupOptions.includes(value)
|
|
39
42
|
) || [],
|
|
40
|
-
[filterValues,
|
|
43
|
+
[filterValues, allActiveGroupOptions, activeGroup]
|
|
41
44
|
);
|
|
42
45
|
const listValues = useMemo(
|
|
43
46
|
() => filterOptions[activeGroup]?.data.map((option) => ({
|
|
@@ -51,10 +54,10 @@ const HvFilterGroupRightPanel = ({
|
|
|
51
54
|
const updateSelectAll = useCallback(() => {
|
|
52
55
|
const nbrSelected = activeFilterValues?.length;
|
|
53
56
|
const hasSelection = nbrSelected > 0;
|
|
54
|
-
const allSelect = nbrSelected ===
|
|
57
|
+
const allSelect = nbrSelected === allActiveGroupOptions.length;
|
|
55
58
|
setAnySelected(hasSelection);
|
|
56
59
|
setAllSelected(hasSelection && allSelect);
|
|
57
|
-
}, [activeFilterValues,
|
|
60
|
+
}, [activeFilterValues, allActiveGroupOptions]);
|
|
58
61
|
useEffect(() => {
|
|
59
62
|
updateSelectAll();
|
|
60
63
|
}, [activeFilterValues, updateSelectAll]);
|
|
@@ -70,18 +73,22 @@ const HvFilterGroupRightPanel = ({
|
|
|
70
73
|
if (anySelected) {
|
|
71
74
|
if (searchStr !== "") {
|
|
72
75
|
newFilterValues[activeGroup] = filterValues[activeGroup]?.filter(
|
|
73
|
-
(value) => !
|
|
76
|
+
(value) => !enabledActiveGroupOptions.includes(value)
|
|
74
77
|
);
|
|
75
78
|
} else {
|
|
76
79
|
newFilterValues[activeGroup] = [];
|
|
77
80
|
}
|
|
78
81
|
} else {
|
|
79
|
-
newFilterValues[activeGroup]
|
|
82
|
+
const currentOptions = newFilterValues[activeGroup] || [];
|
|
83
|
+
newFilterValues[activeGroup] = [
|
|
84
|
+
...currentOptions,
|
|
85
|
+
...enabledActiveGroupOptions
|
|
86
|
+
];
|
|
80
87
|
}
|
|
81
88
|
setFilterValues(newFilterValues);
|
|
82
89
|
}, [
|
|
83
90
|
activeGroup,
|
|
84
|
-
|
|
91
|
+
enabledActiveGroupOptions,
|
|
85
92
|
anySelected,
|
|
86
93
|
filterValues,
|
|
87
94
|
setFilterValues,
|
|
@@ -91,10 +98,10 @@ const HvFilterGroupRightPanel = ({
|
|
|
91
98
|
const nbrSelected = activeFilterValues?.length;
|
|
92
99
|
const defaultLabel = /* @__PURE__ */ jsx(HvTypography, { component: "span", children: nbrSelected > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
93
100
|
/* @__PURE__ */ jsx("b", { children: nbrSelected }),
|
|
94
|
-
` ${labels?.multiSelectionConjunction} ${
|
|
101
|
+
` ${labels?.multiSelectionConjunction} ${allActiveGroupOptions.length}`
|
|
95
102
|
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
96
103
|
/* @__PURE__ */ jsx("b", { children: labels?.selectAll }),
|
|
97
|
-
` (${
|
|
104
|
+
` (${allActiveGroupOptions.length})`
|
|
98
105
|
] }) });
|
|
99
106
|
return /* @__PURE__ */ jsx("div", { className: classes.selectAllContainer, children: /* @__PURE__ */ jsx(
|
|
100
107
|
HvCheckBox,
|
|
@@ -109,7 +116,7 @@ const HvFilterGroupRightPanel = ({
|
|
|
109
116
|
) });
|
|
110
117
|
}, [
|
|
111
118
|
activeFilterValues?.length,
|
|
112
|
-
|
|
119
|
+
allActiveGroupOptions.length,
|
|
113
120
|
allSelected,
|
|
114
121
|
anySelected,
|
|
115
122
|
handleSelectAll,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RightPanel.js","sources":["../../../../src/FilterGroup/RightPanel/RightPanel.tsx"],"sourcesContent":["import { useCallback, useContext, useEffect, useMemo, useState } from \"react\";\
|
|
1
|
+
{"version":3,"file":"RightPanel.js","sources":["../../../../src/FilterGroup/RightPanel/RightPanel.tsx"],"sourcesContent":["import { useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport cloneDeep from \"lodash/cloneDeep\";\n\nimport { HvCheckBox } from \"../../CheckBox\";\nimport { HvInput } from \"../../Input\";\nimport { HvList, HvListProps } from \"../../List\";\nimport { HvPanel } from \"../../Panel\";\nimport { HvTypography } from \"../../Typography\";\nimport { ExtractNames } from \"../../utils/classes\";\nimport { setId } from \"../../utils/setId\";\nimport { HvFilterGroupContext } from \"../FilterGroupContext\";\nimport { staticClasses, useClasses } from \"./RightPanel.styles\";\n\nexport { staticClasses as filterGroupRightPanelClasses };\n\nexport type HvFilterGroupRightPanelClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvFilterGroupRightPanelProps {\n id?: string;\n className?: string;\n labels?: {\n searchBoxPlaceholder?: string;\n selectAll?: string;\n multiSelectionConjunction?: string;\n };\n emptyElement?: React.ReactNode;\n classes?: HvFilterGroupRightPanelClasses;\n}\n\nexport const HvFilterGroupRightPanel = ({\n id,\n className,\n labels,\n emptyElement,\n classes: classesProp,\n}: HvFilterGroupRightPanelProps) => {\n const { classes } = useClasses(classesProp);\n const [searchStr, setSearchStr] = useState<string>(\"\");\n const [allSelected, setAllSelected] = useState<boolean>(false);\n const [anySelected, setAnySelected] = useState<boolean>(false);\n\n const {\n filterOptions,\n filterValues = [],\n setFilterValues,\n activeGroup,\n } = useContext(HvFilterGroupContext);\n\n const { all: allActiveGroupOptions, enabled: enabledActiveGroupOptions } =\n useMemo(() => {\n const filteredOptions = filterOptions[activeGroup]?.data.filter(\n (option) => option.name.toLowerCase().includes(searchStr.toLowerCase())\n );\n\n return {\n all: filteredOptions.map((option) => option.id) || [],\n enabled:\n filteredOptions\n .filter((option) => !option.disabled)\n .map((option) => option.id) || [],\n };\n }, [filterOptions, activeGroup, searchStr]);\n\n const activeFilterValues = useMemo(\n () =>\n filterValues[activeGroup]?.filter((value) =>\n allActiveGroupOptions.includes(value)\n ) || [],\n [filterValues, allActiveGroupOptions, activeGroup]\n );\n\n const listValues = useMemo(\n () =>\n filterOptions[activeGroup]?.data.map((option) => ({\n ...option,\n label: option.name,\n selected: filterValues[activeGroup]?.includes(option.id),\n isHidden:\n option.name.toLowerCase().indexOf(searchStr.toLowerCase()) < 0,\n })) || [],\n [filterOptions, filterValues, activeGroup, searchStr]\n );\n\n const updateSelectAll = useCallback(() => {\n const nbrSelected = activeFilterValues?.length;\n const hasSelection = nbrSelected > 0;\n const allSelect = nbrSelected === allActiveGroupOptions.length;\n\n setAnySelected(hasSelection);\n setAllSelected(hasSelection && allSelect);\n }, [activeFilterValues, allActiveGroupOptions]);\n\n useEffect(() => {\n updateSelectAll();\n }, [activeFilterValues, updateSelectAll]);\n\n useEffect(() => setSearchStr(\"\"), [activeGroup]);\n\n const onChangeHandler: HvListProps[\"onChange\"] = (values) => {\n const newFilterValues = filterOptions.map((_, i) =>\n activeGroup === i\n ? values.filter((v) => v.selected).map((v) => v.id)\n : [...(filterValues[i] || [])]\n );\n setFilterValues(newFilterValues as any);\n };\n\n const handleSelectAll = useCallback(() => {\n const newFilterValues = cloneDeep(filterValues);\n\n if (anySelected) {\n if (searchStr !== \"\") {\n newFilterValues[activeGroup] = filterValues[activeGroup]?.filter(\n (value) => !enabledActiveGroupOptions.includes(value)\n );\n } else {\n newFilterValues[activeGroup] = [];\n }\n } else {\n const currentOptions = newFilterValues[activeGroup] || [];\n newFilterValues[activeGroup] = [\n ...currentOptions,\n ...enabledActiveGroupOptions,\n ];\n }\n\n setFilterValues(newFilterValues);\n }, [\n activeGroup,\n enabledActiveGroupOptions,\n anySelected,\n filterValues,\n setFilterValues,\n searchStr,\n ]);\n\n const SelectAll = useCallback(() => {\n const nbrSelected = activeFilterValues?.length;\n\n const defaultLabel = (\n <HvTypography component=\"span\">\n {nbrSelected > 0 ? (\n <>\n <b>{nbrSelected}</b>\n {` ${labels?.multiSelectionConjunction} ${allActiveGroupOptions.length}`}\n </>\n ) : (\n <>\n <b>{labels?.selectAll}</b>\n {` (${allActiveGroupOptions.length})`}\n </>\n )}\n </HvTypography>\n );\n\n return (\n <div className={classes.selectAllContainer}>\n <HvCheckBox\n id={setId(id, \"select-all\")}\n label={defaultLabel}\n onChange={() => handleSelectAll()}\n className={classes.selectAll}\n indeterminate={anySelected && !allSelected}\n checked={allSelected}\n />\n </div>\n );\n }, [\n activeFilterValues?.length,\n allActiveGroupOptions.length,\n allSelected,\n anySelected,\n handleSelectAll,\n id,\n labels,\n classes?.selectAllContainer,\n classes?.selectAll,\n ]);\n\n return (\n <HvPanel id={setId(id, \"rightPanel\")} className={className}>\n {listValues.length > 0 ? (\n <>\n <HvInput\n id={setId(id, \"search\")}\n classes={{\n root: classes.search,\n }}\n type=\"search\"\n placeholder={labels?.searchBoxPlaceholder}\n value={searchStr}\n onChange={(_, str) => setSearchStr(str)}\n />\n <SelectAll />\n <HvList\n key={activeGroup}\n id={setId(id, \"list\")}\n values={listValues}\n className={classes.list}\n multiSelect\n useSelector\n showSelectAll={false}\n onChange={onChangeHandler}\n selectable\n condensed\n hasTooltips\n />\n </>\n ) : (\n emptyElement\n )}\n </HvPanel>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { useRef } from "react";
|
|
3
|
+
import { useOption } from "@mui/base/useOption";
|
|
4
|
+
import { useForkRef } from "@mui/material/utils";
|
|
5
|
+
import { useDefaultProps } from "../hooks/useDefaultProps.js";
|
|
6
|
+
import { fixedForwardRef } from "../types/generic.js";
|
|
7
|
+
import { createClasses } from "../utils/classes.js";
|
|
8
|
+
import { outlineStyles } from "../utils/focusUtils.js";
|
|
9
|
+
import { HvListItem } from "../ListContainer/ListItem/ListItem.js";
|
|
10
|
+
const { staticClasses, useClasses } = createClasses("HvOption", {
|
|
11
|
+
root: {},
|
|
12
|
+
highlighted: {
|
|
13
|
+
...outlineStyles
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const HvOption = fixedForwardRef(function HvOption2(props, ref) {
|
|
17
|
+
const {
|
|
18
|
+
classes: classesProp,
|
|
19
|
+
className,
|
|
20
|
+
disabled = false,
|
|
21
|
+
label,
|
|
22
|
+
value,
|
|
23
|
+
children,
|
|
24
|
+
...others
|
|
25
|
+
} = useDefaultProps("HvOption", props);
|
|
26
|
+
const { classes, cx } = useClasses(classesProp);
|
|
27
|
+
const optionRef = useRef(null);
|
|
28
|
+
const rootRef = useForkRef(optionRef, ref);
|
|
29
|
+
const computedLabel = label ?? (typeof children === "string" ? children : optionRef.current?.textContent?.trim());
|
|
30
|
+
const { getRootProps, selected, highlighted } = useOption({
|
|
31
|
+
disabled,
|
|
32
|
+
label: computedLabel,
|
|
33
|
+
rootRef,
|
|
34
|
+
value
|
|
35
|
+
});
|
|
36
|
+
return /* @__PURE__ */ jsx(
|
|
37
|
+
HvListItem,
|
|
38
|
+
{
|
|
39
|
+
ref,
|
|
40
|
+
selected,
|
|
41
|
+
className: cx(classes.root, className, {
|
|
42
|
+
[classes.highlighted]: highlighted
|
|
43
|
+
}),
|
|
44
|
+
...getRootProps(),
|
|
45
|
+
...others,
|
|
46
|
+
children
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
export {
|
|
51
|
+
HvOption,
|
|
52
|
+
staticClasses as optionClasses
|
|
53
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Option.js","sources":["../../../src/Select/Option.tsx"],"sourcesContent":["import { useRef } from \"react\";\nimport { useOption } from \"@mui/base/useOption\";\nimport { OptionOwnProps } from \"@mui/base/Option\";\nimport { useForkRef } from \"@mui/material/utils\";\n\nimport { HvListItem, HvListItemProps } from \"../ListContainer\";\nimport { useDefaultProps } from \"../hooks/useDefaultProps\";\nimport { fixedForwardRef } from \"../types/generic\";\nimport { ExtractNames, createClasses } from \"../utils/classes\";\nimport { outlineStyles } from \"../utils/focusUtils\";\n\nconst { staticClasses, useClasses } = createClasses(\"HvOption\", {\n root: {},\n highlighted: {\n ...outlineStyles,\n },\n});\n\nexport { staticClasses as optionClasses };\n\nexport type HvOptionClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvOptionProps<OptionValue extends {}>\n extends Omit<HvListItemProps, \"value\" | \"disabled\">,\n Pick<OptionOwnProps<OptionValue>, \"disabled\" | \"label\" | \"value\"> {\n classes?: HvOptionClasses;\n}\n\nexport const HvOption = fixedForwardRef(function HvOption<\n OptionValue extends {}\n>(props: HvOptionProps<OptionValue>, ref: React.Ref<HTMLLIElement>) {\n const {\n classes: classesProp,\n className,\n disabled = false,\n label,\n value,\n children,\n ...others\n } = useDefaultProps(\"HvOption\", props);\n const { classes, cx } = useClasses(classesProp);\n\n const optionRef = useRef<HTMLElement>(null);\n const rootRef = useForkRef(optionRef, ref);\n\n const computedLabel =\n label ??\n (typeof children === \"string\"\n ? children\n : optionRef.current?.textContent?.trim());\n\n const { getRootProps, selected, highlighted } = useOption({\n disabled,\n label: computedLabel,\n rootRef,\n value,\n });\n\n return (\n <HvListItem\n ref={ref}\n selected={selected}\n className={cx(classes.root, className, {\n [classes.highlighted]: highlighted,\n })}\n {...getRootProps()}\n {...others}\n >\n {children}\n </HvListItem>\n );\n});\n"],"names":["HvOption"],"mappings":";;;;;;;;;AAWA,MAAM,EAAE,eAAe,eAAe,cAAc,YAAY;AAAA,EAC9D,MAAM,CAAC;AAAA,EACP,aAAa;AAAA,IACX,GAAG;AAAA,EACL;AACF,CAAC;AAYM,MAAM,WAAW,gBAAgB,SAASA,UAE/C,OAAmC,KAA+B;AAC5D,QAAA;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,IACD,gBAAgB,YAAY,KAAK;AACrC,QAAM,EAAE,SAAS,GAAG,IAAI,WAAW,WAAW;AAExC,QAAA,YAAY,OAAoB,IAAI;AACpC,QAAA,UAAU,WAAW,WAAW,GAAG;AAEnC,QAAA,gBACJ,UACC,OAAO,aAAa,WACjB,WACA,UAAU,SAAS,aAAa,KAAK;AAE3C,QAAM,EAAE,cAAc,UAAU,YAAA,IAAgB,UAAU;AAAA,IACxD;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EAAA,CACD;AAGC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,GAAG,QAAQ,MAAM,WAAW;AAAA,QACrC,CAAC,QAAQ,WAAW,GAAG;AAAA,MAAA,CACxB;AAAA,MACA,GAAG,aAAa;AAAA,MAChB,GAAG;AAAA,MAEH;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { OptionGroup } from "@mui/base/OptionGroup";
|
|
4
|
+
import { theme } from "@hitachivantara/uikit-styles";
|
|
5
|
+
import { createClasses } from "../utils/classes.js";
|
|
6
|
+
import { useDefaultProps } from "../hooks/useDefaultProps.js";
|
|
7
|
+
const { staticClasses, useClasses } = createClasses("HvOptionGroup", {
|
|
8
|
+
root: {
|
|
9
|
+
listStyle: "none",
|
|
10
|
+
...theme.typography.label
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
const HvOptionGroup = forwardRef(
|
|
14
|
+
(props, ref) => {
|
|
15
|
+
const {
|
|
16
|
+
className,
|
|
17
|
+
classes: classesProp,
|
|
18
|
+
...others
|
|
19
|
+
} = useDefaultProps("HvOptionGroup", props);
|
|
20
|
+
const { classes, cx } = useClasses(classesProp);
|
|
21
|
+
return /* @__PURE__ */ jsx(
|
|
22
|
+
OptionGroup,
|
|
23
|
+
{
|
|
24
|
+
ref,
|
|
25
|
+
className: cx(classes.root, className),
|
|
26
|
+
...others
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
export {
|
|
32
|
+
HvOptionGroup,
|
|
33
|
+
staticClasses as optionGroupClasses
|
|
34
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OptionGroup.js","sources":["../../../src/Select/OptionGroup.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { OptionGroup, OptionGroupProps } from \"@mui/base/OptionGroup\";\nimport { theme } from \"@hitachivantara/uikit-styles\";\n\nimport { ExtractNames, createClasses } from \"../utils/classes\";\nimport { useDefaultProps } from \"../hooks/useDefaultProps\";\n\nconst { staticClasses, useClasses } = createClasses(\"HvOptionGroup\", {\n root: {\n listStyle: \"none\",\n ...theme.typography.label,\n },\n});\n\nexport { staticClasses as optionGroupClasses };\n\nexport type HvOptionGroupClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvOptionGroupProps extends OptionGroupProps {\n classes?: HvOptionGroupClasses;\n}\n\nexport const HvOptionGroup = forwardRef<HTMLLIElement, HvOptionGroupProps>(\n (props, ref) => {\n const {\n className,\n classes: classesProp,\n ...others\n } = useDefaultProps(\"HvOptionGroup\", props);\n const { classes, cx } = useClasses(classesProp);\n\n return (\n <OptionGroup\n ref={ref}\n className={cx(classes.root, className)}\n {...others}\n />\n );\n }\n);\n"],"names":[],"mappings":";;;;;;AAOA,MAAM,EAAE,eAAe,eAAe,cAAc,iBAAiB;AAAA,EACnE,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,GAAG,MAAM,WAAW;AAAA,EACtB;AACF,CAAC;AAUM,MAAM,gBAAgB;AAAA,EAC3B,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,GAAG;AAAA,IAAA,IACD,gBAAgB,iBAAiB,KAAK;AAC1C,UAAM,EAAE,SAAS,GAAG,IAAI,WAAW,WAAW;AAG5C,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,QAAQ,MAAM,SAAS;AAAA,QACpC,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { useState, useRef } from "react";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { useSelect, SelectProvider } from "@mui/base/useSelect";
|
|
5
|
+
import { useForkRef, useControlled } from "@mui/material/utils";
|
|
6
|
+
import { Popper } from "@mui/base/Popper";
|
|
7
|
+
import { fixedForwardRef } from "../types/generic.js";
|
|
8
|
+
import { useDefaultProps } from "../hooks/useDefaultProps.js";
|
|
9
|
+
import { useClasses } from "./Select.styles.js";
|
|
10
|
+
import { staticClasses } from "./Select.styles.js";
|
|
11
|
+
import { setId } from "../utils/setId.js";
|
|
12
|
+
import { useUniqueId } from "../hooks/useUniqueId.js";
|
|
13
|
+
import { HvSelectButton } from "./SelectButton.js";
|
|
14
|
+
import { HvPanel } from "../Panel/Panel.js";
|
|
15
|
+
import { HvFormElement } from "../Forms/FormElement/FormElement.js";
|
|
16
|
+
import { HvLabel } from "../Forms/Label/Label.js";
|
|
17
|
+
import { HvInfoMessage } from "../Forms/InfoMessage/InfoMessage.js";
|
|
18
|
+
import { HvListContainer } from "../ListContainer/ListContainer.js";
|
|
19
|
+
import { HvWarningText } from "../Forms/WarningText/WarningText.js";
|
|
20
|
+
function defaultRenderValue(options) {
|
|
21
|
+
if (Array.isArray(options)) {
|
|
22
|
+
if (options.length === 0)
|
|
23
|
+
return null;
|
|
24
|
+
return /* @__PURE__ */ jsx(Fragment, { children: options.map((o) => o.label).join(", ") });
|
|
25
|
+
}
|
|
26
|
+
return options?.label ?? null;
|
|
27
|
+
}
|
|
28
|
+
const mergeIds = (...ids) => clsx(ids) || void 0;
|
|
29
|
+
const HvSelect = fixedForwardRef(function HvSelect2(props, ref) {
|
|
30
|
+
const {
|
|
31
|
+
children,
|
|
32
|
+
classes: classesProp,
|
|
33
|
+
className,
|
|
34
|
+
id: idProp,
|
|
35
|
+
name,
|
|
36
|
+
required,
|
|
37
|
+
disabled: disabledProp,
|
|
38
|
+
readOnly,
|
|
39
|
+
label,
|
|
40
|
+
open: openProp,
|
|
41
|
+
defaultOpen,
|
|
42
|
+
multiple,
|
|
43
|
+
autoComplete,
|
|
44
|
+
options: optionsProp,
|
|
45
|
+
variableWidth,
|
|
46
|
+
value: valueProp,
|
|
47
|
+
defaultValue,
|
|
48
|
+
placeholder,
|
|
49
|
+
"aria-label": ariaLabel,
|
|
50
|
+
"aria-labelledby": ariaLabelledBy,
|
|
51
|
+
description,
|
|
52
|
+
"aria-describedby": ariaDescribedBy,
|
|
53
|
+
status,
|
|
54
|
+
statusMessage,
|
|
55
|
+
"aria-errormessage": ariaErrorMessage,
|
|
56
|
+
getSerializedValue,
|
|
57
|
+
onClick,
|
|
58
|
+
onChange,
|
|
59
|
+
onOpenChange,
|
|
60
|
+
...others
|
|
61
|
+
} = useDefaultProps("HvSelect", props);
|
|
62
|
+
const { classes, cx } = useClasses(classesProp);
|
|
63
|
+
const [placement, setPlacement] = useState("bottom-start");
|
|
64
|
+
const buttonRef = useRef(null);
|
|
65
|
+
const handleButtonRef = useForkRef(ref, buttonRef);
|
|
66
|
+
const {
|
|
67
|
+
contextValue,
|
|
68
|
+
disabled,
|
|
69
|
+
getButtonProps,
|
|
70
|
+
getListboxProps,
|
|
71
|
+
getHiddenInputProps,
|
|
72
|
+
getOptionMetadata,
|
|
73
|
+
value,
|
|
74
|
+
open
|
|
75
|
+
} = useSelect({
|
|
76
|
+
componentName: "HvSelect",
|
|
77
|
+
name,
|
|
78
|
+
required,
|
|
79
|
+
disabled: disabledProp,
|
|
80
|
+
multiple,
|
|
81
|
+
open: openProp,
|
|
82
|
+
defaultOpen,
|
|
83
|
+
value: valueProp,
|
|
84
|
+
defaultValue,
|
|
85
|
+
options: optionsProp,
|
|
86
|
+
buttonRef: handleButtonRef,
|
|
87
|
+
getSerializedValue,
|
|
88
|
+
onChange,
|
|
89
|
+
onOpenChange: handleOpenChange
|
|
90
|
+
});
|
|
91
|
+
const id = useUniqueId(idProp);
|
|
92
|
+
const labelId = useUniqueId(setId(idProp, "label"));
|
|
93
|
+
const descriptionId = useUniqueId(setId(idProp, "description"));
|
|
94
|
+
const errorMessageId = useUniqueId(setId(idProp, "error"));
|
|
95
|
+
const [validationMessage] = useControlled({
|
|
96
|
+
name: "HvSelect.statusMessage",
|
|
97
|
+
controlled: statusMessage,
|
|
98
|
+
default: "Required"
|
|
99
|
+
});
|
|
100
|
+
const [validationState, setValidationState] = useControlled({
|
|
101
|
+
name: "HvSelect.status",
|
|
102
|
+
controlled: status,
|
|
103
|
+
default: "standBy"
|
|
104
|
+
});
|
|
105
|
+
function handleOpenChange(newOpen) {
|
|
106
|
+
if (!newOpen) {
|
|
107
|
+
const hasValue = multiple ? value.length > 0 : !!value;
|
|
108
|
+
setValidationState(required && !hasValue ? "invalid" : "valid");
|
|
109
|
+
}
|
|
110
|
+
onOpenChange?.(newOpen);
|
|
111
|
+
}
|
|
112
|
+
const canShowError = ariaErrorMessage == null && (status !== void 0 && statusMessage !== void 0 || status === void 0 && required);
|
|
113
|
+
const isInvalid = validationState === "invalid";
|
|
114
|
+
const actualValue = multiple ? value.map((v) => getOptionMetadata(v)).filter((v) => v !== void 0) : getOptionMetadata(value) ?? null;
|
|
115
|
+
const isOpen = open && !!children;
|
|
116
|
+
return /* @__PURE__ */ jsxs(
|
|
117
|
+
HvFormElement,
|
|
118
|
+
{
|
|
119
|
+
name,
|
|
120
|
+
required,
|
|
121
|
+
disabled,
|
|
122
|
+
readOnly,
|
|
123
|
+
status: validationState,
|
|
124
|
+
className: cx(classes.root, className, {
|
|
125
|
+
[classes.disabled]: disabled,
|
|
126
|
+
[classes.readOnly]: readOnly
|
|
127
|
+
}),
|
|
128
|
+
...others,
|
|
129
|
+
children: [
|
|
130
|
+
(label || description) && /* @__PURE__ */ jsxs("div", { className: classes.labelContainer, children: [
|
|
131
|
+
label && /* @__PURE__ */ jsx(
|
|
132
|
+
HvLabel,
|
|
133
|
+
{
|
|
134
|
+
id: labelId,
|
|
135
|
+
htmlFor: id,
|
|
136
|
+
label,
|
|
137
|
+
className: classes.label
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
description && /* @__PURE__ */ jsx(HvInfoMessage, { id: descriptionId, className: classes.description, children: description })
|
|
141
|
+
] }),
|
|
142
|
+
/* @__PURE__ */ jsx(
|
|
143
|
+
HvSelectButton,
|
|
144
|
+
{
|
|
145
|
+
id,
|
|
146
|
+
open: isOpen,
|
|
147
|
+
disabled,
|
|
148
|
+
readOnly,
|
|
149
|
+
className: cx(classes.select, {
|
|
150
|
+
[classes.invalid]: validationState === "invalid"
|
|
151
|
+
}),
|
|
152
|
+
placement,
|
|
153
|
+
"aria-label": ariaLabel,
|
|
154
|
+
"aria-labelledby": mergeIds(label && labelId, ariaLabelledBy),
|
|
155
|
+
"aria-invalid": isInvalid ? true : void 0,
|
|
156
|
+
"aria-errormessage": errorMessageId,
|
|
157
|
+
"aria-describedby": mergeIds(
|
|
158
|
+
description && descriptionId,
|
|
159
|
+
ariaDescribedBy
|
|
160
|
+
),
|
|
161
|
+
...getButtonProps(),
|
|
162
|
+
children: defaultRenderValue(actualValue) ?? placeholder
|
|
163
|
+
}
|
|
164
|
+
),
|
|
165
|
+
/* @__PURE__ */ jsx(
|
|
166
|
+
Popper,
|
|
167
|
+
{
|
|
168
|
+
open: isOpen,
|
|
169
|
+
keepMounted: true,
|
|
170
|
+
disablePortal: true,
|
|
171
|
+
anchorEl: buttonRef.current,
|
|
172
|
+
className: classes.popper,
|
|
173
|
+
placement,
|
|
174
|
+
modifiers: [
|
|
175
|
+
{
|
|
176
|
+
enabled: true,
|
|
177
|
+
phase: "main",
|
|
178
|
+
fn: ({ state }) => setPlacement(state.placement)
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
children: /* @__PURE__ */ jsx(
|
|
182
|
+
HvPanel,
|
|
183
|
+
{
|
|
184
|
+
style: {
|
|
185
|
+
width: variableWidth ? "auto" : (buttonRef.current?.clientWidth || 0) + 2
|
|
186
|
+
},
|
|
187
|
+
className: cx(classes.panel, className, {
|
|
188
|
+
[classes.panelOpenedUp]: placement.includes("top"),
|
|
189
|
+
[classes.panelOpenedDown]: placement.includes("bottom")
|
|
190
|
+
}),
|
|
191
|
+
children: /* @__PURE__ */ jsx(SelectProvider, { value: contextValue, children: /* @__PURE__ */ jsx(HvListContainer, { condensed: true, selectable: true, ...getListboxProps(), children }) })
|
|
192
|
+
}
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
|
+
),
|
|
196
|
+
/* @__PURE__ */ jsx("input", { ...getHiddenInputProps(), autoComplete }),
|
|
197
|
+
canShowError && /* @__PURE__ */ jsx(
|
|
198
|
+
HvWarningText,
|
|
199
|
+
{
|
|
200
|
+
id: errorMessageId,
|
|
201
|
+
disableBorder: true,
|
|
202
|
+
className: classes.error,
|
|
203
|
+
children: validationMessage
|
|
204
|
+
}
|
|
205
|
+
)
|
|
206
|
+
]
|
|
207
|
+
}
|
|
208
|
+
);
|
|
209
|
+
});
|
|
210
|
+
export {
|
|
211
|
+
HvSelect,
|
|
212
|
+
staticClasses as selectClasses
|
|
213
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../../src/Select/Select.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport React, { useRef, useState } from \"react\";\nimport type { Placement } from \"@popperjs/core\";\nimport clsx from \"clsx\";\n\nimport {\n SelectProvider,\n UseSelectParameters,\n useSelect,\n} from \"@mui/base/useSelect\";\nimport { useControlled, useForkRef } from \"@mui/material/utils\";\nimport { Popper } from \"@mui/base/Popper\";\nimport { SelectOption } from \"@mui/base/useOption\";\n\nimport {\n HvFormElement,\n HvFormElementProps,\n HvFormStatus,\n HvInfoMessage,\n HvLabel,\n HvWarningText,\n} from \"../Forms\";\nimport { ExtractNames } from \"../utils/classes\";\nimport { fixedForwardRef } from \"../types/generic\";\nimport { useDefaultProps } from \"../hooks/useDefaultProps\";\nimport { staticClasses, useClasses } from \"./Select.styles\";\nimport { setId } from \"../utils/setId\";\nimport { useUniqueId } from \"../hooks/useUniqueId\";\nimport { HvPanel } from \"../Panel\";\nimport { HvListContainer } from \"../ListContainer\";\nimport { HvSelectButton } from \"./SelectButton\";\n\nfunction defaultRenderValue<Value>(\n options: SelectOption<Value> | SelectOption<Value>[] | null\n) {\n if (Array.isArray(options)) {\n if (options.length === 0) return null;\n return <>{options.map((o) => o.label).join(\", \")}</>;\n }\n\n return options?.label ?? null;\n}\n\nconst mergeIds = (...ids: clsx.ClassValue[]) => clsx(ids) || undefined;\n\nexport { staticClasses as selectClasses };\n\nexport type HvSelectClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvSelectProps<\n OptionValue extends {},\n Multiple extends boolean = false\n> extends Omit<HvFormElementProps, \"value\" | \"defaultValue\" | \"onChange\">,\n Pick<\n UseSelectParameters<OptionValue, Multiple>,\n | \"name\"\n | \"required\"\n | \"disabled\"\n | \"multiple\"\n | \"open\"\n | \"defaultOpen\"\n | \"value\"\n | \"defaultValue\"\n | \"buttonRef\"\n | \"options\"\n | \"getSerializedValue\"\n | \"onChange\"\n | \"onOpenChange\"\n > {\n classes?: HvSelectClasses;\n placeholder?: React.ReactNode;\n autoComplete?: string;\n /** Whether the width of the select panel can vary independently. */\n variableWidth?: boolean;\n}\n\n/**\n * The `HvSelect` component is a form control element that allows selection from a list of options.\n *\n * It aims to be aligned with the native HTML `<select>` and `<option>` APIs and be easily integrated with forms.\n *\n * @example\n * <HvSelect name=\"pets\">\n * <HvOption value=\"dog\">Dog</HvOption>\n * <HvOption value=\"cat\">Cat</HvOption>\n * </HvSelect>\n * */\nexport const HvSelect = fixedForwardRef(function HvSelect<\n OptionValue extends {},\n Multiple extends boolean\n>(\n props: HvSelectProps<OptionValue, Multiple>,\n ref: React.Ref<HTMLButtonElement>\n) {\n const {\n children,\n classes: classesProp,\n className,\n id: idProp,\n name,\n required,\n disabled: disabledProp,\n readOnly,\n label,\n open: openProp,\n defaultOpen,\n multiple,\n autoComplete,\n options: optionsProp,\n variableWidth,\n value: valueProp,\n defaultValue,\n placeholder,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n description,\n \"aria-describedby\": ariaDescribedBy,\n status,\n statusMessage,\n \"aria-errormessage\": ariaErrorMessage,\n getSerializedValue,\n onClick,\n onChange,\n onOpenChange,\n ...others\n } = useDefaultProps(\"HvSelect\", props);\n const { classes, cx } = useClasses(classesProp);\n\n const [placement, setPlacement] = useState<Placement>(\"bottom-start\");\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n const handleButtonRef = useForkRef(ref, buttonRef);\n\n const {\n contextValue,\n disabled,\n getButtonProps,\n getListboxProps,\n getHiddenInputProps,\n getOptionMetadata,\n value,\n open,\n } = useSelect<OptionValue, Multiple>({\n componentName: \"HvSelect\",\n name,\n required,\n disabled: disabledProp,\n multiple,\n open: openProp,\n defaultOpen,\n value: valueProp,\n defaultValue,\n options: optionsProp,\n buttonRef: handleButtonRef,\n getSerializedValue,\n onChange,\n onOpenChange: handleOpenChange,\n });\n\n const id = useUniqueId(idProp);\n const labelId = useUniqueId(setId(idProp, \"label\"));\n const descriptionId = useUniqueId(setId(idProp, \"description\"));\n const errorMessageId = useUniqueId(setId(idProp, \"error\"));\n\n const [validationMessage] = useControlled({\n name: \"HvSelect.statusMessage\",\n controlled: statusMessage,\n default: \"Required\",\n });\n const [validationState, setValidationState] = useControlled<HvFormStatus>({\n name: \"HvSelect.status\",\n controlled: status,\n default: \"standBy\",\n });\n\n function handleOpenChange(newOpen: boolean) {\n if (!newOpen) {\n const hasValue = multiple ? (value as OptionValue[]).length > 0 : !!value;\n setValidationState(required && !hasValue ? \"invalid\" : \"valid\");\n }\n onOpenChange?.(newOpen);\n }\n\n // the error message area will only be created if:\n // - an external element that provides an error message isn't identified via aria-errormessage AND\n // - both status and statusMessage properties are being controlled OR\n // - status is uncontrolled and required is true\n const canShowError =\n ariaErrorMessage == null &&\n ((status !== undefined && statusMessage !== undefined) ||\n (status === undefined && required));\n\n const isInvalid = validationState === \"invalid\";\n\n const actualValue = multiple\n ? (value as OptionValue[])\n .map((v) => getOptionMetadata(v))\n .filter((v): v is SelectOption<OptionValue> => v !== undefined)\n : getOptionMetadata(value as OptionValue) ?? null;\n\n const isOpen = open && !!children;\n\n return (\n <HvFormElement\n name={name}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n status={validationState}\n className={cx(classes.root, className, {\n [classes.disabled]: disabled,\n [classes.readOnly]: readOnly,\n })}\n {...others}\n >\n {(label || description) && (\n <div className={classes.labelContainer}>\n {label && (\n <HvLabel\n id={labelId}\n htmlFor={id}\n label={label}\n className={classes.label}\n />\n )}\n {description && (\n <HvInfoMessage id={descriptionId} className={classes.description}>\n {description}\n </HvInfoMessage>\n )}\n </div>\n )}\n\n <HvSelectButton\n id={id}\n open={isOpen}\n disabled={disabled}\n readOnly={readOnly}\n className={cx(classes.select, {\n [classes.invalid]: validationState === \"invalid\",\n })}\n placement={placement}\n aria-label={ariaLabel}\n aria-labelledby={mergeIds(label && labelId, ariaLabelledBy)}\n aria-invalid={isInvalid ? true : undefined}\n aria-errormessage={errorMessageId}\n aria-describedby={mergeIds(\n description && descriptionId,\n ariaDescribedBy\n )}\n {...getButtonProps()}\n >\n {defaultRenderValue(actualValue) ?? placeholder}\n </HvSelectButton>\n <Popper\n open={isOpen}\n keepMounted\n disablePortal\n anchorEl={buttonRef.current}\n className={classes.popper}\n placement={placement}\n modifiers={[\n {\n enabled: true,\n phase: \"main\",\n fn: ({ state }) => setPlacement(state.placement),\n },\n ]}\n >\n <HvPanel\n style={{\n width: variableWidth\n ? \"auto\"\n : (buttonRef.current?.clientWidth || 0) + 2,\n }}\n className={cx(classes.panel, className, {\n [classes.panelOpenedUp]: placement.includes(\"top\"),\n [classes.panelOpenedDown]: placement.includes(\"bottom\"),\n })}\n >\n <SelectProvider value={contextValue}>\n <HvListContainer condensed selectable {...getListboxProps()}>\n {children}\n </HvListContainer>\n </SelectProvider>\n </HvPanel>\n </Popper>\n\n <input {...getHiddenInputProps()} autoComplete={autoComplete} />\n\n {canShowError && (\n <HvWarningText\n id={errorMessageId}\n disableBorder\n className={classes.error}\n >\n {validationMessage}\n </HvWarningText>\n )}\n </HvFormElement>\n );\n});\n"],"names":["HvSelect"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { theme } from "@hitachivantara/uikit-styles";
|
|
2
|
+
import { createClasses } from "../utils/classes.js";
|
|
3
|
+
const { staticClasses, useClasses } = createClasses("HvSelect", {
|
|
4
|
+
root: {
|
|
5
|
+
position: "relative",
|
|
6
|
+
"&$disabled,&$readOnly": {
|
|
7
|
+
pointerEvents: "none"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
disabled: {},
|
|
11
|
+
readOnly: {},
|
|
12
|
+
invalid: {
|
|
13
|
+
border: `1px solid ${theme.colors.negative}`
|
|
14
|
+
},
|
|
15
|
+
labelContainer: {
|
|
16
|
+
display: "flex",
|
|
17
|
+
alignItems: "flex-start"
|
|
18
|
+
},
|
|
19
|
+
label: {
|
|
20
|
+
display: "block",
|
|
21
|
+
paddingBottom: 6
|
|
22
|
+
},
|
|
23
|
+
description: {},
|
|
24
|
+
select: {},
|
|
25
|
+
popper: {
|
|
26
|
+
zIndex: theme.zIndices.popover
|
|
27
|
+
},
|
|
28
|
+
panel: {
|
|
29
|
+
border: `1px solid ${theme.colors.secondary}`,
|
|
30
|
+
marginTop: -1,
|
|
31
|
+
marginBottom: -1
|
|
32
|
+
},
|
|
33
|
+
panelOpenedUp: {
|
|
34
|
+
borderRadius: `${theme.radii.base} ${theme.radii.base} 0 0`
|
|
35
|
+
},
|
|
36
|
+
panelOpenedDown: {
|
|
37
|
+
borderRadius: `0 0 ${theme.radii.base} ${theme.radii.base}`
|
|
38
|
+
},
|
|
39
|
+
error: {}
|
|
40
|
+
});
|
|
41
|
+
export {
|
|
42
|
+
staticClasses,
|
|
43
|
+
useClasses
|
|
44
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.styles.js","sources":["../../../src/Select/Select.styles.ts"],"sourcesContent":["import { theme } from \"@hitachivantara/uikit-styles\";\n\nimport { createClasses } from \"../utils/classes\";\n\nexport const { staticClasses, useClasses } = createClasses(\"HvSelect\", {\n root: {\n position: \"relative\",\n \"&$disabled,&$readOnly\": {\n pointerEvents: \"none\",\n },\n },\n disabled: {},\n readOnly: {},\n invalid: {\n border: `1px solid ${theme.colors.negative}`,\n },\n labelContainer: {\n display: \"flex\",\n alignItems: \"flex-start\",\n },\n label: {\n display: \"block\",\n paddingBottom: 6,\n },\n description: {},\n select: {},\n popper: {\n zIndex: theme.zIndices.popover,\n },\n panel: {\n border: `1px solid ${theme.colors.secondary}`,\n marginTop: -1,\n marginBottom: -1,\n },\n panelOpenedUp: {\n borderRadius: `${theme.radii.base} ${theme.radii.base} 0 0`,\n },\n panelOpenedDown: {\n borderRadius: `0 0 ${theme.radii.base} ${theme.radii.base}`,\n },\n error: {},\n});\n"],"names":[],"mappings":";;AAIO,MAAM,EAAE,eAAe,eAAe,cAAc,YAAY;AAAA,EACrE,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,yBAAyB;AAAA,MACvB,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EACA,UAAU,CAAC;AAAA,EACX,UAAU,CAAC;AAAA,EACX,SAAS;AAAA,IACP,QAAQ,aAAa,MAAM,OAAO,QAAQ;AAAA,EAC5C;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AAAA,EACA,aAAa,CAAC;AAAA,EACd,QAAQ,CAAC;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,MAAM,SAAS;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,aAAa,MAAM,OAAO,SAAS;AAAA,IAC3C,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AAAA,EACA,eAAe;AAAA,IACb,cAAc,GAAG,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,EACvD;AAAA,EACA,iBAAiB;AAAA,IACf,cAAc,OAAO,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,EAC3D;AAAA,EACA,OAAO,CAAC;AACV,CAAC;"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsx } from "@emotion/react/jsx-runtime";
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { DropDownXS } from "@hitachivantara/uikit-react-icons";
|
|
4
|
+
import { theme } from "@hitachivantara/uikit-styles";
|
|
5
|
+
import { useDefaultProps } from "../hooks/useDefaultProps.js";
|
|
6
|
+
import { createClasses } from "../utils/classes.js";
|
|
7
|
+
import { HvButton } from "../Button/Button.js";
|
|
8
|
+
const { staticClasses, useClasses } = createClasses("HvSelectButton", {
|
|
9
|
+
root: {
|
|
10
|
+
width: "100%",
|
|
11
|
+
minWidth: "unset",
|
|
12
|
+
userSelect: "none",
|
|
13
|
+
position: "relative",
|
|
14
|
+
paddingLeft: theme.space.xs,
|
|
15
|
+
justifyContent: "flex-start"
|
|
16
|
+
},
|
|
17
|
+
disabled: {},
|
|
18
|
+
readOnly: {
|
|
19
|
+
userSelect: "text",
|
|
20
|
+
backgroundColor: theme.colors.atmo2
|
|
21
|
+
},
|
|
22
|
+
open: {
|
|
23
|
+
backgroundColor: theme.colors.atmo1
|
|
24
|
+
},
|
|
25
|
+
openUp: {
|
|
26
|
+
borderRadius: `0px 0px ${theme.radii.base} ${theme.radii.base}`
|
|
27
|
+
},
|
|
28
|
+
openDown: {
|
|
29
|
+
borderRadius: `${theme.radii.base} ${theme.radii.base} 0px 0px`
|
|
30
|
+
},
|
|
31
|
+
selection: {
|
|
32
|
+
color: "inherit",
|
|
33
|
+
flex: 1,
|
|
34
|
+
textAlign: "start",
|
|
35
|
+
overflow: "clip visible",
|
|
36
|
+
textOverflow: "ellipsis",
|
|
37
|
+
whiteSpace: "nowrap"
|
|
38
|
+
},
|
|
39
|
+
placeholder: {},
|
|
40
|
+
arrowContainer: {
|
|
41
|
+
marginRight: theme.spacing(-2)
|
|
42
|
+
},
|
|
43
|
+
arrow: {
|
|
44
|
+
transition: "rotate 0.2s ease"
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
const HvSelectButton = forwardRef((props, ref) => {
|
|
48
|
+
const {
|
|
49
|
+
classes: classesProp,
|
|
50
|
+
className,
|
|
51
|
+
open,
|
|
52
|
+
placement = "bottom",
|
|
53
|
+
disabled,
|
|
54
|
+
readOnly,
|
|
55
|
+
children,
|
|
56
|
+
adornment,
|
|
57
|
+
...others
|
|
58
|
+
} = useDefaultProps("HvSelectButton", props);
|
|
59
|
+
const { classes, cx } = useClasses(classesProp);
|
|
60
|
+
const endIcon = adornment ?? /* @__PURE__ */ jsx(
|
|
61
|
+
DropDownXS,
|
|
62
|
+
{
|
|
63
|
+
iconSize: "XS",
|
|
64
|
+
style: { rotate: open ? "180deg" : void 0 },
|
|
65
|
+
className: classes.arrow
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
HvButton,
|
|
70
|
+
{
|
|
71
|
+
ref,
|
|
72
|
+
variant: "secondarySubtle",
|
|
73
|
+
disabled: disabled || readOnly,
|
|
74
|
+
className: cx(classes.root, className, {
|
|
75
|
+
[classes.open]: open,
|
|
76
|
+
[classes.openUp]: open && placement.includes("top"),
|
|
77
|
+
[classes.openDown]: open && placement.includes("bottom"),
|
|
78
|
+
[classes.disabled]: disabled,
|
|
79
|
+
[classes.readOnly]: readOnly
|
|
80
|
+
}),
|
|
81
|
+
classes: { endIcon: classes.arrowContainer },
|
|
82
|
+
endIcon,
|
|
83
|
+
...others,
|
|
84
|
+
children: /* @__PURE__ */ jsx("div", { className: classes.selection, children: children && typeof children === "string" ? /* @__PURE__ */ jsx("div", { className: classes.placeholder, children }) : children })
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
});
|
|
88
|
+
export {
|
|
89
|
+
HvSelectButton,
|
|
90
|
+
staticClasses,
|
|
91
|
+
useClasses
|
|
92
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectButton.js","sources":["../../../src/Select/SelectButton.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { Placement } from \"@popperjs/core\";\nimport { DropDownXS } from \"@hitachivantara/uikit-react-icons\";\nimport { theme } from \"@hitachivantara/uikit-styles\";\n\nimport { useDefaultProps } from \"../hooks/useDefaultProps\";\nimport { ExtractNames, createClasses } from \"../utils/classes\";\nimport { HvButton } from \"../Button\";\n\nexport const { staticClasses, useClasses } = createClasses(\"HvSelectButton\", {\n root: {\n width: \"100%\",\n minWidth: \"unset\",\n userSelect: \"none\",\n position: \"relative\",\n paddingLeft: theme.space.xs,\n justifyContent: \"flex-start\",\n },\n disabled: {},\n readOnly: {\n userSelect: \"text\",\n backgroundColor: theme.colors.atmo2,\n },\n open: {\n backgroundColor: theme.colors.atmo1,\n },\n openUp: {\n borderRadius: `0px 0px ${theme.radii.base} ${theme.radii.base}`,\n },\n openDown: {\n borderRadius: `${theme.radii.base} ${theme.radii.base} 0px 0px`,\n },\n\n selection: {\n color: \"inherit\",\n flex: 1,\n textAlign: \"start\",\n\n overflow: \"clip visible\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n placeholder: {},\n arrowContainer: {\n marginRight: theme.spacing(-2),\n },\n arrow: {\n transition: \"rotate 0.2s ease\",\n },\n});\n\nexport type HvSelectButtonClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvSelectButtonProps\n extends React.HTMLAttributes<HTMLButtonElement> {\n readOnly?: boolean;\n open?: boolean;\n disabled?: boolean;\n placement?: Placement;\n adornment?: React.ReactNode;\n classes?: HvSelectButtonClasses;\n}\n\n/**\n * HvSelect internal header button component\n */\nexport const HvSelectButton = forwardRef<\n HTMLButtonElement,\n HvSelectButtonProps\n>((props, ref) => {\n const {\n classes: classesProp,\n className,\n open,\n placement = \"bottom\",\n disabled,\n readOnly,\n children,\n adornment,\n ...others\n } = useDefaultProps(\"HvSelectButton\", props);\n const { classes, cx } = useClasses(classesProp);\n\n const endIcon = adornment ?? (\n <DropDownXS\n iconSize=\"XS\"\n style={{ rotate: open ? \"180deg\" : undefined }}\n className={classes.arrow}\n />\n );\n\n return (\n <HvButton\n ref={ref}\n variant=\"secondarySubtle\"\n disabled={disabled || readOnly}\n className={cx(classes.root, className, {\n [classes.open]: open,\n [classes.openUp]: open && placement.includes(\"top\"),\n [classes.openDown]: open && placement.includes(\"bottom\"),\n [classes.disabled]: disabled,\n [classes.readOnly]: readOnly,\n })}\n classes={{ endIcon: classes.arrowContainer }}\n endIcon={endIcon}\n {...others}\n >\n <div className={classes.selection}>\n {children && typeof children === \"string\" ? (\n <div className={classes.placeholder}>{children}</div>\n ) : (\n children\n )}\n </div>\n </HvButton>\n );\n});\n"],"names":[],"mappings":";;;;;;;AASO,MAAM,EAAE,eAAe,eAAe,cAAc,kBAAkB;AAAA,EAC3E,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa,MAAM,MAAM;AAAA,IACzB,gBAAgB;AAAA,EAClB;AAAA,EACA,UAAU,CAAC;AAAA,EACX,UAAU;AAAA,IACR,YAAY;AAAA,IACZ,iBAAiB,MAAM,OAAO;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,iBAAiB,MAAM,OAAO;AAAA,EAChC;AAAA,EACA,QAAQ;AAAA,IACN,cAAc,WAAW,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,EAC/D;AAAA,EACA,UAAU;AAAA,IACR,cAAc,GAAG,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,EACvD;AAAA,EAEA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IAEX,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,aAAa,CAAC;AAAA,EACd,gBAAgB;AAAA,IACd,aAAa,MAAM,QAAQ,EAAE;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,EACd;AACF,CAAC;AAiBM,MAAM,iBAAiB,WAG5B,CAAC,OAAO,QAAQ;AACV,QAAA;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,IACD,gBAAgB,kBAAkB,KAAK;AAC3C,QAAM,EAAE,SAAS,GAAG,IAAI,WAAW,WAAW;AAE9C,QAAM,UAAU,aACd;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,OAAO,EAAE,QAAQ,OAAO,WAAW,OAAU;AAAA,MAC7C,WAAW,QAAQ;AAAA,IAAA;AAAA,EAAA;AAKrB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,SAAQ;AAAA,MACR,UAAU,YAAY;AAAA,MACtB,WAAW,GAAG,QAAQ,MAAM,WAAW;AAAA,QACrC,CAAC,QAAQ,IAAI,GAAG;AAAA,QAChB,CAAC,QAAQ,MAAM,GAAG,QAAQ,UAAU,SAAS,KAAK;AAAA,QAClD,CAAC,QAAQ,QAAQ,GAAG,QAAQ,UAAU,SAAS,QAAQ;AAAA,QACvD,CAAC,QAAQ,QAAQ,GAAG;AAAA,QACpB,CAAC,QAAQ,QAAQ,GAAG;AAAA,MAAA,CACrB;AAAA,MACD,SAAS,EAAE,SAAS,QAAQ,eAAe;AAAA,MAC3C;AAAA,MACC,GAAG;AAAA,MAEJ,8BAAC,OAAI,EAAA,WAAW,QAAQ,WACrB,sBAAY,OAAO,aAAa,WAC/B,oBAAC,SAAI,WAAW,QAAQ,aAAc,SAAA,CAAS,IAE/C,UAEJ;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;"}
|