|
1 | 1 | import Immutable, { fromJS } from "immutable";
|
2 | 2 | import {
|
3 |
| - expandTreePath, expandTreeSubpath, getItemByPath, fixPathsInTree, |
| 3 | + expandTreePath, expandTreeSubpath, getItemByPath, getAncestorRuleGroups, fixPathsInTree, |
4 | 4 | getTotalRulesCountInTree, fixEmptyGroupsInTree, isEmptyTree, hasChildren, removeIsLockedInTree
|
5 | 5 | } from "../utils/treeUtils";
|
6 | 6 | import {
|
@@ -50,7 +50,7 @@ const addNewGroup = (state, path, type, generatedId, properties, config, childre
|
50 | 50 |
|
51 | 51 | // Add one empty rule into new group
|
52 | 52 | if (canAddNewRule) {
|
53 |
| - state = addItem(state, groupPath, "rule", uuid(), defaultRuleProperties(config), config); |
| 53 | + state = addItem(state, groupPath, "rule", uuid(), defaultRuleProperties(config, meta?.parentRuleGroupField), config); |
54 | 54 | }
|
55 | 55 | }
|
56 | 56 |
|
@@ -226,13 +226,30 @@ const addItem = (state, path, type, generatedId, properties, config, children =
|
226 | 226 | currentNumber = targetChildrenSize;
|
227 | 227 | maxNumber = maxNumberOfCases;
|
228 | 228 | } else if (type === "group") {
|
229 |
| - currentNumber = path.size; |
230 |
| - maxNumber = maxNesting; |
231 |
| - } else if (targetItem?.get("type") === "rule_group") { |
232 |
| - // don't restrict |
233 |
| - } else { |
234 |
| - currentNumber = isTernary ? getTotalRulesCountInTree(caseGroup) : getTotalRulesCountInTree(state); |
235 |
| - maxNumber = maxNumberOfRules; |
| 229 | + const ruleGroups = getAncestorRuleGroups(state, path); |
| 230 | + if (ruleGroups.length) { |
| 231 | + // closest rule-group |
| 232 | + const { path: ruleGroupPath, field: ruleGroupField } = ruleGroups[0]; |
| 233 | + const ruleGroupFieldConfig = getFieldConfig(config, ruleGroupField); |
| 234 | + currentNumber = path.size - ruleGroupPath.length; |
| 235 | + maxNumber = ruleGroupFieldConfig?.maxNesting; |
| 236 | + } else { |
| 237 | + currentNumber = path.size; |
| 238 | + maxNumber = maxNesting; |
| 239 | + } |
| 240 | + } else { // rule or rule_group |
| 241 | + const ruleGroups = getAncestorRuleGroups(state, path); |
| 242 | + if (ruleGroups.length) { |
| 243 | + // closest rule-group |
| 244 | + const { path: ruleGroupPath, field: ruleGroupField } = ruleGroups[0]; |
| 245 | + const ruleGroupFieldConfig = getFieldConfig(config, ruleGroupField); |
| 246 | + const ruleGroupItem = getItemByPath(state, ruleGroupPath); |
| 247 | + maxNumber = ruleGroupFieldConfig?.maxNumberOfRules; |
| 248 | + currentNumber = getTotalRulesCountInTree(ruleGroupItem); |
| 249 | + } else { |
| 250 | + currentNumber = isTernary ? getTotalRulesCountInTree(caseGroup) : getTotalRulesCountInTree(state); |
| 251 | + maxNumber = maxNumberOfRules; |
| 252 | + } |
236 | 253 | }
|
237 | 254 | const canAdd = maxNumber && currentNumber ? (currentNumber < maxNumber) : true;
|
238 | 255 |
|
@@ -573,7 +590,7 @@ const setField = (state, path, newField, config, asyncListValues, _meta = {}) =>
|
573 | 590 | const {canReuseValue, newValue, newValueSrc, newValueType, operatorCardinality} = getNewValueForFieldOp(
|
574 | 591 | config, config, currentProperties, newField, newOperator, "field", canFix, isEndValue, canDropArgs
|
575 | 592 | );
|
576 |
| - let groupProperties = defaultGroupProperties(config, newFieldConfig).merge({ |
| 593 | + let groupProperties = defaultGroupProperties(config, newFieldConfig, newField).merge({ |
577 | 594 | field: newField,
|
578 | 595 | fieldSrc: "field",
|
579 | 596 | mode: newFieldConfig.mode,
|
|
0 commit comments