Skip to content

Commit 6436576

Browse files
committed
fix: add validation API instead of filterRule, filterErrMsg
1 parent 700dcc8 commit 6436576

3 files changed

Lines changed: 93 additions & 9 deletions

File tree

packages/rcre/src/core/Form/FormItem.tsx

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export interface FormItemProps {
2525
filterRule?: any;
2626
isTextFormItem?: boolean;
2727
filterErrMsg?: any;
28+
validation?: (value: any) => {isValid: boolean, errmsg?: string};
2829
control?: any;
2930
}
3031

@@ -41,7 +42,7 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {}> {
4142

4243
static getComponentParseOptions() {
4344
return {
44-
blackList: ['filterRule', 'filterErrMsg']
45+
blackList: ['filterRule', 'filterErrMsg', 'validation']
4546
};
4647
}
4748

@@ -124,15 +125,21 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {}> {
124125

125126
let isRequiredChanged = prevProps.required !== this.props.required;
126127
let isRuleChanged = !isEqual(prevRules, nextRules);
127-
let isFilterRuleChanged;
128128

129-
if (prevProps.filterRule && this.props.filterRule) {
130-
let oldFilterRule = this.validFilterRule(prevProps.filterRule, null, prevRunTime, prevProps.filterErrMsg);
131-
let nextFilterRule = this.validFilterRule(this.props.filterRule, null, nextRunTime, this.props.filterErrMsg);
132-
isFilterRuleChanged = !isEqual(oldFilterRule, nextFilterRule);
133-
}
129+
// let isFilterRuleChanged;
130+
// if (prevProps.filterRule && this.props.filterRule) {
131+
// let oldFilterRule = this.validFilterRule(prevProps.filterRule, null, prevRunTime, prevProps.filterErrMsg);
132+
// let nextFilterRule = this.validFilterRule(this.props.filterRule, null, nextRunTime, this.props.filterErrMsg);
133+
// isFilterRuleChanged = !isEqual(oldFilterRule, nextFilterRule);
134+
// }
135+
136+
// if (prevProps.validation && this.props.validation) {
137+
// let oldStatus = this.runValidation(prevProps.validation, null, prevRunTime);
138+
// let nextStatus = this.runValidation(this.props.validation, null, nextRunTime);
139+
// isFilterRuleChanged = !isEqual(oldStatus, nextStatus);
140+
// }
134141

135-
if (isRequiredChanged || isRuleChanged || isFilterRuleChanged) {
142+
if (isRequiredChanged || isRuleChanged) {
136143
let names = Object.keys(this.controlElements);
137144
for (let name of names) {
138145
let element = this.controlElements[name];
@@ -323,6 +330,33 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {}> {
323330
};
324331
}
325332

333+
private runValidation = (validation: any, data: any, runTime: RunTimeType): {isValid: boolean, errmsg: string} => {
334+
let stats = parseExpressionString(validation, {
335+
...runTime,
336+
$args: {
337+
value: data
338+
}
339+
});
340+
341+
if (!stats) {
342+
console.error('RCREFormItem: your validation function did return an object with inValid property');
343+
return {
344+
isValid: false,
345+
errmsg: 'validation exec failed'
346+
};
347+
}
348+
349+
if (typeof stats === 'object' && !stats.hasOwnProperty('isValid')) {
350+
console.error('RCREFormItem: validation should return an object with inValid property');
351+
return {
352+
isValid: false,
353+
errmsg: ''
354+
};
355+
}
356+
357+
return stats;
358+
}
359+
326360
public validateFormItem = async (
327361
formItemName: string,
328362
data: any,
@@ -390,6 +424,12 @@ export class RCREFormItem extends React.PureComponent<RCREFormItemProps, {}> {
390424
errmsg = ret.errmsg;
391425
}
392426

427+
if (isValid && isExpression(this.props.validation)) {
428+
let ret = this.runValidation(this.props.validation, data, runTime);
429+
isValid = ret.isValid;
430+
errmsg = ret.errmsg;
431+
}
432+
393433
if (isValid && apiRule) {
394434
let condition = apiRule.condition || true;
395435

packages/rcre/src/core/Hosts/FormItem.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {createChild} from '../util/createChild';
77
class JSONFormItem extends React.PureComponent<RCREFormItemProps> {
88
static getComponentParseOptions() {
99
return {
10-
blackList: ['filterRule', 'filterErrMsg']
10+
blackList: ['filterRule', 'filterErrMsg', 'validation']
1111
};
1212
}
1313

test/rcre/core/Form/FormItem.test.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1651,4 +1651,48 @@ describe('FormItem', () => {
16511651
expect(formStatus.control.username.valid).toBe(false);
16521652
expect(formStatus.control.username.errorMsg).toBe('长度不能大于10');
16531653
});
1654+
1655+
it('Form validation property', async () => {
1656+
let config = {
1657+
body: [{
1658+
type: 'container',
1659+
model: 'demo',
1660+
children: [{
1661+
type: 'form',
1662+
name: 'test',
1663+
children: [{
1664+
type: 'formItem',
1665+
validation: ({$args}: any) => {
1666+
return {
1667+
isValid: $args.value === '12345',
1668+
errmsg: 'error'
1669+
};
1670+
},
1671+
control: {
1672+
type: 'input',
1673+
name: 'username'
1674+
}
1675+
}]
1676+
}]
1677+
}]
1678+
};
1679+
1680+
let test = new RCRETestUtil(config);
1681+
test.setContainer('demo');
1682+
await test.triggerFormValidate('test');
1683+
1684+
let formState = test.getFormState('test');
1685+
expect(formState.valid).toBe(false);
1686+
1687+
let input = test.getComponentByName('username');
1688+
test.setData(input, 'helloworld');
1689+
1690+
formState = test.getFormState('test');
1691+
expect(formState.valid).toBe(false);
1692+
1693+
test.setData(input, '12345');
1694+
formState = test.getFormState('test');
1695+
1696+
expect(formState.valid).toBe(true);
1697+
});
16541698
});

0 commit comments

Comments
 (0)