sellmate-design-system-react 9.0.0-beta.4 → 9.0.0-beta.6

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/index.js CHANGED
@@ -4595,18 +4595,19 @@ function collectSelectableIds(node) {
4595
4595
  function toSelectedSet(value) {
4596
4596
  return new Set(value ?? []);
4597
4597
  }
4598
- function getSelectionState(node, selectedSet) {
4599
- if (selectedSet.has(node.id)) {
4600
- return { selected: true, indeterminate: false };
4598
+ var TREE_ALL_NODE = { id: "__all__", label: "\uC804\uCCB4" };
4599
+ function getSelectionState(node, selectedSet, cascadeSelection) {
4600
+ if (!cascadeSelection) {
4601
+ return { selected: selectedSet.has(node.id), indeterminate: false };
4601
4602
  }
4602
4603
  const selectableChildren = (node.children ?? []).filter(
4603
4604
  (child) => collectSelectableIds(child).length > 0
4604
4605
  );
4605
4606
  if (selectableChildren.length === 0) {
4606
- return { selected: false, indeterminate: false };
4607
+ return { selected: selectedSet.has(node.id), indeterminate: false };
4607
4608
  }
4608
4609
  const childStates = selectableChildren.map(
4609
- (child) => getSelectionState(child, selectedSet)
4610
+ (child) => getSelectionState(child, selectedSet, cascadeSelection)
4610
4611
  );
4611
4612
  const selectedCount = childStates.filter((state2) => state2.selected).length;
4612
4613
  return {
@@ -4651,6 +4652,40 @@ function TreeConnector({
4651
4652
  ] })
4652
4653
  ] });
4653
4654
  }
