import React from 'react'; import { VisibilityRule, VisibilityOperator, VisibilityRuleTarget, ValueExtractConfig, VISIBILITY_OPERATOR_LABELS, VISIBILITY_RULE_TARGET_LABELS, } from '../types'; import { visibilityOperatorNeedsValue, valueExtractConfigHasExtract } from '../utils'; import { FieldSelect } from './PsSelect'; import { ValueExtractFields } from './ValueExtractFields'; import { TextDisplayAffixFields } from './TextDisplayAffixFields'; export interface VisibilityRuleDraft extends ValueExtractConfig { target: VisibilityRuleTarget; variable: string; operator: VisibilityOperator; value?: string; } interface VisibilityRuleFormProps { rule: VisibilityRuleDraft; onChange: (patch: Partial) => void; variableOptions: string[]; /** 为 true 时仅支持按变量判断(如批量导出过滤) */ variableOnly?: boolean; } export const VisibilityRuleForm: React.FC = ({ rule, onChange, variableOptions, variableOnly = false, }) => { const target = variableOnly ? 'variable' : (rule.target ?? 'variable'); const hasExtract = valueExtractConfigHasExtract(rule); return (
{!variableOnly && (
{ const nextTarget = e.target.value as VisibilityRuleTarget; onChange({ target: nextTarget, variable: nextTarget === 'content' ? '' : rule.variable, }); }} className="ps-field text-[11px] w-full mt-0.5" > {(Object.keys(VISIBILITY_RULE_TARGET_LABELS) as VisibilityRuleTarget[]).map((t) => ( ))}
)} {target === 'variable' ? (
onChange({ variable: e.target.value })} className="ps-field text-[11px] w-full mt-0.5" > {!rule.variable && } {variableOptions.map((v) => ( ))} {variableOptions.length === 0 && (

{variableOnly ? '请先在模板中添加变量后再设置过滤条件' : '请先在「变量管理」中添加变量,或改用「内容值」作为条件对象'}

)}
) : ( !variableOnly && (

使用本元素绑定内容的变量替换与数值格式化结果(不含元素自身的值提取与显示前后缀)

) )}
值提取
{hasExtract && rule.textExtractInverse && ( onChange({ textDisplayPrefix: patch.textDisplayPrefix, textDisplaySuffix: patch.textDisplaySuffix, }) } /> )} {hasExtract && !rule.textExtractInverse && (

条件判断前先对{target === 'content' ? '内容值' : '变量值'}做提取,再与目标值比较

)}
{ const operator = e.target.value as VisibilityOperator; onChange({ operator, value: visibilityOperatorNeedsValue(operator) ? rule.value : undefined, }); }} className="ps-field text-[11px] w-full mt-0.5" > {(Object.keys(VISIBILITY_OPERATOR_LABELS) as VisibilityOperator[]).map((op) => ( ))}
{visibilityOperatorNeedsValue(rule.operator) && (
onChange({ value: e.target.value })} placeholder="比较目标值,可使用 {变量名}" className="ps-field font-mono text-[11px] w-full mt-0.5" /> {variableOptions.length > 0 && (
{variableOptions.map((v) => ( ))}
)}

支持字面量或 {`{变量名}`};导出时按数据行解析变量后再比较

)}
); };