@mantine/core 9.0.0-alpha.6 → 9.0.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.
Files changed (199) hide show
  1. package/cjs/components/Autocomplete/Autocomplete.cjs +1 -0
  2. package/cjs/components/Autocomplete/Autocomplete.cjs.map +1 -1
  3. package/cjs/components/Badge/Badge.module.cjs.map +1 -1
  4. package/cjs/components/Button/Button.module.cjs.map +1 -1
  5. package/cjs/components/Checkbox/Checkbox.cjs +2 -1
  6. package/cjs/components/Checkbox/Checkbox.cjs.map +1 -1
  7. package/cjs/components/Checkbox/CheckboxIndicator/CheckboxIndicator.cjs +2 -1
  8. package/cjs/components/Checkbox/CheckboxIndicator/CheckboxIndicator.cjs.map +1 -1
  9. package/cjs/components/Chip/Chip.module.cjs.map +1 -1
  10. package/cjs/components/Combobox/use-combobox-target-props/use-combobox-target-props.cjs +1 -0
  11. package/cjs/components/Combobox/use-combobox-target-props/use-combobox-target-props.cjs.map +1 -1
  12. package/cjs/components/MultiSelect/MultiSelect.cjs +1 -0
  13. package/cjs/components/MultiSelect/MultiSelect.cjs.map +1 -1
  14. package/cjs/components/PasswordInput/PasswordInput.cjs +2 -0
  15. package/cjs/components/PasswordInput/PasswordInput.cjs.map +1 -1
  16. package/cjs/components/Pill/Pill.module.cjs.map +1 -1
  17. package/cjs/components/Popover/PopoverTarget/PopoverTarget.cjs +2 -2
  18. package/cjs/components/Popover/PopoverTarget/PopoverTarget.cjs.map +1 -1
  19. package/cjs/components/Radio/Radio.cjs +1 -1
  20. package/cjs/components/Radio/Radio.cjs.map +1 -1
  21. package/cjs/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
  22. package/cjs/components/Select/Select.cjs +7 -6
  23. package/cjs/components/Select/Select.cjs.map +1 -1
  24. package/cjs/components/Stepper/Stepper.cjs.map +1 -1
  25. package/cjs/components/Stepper/Stepper.module.cjs +1 -0
  26. package/cjs/components/Stepper/Stepper.module.cjs.map +1 -1
  27. package/cjs/components/Stepper/StepperStep/StepperStep.cjs +8 -5
  28. package/cjs/components/Stepper/StepperStep/StepperStep.cjs.map +1 -1
  29. package/cjs/components/TagsInput/TagsInput.cjs +1 -0
  30. package/cjs/components/TagsInput/TagsInput.cjs.map +1 -1
  31. package/cjs/components/Timeline/TimelineItem/TimelineItem.cjs +1 -1
  32. package/cjs/components/Timeline/TimelineItem/TimelineItem.cjs.map +1 -1
  33. package/cjs/core/MantineProvider/default-theme.cjs +1 -1
  34. package/cjs/core/MantineProvider/default-theme.cjs.map +1 -1
  35. package/esm/components/Autocomplete/Autocomplete.mjs +1 -0
  36. package/esm/components/Autocomplete/Autocomplete.mjs.map +1 -1
  37. package/esm/components/Badge/Badge.module.mjs.map +1 -1
  38. package/esm/components/Button/Button.module.mjs.map +1 -1
  39. package/esm/components/Checkbox/Checkbox.mjs +2 -1
  40. package/esm/components/Checkbox/Checkbox.mjs.map +1 -1
  41. package/esm/components/Checkbox/CheckboxIndicator/CheckboxIndicator.mjs +2 -1
  42. package/esm/components/Checkbox/CheckboxIndicator/CheckboxIndicator.mjs.map +1 -1
  43. package/esm/components/Chip/Chip.module.mjs.map +1 -1
  44. package/esm/components/Combobox/use-combobox-target-props/use-combobox-target-props.mjs +1 -0
  45. package/esm/components/Combobox/use-combobox-target-props/use-combobox-target-props.mjs.map +1 -1
  46. package/esm/components/MultiSelect/MultiSelect.mjs +1 -0
  47. package/esm/components/MultiSelect/MultiSelect.mjs.map +1 -1
  48. package/esm/components/PasswordInput/PasswordInput.mjs +2 -0
  49. package/esm/components/PasswordInput/PasswordInput.mjs.map +1 -1
  50. package/esm/components/Pill/Pill.module.mjs.map +1 -1
  51. package/esm/components/Popover/PopoverTarget/PopoverTarget.mjs +2 -2
  52. package/esm/components/Popover/PopoverTarget/PopoverTarget.mjs.map +1 -1
  53. package/esm/components/Radio/Radio.mjs +1 -1
  54. package/esm/components/Radio/Radio.mjs.map +1 -1
  55. package/esm/components/SegmentedControl/SegmentedControl.module.mjs.map +1 -1
  56. package/esm/components/Select/Select.mjs +7 -6
  57. package/esm/components/Select/Select.mjs.map +1 -1
  58. package/esm/components/Stepper/Stepper.mjs.map +1 -1
  59. package/esm/components/Stepper/Stepper.module.mjs +1 -0
  60. package/esm/components/Stepper/Stepper.module.mjs.map +1 -1
  61. package/esm/components/Stepper/StepperStep/StepperStep.mjs +8 -5
  62. package/esm/components/Stepper/StepperStep/StepperStep.mjs.map +1 -1
  63. package/esm/components/TagsInput/TagsInput.mjs +1 -0
  64. package/esm/components/TagsInput/TagsInput.mjs.map +1 -1
  65. package/esm/components/Timeline/TimelineItem/TimelineItem.mjs +1 -1
  66. package/esm/components/Timeline/TimelineItem/TimelineItem.mjs.map +1 -1
  67. package/esm/core/MantineProvider/default-theme.mjs +1 -1
  68. package/esm/core/MantineProvider/default-theme.mjs.map +1 -1
  69. package/esm/core/utils/get-env/get-env.mjs +1 -1
  70. package/esm/core/utils/get-env/get-env.mjs.map +1 -1
  71. package/lib/components/Combobox/use-combobox-target-props/use-combobox-target-props.d.ts +0 -16
  72. package/lib/components/Input/InputClearSection/InputClearSection.d.ts +1 -1
  73. package/lib/components/Input/use-input-props.d.ts +18 -18
  74. package/lib/components/Popover/use-popover.d.ts +2 -2
  75. package/lib/components/Stepper/Stepper.d.ts +1 -1
  76. package/lib/components/Stepper/StepperStep/StepperStep.d.ts +1 -1
  77. package/lib/core/MantineProvider/color-functions/get-contrast-color/get-contrast-color.d.ts +2 -2
  78. package/package.json +4 -4
  79. package/styles/Badge.css +2 -0
  80. package/styles/Badge.layer.css +2 -0
  81. package/styles/Button.css +2 -0
  82. package/styles/Button.layer.css +2 -0
  83. package/styles/Chip.css +2 -0
  84. package/styles/Chip.layer.css +2 -0
  85. package/styles/Pill.css +5 -2
  86. package/styles/Pill.layer.css +5 -2
  87. package/styles/SegmentedControl.css +3 -3
  88. package/styles/SegmentedControl.layer.css +3 -3
  89. package/styles/Stepper.css +4 -0
  90. package/styles/Stepper.layer.css +4 -0
  91. package/styles/default-css-variables.css +1 -1
  92. package/styles/default-css-variables.layer.css +1 -1
  93. package/styles.css +19 -6
  94. package/styles.layer.css +19 -6
  95. package/cjs/components/MaskInput/MaskInput.cjs +0 -24
  96. package/cjs/components/MaskInput/MaskInput.cjs.map +0 -1
  97. package/cjs/components/MaskInput/use-mask-input-props.cjs +0 -29
  98. package/cjs/components/MaskInput/use-mask-input-props.cjs.map +0 -1
  99. package/cjs/components/Pagination/PaginationLabel/PaginationLabel.cjs +0 -33
  100. package/cjs/components/Pagination/PaginationLabel/PaginationLabel.cjs.map +0 -1
  101. package/cjs/components/RollingNumber/DigitColumn.cjs +0 -41
  102. package/cjs/components/RollingNumber/DigitColumn.cjs.map +0 -1
  103. package/cjs/components/RollingNumber/RollingNumber.cjs +0 -100
  104. package/cjs/components/RollingNumber/RollingNumber.cjs.map +0 -1
  105. package/cjs/components/RollingNumber/RollingNumber.module.cjs +0 -12
  106. package/cjs/components/RollingNumber/RollingNumber.module.cjs.map +0 -1
  107. package/cjs/components/RollingNumber/build-value.cjs +0 -22
  108. package/cjs/components/RollingNumber/build-value.cjs.map +0 -1
  109. package/cjs/components/RollingNumber/get-digit-parts.cjs +0 -40
  110. package/cjs/components/RollingNumber/get-digit-parts.cjs.map +0 -1
  111. package/cjs/components/RollingNumber/get-render-slots.cjs +0 -78
  112. package/cjs/components/RollingNumber/get-render-slots.cjs.map +0 -1
  113. package/cjs/components/Tree/FlatTreeNode.cjs +0 -102
  114. package/cjs/components/Tree/FlatTreeNode.cjs.map +0 -1
  115. package/cjs/components/Tree/filter-tree-data/filter-tree-data.cjs +0 -23
  116. package/cjs/components/Tree/filter-tree-data/filter-tree-data.cjs.map +0 -1
  117. package/cjs/components/Tree/flatten-tree-data/flatten-tree-data.cjs +0 -28
  118. package/cjs/components/Tree/flatten-tree-data/flatten-tree-data.cjs.map +0 -1
  119. package/cjs/components/Tree/merge-async-children/merge-async-children.cjs +0 -32
  120. package/cjs/components/Tree/merge-async-children/merge-async-children.cjs.map +0 -1
  121. package/cjs/components/Tree/move-tree-node/move-tree-node.cjs +0 -78
  122. package/cjs/components/Tree/move-tree-node/move-tree-node.cjs.map +0 -1
  123. package/cjs/components/Tree/use-tree-node-drag-drop.cjs +0 -96
  124. package/cjs/components/Tree/use-tree-node-drag-drop.cjs.map +0 -1
  125. package/cjs/components/TreeSelect/TreeSelect.cjs +0 -594
  126. package/cjs/components/TreeSelect/TreeSelect.cjs.map +0 -1
  127. package/cjs/components/TreeSelect/TreeSelect.module.cjs +0 -16
  128. package/cjs/components/TreeSelect/TreeSelect.module.cjs.map +0 -1
  129. package/cjs/components/TreeSelect/TreeSelectOption.cjs +0 -91
  130. package/cjs/components/TreeSelect/TreeSelectOption.cjs.map +0 -1
  131. package/cjs/components/TreeSelect/flatten-tree-select-data.cjs +0 -34
  132. package/cjs/components/TreeSelect/flatten-tree-select-data.cjs.map +0 -1
  133. package/cjs/components/TreeSelect/get-checked-values-by-strategy.cjs +0 -30
  134. package/cjs/components/TreeSelect/get-checked-values-by-strategy.cjs.map +0 -1
  135. package/esm/components/MaskInput/MaskInput.mjs +0 -23
  136. package/esm/components/MaskInput/MaskInput.mjs.map +0 -1
  137. package/esm/components/MaskInput/use-mask-input-props.mjs +0 -28
  138. package/esm/components/MaskInput/use-mask-input-props.mjs.map +0 -1
  139. package/esm/components/Pagination/PaginationLabel/PaginationLabel.mjs +0 -32
  140. package/esm/components/Pagination/PaginationLabel/PaginationLabel.mjs.map +0 -1
  141. package/esm/components/RollingNumber/DigitColumn.mjs +0 -40
  142. package/esm/components/RollingNumber/DigitColumn.mjs.map +0 -1
  143. package/esm/components/RollingNumber/RollingNumber.mjs +0 -99
  144. package/esm/components/RollingNumber/RollingNumber.mjs.map +0 -1
  145. package/esm/components/RollingNumber/RollingNumber.module.mjs +0 -12
  146. package/esm/components/RollingNumber/RollingNumber.module.mjs.map +0 -1
  147. package/esm/components/RollingNumber/build-value.mjs +0 -22
  148. package/esm/components/RollingNumber/build-value.mjs.map +0 -1
  149. package/esm/components/RollingNumber/get-digit-parts.mjs +0 -40
  150. package/esm/components/RollingNumber/get-digit-parts.mjs.map +0 -1
  151. package/esm/components/RollingNumber/get-render-slots.mjs +0 -78
  152. package/esm/components/RollingNumber/get-render-slots.mjs.map +0 -1
  153. package/esm/components/Tree/FlatTreeNode.mjs +0 -101
  154. package/esm/components/Tree/FlatTreeNode.mjs.map +0 -1
  155. package/esm/components/Tree/filter-tree-data/filter-tree-data.mjs +0 -22
  156. package/esm/components/Tree/filter-tree-data/filter-tree-data.mjs.map +0 -1
  157. package/esm/components/Tree/flatten-tree-data/flatten-tree-data.mjs +0 -28
  158. package/esm/components/Tree/flatten-tree-data/flatten-tree-data.mjs.map +0 -1
  159. package/esm/components/Tree/merge-async-children/merge-async-children.mjs +0 -32
  160. package/esm/components/Tree/merge-async-children/merge-async-children.mjs.map +0 -1
  161. package/esm/components/Tree/move-tree-node/move-tree-node.mjs +0 -78
  162. package/esm/components/Tree/move-tree-node/move-tree-node.mjs.map +0 -1
  163. package/esm/components/Tree/use-tree-node-drag-drop.mjs +0 -96
  164. package/esm/components/Tree/use-tree-node-drag-drop.mjs.map +0 -1
  165. package/esm/components/TreeSelect/TreeSelect.mjs +0 -593
  166. package/esm/components/TreeSelect/TreeSelect.mjs.map +0 -1
  167. package/esm/components/TreeSelect/TreeSelect.module.mjs +0 -16
  168. package/esm/components/TreeSelect/TreeSelect.module.mjs.map +0 -1
  169. package/esm/components/TreeSelect/TreeSelectOption.mjs +0 -90
  170. package/esm/components/TreeSelect/TreeSelectOption.mjs.map +0 -1
  171. package/esm/components/TreeSelect/flatten-tree-select-data.mjs +0 -34
  172. package/esm/components/TreeSelect/flatten-tree-select-data.mjs.map +0 -1
  173. package/esm/components/TreeSelect/get-checked-values-by-strategy.mjs +0 -29
  174. package/esm/components/TreeSelect/get-checked-values-by-strategy.mjs.map +0 -1
  175. package/lib/components/MaskInput/MaskInput.d.ts +0 -68
  176. package/lib/components/MaskInput/index.d.ts +0 -7
  177. package/lib/components/MaskInput/use-mask-input-props.d.ts +0 -428
  178. package/lib/components/Pagination/PaginationLabel/PaginationLabel.d.ts +0 -22
  179. package/lib/components/RollingNumber/DigitColumn.d.ts +0 -10
  180. package/lib/components/RollingNumber/RollingNumber.d.ts +0 -39
  181. package/lib/components/RollingNumber/build-value.d.ts +0 -10
  182. package/lib/components/RollingNumber/get-digit-parts.d.ts +0 -12
  183. package/lib/components/RollingNumber/get-render-slots.d.ts +0 -35
  184. package/lib/components/RollingNumber/index.d.ts +0 -9
  185. package/lib/components/Tree/FlatTreeNode.d.ts +0 -34
  186. package/lib/components/Tree/filter-tree-data/filter-tree-data.d.ts +0 -4
  187. package/lib/components/Tree/flatten-tree-data/flatten-tree-data.d.ts +0 -15
  188. package/lib/components/Tree/merge-async-children/merge-async-children.d.ts +0 -2
  189. package/lib/components/Tree/move-tree-node/move-tree-node.d.ts +0 -11
  190. package/lib/components/Tree/use-tree-node-drag-drop.d.ts +0 -18
  191. package/lib/components/TreeSelect/TreeSelect.d.ts +0 -122
  192. package/lib/components/TreeSelect/TreeSelectOption.d.ts +0 -29
  193. package/lib/components/TreeSelect/flatten-tree-select-data.d.ts +0 -12
  194. package/lib/components/TreeSelect/get-checked-values-by-strategy.d.ts +0 -4
  195. package/lib/components/TreeSelect/index.d.ts +0 -13
  196. package/styles/RollingNumber.css +0 -50
  197. package/styles/RollingNumber.layer.css +0 -51
  198. package/styles/TreeSelect.css +0 -113
  199. package/styles/TreeSelect.layer.css +0 -114