4655
+ function STreeAllItem({
4656
+ selected,
4657
+ indeterminate,
4658
+ border,
4659
+ onSelect
4660
+ }) {
4661
+ const checkboxValue = indeterminate ? null : selected;
4662
+ return /* @__PURE__ */ jsx(
4663
+ "div",
4664
+ {
4665
+ role: "treeitem",
4666
+ "aria-level": 1,
4667
+ "aria-selected": selected,
4668
+ onClick: onSelect,
4669
+ className: cn(
4670
+ "group/tree-item box-border flex h-[32px] w-full cursor-pointer items-center overflow-hidden bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left hover:bg-(--cmp-tree-item-bg-hover)",
4671
+ border && "border-b border-(--cmp-tree-item-border-default)"
4672
+ ),
4673
+ children: /* @__PURE__ */ jsxs("div", { className: "box-border flex h-full min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap) py-(--cmp-tree-item-paddingY)", children: [
4674
+ /* @__PURE__ */ jsx("span", { onClick: (event) => event.stopPropagation(), className: "flex shrink-0", children: /* @__PURE__ */ jsx(SCheckbox, { value: checkboxValue, onValueChange: () => onSelect() }) }),
4675
+ /* @__PURE__ */ jsx(
4676
+ "span",
4677
+ {
4678
+ className: cn(
4679
+ "block min-w-0 flex-1 truncate text-[14px] leading-[24px]",
4680
+ selected || indeterminate ? "font-bold text-(--cmp-tree-item-text-selected)" : "font-medium text-(--cmp-tree-item-text-default)"
4681
+ ),
4682
+ children: "\uC804\uCCB4"
4683
+ }
4684
+ )
4685
+ ] })
4686
+ }
4687
+ );
4688
+ }
4654
4689
  var STreeItemImpl = /* @__PURE__ */ forwardRef(function STreeItem({
4655
4690
  node,
4656
4691
  depth = 1,
@@ -4701,7 +4736,7 @@ var STreeItemImpl = /* @__PURE__ */ forwardRef(function STreeItem({
4701
4736
  "aria-disabled": node.disabled || void 0,
4702
4737
  onClick: handleRowClick,
4703
4738
  className: cn(
4704
- "group/tree-item flex min-h-[32px] w-full items-center gap-(--cmp-tree-item-rowGap) bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left",
4739
+ "group/tree-item box-border flex h-[32px] w-full items-center gap-(--cmp-tree-item-rowGap) overflow-hidden bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left",
4705
4740
  border && "border-b border-(--cmp-tree-item-border-default)",
4706
4741
  !node.disabled && "hover:bg-(--cmp-tree-item-bg-hover)",
4707
4742
  node.disabled && "cursor-not-allowed opacity-60",
@@ -4720,7 +4755,7 @@ var STreeItemImpl = /* @__PURE__ */ forwardRef(function STreeItem({
4720
4755
  ancestorLast
4721
4756
  }
4722
4757
  ),
4723
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap) py-(--cmp-tree-item-paddingY)", children: [
4758
+ /* @__PURE__ */ jsxs("div", { className: "box-border flex h-full min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap) py-(--cmp-tree-item-paddingY)", children: [
4724
4759
  hasChildren ? /* @__PURE__ */ jsx(
4725
4760
  SGhostButton,
4726
4761
  {
@@ -4756,25 +4791,17 @@ var STreeItemImpl = /* @__PURE__ */ forwardRef(function STreeItem({
4756
4791
  /* @__PURE__ */ jsx(
4757
4792
  "span",
4758
4793
  {
4794
+ onClick: (event) => {
4795
+ if (!selectable) return;
4796
+ event.stopPropagation();
4797
+ if (!node.disabled && selectable) onTreeSelect?.(node, event);
4798
+ },
4759
4799
  className: cn(
4760
- "min-w-0 flex-1 text-[14px] leading-[24px]",
4761
- selected || indeterminate ? "font-bold text-(--cmp-tree-item-text-selected)" : "font-medium text-(--cmp-tree-item-text-default)"
4800
+ "block min-w-0 flex-1 truncate text-[14px] leading-[24px]",
4801
+ selected || indeterminate ? "font-bold text-(--cmp-tree-item-text-selected)" : "font-medium text-(--cmp-tree-item-text-default)",
4802
+ node.disabled ? "cursor-not-allowed" : selectable ? "cursor-pointer" : void 0
4762
4803
  ),
4763
- children: /* @__PURE__ */ jsx(
4764
- "span",
4765
- {
4766
- onClick: (event) => {
4767
- if (!selectable) return;
4768
- event.stopPropagation();
4769
- if (!node.disabled && selectable) onTreeSelect?.(node, event);
4770
- },
4771
- className: cn(
4772
- "inline-block max-w-full truncate",
4773
- node.disabled ? "cursor-not-allowed" : selectable ? "cursor-pointer" : void 0
4774
- ),
4775
- children: node.label
4776
- }
4777
- )
4804
+ children: node.label
4778
4805
  }
4779
4806
  ),
4780
4807
  trailingNode
@@ -4791,6 +4818,7 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
4791
4818
  expandedIds,
4792
4819
  defaultExpandedIds,
4793
4820
  selectable = true,
4821
+ useAll = false,
4794
4822
  cascadeSelection = true,
4795
4823
  guideline = true,
4796
4824
  border = true,
@@ -4809,6 +4837,11 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
4809
4837
  const currentExpandedIds = expandedIds ?? internalExpandedIds;
4810
4838
  const selectedSet = useMemo(() => toSelectedSet(currentValue), [currentValue]);
4811
4839
  const expandedSet = useMemo(() => new Set(currentExpandedIds), [currentExpandedIds]);
4840
+ const selectableIds = useMemo(() => items.flatMap(collectSelectableIds), [items]);
4841
+ const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedSet.has(id));
4842
+ const someSelected = selectableIds.some((id) => selectedSet.has(id));
4843
+ const allIndeterminate = someSelected && !allSelected;
4844
+ const showAllItem = selectable && useAll;
4812
4845
  const updateExpanded = (node) => {
4813
4846
  const next = new Set(currentExpandedIds);
4814
4847
  if (next.has(node.id)) next.delete(node.id);
@@ -4820,7 +4853,7 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
4820
4853
  const updateSelected = (node) => {
4821
4854
  if (node.disabled) return;
4822
4855
  const targetIds = cascadeSelection ? collectSelectableIds(node) : [node.id];
4823
- const everySelected = getSelectionState(node, selectedSet).selected;
4856
+ const everySelected = getSelectionState(node, selectedSet, cascadeSelection).selected;
4824
4857
  const next = new Set(selectedSet);
4825
4858
  targetIds.forEach((id) => {
4826
4859
  if (everySelected) next.delete(id);
@@ -4830,10 +4863,22 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
4830
4863
  if (value === void 0) setInternalValue(orderedIds);
4831
4864
  onValueChange?.(orderedIds, node);
4832
4865
  };
4866
+ const updateAllSelected = (event) => {
4867
+ event?.stopPropagation();
4868
+ if (selectableIds.length === 0) return;
4869
+ const next = new Set(selectedSet);
4870
+ selectableIds.forEach((id) => {
4871
+ if (allSelected) next.delete(id);
4872
+ else next.add(id);
4873
+ });
4874
+ const orderedIds = collectIds(items).filter((id) => next.has(id));
4875
+ if (value === void 0) setInternalValue(orderedIds);
4876
+ onValueChange?.(orderedIds, TREE_ALL_NODE);
4877
+ };
4833
4878
  const renderNodes = (nodes, depth = 1, ancestorLast = []) => nodes.map((node, index) => {
4834
4879
  const isLast = index === nodes.length - 1;
4835
4880
  const isExpanded = expandedSet.has(node.id);
4836
- const { selected, indeterminate } = getSelectionState(node, selectedSet);
4881
+ const { selected, indeterminate } = getSelectionState(node, selectedSet, cascadeSelection);
4837
4882
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [
4838
4883
  /* @__PURE__ */ jsx(
4839
4884
  STreeItem2,
@@ -4867,14 +4912,25 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
4867
4912
  ) : null
4868
4913
  ] }, node.id);
4869
4914
  });
4870
- return /* @__PURE__ */ jsx(
4915
+ return /* @__PURE__ */ jsxs(
4871
4916
  "div",
4872
4917
  {
4873
4918
  ref,
4874
4919
  role: "tree",
4875
4920
  className: cn("flex w-full flex-col items-start bg-(--cmp-tree-item-bg-default)", className),
4876
4921
  ...rest,
4877
- children: renderNodes(items)
4922
+ children: [
4923
+ showAllItem && /* @__PURE__ */ jsx(
4924
+ STreeAllItem,
4925
+ {
4926
+ selected: allSelected,
4927
+ indeterminate: allIndeterminate,
4928
+ border,
4929
+ onSelect: updateAllSelected
4930
+ }
4931
+ ),
4932
+ renderNodes(items)
4933
+ ]
4878
4934
  }
4879
4935
  );
4880
4936
  });