fix: restore rule detail dependencies
This commit is contained in:
@@ -185,6 +185,28 @@ function fallbackDependencyOption(value: string, optionMap?: Map<string, Depende
|
||||
};
|
||||
}
|
||||
|
||||
function resolveRuleDependencies(
|
||||
rule: RuleSummary | undefined,
|
||||
rulesById: Map<string, RuleSummary>,
|
||||
visited = new Set<string>(),
|
||||
): string[] {
|
||||
if (!rule) return [];
|
||||
const key = rule.ruleId || rule.id;
|
||||
if (visited.has(key)) return [];
|
||||
visited.add(key);
|
||||
|
||||
const merged = new Set<string>((rule.dependencies || []).filter(Boolean));
|
||||
|
||||
(rule.subRuleIds || []).forEach((ruleId) => {
|
||||
const referenced = rulesById.get(ruleId);
|
||||
resolveRuleDependencies(referenced, rulesById, visited).forEach((dependency) => {
|
||||
if (dependency) merged.add(dependency);
|
||||
});
|
||||
});
|
||||
|
||||
return Array.from(merged);
|
||||
}
|
||||
|
||||
function makeId(prefix: string): string {
|
||||
return `${prefix}-${Date.now()}`;
|
||||
}
|
||||
@@ -571,29 +593,36 @@ export default function RulesTestDetail() {
|
||||
'ai_rule',
|
||||
'rule_group'
|
||||
]), [rules]);
|
||||
const rulesById = useMemo(() => new Map(rules.map(rule => [rule.ruleId || rule.id, rule])), [rules]);
|
||||
const selectedDependencyOptions = useMemo(() => {
|
||||
return ruleDraft.dependencies.map(value => dependencyOptionMap.get(value) || fallbackDependencyOption(value, dependencyOptionMap));
|
||||
}, [dependencyOptionMap, ruleDraft.dependencies]);
|
||||
const resolvedCurrentDependencies = useMemo(() => {
|
||||
return resolveRuleDependencies(currentRule, rulesById);
|
||||
}, [currentRule, rulesById]);
|
||||
const currentRuleWithResolvedDependencies = useMemo(() => (
|
||||
currentRule ? { ...currentRule, dependencies: resolvedCurrentDependencies } : undefined
|
||||
), [currentRule, resolvedCurrentDependencies]);
|
||||
const currentDependencyRows = useMemo(() => {
|
||||
return (currentRule?.dependencies || []).map(value => dependencyOptionMap.get(value) || fallbackDependencyOption(value, dependencyOptionMap));
|
||||
}, [currentRule, dependencyOptionMap]);
|
||||
return resolvedCurrentDependencies.map(value => dependencyOptionMap.get(value) || fallbackDependencyOption(value, dependencyOptionMap));
|
||||
}, [dependencyOptionMap, resolvedCurrentDependencies]);
|
||||
const currentRuleFields = useMemo(
|
||||
() => fields.filter((field) => matchesCurrentRuleDependency(currentRule, [field.name])),
|
||||
[currentRule, fields],
|
||||
() => fields.filter((field) => matchesCurrentRuleDependency(currentRuleWithResolvedDependencies, [field.name])),
|
||||
[currentRuleWithResolvedDependencies, fields],
|
||||
);
|
||||
const currentRuleSubDocuments = useMemo(
|
||||
() => subDocuments.filter((document) => matchesCurrentRuleDependency(currentRule, [document.name, document.id])),
|
||||
[currentRule, subDocuments],
|
||||
() => subDocuments.filter((document) => matchesCurrentRuleDependency(currentRuleWithResolvedDependencies, [document.name, document.id])),
|
||||
[currentRuleWithResolvedDependencies, subDocuments],
|
||||
);
|
||||
const currentRuleVisualElements = useMemo(
|
||||
() => visualElements.filter((item) => matchesCurrentRuleDependency(currentRule, [
|
||||
() => visualElements.filter((item) => matchesCurrentRuleDependency(currentRuleWithResolvedDependencies, [
|
||||
item.id,
|
||||
item.name,
|
||||
`visual.${item.id}`,
|
||||
`visual.${item.name || item.id}`,
|
||||
item.type,
|
||||
])),
|
||||
[currentRule, visualElements],
|
||||
[currentRuleWithResolvedDependencies, visualElements],
|
||||
);
|
||||
const dialogDependencyOptions = useMemo(() => {
|
||||
const selectedValues = new Set(ruleDraft.dependencies);
|
||||
@@ -644,7 +673,6 @@ export default function RulesTestDetail() {
|
||||
const fullYamlText = serializedYamlResult.yamlText;
|
||||
const isSmartRuleDraft = ruleDraft.type === 'ai_rule' || ruleDraft.checkTypes.includes('ai');
|
||||
const isRuleGroupDraft = ruleDraft.type === 'rule_group';
|
||||
const rulesById = useMemo(() => new Map(rules.map(rule => [rule.ruleId || rule.id, rule])), [rules]);
|
||||
const saveButtonBusy = saveFetcher.state !== 'idle';
|
||||
const latestDraftVersion = useMemo(
|
||||
() => versionItems.find((item) => !['published', 'rollback'].includes(item.status)),
|
||||
@@ -1362,7 +1390,7 @@ export default function RulesTestDetail() {
|
||||
|
||||
<Card
|
||||
className="ant-card"
|
||||
title={`依赖字段 (${currentRule.dependencies.length}项)`}
|
||||
title={`依赖字段 (${resolvedCurrentDependencies.length}项)`}
|
||||
>
|
||||
<Table
|
||||
className="rules-test-table"
|
||||
|
||||
Reference in New Issue
Block a user