@@ -1,593 +0,0 @@
1
- "use client";
2
- import { useProps } from "../../core/MantineProvider/use-props/use-props.mjs";
3
- import { useResolvedStylesApi } from "../../core/styles-api/use-resolved-styles-api/use-resolved-styles-api.mjs";
4
- import { useStyles } from "../../core/styles-api/use-styles/use-styles.mjs";
5
- import { extractStyleProps } from "../../core/Box/style-props/extract-style-props/extract-style-props.mjs";
6
- import { genericFactory } from "../../core/factory/factory.mjs";
7
- import { ScrollArea } from "../ScrollArea/ScrollArea.mjs";
8
- import { InputBase } from "../InputBase/InputBase.mjs";
9
- import { useCombobox } from "../Combobox/use-combobox/use-combobox.mjs";
10
- import { Combobox } from "../Combobox/Combobox.mjs";
11
- import { Pill } from "../Pill/Pill.mjs";
12
- import { PillsInput } from "../PillsInput/PillsInput.mjs";
13
- import { findTreeNode, getChildrenNodesValues } from "../Tree/get-children-nodes-values/get-children-nodes-values.mjs";
14
- import { isNodeChecked } from "../Tree/is-node-checked/is-node-checked.mjs";
15
- import { isNodeIndeterminate } from "../Tree/is-node-indeterminate/is-node-indeterminate.mjs";
16
- import { getTreeExpandedState } from "../Tree/use-tree.mjs";
17
- import { filterTreeData } from "../Tree/filter-tree-data/filter-tree-data.mjs";
18
- import { flattenTreeSelectData } from "./flatten-tree-select-data.mjs";
19
- import { checkedToValue, expandToLeafChecked } from "./get-checked-values-by-strategy.mjs";
20
- import TreeSelect_module_default from "./TreeSelect.module.mjs";
21
- import { TreeSelectOption } from "./TreeSelectOption.mjs";
22
- import { useCallback, useEffect, useMemo, useRef } from "react";
23
- import { useId as useId$1, useUncontrolled } from "@mantine/hooks";
24
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
25
- //#region packages/@mantine/core/src/components/TreeSelect/TreeSelect.tsx
26
- const defaultProps = {
27
- mode: "single",
28
- allowDeselect: true,
29
- checkedStrategy: "child",
30
- maxValues: Infinity,
31
- hiddenInputValuesDivider: ",",
32
- clearSearchOnChange: true,
33
- openOnFocus: true,
34
- size: "sm",
35
- withLines: true
36
- };
37
- const clearSectionOffset = {
38
- xs: 41,
39
- sm: 50,
40
- md: 60,
41
- lg: 72,
42
- xl: 89
43
- };
44
- function getAncestorsToNode(value, nodes) {
45
- for (const node of nodes) {
46
- if (node.value === value) return [];
47
- if (Array.isArray(node.children)) {
48
- const path = getAncestorsToNode(value, node.children);
49
- if (path !== null) return [node.value, ...path];
50
- }
51
- }
52
- return null;
53
- }
54
- const TreeSelect = genericFactory((_props) => {
55
- const props = useProps("TreeSelect", defaultProps, _props);
56
- const { classNames, className, style, styles, unstyled, vars, size, data, mode, value, defaultValue, onChange, checkStrictly, checkedStrategy, defaultExpandedValues, defaultExpandAll, expandedValues, onExpandedChange, expandOnClick, searchable, searchValue, defaultSearchValue, onSearchChange, filter, nothingFoundMessage, allowDeselect, clearable, clearSectionMode, clearButtonProps, maxValues, maxDisplayedValues, maxDisplayedValuesContent, onRemove, onClear, renderNode, withLines, hiddenInputProps, hiddenInputValuesDivider, scrollAreaProps, chevronColor, maxDropdownHeight, dropdownOpened, defaultDropdownOpened, onDropdownOpen, onDropdownClose, comboboxProps, clearSearchOnChange, openOnFocus, variant, onKeyDown, onFocus, onBlur, onClick, readOnly, disabled, radius, rightSection, rightSectionWidth, rightSectionPointerEvents, rightSectionProps, leftSection, leftSectionWidth, leftSectionPointerEvents, leftSectionProps, inputContainer, inputWrapperOrder, withAsterisk, labelProps, descriptionProps, errorProps, wrapperProps, description, label, error, withErrorStyles, name, form, id, placeholder, required, mod, attributes, ...others } = props;
57
- const isMulti = mode === "multiple" || mode === "checkbox";
58
- const isCheckbox = mode === "checkbox";
59
- const _id = useId$1(id);
60
- const combobox = useCombobox({
61
- opened: dropdownOpened,
62
- defaultOpened: defaultDropdownOpened,
63
- onDropdownOpen: () => {
64
- onDropdownOpen?.();
65
- combobox.updateSelectedOptionIndex("active", { scrollIntoView: true });
66
- },
67
- onDropdownClose: () => {
68
- onDropdownClose?.();
69
- combobox.resetSelectedOption();
70
- }
71
- });
72
- const initialExpanded = useMemo(() => {
73
- if (defaultExpandAll) return getTreeExpandedState(data, "*");
74
- if (defaultExpandedValues) return getTreeExpandedState(data, defaultExpandedValues);
75
- return getTreeExpandedState(data, []);
76
- }, []);
77
- const [_expandedState, setExpandedState] = useUncontrolled({
78
- value: useCallback((values) => {
79
- if (!values) return;
80
- return getTreeExpandedState(data, values);
81
- }, [data])(expandedValues),
82
- defaultValue: initialExpanded,
83
- finalValue: {},
84
- onChange: (val) => {
85
- if (onExpandedChange) onExpandedChange(Object.entries(val).filter(([, v]) => v).map(([k]) => k));
86
- }
87
- });
88
- const toggleExpand = useCallback((nodeValue) => {
89
- setExpandedState({
90
- ..._expandedState,
91
- [nodeValue]: !_expandedState[nodeValue]
92
- });
93
- }, [_expandedState]);
94
- const [_searchValue, setSearchValue] = useUncontrolled({
95
- value: searchValue,
96
- defaultValue: defaultSearchValue,
97
- finalValue: useMemo(() => {
98
- if (mode !== "single" || !defaultValue) return "";
99
- const node = findTreeNode(defaultValue, data);
100
- return node ? typeof node.label === "string" ? node.label : "" : "";
101
- }, []),
102
- onChange: onSearchChange
103
- });
104
- const handleSearchChange = (val) => {
105
- setSearchValue(val);
106
- combobox.resetSelectedOption();
107
- };
108
- const [_value, setValue] = useUncontrolled({
109
- value,
110
- defaultValue,
111
- finalValue: isMulti ? [] : null,
112
- onChange
113
- });
114
- const internalChecked = useMemo(() => {
115
- if (!isCheckbox || !_value || !Array.isArray(_value)) return [];
116
- if (checkStrictly) return _value;
117
- return expandToLeafChecked(_value, data);
118
- }, [
119
- isCheckbox,
120
- _value,
121
- data,
122
- checkStrictly
123
- ]);
124
- const filteredData = useMemo(() => {
125
- if (!searchable || !_searchValue) return data;
126
- if (mode === "single" && _value) {
127
- const node = findTreeNode(_value, data);
128
- if (node && _searchValue === (typeof node.label === "string" ? node.label : "")) return data;
129
- }
130
- return filterTreeData(data, _searchValue, filter);
131
- }, [
132
- data,
133
- _searchValue,
134
- filter,
135
- searchable,
136
- mode,
137
- _value
138
- ]);
139
- const expandedForRender = useMemo(() => {
140
- if (_searchValue && filteredData !== data) {
141
- const expanded = { ..._expandedState };
142
- const expandFilteredParents = (nodes) => {
143
- for (const node of nodes) if (Array.isArray(node.children) && node.children.length > 0) {
144
- expanded[node.value] = true;
145
- expandFilteredParents(node.children);
146
- }
147
- };
148
- expandFilteredParents(filteredData);
149
- return expanded;
150
- }
151
- return _expandedState;
152
- }, [
153
- filteredData,
154
- _expandedState,
155
- _searchValue,
156
- data
157
- ]);
158
- const flatNodes = useMemo(() => flattenTreeSelectData(filteredData, expandedForRender), [filteredData, expandedForRender]);
159
- const flatNodesRef = useRef(flatNodes);
160
- flatNodesRef.current = flatNodes;
161
- const nodeLookup = useMemo(() => {
162
- const lookup = {};
163
- const walk = (nodes) => {
164
- for (const node of nodes) {
165
- lookup[node.value] = node;
166
- if (Array.isArray(node.children)) walk(node.children);
167
- }
168
- };
169
- walk(data);
170
- return lookup;
171
- }, [data]);
172
- const getNodeLabel = (nodeValue) => {
173
- const node = nodeLookup[nodeValue];
174
- if (!node) return nodeValue;
175
- return typeof node.label === "string" ? node.label : nodeValue;
176
- };
177
- const getStyles = useStyles({
178
- name: "TreeSelect",
179
- classes: {},
180
- props,
181
- classNames,
182
- styles,
183
- unstyled,
184
- attributes
185
- });
186
- const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi({
187
- props,
188
- styles,
189
- classNames
190
- });
191
- const { styleProps, rest: { type, autoComplete, ...rest } } = extractStyleProps(others);
192
- const handleOptionSubmit = (val) => {
193
- if (mode === "single") {
194
- if (expandOnClick) {
195
- const node = findTreeNode(val, data);
196
- if (node && Array.isArray(node.children) && node.children.length > 0) {
197
- toggleExpand(val);
198
- return;
199
- }
200
- }
201
- const nextValue = allowDeselect && val === _value ? null : val;
202
- setValue(nextValue);
203
- combobox.closeDropdown();
204
- if (clearSearchOnChange) handleSearchChange(nextValue ? getNodeLabel(nextValue) : "");
205
- } else if (mode === "multiple") {
206
- if (expandOnClick) {
207
- const node = findTreeNode(val, data);
208
- if (node && Array.isArray(node.children) && node.children.length > 0) {
209
- toggleExpand(val);
210
- return;
211
- }
212
- }
213
- if (clearSearchOnChange) setSearchValue("");
214
- const arr = _value || [];
215
- if (arr.includes(val)) {
216
- setValue(arr.filter((v) => v !== val));
217
- onRemove?.(val);
218
- } else if (arr.length < (maxValues ?? Infinity)) setValue([...arr, val]);
219
- } else if (mode === "checkbox") {
220
- if (clearSearchOnChange) setSearchValue("");
221
- const nodeChecked = checkStrictly ? internalChecked.includes(val) : isNodeChecked(val, data, internalChecked);
222
- let newInternalChecked;
223
- if (checkStrictly) newInternalChecked = nodeChecked ? internalChecked.filter((v) => v !== val) : [...internalChecked, val];
224
- else {
225
- const childLeaves = getChildrenNodesValues(val, data);
226
- if (nodeChecked) newInternalChecked = internalChecked.filter((v) => !childLeaves.includes(v));
227
- else newInternalChecked = [...new Set([...internalChecked, ...childLeaves])];
228
- }
229
- const newValue = checkedToValue(newInternalChecked, data, checkedStrategy);
230
- if (!nodeChecked && newValue.length > (maxValues ?? Infinity)) return;
231
- setValue(newValue);
232
- if (expandOnClick) {
233
- const node = findTreeNode(val, data);
234
- if (node && Array.isArray(node.children) && node.children.length > 0) {
235
- if (!_expandedState[val]) toggleExpand(val);
236
- }
237
- }
238
- }
239
- };
240
- const handleKeyDown = (event) => {
241
- onKeyDown?.(event);
242
- if (event.key === " " && !searchable && isMulti) {
243
- event.preventDefault();
244
- combobox.toggleDropdown();
245
- }
246
- if (event.key === "Backspace" && _searchValue.length === 0 && isMulti) {
247
- const arr = _value || [];
248
- if (arr.length > 0) {
249
- const removed = arr[arr.length - 1];
250
- onRemove?.(removed);
251
- setValue(arr.slice(0, -1));
252
- }
253
- }
254
- if (!combobox.dropdownOpened) return;
255
- const index = combobox.getSelectedOptionIndex();
256
- if (index < 0 || index >= flatNodesRef.current.length) return;
257
- const currentNode = flatNodesRef.current[index];
258
- if (event.key === "ArrowRight") {
259
- if (currentNode.hasChildren && !currentNode.expanded) {
260
- event.preventDefault();
261
- toggleExpand(currentNode.node.value);
262
- }
263
- }
264
- if (event.key === "ArrowLeft") {
265
- if (currentNode.hasChildren && currentNode.expanded) {
266
- event.preventDefault();
267
- toggleExpand(currentNode.node.value);
268
- } else if (currentNode.parent) {
269
- event.preventDefault();
270
- const parentIndex = flatNodesRef.current.findIndex((n) => n.node.value === currentNode.parent);
271
- if (parentIndex >= 0) combobox.selectOption(parentIndex);
272
- }
273
- }
274
- };
275
- useEffect(() => {
276
- if (mode !== "single" || !searchable) return;
277
- if (value === null) handleSearchChange("");
278
- else if (typeof value === "string") handleSearchChange(getNodeLabel(value));
279
- }, [value]);
280
- const prevDropdownOpenedRef = useRef(false);
281
- useEffect(() => {
282
- if (combobox.dropdownOpened && !prevDropdownOpenedRef.current && searchable && _value) {
283
- const targets = Array.isArray(_value) ? _value : [_value];
284
- const newExpanded = { ..._expandedState };
285
- let changed = false;
286
- for (const target of targets) {
287
- const ancestors = getAncestorsToNode(target, data);
288
- if (ancestors) {
289
- for (const a of ancestors) if (!newExpanded[a]) {
290
- newExpanded[a] = true;
291
- changed = true;
292
- }
293
- }
294
- }
295
- if (changed) {
296
- setExpandedState(newExpanded);
297
- requestAnimationFrame(() => {
298
- combobox.updateSelectedOptionIndex("active", { scrollIntoView: true });
299
- });
300
- }
301
- }
302
- prevDropdownOpenedRef.current = combobox.dropdownOpened;
303
- });
304
- const clearButton = /* @__PURE__ */ jsx(Combobox.ClearButton, {
305
- ...clearButtonProps,
306
- onClear: () => {
307
- onClear?.();
308
- setValue(isMulti ? [] : null);
309
- handleSearchChange("");
310
- }
311
- });
312
- const hasValue = isMulti ? Array.isArray(_value) && _value.length > 0 : _value != null && _value !== "";
313
- const _clearable = clearable && hasValue && !disabled && !readOnly;
314
- const singleDisplayLabel = useMemo(() => {
315
- if (mode !== "single" || !_value) return "";
316
- return getNodeLabel(_value);
317
- }, [
318
- mode,
319
- _value,
320
- nodeLookup
321
- ]);
322
- const displayValues = useMemo(() => {
323
- if (!isMulti || !Array.isArray(_value)) return [];
324
- return _value;
325
- }, [isMulti, _value]);
326
- const pillsListStyle = _clearable && isMulti ? { paddingInlineEnd: clearSectionOffset[size] ?? clearSectionOffset.sm } : void 0;
327
- const visiblePills = maxDisplayedValues != null ? displayValues.slice(0, maxDisplayedValues) : displayValues;
328
- const overflowCount = maxDisplayedValues != null ? Math.max(0, displayValues.length - maxDisplayedValues) : 0;
329
- const pills = visiblePills.map((item, index) => /* @__PURE__ */ jsx(Pill, {
330
- withRemoveButton: !readOnly,
331
- onRemove: () => {
332
- if (isCheckbox) {
333
- const childLeaves = checkStrictly ? [item] : getChildrenNodesValues(item, data);
334
- setValue(checkedToValue(internalChecked.filter((v) => !childLeaves.includes(v)), data, checkedStrategy));
335
- } else setValue(_value.filter((v) => v !== item));
336
- onRemove?.(item);
337
- },
338
- unstyled,
339
- disabled,
340
- ...getStyles("pill"),
341
- children: getNodeLabel(item)
342
- }, `${item}-${index}`));
343
- if (overflowCount > 0) {
344
- const overflowContent = typeof maxDisplayedValuesContent === "function" ? maxDisplayedValuesContent(overflowCount) : maxDisplayedValuesContent || `+${overflowCount} more`;
345
- pills.push(/* @__PURE__ */ jsx(Pill, {
346
- unstyled,
347
- disabled,
348
- ...getStyles("pill"),
349
- children: overflowContent
350
- }, "__overflow"));
351
- }
352
- const isEmpty = flatNodes.length === 0;
353
- const options = flatNodes.map((flatNode) => {
354
- const isSelected = mode === "single" ? _value === flatNode.node.value : mode === "multiple" ? (_value || []).includes(flatNode.node.value) : false;
355
- const nodeChecked = isCheckbox ? checkStrictly ? internalChecked.includes(flatNode.node.value) : isNodeChecked(flatNode.node.value, data, internalChecked) : false;
356
- const nodeIndeterminate = isCheckbox && !checkStrictly ? isNodeIndeterminate(flatNode.node.value, data, internalChecked) : false;
357
- return /* @__PURE__ */ jsx(TreeSelectOption, {
358
- node: flatNode.node,
359
- level: flatNode.level,
360
- expanded: flatNode.expanded,
361
- hasChildren: flatNode.hasChildren,
362
- selected: isSelected,
363
- checked: nodeChecked,
364
- indeterminate: nodeIndeterminate,
365
- showCheckbox: isCheckbox,
366
- isLastChild: flatNode.isLastChild,
367
- lineGuides: flatNode.lineGuides,
368
- withLines: !!withLines,
369
- onToggleExpand: toggleExpand,
370
- renderNode
371
- }, flatNode.node.value);
372
- });
373
- const dropdown = /* @__PURE__ */ jsx(Combobox.Dropdown, {
374
- hidden: readOnly || disabled,
375
- children: /* @__PURE__ */ jsxs(Combobox.Options, {
376
- className: TreeSelect_module_default.optionsWrapper,
377
- children: [/* @__PURE__ */ jsx(ScrollArea.Autosize, {
378
- mah: maxDropdownHeight ?? 220,
379
- type: "scroll",
380
- scrollbarSize: "var(--combobox-padding)",
381
- offsetScrollbars: "y",
382
- ...scrollAreaProps,
383
- children: options
384
- }), isEmpty && nothingFoundMessage && /* @__PURE__ */ jsx(Combobox.Empty, { children: nothingFoundMessage })]
385
- })
386
- });
387
- if (isMulti) return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Combobox, {
388
- store: combobox,
389
- classNames: resolvedClassNames,
390
- styles: resolvedStyles,
391
- unstyled,
392
- size,
393
- readOnly,
394
- __staticSelector: "TreeSelect",
395
- attributes,
396
- onOptionSubmit: handleOptionSubmit,
397
- ...comboboxProps,
398
- children: [/* @__PURE__ */ jsx(Combobox.DropdownTarget, { children: /* @__PURE__ */ jsx(PillsInput, {
399
- ...styleProps,
400
- __staticSelector: "TreeSelect",
401
- classNames: resolvedClassNames,
402
- styles: resolvedStyles,
403
- unstyled,
404
- size,
405
- className,
406
- style,
407
- variant,
408
- disabled,
409
- radius,
410
- __defaultRightSection: /* @__PURE__ */ jsx(Combobox.Chevron, {
411
- size,
412
- error,
413
- unstyled,
414
- color: chevronColor
415
- }),
416
- __clearSection: clearButton,
417
- __clearable: _clearable,
418
- __clearSectionMode: clearSectionMode,
419
- rightSection,
420
- rightSectionPointerEvents: rightSectionPointerEvents || "none",
421
- rightSectionWidth,
422
- rightSectionProps,
423
- leftSection,
424
- leftSectionWidth,
425
- leftSectionPointerEvents,
426
- leftSectionProps,
427
- inputContainer,
428
- inputWrapperOrder,
429
- withAsterisk,
430
- labelProps,
431
- descriptionProps,
432
- errorProps,
433
- wrapperProps,
434
- description,
435
- label,
436
- error,
437
- withErrorStyles,
438
- __stylesApiProps: {
439
- ...props,
440
- rightSectionPointerEvents: rightSectionPointerEvents || "none",
441
- multiline: true
442
- },
443
- pointer: !searchable,
444
- onClick: () => searchable ? combobox.openDropdown() : combobox.toggleDropdown(),
445
- "data-expanded": combobox.dropdownOpened || void 0,
446
- id: _id,
447
- required,
448
- mod,
449
- attributes,
450
- children: /* @__PURE__ */ jsxs(Pill.Group, {
451
- attributes,
452
- disabled,
453
- unstyled,
454
- ...getStyles("pillsList", { style: pillsListStyle }),
455
- children: [pills, /* @__PURE__ */ jsx(Combobox.EventsTarget, {
456
- autoComplete,
457
- children: /* @__PURE__ */ jsx(PillsInput.Field, {
458
- ...rest,
459
- id: _id,
460
- placeholder,
461
- type: !searchable && !placeholder ? "hidden" : "visible",
462
- ...getStyles("inputField"),
463
- unstyled,
464
- onFocus: (event) => {
465
- onFocus?.(event);
466
- if (openOnFocus && searchable) combobox.openDropdown();
467
- },
468
- onBlur: (event) => {
469
- onBlur?.(event);
470
- combobox.closeDropdown();
471
- handleSearchChange("");
472
- },
473
- onKeyDown: handleKeyDown,
474
- value: _searchValue,
475
- onChange: (event) => {
476
- handleSearchChange(event.currentTarget.value);
477
- if (searchable) combobox.openDropdown();
478
- },
479
- disabled,
480
- readOnly: readOnly || !searchable,
481
- pointer: !searchable
482
- })
483
- })]
484
- })
485
- }) }), dropdown]
486
- }), /* @__PURE__ */ jsx(Combobox.HiddenInput, {
487
- name,
488
- valuesDivider: hiddenInputValuesDivider,
489
- value: _value,
490
- form,
491
- disabled,
492
- ...hiddenInputProps
493
- })] });
494
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs(Combobox, {
495
- store: combobox,
496
- __staticSelector: "TreeSelect",
497
- classNames: resolvedClassNames,
498
- styles: resolvedStyles,
499
- unstyled,
500
- readOnly,
501
- size,
502
- attributes,
503
- onOptionSubmit: handleOptionSubmit,
504
- ...comboboxProps,
505
- children: [/* @__PURE__ */ jsx(Combobox.Target, {
506
- targetType: searchable ? "input" : "button",
507
- autoComplete,
508
- children: /* @__PURE__ */ jsx(InputBase, {
509
- id: _id,
510
- __defaultRightSection: /* @__PURE__ */ jsx(Combobox.Chevron, {
511
- size,
512
- error,
513
- unstyled,
514
- color: chevronColor
515
- }),
516
- __clearSection: clearButton,
517
- __clearable: _clearable,
518
- __clearSectionMode: clearSectionMode,
519
- rightSection,
520
- rightSectionPointerEvents: rightSectionPointerEvents || "none",
521
- ...rest,
522
- ...styleProps,
523
- size,
524
- __staticSelector: "TreeSelect",
525
- disabled,
526
- readOnly: readOnly || !searchable,
527
- value: searchable ? _searchValue : singleDisplayLabel,
528
- onChange: (event) => {
529
- handleSearchChange(event.currentTarget.value);
530
- combobox.openDropdown();
531
- },
532
- onFocus: (event) => {
533
- if (openOnFocus && searchable) combobox.openDropdown();
534
- onFocus?.(event);
535
- },
536
- onBlur: (event) => {
537
- if (searchable) combobox.closeDropdown();
538
- handleSearchChange(_value ? getNodeLabel(_value) : "");
539
- onBlur?.(event);
540
- },
541
- onClick: (event) => {
542
- searchable ? combobox.openDropdown() : combobox.toggleDropdown();
543
- onClick?.(event);
544
- },
545
- onKeyDown: handleKeyDown,
546
- classNames: resolvedClassNames,
547
- styles: resolvedStyles,
548
- unstyled,
549
- pointer: !searchable,
550
- error,
551
- attributes,
552
- className,
553
- style,
554
- variant,
555
- radius,
556
- leftSection,
557
- leftSectionWidth,
558
- leftSectionPointerEvents,
559
- leftSectionProps,
560
- rightSectionWidth,
561
- rightSectionProps,
562
- inputContainer,
563
- inputWrapperOrder,
564
- withAsterisk,
565
- labelProps,
566
- descriptionProps,
567
- errorProps,
568
- wrapperProps,
569
- description,
570
- label,
571
- withErrorStyles,
572
- placeholder,
573
- required,
574
- mod
575
- })
576
- }), dropdown]
577
- }), /* @__PURE__ */ jsx(Combobox.HiddenInput, {
578
- value: _value,
579
- name,
580
- form,
581
- disabled,
582
- ...hiddenInputProps
583
- })] });
584
- });
585
- TreeSelect.classes = {
586
- ...InputBase.classes,
587
- ...Combobox.classes
588
- };
589
- TreeSelect.displayName = "@mantine/core/TreeSelect";
590
- //#endregion
591
- export { TreeSelect };
592
-
593
- //# sourceMappingURL=TreeSelect.mjs.map