fix: avoid infinite loop (#2974)
* fix: avoid infinite loop * perf: avoid infinite loop * fix: build errors
This commit is contained in:
		
							parent
							
								
									ac3f63b110
								
							
						
					
					
						commit
						f1e387e65e
					
				@ -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) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
 | 
				
			|||||||
@ -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')],
 | 
				
			||||||
 | 
				
			|||||||
@ -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,
 | 
				
			||||||
                  });
 | 
					                  });
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
 | 
				
			|||||||
@ -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[];
 | 
				
			||||||
}) => {
 | 
					}) => {
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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 [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user