@hitachivantara/uikit-react-core
Version:
Core React components for the NEXT Design System.
212 lines (211 loc) • 7.24 kB
JavaScript
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
import { useCallback } from "react";
import { HvIcon } from "../../icons.js";
import { useQueryBuilderContext } from "../Context.js";
import { useClasses } from "../QueryBuilder.styles.js";
import { HvButton } from "../../Button/Button.js";
import { Rule } from "../Rule/Rule.js";
import { HvEmptyState } from "../../EmptyState/EmptyState.js";
import { HvMultiButton } from "../../MultiButton/MultiButton.js";
import { HvIconButton } from "../../IconButton/IconButton.js";
import { HvTypography } from "../../Typography/Typography.js";
const RuleGroup = ({
level = 0,
id,
combinator = "and",
rules = [],
classes: classesProp
}) => {
const { classes, cx } = useClasses(classesProp);
const {
dispatchAction,
askAction,
maxDepth,
combinators,
labels,
readOnly,
disableConfirmation,
allowRepeatedAttributes
} = useQueryBuilderContext();
const normalizedMaxDepth = maxDepth - 1;
const actionButtons = /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx("div", { className: classes.buttonBackground, children: /* @__PURE__ */ jsx(
HvButton,
{
variant: "secondarySubtle",
onClick: () => {
dispatchAction({ type: "add-rule", id });
},
disabled: readOnly,
startIcon: /* @__PURE__ */ jsx(HvIcon, { compact: true, name: "Add" }),
children: level === 0 && labels.query?.addRule?.label != null ? labels.query?.addRule?.label : labels.group.addRule.label
}
) }),
level <= normalizedMaxDepth && /* @__PURE__ */ jsx("div", { className: classes.buttonBackground, children: /* @__PURE__ */ jsx(
HvButton,
{
variant: "secondarySubtle",
onClick: () => {
dispatchAction({ type: "add-group", id });
},
disabled: readOnly,
startIcon: /* @__PURE__ */ jsx(HvIcon, { compact: true, name: "Add" }),
children: level === 0 && labels.query?.addGroup?.label != null ? labels.query?.addGroup?.label : labels.group.addGroup.label
}
) })
] });
const onClickCombinator = useCallback(
(item) => {
dispatchAction({
type: "set-combinator",
id,
combinator: item.operand
});
},
[dispatchAction, id]
);
return /* @__PURE__ */ jsxs(
"div",
{
className: cx(classes.root, {
[classes.topGroup]: level === 0,
[classes.subGroup]: level > 0
}),
children: [
/* @__PURE__ */ jsx(
HvMultiButton,
{
className: cx(classes.combinator, classes.topCombinator),
disabled: readOnly,
"aria-disabled": readOnly,
children: combinators?.map((item) => /* @__PURE__ */ jsx(
HvButton,
{
className: classes.combinatorButton,
selected: item.operand === combinator,
onClick: () => item.operand && onClickCombinator(item),
disabled: readOnly,
size: "xs",
children: item.label
},
item.operand
))
}
),
/* @__PURE__ */ jsx("div", { className: cx(classes.buttonBackground, classes.topRemoveButton), children: /* @__PURE__ */ jsx(
HvIconButton,
{
className: classes.removeButton,
onClick: () => disableConfirmation ? dispatchAction({ type: "remove-node", id }) : askAction({
actions: [{ type: "remove-node", id }],
dialog: level === 0 && labels.query?.delete != null ? labels.query.delete : labels.group.delete
}),
title: level === 0 && labels.query?.delete?.tooltip || labels.group.delete.tooltip || level === 0 && labels.query?.delete?.ariaLabel || labels.group.delete.ariaLabel,
disabled: readOnly,
children: /* @__PURE__ */ jsx(
HvIcon,
{
name: "Delete",
className: cx({ [classes.topRemoveButtonDisabled]: readOnly })
}
)
}
) }),
rules?.length > 0 && /* @__PURE__ */ jsx(
"div",
{
className: cx(classes.rulesContainer, {
[classes.subRulesContainer]: level > 0,
[classes.topRulesContainer]: level === 0
}),
children: rules.map((rule, index) => {
if ("combinator" in rule) {
return /* @__PURE__ */ jsx(
RuleGroup,
{
level: level + 1,
...rule,
id: rule.id,
classes
},
rule.id
);
}
const isInvalid = allowRepeatedAttributes ? false : combinator === "and" && rules.some((r, i) => {
if ("attribute" in r) {
if (r.attribute === rule.attribute && r.id !== rule.id && i < index) {
return true;
}
}
return false;
});
return /* @__PURE__ */ jsx(
Rule,
{
...rule,
isInvalid,
id: rule.id,
combinator
},
rule.id
);
})
}
),
rules?.length === 0 && /* @__PURE__ */ jsx(
HvEmptyState,
{
title: labels.empty?.title,
message: /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx(
HvTypography,
{
link: true,
component: "button",
onClick: () => {
dispatchAction({ type: "add-rule", id });
},
className: classes.createConditionButton,
disabled: readOnly,
"aria-disabled": readOnly,
children: `${labels.empty?.createCondition}`
}
),
level <= normalizedMaxDepth && /* @__PURE__ */ jsxs(Fragment, { children: [
`${labels.empty?.spacer}`,
/* @__PURE__ */ jsx(
HvTypography,
{
link: true,
component: "button",
onClick: () => {
dispatchAction({ type: "add-group", id });
},
className: classes.createGroupButton,
disabled: readOnly,
"aria-disabled": readOnly,
children: `${labels.empty?.createGroup}`
}
)
] })
] }),
icon: /* @__PURE__ */ jsx(HvIcon, { name: "Info" })
}
),
/* @__PURE__ */ jsx(
"div",
{
className: cx(
classes.actionButtonContainer,
classes.topActionButtonContainer
),
children: actionButtons
}
)
]
}
);
};
export {
RuleGroup
};