@wordpress/components
Version:
UI components for WordPress.
62 lines (61 loc) • 1.95 kB
JavaScript
// packages/components/src/tree-select/index.tsx
import { useMemo } from "@wordpress/element";
import { decodeEntities } from "@wordpress/html-entities";
import { SelectControl } from "../select-control";
import { useDeprecated36pxDefaultSizeProp } from "../utils/use-deprecated-props";
import { ContextSystemProvider } from "../context";
import { maybeWarnDeprecated36pxSize } from "../utils/deprecated-36px-size";
import { jsx as _jsx } from "react/jsx-runtime";
var CONTEXT_VALUE = {
BaseControl: {
// Temporary during deprecation grace period: Overrides the underlying `__associatedWPComponentName`
// via the context system to override the value set by SelectControl.
_overrides: {
__associatedWPComponentName: "TreeSelect"
}
}
};
function getSelectOptions(tree, level = 0) {
return tree.flatMap((treeNode) => [{
value: treeNode.id,
label: "\xA0".repeat(level * 3) + decodeEntities(treeNode.name)
}, ...getSelectOptions(treeNode.children || [], level + 1)]);
}
function TreeSelect(props) {
const {
label,
noOptionLabel,
onChange,
selectedId,
tree = [],
...restProps
} = useDeprecated36pxDefaultSizeProp(props);
const options = useMemo(() => {
return [noOptionLabel && {
value: "",
label: noOptionLabel
}, ...getSelectOptions(tree)].filter((option) => !!option);
}, [noOptionLabel, tree]);
maybeWarnDeprecated36pxSize({
componentName: "TreeSelect",
size: restProps.size,
__next40pxDefaultSize: restProps.__next40pxDefaultSize
});
return /* @__PURE__ */ _jsx(ContextSystemProvider, {
value: CONTEXT_VALUE,
children: /* @__PURE__ */ _jsx(SelectControl, {
__shouldNotWarnDeprecated36pxSize: true,
label,
options,
onChange,
value: selectedId,
...restProps
})
});
}
var tree_select_default = TreeSelect;
export {
TreeSelect,
tree_select_default as default
};
//# sourceMappingURL=index.js.map