ssc-grid
Version:
React grid component for SSC 3.0
179 lines (160 loc) • 5.08 kB
JavaScript
/**
* 模拟redux dispatch去更新state
* https://medium.com/@wereHamster/beware-react-setstate-is-asynchronous-ce87ef1a9cf3#.52vhwpymp
*/
import update from 'immutability-helper';
import * as validationUtils from './utils/validation';
/**
* action的一般格式
* ```js
* export const updateFoo = (value) => (prevState, props) => (
* update(prevState, {
* foo: {$set: value}
* })
* );
* ```
*/
/**
* 更新表单所有值
* @param {Object} formData
*/
export var updateFormData = function updateFormData(formData) {
return function (prevState) {
return update(prevState, {
formData: { $set: formData }
});
};
};
/**
* 更新表单中指定字段的值(单值类型)
* @param {string} fieldId
* @param {string} value
*/
export var updateFieldValue = function updateFieldValue(fieldId, value) {
return function (prevState) {
var _formData;
return update(prevState, {
formData: (_formData = {}, _formData[fieldId] = { $set: value }, _formData)
});
};
};
/**
* 更新表单中指定的参照字段的值
* @param {String} fieldId
* @param {Array} selected 该字段的类型由Refer组件决定,可能会变化,
* @param {Array} multiple 是否多选,
* 现在假定是如下结构
* ```
* [{
* "id": "E6CB6CBE-C701-48EC-A3EB-C823DF8DBEED",
* "isLeaf": "true",
* "name": "测试组织1",
* "pid": "FBA1DBB5-24A2-4A78-A4D5-453F7CC46AA6",
* "code": "02"
* }]
* ```
* 当参照被清空之后,这里传过来的是个空数组
*/
export function updateReferFieldValue(fieldId, selected, multiple) {
return function (prevState /* , props */) {
var _formData2;
return update(prevState, {
formData: (_formData2 = {}, _formData2[fieldId] = {
$set: selected.length === 0 && !multiple ? null : selected
}, _formData2)
});
};
}
/**
* 更新表单中指定字段的验证状态
* stateless
* @param {String} fieldId
* @param {String} value 由于validators库只能校验字符串,所以这个参数也必须是字符串
* @param {Array} validators
*/
export function updateFormFieldValidationState(fieldId, value, validators) {
return function (prevState /* , props */) {
var _fieldsValidationStat, _fieldsHelpText;
var _validationUtils$calc = validationUtils.calcValidationState(value, validators),
validationState = _validationUtils$calc.validationState,
helpText = _validationUtils$calc.helpText;
return update(prevState, {
fieldsValidationState: (_fieldsValidationStat = {}, _fieldsValidationStat[fieldId] = {
$set: validationState
}, _fieldsValidationStat),
fieldsHelpText: (_fieldsHelpText = {}, _fieldsHelpText[fieldId] = {
$set: helpText
}, _fieldsHelpText)
});
};
}
/**
* 从表单数据中获取值
* @param {Object} fieldModel
* @param {Object} formData
* @return {String} 对于参照这种复杂类型,需要返回字符类型的显示值
* stateless
*/
var getFieldValue = function getFieldValue(_ref, formData) {
var id = _ref.id,
type = _ref.type,
multiple = _ref.multiple;
var value = '';
if (type === 'ref') {
if (multiple || Array.isArray(formData[id])) {
value = formData[id].map(function (val) {
return val.id || '';
});
value = value.join('');
} else {
value = formData[id] ? formData[id].id : '';
}
} else {
value = formData[id];
}
return value;
};
/**
* Calculate validation state of all form fields (without hidden fields)
* then return validation states and help text object
* @param {String} fieldId
* @param {String} value
* @param {Array} validators
*/
export function updateAllFormFieldsValidationState(fieldsModel, formData) {
return function (prevState /* , props */) {
var fieldsValidationState = {};
var fieldsHelpText = {};
fieldsModel.forEach(function (fieldModel) {
if (fieldModel.hidden === true) {
return;
}
if (fieldModel.validators) {
var value = getFieldValue(fieldModel, formData);
var _validationUtils$calc2 = validationUtils.calcValidationState(value, fieldModel.validators),
validationState = _validationUtils$calc2.validationState,
helpText = _validationUtils$calc2.helpText;
fieldsValidationState[fieldModel.id] = validationState;
fieldsHelpText[fieldModel.id] = helpText;
}
});
return update(prevState, {
fieldsValidationState: { $set: fieldsValidationState },
fieldsHelpText: { $set: fieldsHelpText }
});
};
}
/**
* 更新提交按钮的状态
* @param {String} fieldId
* @param {Array} selected 该字段的类型由Refer组件决定,可能会变化
*/
export function updateSubmitButtonState() {
return function (prevState /* , props */) {
return update(prevState, {
submitButtonDisabled: {
$set: !validationUtils.isStatesValid(prevState.fieldsValidationState)
}
});
};
}