fix: avoid infinite loop (#2974)

* fix: avoid infinite loop

* perf: avoid infinite loop

* fix: build errors
This commit is contained in:
被雨水过滤的空气-Rain 2023-11-06 14:21:28 +08:00 committed by GitHub
parent ac3f63b110
commit f1e387e65e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 17 additions and 31 deletions

View File

@ -83,13 +83,12 @@ export const Action: ComposedAction = observer(
operator: h.operator, operator: h.operator,
field, field,
condition: v.condition, condition: v.condition,
values: record,
variables, variables,
localVariables, localVariables,
}); });
}); });
}); });
}, [JSON.stringify(linkageRules), record, designable, field]); }, [JSON.stringify(linkageRules), designable, field]);
const handleButtonClick = useCallback( const handleButtonClick = useCallback(
(e: React.MouseEvent) => { (e: React.MouseEvent) => {

View File

@ -75,14 +75,12 @@ export const linkageAction = async ({
operator, operator,
field, field,
condition, condition,
values,
variables, variables,
localVariables, localVariables,
}: { }: {
operator; operator;
field; field;
condition; condition;
values;
variables: VariablesContextType; variables: VariablesContextType;
localVariables: VariableOption[]; localVariables: VariableOption[];
}) => { }) => {
@ -91,7 +89,7 @@ export const linkageAction = async ({
switch (operator) { switch (operator) {
case ActionType.Visible: case ActionType.Visible:
if (await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables })) { if (await conditionAnalyses({ rules: condition, variables, localVariables })) {
displayResult.push(operator); displayResult.push(operator);
field.data = field.data || {}; field.data = field.data || {};
field.data.hidden = false; field.data.hidden = false;
@ -103,7 +101,7 @@ export const linkageAction = async ({
field.display = last(displayResult); field.display = last(displayResult);
break; break;
case ActionType.Hidden: case ActionType.Hidden:
if (await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables })) { if (await conditionAnalyses({ rules: condition, variables, localVariables })) {
field.data = field.data || {}; field.data = field.data || {};
field.data.hidden = true; field.data.hidden = true;
} else { } else {
@ -112,7 +110,7 @@ export const linkageAction = async ({
} }
break; break;
case ActionType.Disabled: case ActionType.Disabled:
if (await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables })) { if (await conditionAnalyses({ rules: condition, variables, localVariables })) {
disableResult.push(true); disableResult.push(true);
} }
field.linkageProperty = { field.linkageProperty = {
@ -123,7 +121,7 @@ export const linkageAction = async ({
field.componentProps['disabled'] = last(disableResult); field.componentProps['disabled'] = last(disableResult);
break; break;
case ActionType.Active: case ActionType.Active:
if (await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables })) { if (await conditionAnalyses({ rules: condition, variables, localVariables })) {
disableResult.push(false); disableResult.push(false);
} else { } else {
disableResult.push(true); disableResult.push(true);

View File

@ -138,7 +138,7 @@ const getEnd = (offset: any, unit: any) => {
export const getDateRanges = () => { export const getDateRanges = () => {
return { return {
now: () => dayjs(), now: () => dayjs().toISOString(),
today: () => [getStart(0, 'day'), getEnd(0, 'day')], today: () => [getStart(0, 'day'), getEnd(0, 'day')],
yesterday: () => [getStart(-1, 'day'), getEnd(-1, 'day')], yesterday: () => [getStart(-1, 'day'), getEnd(-1, 'day')],
tomorrow: () => [getStart(1, 'day'), getEnd(1, 'day')], tomorrow: () => [getStart(1, 'day'), getEnd(1, 'day')],

View File

@ -2,7 +2,7 @@ import { css } from '@emotion/css';
import { FormLayout } from '@formily/antd-v5'; import { FormLayout } from '@formily/antd-v5';
import { createForm, Field, Form as FormilyForm, onFieldChange, onFieldInit, onFormInputChange } from '@formily/core'; import { createForm, Field, Form as FormilyForm, onFieldChange, onFieldInit, onFormInputChange } from '@formily/core';
import { FieldContext, FormContext, observer, RecursionField, useField, useFieldSchema } from '@formily/react'; import { FieldContext, FormContext, observer, RecursionField, useField, useFieldSchema } from '@formily/react';
import { autorun } from '@formily/reactive'; import { autorun, raw } from '@formily/reactive';
import { uid } from '@formily/shared'; import { uid } from '@formily/shared';
import { ConfigProvider, Spin } from 'antd'; import { ConfigProvider, Spin } from 'antd';
import React, { useEffect, useMemo } from 'react'; import React, { useEffect, useMemo } from 'react';
@ -134,7 +134,7 @@ const WithForm = (props: WithFormProps) => {
value: h.value, value: h.value,
field, field,
condition: v.condition, condition: v.condition,
values: form?.values, values: raw(form?.values),
variables, variables,
localVariables, localVariables,
}); });

View File

@ -1,7 +1,7 @@
import { Field } from '@formily/core'; import { Field } from '@formily/core';
import { evaluators } from '@nocobase/evaluators/client'; import { evaluators } from '@nocobase/evaluators/client';
import { uid } from '@nocobase/utils'; import { uid } from '@nocobase/utils';
import _, { cloneDeep, last } from 'lodash'; import _, { last } from 'lodash';
import { ActionType } from '../../../schema-settings/LinkageRules/type'; import { ActionType } from '../../../schema-settings/LinkageRules/type';
import { VariableOption, VariablesContextType } from '../../../variables/types'; import { VariableOption, VariablesContextType } from '../../../variables/types';
import { REGEX_OF_VARIABLE } from '../../../variables/utils/isVariable'; import { REGEX_OF_VARIABLE } from '../../../variables/utils/isVariable';
@ -36,7 +36,7 @@ export const linkageMergeAction = async ({
switch (operator) { switch (operator) {
case ActionType.Required: case ActionType.Required:
if (await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables })) { if (await conditionAnalyses({ rules: condition, variables, localVariables })) {
requiredResult.push(true); requiredResult.push(true);
} }
field.linkageProperty = { field.linkageProperty = {
@ -50,7 +50,7 @@ export const linkageMergeAction = async ({
resolve(void 0); resolve(void 0);
}); });
case ActionType.InRequired: case ActionType.InRequired:
if (await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables })) { if (await conditionAnalyses({ rules: condition, variables, localVariables })) {
requiredResult.push(false); requiredResult.push(false);
} }
field.linkageProperty = { field.linkageProperty = {
@ -66,7 +66,7 @@ export const linkageMergeAction = async ({
case ActionType.Visible: case ActionType.Visible:
case ActionType.None: case ActionType.None:
case ActionType.Hidden: case ActionType.Hidden:
if (await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables })) { if (await conditionAnalyses({ rules: condition, variables, localVariables })) {
displayResult.push(operator); displayResult.push(operator);
} }
field.linkageProperty = { field.linkageProperty = {
@ -82,7 +82,7 @@ export const linkageMergeAction = async ({
case ActionType.Editable: case ActionType.Editable:
case ActionType.ReadOnly: case ActionType.ReadOnly:
case ActionType.ReadPretty: case ActionType.ReadPretty:
if (await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables })) { if (await conditionAnalyses({ rules: condition, variables, localVariables })) {
patternResult.push(operator); patternResult.push(operator);
} }
field.linkageProperty = { field.linkageProperty = {
@ -96,17 +96,12 @@ export const linkageMergeAction = async ({
resolve(void 0); resolve(void 0);
}); });
case ActionType.Value: case ActionType.Value:
if ( if (isConditionEmpty(condition) || (await conditionAnalyses({ rules: condition, variables, localVariables }))) {
isConditionEmpty(condition) ||
(await conditionAnalyses({ rules: condition, formValues: values, variables, localVariables }))
) {
if (value?.mode === 'express') { if (value?.mode === 'express') {
if ((value.value || value.result) == null) { if ((value.value || value.result) == null) {
return; return;
} }
const scope = cloneDeep(values);
// 1. 解析如 `{{$user.name}}` 之类的变量 // 1. 解析如 `{{$user.name}}` 之类的变量
const { exp, scope: expScope } = await replaceVariables(value.value || value.result, { const { exp, scope: expScope } = await replaceVariables(value.value || value.result, {
variables, variables,
@ -115,7 +110,7 @@ export const linkageMergeAction = async ({
try { try {
// 2. TODO: 需要把里面解析变量的逻辑删除,因为在上一步已经解析过了 // 2. TODO: 需要把里面解析变量的逻辑删除,因为在上一步已经解析过了
const result = evaluate(exp, { ...scope, now: () => new Date().toString(), ...expScope }); const result = evaluate(exp, { ...values, now: () => new Date().toString(), ...expScope });
valueResult.push(result); valueResult.push(result);
} catch (error) { } catch (error) {
console.error(error); console.error(error);

View File

@ -67,12 +67,10 @@ function getAllKeys(obj) {
export const conditionAnalyses = async ({ export const conditionAnalyses = async ({
rules, rules,
formValues,
variables, variables,
localVariables, localVariables,
}: { }: {
rules; rules;
formValues;
variables: VariablesContextType; variables: VariablesContextType;
localVariables: VariableOption[]; localVariables: VariableOption[];
}) => { }) => {

View File

@ -106,13 +106,12 @@ export const CreateRecordAction = observer(
operator: h.operator, operator: h.operator,
field, field,
condition: v.condition, condition: v.condition,
values,
variables, variables,
localVariables, localVariables,
}); });
}); });
}); });
}, [JSON.stringify(linkageRules), values]); }, [JSON.stringify(linkageRules)]);
return ( return (
<div className={actionDesignerCss}> <div className={actionDesignerCss}>
<ActionContextProvider value={{ ...ctx, visible, setVisible }}> <ActionContextProvider value={{ ...ctx, visible, setVisible }}>
@ -211,13 +210,12 @@ export const CreateAction = observer(
operator: h.operator, operator: h.operator,
field, field,
condition: v.condition, condition: v.condition,
values,
variables, variables,
localVariables, localVariables,
}); });
}); });
}); });
}, [JSON.stringify(linkageRules), values]); }, [JSON.stringify(linkageRules)]);
return ( return (
<div className={actionDesignerCss}> <div className={actionDesignerCss}>
<FinallyButton <FinallyButton

View File

@ -9,8 +9,6 @@ const useBuiltInVariables = () => {
const currentUser = data?.data?.data; const currentUser = data?.data?.data;
const dateVars = getDateRanges(); const dateVars = getDateRanges();
// 使用函数方便测试断言
dateVars.now = (() => dayjs().toISOString()) as any;
const builtinVariables: VariableOption[] = useMemo(() => { const builtinVariables: VariableOption[] = useMemo(() => {
return [ return [
{ {